3D 打印筆:模型黏合

3D 打 印 的 其 中 一 個 最 經 常 要 做 的 後 期 處 理 ,就 是 要 黏 合 模 型 。因 為 受 限 於 3D 打 印 機 的 大 小 ,又 或 者 3D 模 型 本 身 的 設 計 ( 例 如 唔 想 要 support ),又 或 者 有 多 個 顏 色 的 模 型 ,很 多 3D 打 印 的 模 型 都 是 分 開 許 多 零 件 來 打 印 的 。

要 將 不 同 的 零 件 組 合 成 一 個 大 模 型 ,亦 有 很 多 不 同 的 方 法 ,例 如 製 作 一 些 榫 口 位 做 friction fit,又 或 者 預 留 螺 絲 孔 ,又 或 者 最 簡 單 的 用 膠 水 黐 。除 了 組 合 模 型 ,修 理 損 壞 的 模 型 也 常 常 會 用 到 膠 水 。

常 用 的 膠 水 有 超 能 膠 、AB 膠 、模 型 膠 水 、ABS 膠 水 、熱 熔 膠 等 等 。但 是 不 同 的 膠 水 對 不 同 的 材 料 ( PLA、ABS、PETG、TPU… ) 又 有 不 同 的 效 果 ,難 道 我 們 要 每 隻 膠 水 都 準 備 一 枝 ??咁 麻 煩 ??

咁 當 然 係 唔 需 要 ,因 為 世 界 上 還 有 :3D 打 印 筆 。3D 打 印 筆 的 原 理 其 實 和 3D 打 印 機 一 模 一 樣 ,分 別 就 只 是 你 將 打 印 頭 拿 在 手 中 ,你 喜 歡 怎 麼 畫 就 怎 麼 畫 ,就 算 凌 空 畫 都 得 。

用 3D 打 印 筆 來 黏 合 模 型 ,其 實 更 像 是 焊 接 ( welding )。驟 眼 看 這 種 接 合 方 法 的 強 度 未 必 很 好 ,但 事 實 上 ,你 的 3D 打 印 機 一 層 一 層 地 打 印 立 體 模 型 ,也 只 是 把 熔 化 了 的 耗 材 擠 出 到 下 面 一 層 已 經 凝 固 變 硬 的 耗 材 上 。所 以 ,用 3D 打 印 筆 來 焊 接 ,其 強 度 絕 對 要 比 用 膠 水 要 好 。大 家 可 以 參 考 下 面 的 youtube 連 結 。

3D Printing Nerd – Testing 3D Print Bonding Methods with Punished Props (Glue/Epoxy/Welding)

3D 打 印 筆 其 實 都 已 經 有 好 多 年 的 歷 史 。同 3D 打 印 機 一 樣 ,都 是 外 國 有 先 ,然 後 流 傳 到 中 國 ,再 發 揚 光 大 ( 咳 咳 咳 ,抄 考 再 加 極 力 壓 低 售 價 ,但 至 少 是 用 家 得 益 )。發 展 了 好 幾 年 ,3D 打 印 筆 也 有 很 多 不 同 種 類 、不 同 檔 次 的 產 品 。

首 先 是 最 舊 款 的 ,也 是 最 便 宜 的 打 印 筆 。這 種 3D 打 印 筆 基 本 上 就 是 價 廉 物 美 ,有 齊 3D 打 印 筆 的 各 樣 基 本 功 能 。例 如 按 鍵 出 料 ,按 鍵 退 料 ,可 調 節 溫 度 ,可 調 較 出 料 的 快 慢 。

上 面 這 款 「低 智 能 塗 鴉 筆 」,領 券 之 後 更 只 要 39 人 仔 ,絕 對 可 以 買 定 一 枝 看 門 口 。它 使 用 的 就 是 3D 打 印 機 最 常 用 的 1.75mm 耗 材 ,絕 對 不 需 要 考 慮 同 店 的 耗 材 套 餐 。你 只 需 使 用 和 你 要 黏 合 的 模 型 同 一 卷 耗 材 就 可 以 ,唔 單 止 耗 材 種 類 一 樣 ,連 顏 色 都 會 一 模 一 樣 。

這 款 打 印 筆 預 設 了 PLA 和 ABS 兩 種 溫 度 ,但 你 也 可 以 自 行 調 節 筆 咀 的 溫 度 。這 個 比 較 舊 款 的 3D 打 印 筆 使 用 12V 的 火 牛 ,個 人 覺 得 會 比 使 用 USB 供 電 ( 5V ) 的 款 式 加 熱 得 更 快 。( 很 明 顯 我 有 的 就 是 這 一 款 ,呵 呵 )

而 比 較 新 款 的 3D 打 印 筆 ,主 要 的 「升 級 」功 能 包 括 內 置 鋰 電 池 和 可 打 印 「低 溫 PCL」耗 材 。PCL 的 打 印 溫 度 只 要 55°C,比 起 PLA / ABS 的 200°C 或 以 上 的 打 印 溫 度 要 安 全 得 多 。不 過 ,其 實 50°C 已 經 可 以 造 成 灼 傷 ,所 以 大 家 使 用 時 一 樣 要 小 心 注 意 安 全 。

至 於 內 置 鋰 電 池 ,可 以 無 線 操 作 ,也 不 失 為 一 個 非 常 好 用 的 功 能 。但 可 能 正 正 是 因 為 使 用 了 內 置 電 池 ,某 些 新 款 的 3D 打 印 筆 已 經 不 再 支 援 打 印 溫 度 超 高 的 ABS 耗 材 ( 250°C )。所 以 如 果 想 要 黏 合 ABS / PETG 的 就 要 睇 清 楚 兼 容 的 打 印 溫 度 了 。

也 有 一 些 3D 打 印 筆 ,單 純 地 只 能 打 印 PCL 耗 材 ,通 常 叫 「低 溫 3D 打 印 筆 」。這 一 種 大 家 就 不 要 買 了 ,因 為 它 完 全 不 能 打 印 PLA / ABS 等 耗 材 。

Posted in GRBL + 3D 打印 | Tagged , , | Leave a comment

Google Maps API v3 實用技巧 (四) References to Objects

其 實 嚴 格 黎 講 ,本 文 的 內 容 應 該 係 一 篇 Javascript 的 基 礎 ,而 唔 係 好 關 Google Maps API 的 事 。

Okay,廢 話 少 說 。我 們 簡 單 的 回 顧 一 下 ,什 麼 是 Javascript Objects 呢 ?無 限 簡 化 到 有 點 偏 頗 地 講 ,Objects 就 好 似 Variables,但 Object 儲 存 既 唔 係 單 單 一 個 value,而 係 可 以 儲 存 好 多 好 多 個 values ( 叫 properties )。除 了 values 之 外 ,objects 仲 可 以 儲 存 好 多 好 多 條 funtions ( 叫 methods )。

Javascript Objects 同 Google Map API 有 咩 關 係 呢 ?Well,簡 單 的 來 說 ,Google Map API 裡 面 所 有 的 東 西 都 是 Javascript Objects。不 管 是 那 map 本 身 ,還 是 maker、polyline、inforwindow 等 等 等 等 ,通 通 都 是 Javascript Objects。

要 使 用 Javascript Objects 很 簡 單 ,一 般 我 們 會 使 用 object 本 身 的 constructor。

1
2
3
4
5
6
7
8
...
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
...
var marker = new google.maps.Marker({
   position: new google.maps.LatLng(22.40,114.34),
   map: map,
});
...

在 每 次 create new object 的 時 間 ,我 們 都 會 給 它 一 個 名 字 。例 如 在 上 例 中 ,google map 就 叫 做 map,google map marker 就 叫 maker。那 一 個 名 字 ,更 正 確 的 講 法 應 該 係 那 個 剛 剛 create 出 來 的 object 的 reference。這 個 reference 的 用 處 是 ,我 們 以 後 想 再 對 之 前 create 出 來 的 object 有 所 動 作 ,就 可 以 利 用 它 。

以 上 都 是 老 生 常 談 吧 ?哈 哈 哈 ,大 家 就 當 是 溫 故 知 新 好 了 。

讀 者 Tommy 想 要 在 第 二 個 infowindow 開 啟 的 時 候 ,自 動 關 關 第 一 個 已 經 打 開 了 的 infowindow,說 「試 了 很 多 網 路 上 的 方 法 都 失 敗 了 」。我 想 Tommy 遇 到 的 問 題 ,不 是 他 不 會 使 用 infowindow.close() 方 法 ,而 是 他 不 知 道 第 一 個 已 經 打 開 了 的 infowindow 的 reference。

Object 的 reference,其 實 就 和 variable 一 樣 ,都 有 scope 的 ( global vs local )。如 果 你 希 望 所 有 function 都 能 夠 使 用 這 個 reference,就 記 得 要 把 它 設 置 成 global scope。不 過 同 一 張 google map 可 能 會 有 很 多 很 多 很 多 很 多 很 多 很 多 objects 的 ( 例 如 我 寫 的 行 山 地 圖 ,一 條 行 山 路 線 的 polyline 閒 閒 地 會 有 幾 千 個 點 ),所 以 寫 程 式 之 前 要 考 慮 清 楚 ,真 的 不 是 所 有 object 都 有 需 要 設 置 成 global 的 。

1
2
3
4
...
var marker1 = new google.maps.Marker({...});
var marker2 = new google.maps.Marker({...});
...

當 一 張 地 圖 有 很 多 objects 的 時 候 ,如 何 命 名 和 管 理 也 會 成 為 一 個 難 題 。如 果 你 還 記 得 《Google Maps API v3 實 用 技 巧 (二 ) Markers》的 內 容 ,我 是 用 Array 來 儲 存 同 類 的 objects 的 。

1
2
3
4
5
6
7
8
...
var Markers = [];
...
function addMarker(map, location, title, content) {
   var marker = new google.maps.Marker({...});
   Markers.push(marker);
}
...

大 家 要 留 意 的 是 ,這 些 maker 的 reference,唔 係 理 所 當 然 會 永 遠 存 在 的 ,而 係 要 靠 你 自 己 用 程 式 碼 去 記 錄 低 ,留 待 以 後 用 的 。

1
2
3
4
5
6
7
8
...
// var Markers = [];
...
function addMarker(map, location, title, content) {
   var marker = new google.maps.Marker({...});
   // Markers.push(marker);
}
...

如 果 換 成 上 面 的 這 一 種 寫 法 ,Google map 上 面 看 起 來 是 不 會 有 分 別 的 ,maker 依 然 會 正 確 地 新 增 到 google map。但 那 個 maker 的 reference 在 function 完 結 時 就 永 遠 消 失 了 ,你 以 後 也 不 能 再 對 那 些 maker 做 些 什 麼 了 ( 因 為 上 例 的 maker 只 是 lacal 的 )。

明 白 了 這 個 道 理 ,我 們 再 回 去 看 看 我 在 《Google Maps API v3 實 用 技 巧 (二 ) Markers》的 例 子 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
var Markers = [];
...
function addMarker(map, location, title, content) {
   var marker = new google.maps.Marker({...});
   ...
   var infowindow = new google.maps.InfoWindow({...});
   ...
   google.maps.event.addListener(marker, 'click', function() {
      infowindow.open(map, marker);
   });
   Markers.push(marker);
}
...

很 明 顯 的 ,上 例 之 中 ,我 完 全 沒 有 把 infowindow 的 reference 儲 存 下 來 ,所 以 你 當 然 就 唔 可 能 之 後 再 去 對 它 們 做 些 什 麼 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
var Markers = [];
var Infowindows = [];
...
function addMarker(map, location, title, content) {
   var marker = new google.maps.Marker({...});
   ...
   var infowindow = new google.maps.InfoWindow({...});
   ...
   google.maps.event.addListener(marker, 'click', function() {
      infowindow.open(map, marker);
   });
   Markers.push(marker);
   Infowindows.push(infowindow);
}
...

其 中 一 種 做 法 ,就 是 增 加 一 個 新 的 global array,Infowindows。然 後 把 所 有 infowindows 的 references 都 儲 存 在 裡 面 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
var Markers = [];
...
function addMarker(map, location, title, content) {
   var marker = new google.maps.Marker({...});
   ...
   marker.infowindow = new google.maps.InfoWindow({...});
   ...
   google.maps.event.addListener(marker, 'click', function() {
      marker.infowindow.open(map, marker);
   });
   Markers.push(marker);
}
...

另 一 種 我 自 己 比 較 prefer,簡 潔 一 點 的 做 法 ,就 是 把 infowindow 的 reference 都 儲 存 在 maker 裡 面 。這 種 寫 法 就 像 是 給 maker object 增 加 了 一 個 property。

1
2
3
...
Markers[0].infowindow.close();
...

以 後 要 refer 返 佢 ,就 可 以 直 接 用 Markers[i].infowindow。

至 於 Tommy 原 本 問 的 問 題 ,如 何 自 動 關 閉 第 一 個 infowindow,最 簡 單 的 可 以 這 樣 做 :

1
2
3
4
5
6
7
8
9
...
var Markers = [];
...
function closeAllInfowindows() {
   for (var i = 0; i < Markers.length; i++) {
      Markers[i].infowindow.close();
   }
}
...

先 寫 一 條 關 閉 所 有 infowindows 的 function,closeAllInfowindows()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
var Markers = [];
...
function addMarker(map, location, title, content) {
   var marker = new google.maps.Marker({...});
   ...
   marker.infowindow = new google.maps.InfoWindow({...});
   ...
   google.maps.event.addListener(marker, 'click', function() {
      closeAllInfowindows();
      marker.infowindow.open(map, marker);
   });
   Markers.push(marker);
}
...

然 後 再 把 closeAllInfowindows() 加 入 maker 的 click event 裡 面 ( 就 是 先 close all 然 後 再 打 開 要 打 開 的 那 一 個 )。

當 然 ,如 果 你 唔 喜 歡 使 用 這 種 毫 無 美 感 ,非 常 brute force 的 寫 法 ( 別 擔 心 ,我 也 不 喜 歡 ),你 就 要 自 己 再 加 個 flag 去 儲 存 每 一 個 infowindow 的 打 開 狀 態 了 ( infowindow 本 身 的 properties 是 沒 有 這 個 的 )。

有 了 infowindow 的 reference,咁 當 然 唔 止 可 以 用 來 關 閉 infowindow 啦 。infowindow 的 methods 還 有 setContent、SetOptions、SetPosition 等 等 ,可 以 用 來 改 變 infowindow 的 內 容 、外 觀 、位 置 等 等 。

Posted in Computer & Network | Tagged , , , | Leave a comment