หนทางข้างหน้าของ Traverse Pro ที่พัฒนาด้วย Lazarus (ตอนที่ 2)
27/02/2011
8 ของความคิดเห็น
พัฒนาและปรับปรุงต่อ
- ก็ต่อจากตอนที่ 1 ตอนนี้ผมปรับมาเป็นรุ่น 2.0.1 built 5727 พยายามโค๊ดเท่าที่เวลาเอื้ออำนวยครับ ปรับเรื่องตัวหนังสือภาษาไทยและเรื่อง print preview
ปัญหาของตัวหนังสือ Unicode
- หลังจาก update โปรแกรมมาได้พักหนึ่ง ผมก็พบกับปัญหา 2 เรื่องคือเรื่อง Unicode กับ Meta file (สำหรับการแสดง Print Preview) เรื่องแรกเนื่องจากเดิมโปรแกรมอยู่บน Delphi ตัวหนังสือที่เห็นบนโปรแกรมทั้งหมดเป็น Ascii เมื่อโปรแกรมมาอยู่บน Lazarus ที่สนับสนุน Unicode ในรูปแบบ UTF8 (Unicode Transformation Format — 8-bit) เต็มตัว ผมค่อนข้างมะงุมมะหราอยู่พักใหญ่ ภาษาไทยที่เคยแสดงได้บนกริด (เช่นตารางป้อนข้อมูล ตารางผลคำนวณ) กลับเป็นภาษามนุษย์ต่างดาว แต่ก็แก้ไขได้ไม่ยาก แต่ที่เหงื่อตกมากๆคือ สัญลักษณ์ (° degree) ที่แสดงผลมุมหลังตัวเลขกลับยากบนวินโดส์ แต่บน Ubuntu ง่ายกว่า บนวินโดส์ใช้ฟอนต์ Tahoma เป็นหลัก ส่วนบน Ubuntu ผมใช้ฟอนต์ Sans
- สัญลักษณ์ degree ใน ubuntu ทำได้โดยการ typecast ง่ายๆ ด้วยโค๊ด WideChar(#$00B0) ถ้าเปิดโปรแกรม character map จะเห็นว่าหมายเลข Unicode ตรงกันเป็นฐาน 16 คือ 00B0 แต่บนวินโดส์ที่ผมเสียเวลามากหาอยู่นานต้องใข้แบบนี้ UnicodeToUTF8(chr(176)) ผมค่อนข้างงงมาก เพราะสัญลักษณ์บนระบบ Ascii เก่าตัว degree ใช้ตัวเลข 176 แต่มันกลับ work
ปัญหาของ Metafile สำหรับ Print Preview
- โค๊ดดั้งเดิมใช้ Meta File ซึ่งเป็นฟอร์แม็ตถ้าจำไม่ผิดน่าจะออกแบบโดยไมโครซอฟท์ ซึ่งอะไรๆถ้าขึ้นกับไมโครซอฟท์ ก็ไม่ใช่ cross-platform ชื่อเต็มๆของ Meta file ก็คือ Windows Meta file คือ Meta file เป็นฟอร์แม็ตที่สามารถขยายหรือย่อได้โดยไม่เสีย resolution ในทางโปรแกรมมิ่งจะเขียนงานที่จะพิมพ์ลงบน Meta file ก่อนเวลาพิมพ์จริงๆ ก็แค่ลอกภาพจาก Meta file ลงไปที่เครื่องพิมพ์ ผมพยายามหาโค๊ดใหม่ของ Meta file ที่สนับสนุน cross-platform ก็โชคดีมีคนเขียนไว้ค่อนข้างดี ถ้าสนโปรแกรมมิ่ง free pascal เข้าไปดูและดาวน์โหลดได้ Lazarus Meta File
- ผมโค๊ด Print Preview ใหม่ ลองดูหน้าตาดังรูปด้านล่าง
- ลอง print บนวินโดส์ไม่มีปัญหาพิมพ์ออกเครื่องพิมพ์ได้ปกติ แต่ถ้าใช้ driver เป็นเครื่องพิมพ์จำพวก pdf ในวินโดส์ OK แต่ใน ubuntu ผมใช้ driver เรียกว่า cups-pdf ยังไม่ work ส่วน printer ใน Ubuntu ยังไม่ได้ลอง ตอนนี้ผมลองขยายหน้าดูเป็น 200 % จะเห็นดังรูปด้านล่าง
ปรับการจัดหน้ากระดาษ Page Setup
- ปรับปรุงโค๊ดเดิมจัดหน้ากระดาษเช่นตั้งกั้นหน้าซ้ายและขวา บนและล่าง เขียน header และ footer ได้ ลองดูภาพด้านล่างครับ
- ผมลองตั้งกั้นหน้าซ้ายขวาบนล่างแล้วใส่ header, fotter ดังรูปด้านบน ลองดูได้ผลดังรูปด้านล่าง
ปรับปรุง Plot Viewer
- งานวงรอบเมื่อคำนวณเรียบร้อยแล้ว งานอยู่ในเกณฑ์ขั้นต่อไปคือตรวจดูรูปร่างของวงรอบ โค๊ดในส่วนนี้ผมได้เข้าไปแก้ไขได้นิดเดียว ตัวหนังสือแสดงชื่อหมุดเมื่อเปิดครั้งแรกตัวหนังสือยังโอเค แต่พอซูมหรือแพนตัวหนังสือพลิกไป 90 องศา ที่จัดไปแล้วคือเรื่อง icon, status bar ที่เหลือยังต้องแก้ไขต่อไป ผมพยายามหา component ที่เป็น vector พบแล้วแต่ยังไม่รู้นำมาใช้จะเป็นอย่างไร สามารถ export เป็น SVG, DXF ได้
แก้ไขปัญหาเรื่องฟอนต์ไทยบนลินุกซ์
- เล่นเอาเหงื่อตก ตอน print preview ตัวหนังสือภาษาไทยก็แสดงผลอยู่ดีๆ แต่พอเวลา print หรือ print เป็น pdf ด้วยไดรเวอร์ cups/cups-pdf ตัวหนังสือไทยก็หายวับไปกับตา สาเหตุที่น่าจะเป็นไปได้ ผมว่าน่าจะมาจาก component ที่ติดมากับ Lazarus คือ Printer4Lazarus แนวทางแก้ไขของผมใน linux ใช้การเขียนภาพเข้าไปโดยตรง แบบนี้ข้อเสียข้อแรกก็คือ ไม่สามารถเลือก Text ได้จากโปรแกรม pdf editor เช่น pdfedit แต่ถ้าไปรันโปรแกรมนี้บนวินโดส์ก็ไม่มีปัญหา ข้อเสียข้อที่สองคือทำงานช้ากว่าเดิม
- มาลองดูโค๊ด โมดูลตัวนี้จะรับ object ก่อนพิมพ์ในรูปแบบ Meta File ผ่านตัวแปร AMetafile และต้องใช้ directive มาช่วยแยกโค๊ด linux ออกจากวินโดส์
procedure TPrintPreviewForm.PrintMetafile(const ARect : types.TRect;
AmetaFile : TGraphic);
var
bm : TBitmap;
begin
{$IFDEF LINUX}
bm := TBitmap.Create;
try
(* Use TBitmap to draw canvas from TlmfImage (Meta File *)
(* To solve the problem of Thai font on Linux *)
(* The following codes implemented for Linux *)
(* The disadvantage of this way *)
(* 1. Very slow *)
(* 2. In pdf file, all the result are images not text object *)
bm.Width := ARect.Right - ARect.Left;
bm.Height := ARect.Bottom - ARect.Top ;
bm.Canvas.Brush.Style := bsSolid;
bm.Canvas.Brush.Color := clWhite;
bm.Canvas.Rectangle(ARect);
TlmfImage(AMetafile).Draw(bm.Canvas, ARect);
Printer.Canvas.StretchDraw(Arect, bm);
{$ELSE}
(* The following codes that doesn't work with Thai font on Linux *)
(* but work fine on Windows *)
TlmfImage(AMetafile).Draw(Printer.Canvas, ARect);
{$ENDIF}
{$IFDEF LINUX}
finally
bm.Free;
end;
{$ENDIF}
end;
- ลองเปิดด้วย Document Viewer ได้ผลดังรูปด้านล่าง
หนทางข้างหน้า
- ปรับปรุง Plot Viewer ให้สามารถแสดงผลได้ถูกต้อง ปรับปรุงเรื่องสามารถ export ไปอยู่ในรูปแบบ DXF, SVG
- ปรับปรุงให้สามารถ Save as ผลการคำนวณวงรอบให้อยู่ในรูปแบบ xml หรือไม่ก็ xls สามารถเปิดได้ด้วย Excel หรือ Openoffice calc ได้ ในตอนนี้หา component มาช่วยยังไม่ได้ เขียนเิองเป็นไปไม่ได้เพราะหนักหนาเกินไป
- ปรับให้สามารถอ่านไฟล์ข้อมูลเดิมได้ (จากโปรแกรม Traverse Pro รุ่นเดิมที่เขียนด้วย Delphi) ที่ผมบอกไว้ก่อนหน้านี้คือ ไม่สามารถอ่านข้อมูลไฟล์ไบนารีในรูป type ที่เป็น extended ได้ (สำหรับโปรแกรมรุ่นก่อนพัฒนาด้วย Delphi ไม่มีปัญหากับการอ่าน type ข้อมูลแบบนี้)
Categories: CAD, Lazarus, Linux, Programming, Surveying, Windows
สำรวจ, โปรแกรมคำนวณวงรอบ, cross-platform, Lazarus, port code, Traverse pro


















