<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>40423116 協同產品設計實習</title><link href="./" rel="alternate"></link><link href="./feeds/all.atom.xml" rel="self"></link><id>./</id><updated>2017-06-16T12:18:00+08:00</updated><entry><title>期末協同查驗與自評</title><link href="./qi-mo-xie-tong-cha-yan-yu-zi-ping.html" rel="alternate"></link><published>2017-06-16T12:18:00+08:00</published><updated>2017-06-16T12:18:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-06-16:./qi-mo-xie-tong-cha-yan-yu-zi-ping.html</id><summary type="html">&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;h3&gt;1.各組員倉儲中的 Github 檔案推送&lt;/h3&gt;
&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/222500240" width="640" height="462" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/222500240"&gt;40423116-2017springcd-final-1&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;h3&gt;2.各組員網誌上的 2D 繪圖, 並將程式碼顯示在繪圖網誌文章中&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.arc.id.au/"&gt;cango 程式庫&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;3.各組員倉儲中的子模組建立與運用, 並將程式碼顯示在繪圖網誌文章&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://40423116.github.io/2017springcd_hw/blog/40423116-zuo-ye-jian-bao-shang-ke-wik.html"&gt;小組倉儲中設定組員為子模組的流程&lt;/a&gt;&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;git submodule add -b gh-pages https://github.com/name/組員倉儲 name
#啟動子目錄
git submodule init
#更新對應子版本
git submodule update
git pull origin gh-pages --recurse-submodules
git submodule foreach &amp;quot;(git checkout gh-pages; git pull)&amp;amp;&amp;quot;
git submodule update --init --recursive
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;h3&gt;4.各組員 Solvespace 近端零組件繪圖, 並在各組員網誌中顯示指定的零組件&lt;/h3&gt;
&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/221680604" width="640" height="590" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/221680604"&gt;40423116-2017springcd-final-4.mp4&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;h3&gt;5.各組員 Solvespace 零件轉入 V-rep, 並設定驅動零件進行動態模擬&lt;/h3&gt;
&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/221685161" width="640" height="347" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/221685161"&gt;40423116-2017springcd-final-5.mp4&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;h3&gt;6.各組員說明在分組行走機構模擬與實作過程中所扮演的角色, 並利用影片檔說明所負責完成的任務&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://40423116.github.io/2017springcd_hw/blog/si-lian-gan-xing-zou-ji-gou.html"&gt;40423116&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;7.各組以協同方式整合各組組員所完成的倉儲, 網誌與操作影片後, 以學號名稱當作子目錄, 其中放入各組員上述各題所完成的操作影片後, 上傳到各組在系上的 Fossil SCM 倉儲, 並設法用各組的 Github Pages 進行分組簡報.&lt;/h3&gt;
&lt;p&gt;&lt;img src="./../data/w17/40423116.png" width="800" height="600" /&gt;&lt;/p&gt;
&lt;h3&gt;fossil clone&lt;/h3&gt;
&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/223097538" width="640" height="600" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/223097538"&gt;40423116-2017springcd-fossil clone&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;h3&gt;fossil commit&lt;/h3&gt;
&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/223097617" width="640" height="538" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/223097617"&gt;40423116-2017springcd-final-7&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil clone https://40423116@mde2a2.kmol.info/cdag3 cdag3.fossil
fossil open cdag3.fossil
fossil add all .
fossil commit -m &amp;quot;&amp;quot;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;!-- 導入 Brython 標準程式庫 --&gt;

&lt;script src="../data/Brython-3.3.1/brython.js"&gt;&lt;/script&gt;

&lt;script src="../data/Brython-3.3.1/brython_stdlib.js"&gt;&lt;/script&gt;

&lt;!-- 啟動 Brython --&gt;

&lt;script&gt;
window.onload=function(){
// 設定 data/py 為共用程式路徑
brython({debug:1, pythonpath:['./../data/py']});
}
&lt;/script&gt;

&lt;!-- Cango 程式庫 --&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/Cango-9v05-min.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/CangoAxes-2v09.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/CangoAnimation-5v00.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/gearUtils-05.js"&gt;&lt;/script&gt;

&lt;!-- 以下實際利用  Brython 繪圖--&gt;

&lt;canvas id="cango_canvas2" width="800" height="800"&gt;&lt;/canvas&gt;

&lt;script type="text/python3"&gt;
from browser import document as doc
from browser import window
import math
利用 window 擷取 Cango 物件, 然後以 new 方法轉為 Brython 物件
cango = window.Cango.new
shape = window.Shape.new
shapedefs = window.shapeDefs

def drawSpiral(cvsID):
    g = cango(cvsID)
    chamber = ['M',200,200, 'L'500,500,'L',500,200,'z']
    cobj = shape(chamber, {
        'fillColor':"lightyellow",
        'strokeColor':"tan",
        'lineWidthWC':4,
        'border':True })
    cobj.translate(-287, -536)
    g.setGridboxSVG()
    g.setWorldCoords(-250, -320, 500)
    # draw the spiral center dot
    g.drawShape(shapedefs.circle(8), {'fillColor':"tan"})
    # draw the 50 spiral segments
    scale = 1
    for i in range(50):
        scale = scale/1.08
        g.render(cobj, {'scl':scale, 'degs':i*24.5})

drawSpiral("cango_canvas2")
&lt;/script&gt;</summary><category term="作業"></category></entry><entry><title>四連桿行走機構</title><link href="./si-lian-gan-xing-zou-ji-gou.html" rel="alternate"></link><published>2017-06-16T12:15:00+08:00</published><updated>2017-06-16T12:15:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-06-16:./si-lian-gan-xing-zou-ji-gou.html</id><summary type="html">&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;h3&gt;組合、零件圖&lt;/h3&gt;
&lt;p&gt;&lt;img src="./../data/w17/40423116_bar.png" width="800" height="600" /&gt;
&lt;img src="./../data/w17/40423116_bar01.png" width="800" height="600" /&gt;
配件為M3螺帽、M3螺絲、圓墊片及直流馬達
零件:
連接件x2
兩側連接腳之板件
四連桿腳組2、4、4(短桿、長桿、腳)&lt;/p&gt;
&lt;h3&gt;onshape 運動&lt;/h3&gt;
&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/223092787" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/223092787"&gt;40423116 onshape 行走機構運動&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;a href="https://cad.onshape.com/documents/7113275b196c13ba2a4f1cdf/w/09ad642ae3484329c5fbdf4e/e/ecc8f7f70622951f76dbfe55"&gt;onshape&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;實物運動&lt;/h3&gt;
&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/222340552" width="640" height="356" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/222340552"&gt;40423116-2017springcd-final-6.mp4&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
因直流馬達扭力不足，所以在陸地行走不實際&lt;/p&gt;
&lt;h2&gt;下載&lt;/h2&gt;
&lt;p&gt;&lt;a href="./../data/w17/40423116_fourbarcar.stl"&gt;四連桿零件組&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="./../data/w17/40423116_fourbarcar01.stl"&gt;四連桿組合件&lt;/a&gt;&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>協同產品設計實習第十五週練習</title><link href="./xie-tong-chan-pin-she-ji-shi-xi-di-shi-wu-zhou-lian-xi.html" rel="alternate"></link><published>2017-06-01T12:15:00+08:00</published><updated>2017-06-01T12:15:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-06-01:./xie-tong-chan-pin-she-ji-shi-xi-di-shi-wu-zhou-lian-xi.html</id><summary type="html">&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;!-- 導入 Brython 標準程式庫 --&gt;

&lt;script src="../data/Brython-3.3.1/brython.js"&gt;&lt;/script&gt;

&lt;script src="../data/Brython-3.3.1/brython_stdlib.js"&gt;&lt;/script&gt;

&lt;!-- 啟動 Brython --&gt;

&lt;script&gt;
window.onload=function(){
// 設定 data/py 為共用程式路徑
brython({debug:1, pythonpath:['./../data/py']});
}
&lt;/script&gt;

&lt;!-- 以下實際利用  Brython 繪圖--&gt;

&lt;canvas id="onegear" width="800" height="600"&gt;&lt;/canvas&gt;

&lt;div id="onegear_div" width="800" height="20"&gt;&lt;/div&gt;

&lt;script type="text/python3"&gt;
from browser import document as doc
import math
# deg 為角度轉為徑度的轉換因子
deg = math.pi/180.
# 定義 Spur 類別
class Spur(object):
    def __init__(self, ctx):
        self.ctx = ctx

    def create_line(self, x1, y1, x2, y2, width=3, fill="white"):
        self.ctx.beginPath()
        self.ctx.lineWidth = width
        self.ctx.moveTo(x1, y1)
        self.ctx.lineTo(x2, y2)
        self.ctx.strokeStyle = fill
        self.ctx.stroke()
    #
    # 定義一個繪正齒輪的繪圖函式
    # midx 為齒輪圓心 x 座標
    # midy 為齒輪圓心 y 座標
    # rp 為節圓半徑, n 為齒數
    # pa 為壓力角 (deg)
    # rot 為旋轉角 (deg)
    # 已經針對 n 大於等於 52 齒時的繪圖錯誤修正, 因為 base circle 與齒根圓大小必須進行判斷
    def Gear(self, midx, midy, rp, n=20, pa=20, color="red"):
        # 齒輪漸開線分成 15 線段繪製
        imax = 15
        # 在輸入的畫布上繪製直線, 由圓心到節圓 y 軸頂點畫一直線
        self.create_line(midx, midy, midx, midy-rp)
        # 畫出 rp 圓, 畫圓函式尚未定義
        #create_oval(midx-rp, midy-rp, midx+rp, midy+rp, width=2)
        # a 為模數 (代表公制中齒的大小), 模數為節圓直徑(稱為節徑)除以齒數
        # 模數也就是齒冠大小
        a=2*rp/n
        # d 為齒根大小, 為模數的 1.157 或 1.25倍, 這裡採 1.25 倍
        d=2.5*rp/n
        # ra 為齒輪的外圍半徑
        ra=rp+a
        # 畫出 ra 圓, 畫圓函式尚未定義
        #create_oval(midx-ra, midy-ra, midx+ra, midy+ra, width=1)
        # rb 則為齒輪的基圓半徑
        # 基圓為漸開線長齒之基準圓
        rb=rp*math.cos(pa*deg)
        # 畫出 rb 圓 (基圓), 畫圓函式尚未定義
        #create_oval(midx-rb, midy-rb, midx+rb, midy+rb, width=1)
        # rd 為齒根圓半徑
        rd=rp-d
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        # 畫出 rd 圓 (齒根圓), 畫圓函式尚未定義
        #create_oval(midx-rd, midy-rd, midx+rd, midy+rd, width=1)
        # dr 則為基圓到齒頂圓半徑分成 imax 段後的每段半徑增量大小
        # 將圓弧分成 imax 段來繪製漸開線
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        if rd&gt;rb:
            dr = (ra-rd)/imax
        else:
            dr=(ra-rb)/imax
        # tan(pa*deg)-pa*deg 為漸開線函數
        sigma=math.pi/(2*n)+math.tan(pa*deg)-pa*deg
        for j in range(n):
            ang=-2.*j*math.pi/n+sigma
            ang2=2.*j*math.pi/n+sigma
            lxd=midx+rd*math.sin(ang2-2.*math.pi/n)
            lyd=midy-rd*math.cos(ang2-2.*math.pi/n)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(alpha-ang)
                ypt=r*math.cos(alpha-ang)
                xd=rd*math.sin(-ang)
                yd=rd*math.cos(-ang)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由左側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    lfx=midx+xpt
                    lfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # the line from last end of dedendum point to the recent
            # end of dedendum point
            # lxd 為齒根圓上的左側 x 座標, lyd 則為 y 座標
            # 下列為齒根圓上用來近似圓弧的直線
            self.create_line((lxd),(lyd),(midx+xd),(midy-yd),fill=color)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(ang2-alpha)
                ypt=r*math.cos(ang2-alpha)
                xd=rd*math.sin(ang2)
                yd=rd*math.cos(ang2)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由右側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    rfx=midx+xpt
                    rfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # lfx 為齒頂圓上的左側 x 座標, lfy 則為 y 座標
            # 下列為齒頂圓上用來近似圓弧的直線
            self.create_line(lfx,lfy,rfx,rfy,fill=color)
canvas = doc['onegear']
ctx = canvas.getContext("2d")
x = (canvas.width)/2
y = (canvas.height)/2
r = 250
# 齒數
n = 36
# 壓力角
pa = 20
gear36 = Spur(ctx).Gear(x, y, r, n , pa, "black")

div = doc["onegear_div"]

ctx.beginPath()
ctx.lineWidth = "600"
ctx.strokeStyle = "white"
ctx.moveTo(0,600)
ctx.lineTo(800,600)
ctx.stroke()
ctx.fillStyle = "#0000FF"
ctx.font = "30px ScriptS"
ctx.fillText("40423116",(canvas.width)/2-60,(canvas.height)/2-25)
ctx.stroke()
&lt;/script&gt;

&lt;h3&gt;3.由最右邊齒數 16 齒開始囓合, 依序增加 2 齒, 當排至平面四齒囓合後, 第五位組員則以垂直方向向下囓合兩個齒輪後, 轉由右至左水平排列&lt;/h3&gt;
&lt;!-- 導入 Brython 標準程式庫 --&gt;

&lt;script src="../data/brython.js"&gt;&lt;/script&gt;

&lt;script src="../data/brython_stdlib.js"&gt;&lt;/script&gt;

&lt;!-- 啟動 Brython --&gt;

&lt;script&gt;
window.onload=function(){
// 設定 data/py 為共用程式路徑
brython({debug:1, pythonpath:['./../data/py']});
}
&lt;/script&gt;

&lt;!-- 以下實際利用  Brython 繪圖--&gt;

&lt;canvas id="onegear1" width="800" height="600"&gt;&lt;/canvas&gt;

&lt;div id="onegear_div" width="800" height="20"&gt;&lt;/div&gt;

&lt;script type="text/python3"&gt;
from browser import document as doc
import math
# deg 為角度轉為徑度的轉換因子
deg = math.pi/180.
# 定義 Spur 類別
class Spur(object):
    def __init__(self, ctx):
        self.ctx = ctx

    def create_line(self, x1, y1, x2, y2, width=3, fill="red"):
        self.ctx.beginPath()
        self.ctx.lineWidth = width
        self.ctx.moveTo(x1, y1)
        self.ctx.lineTo(x2, y2)
        self.ctx.strokeStyle = fill
        self.ctx.stroke()
    #
    # 定義一個繪正齒輪的繪圖函式
    # midx 為齒輪圓心 x 座標
    # midy 為齒輪圓心 y 座標
    # rp 為節圓半徑, n 為齒數
    # pa 為壓力角 (deg)
    # rot 為旋轉角 (deg)
    # 已經針對 n 大於等於 52 齒時的繪圖錯誤修正, 因為 base circle 與齒根圓大小必須進行判斷
    def Gear(self, midx, midy, rp, n=20, pa=20, color="red"):
        # 齒輪漸開線分成 15 線段繪製
        imax = 15
        # 在輸入的畫布上繪製直線, 由圓心到節圓 y 軸頂點畫一直線
        self.create_line(midx, midy, midx, midy-rp)
        # 畫出 rp 圓, 畫圓函式尚未定義
        #create_oval(midx-rp, midy-rp, midx+rp, midy+rp, width=2)
        # a 為模數 (代表公制中齒的大小), 模數為節圓直徑(稱為節徑)除以齒數
        # 模數也就是齒冠大小
        a=2*rp/n
        # d 為齒根大小, 為模數的 1.157 或 1.25倍, 這裡採 1.25 倍
        d=2.5*rp/n
        # ra 為齒輪的外圍半徑
        ra=rp+a
        # 畫出 ra 圓, 畫圓函式尚未定義
        #create_oval(midx-ra, midy-ra, midx+ra, midy+ra, width=1)
        # rb 則為齒輪的基圓半徑
        # 基圓為漸開線長齒之基準圓
        rb=rp*math.cos(pa*deg)
        # 畫出 rb 圓 (基圓), 畫圓函式尚未定義
        #create_oval(midx-rb, midy-rb, midx+rb, midy+rb, width=1)
        # rd 為齒根圓半徑
        rd=rp-d
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        # 畫出 rd 圓 (齒根圓), 畫圓函式尚未定義
        #create_oval(midx-rd, midy-rd, midx+rd, midy+rd, width=1)
        # dr 則為基圓到齒頂圓半徑分成 imax 段後的每段半徑增量大小
        # 將圓弧分成 imax 段來繪製漸開線
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        if rd&gt;rb:
            dr = (ra-rd)/imax
        else:
            dr=(ra-rb)/imax
        # tan(pa*deg)-pa*deg 為漸開線函數
        sigma=math.pi/(2*n)+math.tan(pa*deg)-pa*deg
        for j in range(n):
            ang=-2.*j*math.pi/n+sigma
            ang2=2.*j*math.pi/n+sigma
            lxd=midx+rd*math.sin(ang2-2.*math.pi/n)
            lyd=midy-rd*math.cos(ang2-2.*math.pi/n)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(alpha-ang)
                ypt=r*math.cos(alpha-ang)
                xd=rd*math.sin(-ang)
                yd=rd*math.cos(-ang)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由左側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    lfx=midx+xpt
                    lfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # the line from last end of dedendum point to the recent
            # end of dedendum point
            # lxd 為齒根圓上的左側 x 座標, lyd 則為 y 座標
            # 下列為齒根圓上用來近似圓弧的直線
            self.create_line((lxd),(lyd),(midx+xd),(midy-yd),fill=color)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(ang2-alpha)
                ypt=r*math.cos(ang2-alpha)
                xd=rd*math.sin(ang2)
                yd=rd*math.cos(ang2)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由右側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    rfx=midx+xpt
                    rfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # lfx 為齒頂圓上的左側 x 座標, lfy 則為 y 座標
            # 下列為齒頂圓上用來近似圓弧的直線
            self.create_line(lfx,lfy,rfx,rfy,fill=color)
canvas = doc['onegear1']
ctx = canvas.getContext("2d")
x = (canvas.width)/2
y = (canvas.height)/2+2400
r = 8*(canvas.height/2)
# 齒數
n = 20
# 壓力角
pa = 20
Spur(ctx).Gear(x, y, r, n, pa, "blue")

ctx.beginPath()
ctx.fillStyle = "#0000FF"
ctx.font = "20px ScriptS"
ctx.fillText("40423105 ",360,620)
ctx.stroke()
ctx.fillStyle = "#0000FF"
ctx.font = "30px ScriptS"
ctx.fillText("40423116",(canvas.width)/2-60,(canvas.height)/2-25)
ctx.stroke()
&lt;/script&gt;

&lt;!-- 導入 Brython 標準程式庫 --&gt;

&lt;script src="../data/brython.js"&gt;&lt;/script&gt;

&lt;script src="../data/brython_stdlib.js"&gt;&lt;/script&gt;

&lt;!-- 啟動 Brython --&gt;

&lt;script&gt;
window.onload=function(){
// 設定 data/py 為共用程式路徑
brython({debug:1, pythonpath:['./../data/py']});
}
&lt;/script&gt;

&lt;!-- 以下實際利用  Brython 繪圖--&gt;

&lt;canvas id='gear3' width='800' height='2800'&gt;&lt;/canvas&gt;

&lt;script type="text/python3"&gt;
# 導入 browser 模組中的 document, 並設為 doc 變數
from browser import document as doc
import math
# deg 為角度轉為徑度的轉換因子
deg = math.pi/180.
# 定義 Spur 類別
class Spur(object):
    def __init__(self, ctx):
        self.ctx = ctx

    def create_line(self, x1, y1, x2, y2, width=3, fill="red"):
        self.ctx.beginPath()
        self.ctx.lineWidth = width
        self.ctx.moveTo(x1, y1)
        self.ctx.lineTo(x2, y2)
        self.ctx.strokeStyle = fill
        self.ctx.stroke()
    #
    # 定義一個繪正齒輪的繪圖函式
    # midx 為齒輪圓心 x 座標
    # midy 為齒輪圓心 y 座標
    # rp 為節圓半徑, n 為齒數
    # pa 為壓力角 (deg)
    # rot 為旋轉角 (deg)
    # 已經針對 n 大於等於 52 齒時的繪圖錯誤修正, 因為 base circle 與齒根圓大小必須進行判斷
    def Gear(self, midx, midy, rp, n=20, pa=20, color="black"):
        # 齒輪漸開線分成 15 線段繪製
        imax = 15
        # 在輸入的畫布上繪製直線, 由圓心到節圓 y 軸頂點畫一直線
        self.create_line(midx, midy, midx, midy-rp)
        # 畫出 rp 圓, 畫圓函式尚未定義
        #create_oval(midx-rp, midy-rp, midx+rp, midy+rp, width=2)
        # a 為模數 (代表公制中齒的大小), 模數為節圓直徑(稱為節徑)除以齒數
        # 模數也就是齒冠大小
        a=2*rp/n
        # d 為齒根大小, 為模數的 1.157 或 1.25倍, 這裡採 1.25 倍
        d=2.5*rp/n
        # ra 為齒輪的外圍半徑
        ra=rp+a
        # 畫出 ra 圓, 畫圓函式尚未定義
        #create_oval(midx-ra, midy-ra, midx+ra, midy+ra, width=1)
        # rb 則為齒輪的基圓半徑
        # 基圓為漸開線長齒之基準圓
        rb=rp*math.cos(pa*deg)
        # 畫出 rb 圓 (基圓), 畫圓函式尚未定義
        #create_oval(midx-rb, midy-rb, midx+rb, midy+rb, width=1)
        # rd 為齒根圓半徑
        rd=rp-d
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        # 畫出 rd 圓 (齒根圓), 畫圓函式尚未定義
        #create_oval(midx-rd, midy-rd, midx+rd, midy+rd, width=1)
        # dr 則為基圓到齒頂圓半徑分成 imax 段後的每段半徑增量大小
        # 將圓弧分成 imax 段來繪製漸開線
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        if rd&gt;rb:
            dr = (ra-rd)/imax
        else:
            dr=(ra-rb)/imax
        # tan(pa*deg)-pa*deg 為漸開線函數
        sigma=math.pi/(2*n)+math.tan(pa*deg)-pa*deg
        for j in range(n):
            ang=-2.*j*math.pi/n+sigma
            ang2=2.*j*math.pi/n+sigma
            lxd=midx+rd*math.sin(ang2-2.*math.pi/n)
            lyd=midy-rd*math.cos(ang2-2.*math.pi/n)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(alpha-ang)
                ypt=r*math.cos(alpha-ang)
                xd=rd*math.sin(-ang)

                yd=rd*math.cos(-ang)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由左側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    lfx=midx+xpt
                    lfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # the line from last end of dedendum point to the recent
            # end of dedendum point
            # lxd 為齒根圓上的左側 x 座標, lyd 則為 y 座標
            # 下列為齒根圓上用來近似圓弧的直線
            self.create_line((lxd),(lyd),(midx+xd),(midy-yd),fill=color)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(ang2-alpha)
                ypt=r*math.cos(ang2-alpha)
                xd=rd*math.sin(ang2)
                yd=rd*math.cos(ang2)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由右側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    rfx=midx+xpt
                    rfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # lfx 為齒頂圓上的左側 x 座標, lfy 則為 y 座標
            # 下列為齒頂圓上用來近似圓弧的直線
            self.create_line(lfx,lfy,rfx,rfy,fill=color)

# 準備在 id="gear3" 的 canvas 中繪圖
canvas = doc["gear3"]
ctx = canvas.getContext("2d")

# 模數決定齒的尺寸大小, 囓合齒輪組必須有相同的模數與壓力角
# 壓力角 pa 單位為角度
pa = 20
# 第1齒輪齒數
n_g1 = 16
# 第2齒輪齒數
n_g2 = 18
# 第3齒輪齒數
n_g3 = 20
# 第4齒輪齒數
n_g4 = 22
# 第5齒輪齒數
n_g5 = 24
# 第6齒輪齒數
n_g6 = 26
# 第7齒輪齒數
n_g7 = 28
# m 為模數, 根據畫布的寬度, 計算適合的模數大小
m = (0.6*canvas.width/n_g7)
# 根據模數 m, 計算各齒輪的節圓半徑
rp_g1 = m*n_g1/2
rp_g2 = m*n_g2/2
rp_g3 = m*n_g3/2
rp_g4 = m*n_g4/2
rp_g5 = m*n_g5/2
rp_g6 = m*n_g6/2
rp_g7 = m*n_g7/2
#單一正齒輪繪圖呼叫格式 Spur(ctx).Gear(x, y, r, n, pa, "blue")


# 開始繪製囓合齒輪輪廓
# 繪圖第1齒輪的圓心座標, 因為希望繪圖佔去 canvas.width 的 80%, 所以兩邊各預留 10% 距離

x_g1 = canvas.width*0.5
# y 方向繪圖區域上方預留 canvas.height 的 20%
y_g1 = canvas.height*0.05

# 第2齒輪的圓心座標, 假設排列成水平, 表示各齒輪圓心 y 座標相同

x_g2 = x_g1
y_g2 = y_g1 + rp_g1 + rp_g2

# 第3齒輪的圓心座標
x_g3 = x_g1
y_g3 = y_g1 + rp_g1 + 2*rp_g2 + rp_g3

# 第4齒輪的圓心座標
x_g4 = x_g1
y_g4 = y_g1 + rp_g1 + 2*rp_g2 + 2*rp_g3+rp_g4

# 第5齒輪的圓心座標
x_g5 = x_g1
y_g5 = y_g1 + rp_g1 + 2*rp_g2 + 2*rp_g3+2*rp_g4+rp_g5

# 第6齒輪的圓心座標
x_g6 = x_g1
y_g6 = y_g1 + rp_g1 + 2*rp_g2 + 2*rp_g3+2*rp_g4+2*rp_g5+rp_g6

# 第7齒輪的圓心座標
x_g7 = x_g1
y_g7 = y_g1 + rp_g1 + 2*rp_g2 + 2*rp_g3+2*rp_g4+2*rp_g5+2*rp_g6+rp_g7


# 將第1齒輪順時鐘轉 180 度, 也就是 math.pi
# 使用 ctx.save() 與 ctx.restore() 以確保各齒輪以相對座標進行旋轉繪圖
ctx.save()
# translate to the origin of second gear
ctx.translate(x_g1, y_g1)
# rotate to engage
ctx.rotate(math.pi)
# put it back
ctx.translate(-x_g1, -y_g1)
# 繪製第一個齒輪輪廓
Spur(ctx).Gear(x_g1, y_g1, rp_g1, n_g1, pa, "purple")
ctx.restore()

ctx.beginPath()
ctx.fillStyle = "#0000FF"
ctx.font = "30px Arial"
ctx.fillText("40423112",x_g1-20, y_g1)
ctx.stroke()

# 將第2齒輪多轉一齒, 以便與第1齒輪進行囓合
ctx.save()
# translate to the origin of second gear
ctx.translate(x_g2, y_g2)
# rotate to engage
ctx.rotate(math.pi/n_g2)
# put it back
ctx.translate(-x_g2, -y_g2)
Spur(ctx).Gear(x_g2, y_g2, rp_g2, n_g2, pa, "red")
ctx.restore()

ctx.beginPath()
ctx.fillStyle = "#0000FF"
ctx.font = "30px Arial"
ctx.fillText("40423116",x_g2-20, y_g2)
ctx.stroke()

# 將第3齒輪逆時鐘轉 90 度之後, 再往回轉第2齒輪定位帶動轉角, 然後再逆時鐘多轉一齒, 以便與第2齒輪進行囓合
ctx.save()
# translate to the origin of second gear
ctx.translate(x_g3, y_g3)
# rotate to engage
# math.pi+math.pi/n_g2 為第2齒輪從順時鐘轉 90 度之後, 必須配合目前的標記線所作的齒輪 2 轉動角度, 要轉換到齒輪3 的轉動角度
# 必須乘上兩齒輪齒數的比例, 若齒輪2 大, 則齒輪3 會轉動較快
# 第1個 -math.pi/2 為將原先垂直的第3齒輪定位線逆時鐘旋轉 90 度
# -math.pi/n_g3 則是第3齒與第2齒定位線重合後, 必須再逆時鐘多轉一齒的轉角, 以便進行囓合
# (math.pi+math.pi/n_g2)*n_g2/n_g3 則是第2齒原定位線為順時鐘轉動 90 度, 
# 但是第2齒輪為了與第1齒輪囓合, 已經距離定位線, 多轉了 180 度, 再加上第2齒輪的一齒角度, 因為要帶動第3齒輪定位, 
# 這個修正角度必須要再配合第2齒與第3齒的轉速比加以轉換成第3齒輪的轉角, 因此乘上 n_g2/n_g3
ctx.rotate(math.pi/n_g3+(math.pi-math.pi/n_g2)*n_g2/n_g3)
# put it back
ctx.translate(-x_g3, -y_g3)
Spur(ctx).Gear(x_g3, y_g3, rp_g3, n_g3, pa, "black")
ctx.restore()

ctx.beginPath()
ctx.fillStyle = "#0000FF"
ctx.font = "30px Arial"
ctx.fillText("40423118",x_g3-20, y_g3)
ctx.stroke()

# 第4齒輪
ctx.save()
# translate to the origin of second gear
ctx.translate(x_g4, y_g4)
# rotate to engage
ctx.rotate(math.pi/n_g4+(math.pi/n_g3+(math.pi-math.pi/n_g2)*n_g2/n_g3)*n_g3/n_g4)
# put it back
ctx.translate(-x_g4, -y_g4)
Spur(ctx).Gear(x_g4, y_g4, rp_g4, n_g4, pa, "green")
ctx.restore()

ctx.beginPath()
ctx.fillStyle = "#0000FF"
ctx.font = "30px Arial"
ctx.fillText("40423127",x_g4-20, y_g4)
ctx.stroke()


# 第5齒輪
ctx.save()
# translate to the origin of second gear
ctx.translate(x_g5, y_g5)
# rotate to engage
ctx.rotate(math.pi/n_g5+(math.pi/n_g4+(math.pi/n_g3+(math.pi-math.pi/n_g2)*n_g2/n_g3)*n_g3/n_g4)*n_g4/n_g5)
# put it back
ctx.translate(-x_g5, -y_g5)
Spur(ctx).Gear(x_g5, y_g5, rp_g5, n_g5, pa, "red")
ctx.restore()

ctx.beginPath()
ctx.fillStyle = "#0000FF"
ctx.font = "30px Arial"
ctx.fillText("40423131",x_g5-20, y_g5)
ctx.stroke()


# 第6齒輪
ctx.save()
# translate to the origin of second gear
ctx.translate(x_g6, y_g6)
# rotate to engage
ctx.rotate(math.pi/n_g6+(math.pi/n_g5+(math.pi/n_g4+(math.pi/n_g3+(math.pi-math.pi/n_g2)*n_g2/n_g3)*n_g3/n_g4)*n_g4/n_g5)*n_g5/n_g6)
# put it back
ctx.translate(-x_g6, -y_g6)
Spur(ctx).Gear(x_g6, y_g6, rp_g6, n_g6, pa, "black")
ctx.restore()

ctx.beginPath()
ctx.fillStyle = "#0000FF"
ctx.font = "30px Arial"
ctx.fillText("40423132",x_g6-20, y_g6)
ctx.stroke()


# 第7齒輪
ctx.save()
# translate to the origin of second gear
ctx.translate(x_g7, y_g7)
# rotate to engage
ctx.rotate(math.pi/n_g7+(math.pi/n_g6+(math.pi/n_g5+(math.pi/n_g4+(math.pi/n_g3+(math.pi-math.pi/n_g2)*n_g2/n_g3)*n_g3/n_g4)*n_g4/n_g5)*n_g5/n_g6)*n_g6/n_g7)
# put it back
ctx.translate(-x_g7, -y_g7)
Spur(ctx).Gear(x_g7, y_g7, rp_g7, n_g7, pa, "purple")
ctx.restore()

ctx.beginPath()
ctx.fillStyle = "#0000FF"
ctx.font = "30px Arial"
ctx.fillText("40423152",x_g7-20, y_g7)
ctx.stroke()
&lt;/script&gt;

&lt;p&gt;4.&lt;iframe src="https://player.vimeo.com/video/219791528" width="640" height="347" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/219791528"&gt;虎尾科技大學 機械設計系 40423116 李冠辰   齒輪組&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>2017springcd_hw 第十二週</title><link href="./2017springcd_hw-di-shi-er-zhou.html" rel="alternate"></link><published>2017-05-11T12:16:00+08:00</published><updated>2017-05-11T12:16:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-05-11:./2017springcd_hw-di-shi-er-zhou.html</id><summary type="html">&lt;p&gt;Brython繪製齒輪組嚙合&lt;/p&gt;


&lt;p&gt;利用漸開線原理, 以 Brython 繪製齒輪組嚙合&lt;/p&gt;
&lt;!-- 導入 Brython 標準程式庫 --&gt;

&lt;script src="../data/Brython-3.3.1/brython.js"&gt;&lt;/script&gt;

&lt;script src="../data/Brython-3.3.1/brython_stdlib.js"&gt;&lt;/script&gt;

&lt;!-- 啟動 Brython --&gt;

&lt;script&gt;
window.onload=function(){
// 設定 data/py 為共用程式路徑
brython({debug:1, pythonpath:['./../data/py']});
}
&lt;/script&gt;

&lt;!-- 以下實際利用  Brython 繪圖--&gt;

&lt;canvas id="onegear" width="800" height="600"&gt;&lt;/canvas&gt;

&lt;div id="onegear_div" width="800" height="20"&gt;&lt;/div&gt;

&lt;script type="text/python3"&gt;
from browser import document as doc
import math
# deg 為角度轉為徑度的轉換因子
deg = math.pi/180.
# 定義 Spur 類別
class Spur(object):
    def __init__(self, ctx):
        self.ctx = ctx

    def create_line(self, x1, y1, x2, y2, width=3, fill="red"):
        self.ctx.beginPath()
        self.ctx.lineWidth = width
        self.ctx.moveTo(x1, y1)
        self.ctx.lineTo(x2, y2)
        self.ctx.strokeStyle = fill
        self.ctx.stroke()
    #
    # 定義一個繪正齒輪的繪圖函式
    # midx 為齒輪圓心 x 座標
    # midy 為齒輪圓心 y 座標
    # rp 為節圓半徑, n 為齒數
    # pa 為壓力角 (deg)
    # rot 為旋轉角 (deg)
    # 已經針對 n 大於等於 52 齒時的繪圖錯誤修正, 因為 base circle 與齒根圓大小必須進行判斷
    def Gear(self, midx, midy, rp, n=20, pa=20, color="black"):
        # 齒輪漸開線分成 15 線段繪製
        imax = 15
        # 在輸入的畫布上繪製直線, 由圓心到節圓 y 軸頂點畫一直線
        self.create_line(midx, midy, midx, midy-rp)
        # 畫出 rp 圓, 畫圓函式尚未定義
        #create_oval(midx-rp, midy-rp, midx+rp, midy+rp, width=2)
        # a 為模數 (代表公制中齒的大小), 模數為節圓直徑(稱為節徑)除以齒數
        # 模數也就是齒冠大小
        a=2*rp/n
        # d 為齒根大小, 為模數的 1.157 或 1.25倍, 這裡採 1.25 倍
        d=2.5*rp/n
        # ra 為齒輪的外圍半徑
        ra=rp+a
        # 畫出 ra 圓, 畫圓函式尚未定義
        #create_oval(midx-ra, midy-ra, midx+ra, midy+ra, width=1)
        # rb 則為齒輪的基圓半徑
        # 基圓為漸開線長齒之基準圓
        rb=rp*math.cos(pa*deg)
        # 畫出 rb 圓 (基圓), 畫圓函式尚未定義
        #create_oval(midx-rb, midy-rb, midx+rb, midy+rb, width=1)
        # rd 為齒根圓半徑
        rd=rp-d
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        # 畫出 rd 圓 (齒根圓), 畫圓函式尚未定義
        #create_oval(midx-rd, midy-rd, midx+rd, midy+rd, width=1)
        # dr 則為基圓到齒頂圓半徑分成 imax 段後的每段半徑增量大小
        # 將圓弧分成 imax 段來繪製漸開線
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        if rd&gt;rb:
            dr = (ra-rd)/imax
        else:
            dr=(ra-rb)/imax
        # tan(pa*deg)-pa*deg 為漸開線函數
        sigma=math.pi/(2*n)+math.tan(pa*deg)-pa*deg
        for j in range(n):
            ang=-2.*j*math.pi/n+sigma
            ang2=2.*j*math.pi/n+sigma
            lxd=midx+rd*math.sin(ang2-2.*math.pi/n)
            lyd=midy-rd*math.cos(ang2-2.*math.pi/n)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(alpha-ang)
                ypt=r*math.cos(alpha-ang)
                xd=rd*math.sin(-ang)
                yd=rd*math.cos(-ang)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由左側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    lfx=midx+xpt
                    lfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # the line from last end of dedendum point to the recent
            # end of dedendum point
            # lxd 為齒根圓上的左側 x 座標, lyd 則為 y 座標
            # 下列為齒根圓上用來近似圓弧的直線
            self.create_line((lxd),(lyd),(midx+xd),(midy-yd),fill=color)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(ang2-alpha)
                ypt=r*math.cos(ang2-alpha)
                xd=rd*math.sin(ang2)
                yd=rd*math.cos(ang2)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由右側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    rfx=midx+xpt
                    rfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # lfx 為齒頂圓上的左側 x 座標, lfy 則為 y 座標
            # 下列為齒頂圓上用來近似圓弧的直線
            self.create_line(lfx,lfy,rfx,rfy,fill=color)
canvas = doc['onegear']
ctx = canvas.getContext("2d")
'''
x = (canvas.width)/2
y = (canvas.height)/2
r = 0.8*(canvas.height/2)
'''
x = (canvas.width)/2
y = (canvas.height)/2
canvas_size = canvas.width*0.4
# 齒數
#n = 17
n17 = 17
n11 = 11
n13 = 13

r17 = canvas_size*n17/(n17+n11+n13)
r11 = canvas_size*n11/(n17+n11+n13)
r13 = canvas_size*n13/(n17+n11+n13)

x13 = x
x11 = x + (r11+r13)
x17 = x - (r17+r13)

# 壓力角
pa = 20
'''
ctx.save()
ctx.translate( x17 , y )
ctx.rotate(90*deg)
ctx.translate( -x17 , -y )
gear = Spur(ctx).Gear(x, y, r, n, pa, "blue")
'''
ctx.save()
ctx.translate( x17 , y )
ctx.rotate(90*deg)
ctx.translate( -x17 , -y )
gear17 = Spur(ctx).Gear(x17, y, r17, n17, pa, "blue")
ctx.restore()

ctx.save()
ctx.translate( x13 , y )
ctx.rotate(-90*deg-math.pi/n13)
ctx.translate( -x13 , -y )
gear13 = Spur(ctx).Gear(x13, y, r13, n13, pa, "blue")
ctx.restore()

ctx.save()
ctx.translate( x11 , y )
ctx.rotate(-90*deg-math.pi/n11)
ctx.translate( -x11 , -y )
gear11 = Spur(ctx).Gear(x11, y, r11, n11, pa, "blue")
ctx.restore()

div = doc["onegear_div"]
div &lt;= str(canvas.width) + "X" + str(canvas.height)
&lt;/script&gt;

&lt;!-- 以下處理 Cango Spur Gear --&gt;

&lt;!-- Cango 程式庫 --&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/Cango-9v05-min.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/CangoAxes-2v09.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/CangoAnimation-5v00.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/gearUtils-05.js"&gt;&lt;/script&gt;

&lt;canvas id='cango_gear' width='800' height='750'&gt;&lt;/canvas&gt;

&lt;script type="text/python"&gt;
# 將 導入的 document 設為 doc 主要原因在於與舊程式碼相容
from browser import document as doc
# 由於 Python3 與 Javascript 程式碼已經不再混用, 因此來自 Javascript 的變數, 必須居中透過 window 物件轉換
from browser import window
import math

# 主要用來取得畫布大小
canvas = doc["cango_gear"]
# 此程式採用 Cango Javascript 程式庫繪圖, 因此無需 ctx
ctx = canvas.getContext("2d")
cango = window.Cango.new
# 針對變數的轉換, shapeDefs 在 Cango 中資料型別為變數, 可以透過 window 轉換
shapedefs = window.shapeDefs
# 目前 Cango 結合 Animation 在 Brython 尚無法運作, 此刻只能繪製靜態圖形
# in CangoAnimation.js
#interpolate1 = window.interpolate
# Cobi 與 createGearTooth 都是 Cango Javascript 程式庫中的物件
#cobj = window.Cobj.new
shape = window.Shape.new
path = window.Path.new
creategeartooth = window.createGearTooth.new

tweener = window.Tweener.new
# 經由 Cango 轉換成 Brython 的 cango, 指定將圖畫在 id="cango_gear" 的 canvas 上
cgo = cango("cango_gear")

######################################
# 畫正齒輪輪廓
#####################################
# n 為齒數
n = 17
# pa 為壓力角
pa = 25
# m 為模數, 根據畫布的寬度, 計算適合的模數大小
# Module = mm of pitch diameter per tooth
m = 0.8*canvas.width/n
# pr 為節圓半徑
pr = n*m/2 # gear Pitch radius
# generate gear
data = creategeartooth(m, n, pa)
# Brython 程式中的 print 會將資料印在 Browser 的 console 區
#print(data)
gearTooth = shape(data, {
  "fillColor":"#ddd0dd",
  "border": True,
  "strokeColor": "#606060" })
gearTooth.rotate(180/n) # rotate gear 1/2 tooth to mesh
# 單齒的齒形資料經過旋轉後, 將資料複製到 gear 物件中
gear = gearTooth.dup()
# gear 為單一齒的輪廓資料
#cgo.render(gearTooth)

# 利用單齒輪廓旋轉, 產生整個正齒輪外形
for i in range(1, n):
    # 將 gearTooth 中的資料複製到 newTooth
    newTooth = gearTooth.dup()
    # 配合迴圈, newTooth 的齒形資料進行旋轉, 然後利用 appendPath 方法, 將資料併入 gear
    newTooth.rotate(360*i/n)
    # appendPath 為 Cango 程式庫中的方法, 第二個變數為 True, 表示要刪除最前頭的 Move to SVG Path 標註符號
    gear.appendPath(newTooth, True) # trim move command = True

# 建立軸孔
# add axle hole, hr 為 hole radius
hr = 0.6*pr # diameter of gear shaft
shaft = path(shapedefs.circle(hr))
shaft.revWinding()
gear.appendPath(shaft) # retain the 'moveTo' command for shaft sub path

# setup the animation
# backlash (mm)
bklsh = 0.04*m
# centre shift to make backlash
dC = bklsh/(2*math.tan(math.pi*pa/180))
# np 為小齒輪齒數
np = 13
# gear ratio
gr = n/np              
gearConfig = {'cx':-pr, 'cy':0, 'degs':[0, 360]}
# gr*0.666 rpm
#pinionConfig = {'cx':pr+dC, 'cy':0, 'degs':[0, -gr*360]}
# 0.666 rpm
twnr = tweener(0, 90000, "loop")

cx = canvas.width/2
cy = canvas.height/2
#gear.translate(cx, cy)
# render 繪出靜態正齒輪輪廓
#cgo.render(gear)
# 利用 gear 資料複製一份, 命名為 gear1
gear1 = gear.dup()

from time import time
from browser.timer import request_animation_frame as raf
from browser.timer import set_interval

deg = math.pi/180

def draw():
    cgo.clearCanvas()
    gear.rotate(2*deg)
    # 在特定位置, 以特定 scale, 特定 degs 執行 render
    cgo.render(gear, {'x':cx-pr/2, 'y':cy, 'scl':0.5, 'degs':0})
    gear1.rotate(-2*deg)
    cgo.render(gear1, {'x':cx+pr*2*0.5-pr/2, 'y':cy, 'scl':0.5, 'degs':0})

set_interval(draw, 2)
&lt;/script&gt;

&lt;!-- 導入 Brython 標準程式庫 --&gt;

&lt;script src="./../data/Brython-3.3.1/brython.js"&gt;&lt;/script&gt;

&lt;script src="./../data/Brython-3.3.1/brython_stdlib.js"&gt;&lt;/script&gt;

&lt;!-- 啟動 Brython --&gt;

&lt;script&gt;
window.onload=function(){
// 設定 data/py 為共用程式路徑
brython({debug:1, pythonpath:['./../data/py']});
}
&lt;/script&gt;

&lt;canvas id="onegear2" width="800" height="600"&gt;&lt;/canvas&gt;

&lt;div id="onegear2_div" width="800" height="20"&gt;&lt;/div&gt;

&lt;p&gt;&lt;input id="n1" value="13"&gt;&lt;/input&gt;&lt;br /&gt;
&lt;input id="n2" value="11"&gt;&lt;/input&gt;&lt;br /&gt;
&lt;input id="n3" value="17"&gt;&lt;/input&gt;&lt;br /&gt;
&lt;button id="button"&gt;Set Number of Gears&lt;/button&gt;&lt;/p&gt;

&lt;script type="text/python3"&gt;
from browser import document as doc
from browser import html
import math
# deg 為角度轉為徑度的轉換因子
deg = math.pi/180.
# 定義 Spur 類別
class Spur(object):
    def __init__(self, ctx):
        self.ctx = ctx

    def create_line(self, x1, y1, x2, y2, width=3, fill="red"):
        self.ctx.beginPath()
        self.ctx.lineWidth = width
        self.ctx.moveTo(x1, y1)
        self.ctx.lineTo(x2, y2)
        self.ctx.strokeStyle = fill
        self.ctx.stroke()
    #
    # 定義一個繪正齒輪的繪圖函式
    # midx 為齒輪圓心 x 座標
    # midy 為齒輪圓心 y 座標
    # rp 為節圓半徑, n 為齒數
    # pa 為壓力角 (deg)
    # 已經針對 n 大於等於 52 齒時的繪圖錯誤修正, 因為 base circle 與齒根圓大小必須進行判斷
    def Gear(self, midx, midy, rp, n=20, pa=20, color="black"):
        # 齒輪漸開線分成 15 線段繪製
        imax = 15
        # 在輸入的畫布上繪製直線, 由圓心到節圓 y 軸頂點畫一直線
        self.create_line(midx, midy, midx, midy-rp)
        # 畫出 rp 圓, 畫圓函式尚未定義
        #create_oval(midx-rp, midy-rp, midx+rp, midy+rp, width=2)
        # a 為模數 (代表公制中齒的大小), 模數為節圓直徑(稱為節徑)除以齒數
        # 模數也就是齒冠大小
        a=2*rp/n
        # d 為齒根大小, 為模數的 1.157 或 1.25倍, 這裡採 1.25 倍
        d=2.5*rp/n
        # ra 為齒輪的外圍半徑
        ra=rp+a
        # 畫出 ra 圓, 畫圓函式尚未定義
        #create_oval(midx-ra, midy-ra, midx+ra, midy+ra, width=1)
        # rb 則為齒輪的基圓半徑
        # 基圓為漸開線長齒之基準圓
        rb=rp*math.cos(pa*deg)
        # 畫出 rb 圓 (基圓), 畫圓函式尚未定義
        #create_oval(midx-rb, midy-rb, midx+rb, midy+rb, width=1)
        # rd 為齒根圓半徑
        rd=rp-d
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        # 畫出 rd 圓 (齒根圓), 畫圓函式尚未定義
        #create_oval(midx-rd, midy-rd, midx+rd, midy+rd, width=1)
        # dr 則為基圓到齒頂圓半徑分成 imax 段後的每段半徑增量大小
        # 將圓弧分成 imax 段來繪製漸開線
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        if rd&gt;rb:
            dr = (ra-rd)/imax
        else:
            dr=(ra-rb)/imax
        # tan(pa*deg)-pa*deg 為漸開線函數
        sigma=math.pi/(2*n)+math.tan(pa*deg)-pa*deg
        for j in range(n):
            ang=-2.*j*math.pi/n+sigma
            ang2=2.*j*math.pi/n+sigma
            lxd=midx+rd*math.sin(ang2-2.*math.pi/n)
            lyd=midy-rd*math.cos(ang2-2.*math.pi/n)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(alpha-ang)
                ypt=r*math.cos(alpha-ang)
                xd=rd*math.sin(-ang)
                yd=rd*math.cos(-ang)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由左側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    lfx=midx+xpt
                    lfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # the line from last end of dedendum point to the recent
            # end of dedendum point
            # lxd 為齒根圓上的左側 x 座標, lyd 則為 y 座標
            # 下列為齒根圓上用來近似圓弧的直線
            self.create_line((lxd),(lyd),(midx+xd),(midy-yd),fill=color)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(ang2-alpha)
                ypt=r*math.cos(ang2-alpha)
                xd=rd*math.sin(ang2)
                yd=rd*math.cos(ang2)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由右側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    rfx=midx+xpt
                    rfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # lfx 為齒頂圓上的左側 x 座標, lfy 則為 y 座標
            # 下列為齒頂圓上用來近似圓弧的直線
            self.create_line(lfx,lfy,rfx,rfy,fill=color)

canvas = doc['onegear2']
ctx = canvas.getContext("2d")

# 以 button 驅動的事件函式
def setgearnumber(e):
    ctx.clearRect(0, 0, canvas.width, canvas.height)
    x = (canvas.width)/2
    y = (canvas.height)/2
    if doc["n1"].value.isdigit():
        n17 = int(doc["n1"].value)
    else:
        n17 = 17

    if doc["n2"].value.isdigit():
        n11 = int(doc["n2"].value)
    else:
        n11 = 11

    if doc["n3"].value.isdigit():
        n13 = int(doc["n3"].value)
    else:
        n13 = 13

    # 只使用畫布高度的 80%
    canvas_size = canvas.height*0.4
    r17 = canvas_size*n17/(n17+n11+n13)
    r11 = canvas_size*n11/(n17+n11+n13)
    r13 = canvas_size*n13/(n17+n11+n13)
    # 計算各齒輪中心座標
    x17 = x - r17-r11
    y17 = y

    x11 = x 
    y11 = y

    x13 = x + r11+r13
    y13 = y

    pa = 20
    # 開始繪製齒輪
    # 儲存原有的座標系統
    ctx.save()
    # 平移到齒輪圓心
    ctx.translate(x17, y17)
    # 以齒輪圓心旋轉 90 度, 讓紅色標線在齒輪右側保持水平
    ctx.rotate(90*deg)
    # 平移回原來的座標原點
    ctx.translate(-x17, -y17)
    gear17 = Spur(ctx).Gear(x17, y17, r17, n17, pa, "blue")
    # 回復原有的座標系統
    ctx.restore()

    ctx.save()
    ctx.translate(x11, y11)
    # 中間齒輪轉動 -90 度加上一齒, 可以與左側齒輪囓合
    ctx.rotate(-90*deg-math.pi/n11)
    ctx.translate(-x11, -y11)
    gear11 = Spur(ctx).Gear(x11, y11, r11, n11, pa, "blue")
    ctx.restore()

    ctx.save()
    ctx.translate(x13, y13)
    # 右側齒輪轉動 -90 度加上一齒, 可以與原來標線在左側水平的中間齒輪囓合, 但是目前中間齒輪的標線已經轉了 180 度加或減一次
    # 必須配合兩齒的速比轉換旋轉角, 以便讓中間齒輪與右側齒輪囓合
    ctx.rotate(-90*deg-math.pi/n13+(180*deg+math.pi/n11)*n11/n13)
    ctx.translate(-x13, -y13)
    gear13 = Spur(ctx).Gear(x13, y13, r13, n13, pa, "blue")
    ctx.restore()

setgearnumber(True)

'''
div = doc["onegear2_div"]
form = html.FORM()
input1 = html.INPUT(type="text", id="n1", name="n1", value="13")
input2 = html.INPUT(type="text", id="n2", name="n2", value="11")
input3 = html.INPUT(type="text", id="n3", name="n3", value="19")
div &lt;= input1 + html.BR() + input2 + html.BR() + input3
'''
doc['button'].bind('click',setgearnumber)
&lt;/script&gt;

&lt;iframe src="https://player.vimeo.com/video/223099755" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/223099755"&gt;虎尾科技大學 機械設計系40423116 齒輪運動&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>2017springcd_hw 第十一週</title><link href="./2017springcd_hw-di-shi-yi-zhou.html" rel="alternate"></link><published>2017-05-04T12:16:00+08:00</published><updated>2017-05-04T12:16:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-05-04:./2017springcd_hw-di-shi-yi-zhou.html</id><summary type="html">&lt;p&gt;單一 2D 正齒輪繪圖到齒輪組嚙合&lt;/p&gt;


&lt;p&gt;利用漸開線原理, 以 Brython 繪製單一正齒輪廓:&lt;/p&gt;
&lt;!-- 導入 Brython 標準程式庫 --&gt;

&lt;script src="../data/Brython-3.3.1/brython.js"&gt;&lt;/script&gt;

&lt;script src="../data/Brython-3.3.1/brython_stdlib.js"&gt;&lt;/script&gt;

&lt;!-- 啟動 Brython --&gt;

&lt;script&gt;
window.onload=function(){
// 設定 data/py 為共用程式路徑
brython({debug:1, pythonpath:['./../data/py']});
}
&lt;/script&gt;

&lt;!-- 以下實際利用  Brython 繪圖--&gt;

&lt;canvas id="onegear" width="800" height="600"&gt;&lt;/canvas&gt;

&lt;div id="onegear_div" width="800" height="20"&gt;&lt;/div&gt;

&lt;script type="text/python3"&gt;
from browser import document as doc
import math
# deg 為角度轉為徑度的轉換因子
deg = math.pi/180.
# 定義 Spur 類別
class Spur(object):
    def __init__(self, ctx):
        self.ctx = ctx

    def create_line(self, x1, y1, x2, y2, width=3, fill="red"):
        self.ctx.beginPath()
        self.ctx.lineWidth = width
        self.ctx.moveTo(x1, y1)
        self.ctx.lineTo(x2, y2)
        self.ctx.strokeStyle = fill
        self.ctx.stroke()
    #
    # 定義一個繪正齒輪的繪圖函式
    # midx 為齒輪圓心 x 座標
    # midy 為齒輪圓心 y 座標
    # rp 為節圓半徑, n 為齒數
    # pa 為壓力角 (deg)
    # rot 為旋轉角 (deg)
    # 已經針對 n 大於等於 52 齒時的繪圖錯誤修正, 因為 base circle 與齒根圓大小必須進行判斷
    def Gear(self, midx, midy, rp, n=20, pa=20, color="black"):
        # 齒輪漸開線分成 15 線段繪製
        imax = 15
        # 在輸入的畫布上繪製直線, 由圓心到節圓 y 軸頂點畫一直線
        self.create_line(midx, midy, midx, midy-rp)
        # 畫出 rp 圓, 畫圓函式尚未定義
        #create_oval(midx-rp, midy-rp, midx+rp, midy+rp, width=2)
        # a 為模數 (代表公制中齒的大小), 模數為節圓直徑(稱為節徑)除以齒數
        # 模數也就是齒冠大小
        a=2*rp/n
        # d 為齒根大小, 為模數的 1.157 或 1.25倍, 這裡採 1.25 倍
        d=2.5*rp/n
        # ra 為齒輪的外圍半徑
        ra=rp+a
        # 畫出 ra 圓, 畫圓函式尚未定義
        #create_oval(midx-ra, midy-ra, midx+ra, midy+ra, width=1)
        # rb 則為齒輪的基圓半徑
        # 基圓為漸開線長齒之基準圓
        rb=rp*math.cos(pa*deg)
        # 畫出 rb 圓 (基圓), 畫圓函式尚未定義
        #create_oval(midx-rb, midy-rb, midx+rb, midy+rb, width=1)
        # rd 為齒根圓半徑
        rd=rp-d
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        # 畫出 rd 圓 (齒根圓), 畫圓函式尚未定義
        #create_oval(midx-rd, midy-rd, midx+rd, midy+rd, width=1)
        # dr 則為基圓到齒頂圓半徑分成 imax 段後的每段半徑增量大小
        # 將圓弧分成 imax 段來繪製漸開線
        # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
        if rd&gt;rb:
            dr = (ra-rd)/imax
        else:
            dr=(ra-rb)/imax
        # tan(pa*deg)-pa*deg 為漸開線函數
        sigma=math.pi/(2*n)+math.tan(pa*deg)-pa*deg
        for j in range(n):
            ang=-2.*j*math.pi/n+sigma
            ang2=2.*j*math.pi/n+sigma
            lxd=midx+rd*math.sin(ang2-2.*math.pi/n)
            lyd=midy-rd*math.cos(ang2-2.*math.pi/n)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(alpha-ang)
                ypt=r*math.cos(alpha-ang)
                xd=rd*math.sin(-ang)
                yd=rd*math.cos(-ang)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由左側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    lfx=midx+xpt
                    lfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # the line from last end of dedendum point to the recent
            # end of dedendum point
            # lxd 為齒根圓上的左側 x 座標, lyd 則為 y 座標
            # 下列為齒根圓上用來近似圓弧的直線
            self.create_line((lxd),(lyd),(midx+xd),(midy-yd),fill=color)
            for i in range(imax+1):
                # 當 rd 大於 rb 時, 漸開線並非畫至 rb, 而是 rd
                if rd&gt;rb:
                    r=rd+i*dr
                else:
                    r=rb+i*dr
                theta=math.sqrt((r*r)/(rb*rb)-1.)
                alpha=theta-math.atan(theta)
                xpt=r*math.sin(ang2-alpha)
                ypt=r*math.cos(ang2-alpha)
                xd=rd*math.sin(ang2)
                yd=rd*math.cos(ang2)
                # i=0 時, 繪線起點由齒根圓上的點, 作為起點
                if(i==0):
                    last_x = midx+xd
                    last_y = midy-yd
                # 由右側齒根圓作為起點, 除第一點 (xd,yd) 齒根圓上的起點外, 其餘的 (xpt,ypt)則為漸開線上的分段點
                self.create_line((midx+xpt),(midy-ypt),(last_x),(last_y),fill=color)
                # 最後一點, 則為齒頂圓
                if(i==imax):
                    rfx=midx+xpt
                    rfy=midy-ypt
                last_x = midx+xpt
                last_y = midy-ypt
            # lfx 為齒頂圓上的左側 x 座標, lfy 則為 y 座標
            # 下列為齒頂圓上用來近似圓弧的直線
            self.create_line(lfx,lfy,rfx,rfy,fill=color)
canvas = doc['onegear']
ctx = canvas.getContext("2d")
x = (canvas.width)/2
y = (canvas.height)/2
r = 0.8*(canvas.height/2)
# 齒數
n = 53
# 壓力角
pa = 20
Spur(ctx).Gear(x, y, r, n, pa, "blue")
# 以下列出 W11 2B 與 2A 未出席人數
data = open("./../data/w11/2b0503.txt", encoding="utf-8").read()
data1 = open("./../data/w11/2a0504.txt", encoding="utf-8").read()
count = 0
count1 = 0
# 去掉前面兩列
student = data.split("\n")[2:]
student1 = data1.split("\n")[2:]
for i in range(len(student)):
    each = student[i].split("\t")
    if each[1] != "出席":
        count = count + 1
for i in range(len(student1)):
    each1 = student1[i].split("\t")
    if each1[1] != "present":
        count1 = count1 + 1
div = doc["onegear_div"]
div &lt;= "2b: " +  str(count) + "/" + str(len(student)) + "|" + "2a: " +  str(count1) + "/" + str(len(student1))
&lt;/script&gt;

&lt;!-- 以下處理 Cango Spur Gear --&gt;

&lt;!-- Cango 程式庫 --&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/Cango-9v05-min.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/CangoAxes-2v09.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/CangoAnimation-5v00.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="./../data/w11/cango
/gearUtils-05.js"&gt;&lt;/script&gt;

&lt;canvas id='cango_gear' width='800' height='750'&gt;&lt;/canvas&gt;

&lt;script type="text/python"&gt;
# 將 導入的 document 設為 doc 主要原因在於與舊程式碼相容
from browser import document as doc
# 由於 Python3 與 Javascript 程式碼已經不再混用, 因此來自 Javascript 的變數, 必須居中透過 window 物件轉換
from browser import window
import math

# 主要用來取得畫布大小
canvas = doc["cango_gear"]
# 此程式採用 Cango Javascript 程式庫繪圖, 因此無需 ctx
ctx = canvas.getContext("2d")
cango = window.Cango.new
# 針對變數的轉換, shapeDefs 在 Cango 中資料型別為變數, 可以透過 window 轉換
shapedefs = window.shapeDefs
# 目前 Cango 結合 Animation 在 Brython 尚無法運作, 此刻只能繪製靜態圖形
# in CangoAnimation.js
#interpolate1 = window.interpolate
# Cobi 與 createGearTooth 都是 Cango Javascript 程式庫中的物件
#cobj = window.Cobj.new
shape = window.Shape.new
path = window.Path.new
creategeartooth = window.createGearTooth.new

tweener = window.Tweener.new
# 經由 Cango 轉換成 Brython 的 cango, 指定將圖畫在 id="cango_gear" 的 canvas 上
cgo = cango("cango_gear")

######################################
# 畫正齒輪輪廓
#####################################
# n 為齒數
n = 17
# pa 為壓力角
pa = 25
# m 為模數, 根據畫布的寬度, 計算適合的模數大小
# Module = mm of pitch diameter per tooth
m = 0.8*canvas.width/n
# pr 為節圓半徑
pr = n*m/2 # gear Pitch radius
# generate gear
data = creategeartooth(m, n, pa)
# Brython 程式中的 print 會將資料印在 Browser 的 console 區
#print(data)
gearTooth = shape(data, {
  "fillColor":"#ddd0dd",
  "border": True,
  "strokeColor": "#606060" })
gearTooth.rotate(180/n) # rotate gear 1/2 tooth to mesh
# 單齒的齒形資料經過旋轉後, 將資料複製到 gear 物件中
gear = gearTooth.dup()
# gear 為單一齒的輪廓資料
#cgo.render(gearTooth)

# 利用單齒輪廓旋轉, 產生整個正齒輪外形
for i in range(1, n):
    # 將 gearTooth 中的資料複製到 newTooth
    newTooth = gearTooth.dup()
    # 配合迴圈, newTooth 的齒形資料進行旋轉, 然後利用 appendPath 方法, 將資料併入 gear
    newTooth.rotate(360*i/n)
    # appendPath 為 Cango 程式庫中的方法, 第二個變數為 True, 表示要刪除最前頭的 Move to SVG Path 標註符號
    gear.appendPath(newTooth, True) # trim move command = True

# 建立軸孔
# add axle hole, hr 為 hole radius
hr = 0.6*pr # diameter of gear shaft
shaft = path(shapedefs.circle(hr))
shaft.revWinding()
gear.appendPath(shaft) # retain the 'moveTo' command for shaft sub path

# setup the animation
# backlash (mm)
bklsh = 0.04*m
# centre shift to make backlash
dC = bklsh/(2*math.tan(math.pi*pa/180))
# np 為小齒輪齒數
np = 13
# gear ratio
gr = n/np              
gearConfig = {'cx':-pr, 'cy':0, 'degs':[0, 360]}
# gr*0.666 rpm
#pinionConfig = {'cx':pr+dC, 'cy':0, 'degs':[0, -gr*360]}
# 0.666 rpm
twnr = tweener(0, 90000, "loop")

cx = canvas.width/2
cy = canvas.height/2
#gear.translate(cx, cy)
# render 繪出靜態正齒輪輪廓
#cgo.render(gear)
# 利用 gear 資料複製一份, 命名為 gear1
gear1 = gear.dup()

from time import time
from browser.timer import request_animation_frame as raf
from browser.timer import set_interval

deg = math.pi/180

def draw():
    cgo.clearCanvas()
    gear.rotate(2*deg)
    # 在特定位置, 以特定 scale, 特定 degs 執行 render
    cgo.render(gear, {'x':cx-pr/2, 'y':cy, 'scl':0.5, 'degs':0})
    gear1.rotate(-2*deg)
    cgo.render(gear1, {'x':cx+pr*2*0.5-pr/2, 'y':cy, 'scl':0.5, 'degs':0})

set_interval(draw, 2)
&lt;/script&gt;</summary><category term="作業"></category></entry><entry><title>2017springcd_hw 第十週</title><link href="./2017springcd_hw-di-shi-zhou.html" rel="alternate"></link><published>2017-04-27T12:15:00+08:00</published><updated>2017-04-27T12:15:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-04-27:./2017springcd_hw-di-shi-zhou.html</id><summary type="html">&lt;h1&gt;python 運算加減乘除&lt;/h1&gt;


&lt;h1&gt;python 運算加減乘除&lt;/h1&gt;
&lt;iframe src="https://player.vimeo.com/video/214950724" width="640" height="626" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/214950724"&gt;虎尾科技大學機械設計系 40423116李冠辰 python加減乘除&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;!-- 導入 Brython 標準程式庫 --&gt;

&lt;script src="../data/Brython-3.3.1/brython.js"&gt;&lt;/script&gt;

&lt;script src="../data/Brython-3.3.1/brython_stdlib.js"&gt;&lt;/script&gt;

&lt;!-- 啟動 Brython --&gt;

&lt;script&gt;
window.onload=function(){
// 設定 data/py 為共用程式路徑
brython({debug:1, pythonpath:['./../data/py']});
}
&lt;/script&gt;

&lt;!-- 以下實際利用  Brython 畫四連桿 trace point 路徑--&gt;

&lt;!--&lt;canvas id="w10" width="800" height="600"&gt;&lt;/canvas&gt;--&gt;

&lt;div id="container" width="600" height="400"&gt;&lt;/div&gt;

&lt;script type="text/python3"&gt;
from browser import document as doc
from browser import html
import math
container = doc['container']
degree = math.pi/180
def button1(event):
    a = input("give me a")
    b = input("give me b")
    container &lt;= str(float(a)+float(b))
doc["button1"].bind("click", button1)

&lt;/script&gt;

&lt;p&gt;&lt;button id="button1"&gt; a + b&lt;/button&gt;&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>協同產品設計實習 ag3期中考報告</title><link href="./xie-tong-chan-pin-she-ji-shi-xi-ag3qi-zhong-kao-bao-gao.html" rel="alternate"></link><published>2017-04-21T12:15:00+08:00</published><updated>2017-04-21T12:15:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-04-21:./xie-tong-chan-pin-she-ji-shi-xi-ag3qi-zhong-kao-bao-gao.html</id><summary type="html">&lt;p&gt;期中考報告&lt;/p&gt;


&lt;p&gt;(一) Fossil Server 實習查驗&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mde2a2.kmol.info/midterm/ag3/home"&gt;ag3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(二) 四連桿機構協同 Trace Point 查驗&lt;/p&gt;
&lt;p&gt;&lt;a href="https://40423116.github.io/2017springcd_hw/blog/si-lian-gan-ji-gou-xie-tong-trace-point-cha-yan.html"&gt;40423116&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(三) Fourbar Walker OnShape 零件協同繪圖與組立查驗&lt;/p&gt;
&lt;h1&gt;製作&lt;/h1&gt;
&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/214840699" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/214840699"&gt;虎尾科技大學 機械設計系 40423116 李冠辰_期中報告01&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;h1&gt;組裝&lt;/h1&gt;
&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/214840482" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/214840482"&gt;虎尾科技大學 機械設計系 40423116 李冠辰_期中報告02&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;(四) 分組協同零件展示&lt;/p&gt;
&lt;h1&gt;4.零件展示&lt;/h1&gt;
&lt;p&gt;&lt;link href="./../data/madeleine/src/css/Madeleine.css" rel="stylesheet"&gt;
&lt;script src="./../data/madeleine/src/stats.js"&gt;&lt;/script&gt;
&lt;script src="./../data/madeleine/src/detector.js"&gt;&lt;/script&gt;
&lt;script src="./../data/madeleine/src/three.min.js"&gt;&lt;/script&gt;
&lt;script src="./../data/madeleine/src/Madeleine.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;div id="target" class="madeleine"&gt;&lt;/div&gt;

&lt;script&gt;
window.onload = function(){
    var madeleine = new Madeleine({
      target: 'target', // target div id
      data: './../data/40423116.stl', // data path
      path: './../data/madeleine/src/' // path to source directory from current html file
    });
}; 
&lt;/script&gt;

&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r68/three.min.js"
&gt;&lt;/script&gt;

&lt;script src="https://rawgit.com/mrdoob/three.js/master/examples/js/controls/TrackballControls.js"
&gt;&lt;/script&gt;

&lt;script src="./../data/w9/loader.js"&gt;&lt;/script&gt;

&lt;script src="./../data/w9/stl.js"&gt;&lt;/script&gt;

&lt;div&gt;
select stl file: &lt;input type="file" id="file" /&gt; or drop stl file
&lt;/div&gt;

&lt;div id="view"&gt;&lt;/div&gt;</summary><category term="作業"></category></entry><entry><title>四連桿機構協同 Trace Point 查驗</title><link href="./si-lian-gan-ji-gou-xie-tong-trace-point-cha-yan.html" rel="alternate"></link><published>2017-04-20T12:16:00+08:00</published><updated>2017-04-20T12:16:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-04-20:./si-lian-gan-ji-gou-xie-tong-trace-point-cha-yan.html</id><summary type="html">&lt;p&gt;四連桿機構協同 Trace Point 查驗&lt;/p&gt;


&lt;p&gt;四連桿機構Trace Point查驗&lt;/p&gt;
&lt;p&gt;&lt;img src="./../2017springcd/midterm2.png"width="800" /&gt;&lt;/p&gt;
&lt;iframe src="https://player.vimeo.com/video/214856353" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/214856353"&gt;虎尾科技大學 機械設計系 40423116 李冠辰_期中報告03&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;!-- 導入 Brython 標準程式庫 --&gt;

&lt;script type="text/javascript" src="https://cdn.rawgit.com/brython-dev/brython/master/www/src/brython_dist.js"&gt;
&lt;/script&gt;

&lt;!-- 啟動 Brython --&gt;

&lt;script&gt;
window.onload=function(){
brython(1);
}
&lt;/script&gt;

&lt;!-- 以下實際利用  Brython 畫四連桿 trace point 路徑--&gt;

&lt;canvas id="fourbar" width="600" height="1000"&gt;&lt;/canvas&gt;

&lt;div id="container1"&gt;&lt;/div&gt;

&lt;script type="text/python3"&gt;
from browser import document as doc
from browser import html
import math
# 準備繪圖畫布
canvas = doc["fourbar"]
container1 = doc['container1']
ctx = canvas.getContext("2d")

fourbar_data = open("./../2017springcd/midterm2.csv").read()
fourbar_list = fourbar_data.splitlines()
#container1 &lt;= fourbar_list[0]
# 以下可以利用 ctx 物件進行畫圖
# 先畫一條直線
ctx.beginPath()
# 設定線的寬度為 1 個單位
ctx.lineWidth = 1
# 利用 transform 將 y 座標反轉, 且 offset canvas.height
# (X scale, X skew, Y skew, Y scale, X offset, Y offset)
# 配合圖形位置進行座標轉換
ctx.transform(1, 0, 0, -1, canvas.width/2+250, canvas.height/2+100)
# 畫出 x 與 y 座標線
# 各座標值放大 8 倍
ratio = 8
ctx.moveTo(0, 0)
ctx.lineTo(-30*ratio, 0)
start_point = fourbar_list[0].split(",")
ctx.moveTo(float(start_point[0])*ratio, float(start_point[1])*ratio)
count = 0
for data in fourbar_list[1:]:
    point = data.split(",")
    #count = count + 1
    #container1 &lt;= str(count) + ":" + point[0] + "," + point[1]
    #container1 &lt;= html.BR()
    ctx.lineTo(float(point[0])*ratio, float(point[1])*ratio)
# 設定顏色為藍色, 也可以使用 "rgb(0, 0, 255)" 字串設定顏色值
ctx.strokeStyle = "blue"
# 實際執行畫線
ctx.stroke()
ctx.closePath()
&lt;/script&gt;</summary><category term="作業"></category></entry><entry><title>2017springcd_hw 第六週</title><link href="./2017springcd_hw-di-liu-zhou.html" rel="alternate"></link><published>2017-03-30T12:00:00+08:00</published><updated>2017-03-30T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-03-30:./2017springcd_hw-di-liu-zhou.html</id><summary type="html">&lt;p&gt;vrep運動模擬及設定&lt;/p&gt;


&lt;h3&gt;四連桿導入vrep運動模擬及設定&lt;/h3&gt;
&lt;iframe src="./../2017springcd/w1/40423116_fourbar.html"width="800"&gt;&lt;/iframe sr&gt;

&lt;iframe src="https://player.vimeo.com/video/211701804" width="640" height="347" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/211701804"&gt;虎尾科技大學 機械設計系 40423116 李冠辰&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;


###八連桿導入vrep運動模擬及設定

&lt;iframe src="https://player.vimeo.com/video/211696265" width="640" height="347" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/211696265"&gt;虎尾科技大學 機械設計系 40423116 李冠辰 八連桿模擬運動及設定&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>2017springcd_hw 第五週</title><link href="./2017springcd_hw-di-wu-zhou.html" rel="alternate"></link><published>2017-03-23T12:00:00+08:00</published><updated>2017-03-23T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-03-23:./2017springcd_hw-di-wu-zhou.html</id><summary type="html">&lt;p&gt;單連桿轉入 V-rep 進行運動模擬&lt;/p&gt;


&lt;p&gt;介紹Wiki編輯模式的種類(Fossil Wiki、Markdown、Html)&lt;/p&gt;
&lt;p&gt;Solcespace 單連桿轉入 V-rep 進行運動模擬&lt;/p&gt;
&lt;iframe src="./../2017springcd/onelink/one link.html"width="800" /&gt;&lt;/iframe&gt;

&lt;p&gt;影片:轉入 V-rep 設定跟運動模擬&lt;/p&gt;
&lt;iframe src="https://player.vimeo.com/video/211697923" width="640" height="347" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/211697923"&gt;虎尾科技大學 機械設計系 40423116 李冠辰 單連趕模擬運動及設定&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>2017springcd_hw 第四週</title><link href="./2017springcd_hw-di-si-zhou.html" rel="alternate"></link><published>2017-03-16T12:00:00+08:00</published><updated>2017-03-16T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-03-16:./2017springcd_hw-di-si-zhou.html</id><summary type="html">&lt;h1&gt;建立小組fossil倉儲並新增組員&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://mde2a2.kmol.info/cdag3"&gt;fossil倉儲第三組&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;fossil編寫程式用sql&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fossil sql -R vcp.fossil
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ipconfig /all
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;設定proxy--&amp;gt;進入foss倉儲網頁&lt;/p&gt;
&lt;h1&gt;Fossil SCM 與 Stunnel 啟動整合&lt;/h1&gt;
&lt;p&gt;3/16新增以 chrome 連線到 https://%NetworkIP%:443&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;tiny2017&lt;/span&gt; &lt;span class="nt"&gt;主要針對初學&lt;/span&gt; &lt;span class="nt"&gt;Python3&lt;/span&gt; &lt;span class="nt"&gt;與&lt;/span&gt; &lt;span class="nt"&gt;C&lt;/span&gt; &lt;span class="nt"&gt;學員所建立&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;近端使用&lt;/span&gt; &lt;span class="nt"&gt;fossil&lt;/span&gt; &lt;span class="nt"&gt;管理資料版本&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;並且定時轉為&lt;/span&gt; &lt;span class="nt"&gt;git&lt;/span&gt; &lt;span class="nt"&gt;格式後上傳到&lt;/span&gt; &lt;span class="nt"&gt;github&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;off&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;設定&lt;/span&gt; &lt;span class="nt"&gt;y&lt;/span&gt; &lt;span class="nt"&gt;硬碟代號與&lt;/span&gt; &lt;span class="nt"&gt;data&lt;/span&gt; &lt;span class="nt"&gt;目錄對應&lt;/span&gt;
&lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;y&lt;/span&gt;
&lt;span class="nt"&gt;subst&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;data&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;設定&lt;/span&gt; &lt;span class="nt"&gt;leo&lt;/span&gt; &lt;span class="nt"&gt;相關對應&lt;/span&gt; &lt;span class="nt"&gt;Home&lt;/span&gt; &lt;span class="nt"&gt;位置&lt;/span&gt;
&lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;HomePath&lt;/span&gt;&lt;span class="o"&gt;=%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;home&lt;/span&gt;
&lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;HomeDrive&lt;/span&gt;&lt;span class="o"&gt;=%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;home&lt;/span&gt;
&lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;Home&lt;/span&gt;&lt;span class="o"&gt;=%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;home&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;將系統&lt;/span&gt; &lt;span class="nt"&gt;Python&lt;/span&gt; &lt;span class="nt"&gt;程式的&lt;/span&gt; &lt;span class="nt"&gt;io&lt;/span&gt; &lt;span class="nt"&gt;設為&lt;/span&gt; &lt;span class="nt"&gt;utf-8&lt;/span&gt;
&lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;PYTHONIOENCODING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;將後續的指令執行&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;以&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nt"&gt;為主&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;設定&lt;/span&gt; &lt;span class="nt"&gt;PYTHONPATH&lt;/span&gt;
&lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;PYTHONPATH&lt;/span&gt;&lt;span class="o"&gt;=%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;python-3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3-embed-amd64&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;設定&lt;/span&gt; &lt;span class="nt"&gt;Leo&lt;/span&gt; &lt;span class="nt"&gt;所用的編輯器&lt;/span&gt;
&lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;LEO_EDITOR&lt;/span&gt;&lt;span class="o"&gt;=%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;wscite&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;SciTE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;exe&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;for&lt;/span&gt; &lt;span class="nt"&gt;fossil&lt;/span&gt; &lt;span class="nt"&gt;https&lt;/span&gt; &lt;span class="nt"&gt;連線設定&lt;/span&gt;
&lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;HTTPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;on&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;指令搜尋路徑設定&lt;/span&gt;
&lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;path1&lt;/span&gt;&lt;span class="o"&gt;=%&lt;/span&gt;&lt;span class="nt"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;python-3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3-embed-amd64&lt;/span&gt;&lt;span class="o"&gt;;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;git&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;stunnel&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;sqlite-tools&lt;/span&gt;&lt;span class="o"&gt;;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;python-3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3-embed-amd64&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;Scripts&lt;/span&gt;&lt;span class="o"&gt;;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;portablegit&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;path2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;c&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;Windows&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NET&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;Framework&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;v3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;5&lt;/span&gt;&lt;span class="o"&gt;;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;python-3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3-embed-amd64&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;Lib&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;site-packages&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=%&lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="o"&gt;%;%&lt;/span&gt;&lt;span class="nt"&gt;path1&lt;/span&gt;&lt;span class="o"&gt;%;%&lt;/span&gt;&lt;span class="nt"&gt;path2&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;
&lt;span class="nt"&gt;start&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;MIN&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;wscite&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;SciTE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;exe&lt;/span&gt;
&lt;span class="nt"&gt;start&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;MIN&lt;/span&gt; &lt;span class="nt"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;exe&lt;/span&gt;
&lt;span class="nt"&gt;start&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;MIN&lt;/span&gt; &lt;span class="nt"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;exe&lt;/span&gt;
&lt;span class="nt"&gt;start&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;MIN&lt;/span&gt; &lt;span class="nt"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;exe&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;啟動&lt;/span&gt; &lt;span class="nt"&gt;Leo&lt;/span&gt; &lt;span class="nt"&gt;編輯器&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;Miniconda3&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;python&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;exe&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;apps&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;launchLeo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;py&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;啟動&lt;/span&gt; &lt;span class="nt"&gt;stunnel&lt;/span&gt;
&lt;span class="nt"&gt;start&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;MIN&lt;/span&gt; &lt;span class="nt"&gt;fossil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;exe&lt;/span&gt; &lt;span class="nt"&gt;server&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; &lt;span class="nt"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;8080&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;tmp&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;fossil_repo&lt;/span&gt;
&lt;span class="nt"&gt;REM&lt;/span&gt; &lt;span class="nt"&gt;取得電腦&lt;/span&gt; &lt;span class="nt"&gt;IP&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;然後設定&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;Disk&lt;/span&gt;&lt;span class="o"&gt;%:/&lt;/span&gt;&lt;span class="nt"&gt;stunnel&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;stunnel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;conf&lt;/span&gt;
&lt;span class="nt"&gt;for&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;f&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;delims=&lt;/span&gt;&lt;span class="cp"&gt;[]&lt;/span&gt;&lt;span class="s2"&gt; tokens=2&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="nt"&gt;in&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;ping&lt;/span&gt; &lt;span class="nt"&gt;-4&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;1&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;ComputerName&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;^|&lt;/span&gt; &lt;span class="nt"&gt;findstr&lt;/span&gt; &lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;) do set NetworkIP=%%a&lt;/span&gt;
&lt;span class="s1"&gt;REM echo Network IP: %NetworkIP%&lt;/span&gt;
&lt;span class="s1"&gt;REM Saved in %Disk%:\stunnel\config\stunnel.conf&lt;/span&gt;
&lt;span class="s1"&gt;@echo off&lt;/span&gt;
&lt;span class="s1"&gt;REM 建立 stunnel.conf&lt;/span&gt;
&lt;span class="s1"&gt;@echo [https] &amp;gt; %Disk%:\stunnel\config\stunnel.conf&lt;/span&gt;
&lt;span class="s1"&gt;REM 附加資料&lt;/span&gt;
&lt;span class="s1"&gt;@echo accept = %NetworkIP%:443 &amp;gt;&amp;gt; %Disk%:\stunnel\config\stunnel.conf&lt;/span&gt;
&lt;span class="s1"&gt;@echo connect = 127.0.0.1:8080 &amp;gt;&amp;gt; %Disk%:\stunnel\config\stunnel.conf&lt;/span&gt;
&lt;span class="s1"&gt;@echo TIMEOUTclose = 0 &amp;gt;&amp;gt; %Disk%:\stunnel\config\stunnel.conf&lt;/span&gt;
&lt;span class="s1"&gt;@echo cert = %Disk%:\stunnel\config\localhost.crt &amp;gt;&amp;gt; %Disk%:\stunnel\config\stunnel.conf&lt;/span&gt;
&lt;span class="s1"&gt;@echo key = %Disk%:\stunnel\config\localhost.key &amp;gt;&amp;gt; %Disk%:\stunnel\config\stunnel.conf&lt;/span&gt;
&lt;span class="s1"&gt;REM 啟動 stunnel&lt;/span&gt;
&lt;span class="s1"&gt;start /MIN stunnel.exe&lt;/span&gt;
&lt;span class="s1"&gt;Exit&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary><category term="作業"></category></entry><entry><title>2017springcd_hw 第三週</title><link href="./2017springcd_hw-di-san-zhou.html" rel="alternate"></link><published>2017-03-09T12:00:00+08:00</published><updated>2017-03-09T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-03-09:./2017springcd_hw-di-san-zhou.html</id><summary type="html">&lt;p&gt;建立fossil倉儲&lt;/p&gt;


&lt;h3&gt;建立fossil倉儲&lt;/h3&gt;
&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/208837568" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/208837568"&gt;建立fossil倉儲&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>2017springcd_hw 第二週</title><link href="./2017springcd_hw-di-er-zhou.html" rel="alternate"></link><published>2017-03-02T12:00:00+08:00</published><updated>2017-03-02T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-03-02:./2017springcd_hw-di-er-zhou.html</id><summary type="html">&lt;p&gt;多連桿運動路徑&lt;/p&gt;


&lt;h2&gt;多連桿組立&lt;/h2&gt;
&lt;p&gt;&lt;iframe src="./../2017springcd/w2/bar.html"width="800" height="600"&gt;&lt;/iframe src&gt;
&lt;iframe src="https://player.vimeo.com/video/208828038" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/208828038"&gt;組合多連桿&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;img src="./../2017springcd/w2/bar01.html"width="800" height="600"&gt;
&lt;iframe src="https://player.vimeo.com/video/208821408" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/208821408"&gt;bar01&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;iframe src="./../2017springcd/w2/bar02.html"width="800" height="600"&gt;&lt;/iframe&gt;
&lt;iframe src="https://player.vimeo.com/video/208822323" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/208822323"&gt;bar02&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;iframe src="./../2017springcd/w2/bar03.html"width="800" height="600"&gt;&lt;/iframe&gt;
&lt;iframe src="./../2017springcd/w2/bar04.html"width="800" height="600"&gt;&lt;/iframe&gt;
&lt;iframe src="./../2017springcd/w2/bar05.html"width="800" height="600"&gt;&lt;/iframe&gt;
&lt;iframe src="./../2017springcd/w2/bar06.html"width="800" height="600"&gt;&lt;/iframe&gt;
&lt;iframe src="./../2017springcd/w2/bar07.html"width="800" height="600"&gt;&lt;/iframe&gt;
&lt;iframe src="https://player.vimeo.com/video/208823005" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/208823005"&gt;bar03-07&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;iframe src="./../2017springcd/w2/bar08.html"width="800" height="600"&gt;&lt;/iframe&gt;
&lt;iframe src="https://player.vimeo.com/video/208824504" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/208824504"&gt;bar08&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>2017springcd_hw 第一週</title><link href="./2017springcd_hw-di-yi-zhou.html" rel="alternate"></link><published>2017-02-22T12:00:00+08:00</published><updated>2017-02-22T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-02-22:./2017springcd_hw-di-yi-zhou.html</id><summary type="html">&lt;p&gt;&lt;a href="https://40423116.github.io/2017springcd_hw"&gt;個人作業簡報&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;組裝四連桿機構
&lt;iframe src="./../2017springcd/w1/40423116_fourbar.html"width="800" height="600"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;iframe src="https://player.vimeo.com/video/207459787" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/207459787"&gt;fourbar&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>電腦輔助設計實習 課程總結</title><link href="./dian-nao-fu-zhu-she-ji-shi-xi-ke-cheng-zong-jie.html" rel="alternate"></link><published>2017-01-12T12:00:00+08:00</published><updated>2017-01-12T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2017-01-12:./dian-nao-fu-zhu-she-ji-shi-xi-ke-cheng-zong-jie.html</id><summary type="html">&lt;p&gt;課程總結&lt;/p&gt;


&lt;h3&gt;四連桿運動路徑&lt;/h3&gt;
&lt;iframe src="https://player.vimeo.com/video/199434983" width="800" height="600" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/199434983"&gt;四連桿運動路徑&lt;/a&gt; from &lt;a href="https://vimeo.com/user46450524"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Solvespace 四連桿圖檔:&lt;/p&gt;

&lt;p&gt;&lt;img src="./../w10/40423116-w10-4.png"width="800" /&gt;
&lt;img src="./../w10/40423116-w10-4(2).png"width="800" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="./../w10/40423116.csv"&gt;40423116.csv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="./../w10/40423116-w10-4.slvs"&gt;40423116-w10-4.slvs&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;利用brython繪運動路徑&lt;/h2&gt;
&lt;!-- 導入 brython.js --&gt;

&lt;script type="text/javascript" src="https://cdn.rawgit.com/brython-dev/brython/master/www/src/brython_dist.js"&gt;&lt;/script&gt;

&lt;!-- 啟動 brython() --&gt;

&lt;script&gt;
window.onload=function(){
brython(1);
}
&lt;/script&gt;

&lt;!-- 以下利用 Brython 程式執行繪圖 --&gt;

&lt;canvas id="fourbar" width="600" height="600"&gt;&lt;/canvas&gt;

&lt;div id="container1"&gt;&lt;/div&gt;

&lt;script type="text/python3"&gt;
from browser import document as doc
from browser import html
import math
# 準備繪圖畫布
canvas = doc["fourbar"]
container1 = doc['container1']
ctx = canvas.getContext("2d")

fourbar_data = open("./../w10/40423116_W10.csv").read()
fourbar_list = fourbar_data.splitlines()
#container1 &lt;= fourbar_list[0]
# 以下可以利用 ctx 物件進行畫圖
# 先畫一條直線
ctx.beginPath()
# 設定線的寬度為 1 個單位
ctx.lineWidth = 1
# 利用 transform 將 y 座標反轉, 且 offset canvas.height
# (X scale, X skew, Y skew, Y scale, X offset, Y offset)
# 配合圖形位置進行座標轉換
ctx.transform(1, 0, 0, -1, canvas.width/2+250, canvas.height/2+100)
# 畫出 x 與 y 座標線
# 各座標值放大 8 倍
ratio = 8
'''
ctx.moveTo(0, 0)
ctx.lineTo(0, 100)
ctx.moveTo(0, 0)
ctx.lineTo(100, 0)
'''
ctx.moveTo(0, 0)
ctx.lineTo(-30*ratio, 0)
start_point = fourbar_list[0].split(",")
ctx.moveTo(float(start_point[0])*ratio, float(start_point[1])*ratio)
count = 0
for data in fourbar_list[1:]:
    point = data.split(",")
    #count = count + 1
    #container1 &lt;= str(count) + ":" + point[0] + "," + point[1]
    #container1 &lt;= html.BR()
    ctx.lineTo(float(point[0])*ratio, float(point[1])*ratio)
# 設定顏色為藍色, 也可以使用 "rgb(0, 0, 255)" 字串設定顏色值
ctx.strokeStyle = "blue"
# 實際執行畫線
ctx.stroke()
ctx.closePath()
&lt;/script&gt;

&lt;h2&gt;Solvespace&lt;/h2&gt;
&lt;h3&gt;1. Parts (零件繪製)&lt;/h3&gt;
&lt;p&gt;範例檔案: &lt;a href="http://solvespace.com/bracket.pl"&gt;http://solvespace.com/bracket.pl&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An introductory tutorial is available, in which we draw the same part that is shown in the demo video. &lt;/p&gt;
&lt;p&gt;This covers most of the basic features of SolveSpace, including sketches, constraints, extrusions, and Boolean operations.&lt;/p&gt;
&lt;p&gt;When we first run SolveSpace, we will begin with an empty part. Initially, our view of the part will be oriented onto the XY plane; the label for that plane is displayed at the bottom left of the screen (#XY, in dark grey). The axes are also indicated by the three colored arrows at the bottom left; the X, Y, and Z axes are drawn in red, green, and blue respectively.&lt;/p&gt;
&lt;p&gt;When we hover the mouse over any entity, constraint, or other object in the sketch, that object will appear highlighted in yellow. For example, the XY plane, which is drawn as a dashed square, will appear highlighted when we hover the mouse over it. The YZ and ZX planes initially look like dashed lines, because they are being viewed on edge; but they still appear highlighted in yellow when we hold the mouse over them. It is similarly possible to highlight the X, Y, and Z axes (which are drawn as arrows), or the origin (which like all points is drawn as a green square).&lt;/p&gt;
&lt;h3&gt;簡易長出、除料、旋轉長料&lt;/h3&gt;
&lt;iframe src="https://player.vimeo.com/video/199435381" width="800" height="600" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/199435381"&gt;2017 01 14 17 53 31 199&lt;/a&gt; from &lt;a href="https://vimeo.com/user46450524"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Extrude (平行長出或除料)&lt;/h4&gt;
&lt;p&gt;&lt;p&gt;STL 格式&lt;/p&gt;
&lt;p&gt;範例:平行長出&lt;/p&gt;
&lt;img src="./../w11/40423116.png"width="800" /&gt;
&lt;iframe src="./../w11/40423116.html"width="800" height="600"&gt;&lt;/iframe&gt;
&lt;p&gt;STL 格式&lt;/p&gt;
&lt;p&gt;範例:除料&lt;/p&gt;
&lt;img src="./../w11/40423116_2.png"width="800" /&gt;
&lt;iframe src="./../w11/40423116_2.html"width="800" height="600"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h4&gt;Lathe (旋轉繞行長出或除料)&lt;/h4&gt;
&lt;h4&gt;Export Triangle Mesh&lt;/h4&gt;
&lt;p&gt;&lt;img src="./../w11/40423116_3.png"width="800" /&gt;&lt;/p&gt;
&lt;iframe src="./../w11/40423116_3.html" width="800" height="600"&gt;&lt;/iframe&gt;

&lt;h3&gt;練習零件繪製&lt;/h3&gt;
&lt;iframe src="https://player.vimeo.com/video/185673835" width="800" height="600" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/185673835"&gt;練習零件繪製&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Solvespace 組合件繪圖&lt;/h2&gt;
&lt;p&gt;&lt;img src="./../w12/W12.png"width="800" /&gt;&lt;/p&gt;
&lt;h3&gt;Solvespace 組合圖&lt;/h3&gt;
&lt;iframe src="./../w12/40423116_W12.html" width="800" height="600"&gt;&lt;/iframe&gt;

&lt;iframe src="https://player.vimeo.com/video/199436815" width="800" height="600" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/199436815"&gt;組合教學&lt;/a&gt; from &lt;a href="https://vimeo.com/user46450524"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Solvespace 3D列印機 自製 零件&lt;/h3&gt;
&lt;p&gt;&lt;img src="./../w14/40423116_w14_1.png"width="800" /&gt;
&lt;img src="./../w14/40423116_w14_2.png"width="800" /&gt;
&lt;img src="./../w14/40423116_w14_3.png"width="800" /&gt;
&lt;img src="./../w14/40423116_w14_4.png"width="800" /&gt;&lt;/p&gt;
&lt;h3&gt;Solvespace 3D列印機 組合圖&lt;/h3&gt;
&lt;p&gt;&lt;img src="./../w14/40423116_w14.png"width="800" /&gt;&lt;/p&gt;
&lt;iframe src="./../w14/40423116_w14.html" width="800" height="600"&gt;&lt;/iframe&gt;

&lt;iframe src="https://player.vimeo.com/video/196683898" width="800" height="600" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/196683898"&gt;3D列印機&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Onshape 3D列印機組裝&lt;/h2&gt;
&lt;h3&gt;3D印表機組裝p1:底部跟頂部組裝&lt;/h3&gt;
&lt;p&gt;&lt;iframe width="800" height="600" src="https://www.youtube.com/embed/AutytuVWHjM" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h3&gt;3D印表機組裝p2:框架與控制器組裝&lt;/h3&gt;
&lt;p&gt;&lt;iframe width="800" height="600" src="https://www.youtube.com/embed/YH20-IHWWwI" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h3&gt;3D印表機組裝p3:滑軌的組裝&lt;/h3&gt;
&lt;p&gt;&lt;iframe width="800" height="600" src="https://www.youtube.com/embed/U1WD80UzMas" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h3&gt;3D印表機組裝p4:噴頭座與連桿組裝&lt;/h3&gt;
&lt;p&gt;&lt;iframe width="800" height="600" src="https://www.youtube.com/embed/TgjGrrfuu-E" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h2&gt;機械設計工程系-電腦輔助設計實習課程: cadpb_w16&lt;/h2&gt;
&lt;h3&gt;影片&lt;/h3&gt;
&lt;p&gt;&lt;iframe width="800" height="600" src="https://www.youtube.com/embed/DPDlHe8mV70" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>40423116 12/22</title><link href="./40423116-1222.html" rel="alternate"></link><published>2016-12-22T12:00:00+08:00</published><updated>2016-12-22T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2016-12-22:./40423116-1222.html</id><summary type="html">&lt;p&gt;W14 Onshape 3D列印機組裝&lt;/p&gt;


&lt;p&gt;Onshape 3D列印機組裝&lt;/p&gt;

&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/NvfGaW3GUUA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;</summary><category term="作業"></category></entry><entry><title>40423116 12/15</title><link href="./40423116-1215.html" rel="alternate"></link><published>2016-12-15T12:00:00+08:00</published><updated>2016-12-15T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2016-12-15:./40423116-1215.html</id><summary type="html">&lt;p&gt;W14 Solvespace 3D列印機組裝&lt;/p&gt;


&lt;p&gt;Solvespace 零件&lt;/p&gt;

&lt;p&gt;&lt;img src="./../w14/40423116_w14_1.png"width="800" /&gt;
&lt;img src="./../w14/40423116_w14_2.png"width="800" /&gt;
&lt;img src="./../w14/40423116_w14_3.png"width="800" /&gt;
&lt;img src="./../w14/40423116_w14_4.png"width="800" /&gt;&lt;/p&gt;
&lt;h2&gt;Solvespace 組合圖&lt;/h2&gt;
&lt;p&gt;&lt;img src="./../w14/40423116_w14.png"width="800" /&gt;&lt;/p&gt;
&lt;iframe src="./../w14/40423116_w14.html" width="800" height="600"&gt;&lt;/iframe&gt;

&lt;iframe src="https://player.vimeo.com/video/196683898" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/196683898"&gt;3D列印機&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>40423116 12/1</title><link href="./40423116-121.html" rel="alternate"></link><published>2016-12-02T12:00:00+08:00</published><updated>2016-12-02T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2016-12-02:./40423116-121.html</id><summary type="html">&lt;p&gt;W12 Solvespace 組合件繪圖&lt;/p&gt;


&lt;p&gt;Solvespace 組合件繪圖&lt;/p&gt;

&lt;p&gt;&lt;img src="./../w12/W12.png"width="800" /&gt;&lt;/p&gt;
&lt;h2&gt;Solvespace 組合圖&lt;/h2&gt;
&lt;iframe src="./../w12/40423116_W12.html" width="800" height="600"&gt;&lt;/iframe&gt;</summary><category term="作業"></category></entry><entry><title>40423116_11/24</title><link href="./40423116_1124.html" rel="alternate"></link><published>2016-11-24T12:00:00+08:00</published><updated>2016-11-24T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2016-11-24:./40423116_1124.html</id><summary type="html">&lt;p&gt;W11&lt;/p&gt;


&lt;h2&gt;Solvespace&lt;/h2&gt;
&lt;h3&gt;1. Parts (零件繪製)&lt;/h3&gt;
&lt;p&gt;範例檔案: &lt;a href="http://solvespace.com/bracket.pl"&gt;http://solvespace.com/bracket.pl&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An introductory tutorial is available, in which we draw the same part that is shown in the demo video. &lt;/p&gt;
&lt;p&gt;This covers most of the basic features of SolveSpace, including sketches, constraints, extrusions, and Boolean operations.&lt;/p&gt;
&lt;p&gt;When we first run SolveSpace, we will begin with an empty part. Initially, our view of the part will be oriented onto the XY plane; the label for that plane is displayed at the bottom left of the screen (#XY, in dark grey). The axes are also indicated by the three colored arrows at the bottom left; the X, Y, and Z axes are drawn in red, green, and blue respectively.&lt;/p&gt;
&lt;p&gt;When we hover the mouse over any entity, constraint, or other object in the sketch, that object will appear highlighted in yellow. For example, the XY plane, which is drawn as a dashed square, will appear highlighted when we hover the mouse over it. The YZ and ZX planes initially look like dashed lines, because they are being viewed on edge; but they still appear highlighted in yellow when we hold the mouse over them. It is similarly possible to highlight the X, Y, and Z axes (which are drawn as arrows), or the origin (which like all points is drawn as a green square).&lt;/p&gt;
&lt;h4&gt;Extrude (平行長出或除料)&lt;/h4&gt;
&lt;p&gt;&lt;p&gt;STL 格式&lt;/p&gt;
&lt;p&gt;範例:平行長出&lt;/p&gt;
&lt;img src="./../w11/40423116.png"width="800" /&gt;
&lt;iframe src="./../w11/40423116.html"width="800" height="600"&gt;&lt;/iframe&gt;
&lt;p&gt;STL 格式&lt;/p&gt;
&lt;p&gt;範例:除料&lt;/p&gt;
&lt;img src="./../w11/40423116_2.png"width="800" /&gt;
&lt;iframe src="./../w10/40423116_2.html"width="800" height="600"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h4&gt;Lathe (旋轉繞行長出或除料)&lt;/h4&gt;
&lt;h4&gt;Export Triangle Mesh&lt;/h4&gt;
&lt;p&gt;STL 格式&lt;/p&gt;
&lt;p&gt;three.js
&lt;img src="./../w11/40423116_3.png"width="800" /&gt;&lt;/p&gt;
&lt;iframe src="./../w10/40423116_3.html" width="800" height="600"&gt;&lt;/iframe&gt;</summary><category term="作業"></category></entry><entry><title>四連桿機構V2.</title><link href="./si-lian-gan-ji-gou-v2.html" rel="alternate"></link><published>2016-11-17T12:00:00+08:00</published><updated>2016-11-17T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2016-11-17:./si-lian-gan-ji-gou-v2.html</id><summary type="html">&lt;p&gt;W10-4 四連桿機構V2.&lt;/p&gt;


&lt;p&gt;Solvespace 四連桿圖檔:&lt;/p&gt;

&lt;p&gt;&lt;img src="./../w10/40423116-w10-4.png"width="800" /&gt;
&lt;img src="./../w10/40423116-w10-4(2).png"width="800" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="./../w10/40423116.csv"&gt;40423116.csv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="./../w10/40423116-w10-4.slvs"&gt;40423116-w10-4.slvs&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;利用brython繪運動路徑&lt;/h3&gt;
&lt;!-- 導入 brython.js --&gt;

&lt;script type="text/javascript" src="https://cdn.rawgit.com/brython-dev/brython/master/www/src/brython_dist.js"&gt;&lt;/script&gt;

&lt;!-- 啟動 brython() --&gt;

&lt;script&gt;
window.onload=function(){
brython(1);
}
&lt;/script&gt;

&lt;!-- 以下利用 Brython 程式執行繪圖 --&gt;

&lt;canvas id="fourbar" width="600" height="600"&gt;&lt;/canvas&gt;

&lt;div id="container1"&gt;&lt;/div&gt;

&lt;script type="text/python3"&gt;
from browser import document as doc
from browser import html
import math
# 準備繪圖畫布
canvas = doc["fourbar"]
container1 = doc['container1']
ctx = canvas.getContext("2d")

fourbar_data = open("./../w10/40423116_W10.csv").read()
fourbar_list = fourbar_data.splitlines()
#container1 &lt;= fourbar_list[0]
# 以下可以利用 ctx 物件進行畫圖
# 先畫一條直線
ctx.beginPath()
# 設定線的寬度為 1 個單位
ctx.lineWidth = 1
# 利用 transform 將 y 座標反轉, 且 offset canvas.height
# (X scale, X skew, Y skew, Y scale, X offset, Y offset)
# 配合圖形位置進行座標轉換
ctx.transform(1, 0, 0, -1, canvas.width/2+250, canvas.height/2+100)
# 畫出 x 與 y 座標線
# 各座標值放大 8 倍
ratio = 8
'''
ctx.moveTo(0, 0)
ctx.lineTo(0, 100)
ctx.moveTo(0, 0)
ctx.lineTo(100, 0)
'''
ctx.moveTo(0, 0)
ctx.lineTo(-30*ratio, 0)
start_point = fourbar_list[0].split(",")
ctx.moveTo(float(start_point[0])*ratio, float(start_point[1])*ratio)
count = 0
for data in fourbar_list[1:]:
    point = data.split(",")
    #count = count + 1
    #container1 &lt;= str(count) + ":" + point[0] + "," + point[1]
    #container1 &lt;= html.BR()
    ctx.lineTo(float(point[0])*ratio, float(point[1])*ratio)
# 設定顏色為藍色, 也可以使用 "rgb(0, 0, 255)" 字串設定顏色值
ctx.strokeStyle = "blue"
# 實際執行畫線
ctx.stroke()
ctx.closePath()
&lt;/script&gt;</summary><category term="作業"></category></entry><entry><title>四連桿機構</title><link href="./si-lian-gan-ji-gou.html" rel="alternate"></link><published>2016-10-19T12:00:00+08:00</published><updated>2016-10-19T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2016-10-19:./si-lian-gan-ji-gou.html</id><summary type="html">&lt;p&gt;Solvespace 四連桿機構&lt;/p&gt;


&lt;p&gt;&lt;a href="http://imgur.com/czHYoSi"&gt;&lt;img src="http://i.imgur.com/czHYoSi.png" title="source: imgur.com" /&gt;&lt;/a&gt;
&lt;p&gt;Solvespace 四連桿圖檔:&lt;/p&gt;
&lt;p&gt;&lt;a href="./../w7/40423116.csv"&gt;40423116.csv&lt;/a&gt; (請以滑鼠右鍵存檔)&lt;/p&gt;
&lt;p&gt;&lt;a href="./../w7/40423116.slvs"&gt;40423116.slvs&lt;/a&gt; (請以滑鼠右鍵存檔)&lt;/p&gt;&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>Solvespace 零組件繪圖</title><link href="./solvespace-ling-zu-jian-hui-tu.html" rel="alternate"></link><published>2016-10-12T12:00:00+08:00</published><updated>2016-10-12T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2016-10-12:./solvespace-ling-zu-jian-hui-tu.html</id><summary type="html">&lt;p&gt;Solvespace 零組件繪圖&lt;/p&gt;


&lt;p&gt;練習零件繪製&lt;/p&gt;
&lt;iframe src="https://player.vimeo.com/video/185673835" width="800" height="600" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/185673835"&gt;練習零件繪製&lt;/a&gt; from &lt;a href="https://vimeo.com/user47573583"&gt;40423116&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</summary><category term="作業"></category></entry><entry><title>40423116 作業簡報 上課wik</title><link href="./40423116-zuo-ye-jian-bao-shang-ke-wik.html" rel="alternate"></link><published>2016-09-29T12:00:00+08:00</published><updated>2016-09-29T12:00:00+08:00</updated><author><name>40423116</name></author><id>tag:,2016-09-29:./40423116-zuo-ye-jian-bao-shang-ke-wik.html</id><summary type="html">&lt;p&gt;&lt;a href="https://40423116.github.io/2016fallcadp_hw"&gt;個人作業簡報&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://140.130.17.17/public/2016fall/"&gt;作業環境&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ana2016fall_08.7z
mini2016fall.7z&lt;/p&gt;
&lt;h3&gt;在小組倉儲中設定組員為子模組的流程:&lt;/h3&gt;
&lt;p&gt;git clone 2016fallcadp_ag0 倉儲到近端&lt;/p&gt;
&lt;p&gt;執行 git submodule add -b gh-pages https://github.com/name/組員倉儲 name 就可以將 組員 倉儲納入 g0 子目錄中, 且新增 .gitmodules 模組設定檔, 而且在 .git/config 與 .git/modules 目錄中新增子模組相關設定資料.&lt;/p&gt;
&lt;p&gt;git clone 後執行 git submodule init, 啟始子模組, 然後利用 git submodule update 取下子模組的對應版本資料 (對應版本紀錄在 .git/modules/g100/refs/heads/master 檔案中.&lt;/p&gt;
&lt;p&gt;假如帶有子模組的倉儲管理者, 希望更新某一子模組的對應版本, 則必須先確定倉儲分支, 然後 cd 到子模組目錄中, 利用 git pull 後, 然後回到上層倉儲進行版本的提交推送. 假如希望拉回所有子模組的對應版本內容, 則使用 git pull origin gh-pages --recurse-submodules&lt;/p&gt;
&lt;p&gt;假如希望將所有子模組的對應版本更新到目前最新提交, 使用 git submodule foreach "(git checkout gh-pages; git pull)&amp;amp;"&lt;/p&gt;
&lt;p&gt;當利用上述指令完成更新子模組的對應版本之後, 必須進行提交推送, 將改版資料送到遠端, 之後則透過 git submodule update --init --recursive 將此對應版本的子模組取到近端, 其中因為子模組中還有子模組, 而此更新對這些新加入的子子模組並沒有 --init, 因此下子模組更新時, 要納入 --init&lt;/p&gt;
&lt;p&gt;在近端, 取下某一倉儲的所有資料, 包括子模組與子模組下的子子模組等:&lt;/p&gt;
&lt;p&gt;git clone repos-url&lt;/p&gt;
&lt;p&gt;cd repos_dir&lt;/p&gt;
&lt;p&gt;git submodule update --init --recursive&lt;/p&gt;
&lt;p&gt;或者直接&lt;/p&gt;
&lt;p&gt;git clone --recursive repos-url&lt;/p&gt;</summary><category term="作業"></category></entry></feed>