Improves the drawer and starts reading the document size

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1491 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat 2011-02-10 08:24:19 +00:00
parent 11f1066ff7
commit 6bad8a4219
5 changed files with 148 additions and 32 deletions

View File

@ -77,6 +77,7 @@ type
procedure ReadENTITIES_LINE(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_ARC(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_CIRCLE(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_DIMENSION(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_ELLIPSE(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_TEXT(ATokens: TDXFTokens; AData: TvVectorialDocument);
function GetCoordinateValue(AStr: shortstring): Double;
@ -344,6 +345,16 @@ begin
CurToken := TDXFToken(ATokens.Items[i+1]);
ANGDIR := StrToInt(CurToken.StrValue);
Inc(i);
end
// This indicates the size of the document
else if CurToken.StrValue = '$LIMMAX' then
begin
{$Warning Actually verify if the values are present in this order}
CurToken := TDXFToken(ATokens.Items[i+1]); // If Group 10
aData.Width := StrToFloat(CurToken.StrValue);
CurToken := TDXFToken(ATokens.Items[i+2]); // If Group 20
aData.Height := StrToFloat(CurToken.StrValue);
Inc(i, 2);
end;
Inc(i);
@ -360,6 +371,7 @@ begin
CurToken := TDXFToken(ATokens.Items[i]);
if CurToken.StrValue = 'ARC' then ReadENTITIES_ARC(CurToken.Childs, AData)
else if CurToken.StrValue = 'CIRCLE' then ReadENTITIES_CIRCLE(CurToken.Childs, AData)
else if CurToken.StrValue = 'DIMENSION' then ReadENTITIES_DIMENSION(CurToken.Childs, AData)
else if CurToken.StrValue = 'ELLIPSE' then ReadENTITIES_ELLIPSE(CurToken.Childs, AData)
else if CurToken.StrValue = 'LINE' then ReadENTITIES_LINE(CurToken.Childs, AData)
else if CurToken.StrValue = 'TEXT' then
@ -514,6 +526,99 @@ begin
CircleCenterZ, CircleRadius);
end;
{
Group codes Description
100 Subclass marker (AcDbDimension)
2 Name of the block that contains the entities that make up the dimension picture
10 Definition point (in WCS) DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of definition point (in WCS)
11 Middle point of dimension text (in OCS) DXF: X value; APP: 3D point
21, 31 DXF: Y and Z values of middle point of dimension text (in OCS)
70 Dimension type.
Values 0-6 are integer values that represent the dimension type.
Values 32, 64, and 128 are bit values, which are added to the integer values
(value 32 is always set in R13 and later releases).
0 = Rotated, horizontal, or vertical; 1 = Aligned;
2 = Angular; 3 = Diameter; 4 = Radius;
5 = Angular 3 point; 6 = Ordinate;
32 = Indicates that the block reference (group code 2) is referenced by this dimension only.
64 = Ordinate type. This is a bit value (bit 7) used only with integer value 6.
If set, ordinate is X-type; if not set, ordinate is Y-type.
128 = This is a bit value (bit 8) added to the other group 70 values
if the dimension text has been positioned at a user-defined location
rather than at the default location.
71 Attachment point:
1 = Top left; 2 = Top center; 3 = Top right;
4 = Middle left; 5 = Middle center; 6 = Middle right;
7 = Bottom left; 8 = Bottom center; 9 = Bottom right
72 Dimension text line spacing style (optional):
1(or missing) = At least (taller characters will override)
2 = Exact (taller characters will not override)
41 Dimension text line spacing factor (optional):
Percentage of default (3-on-5) line spacing to be applied. Valid values range from 0.25 to 4.00.
42 Actual measurement (optional; read-only value)
1 Dimension text explicitly entered by the user. Optional; default is the measurement.
If null or "<>", the dimension measurement is drawn as the text,
if " " (one blank space), the text is suppressed. Anything else is drawn as the text.
53 The optional group code 53 is the rotation angle of the dimension
text away from its default orientation (the direction of the dimension line) (optional).
51 All dimension types have an optional 51 group code, which indicates the
horizontal direction for the dimension entity. The dimension entity determines
the orientation of dimension text and lines for horizontal, vertical, and
rotated linear dimensions.
This group value is the negative of the angle between the OCS X axis
and the UCS X axis. It is always in the XY plane of the OCS.
210 Extrusion direction (optional; default = 0, 0, 1) DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction (optional)
3 Dimension style name
}
procedure TvDXFVectorialReader.ReadENTITIES_DIMENSION(ATokens: TDXFTokens;
AData: TvVectorialDocument);
{var
CurToken: TDXFToken;
i: Integer;
// LINE
LineStartX, LineStartY, LineStartZ: Double;
LineEndX, LineEndY, LineEndZ: Double;}
begin
{ // Initial values
LineStartX := 0;
LineStartY := 0;
LineStartZ := 0;
LineEndX := 0;
LineEndY := 0;
LineEndZ := 0;
for i := 0 to ATokens.Count - 1 do
begin
// Now read and process the item name
CurToken := TDXFToken(ATokens.Items[i]);
// Avoid an exception by previously checking if the conversion can be made
if CurToken.GroupCode in [10, 20, 30, 11, 21, 31] then
begin
CurToken.FloatValue := StrToFloat(Trim(CurToken.StrValue), FPointSeparator);
end;
case CurToken.GroupCode of
10: LineStartX := CurToken.FloatValue;
20: LineStartY := CurToken.FloatValue;
30: LineStartZ := CurToken.FloatValue;
11: LineEndX := CurToken.FloatValue;
21: LineEndY := CurToken.FloatValue;
31: LineEndZ := CurToken.FloatValue;
end;
end;
// And now write it
{$ifdef FPVECTORIALDEBUG}
// WriteLn(Format('Adding Line from %f,%f to %f,%f', [LineStartX, LineStartY, LineEndX, LineEndY]));
{$endif}
AData.StartPath(LineStartX, LineStartY);
AData.AddLineToPath(LineEndX, LineEndY);
AData.EndPath();}
end;
{
100 Subclass marker (AcDbEllipse)
10 Center point (in WCS) DXF: X value; APP: 3D point

View File

@ -6,6 +6,8 @@ object frmFPVViewer: TfrmFPVViewer
Caption = 'Free Pascal Vectorial Viewer'
ClientHeight = 473
ClientWidth = 375
OnCreate = FormCreate
OnDestroy = FormDestroy
LCLVersion = '0.9.31'
object editFileName: TFileNameEdit
Left = 8
@ -82,13 +84,13 @@ object frmFPVViewer: TfrmFPVViewer
Caption = 'Start Pos Y:'
ParentColor = False
end
object Button1: TButton
object btnViewDXFTokens: TButton
Left = 112
Height = 25
Top = 41
Width = 128
Caption = 'View DXF Tokens'
OnClick = Button1Click
OnClick = btnViewDXFTokensClick
TabOrder = 5
end
object notebook: TNotebook
@ -104,23 +106,7 @@ object frmFPVViewer: TfrmFPVViewer
Anchors = [akTop, akLeft, akRight, akBottom]
TabOrder = 6
TabStop = True
object Page1: TPage
ClientWidth = 375
ClientHeight = 345
object imageView: TImage
AnchorSideRight.Control = Page1
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Page1
AnchorSideBottom.Side = asrBottom
Left = 8
Height = 332
Top = 8
Width = 362
Anchors = [akTop, akLeft, akRight, akBottom]
AutoSize = True
BorderSpacing.Right = 5
BorderSpacing.Bottom = 5
end
object pageViewer: TPage
end
object Page2: TPage
ClientWidth = 21504

View File

@ -6,7 +6,8 @@ interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, EditBtn,
StdCtrls, Spin, ExtCtrls, ComCtrls;
StdCtrls, Spin, ExtCtrls, ComCtrls,
fpvv_drawer;
type
@ -14,13 +15,12 @@ type
TfrmFPVViewer = class(TForm)
btnVisualize: TButton;
Button1: TButton;
btnViewDXFTokens: TButton;
editFileName: TFileNameEdit;
imageView: TImage;
Label2: TLabel;
Label3: TLabel;
notebook: TNotebook;
Page1: TPage;
pageViewer: TPage;
Page2: TPage;
spinStartX: TSpinEdit;
spinStartY: TSpinEdit;
@ -28,12 +28,15 @@ type
Label1: TLabel;
DXFTreeView: TTreeView;
procedure btnVisualizeClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure btnViewDXFTokensClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
Drawer: TFPVVDrawer;
end;
var
frmFPVViewer: TfrmFPVViewer;
@ -62,21 +65,24 @@ begin
Vec := TvVectorialDocument.Create;
try
Vec.ReadFromFile(editFileName.FileName, vfDXF);
imageView.Canvas.Brush.Color := clWhite;
imageView.Canvas.FillRect(0, 0, imageView.Width, imageView.Height);
Drawer.Drawing.Width := Round(Vec.Width);
Drawer.Drawing.Height := Round(Vec.Height);
Drawer.Drawing.Canvas.Brush.Color := clWhite;
Drawer.Drawing.Canvas.FillRect(0, 0, Drawer.Drawing.Width, Drawer.Drawing.Height);
DrawFPVectorialToCanvas(
Vec,
imageView.Canvas,
Drawer.Drawing.Canvas,
spinStartX.Value,
spinStartY.Value + imageView.Height,
spinStartY.Value + Drawer.Drawing.Height,
spinScale.Value,
-1 * spinScale.Value);
Drawer.Invalidate;
finally
Vec.Free;
end;
end;
procedure TfrmFPVViewer.Button1Click(Sender: TObject);
procedure TfrmFPVViewer.btnViewDXFTokensClick(Sender: TObject);
var
Reader: TvDXFVectorialReader;
Vec: TvVectorialDocument;
@ -97,5 +103,19 @@ begin
end;
end;
procedure TfrmFPVViewer.FormCreate(Sender: TObject);
begin
Drawer := TFPVVDrawer.Create(Self);
Drawer.Parent := pageViewer;
Drawer.Top := 5;
Drawer.Left := 5;
Drawer.AnchorClient(5);
end;
procedure TfrmFPVViewer.FormDestroy(Sender: TObject);
begin
Drawer.Free;
end;
end.

View File

@ -33,7 +33,7 @@
<PackageName Value="LCL"/>
</Item1>
</RequiredPackages>
<Units Count="3">
<Units Count="4">
<Unit0>
<Filename Value="fpvviewer.lpr"/>
<IsPartOfProject Value="True"/>
@ -51,6 +51,11 @@
<IsPartOfProject Value="True"/>
<UnitName Value="dxftokentotree"/>
</Unit2>
<Unit3>
<Filename Value="fpvv_drawer.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="fpvv_drawer"/>
</Unit3>
</Units>
</ProjectOptions>
<CompilerOptions>

View File

@ -7,7 +7,7 @@ uses
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, fpvv_mainform, dxftokentotree
Forms, fpvv_mainform, dxftokentotree, fpvv_drawer
{ you can add units after this };
{$R *.res}