บทที่ 15 Optimization
พลังที่แท้จริงของ API: Optimization
การใช้ API เพียงแค่อ่าน/เขียนข้อมูลอาจยังไม่คุ้มค่าเหนื่อย ความคุ้มค่าสูงสุดเกิดเมื่อเราให้คอมพิวเตอร์ “คิด” และ “ตัดสินใจ” แทนเรา
ในบทนี้ เราจะเขียน script เพื่อหาขนาดเสาที่เหมาะสมที่สุด (Optimal Size) โดยอัตโนมัติ โดยเริ่มจากขนาดเล็กที่สุด แล้วขยายขนาดขึ้นเรื่อยๆ จนกว่าจะผ่านการตรวจสอบ (Design Check)
Logic การทำงาน
- Section Palette: เตรียมรายชื่อหน้าตัดเสาจากเล็กไปใหญ่ (C30x30, C40x40, C50x50…)
- Assign: เริ่มต้นใส่หน้าตัดเล็กที่สุดให้เสาต้นเป้าหมาย
- Loop:
- รัน Analysis & Design
- อ่านค่า usage ratio (P-M interaction)
- ถ้า
ratio > 1.0(Fail) → เปลี่ยนเป็นหน้าตัดถัดไป (Upgrade) แล้ววนลูปใหม่ - ถ้า
ratio <= 1.0(Pass) → หยุด (Found Optimal)
Code Example: Auto-Sizing Column
import comtypes.clientimport time
# 1. Prepare Candidate Sections (Must be defined in model)candidates = ["C30x30", "C40x40", "C50x50", "C60x60", "C80x80"]target_col = "C1" # ชื่อเสาที่ต้องการ optimize
def optimize_column(): # ... connection setup ... etabs = comtypes.client.GetActiveObject("CSI.ETABS.API.ETABSObject") sap_model = etabs.SapModel
print(f"🚀 Starting optimization for {target_col}...")
for section in candidates: print(f"\n👉 Trying section: {section}")
# 1. Unlock Model (to edit) sap_model.SetModelIsLocked(False)
# 2. Assign Section # SetSection(Name, PropName, ItemType) # ItemType: 0=Object, 1=Group, 2=Selected ret = sap_model.FrameObj.SetSection(target_col, section, 0) check(ret, "SetSection")
# 3. Run Analysis print(" Running Analysis...") sam_model.Analyze.RunAnalysis()
# 4. Run Design (Steel/Concrete) print(" Running Design...") sap_model.DesignConcrete.StartDesign()
# 5. Get Ratio # (Using Summary Results - see Chapter 13) ret, n, names, _, _, p_mm_types, _, _, _, _, _, _, _ = \ sap_model.DesignConcrete.GetSummaryResults()
# Find ratio for target_col (Mockup logic) # ใน API ของ Concrete อาจต้องดู failed status หรือ rebar percentage # สำหรับ Steel Design จะดู Ratio ได้ตรงๆ
# สมมติเราอ่านค่า interaction ratio ได้ (สมมติเป็น fail/pass status) # Note: Concrete design เน้น Rebar Area, ถ้า Fail จะมี error string
# ลองใช้ Logic ของ Steel Design เพื่อความเห็นภาพชัดเจนกว่า # ret, n, names, ratios, ... = sap_model.DesignSteel.GetSummaryResults() # my_ratio = ratios[names.index(target_col)]
# Simulation: สมมติค่า ratio ลดลงเรื่อยๆ ตามขนาด simulated_ratios = {"C30x30": 1.5, "C40x40": 1.2, "C50x50": 0.85, "C60x60": 0.6} my_ratio = simulated_ratios.get(section, 9.9)
print(f" 📊 Result Ratio: {my_ratio:.3f}")
if my_ratio <= 1.0: print(f"✅ FOUND OPTIMAL SECTION: {section}") break else: print(f"❌ Failed (Ratio > 1.0). Upgrading...")
print("\n🎉 Optimization Complete.")
# run: optimize_column()ข้อควรระวังในการทำ Optimization
- Convergence: ต้องมั่นใจว่า Loop จะจบ (มีขนาดใหญ่ที่สุดที่รับได้แน่นอน) ไม่งั้นจะวนไม่รู้จบ
- Stiffness Change: การเปลี่ยนขนาดเสาเปลี่ยน Stiffness → แรงใน member อื่นเปลี่ยนด้วย (Load Re-distribution)
- Speed: การรัน Analysis ใหม่ทุกรอบกินเวลามาก
- เทคนิค: ใช้ “Auto Select List” ใน ETABS เองจะเร็วกว่า (API แค่สั่ง Start Design)
- แต่ถ้า Logic ซับซ้อน (เช่น เช็ค Cost, เช็ค Formwork) เขียนเองยืดหยุ่นกว่า
Challenge for You 🏆
ลองเขียน script ที่:
- Optimize เสาทุกต้นพร้อมกัน
- โดยจัดกลุ่ม (Group) เสาให้เหมือนกัน (เช่น เสาชั้น 1-3 ต้องเบอร์เดียวกัน)
- คำนวณปริมาตรคอนกรีตที่ประหยัดได้เทียบกับแบบเดิม