Fixes the dxftokentotree.pas performance and makes the dxf reader more powerful

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1472 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat
2011-01-30 14:37:28 +00:00
parent 2c37512236
commit 21518cb872
4 changed files with 93 additions and 31 deletions

View File

@@ -29,12 +29,17 @@ var
begin begin
if ATokens = nil then Exit; if ATokens = nil then Exit;
for i := 0 to ATokens.Count - 1 do ATreeNodes.BeginUpdate(); // Greatly speeds up the operation
begin try
AToken := TDXFToken(ATokens.Items[i]); for i := 0 to ATokens.Count - 1 do
NodeStr := Format('(%d %s)', [AToken.GroupCode, AToken.StrValue]); begin
NewNode := ATreeNodes.AddChild(ABaseNode, NodeStr); AToken := TDXFToken(ATokens.Items[i]);
ConvertDXFTokensToTreeNodes(AToken.Childs, NewNode.TreeNodes, NewNode); NodeStr := Format('(%d %s)', [AToken.GroupCode, AToken.StrValue]);
NewNode := ATreeNodes.AddChild(ABaseNode, NodeStr);
ConvertDXFTokensToTreeNodes(AToken.Childs, NewNode.TreeNodes, NewNode);
end;
finally
ATreeNodes.EndUpdate();
end; end;
end; end;

View File

@@ -67,8 +67,12 @@ type
TvDXFVectorialReader = class(TvCustomVectorialReader) TvDXFVectorialReader = class(TvCustomVectorialReader)
private private
FPointSeparator: TFormatSettings; FPointSeparator: TFormatSettings;
// HEADER data
ANGBASE: Double;
ANGDIR: Integer;
// //
function SeparateString(AString: string; ASeparator: Char): T10Strings; function SeparateString(AString: string; ASeparator: Char): T10Strings;
procedure ReadHEADER(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES(ATokens: TDXFTokens; AData: TvVectorialDocument); procedure ReadENTITIES(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_LINE(ATokens: TDXFTokens; AData: TvVectorialDocument); procedure ReadENTITIES_LINE(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_ARC(ATokens: TDXFTokens; AData: TvVectorialDocument); procedure ReadENTITIES_ARC(ATokens: TDXFTokens; AData: TvVectorialDocument);
@@ -91,6 +95,12 @@ implementation
{$endif} {$endif}
const const
DXF_AUTOCAD_2000_R10 = 'AC1006';
DXF_AUTOCAD_2000_R11 = 'AC1009';
DXF_AUTOCAD_2000_R11_and_R12 = 'AC1009';
// DXF_AUTOCAD_2000_R11 = 'AC1009';
// = R10, AC1009 = R11 and R12, AC1012 = R13, AC1014 = R14
// Group Codes for ENTITIES // Group Codes for ENTITIES
DXF_ENTITIES_TYPE = 0; DXF_ENTITIES_TYPE = 0;
DXF_ENTITIES_HANDLE = 5; DXF_ENTITIES_HANDLE = 5;
@@ -310,6 +320,33 @@ begin
end; end;
end; end;
procedure TvDXFVectorialReader.ReadHEADER(ATokens: TDXFTokens;
AData: TvVectorialDocument);
var
i: Integer;
CurToken: TDXFToken;
begin
i := 0;
while i < ATokens.Count do
begin
CurToken := TDXFToken(ATokens.Items[i]);
if CurToken.StrValue = '$ANGBASE' then
begin
CurToken := TDXFToken(ATokens.Items[i+1]);
ANGBASE := StrToFloat(CurToken.StrValue, FPointSeparator);
Inc(i);
end
else if CurToken.StrValue = '$ANGDIR' then
begin
CurToken := TDXFToken(ATokens.Items[i+1]);
ANGDIR := StrToInt(CurToken.StrValue);
Inc(i);
end;
Inc(i);
end;
end;
procedure TvDXFVectorialReader.ReadENTITIES(ATokens: TDXFTokens; AData: TvVectorialDocument); procedure TvDXFVectorialReader.ReadENTITIES(ATokens: TDXFTokens; AData: TvVectorialDocument);
var var
i: Integer; i: Integer;
@@ -591,6 +628,10 @@ begin
FPointSeparator.DecimalSeparator := '.'; FPointSeparator.DecimalSeparator := '.';
FPointSeparator.ThousandSeparator := '#';// disable the thousand separator FPointSeparator.ThousandSeparator := '#';// disable the thousand separator
// Default HEADER data
ANGBASE := 0.0; // Starts pointing to the right / east
ANGDIR := 0; // counter-clock wise
Tokenizer := TDXFTokenizer.Create; Tokenizer := TDXFTokenizer.Create;
end; end;
@@ -618,7 +659,9 @@ begin
CurToken := TDXFToken(Tokenizer.Tokens.Items[i]); CurToken := TDXFToken(Tokenizer.Tokens.Items[i]);
CurTokenFirstChild := TDXFToken(CurToken.Childs.Items[0]); CurTokenFirstChild := TDXFToken(CurToken.Childs.Items[0]);
if CurTokenFirstChild.StrValue = 'ENTITIES' then if CurTokenFirstChild.StrValue = 'HEADER' then
ReadHEADER(CurToken.Childs, AData)
else if CurTokenFirstChild.StrValue = 'ENTITIES' then
ReadENTITIES(CurToken.Childs, AData); ReadENTITIES(CurToken.Childs, AData);
end; end;
end; end;

View File

@@ -1,15 +1,15 @@
object frmFPVViewer: TfrmFPVViewer object frmFPVViewer: TfrmFPVViewer
Left = 186 Left = 186
Height = 441 Height = 473
Top = 137 Top = 137
Width = 336 Width = 375
Caption = 'Free Pascal Vectorial Viewer' Caption = 'Free Pascal Vectorial Viewer'
ClientHeight = 441 ClientHeight = 473
ClientWidth = 336 ClientWidth = 375
LCLVersion = '0.9.31' LCLVersion = '0.9.31'
object editFileName: TFileNameEdit object editFileName: TFileNameEdit
Left = 8 Left = 8
Height = 22 Height = 23
Top = 8 Top = 8
Width = 304 Width = 304
DialogOptions = [] DialogOptions = []
@@ -31,7 +31,7 @@ object frmFPVViewer: TfrmFPVViewer
end end
object spinScale: TFloatSpinEdit object spinScale: TFloatSpinEdit
Left = 72 Left = 72
Height = 16 Height = 23
Top = 72 Top = 72
Width = 64 Width = 64
Increment = 1 Increment = 1
@@ -42,39 +42,39 @@ object frmFPVViewer: TfrmFPVViewer
end end
object Label1: TLabel object Label1: TLabel
Left = 8 Left = 8
Height = 17 Height = 16
Top = 79 Top = 79
Width = 56 Width = 47
Caption = 'Scale by:' Caption = 'Scale by:'
ParentColor = False ParentColor = False
end end
object Label2: TLabel object Label2: TLabel
Left = 8 Left = 8
Height = 17 Height = 16
Top = 104 Top = 104
Width = 73 Width = 60
Caption = 'Start Pos X:' Caption = 'Start Pos X:'
ParentColor = False ParentColor = False
end end
object spinStartX: TSpinEdit object spinStartX: TSpinEdit
Left = 98 Left = 98
Height = 16 Height = 23
Top = 99 Top = 99
Width = 46 Width = 46
TabOrder = 3 TabOrder = 3
end end
object spinStartY: TSpinEdit object spinStartY: TSpinEdit
Left = 240 Left = 240
Height = 16 Height = 23
Top = 99 Top = 99
Width = 50 Width = 50
TabOrder = 4 TabOrder = 4
end end
object Label3: TLabel object Label3: TLabel
Left = 152 Left = 152
Height = 17 Height = 16
Top = 104 Top = 104
Width = 72 Width = 60
Caption = 'Start Pos Y:' Caption = 'Start Pos Y:'
ParentColor = False ParentColor = False
end end
@@ -88,26 +88,40 @@ object frmFPVViewer: TfrmFPVViewer
TabOrder = 5 TabOrder = 5
end end
object notebook: TNotebook object notebook: TNotebook
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 0 Left = 0
Height = 313 Height = 340
Top = 128 Top = 128
Width = 336 Width = 370
PageIndex = 0 PageIndex = 0
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Right = 5
BorderSpacing.Bottom = 5
TabOrder = 6 TabOrder = 6
TabStop = True TabStop = True
object Page1: TPage object Page1: TPage
ClientWidth = 336 ClientWidth = 370
ClientHeight = 313 ClientHeight = 340
object imageView: TImage object imageView: TImage
AnchorSideRight.Control = Page1
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Page1
AnchorSideBottom.Side = asrBottom
Left = 8 Left = 8
Height = 296 Height = 327
Top = 8 Top = 8
Width = 325 Width = 357
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Right = 5
BorderSpacing.Bottom = 5
end end
end end
object Page2: TPage object Page2: TPage
ClientWidth = 672 ClientWidth = 1344
ClientHeight = 626 ClientHeight = 1252
object DXFTreeView: TTreeView object DXFTreeView: TTreeView
Left = 8 Left = 8
Height = 313 Height = 313

View File

@@ -15,7 +15,7 @@
<StringTable ProductVersion=""/> <StringTable ProductVersion=""/>
</VersionInfo> </VersionInfo>
<BuildModes Count="1"> <BuildModes Count="1">
<Item1 Name="Default" Default="True"/> <Item1 Name="default" Default="True"/>
</BuildModes> </BuildModes>
<PublishOptions> <PublishOptions>
<Version Value="2"/> <Version Value="2"/>
@@ -54,7 +54,7 @@
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>
<Version Value="9"/> <Version Value="10"/>
<Target> <Target>
<Filename Value="fpvviewer"/> <Filename Value="fpvviewer"/>
</Target> </Target>