Fixes the rendering on Windows and advances the fpvectorial dimension reading

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1497 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat
2011-02-12 20:06:28 +00:00
parent 31a7114c96
commit 8b1aedbcd0
3 changed files with 75 additions and 19 deletions

View File

@ -663,15 +663,36 @@ begin
// Now check if we are a horizontal or vertical dimension // Now check if we are a horizontal or vertical dimension
// horizontal // horizontal
if DimensionRight.Y = BaseRight.Y then //
//DL____ DR
// | |
// | |
// BL BR
if DimensionRight.X = BaseRight.X then
begin begin
DimensionLeft.X := BaseLeft.X; DimensionLeft.X := BaseLeft.X;
DimensionLeft.Y := DimensionRight.Y; DimensionLeft.Y := DimensionRight.Y;
end end
else // vertical
//
// BL ----|DR
// BR --|DL
//
// In this case we invert then DR and DL
else if DimensionRight.Y = BaseLeft.Y then
begin
DimensionLeft := DimensionRight;
DimensionRight.Y := BaseRight.Y;
end
// vertical
//
// BL ----|DL
// BR --|DR
//
else if DimensionRight.Y = BaseRight.Y then
begin begin
DimensionLeft.Y := BaseLeft.Y;
DimensionLeft.X := DimensionRight.X; DimensionLeft.X := DimensionRight.X;
DimensionLeft.Y := BaseLeft.Y;
end; end;
AData.AddAlignedDimension(BaseLeft, BaseRight, DimensionLeft, DimensionRight); AData.AddAlignedDimension(BaseLeft, BaseRight, DimensionLeft, DimensionRight);

View File

@ -126,7 +126,8 @@ var
CurEllipse: TvEllipse; CurEllipse: TvEllipse;
CurArc: TvCircularArc; CurArc: TvCircularArc;
FinalStartAngle, FinalEndAngle, tmpAngle: double; FinalStartAngle, FinalEndAngle, tmpAngle: double;
BoundsLeft, BoundsTop, BoundsRight, BoundsBottom: Word; BoundsLeft, BoundsTop, BoundsRight, BoundsBottom,
IntStartAngle, IntAngleLength: Integer;
CurDim: TvAlignedDimension; CurDim: TvAlignedDimension;
begin begin
{$ifdef FPVECTORIALDEBUG} {$ifdef FPVECTORIALDEBUG}
@ -207,15 +208,15 @@ begin
{$ifdef USE_LCL_CANVAS} {$ifdef USE_LCL_CANVAS}
// ToDo: Consider a X axis inversion // ToDo: Consider a X axis inversion
// If the Y axis is inverted, then we need to mirror our angles as well // If the Y axis is inverted, then we need to mirror our angles as well
if AMulY > 0 then { if AMulY > 0 then
begin begin}
FinalStartAngle := CurArc.StartAngle; FinalStartAngle := CurArc.StartAngle;
FinalEndAngle := CurArc.EndAngle; FinalEndAngle := CurArc.EndAngle;
BoundsLeft := CoordToCanvasX(CurArc.CenterX - CurArc.Radius); BoundsLeft := CoordToCanvasX(CurArc.CenterX - CurArc.Radius);
BoundsTop := CoordToCanvasY(CurArc.CenterY - CurArc.Radius); BoundsTop := CoordToCanvasY(CurArc.CenterY - CurArc.Radius);
BoundsRight := CoordToCanvasY(CurArc.CenterX + CurArc.Radius); BoundsRight := CoordToCanvasX(CurArc.CenterX + CurArc.Radius);
BoundsBottom := CoordToCanvasY(CurArc.CenterY + CurArc.Radius); BoundsBottom := CoordToCanvasY(CurArc.CenterY + CurArc.Radius);
end { end
else // AMulY is negative else // AMulY is negative
begin begin
// Inverting the angles generates the correct result for Y axis inversion // Inverting the angles generates the correct result for Y axis inversion
@ -223,31 +224,34 @@ begin
FinalEndAngle := 360 - 1* CurArc.StartAngle; FinalEndAngle := 360 - 1* CurArc.StartAngle;
BoundsLeft := CoordToCanvasX(CurArc.CenterX - CurArc.Radius); BoundsLeft := CoordToCanvasX(CurArc.CenterX - CurArc.Radius);
BoundsTop := CoordToCanvasY(CurArc.CenterY + CurArc.Radius); BoundsTop := CoordToCanvasY(CurArc.CenterY + CurArc.Radius);
BoundsRight := CoordToCanvasY(CurArc.CenterX + CurArc.Radius); BoundsRight := CoordToCanvasX(CurArc.CenterX + CurArc.Radius);
BoundsBottom := CoordToCanvasY(CurArc.CenterY - CurArc.Radius); BoundsBottom := CoordToCanvasY(CurArc.CenterY - CurArc.Radius);
end; end;}
IntStartAngle := Round(16*FinalStartAngle);
IntAngleLength := Abs(Round(16*(FinalEndAngle - FinalStartAngle)));
// Arc(ALeft, ATop, ARight, ABottom, Angle16Deg, Angle16DegLength: Integer); // Arc(ALeft, ATop, ARight, ABottom, Angle16Deg, Angle16DegLength: Integer);
ADest.Arc( ADest.Arc(
BoundsLeft, BoundsTop, BoundsRight, BoundsBottom, BoundsLeft, BoundsTop, BoundsRight, BoundsBottom,
Round(16*FinalStartAngle), IntStartAngle, IntAngleLength
Abs(Round(16*(FinalEndAngle - FinalStartAngle)))
); );
// Debug info // Debug info
ADest.TextOut(CoordToCanvasX(CurArc.CenterX), CoordToCanvasY(CurArc.CenterY), { ADest.TextOut(CoordToCanvasX(CurArc.CenterX), CoordToCanvasY(CurArc.CenterY),
Format('R=%d S=%d L=%d', [Round(CurArc.Radius), Round(16*FinalStartAngle), Format('R=%d S=%d L=%d', [Round(CurArc.Radius*AMulX), Round(FinalStartAngle),
Abs(Round(16*(FinalEndAngle - FinalStartAngle)))])); Abs(Round((FinalEndAngle - FinalStartAngle)))]));
{ ADest.Rectangle( ADest.Pen.Color := TColor($DDDDDD);
BoundsLeft, BoundsTop, BoundsRight, BoundsBottom);} ADest.Rectangle(
BoundsLeft, BoundsTop, BoundsRight, BoundsBottom);
ADest.Pen.Color := clBlack;}
{$endif} {$endif}
end end
else if CurEntity is TvAlignedDimension then else if CurEntity is TvAlignedDimension then
begin begin
CurDim := CurEntity as TvAlignedDimension; CurDim := CurEntity as TvAlignedDimension;
{ ADest.MoveTo(CoordToCanvasX(CurDim.BaseRight.X), CoordToCanvasY(CurDim.BaseRight.Y)); ADest.MoveTo(CoordToCanvasX(CurDim.BaseRight.X), CoordToCanvasY(CurDim.BaseRight.Y));
ADest.LineTo(CoordToCanvasX(CurDim.DimensionRight.X), CoordToCanvasY(CurDim.DimensionRight.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.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 { // Debug info
ADest.TextOut(CoordToCanvasX(CurDim.BaseRight.X), CoordToCanvasY(CurDim.BaseRight.Y), 'BR'); 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.DimensionRight.X), CoordToCanvasY(CurDim.DimensionRight.Y), 'DR');
ADest.TextOut(CoordToCanvasX(CurDim.DimensionLeft.X), CoordToCanvasY(CurDim.DimensionLeft.Y), 'DL'); ADest.TextOut(CoordToCanvasX(CurDim.DimensionLeft.X), CoordToCanvasY(CurDim.DimensionLeft.Y), 'DL');

View File

@ -12,6 +12,9 @@ type
{ TFPVVDrawer } { TFPVVDrawer }
TFPVVDrawer = class(TCustomControl) TFPVVDrawer = class(TCustomControl)
private
DragDropStarted: Boolean;
DragStartPos: TPoint;
public public
PosX, PosY: Integer; PosX, PosY: Integer;
Drawing: TBitmap; Drawing: TBitmap;
@ -21,6 +24,10 @@ type
procedure Paint; override; procedure Paint; override;
procedure HandleKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure HandleKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure HandleClick(Sender: TObject); procedure HandleClick(Sender: TObject);
procedure HandleMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure HandleMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Clear; procedure Clear;
end; end;
@ -35,6 +42,8 @@ begin
OnKeyDown := @HandleKeyDown; OnKeyDown := @HandleKeyDown;
OnClick := @HandleClick; OnClick := @HandleClick;
OnMouseDown := @HandleMouseDown;
OnMouseUp := @HandleMouseUp;
end; end;
destructor TFPVVDrawer.Destroy; destructor TFPVVDrawer.Destroy;
@ -76,6 +85,28 @@ begin
Self.SetFocus(); Self.SetFocus();
end; end;
procedure TFPVVDrawer.HandleMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if not DragDropStarted then
begin
DragDropStarted := True;
DragStartPos := Point(X, Y);
end;
end;
procedure TFPVVDrawer.HandleMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if DragDropStarted then
begin
DragDropStarted := False;
PosX := PosX + (X - DragStartPos.X);
PosY := PosY + (Y - DragStartPos.Y);
Invalidate();
end;
end;
procedure TFPVVDrawer.Clear; procedure TFPVVDrawer.Clear;
begin begin
PosX := 0; PosX := 0;