ข้ามไปยังเนื้อหา

บทที่ 15 Optimization

พลังที่แท้จริงของ API: Optimization

การใช้ API เพียงแค่อ่าน/เขียนข้อมูลอาจยังไม่คุ้มค่าเหนื่อย ความคุ้มค่าสูงสุดเกิดเมื่อเราให้คอมพิวเตอร์ “คิด” และ “ตัดสินใจ” แทนเรา

ในบทนี้ เราจะเขียน script เพื่อหาขนาดเสาที่เหมาะสมที่สุด (Optimal Size) โดยอัตโนมัติ โดยเริ่มจากขนาดเล็กที่สุด แล้วขยายขนาดขึ้นเรื่อยๆ จนกว่าจะผ่านการตรวจสอบ (Design Check)

Logic การทำงาน

  1. Section Palette: เตรียมรายชื่อหน้าตัดเสาจากเล็กไปใหญ่ (C30x30, C40x40, C50x50…)
  2. Assign: เริ่มต้นใส่หน้าตัดเล็กที่สุดให้เสาต้นเป้าหมาย
  3. 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.client
import 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

  1. Convergence: ต้องมั่นใจว่า Loop จะจบ (มีขนาดใหญ่ที่สุดที่รับได้แน่นอน) ไม่งั้นจะวนไม่รู้จบ
  2. Stiffness Change: การเปลี่ยนขนาดเสาเปลี่ยน Stiffness → แรงใน member อื่นเปลี่ยนด้วย (Load Re-distribution)
  3. Speed: การรัน Analysis ใหม่ทุกรอบกินเวลามาก
    • เทคนิค: ใช้ “Auto Select List” ใน ETABS เองจะเร็วกว่า (API แค่สั่ง Start Design)
    • แต่ถ้า Logic ซับซ้อน (เช่น เช็ค Cost, เช็ค Formwork) เขียนเองยืดหยุ่นกว่า

Challenge for You 🏆

ลองเขียน script ที่:

  1. Optimize เสาทุกต้นพร้อมกัน
  2. โดยจัดกลุ่ม (Group) เสาให้เหมือนกัน (เช่น เสาชั้น 1-3 ต้องเบอร์เดียวกัน)
  3. คำนวณปริมาตรคอนกรีตที่ประหยัดได้เทียบกับแบบเดิม