diff --git a/applications/fpvviewer/fpvectorialsrc/dxfvectorialreader.pas b/applications/fpvviewer/fpvectorialsrc/dxfvectorialreader.pas index 97bab205c..b0f56af26 100644 --- a/applications/fpvviewer/fpvectorialsrc/dxfvectorialreader.pas +++ b/applications/fpvviewer/fpvectorialsrc/dxfvectorialreader.pas @@ -663,15 +663,36 @@ begin // Now check if we are a horizontal or vertical dimension // horizontal - if DimensionRight.Y = BaseRight.Y then + // + //DL____ DR + // | | + // | | + // BL BR + if DimensionRight.X = BaseRight.X then begin DimensionLeft.X := BaseLeft.X; DimensionLeft.Y := DimensionRight.Y; 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 - DimensionLeft.Y := BaseLeft.Y; DimensionLeft.X := DimensionRight.X; + DimensionLeft.Y := BaseLeft.Y; end; AData.AddAlignedDimension(BaseLeft, BaseRight, DimensionLeft, DimensionRight); diff --git a/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas b/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas index 3da535365..463e786d3 100644 --- a/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas +++ b/applications/fpvviewer/fpvectorialsrc/fpvtocanvas.pas @@ -126,7 +126,8 @@ var CurEllipse: TvEllipse; CurArc: TvCircularArc; FinalStartAngle, FinalEndAngle, tmpAngle: double; - BoundsLeft, BoundsTop, BoundsRight, BoundsBottom: Word; + BoundsLeft, BoundsTop, BoundsRight, BoundsBottom, + IntStartAngle, IntAngleLength: Integer; CurDim: TvAlignedDimension; begin {$ifdef FPVECTORIALDEBUG} @@ -207,15 +208,15 @@ begin {$ifdef USE_LCL_CANVAS} // ToDo: Consider a X axis inversion // If the Y axis is inverted, then we need to mirror our angles as well - if AMulY > 0 then - begin +{ if AMulY > 0 then + 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); + BoundsRight := CoordToCanvasX(CurArc.CenterX + CurArc.Radius); BoundsBottom := CoordToCanvasY(CurArc.CenterY + CurArc.Radius); - end +{ end else // AMulY is negative begin // Inverting the angles generates the correct result for Y axis inversion @@ -223,31 +224,34 @@ begin FinalEndAngle := 360 - 1* CurArc.StartAngle; BoundsLeft := CoordToCanvasX(CurArc.CenterX - 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); - end; + end;} + IntStartAngle := Round(16*FinalStartAngle); + IntAngleLength := Abs(Round(16*(FinalEndAngle - FinalStartAngle))); // Arc(ALeft, ATop, ARight, ABottom, Angle16Deg, Angle16DegLength: Integer); ADest.Arc( BoundsLeft, BoundsTop, BoundsRight, BoundsBottom, - Round(16*FinalStartAngle), - Abs(Round(16*(FinalEndAngle - FinalStartAngle))) + IntStartAngle, IntAngleLength ); // Debug info - ADest.TextOut(CoordToCanvasX(CurArc.CenterX), CoordToCanvasY(CurArc.CenterY), - Format('R=%d S=%d L=%d', [Round(CurArc.Radius), Round(16*FinalStartAngle), - Abs(Round(16*(FinalEndAngle - FinalStartAngle)))])); -{ ADest.Rectangle( - BoundsLeft, BoundsTop, BoundsRight, BoundsBottom);} +{ ADest.TextOut(CoordToCanvasX(CurArc.CenterX), CoordToCanvasY(CurArc.CenterY), + Format('R=%d S=%d L=%d', [Round(CurArc.Radius*AMulX), Round(FinalStartAngle), + Abs(Round((FinalEndAngle - FinalStartAngle)))])); + ADest.Pen.Color := TColor($DDDDDD); + ADest.Rectangle( + BoundsLeft, BoundsTop, BoundsRight, BoundsBottom); + ADest.Pen.Color := clBlack;} {$endif} end else if CurEntity is TvAlignedDimension then begin 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.DimensionLeft.X), CoordToCanvasY(CurDim.DimensionLeft.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.DimensionRight.X), CoordToCanvasY(CurDim.DimensionRight.Y), 'DR'); ADest.TextOut(CoordToCanvasX(CurDim.DimensionLeft.X), CoordToCanvasY(CurDim.DimensionLeft.Y), 'DL'); diff --git a/applications/fpvviewer/fpvv_drawer.pas b/applications/fpvviewer/fpvv_drawer.pas index 09ef78403..c70c6ac0a 100644 --- a/applications/fpvviewer/fpvv_drawer.pas +++ b/applications/fpvviewer/fpvv_drawer.pas @@ -12,6 +12,9 @@ type { TFPVVDrawer } TFPVVDrawer = class(TCustomControl) + private + DragDropStarted: Boolean; + DragStartPos: TPoint; public PosX, PosY: Integer; Drawing: TBitmap; @@ -21,6 +24,10 @@ type procedure Paint; override; procedure HandleKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 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; end; @@ -35,6 +42,8 @@ begin OnKeyDown := @HandleKeyDown; OnClick := @HandleClick; + OnMouseDown := @HandleMouseDown; + OnMouseUp := @HandleMouseUp; end; destructor TFPVVDrawer.Destroy; @@ -76,6 +85,28 @@ begin Self.SetFocus(); 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; begin PosX := 0;