สั่ง Claude สร้างโรงเหล็กทั้งหลังใน SketchUp แล้วคำนวณ FEA ลงสี heatmap
สองตอนก่อนเราเตรียมเครื่องกับเชื่อม MCP ไว้แล้ว ตอนนี้ถึงของจริง — ผมสั่งครั้งเดียวให้ Claude ปั้นโรงเหล็กทั้งหลังใน SketchUp ไล่ทีละชั้น แล้วส่งโครงไปคำนวณกำลังด้วย FEA จบด้วยการทาสีสมาชิกตามแรงที่มันรับจริง
สรุปใน 1 นาที
- อาการ/ปัญหา
- ต้องการโรงเหล็กทั้งหลังใน SketchUp พร้อมผลคำนวณกำลัง โดยไม่ปั้นเอง
- ใครควรอ่าน
- คนอยากสั่ง Claude สร้างโครงเหล็กแล้วตรวจกำลังด้วย FEA
- ทางแก้แบบสั้น
- สั่ง Claude สร้างโรงไล่ทีละชั้นจากเสาปูนถึงกระเบื้อง ส่งโครงคำนวณด้วย PyNite แล้วลงสีสมาชิกเป็น heatmap ตามแรงจริง
ตอนที่ 1 เราเตรียมเครื่อง ลง PyNite (อ่านย้อน) ตอนที่ 2 เชื่อม MCP plugin ให้ Claude สั่ง SketchUp ได้ (อ่านย้อน) ตอนนี้คือของจริง — ผมสั่ง Claude สร้างโรงเหล็กทั้งหลังใน SketchUp แล้วส่งไปคำนวณกำลังด้วย FEA ลงสี heatmap ตามแรงจริง
โจทย์ที่ผมอยากได้คือ โรงเหล็กหลังคาเพิงหมาแหงน (mono-slope) ฐาน 7.5 × 5.3 เมตร ลาดตามแกนยาวราว 10.3 องศา โครงเหล็กกล่อง เสาปูนสำเร็จ หลังคากระเบื้องลอนคู่ ทั้งหมดนี้ผมไม่ได้ลากเส้นเองสักเส้นเดียว สั่งด้วย prompt เดียวแล้วปล่อยให้ Claude ไล่ทำเองจนจบ
ลำดับสมาชิก (load path) ที่วางไว้ตั้งแต่ต้น
ก่อนสั่งงานผมต้องรู้ก่อนว่าน้ำหนักมันไหลลงดินยังไง ไม่งั้นโมเดลที่ออกมาจะสวยแต่ประกอบจริงไม่ได้ ลำดับสมาชิกไล่จากบนลงล่างคือ
แต่ละชั้นวางซ้อนบนชั้นล่าง เหล็กซ้อนเหล็กจริงตามที่ช่างประกอบ และผมบังคับให้อ้างมุมนอก (ผิวนอก) ทุกจุด ไม่ใช่อ้างเส้นกริดที่ศูนย์กลางสมาชิก จุดนี้สำคัญ เพราะถ้าอ้างผิดที bound จะเกินไป 1 ความหนาทุกรอยต่อ พอซ้อนกัน 7 ชั้นมันเพี้ยนสะสม
สั่งงานยังไง (transport)
พอ MCP เชื่อมแล้ว Claude สั่งผ่าน tool eval_ruby คือรัน Ruby ตรงเข้า SketchUp เลย เคล็ดที่ผมใช้คือไม่ส่งสคริปต์ยาวๆ เข้าทาง command line ตรงๆ แต่เก็บแต่ละขั้นเป็นไฟล์ .rb แยก แล้วสั่งให้รันด้วย
eval(File.read('/home/<user>/sketchup/step3_posts.rb'))
ทำแบบนี้เลี่ยงปัญหา escape ภาษาไทยกับเครื่องหมาย quote บน command line ได้หมด แล้วยังได้ค่า return บรรทัดสุดท้ายกลับมาเป็น status ให้ Claude อ่านยืนยันก่อนไปต่อด้วย
หัวใจของ workflow คือ build 1 eval แล้ว render อีก 1 eval แยกกันเสมอ เสร็จแต่ละชั้นให้มันอ่านรูปยืนยันก่อนไปต่อ ผมสั่งครั้งเดียวด้วย prompt เดียว แล้วให้มันไล่ทำเองทีละชั้นจนจบ FEA
ถ้าตั้ง camera, view.write_image หรือ zoom_extents ใน eval เดียวกับที่ build geometry มันจะ deadlock UI thread แล้ว SketchUp ค้างต้องรีสตาร์ท ต้องสร้างเสร็จก่อน แล้วค่อยสั่ง render เป็นอีกรอบหนึ่ง — กฎข้อนี้ผมเสียเวลารีสตาร์ทไปหลายรอบกว่าจะจำ
นี่คือ prompt ที่ผมสั่งจริง ผมเขียนเป็นสเปกเต็มทีเดียวให้มันไล่เอง
load memory ทั้งหมด แล้วใช้ skill thai-building-framing + sketchup-drafting
(ขับ SketchUp ผ่าน MCP server; render แยก eval เสมอกัน hang)
งาน: สร้าง "โรงเหล็กหลังคาเพิงหมาแหงน" ใน SketchUp จากรูปอ้างอิง แล้วปิดท้ายด้วย
การคำนวณโครงสร้างเบื้องต้น (FEA) + ลงสี heatmap ตามแรงบนสมาชิกจริง
รูปอ้างอิง: /home/<user>/sketchup/pic/ref-shed.jpg
=== กติกาการทำงาน (สำคัญ) ===
- ทำต่อเนื่องทุกขั้น "ไม่ต้องหยุดรอ confirm" — ไล่ตั้งแต่ขั้น 1 จนจบ FEA เอง
- แต่ละขั้น: เขียนสคริปต์ .rb แยกต่อชั้น (idempotent: ลบ prefix กลุ่มตัวเองก่อนสร้าง),
ตัวแปรพิมพ์เล็กทั้งหมด, build 1 eval แล้ว render อีก 1 eval (แยกกัน), อ่านรูปยืนยันสั้นๆ
ก่อนไปขั้นถัดไป
- ก่อนขั้น 1 ให้ลบ top-level ทั้งหมด (Group/Component/Text/Dimension) เริ่มจากโมเดลว่าง
- อ้างมุมนอก (finishing) ทุกจุด
=== สเปกรวม ===
ฐาน 7.5 × 5.3 ม. slope ตามแกนยาว 7.5 — ต่ำที่ X=0 (หลัง) สูงที่ X=7500 (หน้า),
ความชัน ~10.3° (เก็บตามนี้ เป็น design choice ไม่ต้องอิง 15°)
ขั้น 1) เสาปูน 6 ต้น 150×150 สูง 2000 ที่ X=0/3750/7500 × Y=0/5300
ขั้น 2) ring beam 6×3 (150×75) กรอบชนมุมบนหัวเสา (หน้า/หลังเต็มเส้นแนว X, ซ้าย/กลาง/ขวาชนระหว่างแนว Y)
ขั้น 3) เสาค้ำตั้ง 6×3 จำนวน 9 ต้น = 3 แนว X × 3 แถว Y(0/2650/5300) สูง 300/975/1650
(ฝั่งต่ำ X=0 = 30 ซม. = คานคู่, กลาง interpolate) นั่งบนหลังคาน
ขั้น 4) คานรับตง 6×3 แนว Y วางบนหัวเสาค้ำทั้ง 3 แนว เต็มลึก 5300
ขั้น 5) ตง 4×2 (100×50) แนว X พาดสัมผัสบนคานรับ (เชื่อมไม่บาก) 5 เส้น
ยื่นหน้า(สูง) 1.0 ม. / หลัง(ต่ำ) 0.3 ม. — เส้นท้องตงผ่านมุมในของคานรับฝั่งสูง (run = ww−bw)
ขั้น 6) แป ตัว C 100×50×20 t2.3 แนว Y เอียงตั้งฉากลาด ~10 ตัว gauge~962 (ซ้อนหัว 238)
ตัวแรกชิดปลายตงหน้า, ยื่นรับชายข้างละ 25 ซม.(½กระเบื้อง), ท้องแปนั่งผิวบนตงจริง rd/2÷cosθ
ขั้น 7) กระเบื้องลอนคู่ (component .skp ในโฟลเดอร์ pic) ลอนลงลาด คลุมพ้นโครง 10–15 ซม.ทุกขอบ scale ลงตัว
=== ปิดงาน: คำนวณโครงสร้างเบื้องต้น + ลงสี ===
ค้นยืนยันค่ามาตรฐานวิศวกรรมไทยจากเว็บก่อน แล้วใช้:
เหล็ก SS400/กล่อง STKR400 fy=245 MPa, E=200,000 (มอก.1227/107) |
ASD Fb=0.6fy=147 MPa (วสท.) | live load หลังคา 30 kg/m² (กฎกระทรวง ฉบับที่ 6 พ.ศ.2527) |
กระเบื้องลอนคู่ dead 15 kg/m² | deflection limit L/240 | เสาปูน fc'=23.5 MPa
- เขียน FEA ด้วย PyNite (env ml313 python), หน่วย N-mm-MPa, แกนตั้ง=Y
- load path: กระเบื้อง→แป→ตง→คานรับตง→เสาค้ำ→ring beam→เสาปูน, ฐานเสา fixed,
combo บริการ 1.0DL+1.0LL, น้ำหนักตัวเอง self-weight
- คำนวณ utilization (σ/0.6fy), deflection vs L/240, buckling, reaction ทุกฐานเสา (kg)
- เขียน member_colors.json (ชื่อกลุ่ม→[r,g,b] เขียว→เหลือง→แดง) แล้วเขียน Ruby อ่านไฟล์
ลงสี heatmap บนสมาชิกจริงใน SketchUp (ตามชื่อกลุ่ม col_/ringX_/ringY_/post_/topbeam_/tong_/pae_),
ซ่อนกระเบื้อง, render แยก eval
- สรุปผล: จุดวิกฤต (stress/deflection/buckling), reaction เสา, คำตัดสิน OK/ไม่
- ระบุขอบเขตชัดเจน: ประเมินเบื้องต้น/เพื่อการศึกษา ต้องให้วิศวกรมีใบอนุญาตรับรอง,
ยังไม่รวมแรงลม/แผ่นดินไหว
จะเห็นว่าผมเขียนสเปกแต่ละชั้นไว้ละเอียดมาก ไม่ได้ปล่อยให้มันเดาขนาดเอง เพราะงานโครงสร้างมันผิดนิดเดียวก็ประกอบไม่ได้ ส่วนที่ปล่อยให้ Claude ตัดสินใจคือ "วิธี" ทำให้แต่ละชั้นซ้อนกันถูกต้อง ไม่ใช่ "ตัวเลข"
ทีละชั้นที่ออกมา
ผมจะไล่ให้ดูว่าแต่ละขั้นมันสร้างอะไร และจุดที่ต้องระวังของแต่ละชั้นคืออะไร ภาพ 3D ของแต่ละชั้นกับคลิปตอน Claude build อยู่ในหน้าคู่มือฉบับเต็ม (ลิงก์ท้ายบทความ) ตรงนี้ผมเล่าเป็นข้อความให้เห็นภาพ
ขั้น 1 — เสาปูนสำเร็จ 6 ต้น
เสา 150×150 สูง 2000 มม. วางที่ X = 0 / 3750 / 7500 ตัดกับ Y = 0 / 5300 รวม 6 ต้น เริ่มจากโมเดลว่างก่อนเสมอ ลบ top-level ทุกตัวทิ้ง เสามุมกับเสาริมอ้างผิวนอก เสากลาง X=3750 อยู่กึ่งกลางพอดี นี่คือฐานของทุกอย่าง วางผิดที่นี่ผิดทั้งหลัง
ขั้น 2 — ring beam 6×3 บนหัวเสา
คานกรอบรอบ (150×75) นั่งบนหัวเสาแบบ GAP0 คือชนสนิทไม่มีช่อง คานแนว X (หน้า/หลัง) ยาวเต็มเส้น ส่วนคานแนว Y บากเข้าชนระหว่างคานหน้ากับคานหลัง รอยต่อชนกันที่มุมนอกทุกจุด ได้กรอบแข็งวางอยู่บนหัวเสาปูน
ขั้น 3 — เสาค้ำตั้ง 9 ต้น (กริด 3×3)
นี่คือชั้นที่สร้างความลาด เสาค้ำเหล็กกล่อง 6×3 จำนวน 9 ต้น เป็น 3 แนว X × 3 แถว Y (0 / 2650 / 5300) ความสูงไล่ระดับตามลาด ฝั่งต่ำ X=0 สูง 30 ซม. (ทำเป็นคานคู่) แถวกลาง interpolate ฝั่งสูง X=7500 สูง 165 ซม. นั่งบนหลังคาน ring beam ความต่างของความสูงสองฝั่งนี่แหละที่ทำให้เกิดมุมลาด ~10.3°
ขั้น 4 — คานรับตง 6×3 แนว Y
คานวางบนหัวเสาค้ำทั้ง 3 แนว เต็มความลึก 5300 ตั้งฉากกับตงที่จะมาวางทับด้านบน เป็นตัวกระจายน้ำหนักจากตงลงเสาค้ำ
ขั้น 5 — ตง 4×2 แนว X (จุดที่ยากที่สุด)
ตง 100×50 พาดแนว X 5 เส้น ยื่นหน้า (ฝั่งสูง) 1000 มม. ยื่นหลัง (ฝั่งต่ำ) 300 มม. จุดนี้คือหัวใจ เพราะมันเป็นงานเหล็กเชื่อม ไม่ใช่งานไม้ที่บากเข้าหากันได้
เส้นท้องตงต้องผ่าน "มุมบน-downhill" ของคานรับทุกตัว ฝั่งต่ำแตะขอบนอก ฝั่งสูงแตะขอบใน ตงพาดสัมผัสบนผิวคานแล้วเชื่อมติด ไม่มีการบากเข้าเนื้อ เพราะเหล็กกล่องบากแล้วเสียกำลัง — ต่างจากตงไม้ที่เข้าปากไม้ได้ จุดนี้ถ้าให้ AI เดาเองมันมักทำเป็นแบบงานไม้
ขั้น 6 — แป เหล็กตัว C
แป C 100×50×20 t2.3 แนว Y เอียงตั้งฉากกับลาด ราว 10 ตัว ระยะ gauge ~962 มม. (ซ้อนหัว 238) จุดที่ผมเน้นคือต้องเป็น C-channel จริง มี web บวก flange 2 ตัว บวก lip 2 ตัว ไม่ใช่กล่องตันที่วาดง่ายๆ ท้องแปต้องนั่งบนผิวบนของตงจริง ตัวแรกชิดปลายตงหน้า ยื่นรับชายข้างละ 25 ซม. (ครึ่งแผ่นกระเบื้อง)
ขั้น 7 — กระเบื้องลอนคู่
โหลด component กระเบื้องจริง (.skp) มาวาง ลอนลงลาดตามทิศน้ำไหล scale ให้จำนวนแผ่นลงตัวพอดี คลุมพ้นโครงราว 13 ซม. ทุกขอบ พอชั้นนี้เสร็จโรงเหล็กก็ครบทั้งหลัง
คำนวณโครงสร้างเบื้องต้น (FEA) + ลงสี heatmap
พอได้ geometry ครบทุกชั้น ผมส่งโครงไปคำนวณใน PyNite หน่วย N-mm-MPa แกนตั้งเป็น Y แล้วส่งค่าสีกลับมาทาบนสมาชิกจริงตามแรงที่มันรับ นี่คือ prompt ปิดงาน
คำนวณโครงสร้างเบื้องต้นด้วย PyNite (env ml313): มาตรฐานไทย เหล็ก SS400/STKR400 fy=245,
ASD Fb=0.6fy=147, live load หลังคา 30 กก./ตร.ม. (กฎกระทรวง ฉบับ 6/2527),
กระเบื้อง dead 15 กก./ตร.ม., deflection L/240, ฐานเสา fixed, combo 1.0DL+1.0LL + self-weight
— หา utilization/deflection/buckling/reaction ทุกฐานเสา แล้วเขียน member_colors.json
ให้ Ruby อ่านมาลงสี heatmap (เขียว→เหลือง→แดง), ซ่อนกระเบื้อง, render แยก eval
วิธีคิดคือ Claude แปลง geometry ในโมเดลเป็นโครงข่าย node/member ของ PyNite ใส่ load ตาม load path ที่วางไว้ (กระเบื้องลงแป ลงตง ลงคานรับ ลงเสาค้ำ ลง ring beam ลงเสาปูน) ฐานเสา fixed แล้วรัน combo บริการ 1.0DL + 1.0LL บวกน้ำหนักตัวเอง จากนั้นมันเขียน member_colors.json แมพชื่อกลุ่มเป็นสี RGB ไล่เขียว–เหลือง–แดงตาม utilization แล้วเขียน Ruby อ่านไฟล์นั้นกลับมาทาสีสมาชิกใน SketchUp ตามชื่อกลุ่ม (col_ / ringX_ / ringY_ / post_ / topbeam_ / tong_ / pae_)
ผลที่ได้ (combo บริการ 1.0DL + 1.0LL + น้ำหนักตัวเอง)
- utilization สูงสุด 0.36 (เกิดที่เสาค้ำกลางกับตง) ยังเหลือกำลังอีกเยอะ
- โก่งตัวสูงสุด 5.66 มม. น้อยกว่าลิมิต L/240 = 15.9 มม.
- reaction เสากลางสูงสุด 811 กก. รวมลงดินทั้งหมดราว 3,884 กก.
- ทุกสมาชิกผ่าน ไม่มี overstress หรือ buckling
heatmap ที่ทากลับมาส่วนใหญ่เป็นสีเขียว มีเหลืองบ้างที่เสาค้ำกลางกับตงที่รับโมเมนต์มากสุด ไม่มีสีแดงเลย แปลว่าโครงนี้ออกแบบมาเผื่อไว้เยอะ ถ้าจะประหยัดเหล็กยังลดหน้าตัดได้อีก (แต่ผมไม่แตะ เพราะยังไม่รวมแรงลม)
มาตรฐานที่ใช้
เหล็ก SS400 / กล่อง STKR400 fy = 245 MPa, E = 200,000 MPa (มอก.1227 / 107) ออกแบบวิธี ASD โดย Fb = 0.60fy = 147 MPa (วสท.) น้ำหนักจรหลังคา 30 กก./ตร.ม. (กฎกระทรวง ฉบับที่ 6 พ.ศ.2527) กระเบื้อง dead load 15 กก./ตร.ม. ลิมิตโก่งตัว L/240 เสาปูน fc' = 23.5 MPa ผมให้ Claude ค้นยืนยันค่าเหล่านี้จากเว็บก่อนใช้ ไม่ปล่อยให้มันจำเอาเอง
กฎเหล็กที่ผมสรุปไว้ (กันบั๊กเสียเวลาซ้ำๆ)
หกข้อนี้คือบทเรียนที่ผมเก็บมาจากการลองผิดลองถูก ใครจะขับ SketchUp ผ่าน MCP แบบนี้ ผมแนะนำให้ใส่ไว้ใน memory ตั้งแต่แรก
ถูกต้อง
- render แยก eval ออกจาก build เสมอ
- แปลงหน่วยเป็นนิ้วเองด้วย mm = 1.0/25.4
- ตัวแปรพิมพ์เล็กทั้งหมด
- อ้างมุมนอก (ผิวนอก)
- แต่ละสมาชิกแยก sub-group
- ทุกสคริปต์ idempotent
ผิดพลาด
- ตั้ง camera/write_image ใน eval เดียวกับ build → deadlock ค้าง
- เชื่อหน่วยแสดงผล → ขนาดเพี้ยน
- ชื่อพิมพ์ใหญ่ → กลายเป็น constant ค้าง spam warning
- อ้างเส้นกริด center → bound เกิน 1 ความหนา
- solid ใน entities เดียวกัน → merge face พังกัน
- ไม่ลบกลุ่มเก่า → รันซ้ำแล้วซ้อน
ขยายความแต่ละข้อ
-
render แยก eval เสมอ — ตั้ง camera / view.write_image / zoom_extents ใน eval เดียวกับ build จะ deadlock UI thread แล้ว SketchUp ค้าง ต้องรีสตาร์ท
-
หน่วยภายใน SketchUp เป็นนิ้วเสมอ — เลขดิบที่ส่งเข้า API เป็นนิ้ว ไม่ขึ้นกับหน่วยแสดงผลที่ตั้งไว้ ผมแปลงเองด้วย
mm = 1.0/25.4 -
ตัวแปรพิมพ์เล็ก — SketchUp ใช้ Ruby interpreter เดียวข้าม eval ชื่อพิมพ์ใหญ่กลายเป็น constant ค้างแล้ว spam warning ทุกครั้งที่รันซ้ำ
-
อ้างมุมนอก (ผิวนอก) ไม่ใช่ center เส้นกริด — ไม่งั้น bound เกินไป 1 ความหนาทุกรอยต่อ
-
แต่ละสมาชิกแยก sub-group — solid ใน entities เดียวกันมัน merge face พังกัน แยกกลุ่มแล้วซ้อนทับได้อิสระ
-
idempotent ทุกสคริปต์ — ลบ prefix กลุ่มตัวเองก่อนสร้าง รันซ้ำได้ไม่ซ้อน
ขอบเขตของงานนี้ (อ่านก่อนเอาไปใช้)
ผลทั้งหมดเป็นการประเมินเบื้องต้น โครงสร้างที่รับน้ำหนักจริงต้องให้วิศวกรมีใบอนุญาตตรวจสอบรับรอง การวิเคราะห์นี้ยังไม่รวมแรงลม (มยผ.1311) และแผ่นดินไหว (มยผ.1302) ซึ่งมักเป็นตัวคุมการออกแบบของหลังคาเบาชายคายื่นยาวแบบนี้ รวมทั้งรอยต่อ รอยเชื่อม และฐานราก ยังไม่ได้ออกแบบเชิงรายละเอียด
พูดตรงๆ ว่าตัวเลข utilization 0.36 ที่ดูสบายๆ นั้นมาจากแค่ DL + LL เท่านั้น พอใส่แรงลมเข้าไปกับชายคายื่นยาว 1 เมตรฝั่งสูง เรื่องจะเปลี่ยน งานนี้คุณค่ามันอยู่ที่ workflow — ปั้นโมเดลจาก prompt เดียว แล้ววนกลับมาคำนวณทาสีให้เห็นแรงจริง ไม่ใช่เอาตัวเลขไปสร้างจริงตรงๆ
โค้ดเต็มกับตอนอื่นในซีรีส์
โค้ดเต็มทั้ง 7 สคริปต์ บวกตัว FEA (PyNite) บวกสคริปต์ลงสี heatmap ผมแยกไว้ในหน้าคู่มือฉบับเต็ม มีรูป full HD กดขยายดูชัดๆ ได้ กับคลิปเต็มตอน Claude build แต่ละชั้น
อ่านย้อนได้ทั้งซีรีส์
- ตอนที่ 1 — เตรียมเครื่อง ลง PyNite
- ตอนที่ 2 — เชื่อม MCP plugin ให้ Claude สั่ง SketchUp
- ตอนที่ 3 — สร้างโรงเหล็ก + FEA + heatmap (ตอนนี้)
ส่วน "การปูกระเบื้องตามมาตรฐาน" ผมยังทำไม่เสร็จ เดี๋ยวเสร็จแล้วจะมาต่อให้ ใครจะลองทำตาม จับ workflow build-แยก-render กับกฎเหล็ก 6 ข้อไปก่อน หน้าตาโรงจะเป็นแบบไหนตามสะดวก หลักการเหมือนกันหมด
เคยเจองานแบบนี้ไหม? ติดตรงไหน?
มาแลกวิธีกันต่อในบอร์ด LinuxThai



ความคิดเห็น 0
ยังไม่มีความคิดเห็น — เป็นคนแรกเลย