lazarus-ccr/applications/fpvviewer/fpvv_mainform.pas
2011-04-02 17:58:44 +00:00

141 lines
3.6 KiB
ObjectPascal

unit fpvv_mainform;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, EditBtn,
StdCtrls, Spin, ExtCtrls, ComCtrls,
fpvv_drawer;
type
{ TfrmFPVViewer }
TfrmFPVViewer = class(TForm)
btnVisualize: TButton;
btnViewDXFTokens: TButton;
editFileName: TFileNameEdit;
notebook: TNotebook;
pageViewer: TPage;
Page2: TPage;
spinScale: TFloatSpinEdit;
Label1: TLabel;
DXFTreeView: TTreeView;
procedure btnVisualizeClick(Sender: TObject);
procedure btnViewDXFTokensClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
Drawer: TFPVVDrawer;
end;
var
frmFPVViewer: TfrmFPVViewer;
implementation
uses
fpvectorial, cdrvectorialreader, svgvectorialwriter, pdfvectorialreader,
dxfvectorialreader,
fpvtocanvas,
dxftokentotree;
{$R *.lfm}
{ TfrmFPVViewer }
procedure TfrmFPVViewer.btnVisualizeClick(Sender: TObject);
const
FPVVIEWER_MAX_IMAGE_SIZE = 1000;
FPVVIEWER_MIN_IMAGE_SIZE = 100;
FPVVIEWER_SPACE_FOR_NEGATIVE_COORDS = 100;
var
Vec: TvVectorialDocument;
CanvasSize: TPoint;
begin
// First check the in input
//if not CheckInput() then Exit;
notebook.PageIndex := 0;
Drawer.Clear;
Vec := TvVectorialDocument.Create;
try
Vec.ReadFromFile(editFileName.FileName, vfDXF);
// We need to be robust, because sometimes the document size won't be given
// also give up drawing everything if we need more then 4MB of RAM for the image
// and also give some space in the image to allow for negative coordinates
if Vec.Width * spinScale.Value > FPVVIEWER_MAX_IMAGE_SIZE then CanvasSize.X := FPVVIEWER_MAX_IMAGE_SIZE
else if Vec.Width < FPVVIEWER_MIN_IMAGE_SIZE then CanvasSize.X := Drawer.Width
else CanvasSize.X := Round(Vec.Width * spinScale.Value);
if CanvasSize.X < Drawer.Width then CanvasSize.X := Drawer.Width;
if Vec.Height * spinScale.Value > FPVVIEWER_MAX_IMAGE_SIZE then CanvasSize.Y := FPVVIEWER_MAX_IMAGE_SIZE
else if Vec.Height < FPVVIEWER_MIN_IMAGE_SIZE then CanvasSize.Y := Drawer.Height
else CanvasSize.Y := Round(Vec.Height * spinScale.Value);
if CanvasSize.Y < Drawer.Height then CanvasSize.Y := Drawer.Height;
Drawer.Drawing.Width := CanvasSize.X;
Drawer.Drawing.Height := CanvasSize.Y;
Drawer.Drawing.Canvas.Brush.Color := clWhite;
Drawer.Drawing.Canvas.Brush.Style := bsSolid;
Drawer.Drawing.Canvas.FillRect(0, 0, Drawer.Drawing.Width, Drawer.Drawing.Height);
DrawFPVectorialToCanvas(
Vec,
Drawer.Drawing.Canvas,
FPVVIEWER_SPACE_FOR_NEGATIVE_COORDS,
Drawer.Drawing.Height - FPVVIEWER_SPACE_FOR_NEGATIVE_COORDS,
spinScale.Value,
-1 * spinScale.Value);
Drawer.Invalidate;
finally
Vec.Free;
end;
end;
procedure TfrmFPVViewer.btnViewDXFTokensClick(Sender: TObject);
var
Reader: TvDXFVectorialReader;
Vec: TvVectorialDocument;
begin
// First check the in input
//if not CheckInput() then Exit;
notebook.PageIndex := 1;
Reader := TvDXFVectorialReader.Create;
Vec := TvVectorialDocument.Create;
try
Reader.ReadFromFile(editFileName.FileName, Vec);
ConvertDXFTokensToTreeView(Reader.Tokenizer.Tokens, DXFTreeView);
finally
Reader.Free;
Vec.Free;
end;
end;
procedure TfrmFPVViewer.FormCreate(Sender: TObject);
begin
Drawer := TFPVVDrawer.Create(Self);
Drawer.Parent := pageViewer;
Drawer.Top := 5;
Drawer.Left := 5;
Drawer.AnchorClient(5);
Drawer.TabStop := True;
end;
procedure TfrmFPVViewer.FormDestroy(Sender: TObject);
begin
Drawer.Free;
end;
end.