Tag: new

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 5 โปรแกรมคำนวณ Resection ด้วยอัลกอริทึ่มสมัยใหม่

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 5 โปรแกรมคำนวณ Resection ด้วยอัลกอริทึ่มสมัยใหม่

การเล็งสกัดย้อน (Resection) และความเป็นมา

ในที่สุดก็มาถึงตอนที่ 5 ตอนที่ผมใช้เวลามากที่สุดในการ implement อัลกอริทึ่มที่ใช้คำนวณปัญหา Resection จาก 3 จุดที่กำหนด (Three Points Resection Problem) เป็นที่ทราบกันดีว่าการคำนวณ Resection นั้นนักคณิตศาสตร์ได้คิดค้นกันมาหลายร้อยปีแล้ว มีอัลกอริทึ่มรวมๆกันไม่น้อยกว่า 500 อัลกอริทึ่ม แต่บางอัลกอริทึ่มนั้นอายุเก่าแก่มากใช้การคำนวณหาด้วยการวาดลงบนกระดาษ ถ้าจะคัดออกมาจริงๆที่ใช้กันในปัจจุบันมีประมาณ 18 อัลกอริทึ่มหลักๆ และสามารถนำมา implement เป็นโปรแกรมในคอมพิวเตอร์ได้ ก่อนจะไปต่อกันลึกๆมาดูกันว่า Resection คืออะไร

การเล็งสกัดย้อน(Resection) คือการวัดพิกัดจุดตั้งกล้องจากสถานีที่ทราบค่าพิกัด 3 สถานี ตามตัวอย่างได้แก A, B และ C และวัดมุมราบคือมุม α และ β ตามลำดับ

ผมคนรุ่นเก่ายังทันเครื่องมือวัดมุม Sextant ผมทัน Sextant นี้ในช่วงทำงานใหม่ๆ โดยที่ลงเรือไปในทะเลกับพี่ๆช่างสำรวจของกรมเจ้าท่า ตอนนั้นเพิ่งเรียนจบมาใหม่ ยุคนั้น GPS/GNSS ยังไม่เป็นที่รู้จัก การวัดตำแหน่งของเรือสำรวจใช้เครื่องมือ Sextant ที่อาศัยหลักการของ Resection มาประยุกต์ใช้ บนเรือสำรวจจะมีเจ้าหน้าที่ 2 คน คนแรกจะส่องสถานี A และ B เพื่อวัดมุม α และคนที่สองจะส่องสถานี B และ C เพื่อวัดมุม β สองคนนี้ตามหลักการแล้วต้องขี่คอกันแต่จริงๆคงไม่มีใครทำเพียงแต่นั่งใกล้ๆกัน การใช้ Sextant วัดตำแหน่งเรือต้องอาศัยความชำนาญอย่างสูง เพราะเรือไม่อยู่นิ่งกับที่เพราะคลื่มลม จะปะทะให้เคลื่อนไหวตลอดเวลา

เมื่อการวัดมุมเสร็จสิ้นลงทั้งสองคนจะจดค่ามุม ∝ และ ∅ พร้อมๆกัน การใช้ Sextant ควบคู่ไปกับกับใช้เครื่องมือวัดความลึกของท้องน้ำจำพวก Echo sounder งาน post processing ในออฟฟิศได้แต่การนำค่ามุม α และ β มาคำนวณหาค่าพิกัดแตละจุด จากนั้นก็จัดทำแผนที่แสดงความลึกของแม่น้ำหรือทะเลในบริเวณที่ทำการสำรวจ ถึงแม้กระนั้นเครื่องมือ Sextant จะให้ค่าความละเอียดด้านมุมไม่ดีนัก แต่ค่าพิกัดที่ได้สมัยนั้นก็เพียงพอสำหรับงานในทะเลหรือแม่น้ำ

หัวข้อต่อๆไปจะกล่าวถึงที่ไปที่มาของสูตรที่ผมใช้สำหรับเครื่องคิดเลข fx-9860G ถ้าผู้อ่านไม่สนใจก็ข้ามไปที่การใช้โปรแกรมเครื่องคิดเลขด้านท้ายๆเลยครับ

หลักการคำนวณ Resection

อัลกอริทึ่มที่ผมกล่าวไปนั้นตั้งแต่ยุคอดีตกาลนั้นมากกว่า 500 อัลกอริทึ่ม แต่ส่วนใหญ่แล้วอาศัยหลักการคล้ายๆกันคือใช้หลักวงกลมสามวงตัดกันที่จุด P วงแรกจะลากผ่านจุด A-P-B วงที่สองลากผ่านจุด B-C-P วงที่สามลากผ่าน C-P-A ดังรูปด้านล่าง

ภาวะเอกฐาน (Singularity) ที่อัลกอริทึ่มล้มเหลว

ผมขอยืมคำแปล Singularity ที่แปลว่าภาวะเอกฐานจากเรื่องหลุมดำในทฤษฎีฟิสิกส์ควอนตัมหน่อย เพราะมันได้ใจความคือภาวะที่ทฤษฎีทางคณิตศาสตร์ล้มเหลว คือเหมือนกับพลัดตกลงไปในหลุมดำประมาณนั้น

การคำนวณ Resection ที่ใช้วงกลมสามวงมาตัดกันดังรูปด้านบน แต่จะเกิดอะไรขึ้น ถ้าจุดทั้ง 4 จุดนี้อยู่บนวงกลมวงเดียวกัน ก็หมายความว่าวงกลมสามวงนั้นจะซ้อนทับกันทั้งสามวง จนไม่สามารถหาจุดตัดกันได้ ดังนั้น Resection ไม่มีสูตรหรืออัลกอริทึ่มไหนในบรรณพิภพนี้ที่สามารถคำนวณได้บนภาวะเอกฐาน

ภาวะเอกฐานเสมือน (Pseudo Singularity)

ภาวะเอกฐานเสมือนเป็นสภาวะที่จุด P มาอยู่บนเส้นตรงระหว่าง A-B หรือ B-C หรือ A-C ด้านล่างจะเป็นกรณีจุด P อยู่บนเส้นตรงระหว่างจุด B และ C จะทำให้มุม β มีค่ากับ π เรเดียน (หรือเท่ากับ 180 องศา) หรือถ้าขยับจุด P ให้เลยออกจากจุด B แตยังอยู่ในแนวเส้นตรง ในกรณีนี้จะได้ มุม β = 0

ภาวะเอกฐานเสมือนนี้สูตรหลายๆสูตรไม่สามารถหาค่าได้เช่นสูตร Tienstra Method

อัลกอริทึ่มสมัยใหม่ (Modern Algorithm)

เท่าที่ผมทราบในปัจจุบันตัวที่ทำให้เกิดสูตรคณิตศาสตร์ใหม่ๆมาจากวงการ Robot ที่ต้องการให้ค่าพิกัดของหุ่นยนต์ในการเคลื่อนไหวได้แม่นยำ เนื่องจากหุ่นยนต์ทำงานอยู่ในอาคาร จึงทำให้ระบบให้ค่าพิกัด GNSS ไม่สามารถนำมาใช้งานได้ หุ่นยนต์ในที่นี้ไม่ได้หมายถึงหุ่นยนต์ที่ติดตั้งแบบอยู่กับที่ในโรงงานนะครับ แต่เป็นหุ่นยนต์ที่สามารถเคลื่อนไหวได้อิสระ ตัวอย่างง่ายๆได้แก่การแข่งขันหุ่นยนต์ของนักศึกษาในอินดอร์ อดึตกาลสูตรเหล้านี้มาจากนักคณิตศาสคร์ แต่สำหรับสูตรสมัยใหม่เนื่องจากความต้องการใช้งานในวงการหุ่นยนต์ ทำให้คนที่คิดค้นสูตรสมัยใหม่กลายเป็นวิศวกรไฟฟ้าหรือวิศวกรเครื่องกล เท่าที่ผมศึกษางานวิจัยในเบื้องต้นผมสนใจงานของ

    1. A New Three Object Triangulation Algorithm for Mobile Robot Positioning โดย Vincent Pierlot and Marc Van Droogenbroeck ทั้งสองท่านจบวิศวกรไฟฟ้า งานวิจัยนี้มีโค้ดภาษา C ด้วย แต่เนื่องจากลิขสิทธิ์ที่ระบุให้ใช้ในวงการศึกษาหรือใช้งานส่วนตัวเท่านั้น ผมจึงไม่สามารถนำโค้ดมาใช้งานได้เพราะยังกำกวม ความจริงงานทั้ง 2 ท่านได้รวบรวมอัลกอริทึ่มรวมทั้งของตัวเองด้วยทั้งหมด 18 อัลกอริทึ่มและ implement มาเป็นโค้ด พร้อมทั้งวัด benchmark ว่าใค้ดใครเร็วที่สุด ก็ตามคาดหมายโค้ดที่ทั้งสองท่านคิดค้นมานั้นเข้าวิน แต่สำหรับผมแล้วความต่างมันหนึ่งในพันส่วนของวินาทีอาจจะจำเป็นสำหรับงานให้ตำแหน่งหุ่นยนต์ที่ต้องมีการคำนวณตำแหน่งแบบ real time แต่สำหรับงานสำรวจในภาคสนามความจำเป็นกลับต่างออกไป
    2. New Method That Solves the Three-Point Resection Problem Using Straight Lines Intersection โดย Josep M. Font-Llagunes and Joaquim A. Batlle ผมชอบความคิดของสองท่านนี้ดูจากโพรไฟล์แล้วจบวิศวกรเครื่องกล แต่เนื่องจากเอกสารเข้าใจยากไปนิด ผมกลับใช้เวลาแกะอัลกอริทึมโดยใช้เวลาพอสมควรกว่าจะออกมาเป็นโค้ดได้ โปรแกรมสามารถคำนวณในสภาวะเอกฐานเสมือนได้

หลักการคำนวณโดยย่อ

ผมไม่มีเวลาที่จะศึกษาสูตรในเบื้องลึกให้กระจ่างมากนั้นแต่เน้น implement มาเป็นโค้ดภาษา C ดังนั้นความเข้าใจจึงอยู่ในระดับผิวเผิน ต่อไปผมจะบอกเล่าสิ่งที่ผมเข้าใจแบบจำกัดจำเขี่ย เราจะมาเริ่มต้น สมมติว่าตอนนี้ถ้าทราบค่าพิกัด P แล้วเราสามารถหาค่าอะซิมัทจากสถานี A, B และ C ไปยังจุด P ได้ง่ายๆ ตามรูปด้านล่าง

ค่าอะซิมัทของสถานีที่ทราบค่าพิกัด

1.คำนวณหาค่าอะซิมัทโดยประมาณ (Θ)

แต่ในชีวิตจริงค่าพิกัด P เป็นสิ่งที่เรายังไม่ทราบดังนั้นสูตรคำนวณนี้จะมีการหาค่าโดยประมาณก่อน Θ = θ – โดย  คือค่าเบี่ยงเบนไปจากค่าจริงจากที่เราประมาณ ถ้าทุกๆเส้นเบี่ยงเบนไป  เราสามารถลากเส้นไปตัดกันเป็นรู)สามเหลี่ยมเล็กๆ แต่ถ้า  ที่ประมาณการณ์ไว้มีขนาดเบี่ยงเบนไปมาก ก็จะได้ขนาดสามเหลี่ยมนี้ใหญ่ขึ้น สามเหลี่ยมนี้ทางผู้คิดค้นเรียกว่า error triangle จุดตัดแทนที่ด้วย PAB, PBC และ PAC

2.คำนวณหาค่าพิกัดของ Error Triangle

ค่าพิกัดของจุดตัด P นี้สามารถคำนวณได้จากสูตร

โดยที่ mA = cot(Θ), mB = cot(Θ – α) และ mC = cot(Θ – α -β) ไม่ลืมว่า Θ คือค่าอะซิมัทโดยประมาณ

3.คำนวณหาค่าพิกัดของ Centers Triangle

ถ้าจากจุด P ลากเส้นตรงไปหาสถานีที่ทราบค่าพิกัดแล้วแบ่งครึ่งลากเส้นตั้งจาก เราจะได้สามเหลี่ยมอีกชุดหนึ่งเรียกว่า centers triangle  และเป็นสามเหลี่ยมคล้ายสามเหลี่ยม error triangle ดังนั้นความสัมพันธ์ด้านมุมและระยะระหว่างสามเหลี่ยมสองรูปนี้สามารถคำนวณได้ ดังนั้นค่าพิกัดของ centers triangle สามารถคำนวณหาค่าพิกัดจุดตัด CAB, CBC และ CAC ได้จากสูตรดังต่อไปนี้

4.คำนวณมุมเบี่ยงเบน

ค่าเบี่ยงเบนเมื่อคำนวณมาได้แล้วสามารถนำไปบวกหรือลบกับค่าอะซิมัทประมาณการในครั้งแรกจะได้ค่าอะซิมัทที่ถูกต้อง

สามารถคำนวณสมการ (9) จากระยะทางแต่ละด้านของ error triangle และ centers triangle เช่นตัวอย่าง |δθ| = arcsin(ระยะทางระหว่างจุด PAB– PBC / ระยะทางจุด CAB– CBC )

หรือในสมการ (10) สามารถใช้พื้นที่ของสามเหลี่ยมสองรูปนี้ได้

5.คำนวณหาเครื่องหมายมุมเบี่ยงเบน

ก่อนหน้านี้ที่แสดงค่าที่คำนวณได้ในสมการ (9) และ (10) จะเห็นว่าติดเครื่องหมาย absolute ไว้คือยังไม่ได้คิดเครื่องหมาย ส่วนเครื่องหมายมุมเบี่ยงเบนหาได้ดังนี้

ทางผู้พัฒนาแสดงทิศทางของ error triangle เมื่อเทียบ center triangle ตามเครื่องหมายของ error triangle ดังนี้

อาจจะดูยากไปนิดเป็นการคูณไขว้กัน ดูตัวอย่างเพื่อความง่าย

sign = (xPAC-xPBC)*(yCAC-yCBC) – (xCAC-xCBC)*(yPAC-yPBC)

ค่าของ  sign จะออกมาเป็นบวกหรือเป็นลบ แล้วจะเอาเครื่องหมายนี้ไปใส่ให้สมการในข้อต่อไป

6.คำนวณหาอะซิมัทที่ถูกต้อง

สมการ θ=Θ +sign(dθ)

7.คำนวณหาพิกัดของจุดตัด Resection

ถ้าจุดตัดไม่ตกหลุมดำ ก็สามารถคำนวณหาจุดตัดได้จาก 1 ใน 3 สมการ ของสมการ (1), (2) หรือ (3) เช่นตัวอย่าง

mA = cot(θ)
mB = cot(θ – α)
xP = (mA x xA – mB x xB – yA + yB) / (mA – mB)
yP = mA x (xP – xA) + yA

การคำนวณเมื่อจุดตัดตกภาวะเอกฐานเสมือน

จะมี 3 กรณีคือ

1) ค่า α = 180 หรือ α = 0

2)ค่า β = 180 หรือ β = 0

3)ค่ามุม α+β = 180 หรือ α+β = 0

จากการคำนวณในข้อ 3 จะสังเกตในสูตร (5) จะมีตัวคูณด้วย cot(α) อยู่ ในกรณีนี้จุดตัด P อยู่บนเส้นตรงระหว่างจุด A และ B ดังนั้นมุม α = 180 องศาจะทำให้ cot(α) ไม่สามารถคำนวณได้เพราะค่าเป็นอนันต์ (infinity)  ในเคสนี้เราจะไม่คำนวณหาจุด CAB เพราะหาไม่ได้นั่นเอง แต่จุด CBC และ CAC ก็ยังหาได้ปกติ ดังนั้นในกระบวนการสุดท้ายค่าพิกัดของจุด P สามารถคำนวณได้จากการใช้สมการอีก 2 สมการคือสมการ (2) และ (3)

ไม่ใช้สมการ (1) เพราะมีค่า (mA – mB)  = 0 ทำให้ห่าค่า xP ไม่ได้

ข้อสังเกต สามารถลากวงกลมได้แค่ 2 วงเท่านั้นคือวงกลม A-P-C และ B-P-C ส่วนอีกวงลากไ่ม่ได้เพราะว่า A-P-B เป็นเส้นตรง

ดาวน์โหลด (Download) โปรแกรมสำหรับเครื่องคิดเลข fx-9860G

ไปที่หน้าดาวน์โหลดมองหาโปรแกรม Resection เมื่อดาวน์โหลดมาแล้วจะได้ไฟล์ “RESCTION.G1A” ใช้โปรแกรม FA-124 ทำการโอนโปรแกรมเข้าเครื่องคิดเลข (ดูโพสต์เก่าได้วิธีการนี้) จะเห็นไอคอนปรากฎที่หน้า AddIn ดังรูป

กรณีที่ 1 ตัวอย่างงานรังวัดในงานสำรวจทั่วไป (Survey Engineering Example)

กำหนดค่าพิกัดของสถานี A, B และ C ดังนี้

วัดค่ามุม ∝ และ ∅ จากกล้อง total station ได้ดังนี้ ∝= 40°35’22.11“ และค่ามุม ∅ = 9°18’31.84“ ที่ไอคอนโปรแกรมกดคีย์ “EXE” เข้าไปป้อนค่าพิกัดสถานีทั้งสามดังนี้

จากนั้นป้อนมุมภายใน

โปรแกรมจะคำนวณหาค่าพิกัดของจุดตัด โดยที่แจ้งสถานะมาก่อนว่าคำนวณได้ Resection Solved…

กรณีที่ 2 ตัวอย่างงานที่จุดตัดตกอยู่ในภาวะเอกฐานเสมือน (Pseudo Singularity)

นี่เป็นกรณีพิเศษจริงๆ เพราะว่าหลายๆสูตรคำนวณด้วยวิธีนี้ไม่ได้เช่นสูตร Tienstra กำหนดค่าพิกัดสถานี  A (2639303.349mN, 231605.043mE) ค่าพิกัดสถานี B (2639271.845mN, 231419.755mE) และสถานี C (2639180.389mN, 231561.178mE) มุมที่รังวัดมา α = 180° มุม β = 105°3’14.94“

ข้อสังเกตุถ้ามุม α เท่ากับ 180 แสดงว่าจุดตัดตกอยู่บนเส้นตรงระหว่างสถานี A และ B แต่เขยิบเข้าไปใกล้ B มากกว่าเพราะว่ามุม β เป็นมุมป้าน มาดูการคำนวณจากเครื่องคิดเลข เมื่อเรียกโปรแกรมมาแล้วป้อนค่าพิกัดสถานีตามลำดับ A, B และ C แล้ว

จากนั้นป้อนมุม α และ β

ผลลัพธ์ที่ได้

กรณีที่ 3 ตัวอย่างจุดตัดตกหลุมดำในภาวะเอกฐาน (Singularity)

กรณีสุดท้าย โอกาสที่จะเจอแบบนี้คือสถานีทั้งสามสถานีอยู่บนวงกลมเดียวกันและจุดที่ตั้งกล้องที่ต้องการทราบค่าพิกัดและยังมาอยู่บนวงกลมเดียวกันทั้ง 4 จุด ในชีวิตจริงมีโอกาสน้อยมากเหมือนกับถูกล็อตเตอรีรางวัลที่ 1 ยังไงยังงั้น มาลองคำนวณดู

กำหนดค่าพิกัดสถานี A (2369180.389mN, 231561.178mE) สถานีพิกัดสถานี B (2639303.349mN, 231605.093mE) และสถานี C (2639478.455mN, 231509.233mE) วัดมุม α = 29°32’23.9“และ β = 18°48’43.9“

เมื่อเข้าไปในโปรแกรมป้อนค่าพิกัด A, B และ C ตามลำดับ

จากนั้นป้อนมุม α และ β ตามลำดับ

สุดท้ายโปรแกรมไม่สามารถคำนวณหาพิกัดจุดตัดได้และแสดงว่า Resection unsolved…

เครดิต (Credit)

ก็ยกเครดิตสำหรับอัลกอริทึ่มหรือสูตรคำนวณนี้ให้กับสองท่านคือ Josep M. Font-Llagunes and Joaquim A. Batlle.

ซอร์สโค้ดสูตรคำนวณ (Sourcecode)

ผมยกมาเฉพาะสูตรคำนวณตั้งชื่อฟังก์ชั่น straightLineIntersection สำหรับคนที่สนใจเรื่องโปรแกรมมิ่งก็ศึกษาโค้ดภาษาซีกันได้ครับ ไม่มีอะไรยุ่งยาก

/* Algorithm based on Josep M. Font-Llagunes and Joaquim A. Batlle.
  - Input angles are radians. 
  - Internal angles is clock-wise direction.
  - A, B and C must be located from right to left respectively.*/
bool straightLineIntersection(double *xP, double *yP,
				double alpha_AB, double alpha_BC,
				double xA, double yA, double xB, double yB, double xC, double yC)
{
  double mA, mB, mC; //slope of lines.
  double cot_12, cot_23, cot_31;
  double pAB, pAC, pBC; //Euclidean distance between station.
  double estB; //Estimated angle A-B-C.
  double xPAB, yPAB, xPBC, yPBC, xPAC, yPAC; //error triangle.
  double xCAB, yCAB, xCBC, yCBC, xCAC, yCAC; //center of triangle.
  double deltatheta;
  double theta; //first estimated and actual azimuth from P to A at the end.
  double AP, AC;
  double sign;
  double dPAC_PBC, dCAC_CBC;
  double dPAB_PBC, dCAB_CBC;
  double dPAB_PAC, dCAB_CAC;

  pAB = sqrt((xA-xB)*(xA-xB) + (yA-yB)*(yA-yB));
  pAC = sqrt((xA-xC)*(xA-xC) + (yA-yC)*(yA-yC));
  pBC = sqrt((xB-xC)*(xB-xC) + (yB-yC)*(yB-yC));

  estB = acos((pAB*pAB + pBC*pBC - pAC*pAC) / (2*pAB*pBC));
  //Check if found absolutely singularity then stop and return.
  if (((estB + alpha_AB + alpha_BC - PI) >= -0.0001) and 
      ((estB + alpha_AB + alpha_BC - PI) <= 0.0001))
    return false;

  /*first guess (theta), try to avoid for cot(angle) 
    when angle == PI or zero).*/ 
  theta = alpha_AB + alpha_BC/2.0;    
  mA = cot(theta);
  mB = cot(theta - alpha_AB);
  mC = cot(theta - alpha_AB - alpha_BC);
	
  //calc coordinates of error triangle.
  xPAB = (mA*xA - mB*xB - yA + yB) / (mA - mB);
  yPAB = mA*(xPAB - xA) + yA;  
  xPBC = (mB*xB - mC*xC - yB + yC) / (mB - mC);
  yPBC = mB*(xPBC - xB) + yB;
  xPAC = (mA*xA - mC*xC - yA + yC) / (mA - mC);
  yPAC = mA*(xPAC - xA) + yA;
	
  dPAC_PBC = sqrt((xPAC-xPBC)*(xPAC-xPBC) + (yPAC-yPBC)*(yPAC-yPBC));
  dPAB_PBC = sqrt((xPAB-xPBC)*(xPAB-xPBC) + (yPAB-yPBC)*(yPAB-yPBC));
  dPAB_PAC = sqrt((xPAB-xPAC)*(xPAB-xPAC) + (yPAB-yPAC)*(yPAB-yPAC));
  
  AP = ((xPAB - xPBC) * (yPBC - yPAC) - (xPBC - xPAC) * (yPAB - yPBC))/* / 2*/ ;
  AP = (AP < 0.0) ? -AP : AP;

  /* The next 3 Cases are psudosingularities.
    
    1st case: P is aligned with A & B.Therefore cannot calc PAB & CAB.*/
  if (alpha_AB == PI || alpha_AB == 0.0){ /* P is aligned on A & B.*/
    /* cot(alpha_AB) is infinity */
    cot_23 = cot(alpha_BC);
    cot_31 = cot(alpha_AB+alpha_BC);
   
    //calc coordinates of center triangle.
    xCBC = 0.5 * (xB + xC + (yB - yC) * cot_23);
    yCBC = 0.5 * (yB + yC + (xC - xB) * cot_23);
    xCAC = 0.5 * (xA + xC + (yA - yC) * cot_31);
    yCAC = 0.5 * (yA + yC + (xC - xA) * cot_31);

    //distance CAC to CBC (center triangle).
    dCAC_CBC = sqrt((xCAC-xCBC)*(xCAC-xCBC)+(yCAC-yCBC)*(yCAC-yCBC));

    deltatheta = asin(0.5*(dPAC_PBC/dCAC_CBC));
	deltatheta = (deltatheta < 0.0) ? -deltatheta : deltatheta; 
    sign = (xPAC-xPBC)*(yCAC-yCBC) - (xCAC-xCBC)*(yPAC-yPBC);
	if (sign < 0.0 ) deltatheta = -deltatheta ;   
    theta += deltatheta;

    mB = cot(theta - alpha_AB);
    mC = cot(theta - alpha_AB - alpha_BC);
  
    *xP = (mB * xB - mC * xC - yB + yC) / (mB - mC);
    *yP = mB * ((*xP) - xB) + yB; 
    return true;
  }else if ((alpha_BC == PI) || (alpha_BC == 0)){ 
    /* 2nd case: P is aligned on B & C.
                 cot(alpha_BC) is infinity */
    cot_12 = cot(alpha_AB);
    cot_31 = cot(alpha_AB+alpha_BC);
   
    //calc coordinates of center triangle.
    xCAB = 0.5 * (xA + xB + (yA - yB) * cot_12);
    yCAB = 0.5 * (yA + yB + (xB - xA) * cot_12);
    xCAC = 0.5 * (xA + xC + (yA - yC) * cot_31);
    yCAC = 0.5 * (yA + yC + (xC - xA) * cot_31);

    //distance CAB ot CAC (center triangle)
    dCAB_CAC = sqrt((xCAB-xCAC)*(xCAB-xCAC)+(yCAB-yCAC)*(yCAB-yCAC));

    deltatheta = asin(0.5*(dPAB_PAC/dCAB_CAC));
	deltatheta = (deltatheta < 0.0) ? -deltatheta : deltatheta; 
    sign = (xPAB-xPAC)*(yCAB-yCAC) - (xCAB-xCAC)*(yPAB-yPAC);
	if (sign < 0.0 ) deltatheta = -deltatheta ;   
    theta += deltatheta;

    mA = cot(theta);
    mB = cot(theta - alpha_AB);
  
    *xP = (mA * xA - mB * xB - yA + yB) / (mA - mB);
    *yP = mA * ((*xP) - xA) + yA; 
    return true;
  }else if (((alpha_AB + alpha_BC) == PI) || ((alpha_AB + alpha_BC) == 0)){
    /* 3rd case: P is aligned on A & C. 
       cot(alpha_AB+alpha_BC) is infinity.*/
    cot_12 = cot(alpha_AB);
    cot_23 = cot(alpha_BC);
   
    //calc coordinates of center triangle.
    xCAB = 0.5 * (xA + xB + (yA - yB) * cot_12);
    yCAB = 0.5 * (yA + yB + (xB - xA) * cot_12);
    xCBC = 0.5 * (xB + xC + (yB - yC) * cot_23);
    yCBC = 0.5 * (yB + yC + (xC - xB) * cot_23);

    //distance CAB ot CBC (center triangle)
    dCAB_CBC = sqrt((xCAB-xCBC)*(xCAB-xCBC)+(yCAB-yCBC)*(yCAB-yCBC));

    deltatheta = asin(0.5*(dPAB_PBC/dCAB_CBC));
	deltatheta = (deltatheta < 0.0) ? -deltatheta : deltatheta; 
	sign = (xPBC - xPAB) * (yCBC - yCAB) - (xCBC - xCAB) * (yPBC - yPAB);
	if (sign < 0.0 ) deltatheta = -deltatheta;   
    theta += deltatheta;

    mA = cot(theta);
    mB = cot(theta - alpha_AB);
  
	*xP = (mA * xA - mB * xB - yA + yB) / (mA - mB);
	*yP = mA * ((*xP) - xA) + yA;   
    return true;
  }else {
    /* Normal case can be calculated by other methods as well.*/
    cot_12 = cot(alpha_AB);
    cot_23 = cot(alpha_BC);
    cot_31 = cot(alpha_AB+alpha_BC);
   
    //calc coordinates of center triangle.
    xCAB = 0.5 * (xA + xB + (yA - yB) * cot_12);
    yCAB = 0.5 * (yA + yB + (xB - xA) * cot_12);
    xCBC = 0.5 * (xB + xC + (yB - yC) * cot_23);
    yCBC = 0.5 * (yB + yC + (xC - xB) * cot_23);
    xCAC = 0.5 * (xA + xC + (yA - yC) * cot_31);
    yCAC = 0.5 * (yA + yC + (xC - xA) * cot_31);

	AC = ((xCAB - xCBC) * (yCBC - yCAC) - (xCBC - xCAC) * (yCAB - yCBC))/* / 2*/ ;
	AC = (AC < 0.0) ? -AC : AC;

    deltatheta = asin(0.5*sqrt(AP/AC));
	deltatheta = (deltatheta < 0.0) ? -deltatheta : deltatheta; 
	sign = (xPBC - xPAB) * (yCBC - yCAB) - (xCBC - xCAB) * (yPBC - yPAB);
	if (sign < 0.0 ) deltatheta = -deltatheta ;   
    theta += deltatheta;

    mA = cot(theta);
    mB = cot(theta - alpha_AB);
  
	*xP = (mA * xA - mB * xB - yA + yB) / (mA - mB);
	*yP = mA * ((*xP) - xA) + yA;  
    return true;
  }
}

The Return of Spot Fire ก้าวกลับมาอีกครั้งของ Spot Fire รุ่น 2.10 (ล่าสุด)

Spot Fire V2.10 รุ่นล่าสุด

  • และแล้วก็ได้เวลา upgrade โปรแกรมอีกตัว ซึ่งโปรแกรมเขียนตัวเลขค่าระดับส่งเข้า Autocad โดยตรง เป็นโปรแกรมเล็กมากๆ เรียกว่าเป็นทูลส์ (tools) ก็ได้ครับ ขนาดไฟล์ติดตั้ง 1.5 MB แค่นั้นเอง
  • เดิมทีโปรแกรมพัฒนาด้วย Delphi ซึ่งติดเรื่องลิขสิทธิ์ ผมพอร์ทโปรแกรมมา Lazarus ซึ่งใช้ Free pascal compiler เป็นคอมไพเลอร์ ที่ฟรีและ opensource เนื่องจากโค๊ดของ Dephi เป็นปาสคาลอยู่แล้วการพอร์ทโค๊ดมา Lazarus ซึ่งเป็นภาษาปาสคาลเหมือนกัน จึงเป็นเรื่องง่ายๆ และได้อัพเกรดความสามารถหลายๆอย่างเพิ่มเติมครับ
  • รองรับจอ 4K เหมือนทุกโปรแกรมที่อัพเดทก่อนหน้านี้

SpotFire_Intro

จุดกำเนิดโปรแกรม

  • งานสำรวจทางทะเลหรือแม่น้ำ สำรวจความลึกท้องทะเล (sea bed) หรือท้องแม่น้ำ (river bed) เรียกให้แคบในภาษาปัจจุบันคือ  Bathymetric Survey จะมีเอกลักษณ์เฉพาะตัว คือการเขียนเลขน้ำ (เขียนค่าระดับหรือความลึกตรงบริเวณจุดสำรวจ)

bathy_example

  • งานทางน้ำทางทะเล เลขน้ำลึกตัวเลขจะบวก ที่ตื้นค่าระดับจะเป็นลบ เลขน้ำทางสากล จะไม่เขียนจุดทศนิยม ถ้าเลขทศนิยมเป็นศูนย์ เช่น 1.0, 2.0 จะไม่เขียนเลขทศนิยมคือเลขศูนย์ ตัวเลขทศนิยมจะเป็นตัวห้อย ตัวหนังสือจะเล็กว่าเลขหลักประมาณ 70-80% (ดูรูปด้านบน ผมดาวน์โหลดจากอินเทอร์เน็ต) ถ้าเป็นเลขลบจะขีดเส้นใต้ตัวเลขตัวหลัก ส่วนทศนิยมจะไม่มีขีดด้านล่าง
  • ตัวหนังสือนิยมเขียนตัวเอียงแบบ oblique อีกเอียงโย้ไปด้านหลังประมาณ 15 องศา ลองดูแผนที่เดินเรือแบบสากล สังเกตที่ตื้นๆสีเขียวเข้มๆด้านขวาค่าระดับจะเป็นลบ จะมีขีดใต้ตัวเลขหลัก

portion-of-raster-chart

  • เนื่องจากผมทำงานทางทะเลมาตั้งแต่จุดเริ่มต้น จึงเขียนโปรแกรมนี้มาใช้งาน รุ่นแรกๆก็ยังไม่ดีนักแต่ก็พอใช้งานได้ จนถึงตอนนี้ได้ยกเครื่องอัพเกรดโปรแกรมใหม่ ให้เขียนเลขน้ำได้หลากหลายมากขึ้น มาดูกันว่ารุ่นนี้ทำอะไรได้บ้าง

ดาวน์โหลดและติดตั้ง

  • ดาวน์โหลดได้ที่ SpotFire V2.10 แบบ 64 bit และ SpotFire V2.10 แบบ 32 bit ตอนนี้เป็น build 2370 หรือถ้าลิ๊งค์ตรงนี้ขาดให้ดูด้านขวามือของ blog ในส่วน Download เมื่อดาวน์โหลดมาแล้วก็ unzip แล้วทำการติดตั้งง่ายๆ ติดตั้งแล้วจะเห็นไอคอนของโปรแกรมอยู่บน desktop ดับเบิ้ลคลิกเพื่อเปิดโปรแกรม

spotfire_icon_desktop

เปิดโปรแกรม

  • เปิดมาหน้าแรกจะเป็นหน้าต่างของแท็บ “Options” ที่เป็นหน้าให้ป้อนค่าตัวเลือกเพื่อควบคุมตัวเลขค่าระดับ ตั้งแต่กำหนดมาตราส่วนของแผนที่ ฟอนต์ ขนาดตัวเลข และอื่นๆ
  • ส่วนทูลบาร์ มีแค่สองไอคอนคือเปิดไฟล์ กับส่งตัวเลขค่าระดับเข้า Autocad

spotfire_introduction

  • อีกหน้าจะเป็นหน้าต่างของแท็บ “Points” ไว้แสดงข้อมูล X,Y,Z หรือ N,E,Z ที่อ่านได้จากไฟล์ CSV ตอนนี้ยังโล่งเพราะยังไม่มีข้อมูล

SpotFire_points

ทดสอบข้อมูล

  • ข้อมูลตัวอย่างเก็บไว้ที่ “C:\Users\ชื่อผู้ใช้\Appdata\Roaming\Spot Fire\Examples Data” ซึ่งจะเป็นโฟลเดอร์ที่ซ่อนไว้ จะใช้ตัวช่วย คลิกที่เมนู “Help > Examples Data Folder…” ดังรูป

spotfire_open_examples_folder

  • โปรแกรมจะบอกว่าได้ก๊อปปี้พาท (path) ของโฟลเดอร์ตัวอย่างข้อมูลไปไว้ในคลิปบอร์ดเรียบร้อยแล้ว คลิก “OK” เพื่อปิด

spotfire_copytoclipboard

  • โปรแกรมจะเปิด Windows Explorer แสดงพาทที่เก็บข้อมูล จะเห็นไฟล์ชื่อ “Cavite-NEZ.csv” เราจะทดสอบไฟล์นี้ก่อน ไฟล์ข้อมูลจะเป็น text file ที่เก็บจุดงานสำรวจ (point) ไว้ในรูปแบบ NEZ โดยที่ใช้ตัวคั่นคือเครื่องหมายคอมม่า

spotfire_tested_file

เปิดไฟล์ข้อมูล

  • กลับมาที่โปรแกรมกันต่อ ที่ทูลบาร์คลิกไอคอน “Open CSV text file…

spotfire_open_file_icon

  • จะเห็นไฟล์ไดอะล็อก เนื่องจากพาทข้อมูลที่วินโดส์ซ่อนไว้ ถ้า browse จะมองไม่เห็น วิธีการคือเอาพาทที่เราก็อปปี้ไปไว้ในคลิปบอร์ดมาวาง (pasted) บนพาทของไดอะล็อก กด “Enter” ที่คีย์บอร์ดครั้งหนึ่ง เลือกไฟล์ เลือกรูปแบบไฟล์เป็น N,E,Z แล้วเปิดไฟล์ ดูรูปประกอบ

spotfire_selected_file

  • ตอนเลือกรูปแบบไฟล์ต้องเลือกให้ตรง เพราะบางท่านนิยมเก็บไว้ในรูปแบบ E,N,Z ค่า N และ E บางครั้งมีค่าใกล้เคียงกัน ผมไม่สามารถโปรแกรมให้อ่านไฟล์ แล้วตัดสินใจเลือกว่าคอลัมน์ไหนเป็น N หรือ E ซึ่งอาจจะผิดพลาด ผู้ใช้ต้องเลือกเองครับ
  • Format ของ CSV มี 4 รูปแบบที่โปรแกรมอ่านได้คือ
    • P,N,E,Z,D (P = Point No. D=Description) และ P,N,E,Z
    • P,E,N,Z,D และ P,E,N,Z
    • N,E,Z,D และ N,E,Z
    • E,N,Z,D และ E,N,Z

ตรวจสอบข้อมูล

  • ไฟล์ข้อมูล “Cavite-NEZ.csv” ที่เปิด จะมีจำนวนจุดประมาณ 19789 จุด โปรแกรมใช้เวลาอ่านนิดเดียว คลิกที่แท็บ “Points” มาดูข้อมูลบนตารางข้อมูล ตารางนี้ดูได้อย่างเดียวไม่สามารถแก้ไขได้

spotfire_data_table

  • เปิดเมนู “File > Properties” จะเห็นค่าระดับลึกสุด = 43.160 เมตร ค่าตื้นสุด = -1.060 เมตร ไฟล์งานนี้เป็นไฟล์สำรวจ seabed ของทะเล

spotfire_file_properties

ตั้งค่าตัวเลือกเพื่อตั้งรูปแบบตัวเลขค่าระดับ

  • คลิกแท็บกลับมาที่ “Options” รูปด้านล่างดูแล้วอาจจะลายตา ทนเอาหน่อยครับ หน้านี้เป็นการกำหนดรูปแบบให้ตัวเลข อย่างเช่นอันดับแรกมาตราส่วน ผมเลือกมาตราส่วน 1 : 20000 เพราะงานสำรวจเป็นพื้นที่ขนาดใหญ่ในทะเลติดชายฝั่งแห่งหนึ่ง

spotfire_set_options

  • มาตราส่วนแผนที่จะเป็นสิ่งแรกที่เราคิดไว้ก่อนสิ่งอื่น 1 : 20000 เทียบแบบนี้จะเข้าใจง่าย 1 มม. บนแผนที่ = ขนาดจริงบนโลก 20000 มม. หรือ 1 มม.บนแผนที่ = 20 เมตร (หาร 20000 ด้วย 1000) ฉะนั้นเวลากำหนดตัวอักษรสูงขนาด 2 มม. เวลาเขียนแบบตัวอักษรใน CAD จะต้องตั้งความสูงเท่ากับ 2 x 20 = 40 เมตร (ถ้าเรากำหนดหน่วยเขียนแบบใน CAD เป็นหน่วยเมตร) แต่ไม่ต้องปวดหัวครับ ถ้าตั้งมาตราส่วนเท่าไหร่โปรแกรมจะคำนวณมาให้ถูกต้องได้ถูกต้องเท่านั้น
  • Text layer สามารถเลือกเป็น “Single layer” โปรแกรมจะใช้ชื่อเลเยอร์ “SpotText” โดยอัตโนมัติ แต่ถ้าเลือก “Multiple layers” โปรแกรมจะสร้างให้ตามชั้นหรือช่วงของค่าระดับ (Color band)
  • เลือกฟอนต์ไว้เป็น “Romans” เพราะตัวเลขจะออกมาสวย เลือกความสูงตัวเลขหลัก 2 มม. ตัวทศนิยมจะเป็นตัวห้อยขนาดเล็กกว่า ขนาด 1.5 มม. ไม่หมุนตัวเลข จัดให้ตัวเลขเอียงไปด้านหลัง (Oblique) 15 องศา
  • รูปแบบเครื่องหมายลบ เลือก “Underlineขีดเส้นใต้ล่างตัวเลขหลัก กำหนดจำนวนทศนิยม 1 ตำแหน่ง ไม่แสดงเครื่องหมายจุดทศนิยม
  • จะเขียน point ลงให้ไปด้วย ตั้งชื่อเลเยอร์ “Points
  • เลือกจำนวนจุด (Select point every) ในเบื้องต้นตั้งเป็น 1 สามารถตั้งค่าอื่นได้เช่น ตั้งเป็น 4 ถ้าจุดเรียงกันไป 1,2,3,4,5,6,7,8…. โปรแกรมจะเลือกจุดที่ 1 จุดต่อไปจะเลือกจุดที่ 5 (ทุกๆ 4)
  • ในตอนนี้โปรแกรมจะตั้งค่าปริยาย Automatic color band interval = 5 เมตร ถ้าเปลี่ยนค่าโปรแกรมจะคำนวณให้ใหม่โดยคลิกที่ปุ่มยาวๆ “Apply” ด้านล่าง
  • จะเห็นว่าแบ่งค่าระดับจากมากไปน้อยได้ 10 ระดับ โปรแกรมจะเลือกสีมาให้เช่นกัน 10 สี และตั้งค่าเลเยอร์ตามค่าระดับอีก 10 เลเยอร์

ปั๊มตัวเลขค่าระดับเข้า Autocad

  • ก่อนจะปั๊มตัวเลขเข้า ขอให้เปิดโปรแกรม Autocad  ไว้ก่อน เพราะไม่งั้น Autocad ใช้เวลาเปิดนาน โปรแกรม Spot Fire อาจจะรวน
  • ที่ทูลบาร์คลิกที่ไอคอน Autocad

spotfire_fire_to_acad_icon

  • เมื่อสถานะการส่งจุดครบ 100% ไปที่โปรแกรม Autocad จะเห็นจุดดังรูป

autocad_all_points_cavite

  • ลอง Zoom เข้าไปดูใกล้ๆ จะเห็นว่าจุดแน่น ตัวเลขค่าระดับติดกันเป็นพรืด

dense_points

  • ที่ Options ตรงเลือกจุด (Select point every) เพิ่มจาก  1 เป็น 4 แล้วส่งจุดเข้า Autocad อีกครั้ง เมื่อครบ 100%  ซูมดูอีกครั้ง จะเห็นตัวเลขอยู่ห่างกันพอประมาณ และสีตัวเลขเป็นไปตามช่วงค่าระดับที่ตั้งไว้ ส่วนตัวเลขทับกันตรงที่แนวตัดกัน ต้องอาศัยลบออกด้วยมือครับ

dense_points_level2

  • มาดูถ้าจุดที่ค่าระดับเป็นลบ ผมใช้ไฟล์ข้อมูลอีกไฟล์ ที่มีค่าระดับเป็นลบชัดเจน จะเห็นเครื่องหมายขีดเส้นใต้ตัวเลขหลัก

points_onshore

  • ตรวจสอบเลเยอร์ใน Autocad ที่ Layer properties ว่าโปรแกรมเขียนมาให้ตามที่ต้องการไหม ก็โอเคครับ

Autocad_layers_banding

 

เลือกรูปแบบที่กำหนดไว้แล้ว

  • ในแท็บ “Options” ตรง Annotation style จะมี “User define” ถ้าเลือกตัวนี้ ผู้ใช้จะเป็นคนกำหนดเอง แต่ถ้าเลือก Preset style จะเป็นสไตล์ที่โปรแกรมเตรียมไว้ให้ จะขอกล่าวถึง Preset Style #1 อันเป็นการเขียนเลขน้ำสไตล์กรมเจ้าท่าของไทย ที่มีเอกลักษณ์เฉพาะตัว ตัวเลขจะเอียงไปด้านหลัง 15 องศา ตัวทศนิยมตัวเล็กกว่าแต่จะไม่ห้อย เขียนเสมอกับตัวเลขหลัก จุดทศนิยมใช้เครื่องหมายคอมม่า ที่ขีดตรงๆ ถ้าค่าเป็นลบ จะขีดเส้นใต้เครื่องหมายคอมม่า

spotfire_preset_style_1

  • เลือก  “Preset style #1” แล้วส่งจุดเข้าโปรแกรม Autocad อีกครั้ง ดูตัวเลขสไตล์ของกรมเจ้าท่า สวยงามครับ

points_doh_style

  • หรือตัวเลขติดลบบนฝั่ง เครื่องหมายลบใช้ขีดใต้เครื่องหมายคอมม่า

points_doh_style_onshore

  • ลองทดสอบดู “Preset Style #3” ตัวเลขจะหมุนทวนเข็ม 15 องศา

points_preset_style_3

สรุป

  • Spot Fire เป็นโปรแกรมตัวเล็กๆมาอำนวยความสะดวกในการเขียนตัวเลขค่าระดับ นอกจากใช้งานทางน้ำเป็นพิเศษ ผมว่าก็ดัดแปลงใช้งานบกได้ถ้าต้องการ สำหรับรุ่นต่อไปผมจะเขียนให้สามารถบันทึกไฟล์เป็น DXF ได้โดยไม่ต้องพึ่ง Autocad มากเกินไป โปรแกรมนี้ก็ยังแจกฟรีเหมือนเดิม นำไปใช้งานและแจกจ่ายได้ พบกันใหม่ครับ

SpotFire_About

สิ้นสุดการรอคอย XSection Plot รุ่น 4.10 มาแล้ว ตอนที่ 3 (จบ)

10.การจัดเรียงรูปตัดบนกระดาษเขียนแบบ (Page Layout)

  • การจัดเรียงรูปตัด เลือกทูลบาร์และคลิกที่ “Page layout” ได้ดังรูป

page_layout_toolbar

  • ความยาวของรูปตัดแต่ละรูปตัด ความกว้างในแนวดิ่ง มาตราส่วน จะมีผลต่อขนาดของรูปตัดแต่ละรูป ที่่จะวางบนกระดาษเขียนแบบ  การจัดเรียงรูปตัดให้เหมาะสม ผู้ใช้สามารถเลือกจำนวนรูปตัดในแนวดิ่ง จำนวนรูปตัดในแนวนอน ลองตั้งค่าตามรูปด้านล่าง เนื่องจากข้อมูลที่เรากำลังทดลองใช้งานอยู่มี 4 รูปตัดและความกว้างของรูปตัดประมาณ 1300 เมตร จึงยาวจรดกระดาษซ้ายขวา จำนวนรูปตัดในแนวดิ่งจึงเลือกเป็น 1 ส่วนจำนวนรูปตัดในแนวนอนเลือกเป็น 4

page_layout_1

  • มาดูตั้งค่าให้กริดทางราบ จัดระยะราบจาก CL (ค่าที่ X = 0) ไปด้านซ้าย ตั้งไว้ 700 เมตร เผื่อยาวเกินกว่าข้อมูลไว้นิดหนึ่งไม่ให้รูปตัดไปชน ด้านขวาตั้งไว้ 650 เมตร ส่วนระยะราบของกริดแต่ละช่อง(grid spacing) เลือกไว้ 10 เมตร

page_layout_2

  • มาดูการตั้งกริดทางดิ่ง ผมตั้งไว้ 21 เมตร ระยะของช่องกริดทางดิ่ง (มาตราส่วน 1:200) 1 เมตร ดูรูปกราฟฟิคที่ลากลูกศรเชื่อมโยงด้านล่างเพื่อความเข้าใจ และตั้งระยะของช่องกริดทางดิ่ง 1 เมตร

page_layout_3

  • เวลาเปลี่ยนค่า ต้องกปุ่ม “Apply” เพื่อโปรแกรมจะได้จัดวางรูปตัดให้ใหม่ ถ้ารูปตัดทับซ้อนกันโปรแกรมจะเตือนให้ทราบ ผมเตรียมไอคอนบนทูลบาร์ด้านบน เพื่อ  copy ค่าพิกัดของรูปตัดเมื่อเทียบกับค่าพิกัดของกระดาษ มุมล่างซ้าย x,y = 0,0 หน่วยเป็น ซม.ครับ เมื่อคลิกที่ไอคอน โปรแกรมจะคัดลอกค่าพิกัดลงไปตารางข้อมูล จากนั้นคลิก “OK” เพื่อปิดหน้าต่างไดอะล็อก

page_layout_coors

  • บันทึกไฟล์ข้อมูลลงดิสค์ ให้เรียบร้อย

11.แสดงรูปตัดตามขวาง (Section Viewer)

  • ในที่สุดก็มาดูรูปตัดที่เราตั้งค่าไว้ ว่าตรงตามที่ต้องการหรือไม่ ที่ทูลบาร์ คลิก “Section Viewer”

section_viewer_toolbar

  • จะเห็นรูปตัดตามขวางแสดงผลมาให้ดูแต่ละ section ซึ่งจะเริ่มจาก section แรกก่อน ดังรูปด้านล่าง การขยาย ย่อ แผนที่ทำได้โดยการ scroll เมาส์ปุ่มกลางครับง่ายๆ ส่วนการเลื่อนแผนที่คลิกกดปุ่มกลางของเมาส์แล้วลาก

section_viewer_elements

  • ค่าที่เราตั้งค่าสำหรับรูปตัดไว้ก่อนหน้านี้ เช่นค่าระดับกริดเส้นบน (Top grid elevation) หรือไม่รูปแบบการเขียนตัวเลข จะส่งผลต่อรูปตัด พิจารณาดูรูปด้านล่างที่แสดงเส้นลูกศรเชื่อมโยง

section_viewer_shown_topgrid_int

  • ส่วนค่าอื่นๆเช่นตั้งค่าให้คำนวณหาพื้นที่ดินตัด (cut) หรือดินถม (fill) หรือหาจุดตัดระหว่าง typical  และเส้นดินเดิม

section_viewer_shown_calcarea_interval

  • สังเกตรูปตัดด้านบนจะเห็นว่าตัวรูปตัดตกจากเส้นกริดลงมาด้านล่างเนื่องจากค่าระดับกริดเส้นบนใส่ค่ามากไป จากที่โปรแกรมคำนวณมาให้ ลองกลับไปตั้งค่าใหม่จาก 6 เมตร เป็น 4 เมตร จะเห็นว่ารูปตัดเลื่อนขึ้นไปอยู่ในกริด แต่เส้น existing ground ล้นกริดด้านบนไปแทน ซึ่งสามารถ trim ออกได้ในโปรแกรมด้าน CAD ในภายหลัง

section_viewer_shown_new_topgrid_elev

  • นอกจากนี้เมื่อเลื่อนเมาส์ไปยังพื้นที่ดินตัดหรือดินถม โปรแกรมจะแสดงผล interactive ตรงพื้นที่รูปตัดจะสว่างขึ้นช่วยให้ผู้ใช้เห็นพื้นที่ได้ชัดเจน

section_viewer_interactive

  • ลองคลิกที่ลูกศรเพื่อขยับไปดูรูปตัดถัดไป เสร็จแล้วจะออกจากการแสดงผลก็คลิกที่ไอคอน รูปประตู

section_viewer_next_prev12.บันทึกไฟล์ Autocad DXF (Save to DXF)

  • เมื่อตั้งค่ารูปตัดทั้งหลายจนเป็นที่พอใจ กระบวนการสุดท้ายที่ต้องการคือ แผนที่แสดงรูปตัดตามขวาง ที่สามารถส่งงานกันได้ ซึ่งจะใช้โปรแกรมอะไรด้าน CAD ความสามารถโปรแกรมเหล่านี้คือสามารถอ่านเขียนไฟล์ฟอร์แม็ต dxf ได้เพราะเจ้าของคือ Autodesk เปิดเป็นสาธารณะ ที่ทูลบาร์เลือกคลิก “Save to DXF

save_to_dxf_toolbar

  • โปรแกรมจะแสดงไดอะล็อก คลิกที่รูปไอคอนรูปดิสเก็ตเพื่อเลือกโฟลเดอร์ที่จะจัดเก็บตลอดทั้งป้อนชื่อไฟล์ทึ่จะบันทึกเป็น dxf ดังรูป

save_to_dxf_inputfile

  • เมื่อเสร็จสิ้นโปรแกรมจะขึ้น message box ว่าจัดเก็บเรียบร้อย คลิก “OK” และ “Close” เพื่อปิด

save_to_dxf_ready

13.เปิดไฟล์ด้วยโปรแกรมด้าน CAD

  • โปรแกรมด้าน CAD ขนาดเล็กๆ เขียนแบบ 2มิติ ใช้งานได้ฟรีขอแนะนำ Draftsight ดาวน์โหลด ติดตั้งแล้วลงทะเบียนก็พร้อมใช้งาน ใช้งานง่ายสะดวกครับ (ยังมีรุ่นเสียตังค์ซื้อด้วย ถ้าต้องการ) ลองเปิดไฟล์ dxf ที่บันทึกเก็บไว้จะเห็นผลงานออกมาดังรูป

draftsight2d-first

  • จะเห็นว่าตัว hatch สำหรับพื้นที่ดินตัด ดินถม ทึบสนิท ทั้งๆที่ผมตั้ง scale ของแฮ็ทช์ไว้ 1.0 ปัญหาไม่ใช่ของ Draftsight แต่มาจากไฟล์ dxf ซึ่งผมคิดว่าน่าจะเป็นไลบรารีเขียน dxf ที่ผมใช้งานอยู่คือ ezdxf แต่ไม่เป็นไรวิธีแก้กลับคือไปคลิกเลือก hatch ทุก section ที่ property มองหา scale เจอแล้วจะเห็นตัวเลข 1.000 ป้อนค่าใหม่เป็น 10.000 (หรืออะไรก็ได้) จากนั้นป้อนกลับไปค่าเดิมอีกครั้งเป็น 1.000 เหมือนเดิม จะเห็น hatch เปลี่ยนเป็นโปร่งขึ้น
  • ปัญหา hatch นี้เปิดใน Autocad ก็เป็นครับ

 

draftsight2d-hatch_ok

  • ผมลองเปิดข้อมูลเก่าที่ Titleblock เป็นภาษาไทย ลองดูก็ใช้ได้บน Draftsight สำหรับ Draftsight แบบสองมิติ อ่านดูในเน็ตเห็นว่ารุ่นนี้ฟรี (แต่ต้องลงทะเบียน ซึ่งง่ายๆ ถามไม่กี่คำถาม) แต่ก็ไม่แน่ใจว่าฟรีไปตลอดหรือไม่ ซึ่งก็น่าใช้งานมากครับถ้าฟรีตลอด สำหรับท่านที่ใช้งานแคด ที่ไม่ได้มีงานสามมิติเข้ามาเกี่ยวข้อง ดีกว่าไปละเมิดลิขสิทธิ์

draftsight2d_thai_ok

สรุป

  • โปรแกรมนี้ใช้เวลาพัฒนาประมาณ 2 ปีกว่าๆ แต่ไม่ได้ต่อเนื่องนะครับ เนื่องจากเขียนเป็นงานอดิเรก ไม่มีความกดดันอะไร ถือว่าเป็นการศึกษาด้านโปรแกรมมิ่งในตัวโดยเฉพาะ python เขียนสนุก กระชับ ทรงพลัง มีแง่บางอย่างที่นึกไม่ถึงว่าภาษาสามารถทำได้ และที่สำคัญมีไลบรารีหรือโมดูลให้ใช้มากมาย ส่วนใหญ่ฟรี เมื่อมารวมกับ Qt framework ที่เก่งอยู่แล้ว โปรแกรมที่เขียนออกมาแล้วจึงดูเป็นมืออาชีพพอสมควร แต่ก็แจ้งเตือนก่อนว่าโปรแกรม XSection Plot รุ่นนี้ยังมีบั๊กอยู่บ้าง ถ้าพบก็แจ้งมาได้ที่ blog นี้
  • เกือบลืมบอกไป โปรแกรมนี้สนับสนุนจอ 4K เรียบร้อยแล้ว ไม่มีปัญหาเรื่องไอคอนเล็ก ตัวหนังสือเล็ก

xsectionplot_about

  • ก่อนจากกันก็ขอบอกว่าโปรแกรมทุกโปรแกรมที่ผมพัฒนาขึ้นมายังคง concept เหมือนเดิมคือให้ใช้ฟรี และสำหรับช่างสำรวจและช่างโยธา เหมือนเดิมครับ

สิ้นสุดการรอคอย XSection Plot รุ่น 4.10 มาแล้ว ตอนที่ 2

6.เปิดไฟล์ข้อมูล (Open file)

  • ขั้นตอนต่อไปจะมาเปิดไฟล์ข้อมูล เริ่มจากไฟล์ Typical section ที่จัดเก็บไว้ใน Documents ขั้นตอนตามรูปด้านล่าง ขั้นตอนที่ 3 เลือกประเภทของไฟล์เป็น .txml โปรแกรมจะอ่านข้อมูล และแสดงผลบนตารางในแท็บ “Typical section”

open_typical_section_file

  • ต่อไปเช่นเดียวกันเปิดไฟล์ Existing Ground section

open_ground_section_file

7.ป้อนข้อมูลโครงการ

  • ตอนนี้ข้อมูลของเราที่ได้จาก import  จาก text file มีแต่รูปตัดในตารางเท่านั้น เราจะทำการบันทึกข้อมูลโครงการของงาน นอกจากบันทึกเพื่อจำแล้วยังสามารถนำไปเขียนเป็น Titleblock ใน Autocad คลิกที่ Toolbar ดังรูปด้านล่างedit_titleblock
  • จะเห็นหน้าต่างไดอะล็อกให้ป้อนข้อมูล ถ้ามีข้อมูลอะไรให้ลบออกหมด เนื่องจากโปรแกรมจะบันทึกสถานะครั้งสุดท้ายที่ใช้เอาไว้set_project_info_procedure
  • ป้อนข้อมูลโครงการเข้าไป (ข้อมูลมาจากการสำรวจจริง แต่ชื่อโครงการ บริษัท ชื่อคน สมมุติหมด)

set_project_info_filled

เลือกภาษาให้  Titleblock

  • ที่ผมเตรียมไว้ให้มีภาษาไทยกับอังกฤษเท่านั้น ถ้าต้องการใช้ภาษาไทยก็คลิกตามรูป

set_project_info_locale

8.ตั้งขนาดกระดาษสำหรับเขียนแบบ (Page Setup)

  • สำหรับงานเขียนแบบใน Autocad แล้วขนาดกระดาษที่เราใช้มักจะเป็นขนาดกระดาษมาตรฐานได้แก่ A4, A3, A2, A1 และ A0 ขึ้นอยู่กับขนาด printer หรือ plotter ที่ใช้ด้วย ที่ทูลบาร์หลักคลิกที่ “Page Setup”

page_setup_toolbar

  • จะมีหน้าต่างไดอะล๊อกให้เลือกตั้งขนาดกระดาษ (ขนาดกระดาษกำหนดโดยผู้ใช้  Custom Paper Size โปรแกรมตอนนี้ยังไม่ support) เลือก A1 ดังรูป

page_setup

9.ตั้งค่ารูปตัด (Cross-section settings)

  • รูปแบบรูปตัดเช่นการเลือกมาตราส่วนทางราบและทางดิ่งให้ตรงกับความต้องการ การจัดรูปแบบตัวอักษร ค่า x,y (offset/elevation) หรือการตั้งจำนวนทศนิยม สามารถตั้งค่าได้ที่นี่ จากทูลบาร์หลักเลือก “Xsection Settings” ดังรูป

section_settings_toolbarตั้งค่าทั่วไป

  • จะเห็นหน้าต่างไดอะล็อก มีแท็บทั้งหมด 4 แท็บ แยกค่าที่จะตั้งเป็นสัดส่วน มาดูหน้าแรกสำหรับตั้งค่ารูปตัดทั่วๆไป

section_settings_page1_desc

  • ข้อสังเกตรูปตัดจะเห็นว่าใช้มาตราส่วนทางราบ 1 : 2000 คิดง่ายๆ ในแผนที่วัดได้ 1 มม. = ระยะจริงในสนามได้ 2 เมตร หรือในแผนที่วัดได 1 ซม. เท่ากับระยะจริงในสนาม 20 เมตร ขนาดกระดาษ A1 594 x 871 มม. แต่ขนาดที่ปริ๊นท์ได้เท่ากับ 517 x 817 มม. ถ้าวางกระดาษในแนวนอน (landscape) ความยาวคร่าวๆคือ 800 มม. สามารถเขียนแบบรูปตัดตามขวางได้เท่ากับระยะในสนาม = 2 x 800 เมตร = 1600 เมตร
  • ถ้ากลับไปดูข้อมูลในตารางจะเห็นว่าจากซ้ายไปขวาประมาณ 1300 เมตร ซึ่งกระดาษ A1 และมาตราส่วนนี้สามารถเขียนแบบได้โดยที่ไม่ล้นกระดาษ

ตั้งค่ารูปแบบตารางแสดงตัวเลข offset/elevation

  • จากหน้าต่างไดอะล็อก คลิกที่แท็บที่ 2 เลือกรูปแบบแสดงตัวเลข  offset/elevation  จาก 3 รูปแบบที่มีรูปตัวอย่างแสดงไว้ให้เห็นง่ายๆ ที่นี้ผมเลือก  Type 3 ดังรูปด้านล่าง

section_settings_page2_desc

ตั้งค่าตัวหนังสือคำหน้า/ตามหลัง ค่าระดับ datum

  •  ที่หน้าต่างไดอะล็อกคลิกที่แท็บตัวที่ 3 “Grid datum postfix/prefix” เลือกแบบที่สาม เขียนตัวหนังสือ CD (Chard Datum)  ตามหลังค่าระดับ 0.0  บางครั้งงานทางทะเลจะระบุว่าค่า 0.0 เมตร อิงอยู่กับอะไรเช่นน้ำทะเลปานกลาง (MSL) หรือ Chart Datum (CD)

section_settings_page3_desc

 ตั้งค่าระดับเส้นกริด

  • เป็นการตั้งค่าระดับเส้นกริดตัวบนสุด ปรับได้ตามต้องการเพื่อให้รูปตัดอยู่กลางๆรูปตัด จะได้ดูง่าย ไม่อึดอัด

section_settings_page4_desc

  • แต่ก็สามารถเลือกตั้งได้อัตโนมัติโดยโปรแกรม ดูรูปด้านล่างประกอบ เมื่อเสร็จสิ้นการตั้งค่ารูปตัด สามารถคลิกปุ่ม “OK” เพื่อออกจากไดอะล็อก

section_settings_page4_auto

  • ต่อไปบันทึกข้อมูลลงไฟล์ ที่เราแก้ไขตั้งค่ารูปตัด โปรแกรมจะเก็บค่าทั้งหลายเอาไว้ในไฟล์ Existing ground section รวมทั้งข้อมูล offset/elevation ในตารางทุก  section
  • ก่อนจะทำอะไรต่อ ให้คลิกรูปดิสค์เก็ตที่ทูลบาร์ เพื่อบันทึกข้อมูลลงดิสค์ โลกสวยด้วยมือเราครับ

เปิดดูไฟล์ข้อมูล

  • ลองเปิดไฟล์ข้อมูลด้วยโปรแกรมเช่น  Notepad, Notepad++  จะเห็นข้อมูลดังข้างล่าง (คลิกที่สี่เหลี่ยมลิ๊งค์ด้านล่าง เพื่อขยายออกมา)
&lt;root version="1.0"&gt;
&lt;!--Generated by XSection Plot--&gt;
&lt;!--This data file is Existing ground section--&gt;
&lt;Header&gt;
&lt;AppName&gt;XSection Plot&lt;/AppName&gt;
&lt;Developer&gt;Prajuab Riabroy&lt;/Developer&gt;
&lt;Version&gt;4.1.512&lt;/Version&gt;
&lt;SectionType&gt;Ground&lt;/SectionType&gt;
&lt;DateCreated&gt;2016-08-15 21:09:30.751163&lt;/DateCreated&gt;
&lt;/Header&gt;
&lt;ProjectInfo&gt;
&lt;ProjectName&gt;Macuzy International Port&lt;/ProjectName&gt;
&lt;ClientName&gt;MX Port Authority&lt;/ClientName&gt;
&lt;ContractorName&gt;East West Construction &amp;amp; Engineering&lt;/ContractorName&gt;
&lt;DrawingTitle&gt;X-Section of Approach Channel&lt;/DrawingTitle&gt;
&lt;DrawnName&gt;Sergio Motezia&lt;/DrawnName&gt;
&lt;ApprovedName&gt;Prati Wisas&lt;/ApprovedName&gt;
&lt;ClientApprovedName&gt;Mario P. Tenes&lt;/ClientApprovedName&gt;
&lt;CheckedName&gt;Antonio Molibzo&lt;/CheckedName&gt;
&lt;SurveyorName&gt;Suras Malcom&lt;/SurveyorName&gt;
&lt;SurveyedDate&gt;1-7/03/2016&lt;/SurveyedDate&gt;
&lt;DrawingNo&gt;2017-MZ-001-PLN-020&lt;/DrawingNo&gt;
&lt;SheetNo&gt;1 / 50&lt;/SheetNo&gt;
&lt;DrawingDate&gt;1-7/03/2016&lt;/DrawingDate&gt;
&lt;Revision&gt;&lt;/Revision&gt;
&lt;UseLocaleLanguage&gt;False&lt;/UseLocaleLanguage&gt;
&lt;MapTexts&gt;
&lt;MapText Label="Client" Locale="เจ้าของโครงการ"/&gt;
&lt;MapText Label="Contractor" Locale="ผู้รับจ้าง"/&gt;
&lt;MapText Label="Drawn" Locale="เขียน"/&gt;
&lt;MapText Label="Design" Locale="ออกแบบ"/&gt;
&lt;MapText Label="Surveyor" Locale="ผู้สำรวจ"/&gt;
&lt;MapText Label="Surveyed Date" Locale="วันที่สำรวจ"/&gt;
&lt;MapText Label="Checked" Locale="ตรวจสอบ"/&gt;
&lt;MapText Label="Approved" Locale="อนุมัติ"/&gt;
&lt;MapText Label="Client Approved" Locale="ผู้คุมงานอนุมัติ"/&gt;
&lt;MapText Label="Drawing No." Locale="แบบเลขที่"/&gt;
&lt;MapText Label="Plotted Date" Locale="แบบวันที่"/&gt;
&lt;MapText Label="Project" Locale="โครงการ"/&gt;
&lt;MapText Label="Drawing Title" Locale="แผนที่แสดง"/&gt;
&lt;MapText Label="Sheet No." Locale="แบบเลขที่"/&gt;
&lt;MapText Label="Scale" Locale="มาตราส่วน"/&gt;
&lt;MapText Label="Vertical" Locale="ทางดิ่ง"/&gt;
&lt;MapText Label="Horizontal" Locale="ทางราบ"/&gt;
&lt;MapText Label="Vertical Scale" Locale="มาตราส่วนทางดิ่ง"/&gt;
&lt;MapText Label="Horizontal Scale" Locale="มาตราส่วนทางราบ"/&gt;
&lt;MapText Label="Legend" Locale="สัญลักษณ์"/&gt;
&lt;MapText Label="Note" Locale="หมายเหตุ"/&gt;
&lt;MapText Label="Geodetic Information" Locale="ข้อมูลระบบพิกัด"/&gt;
&lt;MapText Label="No." Locale="ครั้งที่"/&gt;
&lt;MapText Label="Amendments" Locale="ความเห็น"/&gt;
&lt;MapText Label="By" Locale="โดย"/&gt;
&lt;MapText Label="Date" Locale="วันที่"/&gt;
&lt;MapText Label="Revision" Locale="ครั้งที่แก้ไข"/&gt;
&lt;/MapTexts&gt;
&lt;/ProjectInfo&gt;
&lt;SectionOptions&gt;
&lt;VerticalScale&gt;200.0&lt;/VerticalScale&gt;
&lt;HorizontalScale&gt;2000.0&lt;/HorizontalScale&gt;
&lt;HozGridSpace&gt;10.0&lt;/HozGridSpace&gt;
&lt;VertGridSpace&gt;1.0&lt;/VertGridSpace&gt;
&lt;GridLineType&gt;0&lt;/GridLineType&gt;
&lt;CalcIntersection&gt;True&lt;/CalcIntersection&gt;
&lt;CalcArea&gt;True&lt;/CalcArea&gt;
&lt;TrimTypical&gt;False&lt;/TrimTypical&gt;
&lt;NumDecimalElev&gt;3&lt;/NumDecimalElev&gt;
&lt;NumDecimalDist&gt;3&lt;/NumDecimalDist&gt;
&lt;UseIntervalText&gt;True&lt;/UseIntervalText&gt;
&lt;IntervalDist&gt;20.0&lt;/IntervalDist&gt;
&lt;PrefixText&gt;&lt;/PrefixText&gt;
&lt;PostfixText&gt;CD&lt;/PostfixText&gt;
&lt;UsePostPrefix&gt;0&lt;/UsePostPrefix&gt;
&lt;UseOffsetElevFormat&gt;2&lt;/UseOffsetElevFormat&gt;
&lt;CalcPlotAreaCut&gt;True&lt;/CalcPlotAreaCut&gt;
&lt;CalcPlotAreaFill&gt;True&lt;/CalcPlotAreaFill&gt;
&lt;NumVertCLLeft&gt;70&lt;/NumVertCLLeft&gt;
&lt;NumVertCLRight&gt;65&lt;/NumVertCLRight&gt;
&lt;NumHozTopBottom&gt;21&lt;/NumHozTopBottom&gt;
&lt;LeftSideText&gt;LT.&lt;/LeftSideText&gt;
&lt;RightSideText&gt;RT.&lt;/RightSideText&gt;
&lt;StationText&gt;Km.&lt;/StationText&gt;
&lt;SelectedTBlock&gt;2&lt;/SelectedTBlock&gt;
&lt;NumSectionRows&gt;4&lt;/NumSectionRows&gt;
&lt;NumSectionColumns&gt;1&lt;/NumSectionColumns&gt;
&lt;SurveyType&gt;0&lt;/SurveyType&gt;
&lt;PlotTBlock&gt;True&lt;/PlotTBlock&gt;
&lt;SwapLeftAndRight&gt;False&lt;/SwapLeftAndRight&gt;
&lt;/SectionOptions&gt;
&lt;PageSetup&gt;
&lt;Size&gt;A1&lt;/Size&gt;
&lt;Width&gt;817&lt;/Width&gt;
&lt;Height&gt;570&lt;/Height&gt;
&lt;/PageSetup&gt;
&lt;Sections&gt;
&lt;NumSections&gt;4&lt;/NumSections&gt;
&lt;Section Name="-0+078"&gt;
&lt;XPositionOnPaper&gt;0.0&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;0.0&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;94&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="5.696" Offset="-600.0"/&gt;
&lt;Point Elevation="5.693" Offset="-596.305"/&gt;
&lt;Point Elevation="5.337" Offset="-587.506"/&gt;
&lt;Point Elevation="2.271" Offset="-526.489"/&gt;
&lt;Point Elevation="0.579" Offset="-507.151"/&gt;
&lt;Point Elevation="-1.19" Offset="-490.954"/&gt;
&lt;Point Elevation="-2.314" Offset="-471.14"/&gt;
&lt;Point Elevation="-2.766" Offset="-462.616"/&gt;
&lt;Point Elevation="-2.875" Offset="-457.815"/&gt;
&lt;Point Elevation="-3.6" Offset="-434.419"/&gt;
&lt;Point Elevation="-4.104" Offset="-414.736"/&gt;
&lt;Point Elevation="-4.128" Offset="-406.659"/&gt;
&lt;Point Elevation="-4.356" Offset="-380.964"/&gt;
&lt;Point Elevation="-4.382" Offset="-376.491"/&gt;
&lt;Point Elevation="-4.406" Offset="-375.215"/&gt;
&lt;Point Elevation="-4.989" Offset="-349.559"/&gt;
&lt;Point Elevation="-5.161" Offset="-338.86"/&gt;
&lt;Point Elevation="-5.347" Offset="-322.669"/&gt;
&lt;Point Elevation="-5.812" Offset="-302.883"/&gt;
&lt;Point Elevation="-5.942" Offset="-297.584"/&gt;
&lt;Point Elevation="-6.148" Offset="-283.939"/&gt;
&lt;Point Elevation="-6.342" Offset="-272.05"/&gt;
&lt;Point Elevation="-6.387" Offset="-267.862"/&gt;
&lt;Point Elevation="-6.733" Offset="-246.07"/&gt;
&lt;Point Elevation="-7.111" Offset="-231.836"/&gt;
&lt;Point Elevation="-7.372" Offset="-217.745"/&gt;
&lt;Point Elevation="-7.824" Offset="-194.494"/&gt;
&lt;Point Elevation="-7.882" Offset="-191.371"/&gt;
&lt;Point Elevation="-7.834" Offset="-183.933"/&gt;
&lt;Point Elevation="-7.668" Offset="-165.389"/&gt;
&lt;Point Elevation="-8.54" Offset="-139.979"/&gt;
&lt;Point Elevation="-8.98" Offset="-123.408"/&gt;
&lt;Point Elevation="-9.255" Offset="-115.989"/&gt;
&lt;Point Elevation="-9.487" Offset="-93.719"/&gt;
&lt;Point Elevation="-9.566" Offset="-88.009"/&gt;
&lt;Point Elevation="-9.732" Offset="-85.635"/&gt;
&lt;Point Elevation="-11.591" Offset="-57.803"/&gt;
&lt;Point Elevation="-11.779" Offset="-43.322"/&gt;
&lt;Point Elevation="-11.967" Offset="-27.782"/&gt;
&lt;Point Elevation="-11.928" Offset="-5.492"/&gt;
&lt;Point Elevation="-11.967" Offset="-1.247"/&gt;
&lt;Point Elevation="-12.16" Offset="11.274"/&gt;
&lt;Point Elevation="-12.318" Offset="20.29"/&gt;
&lt;Point Elevation="-12.301" Offset="22.958"/&gt;
&lt;Point Elevation="-12.249" Offset="39.553"/&gt;
&lt;Point Elevation="-12.303" Offset="48.517"/&gt;
&lt;Point Elevation="-12.25" Offset="59.398"/&gt;
&lt;Point Elevation="-12.081" Offset="76.972"/&gt;
&lt;Point Elevation="-12.057" Offset="79.758"/&gt;
&lt;Point Elevation="-12.02" Offset="83.034"/&gt;
&lt;Point Elevation="-11.703" Offset="98.323"/&gt;
&lt;Point Elevation="-11.569" Offset="104.196"/&gt;
&lt;Point Elevation="-11.562" Offset="105.697"/&gt;
&lt;Point Elevation="-11.365" Offset="116.141"/&gt;
&lt;Point Elevation="-11.25" Offset="117.347"/&gt;
&lt;Point Elevation="-10.732" Offset="135.54"/&gt;
&lt;Point Elevation="-10.625" Offset="146.227"/&gt;
&lt;Point Elevation="-10.077" Offset="158.793"/&gt;
&lt;Point Elevation="-8.681" Offset="177.76"/&gt;
&lt;Point Elevation="-8.592" Offset="181.044"/&gt;
&lt;Point Elevation="-8.401" Offset="194.035"/&gt;
&lt;Point Elevation="-8.271" Offset="203.535"/&gt;
&lt;Point Elevation="-7.923" Offset="213.249"/&gt;
&lt;Point Elevation="-7.728" Offset="217.373"/&gt;
&lt;Point Elevation="-7.095" Offset="235.24"/&gt;
&lt;Point Elevation="-6.982" Offset="241.693"/&gt;
&lt;Point Elevation="-6.682" Offset="247.206"/&gt;
&lt;Point Elevation="-6.075" Offset="256.627"/&gt;
&lt;Point Elevation="-5.455" Offset="278.481"/&gt;
&lt;Point Elevation="-5.337" Offset="282.26"/&gt;
&lt;Point Elevation="-5.042" Offset="294.845"/&gt;
&lt;Point Elevation="-5.019" Offset="295.988"/&gt;
&lt;Point Elevation="-4.347" Offset="321.161"/&gt;
&lt;Point Elevation="-4.189" Offset="329.073"/&gt;
&lt;Point Elevation="-3.808" Offset="348.654"/&gt;
&lt;Point Elevation="-3.664" Offset="355.277"/&gt;
&lt;Point Elevation="-3.317" Offset="372.887"/&gt;
&lt;Point Elevation="-3.154" Offset="382.261"/&gt;
&lt;Point Elevation="-2.776" Offset="410.279"/&gt;
&lt;Point Elevation="-2.765" Offset="410.995"/&gt;
&lt;Point Elevation="-2.704" Offset="413.887"/&gt;
&lt;Point Elevation="-2.197" Offset="439.138"/&gt;
&lt;Point Elevation="-1.967" Offset="448.435"/&gt;
&lt;Point Elevation="-1.716" Offset="464.705"/&gt;
&lt;Point Elevation="-1.481" Offset="485.302"/&gt;
&lt;Point Elevation="-1.403" Offset="489.714"/&gt;
&lt;Point Elevation="-1.251" Offset="498.925"/&gt;
&lt;Point Elevation="-0.928" Offset="517.874"/&gt;
&lt;Point Elevation="-0.799" Offset="529.258"/&gt;
&lt;Point Elevation="-0.604" Offset="548.73"/&gt;
&lt;Point Elevation="-1.169" Offset="576.146"/&gt;
&lt;Point Elevation="-1.18" Offset="579.205"/&gt;
&lt;Point Elevation="-1.305" Offset="585.252"/&gt;
&lt;Point Elevation="-1.468" Offset="600.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="0+172"&gt;
&lt;XPositionOnPaper&gt;0.0&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;0.0&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;104&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="4.21" Offset="-600.0"/&gt;
&lt;Point Elevation="3.865" Offset="-590.197"/&gt;
&lt;Point Elevation="3.192" Offset="-572.372"/&gt;
&lt;Point Elevation="1.492" Offset="-534.461"/&gt;
&lt;Point Elevation="-1.278" Offset="-510.761"/&gt;
&lt;Point Elevation="-1.773" Offset="-506.708"/&gt;
&lt;Point Elevation="-2.262" Offset="-496.208"/&gt;
&lt;Point Elevation="-3.027" Offset="-480.587"/&gt;
&lt;Point Elevation="-3.26" Offset="-473.089"/&gt;
&lt;Point Elevation="-4.034" Offset="-454.61"/&gt;
&lt;Point Elevation="-4.281" Offset="-430.868"/&gt;
&lt;Point Elevation="-4.355" Offset="-425.789"/&gt;
&lt;Point Elevation="-4.35" Offset="-412.009"/&gt;
&lt;Point Elevation="-4.367" Offset="-398.744"/&gt;
&lt;Point Elevation="-4.437" Offset="-394.505"/&gt;
&lt;Point Elevation="-4.911" Offset="-371.013"/&gt;
&lt;Point Elevation="-5.369" Offset="-344.896"/&gt;
&lt;Point Elevation="-5.909" Offset="-321.896"/&gt;
&lt;Point Elevation="-5.972" Offset="-318.479"/&gt;
&lt;Point Elevation="-6.203" Offset="-307.947"/&gt;
&lt;Point Elevation="-6.559" Offset="-290.298"/&gt;
&lt;Point Elevation="-6.742" Offset="-282.919"/&gt;
&lt;Point Elevation="-7.278" Offset="-261.654"/&gt;
&lt;Point Elevation="-7.19" Offset="-241.456"/&gt;
&lt;Point Elevation="-7.206" Offset="-234.351"/&gt;
&lt;Point Elevation="-7.744" Offset="-212.894"/&gt;
&lt;Point Elevation="-7.972" Offset="-205.898"/&gt;
&lt;Point Elevation="-8.011" Offset="-204.056"/&gt;
&lt;Point Elevation="-8.937" Offset="-181.613"/&gt;
&lt;Point Elevation="-9.613" Offset="-169.45"/&gt;
&lt;Point Elevation="-10.568" Offset="-155.252"/&gt;
&lt;Point Elevation="-11.306" Offset="-139.728"/&gt;
&lt;Point Elevation="-11.435" Offset="-136.455"/&gt;
&lt;Point Elevation="-11.67" Offset="-122.543"/&gt;
&lt;Point Elevation="-11.836" Offset="-115.516"/&gt;
&lt;Point Elevation="-11.845" Offset="-113.826"/&gt;
&lt;Point Elevation="-12.223" Offset="-102.969"/&gt;
&lt;Point Elevation="-12.219" Offset="-100.525"/&gt;
&lt;Point Elevation="-12.572" Offset="-83.796"/&gt;
&lt;Point Elevation="-12.666" Offset="-73.185"/&gt;
&lt;Point Elevation="-12.605" Offset="-61.703"/&gt;
&lt;Point Elevation="-12.379" Offset="-44.437"/&gt;
&lt;Point Elevation="-12.45" Offset="-41.849"/&gt;
&lt;Point Elevation="-12.273" Offset="-20.661"/&gt;
&lt;Point Elevation="-12.271" Offset="-15.995"/&gt;
&lt;Point Elevation="-12.279" Offset="-14.536"/&gt;
&lt;Point Elevation="-12.193" Offset="7.86"/&gt;
&lt;Point Elevation="-12.049" Offset="12.127"/&gt;
&lt;Point Elevation="-11.97" Offset="26.792"/&gt;
&lt;Point Elevation="-11.482" Offset="39.803"/&gt;
&lt;Point Elevation="-11.428" Offset="47.755"/&gt;
&lt;Point Elevation="-11.244" Offset="53.548"/&gt;
&lt;Point Elevation="-10.805" Offset="70.223"/&gt;
&lt;Point Elevation="-10.718" Offset="74.57"/&gt;
&lt;Point Elevation="-10.702" Offset="75.913"/&gt;
&lt;Point Elevation="-10.087" Offset="96.66"/&gt;
&lt;Point Elevation="-9.799" Offset="103.819"/&gt;
&lt;Point Elevation="-9.63" Offset="112.183"/&gt;
&lt;Point Elevation="-9.234" Offset="126.254"/&gt;
&lt;Point Elevation="-8.999" Offset="137.384"/&gt;
&lt;Point Elevation="-8.476" Offset="159.55"/&gt;
&lt;Point Elevation="-8.445" Offset="160.778"/&gt;
&lt;Point Elevation="-8.271" Offset="164.407"/&gt;
&lt;Point Elevation="-7.259" Offset="184.045"/&gt;
&lt;Point Elevation="-7.127" Offset="189.256"/&gt;
&lt;Point Elevation="-6.92" Offset="198.448"/&gt;
&lt;Point Elevation="-6.48" Offset="207.958"/&gt;
&lt;Point Elevation="-6.04" Offset="221.897"/&gt;
&lt;Point Elevation="-5.474" Offset="242.469"/&gt;
&lt;Point Elevation="-5.364" Offset="247.769"/&gt;
&lt;Point Elevation="-5.253" Offset="251.096"/&gt;
&lt;Point Elevation="-4.998" Offset="265.24"/&gt;
&lt;Point Elevation="-4.818" Offset="275.102"/&gt;
&lt;Point Elevation="-4.715" Offset="277.979"/&gt;
&lt;Point Elevation="-4.027" Offset="298.699"/&gt;
&lt;Point Elevation="-3.738" Offset="309.727"/&gt;
&lt;Point Elevation="-3.575" Offset="322.408"/&gt;
&lt;Point Elevation="-3.105" Offset="340.851"/&gt;
&lt;Point Elevation="-2.937" Offset="346.115"/&gt;
&lt;Point Elevation="-2.855" Offset="359.315"/&gt;
&lt;Point Elevation="-2.833" Offset="366.127"/&gt;
&lt;Point Elevation="-2.816" Offset="367.498"/&gt;
&lt;Point Elevation="-2.675" Offset="385.31"/&gt;
&lt;Point Elevation="-2.596" Offset="391.895"/&gt;
&lt;Point Elevation="-2.673" Offset="406.1"/&gt;
&lt;Point Elevation="-2.465" Offset="418.482"/&gt;
&lt;Point Elevation="-2.516" Offset="427.315"/&gt;
&lt;Point Elevation="-2.328" Offset="445.356"/&gt;
&lt;Point Elevation="-2.337" Offset="446.342"/&gt;
&lt;Point Elevation="-2.626" Offset="452.604"/&gt;
&lt;Point Elevation="-3.486" Offset="470.977"/&gt;
&lt;Point Elevation="-3.693" Offset="476.912"/&gt;
&lt;Point Elevation="-3.777" Offset="496.074"/&gt;
&lt;Point Elevation="-3.932" Offset="501.72"/&gt;
&lt;Point Elevation="-4.018" Offset="513.362"/&gt;
&lt;Point Elevation="-3.474" Offset="529.259"/&gt;
&lt;Point Elevation="-3.265" Offset="532.878"/&gt;
&lt;Point Elevation="-2.893" Offset="543.264"/&gt;
&lt;Point Elevation="-2.834" Offset="544.691"/&gt;
&lt;Point Elevation="-2.372" Offset="551.966"/&gt;
&lt;Point Elevation="-1.374" Offset="568.651"/&gt;
&lt;Point Elevation="-1.184" Offset="572.608"/&gt;
&lt;Point Elevation="-0.9" Offset="589.873"/&gt;
&lt;Point Elevation="-0.265" Offset="600.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="0+422"&gt;
&lt;XPositionOnPaper&gt;0.0&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;0.0&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;98&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="2.527" Offset="-600.0"/&gt;
&lt;Point Elevation="1.923" Offset="-583.886"/&gt;
&lt;Point Elevation="1.147" Offset="-573.7"/&gt;
&lt;Point Elevation="0.148" Offset="-560.844"/&gt;
&lt;Point Elevation="-1.561" Offset="-534.717"/&gt;
&lt;Point Elevation="-1.604" Offset="-534.134"/&gt;
&lt;Point Elevation="-2.764" Offset="-502.908"/&gt;
&lt;Point Elevation="-3.147" Offset="-490.643"/&gt;
&lt;Point Elevation="-3.634" Offset="-472.527"/&gt;
&lt;Point Elevation="-4.199" Offset="-442.515"/&gt;
&lt;Point Elevation="-4.26" Offset="-440.183"/&gt;
&lt;Point Elevation="-4.353" Offset="-435.493"/&gt;
&lt;Point Elevation="-4.626" Offset="-412.074"/&gt;
&lt;Point Elevation="-4.836" Offset="-400.43"/&gt;
&lt;Point Elevation="-4.963" Offset="-383.964"/&gt;
&lt;Point Elevation="-5.335" Offset="-361.676"/&gt;
&lt;Point Elevation="-5.378" Offset="-357.711"/&gt;
&lt;Point Elevation="-5.461" Offset="-354.483"/&gt;
&lt;Point Elevation="-5.587" Offset="-348.617"/&gt;
&lt;Point Elevation="-6.599" Offset="-306.504"/&gt;
&lt;Point Elevation="-6.923" Offset="-292.309"/&gt;
&lt;Point Elevation="-7.646" Offset="-260.816"/&gt;
&lt;Point Elevation="-7.665" Offset="-260.005"/&gt;
&lt;Point Elevation="-8.267" Offset="-238.897"/&gt;
&lt;Point Elevation="-9.466" Offset="-215.915"/&gt;
&lt;Point Elevation="-9.939" Offset="-205.494"/&gt;
&lt;Point Elevation="-10.636" Offset="-192.184"/&gt;
&lt;Point Elevation="-11.499" Offset="-177.238"/&gt;
&lt;Point Elevation="-11.845" Offset="-170.731"/&gt;
&lt;Point Elevation="-12.281" Offset="-152.944"/&gt;
&lt;Point Elevation="-12.343" Offset="-150.873"/&gt;
&lt;Point Elevation="-12.345" Offset="-150.114"/&gt;
&lt;Point Elevation="-12.485" Offset="-127.286"/&gt;
&lt;Point Elevation="-12.474" Offset="-120.381"/&gt;
&lt;Point Elevation="-12.427" Offset="-111.488"/&gt;
&lt;Point Elevation="-12.447" Offset="-105.883"/&gt;
&lt;Point Elevation="-12.651" Offset="-87.792"/&gt;
&lt;Point Elevation="-12.622" Offset="-78.078"/&gt;
&lt;Point Elevation="-12.53" Offset="-55.591"/&gt;
&lt;Point Elevation="-12.495" Offset="-52.513"/&gt;
&lt;Point Elevation="-12.115" Offset="-31.23"/&gt;
&lt;Point Elevation="-12.009" Offset="-23.783"/&gt;
&lt;Point Elevation="-11.488" Offset="-9.776"/&gt;
&lt;Point Elevation="-11.236" Offset="4.184"/&gt;
&lt;Point Elevation="-10.416" Offset="13.232"/&gt;
&lt;Point Elevation="-10.641" Offset="20.134"/&gt;
&lt;Point Elevation="-10.28" Offset="44.002"/&gt;
&lt;Point Elevation="-10.292" Offset="44.652"/&gt;
&lt;Point Elevation="-10.289" Offset="44.792"/&gt;
&lt;Point Elevation="-10.828" Offset="56.567"/&gt;
&lt;Point Elevation="-10.797" Offset="59.917"/&gt;
&lt;Point Elevation="-10.401" Offset="76.981"/&gt;
&lt;Point Elevation="-10.186" Offset="85.234"/&gt;
&lt;Point Elevation="-10.076" Offset="91.139"/&gt;
&lt;Point Elevation="-9.671" Offset="106.374"/&gt;
&lt;Point Elevation="-9.556" Offset="114.729"/&gt;
&lt;Point Elevation="-9.018" Offset="131.881"/&gt;
&lt;Point Elevation="-8.96" Offset="133.976"/&gt;
&lt;Point Elevation="-8.938" Offset="135.194"/&gt;
&lt;Point Elevation="-8.59" Offset="157.634"/&gt;
&lt;Point Elevation="-8.516" Offset="163.615"/&gt;
&lt;Point Elevation="-8.379" Offset="182.167"/&gt;
&lt;Point Elevation="-8.093" Offset="194.118"/&gt;
&lt;Point Elevation="-7.878" Offset="204.774"/&gt;
&lt;Point Elevation="-7.548" Offset="221.957"/&gt;
&lt;Point Elevation="-7.482" Offset="225.607"/&gt;
&lt;Point Elevation="-7.519" Offset="237.596"/&gt;
&lt;Point Elevation="-7.537" Offset="244.959"/&gt;
&lt;Point Elevation="-7.524" Offset="247.228"/&gt;
&lt;Point Elevation="-7.202" Offset="265.159"/&gt;
&lt;Point Elevation="-6.937" Offset="273.625"/&gt;
&lt;Point Elevation="-6.791" Offset="280.238"/&gt;
&lt;Point Elevation="-6.674" Offset="286.833"/&gt;
&lt;Point Elevation="-6.486" Offset="295.474"/&gt;
&lt;Point Elevation="-6.408" Offset="313.252"/&gt;
&lt;Point Elevation="-6.365" Offset="316.221"/&gt;
&lt;Point Elevation="-6.294" Offset="327.463"/&gt;
&lt;Point Elevation="-6.2" Offset="337.22"/&gt;
&lt;Point Elevation="-6.207" Offset="338.339"/&gt;
&lt;Point Elevation="-5.867" Offset="355.513"/&gt;
&lt;Point Elevation="-5.65" Offset="362.307"/&gt;
&lt;Point Elevation="-5.567" Offset="375.271"/&gt;
&lt;Point Elevation="-5.433" Offset="387.259"/&gt;
&lt;Point Elevation="-5.152" Offset="396.436"/&gt;
&lt;Point Elevation="-4.378" Offset="413.203"/&gt;
&lt;Point Elevation="-4.146" Offset="425.427"/&gt;
&lt;Point Elevation="-4.099" Offset="435.841"/&gt;
&lt;Point Elevation="-3.993" Offset="439.726"/&gt;
&lt;Point Elevation="-3.418" Offset="457.353"/&gt;
&lt;Point Elevation="-2.943" Offset="467.452"/&gt;
&lt;Point Elevation="-2.548" Offset="480.037"/&gt;
&lt;Point Elevation="-1.52" Offset="499.033"/&gt;
&lt;Point Elevation="-1.085" Offset="505.573"/&gt;
&lt;Point Elevation="-0.707" Offset="509.068"/&gt;
&lt;Point Elevation="-0.564" Offset="514.17"/&gt;
&lt;Point Elevation="1.044" Offset="545.131"/&gt;
&lt;Point Elevation="3.671" Offset="586.351"/&gt;
&lt;Point Elevation="4.257" Offset="600.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="0+672"&gt;
&lt;XPositionOnPaper&gt;0.0&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;0.0&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;101&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="0.751" Offset="-600.0"/&gt;
&lt;Point Elevation="0.17" Offset="-590.282"/&gt;
&lt;Point Elevation="-0.185" Offset="-585.509"/&gt;
&lt;Point Elevation="-1.698" Offset="-564.455"/&gt;
&lt;Point Elevation="-2.012" Offset="-556.049"/&gt;
&lt;Point Elevation="-2.541" Offset="-536.428"/&gt;
&lt;Point Elevation="-2.738" Offset="-526.646"/&gt;
&lt;Point Elevation="-3.164" Offset="-510.314"/&gt;
&lt;Point Elevation="-3.581" Offset="-498.217"/&gt;
&lt;Point Elevation="-3.967" Offset="-482.548"/&gt;
&lt;Point Elevation="-4.17" Offset="-466.638"/&gt;
&lt;Point Elevation="-4.63" Offset="-454.111"/&gt;
&lt;Point Elevation="-4.885" Offset="-437.444"/&gt;
&lt;Point Elevation="-4.739" Offset="-426.605"/&gt;
&lt;Point Elevation="-4.755" Offset="-407.163"/&gt;
&lt;Point Elevation="-4.887" Offset="-399.338"/&gt;
&lt;Point Elevation="-5.348" Offset="-377.159"/&gt;
&lt;Point Elevation="-5.455" Offset="-371.865"/&gt;
&lt;Point Elevation="-6.085" Offset="-345.987"/&gt;
&lt;Point Elevation="-6.145" Offset="-343.34"/&gt;
&lt;Point Elevation="-6.428" Offset="-331.877"/&gt;
&lt;Point Elevation="-6.448" Offset="-330.864"/&gt;
&lt;Point Elevation="-7.104" Offset="-309.854"/&gt;
&lt;Point Elevation="-7.356" Offset="-296.783"/&gt;
&lt;Point Elevation="-7.378" Offset="-295.786"/&gt;
&lt;Point Elevation="-8.31" Offset="-272.558"/&gt;
&lt;Point Elevation="-9.344" Offset="-249.668"/&gt;
&lt;Point Elevation="-9.524" Offset="-246.49"/&gt;
&lt;Point Elevation="-10.115" Offset="-236.3"/&gt;
&lt;Point Elevation="-10.351" Offset="-218.394"/&gt;
&lt;Point Elevation="-10.714" Offset="-213.348"/&gt;
&lt;Point Elevation="-11.674" Offset="-204.751"/&gt;
&lt;Point Elevation="-11.699" Offset="-201.381"/&gt;
&lt;Point Elevation="-11.744" Offset="-193.463"/&gt;
&lt;Point Elevation="-12.329" Offset="-178.033"/&gt;
&lt;Point Elevation="-12.592" Offset="-165.284"/&gt;
&lt;Point Elevation="-12.777" Offset="-155.308"/&gt;
&lt;Point Elevation="-12.43" Offset="-144.408"/&gt;
&lt;Point Elevation="-12.528" Offset="-139.081"/&gt;
&lt;Point Elevation="-12.669" Offset="-133.221"/&gt;
&lt;Point Elevation="-12.262" Offset="-121.876"/&gt;
&lt;Point Elevation="-12.13" Offset="-110.999"/&gt;
&lt;Point Elevation="-12.286" Offset="-98.019"/&gt;
&lt;Point Elevation="-12.367" Offset="-89.578"/&gt;
&lt;Point Elevation="-11.654" Offset="-75.025"/&gt;
&lt;Point Elevation="-11.598" Offset="-71.369"/&gt;
&lt;Point Elevation="-12.418" Offset="-63.45"/&gt;
&lt;Point Elevation="-12.586" Offset="-57.395"/&gt;
&lt;Point Elevation="-12.029" Offset="-40.428"/&gt;
&lt;Point Elevation="-11.941" Offset="-37.225"/&gt;
&lt;Point Elevation="-12.05" Offset="-17.903"/&gt;
&lt;Point Elevation="-11.919" Offset="-14.255"/&gt;
&lt;Point Elevation="-10.878" Offset="5.213"/&gt;
&lt;Point Elevation="-10.987" Offset="7.781"/&gt;
&lt;Point Elevation="-12.241" Offset="17.876"/&gt;
&lt;Point Elevation="-12.175" Offset="19.902"/&gt;
&lt;Point Elevation="-12.679" Offset="37.309"/&gt;
&lt;Point Elevation="-12.779" Offset="41.445"/&gt;
&lt;Point Elevation="-12.756" Offset="41.967"/&gt;
&lt;Point Elevation="-12.147" Offset="62.308"/&gt;
&lt;Point Elevation="-12.189" Offset="63.587"/&gt;
&lt;Point Elevation="-11.804" Offset="83.447"/&gt;
&lt;Point Elevation="-11.748" Offset="85.224"/&gt;
&lt;Point Elevation="-11.68" Offset="105.223"/&gt;
&lt;Point Elevation="-11.648" Offset="107.415"/&gt;
&lt;Point Elevation="-11.299" Offset="124.477"/&gt;
&lt;Point Elevation="-11.183" Offset="129.8"/&gt;
&lt;Point Elevation="-10.608" Offset="145.77"/&gt;
&lt;Point Elevation="-10.491" Offset="152.394"/&gt;
&lt;Point Elevation="-10.528" Offset="156.006"/&gt;
&lt;Point Elevation="-10.486" Offset="170.955"/&gt;
&lt;Point Elevation="-10.376" Offset="180.254"/&gt;
&lt;Point Elevation="-10.183" Offset="192.924"/&gt;
&lt;Point Elevation="-10.122" Offset="198.333"/&gt;
&lt;Point Elevation="-9.995" Offset="209.165"/&gt;
&lt;Point Elevation="-9.803" Offset="220.192"/&gt;
&lt;Point Elevation="-9.727" Offset="230.156"/&gt;
&lt;Point Elevation="-9.793" Offset="235.687"/&gt;
&lt;Point Elevation="-9.444" Offset="249.066"/&gt;
&lt;Point Elevation="-9.308" Offset="258.031"/&gt;
&lt;Point Elevation="-9.253" Offset="261.971"/&gt;
&lt;Point Elevation="-8.511" Offset="283.111"/&gt;
&lt;Point Elevation="-8.163" Offset="289.464"/&gt;
&lt;Point Elevation="-7.102" Offset="307.459"/&gt;
&lt;Point Elevation="-6.902" Offset="312.383"/&gt;
&lt;Point Elevation="-6.731" Offset="322.229"/&gt;
&lt;Point Elevation="-6.609" Offset="326.578"/&gt;
&lt;Point Elevation="-6.011" Offset="346.572"/&gt;
&lt;Point Elevation="-5.822" Offset="350.33"/&gt;
&lt;Point Elevation="-4.461" Offset="371.66"/&gt;
&lt;Point Elevation="-4.318" Offset="373.491"/&gt;
&lt;Point Elevation="-1.818" Offset="396.911"/&gt;
&lt;Point Elevation="-1.583" Offset="398.654"/&gt;
&lt;Point Elevation="1.249" Offset="416.959"/&gt;
&lt;Point Elevation="1.897" Offset="437.491"/&gt;
&lt;Point Elevation="3.568" Offset="467.863"/&gt;
&lt;Point Elevation="6.567" Offset="551.744"/&gt;
&lt;Point Elevation="6.606" Offset="552.895"/&gt;
&lt;Point Elevation="6.604" Offset="553.18"/&gt;
&lt;Point Elevation="6.591" Offset="553.868"/&gt;
&lt;Point Elevation="5.965" Offset="600.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;/Sections&gt;
&lt;/root&gt;

จบตอนที่ 2

  • พบกันตอนหน้า ตอนที่ 3 ครับ

ก้าวต่อไปของโปรแกรมเขียนรูปตัดตามขวาง XSection Plot ในร่างใหม่พัฒนาด้วย Python + Qt

ลาก่อน XSection Plot รุ่น 3.25

  • โปรแกรมพล็อทรูปตัดตามขวาง XSection Plot เดิมๆนั้นผมเขียนด้วย Visual Basic 6 ใช้มาเป็นสิบๆปีแล้ว บัดนี้ถึงกาลเวลาที่จะต้องฝังในความทรงจำแล้ว เพราะฟอนต์ที่เคยแสดงผลได้ในวินโดส์ XP กลับกลายเป็นตัวประหลาดในวินโดส์ 7/8 ผมเข้าใจว่าฟอนต์ระบบที่เคยอยู่ในวินโดส์ XP น่าจะเป็นระบบแบบด็อทเมทริก น่าจะถูกถอดออกไปแล้วในวินโดส์ 7/8 จึงแสดงผลแบบอักขระประหลาดอย่างที่เห็นxsectionplot_old1
  • กลับมารื้อโค๊ดเดิมๆดูคร่าวๆ จำนวนบรรทัดหลายหมื่นบรรทัดทีเดียว ประกอบด้วยโมดูลและคลาสจำนวนมาก ออกอาการงงๆเหมือนกัน เพราะเขียนไว้นานแล้วภาษานี้ก็ไม่ได้เขียนนานแล้ว แต่ด้วยความง่ายของภาษา VB ใช้เวลาไม่นานก็รื้อฟื้น

แรงจูงใจในการนำมาพัฒนาใหม่

  • บอกตรงๆว่าทนเห็นโปรแกรมที่เคยใช้ได้ดีตอนอยู่วินโดส์ XP แต่มาล้มหายตายจากพอมาอยู่บนวินโดส์ 7/8 ไม่ได้ และความรู้สีกอยากช่วยผู้ที่ใช้งานโปรแกรมนี้ ในรุ่นเก่าแล้วต้องการย้ายงานมาบนวินโดส์ 7/8

เครื่องมือและสภาพแวดล้อมในการพัฒนา

  • ในตอนนี้ผมศึกษา Python อยู่ วิธีเดียวที่จะให้โปรแกรมมิงแตกฉาน คือลงมือเขียนโปรแกรม ก่อนหน้านี้ผมเริ่มเขียนด้วย Python เป็นเวอร์ชัน 2.7.5 แบบ 32 บิต ใช้ graphic user interface (GUI) ของ wxWidgets รวมๆเรียกว่า wxPython ตัวโปรแกรมที่ผมเขียนเป็นโปรแกรมด้าน GIS ใช้ Mapnik เป็นตัว  GIS Map Engine เขียนจนจบโปรแกรมนำมาใช้งานได้ดีพอสมควร  สำหรับผมแล้ว wxPython ก็โอเคในระดับหนึ่ง แต่ความรู้สึกส่วนตัวว่าค่อนข้างติดๆขัดๆไม่ลื่นไหล (ทัศนส่วนตัว)
  • ตอนหลังๆมาลองติดตั้ง Python 3.4 แล้วก็ลง Qt5 เรียกว่า PyQt5 แบบ 64 บิต ลองศึกษา Qt5 ควบคู่ไปด้วย ปรากฎว่าอันนี้ใช่เลย ตามสไตล์ของไพธ่อนครับ สั้น กระชับ ฉับไว ทรงพลัง ผมลงทุนไม่ดูโค๊ดเก่าที่เป็นวิชวลเบสิคเก่า ใช้เวลายามว่างๆ ลงมือเขียนใหม่ เกือบทั้งหมด
  • สภาพแวดล้อมในการพัฒนาใช้ Eclipse (ดั้งเดิมเป็น platform สำหรับพัฒนา Java) ในขณะที่เขียนอยู่เป็นรุน Luna ในส่วน Eclipse ติดตั้ง Plug-ins เพิ่มเติมคือตัว PyDev เพื่อให้สามารถใช้ Python บน Eclipse ได้ ทุกอย่างที่กล่าวมาฟรีหมดครับ

pydev_eclipse

XSection Plot โฉมใหม่ ไฉไลกว่าเดิม

  • มาดูหน้าตาโฉมใหม่ก็เรียบง่ายดังที่เห็น

xsectionplot_new1

xsectionplot_new2

ออกแบบไฟล์ข้อมูลใหม่ เป็น XML

  • ไฟล์ข้อมูลเดิมของ XSection Plot  รุ่นเก่าเป็นไฟล์ไบนารี ข้อเสีย คือมนุษย์อ่านไม่ออก ผู้ใช้ไม่สามารถเปิดไฟล์มาดูได้โดยตรง  ข้อเสียในแง่คนพัฒนาโปรแกรมคือ ขยายเพิ่มเติมข้อมูลลำบาก ก็เลยหันมามอง XML ที่เกิดมานมนานเป็นสิบๆปีแล้ว สนใจลองกดปุ่มบวกข้างล่างดูลักษณะไฟล์ข้อมูล แต่รุ่นจริงอาจจะมีการเปลี่ยนแปลง
&lt;root version="1.0"&gt;
&lt;!--Generated by XSection Plot--&gt;
&lt;!--This data file is Existing ground section--&gt;
&lt;Header&gt;
&lt;AppName&gt;XSection Plot&lt;/AppName&gt;
&lt;Developer&gt;Prajuab Riabroy&lt;/Developer&gt;
&lt;Version&gt;4.0.512&lt;/Version&gt;
&lt;SectionType&gt;Ground&lt;/SectionType&gt;
&lt;DateCreated&gt;2014-08-07 16:45:56.517701&lt;/DateCreated&gt;
&lt;/Header&gt;
&lt;ProjectInfo&gt;
&lt;ProjectName&gt;KohKong Coal-Fired Power Plant&lt;/ProjectName&gt;
&lt;ClientName&gt;Harbour Department&lt;/ClientName&gt;
&lt;ContractorName&gt;Universal Construction Development PCL.&lt;/ContractorName&gt;
&lt;DrawingTitle&gt;Cross Section of Access Channel&lt;/DrawingTitle&gt;
&lt;DrawnName&gt;DRS&lt;/DrawnName&gt;
&lt;ApprovedName&gt;AS&lt;/ApprovedName&gt;
&lt;ClientApprovedName&gt;AD&lt;/ClientApprovedName&gt;
&lt;CheckedName&gt;PJ&lt;/CheckedName&gt;
&lt;SurveyorName&gt;SK&lt;/SurveyorName&gt;
&lt;SurveyedDate&gt;1-7/03/2010&lt;/SurveyedDate&gt;
&lt;DrawingNo&gt;&lt;/DrawingNo&gt;
&lt;SheetNo&gt;1/&lt;/SheetNo&gt;
&lt;DrawingDate&gt;1-7/03/2010&lt;/DrawingDate&gt;
&lt;Revision&gt;&lt;/Revision&gt;
&lt;UseLocaleLanguage&gt;False&lt;/UseLocaleLanguage&gt;
&lt;MapTexts&gt;
&lt;MapText Label="Client" Locale="เจ้าของโครงการ"/&gt;
&lt;MapText Label="Contractor" Locale="ผู้รับเหมา"/&gt;
&lt;MapText Label="Drawn" Locale="เขียน"/&gt;
&lt;MapText Label="Design" Locale="ออกแบบ"/&gt;
&lt;MapText Label="Surveyor" Locale="สำรวจ"/&gt;
&lt;MapText Label="Surveyed date" Locale="วันที่สำรวจ"/&gt;
&lt;MapText Label="Checked" Locale="ตรวจสอบ"/&gt;
&lt;MapText Label="Approved" Locale="อนุมัติ"/&gt;
&lt;MapText Label="Client approved" Locale="ผู้คุมงานอนุมัติ"/&gt;
&lt;MapText Label="Drawing No." Locale="แบบเลขที่"/&gt;
&lt;MapText Label="Drawing date" Locale="แบบวันที่"/&gt;
&lt;MapText Label="Project title" Locale="โครงการ"/&gt;
&lt;MapText Label="Drawing title" Locale="แผนที่แสดง"/&gt;
&lt;MapText Label="Sheet No." Locale="แบบเลขที่"/&gt;
&lt;MapText Label="Scale" Locale="มาตราส่วน"/&gt;
&lt;MapText Label="Vertical" Locale="ทางดิ่ง"/&gt;
&lt;MapText Label="Horizontal" Locale="ทางราบ"/&gt;
&lt;MapText Label="Vertical scale" Locale="มาตราส่วนทางดิ่ง"/&gt;
&lt;MapText Label="Horizontal scale" Locale="มาตราส่วนทางราบ"/&gt;
&lt;MapText Label="Legend" Locale="สัญลักษณ์"/&gt;
&lt;MapText Label="Notes" Locale="หมายเหตุ"/&gt;
&lt;MapText Label="Geodetic Information" Locale="ข้อมูลทางยีออเดซี"/&gt;
&lt;MapText Label="No" Locale="ครั้งที่"/&gt;
&lt;MapText Label="Amendments" Locale="ความเห็น"/&gt;
&lt;MapText Label="By" Locale="โดย"/&gt;
&lt;MapText Label="Date" Locale="วันที่"/&gt;
&lt;MapText Label="Revision" Locale="ครั้งที่แก้ไข"/&gt;
&lt;/MapTexts&gt;
&lt;/ProjectInfo&gt;
&lt;SectionOptions&gt;
&lt;VerticalScale&gt;250.0&lt;/VerticalScale&gt;
&lt;HorizontalScale&gt;2500.0&lt;/HorizontalScale&gt;
&lt;HozGridSpace&gt;25.0&lt;/HozGridSpace&gt;
&lt;VertGridSpace&gt;2.0&lt;/VertGridSpace&gt;
&lt;GridLineType&gt;1&lt;/GridLineType&gt;
&lt;CalcIntersection&gt;-1&lt;/CalcIntersection&gt;
&lt;CalcArea&gt;-1&lt;/CalcArea&gt;
&lt;TrimTypical&gt;0&lt;/TrimTypical&gt;
&lt;NumDecimalElev&gt;3&lt;/NumDecimalElev&gt;
&lt;NumDecimalDist&gt;3&lt;/NumDecimalDist&gt;
&lt;UseIntervalText&gt;-1&lt;/UseIntervalText&gt;
&lt;IntervalDist&gt;25.0&lt;/IntervalDist&gt;
&lt;PrefixText&gt;&lt;/PrefixText&gt;
&lt;PostfixText&gt;&lt;/PostfixText&gt;
&lt;UsePostPrefix&gt;0&lt;/UsePostPrefix&gt;
&lt;UseOffsetElevFormat&gt;2&lt;/UseOffsetElevFormat&gt;
&lt;CalcPlotAreaCut&gt;0&lt;/CalcPlotAreaCut&gt;
&lt;CalcPlotAreaFill&gt;0&lt;/CalcPlotAreaFill&gt;
&lt;NumVertCLLeft&gt;18&lt;/NumVertCLLeft&gt;
&lt;NumVertCLRight&gt;18&lt;/NumVertCLRight&gt;
&lt;NumHozTopBottom&gt;8&lt;/NumHozTopBottom&gt;
&lt;LeftSideText&gt;LT.&lt;/LeftSideText&gt;
&lt;RightSideText&gt;RT.&lt;/RightSideText&gt;
&lt;StationText&gt;Km.&lt;/StationText&gt;
&lt;SelectedTBlock&gt;3&lt;/SelectedTBlock&gt;
&lt;NumSectionRows&gt;6&lt;/NumSectionRows&gt;
&lt;NumSectionColumns&gt;2&lt;/NumSectionColumns&gt;
&lt;SurveyType&gt;0&lt;/SurveyType&gt;
&lt;PlotTBlock&gt;-1&lt;/PlotTBlock&gt;
&lt;SwapLeftAndRight&gt;0&lt;/SwapLeftAndRight&gt;
&lt;/SectionOptions&gt;
&lt;PageSetup&gt;
&lt;PaperSize&gt;A1&lt;/PaperSize&gt;
&lt;PageWidth&gt;-999&lt;/PageWidth&gt;
&lt;PaperHeight&gt;-999&lt;/PaperHeight&gt;
&lt;/PageSetup&gt;
&lt;Sections&gt;
&lt;NumSections&gt;12&lt;/NumSections&gt;
&lt;Section Name="2 + 000"&gt;
&lt;XPositionOnPaper&gt;51.66&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;21.18&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;37&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-13.75" Offset="-450.0"/&gt;
&lt;Point Elevation="-13.724" Offset="-444.229"/&gt;
&lt;Point Elevation="-13.453" Offset="-394.64"/&gt;
&lt;Point Elevation="-13.708" Offset="-357.293"/&gt;
&lt;Point Elevation="-13.832" Offset="-340.678"/&gt;
&lt;Point Elevation="-13.815" Offset="-321.128"/&gt;
&lt;Point Elevation="-13.812" Offset="-303.689"/&gt;
&lt;Point Elevation="-13.817" Offset="-263.4"/&gt;
&lt;Point Elevation="-13.795" Offset="-256.48"/&gt;
&lt;Point Elevation="-13.774" Offset="-237.844"/&gt;
&lt;Point Elevation="-13.725" Offset="-215.868"/&gt;
&lt;Point Elevation="-13.694" Offset="-179.238"/&gt;
&lt;Point Elevation="-13.694" Offset="-146.471"/&gt;
&lt;Point Elevation="-13.641" Offset="-126.792"/&gt;
&lt;Point Elevation="-13.651" Offset="-77.938"/&gt;
&lt;Point Elevation="-13.577" Offset="-68.628"/&gt;
&lt;Point Elevation="-13.573" Offset="-67.035"/&gt;
&lt;Point Elevation="-13.578" Offset="-57.508"/&gt;
&lt;Point Elevation="-13.545" Offset="-14.98"/&gt;
&lt;Point Elevation="-13.551" Offset="-2.388"/&gt;
&lt;Point Elevation="-13.569" Offset="19.95"/&gt;
&lt;Point Elevation="-13.553" Offset="64.032"/&gt;
&lt;Point Elevation="-13.541" Offset="72.772"/&gt;
&lt;Point Elevation="-13.516" Offset="81.096"/&gt;
&lt;Point Elevation="-13.614" Offset="138.343"/&gt;
&lt;Point Elevation="-13.629" Offset="150.271"/&gt;
&lt;Point Elevation="-13.556" Offset="198.013"/&gt;
&lt;Point Elevation="-13.557" Offset="211.934"/&gt;
&lt;Point Elevation="-13.577" Offset="254.983"/&gt;
&lt;Point Elevation="-13.624" Offset="269.121"/&gt;
&lt;Point Elevation="-13.736" Offset="298.975"/&gt;
&lt;Point Elevation="-13.717" Offset="339.278"/&gt;
&lt;Point Elevation="-13.679" Offset="356.86"/&gt;
&lt;Point Elevation="-13.497" Offset="383.249"/&gt;
&lt;Point Elevation="-13.423" Offset="405.804"/&gt;
&lt;Point Elevation="-13.548" Offset="442.413"/&gt;
&lt;Point Elevation="-13.59" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 050"&gt;
&lt;XPositionOnPaper&gt;42.78&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;21.18&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;37&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-13.587" Offset="-450.0"/&gt;
&lt;Point Elevation="-13.564" Offset="-431.93"/&gt;
&lt;Point Elevation="-13.389" Offset="-392.416"/&gt;
&lt;Point Elevation="-13.59" Offset="-363.705"/&gt;
&lt;Point Elevation="-13.714" Offset="-349.243"/&gt;
&lt;Point Elevation="-13.648" Offset="-319.939"/&gt;
&lt;Point Elevation="-13.613" Offset="-305.319"/&gt;
&lt;Point Elevation="-13.836" Offset="-245.696"/&gt;
&lt;Point Elevation="-13.833" Offset="-244.203"/&gt;
&lt;Point Elevation="-13.656" Offset="-200.692"/&gt;
&lt;Point Elevation="-13.608" Offset="-176.25"/&gt;
&lt;Point Elevation="-13.525" Offset="-143.894"/&gt;
&lt;Point Elevation="-13.552" Offset="-129.046"/&gt;
&lt;Point Elevation="-13.527" Offset="-96.253"/&gt;
&lt;Point Elevation="-13.656" Offset="-54.905"/&gt;
&lt;Point Elevation="-13.654" Offset="-53.835"/&gt;
&lt;Point Elevation="-13.566" Offset="-45.158"/&gt;
&lt;Point Elevation="-13.591" Offset="-20.343"/&gt;
&lt;Point Elevation="-13.567" Offset="-0.305"/&gt;
&lt;Point Elevation="-13.438" Offset="26.667"/&gt;
&lt;Point Elevation="-13.397" Offset="59.524"/&gt;
&lt;Point Elevation="-13.375" Offset="70.237"/&gt;
&lt;Point Elevation="-13.38" Offset="77.772"/&gt;
&lt;Point Elevation="-13.49" Offset="115.256"/&gt;
&lt;Point Elevation="-13.6" Offset="156.486"/&gt;
&lt;Point Elevation="-13.475" Offset="180.904"/&gt;
&lt;Point Elevation="-13.453" Offset="188.472"/&gt;
&lt;Point Elevation="-13.454" Offset="203.878"/&gt;
&lt;Point Elevation="-13.471" Offset="256.873"/&gt;
&lt;Point Elevation="-13.554" Offset="276.218"/&gt;
&lt;Point Elevation="-13.604" Offset="294.693"/&gt;
&lt;Point Elevation="-13.63" Offset="328.866"/&gt;
&lt;Point Elevation="-13.63" Offset="355.449"/&gt;
&lt;Point Elevation="-13.502" Offset="374.332"/&gt;
&lt;Point Elevation="-13.316" Offset="406.895"/&gt;
&lt;Point Elevation="-13.486" Offset="441.986"/&gt;
&lt;Point Elevation="-13.52" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 100"&gt;
&lt;XPositionOnPaper&gt;33.89&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;21.18&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;38&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-13.478" Offset="-450.0"/&gt;
&lt;Point Elevation="-13.468" Offset="-424.977"/&gt;
&lt;Point Elevation="-13.401" Offset="-404.422"/&gt;
&lt;Point Elevation="-13.463" Offset="-387.405"/&gt;
&lt;Point Elevation="-13.633" Offset="-344.262"/&gt;
&lt;Point Elevation="-13.608" Offset="-339.036"/&gt;
&lt;Point Elevation="-13.494" Offset="-305.986"/&gt;
&lt;Point Elevation="-13.552" Offset="-274.196"/&gt;
&lt;Point Elevation="-13.555" Offset="-259.655"/&gt;
&lt;Point Elevation="-13.555" Offset="-237.91"/&gt;
&lt;Point Elevation="-13.486" Offset="-192.39"/&gt;
&lt;Point Elevation="-13.35" Offset="-155.4"/&gt;
&lt;Point Elevation="-13.323" Offset="-145.491"/&gt;
&lt;Point Elevation="-13.288" Offset="-86.808"/&gt;
&lt;Point Elevation="-13.275" Offset="-58.314"/&gt;
&lt;Point Elevation="-13.286" Offset="-56.712"/&gt;
&lt;Point Elevation="-13.511" Offset="-44.626"/&gt;
&lt;Point Elevation="-13.477" Offset="-19.724"/&gt;
&lt;Point Elevation="-13.435" Offset="-1.021"/&gt;
&lt;Point Elevation="-13.385" Offset="20.078"/&gt;
&lt;Point Elevation="-13.354" Offset="48.949"/&gt;
&lt;Point Elevation="-13.322" Offset="58.859"/&gt;
&lt;Point Elevation="-13.309" Offset="73.917"/&gt;
&lt;Point Elevation="-13.431" Offset="135.063"/&gt;
&lt;Point Elevation="-13.512" Offset="161.041"/&gt;
&lt;Point Elevation="-13.36" Offset="170.629"/&gt;
&lt;Point Elevation="-13.285" Offset="176.557"/&gt;
&lt;Point Elevation="-13.303" Offset="252.984"/&gt;
&lt;Point Elevation="-13.309" Offset="261.078"/&gt;
&lt;Point Elevation="-13.349" Offset="269.352"/&gt;
&lt;Point Elevation="-13.442" Offset="286.219"/&gt;
&lt;Point Elevation="-13.451" Offset="289.018"/&gt;
&lt;Point Elevation="-13.454" Offset="295.508"/&gt;
&lt;Point Elevation="-13.381" Offset="357.63"/&gt;
&lt;Point Elevation="-13.291" Offset="397.562"/&gt;
&lt;Point Elevation="-13.265" Offset="410.885"/&gt;
&lt;Point Elevation="-13.291" Offset="415.854"/&gt;
&lt;Point Elevation="-13.436" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 150"&gt;
&lt;XPositionOnPaper&gt;25.01&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;21.18&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;36&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-13.42" Offset="-450.0"/&gt;
&lt;Point Elevation="-13.422" Offset="-448.815"/&gt;
&lt;Point Elevation="-13.36" Offset="-407.76"/&gt;
&lt;Point Elevation="-13.421" Offset="-383.018"/&gt;
&lt;Point Elevation="-13.466" Offset="-343.431"/&gt;
&lt;Point Elevation="-13.477" Offset="-330.434"/&gt;
&lt;Point Elevation="-13.426" Offset="-308.725"/&gt;
&lt;Point Elevation="-13.339" Offset="-248.217"/&gt;
&lt;Point Elevation="-13.318" Offset="-227.42"/&gt;
&lt;Point Elevation="-13.346" Offset="-185.203"/&gt;
&lt;Point Elevation="-13.22" Offset="-153.307"/&gt;
&lt;Point Elevation="-13.204" Offset="-149.805"/&gt;
&lt;Point Elevation="-13.299" Offset="-109.743"/&gt;
&lt;Point Elevation="-13.355" Offset="-76.976"/&gt;
&lt;Point Elevation="-13.291" Offset="-70.628"/&gt;
&lt;Point Elevation="-13.2" Offset="-57.454"/&gt;
&lt;Point Elevation="-13.217" Offset="-40.497"/&gt;
&lt;Point Elevation="-13.27" Offset="-5.497"/&gt;
&lt;Point Elevation="-13.298" Offset="42.337"/&gt;
&lt;Point Elevation="-13.313" Offset="57.83"/&gt;
&lt;Point Elevation="-13.306" Offset="58.86"/&gt;
&lt;Point Elevation="-13.119" Offset="66.396"/&gt;
&lt;Point Elevation="-13.147" Offset="99.813"/&gt;
&lt;Point Elevation="-13.307" Offset="160.186"/&gt;
&lt;Point Elevation="-13.248" Offset="169.925"/&gt;
&lt;Point Elevation="-13.135" Offset="176.817"/&gt;
&lt;Point Elevation="-13.233" Offset="220.607"/&gt;
&lt;Point Elevation="-13.302" Offset="256.981"/&gt;
&lt;Point Elevation="-13.362" Offset="268.584"/&gt;
&lt;Point Elevation="-13.398" Offset="285.574"/&gt;
&lt;Point Elevation="-13.254" Offset="344.07"/&gt;
&lt;Point Elevation="-13.228" Offset="357.109"/&gt;
&lt;Point Elevation="-13.214" Offset="363.701"/&gt;
&lt;Point Elevation="-13.071" Offset="408.839"/&gt;
&lt;Point Elevation="-13.195" Offset="427.653"/&gt;
&lt;Point Elevation="-13.336" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 200"&gt;
&lt;XPositionOnPaper&gt;16.13&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;21.18&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;34&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-13.299" Offset="-450.0"/&gt;
&lt;Point Elevation="-13.244" Offset="-436.225"/&gt;
&lt;Point Elevation="-13.11" Offset="-404.037"/&gt;
&lt;Point Elevation="-13.219" Offset="-363.07"/&gt;
&lt;Point Elevation="-13.268" Offset="-346.98"/&gt;
&lt;Point Elevation="-13.241" Offset="-317.712"/&gt;
&lt;Point Elevation="-13.227" Offset="-310.438"/&gt;
&lt;Point Elevation="-13.238" Offset="-280.224"/&gt;
&lt;Point Elevation="-13.258" Offset="-255.553"/&gt;
&lt;Point Elevation="-13.299" Offset="-211.447"/&gt;
&lt;Point Elevation="-13.297" Offset="-203.957"/&gt;
&lt;Point Elevation="-13.325" Offset="-143.444"/&gt;
&lt;Point Elevation="-13.182" Offset="-96.867"/&gt;
&lt;Point Elevation="-13.167" Offset="-71.842"/&gt;
&lt;Point Elevation="-13.173" Offset="-66.961"/&gt;
&lt;Point Elevation="-13.161" Offset="-63.511"/&gt;
&lt;Point Elevation="-13.105" Offset="-25.008"/&gt;
&lt;Point Elevation="-13.095" Offset="-1.821"/&gt;
&lt;Point Elevation="-13.263" Offset="45.687"/&gt;
&lt;Point Elevation="-13.267" Offset="49.066"/&gt;
&lt;Point Elevation="-13.264" Offset="49.467"/&gt;
&lt;Point Elevation="-13.074" Offset="66.884"/&gt;
&lt;Point Elevation="-13.11" Offset="161.015"/&gt;
&lt;Point Elevation="-13.061" Offset="165.896"/&gt;
&lt;Point Elevation="-13.022" Offset="174.39"/&gt;
&lt;Point Elevation="-13.136" Offset="236.021"/&gt;
&lt;Point Elevation="-13.157" Offset="249.355"/&gt;
&lt;Point Elevation="-13.194" Offset="259.713"/&gt;
&lt;Point Elevation="-13.265" Offset="285.85"/&gt;
&lt;Point Elevation="-13.251" Offset="296.83"/&gt;
&lt;Point Elevation="-13.145" Offset="348.582"/&gt;
&lt;Point Elevation="-13.023" Offset="386.699"/&gt;
&lt;Point Elevation="-12.918" Offset="410.555"/&gt;
&lt;Point Elevation="-13.122" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 250"&gt;
&lt;XPositionOnPaper&gt;7.24&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;21.18&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;35&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-13.141" Offset="-450.0"/&gt;
&lt;Point Elevation="-13.135" Offset="-427.089"/&gt;
&lt;Point Elevation="-13.116" Offset="-408.612"/&gt;
&lt;Point Elevation="-13.158" Offset="-378.649"/&gt;
&lt;Point Elevation="-13.208" Offset="-347.778"/&gt;
&lt;Point Elevation="-13.103" Offset="-300.077"/&gt;
&lt;Point Elevation="-13.082" Offset="-258.336"/&gt;
&lt;Point Elevation="-13.043" Offset="-232.005"/&gt;
&lt;Point Elevation="-13.019" Offset="-212.37"/&gt;
&lt;Point Elevation="-13.039" Offset="-193.983"/&gt;
&lt;Point Elevation="-13.092" Offset="-151.651"/&gt;
&lt;Point Elevation="-13.105" Offset="-143.345"/&gt;
&lt;Point Elevation="-13.093" Offset="-121.002"/&gt;
&lt;Point Elevation="-13.082" Offset="-74.012"/&gt;
&lt;Point Elevation="-13.072" Offset="-70.704"/&gt;
&lt;Point Elevation="-12.939" Offset="-61.159"/&gt;
&lt;Point Elevation="-12.878" Offset="-54.908"/&gt;
&lt;Point Elevation="-13.036" Offset="-16.297"/&gt;
&lt;Point Elevation="-12.959" Offset="13.485"/&gt;
&lt;Point Elevation="-13.014" Offset="34.515"/&gt;
&lt;Point Elevation="-13.016" Offset="41.274"/&gt;
&lt;Point Elevation="-12.881" Offset="73.456"/&gt;
&lt;Point Elevation="-12.997" Offset="132.919"/&gt;
&lt;Point Elevation="-13.083" Offset="160.722"/&gt;
&lt;Point Elevation="-12.971" Offset="167.25"/&gt;
&lt;Point Elevation="-12.897" Offset="174.705"/&gt;
&lt;Point Elevation="-12.973" Offset="224.215"/&gt;
&lt;Point Elevation="-13.039" Offset="247.5"/&gt;
&lt;Point Elevation="-12.997" Offset="275.574"/&gt;
&lt;Point Elevation="-12.965" Offset="306.485"/&gt;
&lt;Point Elevation="-12.954" Offset="335.878"/&gt;
&lt;Point Elevation="-12.932" Offset="347.275"/&gt;
&lt;Point Elevation="-12.763" Offset="408.665"/&gt;
&lt;Point Elevation="-12.844" Offset="430.348"/&gt;
&lt;Point Elevation="-12.93" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 300"&gt;
&lt;XPositionOnPaper&gt;51.66&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;62.03&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;34&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-13.074" Offset="-450.0"/&gt;
&lt;Point Elevation="-12.945" Offset="-417.015"/&gt;
&lt;Point Elevation="-12.941" Offset="-415.185"/&gt;
&lt;Point Elevation="-13.024" Offset="-341.605"/&gt;
&lt;Point Elevation="-13.123" Offset="-294.567"/&gt;
&lt;Point Elevation="-13.107" Offset="-279.439"/&gt;
&lt;Point Elevation="-13.068" Offset="-253.199"/&gt;
&lt;Point Elevation="-13.027" Offset="-222.165"/&gt;
&lt;Point Elevation="-13.007" Offset="-210.839"/&gt;
&lt;Point Elevation="-12.978" Offset="-193.209"/&gt;
&lt;Point Elevation="-12.874" Offset="-146.031"/&gt;
&lt;Point Elevation="-12.947" Offset="-112.293"/&gt;
&lt;Point Elevation="-12.994" Offset="-74.731"/&gt;
&lt;Point Elevation="-12.951" Offset="-56.842"/&gt;
&lt;Point Elevation="-12.941" Offset="-51.044"/&gt;
&lt;Point Elevation="-12.928" Offset="-49.349"/&gt;
&lt;Point Elevation="-12.919" Offset="-41.744"/&gt;
&lt;Point Elevation="-12.857" Offset="-17.072"/&gt;
&lt;Point Elevation="-12.849" Offset="-1.213"/&gt;
&lt;Point Elevation="-12.937" Offset="29.996"/&gt;
&lt;Point Elevation="-12.943" Offset="43.79"/&gt;
&lt;Point Elevation="-12.822" Offset="75.413"/&gt;
&lt;Point Elevation="-12.792" Offset="80.941"/&gt;
&lt;Point Elevation="-12.826" Offset="90.04"/&gt;
&lt;Point Elevation="-13.069" Offset="164.519"/&gt;
&lt;Point Elevation="-12.837" Offset="183.079"/&gt;
&lt;Point Elevation="-12.873" Offset="222.341"/&gt;
&lt;Point Elevation="-12.893" Offset="250.522"/&gt;
&lt;Point Elevation="-12.863" Offset="272.959"/&gt;
&lt;Point Elevation="-12.84" Offset="289.627"/&gt;
&lt;Point Elevation="-12.791" Offset="341.037"/&gt;
&lt;Point Elevation="-12.791" Offset="375.553"/&gt;
&lt;Point Elevation="-12.778" Offset="402.959"/&gt;
&lt;Point Elevation="-12.782" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 350"&gt;
&lt;XPositionOnPaper&gt;42.78&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;62.03&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;35&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-12.783" Offset="-450.0"/&gt;
&lt;Point Elevation="-12.807" Offset="-423.664"/&gt;
&lt;Point Elevation="-12.842" Offset="-402.422"/&gt;
&lt;Point Elevation="-12.834" Offset="-393.811"/&gt;
&lt;Point Elevation="-12.879" Offset="-350.323"/&gt;
&lt;Point Elevation="-12.966" Offset="-318.938"/&gt;
&lt;Point Elevation="-13.011" Offset="-304.688"/&gt;
&lt;Point Elevation="-12.898" Offset="-262.751"/&gt;
&lt;Point Elevation="-12.866" Offset="-244.765"/&gt;
&lt;Point Elevation="-12.876" Offset="-206.942"/&gt;
&lt;Point Elevation="-12.88" Offset="-204.564"/&gt;
&lt;Point Elevation="-12.856" Offset="-158.672"/&gt;
&lt;Point Elevation="-12.786" Offset="-141.587"/&gt;
&lt;Point Elevation="-12.787" Offset="-103.149"/&gt;
&lt;Point Elevation="-12.766" Offset="-91.41"/&gt;
&lt;Point Elevation="-12.779" Offset="-82.894"/&gt;
&lt;Point Elevation="-12.781" Offset="-78.804"/&gt;
&lt;Point Elevation="-12.767" Offset="-58.384"/&gt;
&lt;Point Elevation="-12.765" Offset="-39.14"/&gt;
&lt;Point Elevation="-12.676" Offset="-10.552"/&gt;
&lt;Point Elevation="-12.786" Offset="13.725"/&gt;
&lt;Point Elevation="-12.924" Offset="42.861"/&gt;
&lt;Point Elevation="-12.794" Offset="60.497"/&gt;
&lt;Point Elevation="-12.654" Offset="81.948"/&gt;
&lt;Point Elevation="-12.833" Offset="123.769"/&gt;
&lt;Point Elevation="-12.916" Offset="163.182"/&gt;
&lt;Point Elevation="-12.784" Offset="181.207"/&gt;
&lt;Point Elevation="-12.765" Offset="188.92"/&gt;
&lt;Point Elevation="-12.792" Offset="255.693"/&gt;
&lt;Point Elevation="-12.815" Offset="295.177"/&gt;
&lt;Point Elevation="-12.79" Offset="315.292"/&gt;
&lt;Point Elevation="-12.749" Offset="345.204"/&gt;
&lt;Point Elevation="-12.744" Offset="364.207"/&gt;
&lt;Point Elevation="-12.753" Offset="396.564"/&gt;
&lt;Point Elevation="-12.68" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 400"&gt;
&lt;XPositionOnPaper&gt;33.89&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;62.03&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;36&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-12.776" Offset="-450.0"/&gt;
&lt;Point Elevation="-12.779" Offset="-447.698"/&gt;
&lt;Point Elevation="-12.774" Offset="-434.746"/&gt;
&lt;Point Elevation="-12.716" Offset="-414.286"/&gt;
&lt;Point Elevation="-12.81" Offset="-359.948"/&gt;
&lt;Point Elevation="-12.835" Offset="-352.389"/&gt;
&lt;Point Elevation="-12.834" Offset="-346.592"/&gt;
&lt;Point Elevation="-12.907" Offset="-315.681"/&gt;
&lt;Point Elevation="-12.863" Offset="-285.783"/&gt;
&lt;Point Elevation="-12.746" Offset="-240.545"/&gt;
&lt;Point Elevation="-12.748" Offset="-212.21"/&gt;
&lt;Point Elevation="-12.82" Offset="-189.251"/&gt;
&lt;Point Elevation="-12.715" Offset="-173.517"/&gt;
&lt;Point Elevation="-12.632" Offset="-145.846"/&gt;
&lt;Point Elevation="-12.591" Offset="-106.965"/&gt;
&lt;Point Elevation="-12.571" Offset="-91.109"/&gt;
&lt;Point Elevation="-12.571" Offset="-48.284"/&gt;
&lt;Point Elevation="-12.577" Offset="-45.561"/&gt;
&lt;Point Elevation="-12.599" Offset="-14.411"/&gt;
&lt;Point Elevation="-12.787" Offset="15.841"/&gt;
&lt;Point Elevation="-12.859" Offset="44.469"/&gt;
&lt;Point Elevation="-12.629" Offset="73.752"/&gt;
&lt;Point Elevation="-12.541" Offset="85.843"/&gt;
&lt;Point Elevation="-12.606" Offset="127.261"/&gt;
&lt;Point Elevation="-12.689" Offset="164.56"/&gt;
&lt;Point Elevation="-12.777" Offset="188.004"/&gt;
&lt;Point Elevation="-12.794" Offset="194.282"/&gt;
&lt;Point Elevation="-12.765" Offset="220.036"/&gt;
&lt;Point Elevation="-12.697" Offset="257.027"/&gt;
&lt;Point Elevation="-12.742" Offset="298.261"/&gt;
&lt;Point Elevation="-12.761" Offset="308.727"/&gt;
&lt;Point Elevation="-12.739" Offset="317.584"/&gt;
&lt;Point Elevation="-12.692" Offset="346.633"/&gt;
&lt;Point Elevation="-12.663" Offset="389.2"/&gt;
&lt;Point Elevation="-12.662" Offset="396.811"/&gt;
&lt;Point Elevation="-12.622" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 450"&gt;
&lt;XPositionOnPaper&gt;25.01&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;62.03&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;35&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-12.772" Offset="-450.0"/&gt;
&lt;Point Elevation="-12.779" Offset="-447.895"/&gt;
&lt;Point Elevation="-12.728" Offset="-435.359"/&gt;
&lt;Point Elevation="-12.625" Offset="-419.964"/&gt;
&lt;Point Elevation="-12.671" Offset="-361.947"/&gt;
&lt;Point Elevation="-12.65" Offset="-349.652"/&gt;
&lt;Point Elevation="-12.745" Offset="-323.285"/&gt;
&lt;Point Elevation="-12.881" Offset="-302.461"/&gt;
&lt;Point Elevation="-12.774" Offset="-273.658"/&gt;
&lt;Point Elevation="-12.614" Offset="-241.564"/&gt;
&lt;Point Elevation="-12.923" Offset="-198.167"/&gt;
&lt;Point Elevation="-12.751" Offset="-169.044"/&gt;
&lt;Point Elevation="-12.581" Offset="-144.88"/&gt;
&lt;Point Elevation="-12.616" Offset="-115.712"/&gt;
&lt;Point Elevation="-12.607" Offset="-103.85"/&gt;
&lt;Point Elevation="-12.527" Offset="-58.007"/&gt;
&lt;Point Elevation="-12.522" Offset="-49.404"/&gt;
&lt;Point Elevation="-12.511" Offset="-40.605"/&gt;
&lt;Point Elevation="-12.526" Offset="-7.582"/&gt;
&lt;Point Elevation="-12.637" Offset="44.494"/&gt;
&lt;Point Elevation="-12.638" Offset="46.028"/&gt;
&lt;Point Elevation="-12.336" Offset="98.718"/&gt;
&lt;Point Elevation="-12.345" Offset="101.193"/&gt;
&lt;Point Elevation="-12.764" Offset="162.39"/&gt;
&lt;Point Elevation="-12.66" Offset="204.444"/&gt;
&lt;Point Elevation="-12.627" Offset="229.054"/&gt;
&lt;Point Elevation="-12.548" Offset="258.494"/&gt;
&lt;Point Elevation="-12.644" Offset="293.019"/&gt;
&lt;Point Elevation="-12.669" Offset="307.749"/&gt;
&lt;Point Elevation="-12.618" Offset="321.733"/&gt;
&lt;Point Elevation="-12.477" Offset="351.792"/&gt;
&lt;Point Elevation="-12.529" Offset="375.735"/&gt;
&lt;Point Elevation="-12.545" Offset="385.798"/&gt;
&lt;Point Elevation="-12.574" Offset="415.152"/&gt;
&lt;Point Elevation="-12.621" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 500"&gt;
&lt;XPositionOnPaper&gt;16.13&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;62.03&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;37&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-12.675" Offset="-450.0"/&gt;
&lt;Point Elevation="-12.682" Offset="-448.083"/&gt;
&lt;Point Elevation="-12.672" Offset="-428.342"/&gt;
&lt;Point Elevation="-12.68" Offset="-425.205"/&gt;
&lt;Point Elevation="-12.649" Offset="-408.657"/&gt;
&lt;Point Elevation="-12.507" Offset="-340.077"/&gt;
&lt;Point Elevation="-12.62" Offset="-320.546"/&gt;
&lt;Point Elevation="-12.737" Offset="-293.581"/&gt;
&lt;Point Elevation="-12.521" Offset="-251.753"/&gt;
&lt;Point Elevation="-12.513" Offset="-249.937"/&gt;
&lt;Point Elevation="-12.801" Offset="-216.359"/&gt;
&lt;Point Elevation="-12.653" Offset="-174.972"/&gt;
&lt;Point Elevation="-12.591" Offset="-158.425"/&gt;
&lt;Point Elevation="-12.541" Offset="-144.303"/&gt;
&lt;Point Elevation="-12.614" Offset="-115.444"/&gt;
&lt;Point Elevation="-12.615" Offset="-111.726"/&gt;
&lt;Point Elevation="-12.6" Offset="-104.058"/&gt;
&lt;Point Elevation="-12.415" Offset="-42.364"/&gt;
&lt;Point Elevation="-12.406" Offset="-28.724"/&gt;
&lt;Point Elevation="-12.416" Offset="-1.475"/&gt;
&lt;Point Elevation="-12.36" Offset="38.494"/&gt;
&lt;Point Elevation="-12.353" Offset="52.28"/&gt;
&lt;Point Elevation="-12.321" Offset="63.68"/&gt;
&lt;Point Elevation="-12.198" Offset="112.168"/&gt;
&lt;Point Elevation="-12.383" Offset="139.067"/&gt;
&lt;Point Elevation="-12.577" Offset="161.059"/&gt;
&lt;Point Elevation="-12.541" Offset="188.84"/&gt;
&lt;Point Elevation="-12.454" Offset="213.082"/&gt;
&lt;Point Elevation="-12.385" Offset="256.777"/&gt;
&lt;Point Elevation="-12.375" Offset="261.779"/&gt;
&lt;Point Elevation="-12.415" Offset="269.668"/&gt;
&lt;Point Elevation="-12.639" Offset="309.342"/&gt;
&lt;Point Elevation="-12.483" Offset="329.784"/&gt;
&lt;Point Elevation="-12.337" Offset="352.33"/&gt;
&lt;Point Elevation="-12.37" Offset="365.049"/&gt;
&lt;Point Elevation="-12.507" Offset="423.352"/&gt;
&lt;Point Elevation="-12.597" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;Section Name="2 + 550"&gt;
&lt;XPositionOnPaper&gt;7.24&lt;/XPositionOnPaper&gt;
&lt;YPositionOnPaper&gt;62.03&lt;/YPositionOnPaper&gt;
&lt;TopGridElev&gt;0.0&lt;/TopGridElev&gt;
&lt;NumPoints&gt;40&lt;/NumPoints&gt;
&lt;Points&gt;
&lt;Point Elevation="-12.351" Offset="-450.0"/&gt;
&lt;Point Elevation="-12.346" Offset="-440.604"/&gt;
&lt;Point Elevation="-12.456" Offset="-420.924"/&gt;
&lt;Point Elevation="-12.422" Offset="-356.665"/&gt;
&lt;Point Elevation="-12.436" Offset="-351.476"/&gt;
&lt;Point Elevation="-12.433" Offset="-348.926"/&gt;
&lt;Point Elevation="-12.599" Offset="-305.043"/&gt;
&lt;Point Elevation="-12.617" Offset="-296.42"/&gt;
&lt;Point Elevation="-12.516" Offset="-254.712"/&gt;
&lt;Point Elevation="-12.489" Offset="-238.476"/&gt;
&lt;Point Elevation="-12.648" Offset="-206.205"/&gt;
&lt;Point Elevation="-12.563" Offset="-187.983"/&gt;
&lt;Point Elevation="-12.407" Offset="-147.195"/&gt;
&lt;Point Elevation="-12.453" Offset="-122.034"/&gt;
&lt;Point Elevation="-12.46" Offset="-116.462"/&gt;
&lt;Point Elevation="-12.465" Offset="-115.775"/&gt;
&lt;Point Elevation="-12.453" Offset="-110.426"/&gt;
&lt;Point Elevation="-12.39" Offset="-62.05"/&gt;
&lt;Point Elevation="-12.294" Offset="-40.738"/&gt;
&lt;Point Elevation="-12.318" Offset="-24.44"/&gt;
&lt;Point Elevation="-12.277" Offset="-5.967"/&gt;
&lt;Point Elevation="-12.467" Offset="31.391"/&gt;
&lt;Point Elevation="-12.537" Offset="53.35"/&gt;
&lt;Point Elevation="-12.432" Offset="77.607"/&gt;
&lt;Point Elevation="-12.187" Offset="125.999"/&gt;
&lt;Point Elevation="-12.356" Offset="151.552"/&gt;
&lt;Point Elevation="-12.421" Offset="160.797"/&gt;
&lt;Point Elevation="-12.325" Offset="199.432"/&gt;
&lt;Point Elevation="-12.286" Offset="218.382"/&gt;
&lt;Point Elevation="-12.281" Offset="225.988"/&gt;
&lt;Point Elevation="-12.28" Offset="255.015"/&gt;
&lt;Point Elevation="-12.398" Offset="283.83"/&gt;
&lt;Point Elevation="-12.476" Offset="305.13"/&gt;
&lt;Point Elevation="-12.396" Offset="329.028"/&gt;
&lt;Point Elevation="-12.277" Offset="354.738"/&gt;
&lt;Point Elevation="-12.291" Offset="372.85"/&gt;
&lt;Point Elevation="-12.291" Offset="400.408"/&gt;
&lt;Point Elevation="-12.334" Offset="421.647"/&gt;
&lt;Point Elevation="-12.426" Offset="448.515"/&gt;
&lt;Point Elevation="-12.419" Offset="450.0"/&gt;
&lt;/Points&gt;
&lt;/Section&gt;
&lt;/Sections&gt;
&lt;/root&gt;

ระยะเวลาในการพัฒนา

  • เนื่องจากโปรแกรมไม่ได้ถูกพัฒนาในเชิงพานิชย์ และผมใช้เวลาว่างเป็นงานอดิเรก จึงไม่สามารถกำหนดเวลาที่แน่นอนได้ แต่คาดว่าอย่างน้อยอีกสักครึ่งปี ถึงจะได้ยลโฉมกัน ลองไปรันในลีนุกซ์ก็ไม่มีปัญหา ใช้ดีเหมือนบนวินโดส์ แต่ไปลองบนแมค ภาษาไทยกลับเกิดอาการสระลอย ยังหาวิธีแก้ไขไม่ได้ แต่ยังมีเวลาอีกนานครับ