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:
parent
11f1066ff7
commit
6bad8a4219
@ -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
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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}
|
||||
|
Loading…
Reference in New Issue
Block a user