ก้าวไปอีกหนึ่งก้าวกับ XSection Plot

สวมวิญญานใหม่ด้วย PySide2

หลังจากผมคอมไพล์ XSection Plot ใหม่ด้วยสภาวะแวดล้อมพัฒนาของ Qt5 platform ด้วย PySide2 ผมเปลี่ยนลิขสิทธิ์ของโปรแกรมเดิมที่กำกวมออกมาฟรีสมบูรณ์แบบเหมือนกันกับ Surveyor Pocket Tools สามารถนำไปทำซ้ำแจกจ่ายได้ตามอัธยาศัย แต่ห้ามดัดแปลง ห้ามนำไปจำหน่ายหรือให้เช่า

XSection Plot
Copyright (C) Prajuab Riabroy. All Rights Reserved.

XSection Plot is free for use in any environment, including but not necessarily limited to: personal, academic, commercial, government, business, non-profit, and for-profit. "Free" in the preceding sentence means that there is no cost or charge associated with the installation and use of XSection Plot. 
Permission is hereby granted, free of charge, to any person obtaining a copy of this software (the "Software"), to use the Software without restriction, including the rights to use, copy, publish, and distribute the Software, and to permit persons to whom the Software is furnished to do so.

You may not modify, adapt, rent, lease, loan, sell, or create derivative works based upon the Software or any part thereof. 

The above copyright notice and this permission notice shall be included in all copies of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

แก้ไข bugs

นอกจากย้ายโค้ดมาใช้ PySide2 แล้ว ผมเลยถือโอกาสแก้บั๊กเล็กน้อยไปหลายอย่าง เช่น

  • เวลาคลิกขวาเพื่อเรียกเมนูในช่องป้อนข้อมูล โปรแกรมจะ terminate ทันที
  • ใน Section Layout ตรง Horizontal Grid เมื่อปรับ Distance from CL to left ไปแล้ว โปรแกรมไม่จำค่าใหม่
  • อื่นๆอีกเล็กน้อยประมาณสิบกว่าอย่าง

คอมไพล์และสร้างไฟล์ execute binary ด้วย PyInstaller

ตอนนี้โปรแกรมสนับสนุนทั้ง 32 บิตและ 64 บิต ผมใช้ PyCharm เป็นทูลส์ในการพัฒนา และเลือกได้ว่าจะใช้ 32 บิตหรือ 64 บิต เมื่อโปรแกรม stable แล้ว ก็จะสร้าง execute binary file ด้วย PyInstaller ตามสภาวะแวดล้อม ต้องทำสองครั้ง ครั้งแรก 32 บิตและครั้งที่สอง 64 บิต โดยแต่ละครั้งจะได้ไฟล์ exe, pyd, dll รวมถึงไลบรารีของไพทอนที่เราเรียกใช้ และที่สำคัญคือไลบรารีของ PySide2

ทำไฟล์ Setup ด้วย Inno Setup

ไฟล์ที่ได้จาก PyInstaller ทั้งหมด ผมจะนำมาสร้างไฟล์ Setup ด้วย Inno Setup เพื่อนเก่าที่ใช้กันมานมนาน มีดีเพียงพอที่จะสร้างไฟล์ Setup ได้ง่ายๆ มี options ให้เลือกพอสมควร สุดท้ายจะได้ไฟล์ Setup ที่เป็น Execute file ไฟล์เดียวพร้อมจะนำไปอัพโหลดให้ผู้ใช้นำไปใช้งานได้

ทดสอบโปรแกรมด้วยแบบรูปตัดตามยาว

ผมจะลองทดสอบโปรแกรมจากข้อมูล ความจริง XSection Plot คือโปรแกรมสร้างหรือช่วยเขียนรูปตัดตามขวาง แต่ยังพอเอามาประยุกต์ใช้กับ Long Profile ได้ แต่ไฟล์ข้อมูลส่วนใหญ่จะมีข้อมูลเพียงหนึ่ง Section เท่านั้นจะเริ่มจากไฟล์ข้อมูลของ Existing Ground Section ก่อนครับ ข้อมูลดังในกรอบข้างล่าง สามารถ copy ไป paste ในโปรแกรม text file editor เช่น Notepad ได้จากนั้น save ตั้ง extension เป็น gxml (ตัวอย่างผมตั้งชื่อว่า lake-road.gxml)

<root version="1.0">
  <!--Generated by XSection Plot-->
  <!--This data file is Existing ground section-->
  <Header>
    <AppName>XSection Plot</AppName>
    <Developer>Prajuab Riabroy</Developer>
    <Version>4.1.512</Version>
    <SectionType>Ground</SectionType>
    <DateCreated>2017-11-12 19:24:28.634707</DateCreated>
  </Header>
  <ProjectInfo>
    <ProjectName>Cantonment Lake Road</ProjectName>
    <ClientName></ClientName>
    <ContractorName></ContractorName>
    <DrawingTitle></DrawingTitle>
    <DrawnName></DrawnName>
    <ApprovedName></ApprovedName>
    <ClientApprovedName></ClientApprovedName>
    <CheckedName></CheckedName>
    <SurveyorName></SurveyorName>
    <SurveyedDate></SurveyedDate>
    <DrawingNo></DrawingNo>
    <SheetNo></SheetNo>
    <DrawingDate></DrawingDate>
    <Revision></Revision>
    <UseLocaleLanguage>False</UseLocaleLanguage>
    <MapTexts>
      <MapText Label="Client" Locale="เจ้าของโครงการ"/>
      <MapText Label="Contractor" Locale="ผู้รับจ้าง"/>
      <MapText Label="Drawn" Locale="เขียน"/>
      <MapText Label="Design" Locale="ออกแบบ"/>
      <MapText Label="Surveyor" Locale="ผู้สำรวจ"/>
      <MapText Label="Surveyed Date" Locale="วันที่สำรวจ"/>
      <MapText Label="Checked" Locale="ตรวจสอบ"/>
      <MapText Label="Approved" Locale="อนุมัติ"/>
      <MapText Label="Client Approved" Locale="ผู้คุมงานอนุมัติ"/>
      <MapText Label="Drawing No." Locale="แบบเลขที่"/>
      <MapText Label="Plotted Date" Locale="แบบวันที่"/>
      <MapText Label="Project" Locale="โครงการ"/>
      <MapText Label="Drawing Title" Locale="แผนที่แสดง"/>
      <MapText Label="Sheet No." Locale="แบบเลขที่"/>
      <MapText Label="Scale" Locale="มาตราส่วน"/>
      <MapText Label="Vertical" Locale="ทางดิ่ง"/>
      <MapText Label="Horizontal" Locale="ทางราบ"/>
      <MapText Label="Vertical Scale" Locale="มาตราส่วนทางดิ่ง"/>
      <MapText Label="Horizontal Scale" Locale="มาตราส่วนทางราบ"/>
      <MapText Label="Legend" Locale="สัญลักษณ์"/>
      <MapText Label="Note" Locale="หมายเหตุ"/>
      <MapText Label="Geodetic Information" Locale="ข้อมูลระบบพิกัด"/>
      <MapText Label="No." Locale="ครั้งที่"/>
      <MapText Label="Amendments" Locale="ความเห็น"/>
      <MapText Label="By" Locale="โดย"/>
      <MapText Label="Date" Locale="วันที่"/>
      <MapText Label="Revision" Locale="ครั้งที่แก้ไข"/>
    </MapTexts>
  </ProjectInfo>
  <SectionOptions>
    <VerticalScale>500.0</VerticalScale>
    <HorizontalScale>1000.0</HorizontalScale>
    <HozGridSpace>10.0</HozGridSpace>
    <VertGridSpace>2.0</VertGridSpace>
    <GridLineType>0</GridLineType>
    <CalcIntersection>True</CalcIntersection>
    <CalcArea>True</CalcArea>
    <TrimTypical>False</TrimTypical>
    <NumDecimalElev>3</NumDecimalElev>
    <NumDecimalDist>3</NumDecimalDist>
    <UseIntervalText>True</UseIntervalText>
    <IntervalDist>10.0</IntervalDist>
    <PrefixText>MSL</PrefixText>
    <PostfixText>MSL</PostfixText>
    <UsePostPrefix>1</UsePostPrefix>
    <UseOffsetElevFormat>2</UseOffsetElevFormat>
    <CalcPlotAreaCut>True</CalcPlotAreaCut>
    <CalcPlotAreaFill>True</CalcPlotAreaFill>
    <NumVertCLLeft>1</NumVertCLLeft>
    <NumVertCLRight>90</NumVertCLRight>
    <NumHozTopBottom>10</NumHozTopBottom>
    <LeftSideText>LT.</LeftSideText>
    <RightSideText>RT.</RightSideText>
    <StationText>Km.</StationText>
    <SelectedTBlock>2</SelectedTBlock>
    <NumSectionRows>1</NumSectionRows>
    <NumSectionColumns>1</NumSectionColumns>
    <SurveyType>0</SurveyType>
    <PlotTBlock>True</PlotTBlock>
    <SwapLeftAndRight>False</SwapLeftAndRight>
  </SectionOptions>
  <PageSetup>
    <Size>Custom</Size>
    <Width>940.0</Width>
    <Height>200.0</Height>
  </PageSetup>
  <Sections>
    <NumSections>1</NumSections>
    <Section Name="0+000">
      <XPositionOnPaper>47.7</XPositionOnPaper>
      <YPositionOnPaper>11.7</YPositionOnPaper>
      <TopGridElev>14.0</TopGridElev>
      <NumPoints>29</NumPoints>
      <Points>
        <Point Elevation="5.741" Offset="0.0"/>
        <Point Elevation="5.802" Offset="29.5"/>
        <Point Elevation="4.186" Offset="44.5"/>
        <Point Elevation="1.955" Offset="66.778"/>
        <Point Elevation="1.04" Offset="84.5"/>
        <Point Elevation="1.017" Offset="114.5"/>
        <Point Elevation="0.895" Offset="144.5"/>
        <Point Elevation="1.162" Offset="174.5"/>
        <Point Elevation="1.012" Offset="234.5"/>
        <Point Elevation="1.145" Offset="264.5"/>
        <Point Elevation="1.16" Offset="316.642"/>
        <Point Elevation="1.317" Offset="339.5"/>
        <Point Elevation="1.619" Offset="386.947"/>
        <Point Elevation="1.518" Offset="409.5"/>
        <Point Elevation="1.311" Offset="454.5"/>
        <Point Elevation="1.261" Offset="484.5"/>
        <Point Elevation="1.065" Offset="544.5"/>
        <Point Elevation="1.113" Offset="574.5"/>
        <Point Elevation="2.799" Offset="634.5"/>
        <Point Elevation="1.664" Offset="664.5"/>
        <Point Elevation="1.442" Offset="694.5"/>
        <Point Elevation="1.108" Offset="724.5"/>
        <Point Elevation="1.099" Offset="754.5"/>
        <Point Elevation="1.854" Offset="784.5"/>
        <Point Elevation="1.549" Offset="814.5"/>
        <Point Elevation="8.402" Offset="844.5"/>
        <Point Elevation="8.555" Offset="866.792"/>
        <Point Elevation="8.68" Offset="889.5"/>
        <Point Elevation="8.58" Offset="916.9"/>
      </Points>
    </Section>
  </Sections>
</root>

ต่อไปเป็น Typical Section ขนาดเล็กกว่า ผมตั้งชื่อว่า lake-typical.txml

<root version="1.0">
  <!--Generated by XSection Plot-->
  <!--This data file is Typical section-->
  <Header>
    <AppName>XSection Plot</AppName>
    <Developer>Prajuab Riabroy</Developer>
    <Version>4.1.512</Version>
    <SectionType>Typical</SectionType>
    <DateCreated>2017-11-12 18:42:28.929847</DateCreated>
  </Header>
  <Sections>
    <NumSections>1</NumSections>
    <Section Name="">
      <XPositionOnPaper>0.0</XPositionOnPaper>
      <YPositionOnPaper>0.0</YPositionOnPaper>
      <TopGridElev>0.0</TopGridElev>
      <NumPoints>4</NumPoints>
      <Points>
        <Point Elevation="5.0" Offset="36.944"/>
        <Point Elevation="5.0" Offset="695.0"/>
        <Point Elevation="8.4" Offset="845.0"/>
        <Point Elevation="8.44" Offset="900.0"/>
      </Points>
    </Section>
  </Sections>
</root>

เปิดไฟล์ข้อมูลทดสอบบน XSection Plot

จากนั้นนำสองไฟล์มาเปิดด้วย XSection Plot เวลาเปิดไฟล์ให้เลือกรูปแบบของไฟล์ด้วยจะได้เปิดง่าย  มีชื่อ extension ตามลำดับดังนี้ gxml, txml

จะได้ข้อมูลปรากฎขึ้นบนโปรแกรมดังนี้

ตั้งหน้ากระดาษ (Page Setup)

ผมลองเลือกใช้หน้ากระดาษที่ไม่มาตรฐานเพื่อให้ฟิตกับขนาดรูปตัดตามยาว ยาว 940 มม. และกว้าง 200 มม.

ตั้งค่า (Settings)

ผมตั้งสเกลทางราบเป็น 1:1000 และสเกลทางดิ่ง 1:250 อย่างอื่นดูรูปด้านล่าง

จัดวางรูปตัดบนกระดาษ (Section Layout)

จะเห็นกระดาษขนาด 200 มม. x 940 มม. แล้วเลือกพารามิเตอร์ดังรูปด้านล่าง

ดูรูปตัด (Section Viewer)

จะเห็นรูปตัดตามยาวที่ประกอบไปด้วย Existing Ground และ Typical

ลองซูมดู ก็ได้แบบ drawing มาพอถูๆไถๆ ที่สามารถนำไปเขียนเพิ่มเติมได้ในโปรแกรมด้านเขียนแบบทั้งหลายเช่น Autocad, Microstation, Draftsight

Save to DXF

จัดเก็บไฟล์ในรูป Autocad DXF เพื่อสามารถนำไปเปิดในโปรแกรมอื่นได้

เปิดไฟล์แบบรูปตัดตามยาว

ผมใช้ Microstation เปิดแบบรูปตัดตามยาวได้ผลลัพธ์ดังนี้และพร้อมจะนำแบบไปเขียนเพิ่มเติมตามความต้องการ

ครับคงอีกไม่นานก็จะคงจะปล่อยเวอร์ชั่นเสถียรให้สามารถดาวน์โหลดได้ พบกันใหม่ครับ

แนะนำการย้ายโค้ดจาก PyQt5 เป็น PySide2

ย้ายโค้ด XSection Plot

ในขณะนี้ทำงานอยู่ที่บังคลาเทศ โครงการก่อสร้างรถไฟฟ้าที่กรุงธากา มีโอกาสกลับมาพัก ก็พอมีเวลาว่างพยายามย้ายโค้ดของโปรแกรม XSection Plot จากของเดิมที่พัฒนาด้วย PyQt5 ที่ยังติดเรื่องลิขสิทธิ์บางส่วน โดยย้ายมาใช้ PySide2 ที่เปิดกว้างกว่า ความจริงทั้งคู่ใช้เครื่องยนต์ (Engine) เดียวกันคือ Qt5 platform ดังนั้นเมื่อย้ายโค้ดสำเร็จแล้วเวลารันก็หน้าตาเหมือนกันเป๊ะดังรูปด้านล่างที่คอมไพล์ด้วย PySide2

จัดการปลั๊กอิน PySide2

การย้ายโค๊ดใช้เวลาไม่นานนัก ใช้เวลาประมาณ 2 ชั่วโมง เนื่องจากผมเคยย้ายโค้ด Surveyor Pocket Tools ทำให้รู้แนวทางลัดพอสมควร อันดับแรกขอย้อนกลับหน่อย เนื่องจาก PySide2 จะมองหาโฟลเดอร์ลิ๊งค์ไลบรารีของตัวเองชื่อ “plugins” ถ้าไม่เจอจะ error แล้วหยุดทันที ดังนั้นก่อนอื่นควรจะแทรกโค๊ดนี้เข้าไปก่อน เริ่มตั้งแต่ import PySide2 ตามด้วยตรวจสอบว่า PySide2 อยู่ที่โฟลเดอร์ไหนจัดเก็บเข้าตัวแปร dirname จากนั้นค้นหาพาทของ “plugins” ที่อยู่ใต้โฟลเดอร์ dirname ด้วยคำสั่ง os.path.join()

import os
import sys
import PySide2
dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', '')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
print('plugin_path = ', plugin_path)

ที่เครื่องคอมพิวเตอร์ผม จะปริ๊นท์พาทของ “plugins” ดังนี้

plugin_path =  C:\Miniconda3\envs\py36_64\lib\site-packages\PySide2\plugins\

เพราะว่าผมใช้ Miniconda เป็นตัวจัดการระบบ environment ของ python ผมสร้าง envs ชื่อ “py36_64” เป็น python รุ่น 3.6 แบบ 64 บิต และ PySide2 ก็จะถูกติดตั้งมาอยู่ภายใต้โฟลเดอร์นี้ อีก envs หนึ่งที่สร้างไว้ชื่อ “py36_32” เป็น python รุ่น 3.6 แบบ 32 บิต เมื่อรันโปรแกรมแล้วจะปริ๊นท์พาทมาดังนี้

plugin_path =  C:\Miniconda3\envs\py36_32\lib\site-packages\PySide2\plugins\

วิธีการสร้าง environment สำหรับไพทอนก็กลับไปดูโพสต์เก่าของผมได้ครับ

เปลี่ยนคำ PyQt5 เป็น PySide2

ยังอยู่ในส่วน import ที่โค๊ดเดิมของโปรแกรมผมเรียกใช้ไลบรารีของ PyQt5 ดังนี้

from PyQt5.QtGui import QPixmap, QIcon, QKeySequence, QFont, QIntValidator, QCursor
from PyQt5.QtCore import Qt, pyqtSlot, QSettings, QFileInfo, QSize, QFile
from PyQt5.QtWidgets import QUndoStack, QSplashScreen, QApplication, QMainWindow, QTabWidget, QAction, QStatusBar,\
     QMenu, QWidget, QSizePolicy, QLineEdit, QFileDialog, QMessageBox, QDesktopWidget

เปลี่ยนเป็น

from PySide2.QtGui import QPixmap, QIcon, QKeySequence, QFont, QIntValidator, QCursor
from PySide2.QtCore import Qt, Slot, QSettings, QFileInfo, QSize, QFile
from PySide2.QtWidgets import QUndoStack, QSplashScreen, QApplication, QMainWindow, QTabWidget, QAction, QStatusBar,\
     QMenu, QWidget, QSizePolicy, QLineEdit, QFileDialog, QMessageBox, QDesktopWidget

ส่วนใหญ่เกือบ 99.99% ที่เหมือนกัน ยกเว้น Signal & Slot

Signal and Slot

มีข้อแตกต่างกันเล็กน้อย เช่นเดิมใน PyQt5 เรียกใช้ pyqtSlot, pyqtSignal ให้เปลี่ยนเป็น Slot, Signal ใน PySide2 ครับ
นอกจากส่วน import แล้ว ในโค๊ดเดิมที่ประกาศคลาส โค้ดเดิมผมเรียกใช้ Signal and Slot ดังนี้

class OverlapSection(QObject):
    '''Horizontal &amp; Vertical overlapped.'''
    overlapped = pyqtSignal(str)
 
    def __init__(self):
            QObject.__init__(self)
 
    def emitOverlapSignal(self, message):
        self.overlapped.emit(message)

เปลี่ยนใหม่เป็น

class OverlapSection(QObject):
    '''Horizontal &amp; Vertical overlapped.'''
    overlapped = Signal(str)
 
    def __init__(self):
            QObject.__init__(self)
 
    def emitOverlapSignal(self, message):
        self.overlapped.emit(message)

ติดตั้ง PySide2 จากไฟล์ wheel

ก็ขอแนะอีกนิดว่า PySide2 เวลาติดตั้งให้ใช้แพ๊คเกจแบบ wheel ที่ทางทีมงานได้ทำไว้ดีกว่าครับ ติดตั้งง่ายไม่งอแง ดาวน์โหลดได้ตามลิ๊งค์นี้ จะสังเกตเห็นชื่อไฟล์ประมาณนี้

PySide2-5.6-cp35-cp35m-win32.whl 	 
PySide2-5.6-cp35-cp35m-win_amd64.whl 	 
PySide2-5.6-cp36-cp36m-win32.whl 
PySide2-5.6-cp36-cp36m-win_amd64.whl

จะเห็นว่า PySide2 สนับสนุนทั้งไพทอน 3.5 และ 3.6 และในตอนนี้ Qt5 รุ่น  5.6 สำหรับคำสั่งที่ติดตั้งก็ง่ายๆใช้ pip ตามด้วยชื่อไฟล์ wheel

pip install PySide2-5.6-cp36-cp36m-win_amd64.whl

สรุปแล้วการย้ายโค้ดง่ายๆไม่ลำบากกินแรง แต่ไปกินแรงเข็นครกอีกทีคือตอนสร้างไบนารีไฟล์ด้วย Pyinstaller ความจริง Pyinstaller ถ้าเข้าใจแล้วปรับใช้ได้ไม่ยาก แต่สำหรับมือใหม่บอกตรงๆว่า ถ้าโปรแกรมที่พัฒนาเรียกใช้ไลบรารีมากหลายอันแล้ว เป็นนรกลูกย่อมๆครับ ถ้าไลบรารีตัวไหนมีคนเขียนไฟล์ hook ให้ก็ง่ายหน่อย แต่ถ้าไม่มีต้องออกแรงกันพอสมควร สำหรับ PySide2 ผมจัดการแบบ manual ครับ รู้ว่าตอนโปรแกรมรันมันต้องการอะไร ตอนใช้ Pyinstaller ผมก็จัดการ copy ไฟล์ไปตามต้องการ ถ้ามีโอกาสจะมาเขียนเรื่องการใช้ Pyinstaller อีกสักตอน พบกันตอนหน้าครับ

สิ้นสุดการรอคอย 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++  จะเห็นข้อมูลดังข้างล่าง (คลิกที่สี่เหลี่ยมลิ๊งค์ด้านล่าง เพื่อขยายออกมา)

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

[/sourcecode]

จบตอนที่ 2

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

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

ถึงจะล่าช้าแต่ก็มาตามสัญญา

  • โปรแกรมเขียนรูปตัดตามขวาง XSection Plot รุ่นนี้รุ่น 4.10 มาแทนรุ่นเดิม 3.25 ที่ปลดระวางด้วยเนื่องจากอายุมากร่วมสองทศวรรษ แต่ขอแจ้งไว้ก่อนรุ่นนี้ยังเป็นรุ่นทดลองใช้ (beta) นะครับ เพราะยังมีบั๊กอยู่บ้าง แต่โดยรวมใช้งานได้

xsectionplotv410-intro

ความเป็นมาของโปรแกรม

  • อ่านความเป็นมาของโปรแกรมได้อย่างละเอียดที่ => ก้าวต่อไปของโปรแกรมเขียนรูปตัดตามขวาง XSection Plot ในร่างใหม่พัฒนาด้วย Python + Qt
  • และที่ => ก้าวที่ใกล้กับโปรแกรมเขียนรูปตัดตามขวาง XSection Plot รุ่นใหม่
  • ก็ขอเท้าความเป็นมาโปรแกรมสักนิดเผื่อผู้อ่านไม่ได้ติดตามมาก่อน โปรแกรมเขียนรูปตัดตามขวาง XSection Plot รุ่นเดิมพัฒนาด้วย VB อายุอานามเกือบยี่สิบปีแล้วครับ ใช้ได้ดีตอนวินโดส์ XP แต่หลังมาวินโดส์ 7, 8 และวินโดส์ 10 ก็มีปัญหากับการติดตั้งเรื่อยมา เพราะโปรแกรมยังใช้ library ของวินโดส์รุ่นเก่า พอเจอวินโดส์ใหม่หาไลบรารีไม่เจอ ผมเขียนใหม่ด้วยภาษาไพธอน (Python) ใช้ระบบกราฟฟิคเฟรมเวิร์คของ Qt รวมๆเรียกว่า PyQt
  • ขณะที่พัฒนานี้ใช้ Python 3.5 ส่วน Qt ใช้ PyQt รุ่น 5.6 ส่วน Qt เป็นเฟรมเวิร์คที่ใหญ่โตมากๆ อ่านคู่มือไม่ไหว ก็จะเลือกอ่านแต่เท่าที่ใช้ แน่นอนสิ่งที่ทำให้ผมโปรแกรมได้สำเร็จยกเครดิตให้ stackoverflow.com ถ้าไม่มีเวปไซต์ถามและตอบปัญหาการเขียนโปรแกรมนี้ ยังคิดว่าจะเขียนโปรแกรมได้อย่างไร มีปัญหาอะไร เข้าไปค้นหาทีไร ก็เจอคำตอบทุกที จะมีคนที่มีปัญหาแบบเรามาถามก่อนเรา พร้อมมีคนมาตอบให้ ส่วนใหญ่ 99% คำตอบสามารถนำไปใช้งานต่อยอดได้

สาเหตุแห่งความล่าช้า

  • เรื่องความรู้ความเข้าใจภาษาไพธอน อาจจะไม่ใช่ปัญหานักเนื่องจากไพธ่อนเป็นภาษาที่เรียบง่ายแต่ทรงพลัง ปัญหาของผมลำดับแรกคือ Qt Framework ที่เกี่ยวกับกราฟฟิค ศึกษาได้ค่อนข้างช้า ก่อนหน้านี้ไปทุ่มให้กับ wxPython ที่เป็น GUI Framework ที่ใช้ wxWidget ทำให้เสียเวลาไปมาก  พูดอย่างนี้ไม่ใช่ wxPython ไม่ดีนะครับเพียงแต่ส่วนตัวแล้วไม่ชอบ มาเจอ Qt นี่ใช่เลย
  • ความล่าช้าลำดับที่สอง คือไลบรารีที่ผมเอามาเขียนไฟล์ Autocad DXF ใช้ ezdxf เป็นโครงการเปิดซอร์ส ตัวไลบรารีใช้งานง่าย เก่งมาก ผมลองสมมุติว่าถ้าให้ผมเขียนไลบรารีนี้เอง คงไม่มีปัญญาเป็นแน เพราะผู้พัฒนาเข้าใจถ่องแท้มาก ทั้งโครงสร้างของ  DXF ที่รุ่นหลังๆค่อนข้างซับซ้อนพอสมควร ปัญหาของผมอยู่ที่คอมไพล์โปรแกรมเพื่อสร้างไฟล์ execute ที่เป็นไบนารี .exe ตอนแรกใช้ py2exe กลับไม่สามารถรันได้ พอเปิดโปรแกรมใช้งานพอเรียกใช้ไลบรารีนี้จะ crash ทันที ตอนแรกหาสาเหตุไม่เจอ ตอนหลังมาทราบว่ามี่ไฟล์ที่ไลบรารี ezdxf ที่ต้องการใช้ แต่ py2exe ไม่ได้ใส่ไปให้ด้วย คือ py2exe จะสร้างไฟล์ไลบรารีที่โปรแกรมเรียกใช้ทั้งหมดแล้ว zip ไว้ แต่ขาดไฟล์บางไฟล์ของ ezdxf
  • ผมหันมาใช้ pyinstaller คอมไพล์และสร้างไฟล์  .exe สำเร็จเนื่องจาก pyinstaller ใช้วิธีการที่ง่ายกว่าแบบคิดไม่ถึงและก็ยืดหยุ่นมาก ตอนนี้เทใจให้กับ pyinstaller เมื่อได้ไฟล์ execute มาก็ไม่ยากแล้วทำไฟล์ติดตั้ง (setup) ด้วย Inno Setup เจ้าเดิมที่ผมใช้ประจำ เพราะฟรี ใช้งานง่าย

จุดประสงค์ของโปรแกรม

  • เนื่องจากจุดกำเนิดโปรแกรมนี้เริ่มต้นในยุค PC กับวินโดส์ที่กำลังรุ่งเรืองคือวินโดส์ 98 ที่โปรแกรมด้าน Civil/Survey ยังไม่เก่ง การเขียนรูปตัดจึงค่อนข้างจะใช้มือแบบแมนวลคือเน้นป้อนเข้าตาราง ต่อมาเริ่มมีโปรแกรมด้าน Civil/Survey เช่น Land desktop, Terramodel, โปรแกรมตระกูล Microstation เช่น PowerCivil, Inroads ประมาณนี้ หลายๆโปรแกรมสามารถ export รูปตัดเป็น text file ได้ ผมก็พัฒนาโปรแกรมให้สามารถอ่านเข้ามาโปรแกรม XSection Plot เพื่อจัดรูปแบบและสามารถนำไฟล์เข้าโปรแกรมจำพวก CAD ได้
  • ปัจจุบัน Terramodel, Land desktop หยุดพัฒนาไปหลายปี แต่ผู้พัฒนาหันมาพัฒนาตัวใหม่ที่เก่งกว่าเดิมเช่น Trimble Business Center (TBC) ของค่าย Trimble และค่าย Autodesk ก็มี Autodesk Civil3D เป็นโปรดัคเรือธง ผมลองใช้มาหมดแล้วครับ ยอมรับความสามารถเก่งกาจไปไกล แต่ราคาต่อไลเซนต์ก็สูงมากโข ถามกันจริงๆ ถ้าจะซื้อมาใช้แบบไลเซนต์ จะมีผู้ใช้ที่ไม่ใช่องค์กรสักกี่คนที่มีปัญญาซื้อมาใช้งานได้ นี่เป็นปัญหาอย่างหนึ่ง

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

  • ดาวน์โหลดได้ที่ XSectionPlotV410b867Setup64.zip หรือดูด้านขวามือตรง ดาวน์โหลด (Download) มองหาลิ๊งค์สำหรับติดตั้งโปรแกรม  “XSection Plot V4.10” ในเบื้องต้นมีเฉพาะรุ่น 64 บิต (สำหรับรุ่น 32 บิต รออีกสักพักครับ) ดาวน์โหลดมาแล้ว ขนาดโปรแกรมไม่ใหญ่ประมาณ 16 MB จากนั้นก็ติดตั้งได้ง่ายๆ ติดตั้งแล้วจะเห็น icon ขึ้นมาบน Desktop ดังรูปด้านล่าง

xsectionplot_icon

พาทัวร์โปรแกรมทดลองใช้งาน

  • ต่อไปผมจะพาลองทดลองใช้โปรแกรมคร่าวๆ พาทัวร์การใช้งานรวดเดียวจบ ผมมีไฟล์ตัวอย่าง ตอนติดตั้งโปรแกรมจะไปอยู่ในโฟลเดอร์ของวินโดส์ C:\Users\ชื่อผู้ใช้\AppData\Roaming\XSection Plot\examples data โฟลเดอร์นี้จะถูกซ่อนอัตโนมัติ ผู้ใช้หน้าใหม่ๆอาจจะหาไม่เจอ กรณีหาไม่เจอผมเตรียมตัวช่วยไว้
  • เปิดโปรแกรมมาครั้งแรกจะเห็นว่าตารางโล่งไม่มีข้อมูล

xsectionplotv410-firstload

1.ที่จัดเก็บข้อมูลตัวอย่าง

  • เปิดเมนู Help เลือกคลิกที่ “Example data”

help_examples_data

  • โปรแกรมจะเปิด windows explorer ของวินโดส์มาให้ มองไปจะเห็นโฟลเดอร์ “examples data”

examples_data_folder

  • จากนั้น double click เข้าไปที่โฟลเดอร์ “example data\mz\import files” จะเห็นไฟล์อยู่สองไฟล์ มาถึงตรงนี้ขอให้คลิกแถบ path ดังรูปแล้วก็ใช้เมาส์คลิกขวาเลือก copy ตอนนี้ path อยู่ในคลิปบอร์ดแล้ว ต่อไปจะใช้โปรแกรม XSection Plot ทำการ import ข้อมูลที่อยู่ในพาทนี้เข้าโปรแกรม

mz_import_files_folder

2.นำข้อมูลดินเดิมเข้าโปรแกรม (Import file)

  • คลิก Import text file ที่ไอคอนตามรูปเพื่อจะนำเข้าไฟล์รูปตัด จะเห็นไดอะล็อกของ Import XSection text file ขึ้นมา คลิกที่ไอคอน Open เพื่อเปิดไฟล์

xtoolbar_import

import_dialog

  • จะเห็นไดอะล็อก “Open X-Section text file” เอาเมาส์ไปคลิกที่แถบพาทดังรูปแล้ว paste กด enter สักครั้งหนึ่งจะเห็นไฟล์ app_ch155m.xsc ที่เก็บไฟล์รูปตัดไว้ จากนั้นคลิกเลือกไฟล์นี้

xfolder_import

  • โปรแกรมจะเปิดไฟล์แล้วอ่านรูปตัดแสดง preview ไฟล์รูปตัด สังเกตว่ารูปแบบค่าปริยายจะเลือก Terramodel Road (4 decimal) คลิก “Next >” เพื่อไปขั้นตอนต่อไป

import_view

3.เลือกรูปตัดให้พอดีกับหน้ากระดาษแบบ

  • เมื่อโปรแกรมอ่านพบรูปตัดแล้วจะนำรูปตัดมาแสดงเป็นลิสต์เพื่อจะให้ผู้ใช้เลือกรูปตัดไปใส่กระดาษแบบตามที่ต้องการ ดูรูปข้างล่าง ข้อสังเกตจะเห็นขั้นตอนที่  3.เลือกปลายทาง ไฟล์นี้เป็นค่าระดับดินเดิมจึงเลือก Copy to Existing Ground section ขั้นตอนที่ 4.copy ไปตารางข้อมูล เป็นอันเรียบร้อย

import_selected

  • ข้อมูลรูปตัดจะถูก  copy ตารางป้อนข้อมูลดินเดิม (Existing Ground Section)

xsectionplot_import_ground

4.นำเข้าข้อมูลไฟล์ Typical Section

  • ต่อไปจะนำข้อมูลดินเดิม Typical section  จาก toolbar เลือกไอคอน “Import text file” เปิดไฟล์ที่โฟลเดอร์เดิม ที่นี้เลือกไฟล์ “design_ch.xsc” คลิก Open โปรแกรมจะเปิดไฟล์มาให้ดูก่อนจากนั้นคลิก “Next >” เพื่อมาเลือกรูปตัด เลือกตามรูปโดยเฉพาะขั้นตอนที่ 3.เลือกปลายทาง เลือก “Copy to Typical section” สุดท้ายคลิกที่ “Copy to >>

import_selected_ts

  • โปรแกรมจะนำข้อมูล Typical มาลงที่ตารางข้อมูล Typical section

typical_after_imported

5.บันทึกไฟล์ข้อมูล (Save file)

  • เมื่อนำข้อมูลเข้ามาแล้ว สิ่งแรกควรจะบันทึกไฟล์ข้อมูลลงดิสค์ คลิกที่ไอคอน “Save” เนื่องจาก Tab มีสองหน้าคือ Typical Section และ Existing Ground Section เวลาจะบันทึกไฟล์ข้อมูลแบบไหนก็ให้คลิกที่แท็บให้ตรงกัน เช่นถ้าต้องการบันทึกไฟล์ข้อมูลของดินเดิมก็ให้คลิกที่แท็บ “Existing Ground Section”

toolbar_save

  • ตอนนี้อยู่แท็บ “Typical Section” เราจะบันทึกไฟล์ข้อมูลนี้ก่อน ผมจะเก็บใน Documents ซึ่ง extension ของไฟล์จะเป็น .txml โดยอัตโนมัต ไฟล์ข้อมูลนี้เป็น xml เปิดดูได้ด้วย Notepad ของวินโดส์ ส่วนรูปแบบฟอร์แมตของไฟล์รุ่นเก่าเป็นไบนารีมีนามสกุล .XST

save_typical_section_file

  • บันทึกไฟล์ดินเดิม (Existing Ground Section) คลิกที่แท็บ “Existing Ground Section” เพื่อสวิตช์มาที่ตารางข้อมูลดินเดิม คลิก “Save” ที่ toolbar ด้านบน เลือกโฟลเดอร์ Documents ป้อนชื่อไฟล์ดังรูปด้านล่าง ไฟล์จะมี extension เป็น .gxml อัตโนมัติsave_existing_ground_section

จบตอนที่ 1 ติดตามต่อตอนที่ 2

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

 

ก้าวที่ใกล้กับโปรแกรมเขียนรูปตัดตามขวาง XSection Plot รุ่นใหม่

ก้าวที่ผ่านมา

  • ผ่านมาครึ่งปีกว่าแล้วก็ยังไม่เสร็จตามสัญญา แต่โปรแกรมก็คืบหน้าไปพอสมควรครับ ขอเท้าถึงความหลังหน่อยว่าโปรแกรมรุ่นเดิมเขียนด้วย VB ที่นับอายุอานามแล้วจะใกล้ๆ 20 ปีเข้าไปแล้ว ผมนำโปรแกรมมาพัฒนาใหม่ด้วยของฟรีดีมีคุณภาพ Python3 + Qt5 แรกก็ตะกุกตะกักพอสมควรเนื่องจากยังใหม่กับ Python และเป็นครั้งแรกที่ใช้  Qt สำหรับ Python ที่ว่ากันว่าเรียนง่ายเขียนง่าย แต่สำหรับผมที่เขียนด้วยภาษาอื่นมานมนานก็ต้องบอกว่า Python มีสไตล์ของตัวเอง ที่สั้น กระชับ ฉับไวที่คาดไม่ถึงเลยก็หลายๆอย่าง แต่ด้วยความที่สมองคิดแบบภาษาอื่นมานาน พอมาลอง Python ก็ยอมรับว่าตอนใหม่ๆไปอย่างฝืด Learning Curve  ชันไปนิดสำหรับผม แต่ผ่านไปปีกว่าๆ สไตล์ของ Python เริ่มเข้าหัว ทุกสิ่งทุกอย่างจะลื่นไหลออกมาเอง ลองมาดูว่าโปรแกรมสามารถทำอะไรได้บ้างเมื่อเทียบกับรุ่นเก่าที่พัฒนาด้วย VB 6

XSection_41_showcase

1) ป้อนและแก้ไขข้อมูลโครงการ (Project Information)

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

XSectionPlot_41_Projinfo

  • บางครั้งผู้ใชอาจต้อง Titleblock เป็นภาษาไทย ในส่วนรูปแบบ Titleblock ที่ออกแบบไว้ในโปรแกรมเป็นภาษาอังกฤษ ถ้าจะใช้ภาษาไทยต้องมาป้อนคำเทียบกับภาษาอังกฤษเอง หรือจะใช้ที่ผมใส่ไว้เป็น default ก็ได้

XSectionPlot_41_Maptb

2) ตั้งขนาดกระดาษ (Page Setup)

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

XSectionPlot_PageSetup

3) ตั้งค่ารูปตัดตามขวาง (Section Settings)

  • การตั้งค่ารูปตัดตามขวางเช่นการตั้งมาตราส่วนทางราบ (Horizontal scale) และมาตราส่วนทางดิ่ง (Vertical scale) ให้เหมาะสมหรือตามแต่เจ้าของงานจะกำหนด อย่างอื่นได้แก่ ตั้งจำนวนทศนิยมตัวเลข รูปแบบของเส้นกริด

XSection_41_gensettings

  • รูปแบบตัวเลขค่าระดับ และระยะทาง offset เลือกตั้งได้ 3 รูปแบบ

XSectionPlot_41_elevdisttxt

  • รูปแบบค่าระดับข้างตารางกริด สามารถตั้งตัวอักษรเป็นตัวย่อนำหน้าเพื่อระบุว่าเป็นค่าระดับที่ใช้อ้างอิงกับหลักฐานทางดิ่ง (Datum) อะไรเช่น รทก (MSL) หรือไม่ก็ LAT (Low Astronomical Tide) หรือบางครั้ง CD (Chart Datum)

XSectionPlot_41_gridelevtxt

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

XSectionPlot_41_topgridelev

4) การจัดรูปตัดตามขวางบนกระดาษ (Page Layout)

  • โมดูลตัวนี้เพิ่งเขียนเสร็จสดๆร้อนๆ การจัดรูปตัดบนกระดาษ โดยที่ผู้ใช้เพียงแต่บอกว่าต้องการรูปตัดในแนวราบ (คอลัมน์) และในแนวดิ่ง (แถว) เท่าไหร่ โปรแกรมก็จะจัดให้ตามต้องการ แต่ที่สำคัญคือความกว้างของรูปตัดจะขึ้นอยู่กับลักษณะงานด้วย เช่นงานถนนอาจความกว้างรูปตัดอาจจะ 100 เมตร ก็แบ่งไปข้างซ้าย 5o เมตร ข้างขวา 50 เมตร ในทางดิ่งก็เหมือนกันสามารถตั้งความสูงในแนวดิ่งได้เช่นกัน นอกจากนี้ระยะระหว่างเส้นกริดในแนวราบและแนวนอนก็ยังสามารถตั้งได้ เช่นบางงานอาจต้องการระยะความห่างเส้นกริดทางราบ 5 เมตร หรือ 10 เมตร ทั้งนี้ขึ้นอยู่กับมาตราส่วนด้วย และความสวยงาม เส้นกริดไม่ถี่มากดูแล้วสบายตา

XSectionPlot_41_sectionlayout2

  • หรือในบางกรณีรูปตัดไม่เต็มหน้า โปรแกรมก็จัดให้ได้

XSectionPlot_41_sectionlayout3

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

XSectionPlot_41_sectionlayout4

สิ่งที่ต้องทำต่อ

1) แสดงรูปตัด (Section Viewer)

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

XSectionPlot_32_SectionViewer1

XSectionPlot_32_SectionViewer2

2) เขียนไฟล์รูปตัดรูปแบบ DXF

  • ส่วนนี้เป็นส่วนที่สำคัญมาก เพราะผู้ใช้ต้องการผลงานในรูปแผนที่แสดงรูปตัดตามขวาง ที่สามารถนำไปเปิดด้วยโปรแกรมด้าน CAD อื่นๆได้เช่น Autocad, Microstation เพื่อสามารถนำไปแก้ไขจนเป็นแผนที่รูปตัดที่พร้อมจะส่งงาน ในส่วนนี้ผมคาดว่าคงใช้เวลาในการโปรแกรมมิ่งไม่มากนัก

XSectionPlot_42_icon_sectionviewer

ก่อนจากกัน

  • สำหรับ Python + Qt เป็นจัดเป็นคู่หู ที่ทรงประสิทธิภาพมาก เป็น Cross-platform ผมใช้ Eclipse ผ่านปลั๊กอิน Pydev เป็นสภาวะแวดล้อมในการพัฒนาโปรแกรม การดีบักหาข้อผิดพลาดของโปรแกรม เนื่องจากคำสั่ง print  ของ Python เก่งมากก็ใช้คำสั่ง print นี้ครับสะดวก รวดเร็ว
  • เมื่อนำไปพัฒนาบน Ubuntu Gnome ก็ออกมาดังที่เห็น

XSectionPlot_41_ubuntugnome

  • หรือนำไปพัฒนาบนแมค ที่ติดเรื่อง font จากปัญหาสระลอย จนต้องมาบังคับฟอนต์ ตามที่อ.จักรนันท์แนะนำ ก็แก้ปัญหานี้ไปได้

XSectionPlot_41_mac

  • พบกันใหม่ครับ

โปรแกรมเขียนแบบรูปตัดตามขวาง (XSection Plot) สำหรับช่างสำรวจ/ช่างโยธา ตอนที่ 3 (ตอนจบ)

การพรีวิวรูปตัด (Depth Viewer)

  • มาถึงตอนสุดท้าย เรามาดู preview รูปตัดกันก่อน เมื่อดูแล้วผลลัพธ์อาจไม่ตรงกับที่ต้องการ สามารถกลับไปแก้ไขข้อมูลได้เช่น มาตราส่วน ปรับเพิ่มลดรูปตัดในพอดีกับขนาดกระดาษ เมื่อดูแล้วเป็นที่พอใจ สามารถ Export หรือ Save เป็น Autocad DXF ท้ายที่สุดแล้วยังสามารถตามไปแก้ไขรูปตัดได้ใน Autocad
Depth Viewer
  • เมื่อคลิกที่ tool bar จะปรากฏ Depth Viewer ให้เห็นดังรูปด้านล่่าง
การตรวจสอบรูปตัด
  • เมื่อพิจารณาดูรูปตัด จะเห็นว่าโปรแกรมยังไม่สามารถแสดงพื้นที่ที่เป็น cut area ได้ เนื่องจากข้อมูลรูปตัดที่ import จาก Terramodel ตรงจุดตัดระหว่าง Typical section กับเส้นดินเดิมยังไม่ตัดกันเป๊ะ เราจะทำการแก้ไข Typical section ที่ตารางข้อมูล
zoom ดูรูปตัด
  • จากรูปด้านบน ผมจะต่อเส้น typical ให้ไปถึงค่าระดับ -12 กลับมาดูที่ตารางข้อมูลดังรูปด้านล่าง
แก้ไขรูปตัด Typical Section
  • ดูรูปด้านบนที่ Section 2+000 จะเห็นว่าที่ระยะ offset ที่ -65  เมตร และ +65 เมตร ค่าระดับอยู่ีที่ -15.5 เมตรเท่ากัน ผมจะแก้ให้เส้น side slope ไปแตะที่ค่าระดับ -12 เมตร ดังนั้นค่าต่างระดับในแนวดิ่ง = -12.0 + 15.5 = 3.5 เมตร ถ้า side slope กำหนดให้ 1 : 5 ดังนั้นระยะราบจะต่อไปจากระยะ -65 และ + 65 เมตรไปอีกเท่ากับ 3.5 x 5 = 17.5 เมตร ดังนั้นระยะ offset ที่ค่าระดับ -12 จะเท่ากับ -65 – 17.5 = -82.5 เมตร ลองแก้ไขที่ตารางข้อมูลดังรูป
แก้ไข typical section
  • กลับเข้าไปดูใน Depth Viewer อีกครั้งจะเห็นว่าโปรแกรมสามารถคำนวณหาพื้นที่หน้าตัดได้แล้ว
รูปตัดตามขวางเมื่อแก้ไขข้อมูล Typical section ที่ station 2+000
  • ลองเลื่อนไปดู station 2+300 จะเห็นว่าไม่ต้องแก้ไข typical section เนื่องจากโปรแกรมพบจุดตัดเรียบร้อยแล้ว พร้อมคำนวณหา cut area มาให้
รูปตัดที่ station 2+300

Export to Autocad DXF

  • หลังจัดวางรูปตัดได้ตามต้องการแล้ว มาถึงตอนสุดท้ายคือ export รูปตัดตามขวางออกเป็น Autocad DXF ซึ่งถ้าจะแก้ไข Title block หรืออื่นๆก็สามารถเปิดไฟล์ด้วย Autocad แล้วทำการแก้ไขได้ง่าย
คลิกที่ toolbar เพื่อใช้ Export to Autocad DXF

เปิดไฟล์รูปตัดตามขวางด้วย Autocad

  • ลองเปิดไฟล์ DXF ที่เซฟไว้ ดังรูปด้านล่าง ถ้ายังไม่พอใจหรือต้องการแก้ไขตรงจุดไหนก็สามารถกลับไปที่โปรแกรม XSection Plot ได้แล้ว save เป็น DXF ออกมาอีกครั้ง
เปิดไฟล์ DXF ด้วย Autocad

ลองดูข้อมูลจากโครงการอื่น

  • ผมมีตัวอย่างงานถนน อยู่ในโฟลเดอร์ “c:\program files\survey suite\xsection plot\examples\road” เปิดไฟล์ “DW Road.XST และ “DW Road.XSG” ตามลำดับ ลองคลิกไปที่ “ตั้งค่ารูปตัด” ในตัวอย่างนี้เป็นงานถนนใช้มาตราส่วน 1:250 เท่ากันทั้งทางราบและทางดิ่ง ซึ่งในตัวอย่างนี้เนื่องจากใช้ scale ใหญ่ จึงมีรูปตัดทั้งหมดได้ 5 รูปตัด
ตั้งค่ารูปตัดตามขวาง
  • ส่วน “การจัดวางรูปตัดบนกระดาษ” จะเป็นดังรูปด้านล่าง
จัดวางรูปตัด
  • ลองดู Section Viewer จะเห็น รูปตัดที่เป็นงานถนนเป็นหลังเต่า ซ้ายและขวาจากไหล่ทางจะเป็น ditch และมี side slope ที่ cut ออกไปสองข้าง
Section viewer ดูรูปตัด station 3+550

สรุปการใช้โปรแกรม

  • เป็นอย่างไรบ้างครับ ดูแล้วใช้งานง่ายไหม ผมว่าทุกๆโปรแกรมต้องลองใช้สักพัก ถึงจะคุ้นเคย ความจริง Terramodel ที่ใช้งานอยู่ก็มี module สำหรับ export รูปตัดออกมาได้ แต่ที่พบมาคือ config ยากมาก เมนูที่ทางโปรแกรมเมอร์ Terramodel เขียนมานั้นชวนสับสนและยอกย้อน ทางออกก็คือเมื่อ config ได้ต้องเขียน template ไว้ แต่ถ้าใช้ XSection Plot งานจะง่ายขึ้นมาก ปัญหาของ XSection Plot มีอยู่คือการออกแบบ Typical section ซึ่งในโปรแกรมมานั่งป้อนข้อมูล typical section ที่ค่อนข้างซับซ้อนคงไม่สะดวกเป็นแน่แท้ แต่ถ้าสามารถ export ออกมาได้เหมือน existing ground ก็ดี (เช่น Terramodel) ตอนก่อนหน้านี้ผมฝากโปรแกรมคำนวณวงรอบ (Traverse Pro) มีคนดาวน์โหลดไปใช้กันมากกว่าที่คิด ก็ขอฝากอีกโปรแกรมก็แล้วกัน สวัสดีครับ

โปรแกรมเขียนแบบรูปตัดตามขวาง (XSection Plot) สำหรับช่างสำรวจ/ช่างโยธา ตอนที่ 2 (ฟรี)

ป้อนข้อมูลโครงการเพื่อเขียน Title Block

  • โปรแกรม XSection Plot จะเขียน Title Block ลงไปในไฟล์ DXF ด้วย ซึ่งรูปแบบ Tible Block โปรแกรมจะเตรียมมาให้ประมาณ 4-5 แบบ ซึ่งสามารถไปแก้ไขภายหลังได้ใน Autocad
ป้อนข้อมูลเพื่อเขียน Title Block
  • แต่ถ้าต้องการเขียน Title block เป็นภาษาอังกฤษ คลิกที่แท็บภาษา
เลือกภาษาที่จะเขียน Title block

ตั้งขนาดกระดาษเขียนแบบ

  • ขนาดกระดาษสามารถเลือกได้จากขนาดมาตรฐาน ISO หรือกำหนดเองก็ได้ จากรูปด้านล่างผมกำหนดเป็นขนาด A1
ตั้งขนาดกระดาษ

ตั้งค่ารูปตัด

  • เป็นส่วนที่สำคัญมาก ได้แก่การตั้งค่ามาตราส่วนทางราบและทางดิ่ง ในงานออกแบบทั้งหลายเช่นงานถนน งานวางท่อ จะใช้มาตราส่วนที่เท่ากันทางราบและทางดิ่งเท่ากัน แต่บางงานเช่นงานขุดลอกร่องน้ำ สามารถใช้มาตราส่วนที่ต่างกันได้เช่น ทางราบ 1:2500 ทางดิ่ง 1:250
ตั้งค่ารูปตัดเช่นมาตราส่วน จำนวนทศนิยม
  • จากรูปด้านบน จะเห็นโปรแกรมให้เลือกประเภทของงานสำรวจ ซึ่งที่คุ้นเคยกันดีอยู่จะเป็น Land survey ค่าระดับสูงขึ้นจะเป็นบวก แต่ในงานด้าน Hydrographic Survey ค่าระดับเครื่องหมายจะกลับกันกับงาน Land survey คือแกน Y จะชี้ลง ที่ใช้กันมากได้แก่แผนที่เดินเรือ ถ้าตรงไหนค่าความลึกเป็นลบ จะเป็นพื้นที่ที่ต้องหลีกเลี่ยงเนื่องจากน้ำตื้น
ตั้งค่ามาตราส่วน ประเภทงานสำรวจ
  • จากรูปด้านบนนอกเหนือจากมาตราส่วน จะเห็นรูปแบบการเขียนตัวหนังสือตามระยะที่กำหนด ผมตั้งให้เป็น 25 เมตร หมายความว่าโปรแกรมจะทำการ interpolate ค่าระดับที่ระยะทุกๆ 25 เมตร เพื่อให้ดูง่ายและสวยงาม ต่อไปคลิกที่แท็บ “รูปแบบตัวหนังสือค่าระดับและระยะ offset” มีให้เลือกอยู่ 3 แบบ ดังรูปด้านล่าง
รูปแบบการจัดวางตัวหนังสือค่าระดับและค่าระยะ offset
  • บางครั้งตัวหนังสือของค่าระดับที่บอกค่าระดับแต่ละเส้น จะใส่ datum อ้างอิงลงไปเช่นค่าระดับน้ำทะเลปานกลาง (Mean Sea Level – MSL) หรือระดับน้ำลงต่ำสุด(Lowest Low Water – LLW) ในงาน Hydrographic survey
ตัวหนังสือแสดงระดับอ้างอิง
  • ในงานบางงานเช่นถนนที่ผ่านไปในที่เป็นภูเขา รูปตัดแต่ละ station จะมีค่าระดับสูงต่ำต่างกันมาก เราสามารถกำหนดให้ได้ หรือจะใช้วิธีการให้โปรแกรมเขียนให้อัตโนมัติ (คลิกเลือก 1 และคลิกที่ apply เลข 2) ซึ่งส่วนใหญ่ก็ใกล้เคียง ถ้าไม่ตรงอาจจะต้องพิมพ์เองบ้าง
กำหนดค่าระดับให้กับตาราง

การจัดวางรูปตัดบนหน้ากระดาษเขียนแบบ

  • ถ้าสังเกตุดูไฟล์ตัวอย่างที่ Import ข้อมูลรูปตัดเข้ามาจำนวน 12 รูปตัด และมาตราส่วนที่ต้องการเขียนคือทางราบ 1 : 2500 และมาตราส่วนทางดิ่ง 1:250 มาดูว่าจะจัดวางรูปตัดอย่างไรให้ได้ 1 หน้ากระดาษ A1 ได้พอดี
เลือกจัดวางรูปตัด
  • เมื่อคลิกที่ toolbar แล้วเราจะเลือก Title block ก่อน ดูรูปด้านล่าง
เลือก Title block ก่อน
  • จากรูปด้านบนนำรูปตัดเข้ามา 12 รูปตัด ถ้าจัดเป็น 2 คอลัมภ์ (จำนวนแถวในแนวตั้ง) จะต้องจัดรูปตัดเป็นแถวในแนวนอนเท่ากับ 6 แถว เพื่อให้คูณกันได้ 12 พอดี ส่วนความยาวกริดออกไปซ้ายและขวาลองเลือกจาก dropdown listbox ดู แล้วอย่าลืมสังเกตุที่ด้านล่างด้วยจะบอกระยะทางไปด้านซ้ายและด้านขวา พยายามจัดให้เผื่อให้พอดีกับรูปตัดดินเดิม เมื่อเสร็จแล้วแล้วลองคลิก Apply (นำไปใช้) ดู
ลักษณะการจัดวางรูปตัดอย่างง่าย
  • เมื่อคลิก “นำไปใช้” โปรแกรมจะเขียนตัวเลขบนตารางข้อมูลให้คือ Position on paper(X) และ Position on paper(Y) รูปตัด station เดียวกันบนตาราง Typical section กับ Ground section จะเท่ากัน
  • ต่อไปจะ save ข้อมูลถ้าต้องการ save ข้อมูล Typical Section ต้องคลิกไปที่แท็บ “Typical Section” ก่อนถึงจะ save ได้ และคลิกที่แท็บ “Ground Section” เมื่อต้องการ save ข้อมูลของ Existing ground section
คลิกที่ toolbar เพื่อ save ข้อมูล
  • ตอนต่อไปจะเป็นตอนสุดท้าย มาติดตามดู Depth Viewer หรือดูรูปตัดเป็นกราฟฟิคง่ายๆ ตลอดจนการ export แบบเป็น Autocad DXF เืพื่อไปเปิดใน Autocad

โปรแกรมเขียนแบบรูปตัดตามขวาง (XSection Plot) สำหรับช่างสำรวจ/ช่างโยธา ตอนที่ 1 (ฟรี)

โปรแกรมเขียนแบบรูปตัดตามขวาง XSection Plot

  • เป็นโปรแกรมที่ผมเขียนไว้นานพอสมควร แจกจ่ายให้พี่ๆน้องๆ นำไปใช้งานกันโดยไม่คิดสตางค์ และก็เขียนโดย surveyor เพื่อ surveyor เหมือนเดิม โปรแกรมตัวนี้พัฒนาด้วย VB6 ซึ่งในช่วงเริ่มเขียนจำได้ว่า VB กำลังดังมาก ด้วยข้อจำกัดด้านภาษาคือ VB ยังไม่ได้สนับสนุนเรื่อง OOP เต็มตัวเหมือน VB.Net ในปัจจุบัน ทำให้การเขียนโค๊ดค่อนข้างจะเยิ่นเย้อ  แต่ตัวโปรแกรมที่ได้นั้นใช้งานง่าย จากที่คนใช้บอกๆกันต่อ จะใช้แบบ manual ก็ได้คือนำข้อมูลมาป้อนเข้าไปดิบๆ ทีละ station งานใช้แรงแบบนี้ไม่ค่อยได้ใช้สมอง น้องๆทีมงานผมเรียกว่างานวิ่งควาย หรือจะใช้แบบนำข้อมูลที่เก็บในรูป text file มา import เข้าโปรแกรม ซึ่งเป็นวิธีที่สะดวกทีสุด ส่วน text file ดังกล่าวจะสร้าง (export) ได้จากโปรแกรมด้าน CAD/Civil อื่นๆเช่น Autodesk Land Desktop, Civil 3D, Terramodel, GeoPak หรือ Carlson Survey CAD
  • ในปี 2553 ผมใช้เวลาว่างมานั่งปัดฝุ่น update feature บางอย่างไปพอสมควร ตามคำเรียกร้องของผู้ใช้ให้ปรับปรุงมานานหลายปีแล้ว จนกระทั่งตอนมานั่งแก้ไขโปรแกรม ลืม syntax ของ VB หลายๆอย่างต้องมานั่งนึกอยู่นานเหมือนกัน
  • รูปแบบข้อมูลโปรแกรม XSection Plot ที่จะใช้เก็บข้อมูลรูปตัดจริงๆ (หลังจาก import ข้อมูลจาก text file ด้านนอก)  ผมไม่ได้ใช้ฐานข้อมูลใดๆ ใช้เป็นไฟล์ไบนารีธรรมดา ข้อมูลที่จะจัดเก็บมีอยู่สองประเภทคือ ข้อมูล Typical Section มีนามสกุลเป็น XST และอีกอย่างก็คือข้อมูล Existing ground section หรือผมเรียกสั้นๆว่า Ground Section มีนามสกุลเป็น XSG
แสดงโปรแกรมช่วยเขียนแบบรูปตัดตามขาาง XSection Plot
  • รูปข้างล่างแสดงแผนที่รูปตัดที่ได้จากโปรแกรม ซึ่งสามารถ export เป็น Autocad DXF ได้
Autocad แสดงแผนที่รูปตัดตามขวางที่ได้จาก XSection Plot

Cross Section & Profile

  • ที่จริงแล้วเรื่อง Cross section และ Profile จะเป็นวิชาของงานสำรวจ อยู่ในเรื่อง Earth Work (งานดิน) งานที่เกี่ยวข้องกับ route เช่นถนน ท่อ หรือร่องน้ำเดินเรือเป็นต้น เมื่อพูดถึงแผนที่แล้วคงหนีแผนที่รูปตัดตามขวางและรูปตัดตามยาวไม่พ้น สองแผนที่นี้ให้ภาพในแนวขวางกับ alignment และแนวตามยาวไปตามแนว alignment เมืื่อรวมกับแปลน (plan) แล้วทำให้คนดูแผนที่เกิดจินตภาพเป็นสามมิติ
ตัวอย่างมุมมองต่อแผนที่รูปตัดตามขวางและตามยาว
  • คนที่ทำงานฟิลด์ ด้าน CAD/Civil/Survey ไม่ว่าจะเป็น Civil 3D, Autodesk Land Desktop, Geopak, Terramodel หรือพวก Carlson Survey CAD หรืออะไรประมาณนี้คงคุ้นกันดีเมื่อฟอร์ม point ที่ได้จากงานสำรวจในสนาม บางโปรแกรมเรียกว่าสร้าง surface หรือสร้าง DTM ก็ได้ จะมีฟังก์ชั่นเขียนรูปตัดตามขวางหรือตามยาว โดยต้องมีเส้น alignment เพื่อเป็นแนวที่จะใช้ตัดก่อน ผมจะแสดงตัวอย่างโดยใช้ Terramodel ที่ทีมงานผมใช้ประจำ

Terramodel

Terramodel แสดง DTM
  • รูปด้านบนแสดง contour ที่ได้จาก DTM (เป็นแผนที่ที่เรียกว่า Bathymetric Map) จะเห็นจุดๆเป็นแนวๆเลื้อยๆ คือเป็นจุดที่ได้จากงานทำ Hydrographic survey พื้นที่บริเวณนี้ design ไว้เป็นท่าเทียบเรือในทะเล ซึ่งความลึกไม่ได้ต้องมีการขุดลอกร่องน้ำเข้ามา จะเห็นเส้นสีน้ำเงินเข้มเป็นรูปแบบร่องน้ำที่ออกแบบไว้แล้ว ลองดูอีกรูปที่ได้จาก 3D เป็นการรวม DTM พื้นดินเดิมและ รูปร่องน้ำที่ออกแบบไว้
แสดงภาพ 3D จากโปรแกรม Terramodel

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

  • โปรแกรม XSection Plot สามารถดาวน์โหลดมาใช้งานได้ฟรี แต่มีข้อเสียคือผมไม่ได้ทำคู่มือไว้ แต่ไม่เป็นไรเนื่องจากใช้งานไม่ยาก ดาวน์โหลดได้ที่นี่ XSectionPlotSetup.zip
  • เมื่อดาวน์โหลดแล้วเริ่มทำการติดตั้ง ซึ่งการติดตั้งก็ทำได้ง่ายๆเพียงคลิกไม่กี่ครั้ง เมื่อติดตั้งเสร็จพร้อมก็รันโปรแกรมได้เลย ขอบอกนิดหนึ่งว่าโปรแกรมจะถูกติดตั้งตามค่าปริยายคือที่โฟลเดอร์ c:\program files\survey suite\xsection plot ลองใช้ windows explorer เข้าไปจะเห็นโฟลเดอร์ “format-examples” ที่เก็บรูปแบบที่สามารถนำไป import เข้าโปรแกรม XSection Plot ได้ และอีกโฟลเดอร์คือ “Examples” ซึ่งในการแนะนำโปรแกรมผมจะใช้ตัวอย่างที่อยู่ในโฟลเดอร์นี้เป็นหลัก
แสดงโฟลเดอร์ที่ติดตั้งโปรแกรม

องค์ประกอบของโปรแกรม XSection Plot

  • เมื่อรันโปรแกรมจะเห็นหน้าตา user interface ของโปรแกรมดูแล้วเรียบง่าย มี toolbarอยู่ด้านบน ด้านล่างเป็นตารางข้อมูล ซึ่งแยกได้เป็นสอง sheet คือ Typical section และ Existing ground section (Ground Section) ก่อนจะไปวิธีใช้งานผมขอขยายความอีกนิดว่า Typical Section หรือเรียกเต็มๆว่า Typical Cross Section เป็นรูปตัดทั่วๆไป ต่อไปมาดูส่วนประกอบของโปรแกรมกันก่อน

Main Toolbar

  • มาดู toolbar เริ่มจากซ้ายไปขวาจะเห็นคำสั่งค่อนข้างต่อเนื่องกัน เริ่มตั้งแต่สร้างไฟล์ใหม่ ไปจนถึงจัดเก็บแผนที่เป็น Autocad DXF เป็นอันเสร็จงาน ดูรูปด้านล่าง
แสดง toolbar ของ XSection Plot

ตารางข้อมูล (Typical Section & Existing ground section)

  • พูดถึงว่าเป็นตารางข้อมูล ดูเหมือนว่าต้องป้อนข้อมูล แต่จริงๆแล้วสามารถ import จาก text file ได้ไม่ยากนัก ตารางข้อมูลจะแบ่งตามจำนวนรูปตัด แต่ละรูปตัดจะมีชื่อ Section หรือ Station ถัดลงมาสองบรรทัดเป็นตัวเลขค่าพิกัดของแต่ละรูปตัด ประมาณว่าจุด 0,0 อยู่ที่ด้านล่างซ้ายของกระดาษ ถัดลงไปสองบรรทัดเป็นส่วนสำคัญของรูปตัดคือ ค่าระดับและระยะ offset
แสดงส่วนประกอบของตารางข้อมูล

วิธีการใช้งาน

การ import ข้อมูลรูปตัด

  • เมื่อเปิดโปรแกรมมาครั้งแรกตารางข้อมูลด้าน Typical Section และ Ground Section จะว่างยังไม่มีข้อมูล ผมจะลอง import ข้อมูลจาก text file โดยจะ browse ไปโฟลเดอร์ที่เก็บตัวอย่างไว้ ฟอร์แม็ตข้อมูลที่โปรแกรมสนับสนุนมีAERIAL SERVICES KORK
    ADOT SERIF
    CIVILCAD ASCII X-SEC
    COOPER ENG
    DEGINETIC
    GEODIMETER
    HYDRONAV
    ILLINOIS D.O.T.
    INTRA
    IOWA D.O.T.
    JONES & DEMILLE
    KBM
    MARKHURD
    MMSTEST
    MOSS
    MOSSGENIO
    NORTH DAKOTA D.O.T. DIGINETIC
    RAGAN SMITH
    RDS
    ROADCALC.ITF
    STATION-OFFSET(STA,O/S,ELEV)
    WILD CIP GRID
    WSPRO
    TERRAMODEL ROAD (4 decimal)
    TERRAMODEL ROAD (3 decimal)
Import ไฟล์รูปตัดรูปแบบ Terramodel (ทศนิยม 4 ตำแหน่ง)
  • จากรูปด้านบนเลือกไฟล์ที่โฟลเดอร์ที่ผมกล่าวไปแล้วคือ “c:\program files\survey suite\xsection plot\examples\kohkong” จะมีสอง text file ให้คลิกเลือก “KohKong Ground – Channel Cross section 700 to 3700.txt” เป็นไฟล์เก็บรูปตัดของดินเดิม ดูรูปด้านล่าง
เปรียบเทียบไฟล์ที่เลือกกับรูปแบบรูปตัดของจริง

การเลือกรูปตัดจากไฟล์

  • เมื่อผู้ใช้เลือกไฟล์ที่จะ import โปรแกรมจะเปรียบเทียบฟอร์แม็ตว่าเป็นไปตามที่กำหนดไว้หรือไม่ ถ้าใช่จะเห็นลิสต์ของรูปตัดขึ้นมาที่ช่องด้านบนดังรูปด้านล่าง
เลือกรูปตัดที่ต้องการเพื่อคัดลอกลงตารางข้อมูล
  • ดูตารางข้อมูลดินเดิม (Exist ground section) ด้านล่างจะเห็นข้อมูลที่ import เข้ามาในตารางเป็นที่เรียบร้อย
แสดงข้อมูลดินเดิมที่ import เข้ามา
  • ต่อไปจะ import ข้อมูลรูปตัดแต่เป็น Typical section ที่ toolbar คลิกที่เดิมคือ Import file เลือกไฟล์ “KohKong Typical – Channel Cross section 700 to 3700.txt” ที่หน้าเลือกรูปตัดให้คลิกที่ คัดลอกข้อมูลไปยัง Typical Section
การนำเข้าข้อมูล typical section
  • ตอนนี้เราจะได้ข้อมูลรูปตัดที่อยู่ในตาราง Typical Section และ Ground Section เป็นที่เรียบร้อย ตอนหน้ามาว่ากันเรื่องจัดหน้ากระดาษ และการวาง lay out ของรูปตัดบนกระดาษเขียนแบบ