Unfinishes linux fixes

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1495 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat
2011-02-11 16:24:47 +00:00
parent 7f3a6e2c8b
commit 43c43128a1
4 changed files with 90 additions and 64 deletions

View File

@@ -326,7 +326,7 @@ end;
procedure TvDXFVectorialReader.ReadHEADER(ATokens: TDXFTokens;
AData: TvVectorialDocument);
var
i: Integer;
i, j: Integer;
CurToken: TDXFToken;
begin
i := 0;
@@ -348,12 +348,23 @@ begin
// 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);
// Check the next 2 items and verify if they are the values of the size of the document
for j := 0 to 1 do
begin
CurToken := TDXFToken(ATokens.Items[i+1]);
case CurToken.GroupCode of
10:
begin;
aData.Width := StrToFloat(CurToken.StrValue, FPointSeparator);
Inc(i);
end;
20:
begin
aData.Height := StrToFloat(CurToken.StrValue, FPointSeparator);
Inc(i);
end;
end;
end;
end;
Inc(i);
@@ -427,6 +438,8 @@ begin
end;
{
Arcs are always counter-clockwise in DXF
100 Subclass marker (AcDbCircle)
39 Thickness (optional; default = 0)
10 Center point (in OCS) DXF: X value; APP: 3D point
@@ -633,29 +646,34 @@ begin
end;
end;
// Now make sure that we actually have the right positions
if BaseRight.X < BaseLeft.X then
begin
TmpPoint := BaseRight;
BaseRight := BaseLeft;
BaseLeft := TmpPoint;
end;
// Considering the the Base and the Dimension position must form a parallelogram
// we can solve the other dimention point through the midpoint formula
// which means that in a paralelogram A, B, C, D, with A and D opposites
// midpoint(AD)=midpoint(BC)
// in our case: A=BaseLeft B=DimLeft C=BaseRight D=DimRIght
// midpoint(AD)x=(Ax+Dx)/2
DimensionLeft.X := BaseLeft.X - BaseRight.X + DimensionRight.X;
DimensionLeft.Y := BaseLeft.Y - BaseRight.Y + DimensionRight.Y;
// And now write it
{$ifdef FPVECTORIALDEBUG}
// WriteLn(Format('Adding Line from %f,%f to %f,%f', [LineStartX, LineStartY, LineEndX, LineEndY]));
{$endif}
if IsAlignedDimension then
begin
// Now make sure that we actually have the right positions
if BaseRight.X < BaseLeft.X then
begin
TmpPoint := BaseRight;
BaseRight := BaseLeft;
BaseLeft := TmpPoint;
end;
// Now check if we are a horizontal or vertical dimension
// horizontal
if DimensionRight.Y = BaseRight.Y then
begin
DimensionLeft.X := BaseLeft.X;
DimensionLeft.Y := DimensionRight.Y;
end
else
begin
DimensionLeft.Y := BaseLeft.Y;
DimensionLeft.X := DimensionRight.X;
end;
AData.AddAlignedDimension(BaseLeft, BaseRight, DimensionLeft, DimensionRight);
end;
end;

View File

@@ -125,7 +125,8 @@ var
CurCircle: TvCircle;
CurEllipse: TvEllipse;
CurArc: TvCircularArc;
FinalStartAngle, FinalEndAngle: double;
FinalStartAngle, FinalEndAngle, tmpAngle: double;
BoundsLeft, BoundsTop, BoundsRight, BoundsBottom: Word;
CurDim: TvAlignedDimension;
begin
{$ifdef FPVECTORIALDEBUG}
@@ -134,6 +135,7 @@ begin
PosX := 0;
PosY := 0;
ADest.Brush.Style := bsClear;
ADest.MoveTo(ADestX, ADestY);
@@ -151,17 +153,11 @@ begin
case CurSegment.SegmentType of
stMoveTo:
begin
ADest.MoveTo(
Round(ADestX + AMulX * Cur2DSegment.X),
Round(ADestY + AMulY * Cur2DSegment.Y)
);
ADest.MoveTo(CoordToCanvasX(Cur2DSegment.X), CoordToCanvasY(Cur2DSegment.Y));
end;
st2DLine, st3DLine:
begin
ADest.LineTo(
Round(ADestX + AMulX * Cur2DSegment.X),
Round(ADestY + AMulY * Cur2DSegment.Y)
);
ADest.LineTo(CoordToCanvasX(Cur2DSegment.X), CoordToCanvasY(Cur2DSegment.Y));
end;
{ To draw a bezier we need to divide the interval in parts and make
lines between this parts }
@@ -177,9 +173,7 @@ begin
t := k / CurveLength;
CurX := Round(sqr(1 - t) * (1 - t) * PosX + 3 * t * sqr(1 - t) * Cur2DBSegment.X2 + 3 * t * t * (1 - t) * Cur2DBSegment.X3 + t * t * t * Cur2DBSegment.X);
CurY := Round(sqr(1 - t) * (1 - t) * PosY + 3 * t * sqr(1 - t) * Cur2DBSegment.Y2 + 3 * t * t * (1 - t) * Cur2DBSegment.Y3 + t * t * t * Cur2DBSegment.Y);
ADest.LineTo(
Round(ADestX + AMulX * CurX),
Round(ADestY + AMulY * CurY));
ADest.LineTo(CoordToCanvasX(CurX), CoordToCanvasY(CurY));
end;
PosX := Round(Cur2DBSegment.X);
PosY := Round(Cur2DBSegment.Y);
@@ -196,10 +190,10 @@ begin
begin
CurCircle := CurEntity as TvCircle;
ADest.Ellipse(
Round(ADestX + AmulX * (CurCircle.CenterX - CurCircle.Radius)),
Round(ADestY + AMulY * (CurCircle.CenterY - CurCircle.Radius)),
Round(ADestX + AmulX * (CurCircle.CenterX + CurCircle.Radius)),
Round(ADestY + AMulY * (CurCircle.CenterY + CurCircle.Radius))
CoordToCanvasX(CurCircle.CenterX - CurCircle.Radius),
CoordToCanvasY(CurCircle.CenterY - CurCircle.Radius),
CoordToCanvasX(CurCircle.CenterX + CurCircle.Radius),
CoordToCanvasY(CurCircle.CenterY + CurCircle.Radius)
);
end
else if CurEntity is TvEllipse then
@@ -217,22 +211,32 @@ begin
begin
FinalStartAngle := CurArc.StartAngle;
FinalEndAngle := CurArc.EndAngle;
BoundsLeft := CoordToCanvasX(CurArc.CenterX - CurArc.Radius);
BoundsTop := CoordToCanvasY(CurArc.CenterY - CurArc.Radius);
BoundsRight := CoordToCanvasY(CurArc.CenterX + CurArc.Radius);
BoundsBottom := CoordToCanvasY(CurArc.CenterY + CurArc.Radius);
end
else // AMulY is negative
begin
// Inverting the angles generates the correct result for Y axis inversion
FinalStartAngle := 360 - 1* CurArc.EndAngle;
FinalEndAngle := 360 - 1* CurArc.StartAngle;
BoundsLeft := CoordToCanvasX(CurArc.CenterX - CurArc.Radius);
BoundsTop := CoordToCanvasY(CurArc.CenterY + CurArc.Radius);
BoundsRight := CoordToCanvasY(CurArc.CenterX + CurArc.Radius);
BoundsBottom := CoordToCanvasY(CurArc.CenterY - CurArc.Radius);
end;
// Arc(ALeft, ATop, ARight, ABottom, Angle16Deg, Angle16DegLength: Integer);
ADest.Arc(
Round(ADestX + AmulX * (CurArc.CenterX - CurArc.Radius)),
Round(ADestY + AmulY * (CurArc.CenterY - CurArc.Radius)),
Round(ADestX + AmulX * (CurArc.CenterX + CurArc.Radius)),
Round(ADestY + AmulY * (CurArc.CenterY + CurArc.Radius)),
BoundsLeft, BoundsTop, BoundsRight, BoundsBottom,
Round(16*FinalStartAngle),
Round(16*(FinalEndAngle - FinalStartAngle))
Abs(Round(16*(FinalEndAngle - FinalStartAngle)))
);
// Debug info
{ ADest.TextOut(CoordToCanvasX(CurArc.CenterX), CoordToCanvasY(CurArc.CenterY),
Format('R=%d', [Round(CurArc.Radius)]));
ADest.Rectangle(
BoundsLeft, BoundsTop, BoundsRight, BoundsBottom);}
{$endif}
end
else if CurEntity is TvAlignedDimension then
@@ -241,12 +245,12 @@ begin
{ ADest.MoveTo(CoordToCanvasX(CurDim.BaseRight.X), CoordToCanvasY(CurDim.BaseRight.Y));
ADest.LineTo(CoordToCanvasX(CurDim.DimensionRight.X), CoordToCanvasY(CurDim.DimensionRight.Y));
ADest.LineTo(CoordToCanvasX(CurDim.DimensionLeft.X), CoordToCanvasY(CurDim.DimensionLeft.Y));
ADest.LineTo(CoordToCanvasX(CurDim.BaseLeft.X), CoordToCanvasY(CurDim.BaseLeft.Y));}
ADest.LineTo(CoordToCanvasX(CurDim.BaseLeft.X), CoordToCanvasY(CurDim.BaseLeft.Y));
// Debug info
// ADest.TextOut(CoordToCanvasX(CurDim.BaseRight.X), CoordToCanvasY(CurDim.BaseRight.Y), 'BR');
// ADest.TextOut(CoordToCanvasX(CurDim.DimensionRight.X), CoordToCanvasY(CurDim.DimensionRight.Y), 'DR');
// ADest.TextOut(CoordToCanvasX(CurDim.DimensionLeft.X), CoordToCanvasY(CurDim.DimensionLeft.Y), 'DL');
// ADest.TextOut(CoordToCanvasX(CurDim.BaseLeft.X), CoordToCanvasY(CurDim.BaseLeft.Y), 'BL');
ADest.TextOut(CoordToCanvasX(CurDim.BaseRight.X), CoordToCanvasY(CurDim.BaseRight.Y), 'BR');
ADest.TextOut(CoordToCanvasX(CurDim.DimensionRight.X), CoordToCanvasY(CurDim.DimensionRight.Y), 'DR');
ADest.TextOut(CoordToCanvasX(CurDim.DimensionLeft.X), CoordToCanvasY(CurDim.DimensionLeft.Y), 'DL');
ADest.TextOut(CoordToCanvasX(CurDim.BaseLeft.X), CoordToCanvasY(CurDim.BaseLeft.Y), 'BL');}
end;
end;

View File

@@ -11,7 +11,7 @@ object frmFPVViewer: TfrmFPVViewer
LCLVersion = '0.9.31'
object editFileName: TFileNameEdit
Left = 8
Height = 22
Height = 25
Top = 8
Width = 304
DialogOptions = []
@@ -33,7 +33,7 @@ object frmFPVViewer: TfrmFPVViewer
end
object spinScale: TFloatSpinEdit
Left = 72
Height = 16
Height = 25
Top = 72
Width = 64
Increment = 1
@@ -44,23 +44,23 @@ object frmFPVViewer: TfrmFPVViewer
end
object Label1: TLabel
Left = 8
Height = 17
Height = 18
Top = 79
Width = 56
Width = 58
Caption = 'Scale by:'
ParentColor = False
end
object Label2: TLabel
Left = 8
Height = 17
Height = 18
Top = 104
Width = 73
Width = 76
Caption = 'Start Pos X:'
ParentColor = False
end
object spinStartX: TSpinEdit
Left = 98
Height = 16
Height = 25
Top = 99
Width = 46
MaxValue = 1000
@@ -69,7 +69,7 @@ object frmFPVViewer: TfrmFPVViewer
end
object spinStartY: TSpinEdit
Left = 240
Height = 16
Height = 25
Top = 99
Width = 50
MaxValue = 1000
@@ -78,9 +78,9 @@ object frmFPVViewer: TfrmFPVViewer
end
object Label3: TLabel
Left = 152
Height = 17
Height = 18
Top = 104
Width = 72
Width = 73
Caption = 'Start Pos Y:'
ParentColor = False
end
@@ -109,8 +109,8 @@ object frmFPVViewer: TfrmFPVViewer
object pageViewer: TPage
end
object Page2: TPage
ClientWidth = 21504
ClientHeight = 20032
ClientWidth = 43008
ClientHeight = 40064
object DXFTreeView: TTreeView
Left = 8
Height = 313

View File

@@ -28,10 +28,14 @@
<LaunchingApplication PathPlusParams="/usr/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="1">
<RequiredPackages Count="2">
<Item1>
<PackageName Value="LCL"/>
<PackageName Value="LCLBase"/>
<MinVersion Major="1" Release="1" Valid="True"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="4">
<Unit0>