mirror of
http://gitlab.expertsoft.com.ua/git/expertcad
synced 2026-01-11 22:45:39 +02:00
5054 lines
138 KiB
ObjectPascal
5054 lines
138 KiB
ObjectPascal
unit PCDrawBox;
|
||
|
||
interface
|
||
|
||
uses
|
||
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
||
U_Common_Classes, ExtCtrls, PCPanel,PCScrollbar,math,PCTypesUtils,PaintBoxExt,StdCtrls,DrawEngine,DrawObjects;
|
||
|
||
type
|
||
|
||
TGuideLine = class(TMyObject)
|
||
gType : TGuideType;
|
||
coord : Double;
|
||
fautoCr: boolean;
|
||
constructor create(aType: TGuideType; aCoord: Double; autoCr: boolean = False);
|
||
destructor destroy;
|
||
Procedure WriteToStream(Stream: TStream);
|
||
Class Function CreateFromStream(Stream: TStream): TGuideLine;
|
||
end;
|
||
|
||
TScrollValuesEvent = Procedure (Sender:TObject;ScHorzMAx,scVertMax,scHorzPos,scVertPos,scHorzPage,scVertPage,sChange,lChange:Integer) of Object;
|
||
TCursorEvent = Procedure (Sender:TObject;Cursor:TCursor) of Object;
|
||
TCustomTraceEvent = Procedure (Sender:TObject;x,y:Integer;dx,dy:Double;xCanvas:TCanvas) of Object;
|
||
TCustomTraceEventVB = Procedure (Sender:TObject;x,y:Integer;dx,dy:Double;Dc:Integer) of Object;
|
||
(*vbclassexport begin*)
|
||
TPCDrawBox = class(TPCPanel)
|
||
private
|
||
{ Private declarations }
|
||
SOnMouseTrace : TMouseTraceEvent;
|
||
SOnMousePush : TMousePushEvent;
|
||
SOnMousePull : TMousePullEvent;
|
||
SOnMouseLeave : TNotifyEvent;
|
||
SOnMouseClick : TNotifyEvent;
|
||
SOnMouseDblClick : TNotifyEvent;
|
||
SOnDropDrag : TDropDragEvent;
|
||
SOnDragTrace : TDragTraceEvent;
|
||
SOnDragEnd : TDragEndEvent;
|
||
SOnDragStart: TDragStartEvent;
|
||
SOnScale: TNotifyEvent;
|
||
FBeforePaint: TNotifyEvent;
|
||
FScrollBars: Boolean;
|
||
FSurfaceMArgin: Integer;
|
||
FRulerSystem : TRulerSystem;
|
||
FActiveLayer : integer;
|
||
yold,xold,GuidexOld,GuideYold: integer;
|
||
SnapX,SnapY: Integer;
|
||
SnapXold,SnapYold: Integer;
|
||
FVertBarVisible,FHorzBarVisible: Boolean;
|
||
FWorkHeight,FWorkWidth : Double;
|
||
FScale : integer;
|
||
FDpmOrig : Double;
|
||
OldCursor: TCursor;
|
||
PageLeft,PageTop,PageWidth,PageHeight: integer;
|
||
FGuides,Fgrids,FCenterGuide: Boolean;
|
||
FBackGround,FGridColor,FGuideColor : TColor;
|
||
FGridStep: Double;
|
||
FGridType: TGridType;
|
||
FOrient : TPageOrient;
|
||
FLayout : TPageLayout;
|
||
FguideTrace: TGuideTraces;
|
||
FSnapToGuides: boolean;
|
||
FSnapToNPoint: boolean;
|
||
FSnapToGrids : Boolean;
|
||
FCustomGuideTrace: TCustomTraceEvent;
|
||
FCustomGuideTraceVB: TCustomTraceEventVB;
|
||
FPageColor: TColor;
|
||
FbarsLocked: Boolean;
|
||
FScrollValues: TScrollValuesEvent;
|
||
FCursorChange: TCursorEvent;
|
||
ScHorzMAx,scVertMax,scHorzPos,scVertPos,scHorzPage,scVertPage: Integer;
|
||
scHorzWidth,scVertHeight:Integer;
|
||
vsRgn,hsRgn: HRGN;
|
||
rVRgn,rHRgn: HRGN;
|
||
|
||
FShadow: Boolean;
|
||
RulerMode: Integer;
|
||
RulerMapScale: Double;
|
||
FRulerColor: TColor;
|
||
FCoordZ: Double;
|
||
FDetailStyle: TDetailStyle;
|
||
FIsometric: Boolean;
|
||
FDrawPageBorder: Boolean;
|
||
FdrawInCursor: Boolean;
|
||
FPageGuide: Boolean;
|
||
|
||
Procedure setSnapToNPoint(value: boolean);
|
||
Procedure setSnapToGuides(value: boolean);
|
||
Procedure setSnapToGrids(value: boolean);
|
||
Procedure setHorzBarVisible(value: Boolean);
|
||
Procedure setVertBarVisible(value: Boolean);
|
||
Procedure LostFocus(sender:Tobject);
|
||
Procedure SetScrollBars(value: Boolean);
|
||
Procedure DrawToCanvas(Canvas:TCanvas);
|
||
Procedure ZoomCenter;
|
||
Procedure SetScrolls(SHorzMAx,SVertMax,SHorzPos,SVertPos,SHorzPage,SVertPage:Integer);
|
||
procedure setCenterGuide(const Value: Boolean);
|
||
procedure setRulerColor(const Value: TColor);
|
||
procedure setCoordZ(const Value: Double);
|
||
procedure SetRulerSytem(const Value: TRulerSystem);
|
||
procedure SetDetailStyle(const Value: TDetailStyle);
|
||
Procedure CalculateDetailMargins(ReScale:Boolean=False);
|
||
Procedure CalculateIsometricmargins;
|
||
procedure setIsometric(const Value: Boolean);
|
||
procedure setPageborder(const Value: Boolean);
|
||
procedure SetDrawInCursor(const Value: Boolean);
|
||
procedure setPageGuide(const Value: Boolean);
|
||
procedure SetDpmOrig(const Value: Double);
|
||
function GetToolData: Integer;
|
||
protected
|
||
{ Protected declarations }
|
||
ZoomPointFlag :Boolean;
|
||
ZoomPoint :TDoublePoint;
|
||
BaseBitmap: TBitmap;
|
||
TempBitmap :TBitmap;
|
||
FToolIdx : TPCTool;
|
||
FToolInfo: String;
|
||
FToolData:LongInt;
|
||
FBlockDrop:String;
|
||
// IsDragging: Boolean;
|
||
cRgn: HRGN;
|
||
FDetail: Boolean;
|
||
FDetailWidth: Integer;
|
||
FDetailHeight: Integer;
|
||
FDetailScale: Integer;
|
||
FDetailTop : Double;
|
||
FDetailLeft: Double;
|
||
FDetailPosX: Integer;
|
||
FDeTailPosY: Integer;
|
||
FDetMarX,FDetMarY:Double;
|
||
FIsoMarX,FIsoMarY:Double;
|
||
CurrentZ: Double;
|
||
CurrentModPoint: TModPoint;
|
||
CurrentIsoFigure: TFigure;
|
||
ZoomDp: TDoublePoint;
|
||
scHorzPosSave :Integer;
|
||
scVertPosSave :Integer;
|
||
|
||
Procedure DrawTrace;virtual;
|
||
Procedure SetActiveLayer(value: integer);virtual;
|
||
Function GetLayerCount:integer;virtual;
|
||
Procedure DrawGrids(Canvas:TCanvas);
|
||
Procedure DrawGuides(Canvas:TCanvas);
|
||
|
||
procedure DrawGuidesTop(Canvas: TCanvas);
|
||
procedure DrawCenterGuide(Canvas:TCanvas);
|
||
|
||
procedure SetEngine(xCanvas: TCanvas; CPoint,DeCPoint:ConvertXYProc; CDim,DeCDim:ConvertDimProc;isPrinting: Boolean; prBmp: TBitmap);
|
||
Procedure SetDefaultEngine;
|
||
Procedure SetForceDefaultEngine;
|
||
Procedure SetDetailEngine;
|
||
Procedure SetBufferEngine;
|
||
Procedure SetForceBufferEngine;
|
||
Procedure SetBufferDetailEngine;
|
||
Procedure KillTraceFigure;virtual;
|
||
Procedure ClipToActiveRegion(xCanvas:TCanvas=nil);
|
||
Procedure ClipToUnScrollRegion(xCanvas:TCanvas=nil);
|
||
Procedure ClipToDetailRegion(xCanvas:TCanvas=nil);
|
||
Procedure unClip(xCanvas:TCanvas=nil);
|
||
Procedure DrawRulersToCanvas(Canvas:TCanvas);
|
||
Procedure DrawScrollsToCanvas(Canvas: TCanvas; DoubleBuffered: Boolean; hpressed, vpressed: Boolean);
|
||
Procedure DoPageLocate;
|
||
Procedure SurfaceResize(sender: TObject);
|
||
Procedure SetScale(value: integer);virtual;
|
||
Procedure DoZoomDelta(Delta:Integer);
|
||
Procedure DoZoomIn;override;
|
||
Procedure DoZoomOut;override;
|
||
Procedure DoZoomArea;override;
|
||
Procedure DoZoomActualSize;override;
|
||
Procedure DoZoomFitToWindow;override;
|
||
Function DoKeyEvents(Message: TWMKey): Boolean;override;
|
||
Function GetBackColor:TColor;override;
|
||
Procedure setBg(value: Tcolor);
|
||
procedure setShadow(const Value: Boolean);
|
||
procedure setPageColor(Value: TColor);
|
||
Procedure setGuides(value: Boolean);
|
||
Procedure setGrids(value: Boolean);
|
||
Procedure SetGridType(value:TGridType);
|
||
Procedure setGColor(value: TColor);
|
||
Procedure setGuideColor(value: TColor);
|
||
Procedure setGStep(value: Double);
|
||
Procedure setlayout(value : TPageLayout);
|
||
Procedure setwHeight(value: Double);
|
||
Procedure setwWidth(value: Double);
|
||
Procedure setorient(Value : TPageOrient);
|
||
Procedure setGTrace(value: TGuideTraces);
|
||
// Procedure CheckToSnap(var X,Y:Double);virtual;
|
||
// Procedure CalculateSnapPoint(var X,Y:Double);virtual;
|
||
|
||
Procedure SurfaceMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
|
||
Procedure SurfaceMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
|
||
Procedure SurfaceClick(Sender:TObject);
|
||
Procedure SurfaceDblClick(Sender:TObject);
|
||
Procedure SurfaceLeave(Sender: TObject);
|
||
Procedure SurfaceDragDrop(Sender, Source: TObject; X,Y: Integer);
|
||
Procedure SurfaceDragEnd(Sender, Target: TObject; X,Y: Integer);
|
||
Procedure SurfaceDragOver(Sender, Source: TObject; X,Y: Integer; State: TDragState; var Accept: Boolean);
|
||
Procedure SurfaceDragStart(Sender: TObject;var DragObject: TDragObject);
|
||
Procedure SurfacePull(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||
Procedure SurfacePush(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||
Procedure DragMove(x,y:Integer);
|
||
Procedure DragDropped(x,y:Integer);
|
||
Procedure SurfaceMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
||
Procedure CadMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
||
|
||
Procedure MSPush(sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Double);virtual;
|
||
procedure MSTrace(Sender: TObject; Shift: TShiftState; X,Y: Double);virtual;
|
||
procedure MSPull(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Double);virtual;
|
||
procedure MSDropDrag(Sender:Tobject; Source: Integer; X, Y: Double);virtual;
|
||
procedure MSDragOver(Sender:TObject; Source: Integer; X, Y: Double;State: TDragState; var Accept: Boolean);virtual;
|
||
procedure MSEndDrag(Sender, Target: TObject; X, Y: Double);virtual;
|
||
procedure MSStartDrag(Sender: TObject;var DragObject: TDragObject);virtual;
|
||
procedure MSClick(Sender: TObject);virtual;
|
||
procedure MSDblClick(Sender: TObject);virtual;
|
||
Procedure MSLeave(Sender: TObject);virtual;
|
||
|
||
Procedure DoSurfacePaint(Sender: TObject); virtual;
|
||
Procedure DrawguideTrace(x,y: integer);
|
||
Procedure Refresh;override;
|
||
Procedure SyncEnv;override;
|
||
Procedure ResetActions;virtual;
|
||
Procedure ResetRegions;virtual;
|
||
Function SnapToFigures(var x,y: Double):Boolean;virtual;
|
||
// Procedure DrawGuideOnSurface(x,y:Integer;guType:TGuideType);
|
||
Procedure SetRulerValues(MapScale: Double; Mode: Integer);
|
||
procedure SetDetail(const Value: Boolean);
|
||
procedure setDetailHeight(const Value: Integer);
|
||
procedure setDetailWidth(const Value: Integer);
|
||
procedure SetDetailScale( Value: Integer);
|
||
Procedure GotFocus(Sender:TObject);virtual;
|
||
Function GetZAvg(dRect:TDoubleRect):Double;virtual;
|
||
Procedure GetIsometricBounds(var MinX,MinY,MaxX,MaxY: Double);virtual;
|
||
Property HorzBarVisible: Boolean read FHorzBarVisible write setHorzBarVisible;
|
||
Property VertBarVisible: Boolean read FVertBarVisible write setVertBarVisible;
|
||
public
|
||
{ Public declarations }
|
||
IsDragging: Boolean;
|
||
DrawBars:Boolean;
|
||
CurrentUserClass: String;
|
||
evGrids : TEventEngine;
|
||
evGridType : TEventEngine;
|
||
evGuides : TEventEngine;
|
||
evCenterGuide: TEventEngine;
|
||
evSnapGrids : TEventEngine;
|
||
evSnapGuides : TEventEngine;
|
||
evSnapObject : TEventEngine;
|
||
evGridColor : TEventEngine;
|
||
evGuideColor : TEventEngine;
|
||
evBackColor : TEventEngine;
|
||
evPageColor : TEventEngine;
|
||
evGuideTrace : TeventEngine;
|
||
evPageLo : TeventEngine;
|
||
evPageOr : TeventEngine;
|
||
SurfaceHandle: HWND;
|
||
Surface: TPaintBoxExt;
|
||
DEngine: TPCDrawEngine;
|
||
SnapLocked: Boolean;
|
||
DetailHit: Boolean;
|
||
DetailHitPoint:Tpoint;
|
||
SnapInfo: String;
|
||
DetailActive: Boolean;
|
||
IsoAngle : Double;
|
||
IsoType : Byte;
|
||
Guides: TList;
|
||
GuidesCreatedOnDropCompon: TList;
|
||
MaxScale: Integer; //16.12.2011
|
||
FGrayedColor: TColor; //06.08.2012 - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
FResetRegionsOnZoomScroll: Boolean; //07.08.2012 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ResetRegions <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Procedure DrawGuideOnSurface(x,y:Integer;guType:TGuideType; needDraw: boolean = True);
|
||
Procedure SurfaceMiddleDblClick(Sender:TObject);
|
||
|
||
Procedure SaveScroll;(*vb*)
|
||
Procedure RestoreScroll;(*vb*)
|
||
Function GetActiveCanvas:TCanvas;
|
||
Procedure ReLocate;(*vb*)
|
||
Procedure SetCustomSurface(CWindow:HWnD; CDC:HDC);override;(*vb*)
|
||
Procedure DoSurfaceMove(Shift:Integer; X,Y: Integer);(*vb*)
|
||
Procedure DoSurfaceClick;(*vb*)
|
||
Procedure DoSurfaceDblClick;(*vb*)
|
||
Procedure DoSurfaceLeave;(*vb*)
|
||
Procedure DoSurfaceDragDrop(Source:Integer; X,Y: Integer);(*vb*)
|
||
Procedure DoSurfaceDragEnd(X,Y: Integer);
|
||
Procedure DoSurfaceDragOver(Source:Integer; X,Y: Integer; State: Integer; var Accept: Boolean);
|
||
Procedure DoSurfaceDragStart(Sender: TObject;var DragObject: TDragObject);
|
||
Procedure DoSurfacePull(Button: Integer; Shift: Integer; X, Y: Integer);(*vb*)
|
||
Procedure DoSurfacePush(Button: Integer; Shift: Integer; X, Y: Integer);(*vb*)
|
||
Procedure DoSurfaceWheel(Shift: Integer; WheelDelta: Integer;X,Y:Integer);(*vb*)
|
||
Procedure DoSurfaceWheelPull(Shift: Integer; X, Y: Integer);
|
||
Procedure DoSurfaceWheelPush(Shift: Integer; X, Y: Integer);
|
||
Procedure SurfaceWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint);
|
||
Procedure SurfaceWheelPull(Shift: TShiftState; X, Y: Integer);
|
||
Procedure SurfaceWheelPush(Shift: TShiftState; X, Y: Integer);
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> U_CAD <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PCad <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
||
Procedure CheckToSnap(var X,Y:Double);virtual;
|
||
// Procedure CalculateSnapPoint(var X,Y:Double);virtual;
|
||
Function CalculateSnapPoint(var X,Y:Double): Boolean;virtual;
|
||
|
||
Function DoKeyStroke(ChCode:Integer;Shift:Integer):Boolean;virtual;(*vb*)
|
||
Function CheckForGuideDrop(X,Y: Integer; autoCr: boolean = False):Boolean;(*vb*)
|
||
Function CheckAndGetGuideDrop(X,Y: Integer; var GuideLine: TGuideLine; autoCr: boolean = False): Boolean;
|
||
Procedure DragStarted;virtual;(*vb*)
|
||
Function GetSelectionRect:TDoubleRect;virtual;(*vb*)
|
||
Function GetDrawingRect:TDoubleRect;virtual;(*vb*)
|
||
Function GetVisibleRect:TDoubleRect;virtual;(*vb*)
|
||
Procedure DeConvertXY(var X,Y,Z: Double); (*vb*)
|
||
Procedure DeConvertDim(var Dime: Double);(*vb*)
|
||
Procedure ConvertXY(var X,Y,Z: double); (*vb*)
|
||
Procedure ConvertDim(var Dime: double); (*vb*)
|
||
Procedure DetDeConvertXY(var X,Y,Z: Double);
|
||
Procedure DetDeConvertDim(var Dim: Double);
|
||
Procedure DetConvertXY(var X,Y,Z: double);
|
||
Procedure DetConvertDim(var Dim: double);
|
||
Procedure IsoDeConvertXY(var X,Y,Z: Double);
|
||
Procedure IsoDeConvertDim(var Dim: Double);
|
||
Procedure IsoConvertXY(var X,Y,Z: double);
|
||
Procedure IsoConvertDim(var Dim: double);
|
||
Procedure IsoTo2D(var x,y,z: Double);
|
||
Procedure ZoomArea(ZoomRect:TDoubleRect);(*vb*)
|
||
Procedure FitToWindow;(*vb*)
|
||
Procedure ActualSize;(*vb*)
|
||
Procedure ZoomOut;(*vb*)
|
||
Procedure ZoomIn;(*vb*)
|
||
Constructor Create(AOwner: TComponent);override;
|
||
Destructor Destroy;override;
|
||
Procedure ClearGuides;(*vb*)
|
||
Procedure SetTool(aToolIndex: TPCTool;aToolInfo:String;aToolData:Integer);virtual;(*vb*)
|
||
Procedure SetCursor(cr:TCursor);virtual;(*vb*)
|
||
Procedure SetDragCursor(cr:TCursor); (*vb*)
|
||
Function CheckGuideLine(x,y:Double):Boolean;(*vb*)
|
||
Function CheckForExistGuide(x,y: double; guType:TGuideType): Boolean;
|
||
Procedure BeginHRulerDrag;(*vb*)
|
||
Procedure BeginVRulerDrag;(*vb*)
|
||
Function SurfaceWidth:Integer;(*vb*)
|
||
Function SurfaceHeight: Integer;(*vb*)
|
||
Function GetPageRect:TRect;overload;
|
||
Procedure GetPageRect(var left,top,right,bottom:Integer);overload;(*vb*)
|
||
Procedure SetSurfaceMargin(Value:Integer);(*vb*)
|
||
Procedure SetScrollPositions(hPos,vPos:Integer)(*vb*);
|
||
Procedure SetHScrollPosition(hPos: Integer;Update: Boolean); (*vb*)
|
||
Procedure SetVScrollPosition(vPos: Integer;Update:Boolean);(*vb*)
|
||
Procedure SetHScrollDelta(hDelta:Double;Update: Boolean);(*vb*)
|
||
Procedure SetVScrollDelta(hDelta:Double;Update: Boolean); (*vb*)
|
||
Function HSCBarPosition: Integer; (*vb*)
|
||
Function VSCBarPosition: Integer;(*vb*)
|
||
Function PointInHScroll(x,y:Double):Boolean; (*vb*)
|
||
Function PointInVScroll(x,y:Double):Boolean;(*vb*)
|
||
Function PointInHRuler(x,y:Double):Boolean;(*vb*)
|
||
Function PointInVRuler(x,y:Double):Boolean;(*vb*)
|
||
Function PointInDetail(x,y:Double):Boolean;
|
||
Procedure CenterLocation(x,y:Double);(*vb*)
|
||
Function PointInView(x,y:Double):Boolean;(*vb*)
|
||
Procedure ZoomDetailArea(ZoomRect:TDoubleRect);
|
||
Procedure ZoomDetailPoint(ZoomCenter:TDoublePoint);(*vb*)
|
||
Procedure MoveDetailArea(dx,dy: Double);
|
||
Function HitTestModPoint(x,y:Double):TModPoint;virtual;
|
||
Function HitTestModPointInt(x,y:Double):Integer;virtual;(*vb*)
|
||
Function HitTestModPointIntVal(x,y:Integer):TModPoint;virtual;
|
||
Function HitTestModPointDetVal(x,y:Integer):TModPoint;virtual;
|
||
Function CheckByPointInt(LayerNbr:Integer;x,y:Integer):TFigure;virtual;
|
||
Procedure CollectFaces;virtual;
|
||
Procedure SimulateTrace(x,y:Double);(*vb*)
|
||
Procedure SimulateDown(x,y:Double);(*vb*)
|
||
Procedure SimulateUp(x,y:Double);(*vb*)
|
||
Procedure SimulateRightClick(x,y:Double);(*vb*)
|
||
|
||
Procedure SnapToGrid(var X,Y:Double); //01.10.2013
|
||
procedure SurfacePaint; //07.08.2012
|
||
|
||
Property ToolIdx : TPCTool read FToolIdx;(*vb*)
|
||
Property ToolInfo : string read FToolInfo;(*vb*)
|
||
Property ToolData: Integer read GetToolData;(*vb*)
|
||
Property DotsPerMilOrig: Double read FDpmOrig write SetDpmOrig;(*vb*)
|
||
Property ActiveLayer : Integer read FActiveLayer write setActiveLayer;(*vb*)
|
||
property Color; //07.08.2012 - <20><> TCustomPanel
|
||
property OnMouseWheel;
|
||
|
||
Procedure DestroyCreatedOnDropGuides;
|
||
published
|
||
{ Published declarations }
|
||
Property ZoomScale: integer read FScale write setscale;(*vb*)
|
||
Property GuidesVisible : Boolean read FGuides write setGuides; (*vb*)
|
||
Property BackGround :Tcolor read FBackGround write setBg;(*vb*)
|
||
Property PageColor :TColor read FPageColor write setPageColor;(*vb*)
|
||
Property Grids: Boolean read FGrids write setGrids;(*vb*)
|
||
Property GridType: TGridType read FGridType write SetGridType;(*vb*)
|
||
Property CenterGuide:Boolean read FCenterGuide write setCenterGuide; (*vb*)
|
||
Property PageGuide:Boolean read FPageGuide write setPageGuide;(*vb*)
|
||
Property DrawShadow: Boolean read FShadow write setShadow;(*vb*)
|
||
Property DrawPageBorder: Boolean read FDrawPageBorder write setPageborder;(*vb*)
|
||
Property GridColor: TColor read FGridColor write setGcolor;(*vb*)
|
||
Property GuideColor: TColor read FGuideColor write setGuidecolor;(*vb*)
|
||
Property RulerColor:TColor read FRulerColor write setRulerColor;(*vb*)
|
||
Property GridStep: Double read FGridStep write setGstep;(*vb*)
|
||
Property WorkHeight: Double read FWorkHeight write setWHeight;(*vb*)
|
||
Property WorkWidth: Double read FWorkWidth write setWWidth;(*vb*)
|
||
Property PageLayout: TPageLayOut read FLayout write setLayOut; (*vb*)
|
||
Property PageOrient: TPageOrient read FOrient write setOrient;(*vb*)
|
||
Property GuideTrace: TGuideTraces read FGuideTrace write setGTrace;(*vb*)
|
||
Property SnapToGuides: Boolean read FSnapToGuides write setSnapToGuides;(*vb*)
|
||
Property SnapToNearPoint: Boolean read FSnapToNPoint write setSnapToNPoint;(*vb*)
|
||
Property SnapToGrids: Boolean read FSnapToGrids write setSnaptoGrids;(*vb*)
|
||
Property ScrollBars : Boolean read FScrollBars write setScrollBars;(*vb*)
|
||
Property IsoCoordZ: Double read FCoordZ write setCoordZ;
|
||
Property RulerSystem: TRulerSystem read FRulerSystem write SetRulerSytem;(*vb*)
|
||
Property DrawInCursor:Boolean read FdrawInCursor write SetDrawInCursor;(*vb*)
|
||
Property DetailWindow:Boolean read FDetail write SetDetail;
|
||
Property DetailWidth:Integer read FDetailWidth write setDetailWidth;
|
||
Property DetailHeight:Integer read FDetailHeight write setDetailHeight;
|
||
Property DetailScale: Integer read FDetailScale write SetDetailScale;
|
||
Property DetailStyle:TDetailStyle read FDetailStyle write SetDetailStyle;
|
||
Property Isometric:Boolean read FIsometric write setIsometric;
|
||
|
||
property OnSurfaceMove : TMouseTraceEvent read SOnMouseTrace write SOnMouseTrace;(*vb*)
|
||
property OnSurfaceMouseDown : TMousePushEvent read SOnMousePush write SOnMousePush; (*vb*)
|
||
property OnSurfaceMouseUp : TMousePullEvent read SOnMousePull write SOnMousePull;(*vb*)
|
||
property OnSurfaceLeave : TNotifyEvent read SOnMouseLeave write SOnMouseLeave;(*vb*)
|
||
property OnSurfaceClick : TNotifyEvent read SOnMouseClick write SOnMouseClick;(*vb*)
|
||
property OnSurfaceDblClick: TNotifyEvent read SOnMouseDblClick write SOnMouseDblClick;(*vb*)
|
||
Property OnSurfaceDragDrop: TDropDragEvent read SOnDropDrag write SOnDropDrag; (*vb*)
|
||
Property OnSurfaceDragOver: TDragTraceEvent read SOnDragTrace write SOnDragTrace;(*vb*)
|
||
Property OnSurfaceEndDrag: TDragEndEvent read SOnDragEnd write SOnDragEnd;
|
||
Property OnSurfaceStartDrag: TDragStartEvent read SOnDragStart write SOnDragStart;
|
||
Property OnScaleChanged: TNotifyEvent read SOnScale write SOnScale;(*vb*)
|
||
Property OnScrollValues:TScrollValuesEvent read FScrollValues write FScrollValues;(*vb*)
|
||
Property OnCursorChange:TCursorEvent read FCursorChange write FCursorChange;(*vb*)(*vbprivate*)
|
||
Property OnBeforePaint: TNotifyEvent read FBeforePaint write FBeforePaint;(*vb*)
|
||
Property OnCustomGuideTrace: TCustomTraceEvent read FCustomGuideTrace write FCustomGuideTrace;
|
||
Property OnCustomGuideTraceVB: TCustomTraceEventVB read FCustomGuideTraceVB write FCustomGuideTraceVB;(*vb*)
|
||
end;
|
||
(*vbclassexport end*)
|
||
|
||
const crZoom = crDefault + 30;
|
||
const crLocate = crDefault + 31;
|
||
const crPan = crDefault + 32;
|
||
const crDelete = crDefault + 33;
|
||
|
||
|
||
implementation
|
||
uses U_Common, U_BaseCommon, USCS_Main, U_CAD{Tolik -- 29/03/2017 -- }, U_Master_compl;
|
||
|
||
{$R *.RES}
|
||
{$R *.DCR}
|
||
|
||
var oldPosX,oldPosY:Integer;
|
||
|
||
//******************************************************************************
|
||
// TGU<47>DEL<45>NE IMPLEMENTATION
|
||
//******************************************************************************
|
||
|
||
Constructor TGuideline.create(aType: TGuideType; aCoord: Double; autoCr: boolean = False);
|
||
begin
|
||
inherited create;
|
||
// Tolik 14/04/2021 --
|
||
if GAutoCreatedGuide then
|
||
begin
|
||
fautoCr := GAutoCreatedGuide;
|
||
GAutoCreatedGuide := False;
|
||
end
|
||
else
|
||
//
|
||
fautoCr := autoCr;
|
||
|
||
gType := aType;
|
||
coord := aCoord;
|
||
end;
|
||
|
||
destructor TGuideline.destroy;
|
||
begin
|
||
inherited;
|
||
end;
|
||
///////////////////////////////////////////////////
|
||
|
||
//******************************************************************************
|
||
// TPCDRAWBOX IMPLEMENTATION
|
||
//******************************************************************************
|
||
|
||
|
||
Constructor TPCDrawBox.Create(AOwner: TComponent);
|
||
Begin
|
||
inherited create(AOwner);
|
||
FDrawInCursor := False;
|
||
ZoomPointFlag := False;
|
||
SnapLocked := False;
|
||
CurrentModPoint := nil;
|
||
DEngine := TPCDrawEngine.create;
|
||
RulerMode := 0; //rmPage
|
||
RulerMapScale := 1;
|
||
IsDragging := False;
|
||
CustomSurface := nil;
|
||
Guides := TList.Create;
|
||
GuidesCreatedOnDropCompon := TList.Create;
|
||
FScrollBars := True;
|
||
FDetailStyle:= dsZoom;
|
||
FIsometric := False;
|
||
vsRgn := 0;
|
||
HSRgn := 0;
|
||
rVRgn := 0;
|
||
rHRgn := 0;
|
||
FBarsLocked := False;
|
||
DrawBars := True;
|
||
FDetail := False;
|
||
FDetailWidth := 100;
|
||
FDetailHeight := 100;
|
||
FDetailTop := 0;
|
||
FDetailLeft := 0;
|
||
CurrentZ := 0;
|
||
FActiveLayer := 0;
|
||
Surface:= TPaintboxExt.Create(self);
|
||
Surface.Parent := Container;
|
||
Surface.Align := alClient;
|
||
Surface.Visible := true;
|
||
Surface.OnPaint := DoSurfacePaint;
|
||
Container.OnResize := SurfaceResize;
|
||
FDetailPosX := SurfaceWidth-FDetailWidth-20;
|
||
FDetailPosY := 20;
|
||
|
||
FVertBarVisible := False;
|
||
FHorzBarVisible := False;
|
||
FWorkHeight:= 100;
|
||
FWorkWidth := 100;
|
||
FScale := 100;
|
||
FDpmOrig := 4;
|
||
SetDpm((FScale / 100) * FDpmOrig);
|
||
FSurfaceMargin := 0;
|
||
FBackGround := clWhite;
|
||
FRulerColor := clSilver;
|
||
FPageColor := clWhite;
|
||
FOrient:= poPortrait;
|
||
FLayout := plCustom;
|
||
FGridStep := 5;
|
||
FGridColor := clSilver;
|
||
FGrids := true;
|
||
FGridType := grtLine;
|
||
FShadow := True;
|
||
FDrawPageBorder := True;
|
||
FGuideColor := clGreen;
|
||
FGuides := True;
|
||
FguideTrace := gtNone;
|
||
FSnapToGrids := False;
|
||
FSnapToGuides := False;
|
||
FSnapToNPoint := False;
|
||
IsoAngle := pi/4;
|
||
IsoType := 0;
|
||
MaxScale := 3000; //16.12.2011
|
||
FGrayedColor := DefGrayedColor; //06.08.2012
|
||
FResetRegionsOnZoomScroll := true; //07.08.2012
|
||
//Surface.OnMouseMove := SurfaceMove;
|
||
Surface.OnMouseMove := SurfaceMouseMove;
|
||
|
||
Surface.OnClick := SurfaceClick ;
|
||
Surface.OnDblClick := SurfaceDblClick;
|
||
Surface.OnMouseLeave := SurfaceLeave;
|
||
Surface.OnDragDrop := SurfaceDragDrop;
|
||
Surface.OnEndDrag := SurfaceDragEnd;
|
||
Surface.OnDragOver := SurfaceDragOver;
|
||
Surface.OnStartDrag := SurfaceDragStart;
|
||
Surface.OnMouseUp := SurfacePull;
|
||
Surface.OnMouseDown := SurfacePush;
|
||
Surface.Visible := True;
|
||
OnMouseWheel := CadMouseWheel;
|
||
Surface.OnMouseWheel := SurfaceMouseWheel;
|
||
Surface.OnMiddleDblClick := SurfaceMiddleDblClick;
|
||
Self.OnEnter := GotFocus;
|
||
|
||
yold := - 50000;
|
||
xold := - 50000;
|
||
Guideyold := - 50000;
|
||
Guidexold := - 50000;
|
||
SnapX := - 50000;
|
||
SnapY := - 50000;
|
||
SnapXold := - 50000;
|
||
SnapYold := - 50000;
|
||
|
||
screen.Cursors[crZoom] := LoadCursor(HInstance,'ZOOM');
|
||
screen.Cursors[crLocate] := LoadCursor(HInstance,'LOCATE');
|
||
screen.Cursors[crPan] := LoadCursor(HInstance,'PAN');
|
||
screen.Cursors[crDelete] := LoadCursor(HInstance,'DELETE');
|
||
TempBitmap := TBitmap.Create;
|
||
BaseBitmap := TBitmap.Create;
|
||
evGrids := EventEngine(cGrids,1,'',0);
|
||
evGridType := EventEngine(cGridType,0,'',0);
|
||
evCenterGuide := EventEngine(cCenterGuides,1,'',0);
|
||
evGuides := EventEngine(cGuides,1,'',0);
|
||
evSnapGrids := EventEngine(cSnapGrid,0,'',0);
|
||
evSnapGuides := EventEngine(cSnapGuides,0,'',0);
|
||
evSnapObject := EventEngine(cSnapObject,0,'',0);
|
||
evGridColor := EventEngine(cGridColor,FGridColor,'',0);
|
||
evGuideColor := EventEngine(cGuideColor,FGuideColor,'',0);
|
||
evBackColor := EventEngine(cBackColor,FBackground,'',0);
|
||
evPageColor := EventEngine(cPageColor,FPageColor,'',0);
|
||
evGuideTrace := EventEngine(cAngularGuides,0,'',0);
|
||
evPageLo := EventEngine(cPageLo,ord(FLayout),'',0);
|
||
evPageOr := EventEngine(cPageOr,ord(FOrient),'',0);
|
||
evRulerSys := EventEngine(cRulerSystem,ord(FRulerSystem),'',0);
|
||
|
||
FcoordZ := 0;
|
||
DetailActive := False;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setScrollBars(value: Boolean);
|
||
Begin
|
||
if value = FScrollBars then exit;
|
||
FScrollBars := value;
|
||
DoPageLocate;
|
||
if autorefresh then
|
||
DoSurfacePaint(Surface);
|
||
SyncEnv;
|
||
End;
|
||
|
||
|
||
Procedure TPCDrawBox.setHorzBarVisible(value: Boolean);
|
||
Begin
|
||
FHorzBarVisible := value;
|
||
//SyncEnv;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.setVertBarVisible(value: Boolean);
|
||
Begin
|
||
FVertBarVisible := value;
|
||
//SyncEnv;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfaceResize(sender: TObject);
|
||
Begin
|
||
FDetailPosX := SurfaceWidth-FDetailWidth-20;
|
||
FDetailPosY := 20;
|
||
DoPageLocate;
|
||
ZoomCenter;
|
||
DrawGuideTrace(-25000,-25000);
|
||
End;
|
||
|
||
|
||
Procedure TPCDrawBox.SetScale(value: integer);
|
||
var
|
||
i, stCnt: Integer;
|
||
st: Integer;
|
||
Begin
|
||
If (value < 1) or (value > MaxScale) then
|
||
exit;
|
||
if FScale <> Value then //07.08.2012
|
||
begin
|
||
FScale := Value;
|
||
SetDpm(FDpmOrig * (FScale / 100));
|
||
ZoomCenter;
|
||
end
|
||
else
|
||
ResetRegions;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.DoPageLocate;
|
||
var
|
||
rt: TrulerType;
|
||
inch: real;
|
||
SWidth, SHeight: Integer;
|
||
Begin
|
||
if Locked then
|
||
exit;
|
||
if FResetRegionsOnZoomScroll then //07.08.2012
|
||
ResetRegions;
|
||
FBarsLocked := True;
|
||
try
|
||
if rulerVisible then
|
||
begin
|
||
// PageLeft := 35;
|
||
// PageTop := 35;
|
||
SWidth := SurfaceWidth-30;
|
||
SHeight := SurfaceHeight - 30;
|
||
end
|
||
else
|
||
begin
|
||
PageLeft := 5;
|
||
PageTop := 5;
|
||
SWidth := SurfaceWidth;
|
||
SHeight := SurfaceHeight;
|
||
end;
|
||
PageWidth:= Round((FWorkWidth ) * DotsPerMil );
|
||
PageHeight:= Round((FWorkHeight) * DotsPerMil );
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
If PageWidth < swidth then
|
||
begin
|
||
if rulerVisible then
|
||
begin
|
||
PageLeft := (swidth - PageWidth) div 2 + 30;
|
||
end
|
||
else
|
||
begin
|
||
PageLeft := (swidth - PageWidth) div 2;
|
||
end;
|
||
HorzBarVisible := False;
|
||
SCHorzMax := 0;
|
||
scHorzPos := 0;
|
||
end
|
||
else if FScrollbars then
|
||
begin
|
||
HorzBarVisible := True;
|
||
SCHorzMax := PageWidth + 25;
|
||
scHorzPage := swidth;
|
||
scHorzPos := 0;
|
||
end
|
||
else
|
||
begin
|
||
HorzBarVisible := False;
|
||
SCHorzMax := 0;
|
||
SCHorzPos := 0;
|
||
end;
|
||
{
|
||
else
|
||
begin
|
||
HorzBarVisible := False;
|
||
SCHorzMax := PageWidth + 25;
|
||
scHorzPage := swidth;
|
||
scHorzPos := 0;
|
||
end;
|
||
}
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
If PageHeight < sHeight then
|
||
begin
|
||
if rulerVisible then
|
||
begin
|
||
PageTop := (SHeight -PageHeight) div 2 + 30;
|
||
end
|
||
else
|
||
begin
|
||
PageTop := (SHeight - PageHeight) div 2;
|
||
end;
|
||
VertBarVisible := False;
|
||
SCVertMax := 0;
|
||
ScvertPos := 0;
|
||
end
|
||
|
||
else
|
||
if FScrollbars then
|
||
begin
|
||
VertBarVisible := True;
|
||
scVertMax := PageHeight + 25;
|
||
scVertPage := SHeight;
|
||
scvertPos := 0;
|
||
end
|
||
else
|
||
begin
|
||
VertBarVisible := False;
|
||
scVertMax := 0;
|
||
scvertPos := 0;
|
||
end;
|
||
{
|
||
else
|
||
begin
|
||
VertBarVisible := False;
|
||
scVertMax := PageHeight + 25;
|
||
scVertPage := SHeight;
|
||
scvertPos := 0;
|
||
end;
|
||
}
|
||
|
||
inch := 2.54;
|
||
|
||
if RulerSystem = rsMetric then
|
||
begin
|
||
if Dotspermil > 40 then
|
||
rt := rtDeciMilim
|
||
else
|
||
if Dotspermil > 24 then
|
||
rt := rtHalfMilim
|
||
else
|
||
if Dotspermil > 12 then
|
||
rt := rtMilim
|
||
else
|
||
if Dotspermil > 2.4 then
|
||
rt := rtHalfCMeter
|
||
else
|
||
if Dotspermil > 1.2 then
|
||
rt := rtCentiMeter
|
||
else
|
||
rt := rtDecimeter;
|
||
end
|
||
else
|
||
begin
|
||
if (Dotspermil * inch * 10 / 128) > 12 then
|
||
rt := rtDeciMilim // 1/128 inch
|
||
else
|
||
if (Dotspermil * inch * 10 / 32) > 12 then
|
||
rt := rtHalfMilim // 1/32 inch
|
||
else
|
||
if (Dotspermil * inch * 10 / 16) > 12 then
|
||
rt := rtMilim // 1/16 inch
|
||
else
|
||
if (Dotspermil * inch * 5) > 12 then
|
||
rt := rtHalfCMeter // 1/2 inch
|
||
else
|
||
if (Dotspermil * inch * 10) > 12 then
|
||
rt := rtCentiMeter // inch
|
||
else
|
||
rt := rtDecimeter; // 10 x inch
|
||
end;
|
||
RulerType := rt;
|
||
except
|
||
end;
|
||
FbarsLocked := False;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.DoSurfacePaint(sender: TObject);
|
||
var
|
||
sx, sy: integer;
|
||
pnt: Tpoint;
|
||
Begin
|
||
try
|
||
if Locked then
|
||
exit;
|
||
if rulerVisible then
|
||
begin
|
||
If HorzBarVisible then
|
||
PageLeft := 35 - HSCBarPosition;
|
||
If VertBarVisible then
|
||
PageTop := 35 - VSCBarPosition;
|
||
end
|
||
else
|
||
begin
|
||
If HorzBarVisible then
|
||
PageLeft := 5 - HSCBarPosition;
|
||
If VertBarVisible then
|
||
PageTop := 5 - VSCBarPosition;
|
||
end;
|
||
|
||
if VerticalZero = vzBottom then
|
||
sy := PageTop + PageHeight
|
||
else
|
||
sy := PageTop;
|
||
if HorizontalZero = vzRight then
|
||
sx := PageLeft + PageWidth
|
||
else
|
||
sx := PageLeft;
|
||
RulerStart := Point(sx, sy);
|
||
|
||
if assigned(TempBitmap) then
|
||
begin
|
||
TempBitmap.FreeImage;
|
||
TempBitmap.Free;
|
||
end;
|
||
if Assigned(GCadForm) then
|
||
if GCanRefreshCad then
|
||
DrawShadowCrossPoints; // Tolik 17/01/2022
|
||
|
||
TempBitmap := TBitmap.Create;
|
||
TempBitmap.Width := SurfaceWidth;
|
||
TempBitmap.Height := SurfaceHeight;
|
||
TempBitmap.Canvas.Brush.Color := Background;
|
||
TempBitmap.Canvas.Brush.Style := bsSolid;
|
||
TempBitmap.Canvas.FillRect(Rect(0, 0, TempBitmap.Width, TempBitmap.Height));
|
||
DrawGuideTrace(-25000, -25000);
|
||
SnapXold := -50000;
|
||
SnapYold := -50000;
|
||
SetForceBufferEngine;
|
||
DrawToCanvas(TempBitmap.canvas);
|
||
SetBufferEngine;
|
||
if FIsometric then
|
||
CalculateIsometricMargins;
|
||
except
|
||
//On E: Exception do AddExceptionToLog(CPowerCadMessage + 'TPCDrawBox.DoSurfacePaint' + E.Message);
|
||
On E: Exception do AddExceptionToLog('TPCDrawBox.DoSurfacePaint' + E.Message);
|
||
end;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.ZoomCenter;
|
||
var
|
||
xrect: TDoubleRect;
|
||
FRefresh: Boolean;
|
||
lMar: Integer;
|
||
event: TScrollValuesEvent;
|
||
Begin
|
||
FbarsLocked := True;
|
||
if ZoomPointFlag then
|
||
begin
|
||
xRect := DoubleRect(ZoomPoint.X - 10, ZoomPoint.Y - 10, ZoomPoint.X + 10, ZoomPoint.Y + 10);
|
||
end
|
||
else
|
||
begin
|
||
xRect := GetSelectionRect;
|
||
if (xrect.left = 0) and (xrect.right =0) and (xrect.top = 0) and (xrect.bottom = 0) then
|
||
begin
|
||
xRect := GetDrawingRect;
|
||
end;
|
||
if (xrect.left = 0) and (xrect.right =0) and (xrect.top = 0) and (xrect.bottom = 0) then
|
||
begin
|
||
XRect := DoubleRect(0, 0, WorkWidth, WorkHeight);
|
||
end;
|
||
end;
|
||
|
||
SetDpm(FDpmOrig * (FScale / 100));
|
||
FRefresh := AutoRefresh;
|
||
AutoRefresh := False;
|
||
event := FScrollValues;
|
||
FScrollValues := nil;
|
||
DoPageLocate;
|
||
FScrollValues := event;
|
||
FbarsLocked := True;
|
||
If HorzBarVisible then
|
||
begin
|
||
lmar := Round(SurfaceWidth - abs(xRect.Right - xRect.Left) * DotsPermil) div 2;
|
||
if HorizontalZero = vzRight then
|
||
scHorzPos := round(((FWorkWidth - xRect.right)) * DotsPerMil - lmar)
|
||
else
|
||
scHorzPos := round((xRect.Left) * DotsPerMil - lmar);
|
||
end;
|
||
If VertBarVisible then
|
||
begin
|
||
lmar := Round(SurfaceHeight - abs(xRect.Top - xRect.Bottom) * DotsPermil) div 2;
|
||
if VerticalZero = vzBottom then
|
||
scVertPos := round(((FWorkHeight - xRect.Bottom)) * DotsPerMil - lmar)
|
||
else
|
||
scVertPos := round(((xRect.Top)) * DotsPerMil - lmar);
|
||
end;
|
||
|
||
AutoRefresh := Frefresh;
|
||
if AutoRefresh then
|
||
DoSurfacePaint(Surface);
|
||
If assigned(SOnScale) then
|
||
SOnScale(self);
|
||
SyncEnv;
|
||
FbarsLocked := False;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.DoZoomIn;
|
||
Begin
|
||
ZoomScale := ZoomScale + 10;
|
||
inherited;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.DoZoomOut;
|
||
Begin
|
||
ZoomScale := ZoomScale - 10;
|
||
inherited;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.DoZoomArea;
|
||
Begin
|
||
inherited;
|
||
End;
|
||
|
||
procedure TPCDrawBox.ZoomArea(ZoomRect:TDoubleRect);
|
||
var sc1,sc2 : double;
|
||
rw,rh: real;
|
||
w,h : double;
|
||
tval: double;
|
||
lmar: Integer;
|
||
begin
|
||
|
||
if zoomrect.bottom > zoomrect.top then
|
||
begin
|
||
tVal := zoomrect.bottom;
|
||
zoomrect.bottom := zoomrect.top;
|
||
zoomrect.top := tval;
|
||
end;
|
||
if zoomrect.left > zoomrect.right then
|
||
begin
|
||
tVal := zoomrect.left;
|
||
zoomrect.left := zoomrect.right;
|
||
zoomrect.right := tval;
|
||
end;
|
||
w := Abs(ZoomRect.Left - ZoomRect.Right);
|
||
h := Abs(ZoomRect.Top - ZoomRect.Bottom);
|
||
rW := (w)*Fdpmorig;
|
||
sc1 := (surfacewidth-35)/rw;
|
||
rH := (h)*Fdpmorig;
|
||
sc2 := (surfaceheight-35)/rH;
|
||
if not((rw > 30) and (rh > 30)) then exit;
|
||
FbarsLocked := True;
|
||
AutoRefresh := False;
|
||
|
||
if Sc1 > sc2 then ZoomScale := Round(sc2*100) else ZoomScale := Round(sc1*100);
|
||
|
||
If HorzBarVisible then begin
|
||
lmar := Round(SurfaceWidth - abs(ZoomRect.Right-ZoomRect.Left)*DotsPermil) div 2;
|
||
if HorizontalZero = vzRight then
|
||
scHorzPos := round(((FWorkWidth-ZoomRect.right))*DotsPerMil-lmar)
|
||
else
|
||
scHorzPos := round((ZoomRect.Left)*DotsPerMil-lmar);
|
||
end;
|
||
If VertBarVisible then begin
|
||
lmar := Round(SurfaceHeight - abs(ZoomRect.Top-ZoomRect.Bottom)*DotsPermil) div 2;
|
||
if VerticalZero = vzBottom then
|
||
scVertPos := round(((FWorkHeight - ZoomRect.Top))*DotsPerMil-lmar)
|
||
else
|
||
scVertPos := round(((ZoomRect.Bottom))*DotsPerMil-lmar);
|
||
end;
|
||
AutoRefresh := True;
|
||
Refresh;
|
||
FbarsLocked := False;
|
||
DoZoomArea;
|
||
end;
|
||
|
||
|
||
Procedure TPCDrawBox.DoZoomActualSize;
|
||
Begin
|
||
ZoomScale := 100;
|
||
inherited;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.ActualSize;
|
||
begin
|
||
DoZoomActualSize;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.DoZoomFitToWindow;
|
||
var scx,scy,SWidth,SHeight: integer;
|
||
Begin
|
||
if rulerVisible then begin
|
||
SWidth := SurfaceWidth-30;
|
||
SHeight := SurfaceHeight - 30;
|
||
end else begin
|
||
SWidth := SurfaceWidth;
|
||
SHeight := SurfaceHeight;
|
||
end;
|
||
scx := round((Swidth / ((FWorkWidth ) * FDpmOrig )) * 100)-1;
|
||
scy := round((SHeight / ((FWorkHeight ) * FDpmOrig )) * 100)-1;
|
||
// Tolik 20/03/2019
|
||
//ZoomScae := Round(MinValue([scx,scy]));
|
||
if scx < scy then
|
||
ZoomScale := scx
|
||
else
|
||
ZoomScale := scy;
|
||
inherited;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.FitToWindow;
|
||
Begin
|
||
DoZoomFitToWindow;
|
||
end;
|
||
|
||
|
||
procedure TPCDrawBox.setbg(value: Tcolor);
|
||
begin
|
||
FBackGround := value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
evBackColor.RaiseEvent(Value);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetGuides(value: Boolean);
|
||
begin
|
||
FGuides := value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
evGuides.RaiseEvent(value);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
procedure TPCDrawBox.setgrids(value: boolean);
|
||
begin
|
||
FGrids := value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
evGrids.RaiseEvent(Value);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.SetGridType(value:TGridType);
|
||
begin
|
||
FGridType := value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
evGridType.RaiseEvent(ord(Value));
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setGcolor(value:Tcolor);
|
||
begin
|
||
FGridColor := value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
evGridColor.RaiseEvent(Value);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setGstep(value: Double);
|
||
begin
|
||
FGridStep := value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setGTrace(value: TGuideTraces);
|
||
begin
|
||
FGuideTrace := value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
evGuideTrace.RaiseEvent(ord(value));
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setGuidecolor(value:Tcolor);
|
||
begin
|
||
FGuideColor := value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
evGuideColor.RaiseEvent(Value);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
|
||
Procedure TPCDrawBox.setlayout(value : TPageLayout);
|
||
begin
|
||
Flayout := value;
|
||
case Flayout of
|
||
plA0 : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 1189; fWorkWidth := 841;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 841; fWorkWidth := 1189;
|
||
end;
|
||
end;
|
||
plA1 : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 841; fWorkWidth := 594;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 594; fWorkWidth := 841;
|
||
end;
|
||
end;
|
||
plA2 : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 594; fWorkWidth := 421;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 421; fWorkWidth := 594;
|
||
end;
|
||
end;
|
||
plA3 : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 421; fWorkWidth := 297;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 297; fWorkWidth := 421;
|
||
end;
|
||
end;
|
||
plA4 : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 297; fWorkWidth := 210;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 210; fWorkWidth := 297;
|
||
end;
|
||
end;
|
||
plA5 : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 210; fWorkWidth := 148;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 148; fWorkWidth := 210;
|
||
end;
|
||
end;
|
||
plA6 : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 105; fWorkWidth := 74;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 74; fWorkWidth := 105;
|
||
end;
|
||
end;
|
||
plB4 : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 353; fWorkWidth := 250;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 250; fWorkWidth := 353;
|
||
end;
|
||
end;
|
||
plB5 : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 250; fWorkWidth := 176;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 176; fWorkWidth := 250;
|
||
end;
|
||
end;
|
||
|
||
plTabloid : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 431; fWorkWidth := 279;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 279; fWorkWidth := 431;
|
||
end;
|
||
end;
|
||
|
||
plLetter : begin
|
||
if forient = poPortrait then
|
||
begin
|
||
fWorkHeight := 279; fWorkWidth := 215;
|
||
end
|
||
else
|
||
begin
|
||
fWorkHeight := 215; fWorkWidth := 279;
|
||
end;
|
||
end;
|
||
plCustom : begin
|
||
end;
|
||
end;
|
||
DoPageLocate;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
evPageLo.RaiseEvent(ord(FLayOut));
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setwHeight(value: Double);
|
||
begin
|
||
FWorkHeight := value;
|
||
flayout := plCustom;
|
||
// if fworkheight > fworkwidth then
|
||
// fOrient := poPortrait
|
||
// else
|
||
// fOrient := poLandscape;
|
||
DoPageLocate;
|
||
if autorefresh then
|
||
DoSurfacePaint(Surface);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setwWidth(value: Double);
|
||
Begin
|
||
FWorkWidth := value;
|
||
flayout := plCustom;
|
||
// if fworkheight > fworkwidth then
|
||
// fOrient := poPortrait
|
||
// else
|
||
// fOrient := poLandscape;
|
||
DoPageLocate;
|
||
if autorefresh then
|
||
DoSurfacePaint(Surface);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setorient(Value : TPageOrient);
|
||
var
|
||
buffer1, buffer2: Double;
|
||
|
||
begin
|
||
FOrient := value;
|
||
{
|
||
If FOrient = poPortrait then
|
||
begin
|
||
if fWorkWidth > fWorkHeight then
|
||
begin
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
if fWorkWidth < fWorkHeight then
|
||
begin
|
||
end;
|
||
end;
|
||
}
|
||
DoPageLocate;
|
||
if autorefresh then
|
||
DoSurfacePaint(Surface);
|
||
evPageOr.RaiseEvent(ord(FOrient));
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setSnapToNPoint(value: boolean);
|
||
begin
|
||
SnapLocked := False;
|
||
FSnapToNPoint := value;
|
||
evSnapObject.RaiseEvent(Value);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setSnapToGuides(value: boolean);
|
||
begin
|
||
SnapLocked := False;
|
||
FSnapToGuides := value;
|
||
evSnapGuides.RaiseEvent(Value);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setSnapToGrids(value: boolean);
|
||
begin
|
||
SnapLocked := False;
|
||
FSnapToGrids := value;
|
||
evSnapGrids.RaiseEvent(Value);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.DeConvertXY(var X,Y,Z: double);
|
||
Begin
|
||
if HorizontalZero = vzRight then
|
||
x := (PageLeft + PageWidth) - x
|
||
else
|
||
x := x - PageLeft;
|
||
|
||
if VerticalZero = vzBottom then
|
||
y := (PageTop + PageHeight) - y
|
||
else
|
||
y := y - PageTop;
|
||
DeConvertDim(x);
|
||
DeConvertDim(y);
|
||
End;
|
||
|
||
Procedure TPCDrawBox.DeConvertDim(var Dime: Double);
|
||
Begin
|
||
Dime := Dime / (DotsPerMil * ConvertRatio);
|
||
End;
|
||
|
||
Procedure TPCDrawBox.ConvertXY(var X,Y,Z: double);
|
||
Begin
|
||
ConvertDim(x);
|
||
ConvertDim(y);
|
||
if HorizontalZero = vzRight then
|
||
x := (PageLeft + PageWidth) - x
|
||
else
|
||
x := x + PageLeft;
|
||
if VerticalZero = vzBottom then
|
||
y := (PageTop + PageHeight) - y
|
||
else
|
||
y := PageTop + y;
|
||
x := x + ConvertDx;
|
||
y := y + ConvertDy;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.ConvertDim(var Dime: Double);
|
||
Begin
|
||
Dime := Dime * (DotsPerMil * ConvertRatio);
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfaceMove(Sender: TObject;Shift: TShiftState;
|
||
X, Y: Integer);
|
||
var xd,yd,z,dx,dy: Double;
|
||
Begin
|
||
//Self.SetFocus;
|
||
if xold <> -25000 then
|
||
begin
|
||
DrawGuideTrace(x,y);
|
||
end
|
||
else
|
||
begin
|
||
xold := -50000;
|
||
yold := -50000;
|
||
end;
|
||
dx := abs(dragStartxInt-x);
|
||
dy := abs(dragStartyInt-y);
|
||
if DragReadyInt and ((dx > 3) or (dy > 3)) then
|
||
begin
|
||
DragReadyInt := false;
|
||
OldCursor := Surface.Cursor;
|
||
if dragState = dsVScroll then
|
||
begin
|
||
SetCursor(crDefault);
|
||
end
|
||
else
|
||
if dragState = dsHScroll then
|
||
begin
|
||
SetCursor(crDefault);
|
||
end
|
||
else
|
||
if dragState = dsPan then
|
||
begin
|
||
SetCursor(crPan);
|
||
Screen.Cursor := crPan;
|
||
end
|
||
else
|
||
if dragState = dsDetPan then
|
||
begin
|
||
SetCursor(crPan);
|
||
Screen.Cursor := crPan;
|
||
end
|
||
else
|
||
if dragState = dsHRuler then
|
||
begin
|
||
SetCursor(crVSplit);
|
||
Screen.Cursor := crVSplit;
|
||
end
|
||
else
|
||
if dragState = dsVRuler then
|
||
begin
|
||
SetCursor(crHSplit);
|
||
Screen.Cursor := crVSplit;
|
||
end;
|
||
if (dragState = dsMod) or (dragState = dsMove) then
|
||
KillTraceFigure;
|
||
DragStarted;
|
||
Exit;
|
||
end
|
||
else
|
||
if isDragging then
|
||
begin
|
||
DragMove(x,y);
|
||
end;
|
||
if not (isDragging and (DragState in [dsPan])) then
|
||
begin
|
||
if (FDetailStyle = dsZoom) and PointInDetail(x,y) then
|
||
begin
|
||
z := CurrentZ;
|
||
xd := x;yd := y;
|
||
DetDeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
If assigned(SOnMouseTrace) then
|
||
SOnMouseTrace(Self,Shift,Xd,Yd);
|
||
MSTrace(Self,Shift,Xd,Yd);
|
||
end
|
||
else
|
||
begin
|
||
z := 0;
|
||
xd := x;yd := y;
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
If assigned(SOnMouseTrace) then
|
||
SOnMouseTrace(Self,Shift,Xd,Yd);
|
||
MSTrace(Self,Shift,Xd,Yd);
|
||
|
||
//Tolik 20/01/2021
|
||
if Assigned(GCadForm) then
|
||
begin
|
||
if GArchLineH <> nil then
|
||
begin
|
||
GArchLineH.Move(0, y - GArchLineH.aP1.y);
|
||
GArchLineV.Move(x - GArchLineV.Ap1.x, 0);
|
||
if GCadForm.PCad.TraceFigure = nil then
|
||
begin
|
||
DrawShadowCrossPoints;
|
||
if GCadForm.cbMagnetWalls.Down then
|
||
DefineShadowCrossPoints(GCurrMousePos.x, GCurrMousePos.y);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfaceClick(Sender:TObject);
|
||
Begin
|
||
If assigned(SOnMouseClick) then SOnMouseClick(Self);
|
||
MSClick(Self);
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfaceDblClick(Sender:TObject);
|
||
Begin
|
||
If assigned(SOnMouseDblClick) then SOnMouseDblClick(Self);
|
||
MSDblClick(Self);
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfaceLeave(Sender: TObject);
|
||
Begin
|
||
DrawGuideTrace(-50000,-50000);
|
||
If assigned(SOnMouseLeave) then SOnMouseLeave(Self);
|
||
MSLeave(Self);
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfaceDragDrop(Sender, Source: TObject; X,Y: Integer);
|
||
var guType: TGuideType;
|
||
GuideX,GuideY: Double;
|
||
xd,yd,z: double;
|
||
xSource: Integer;
|
||
BBOx: TPaintBox;
|
||
Dist: Integer;
|
||
Begin
|
||
xSource := 0;
|
||
if Source = Surface then begin
|
||
xSource := oleds_Surface;
|
||
end else if Source is TPaintBox then begin
|
||
BBox := Source as TPaintBox;
|
||
if BBox.Name = 'BlockBox' then FBlockDrop := BBox.Hint;
|
||
xSource := oleDS_BlockBox;
|
||
end;
|
||
|
||
xd := x;
|
||
yd := y;
|
||
z := CurrentZ;
|
||
if (FDetailStyle = dsZoom) and PointInDetail(x,y) then
|
||
DetDeConvertXY(Xd,Yd,z)
|
||
else
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
If assigned(SOnDropDrag) then SOnDropDrag(Self,Source,Xd,Yd);
|
||
MSDropDrag(Self, xSource, Xd, Yd);
|
||
DragState := 0;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfaceDragEnd(Sender, Target: TObject; X,Y: Integer);
|
||
var xd,yd,z:Double;
|
||
Begin
|
||
xd := x;
|
||
yd := y;
|
||
z := CurrentZ;
|
||
if (FDetailStyle = dsZoom) and PointInDetail(x,y) then
|
||
DetDeConvertXY(Xd,Yd,z)
|
||
else
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
If assigned(SOnDragEnd) then SOnDragEnd(Self,Target,Xd,Yd);
|
||
MSEndDrag(Self, Target, X, Y);
|
||
DragState := 0;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfaceDragOver(Sender, Source: TObject; X,Y: Integer; State: TDragState; var Accept: Boolean);
|
||
var xd,yd,z: Double;
|
||
xSource: Integer;
|
||
Begin
|
||
xSource := 0;
|
||
if Source = Surface then
|
||
xSource := oleDS_Surface
|
||
else
|
||
if Source is TPaintBox then
|
||
xSource := oleDS_BlockBox;
|
||
SurfaceMove(Sender,[],X,Y);
|
||
xd := x; yd := y;z := CurrentZ;
|
||
if (FDetailStyle = dsZoom) and PointInDetail(x,y) then
|
||
DetDeConvertXY(Xd,Yd,z)
|
||
else
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
If assigned(SOnDragTrace) then
|
||
SOnDragTrace(Self,Source,Xd,Yd,State,Accept);
|
||
MSDragOver(Self, xSource, Xd, Yd, State, Accept);
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfaceDragStart(Sender: TObject;var DragObject: TDragObject);
|
||
Begin
|
||
If assigned(SOnDragStart) then SOnDragStart(Self,DragObject);
|
||
IsDragging := True;
|
||
MSStartDrag(Sender,DragObject);
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfacePull(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||
var xd,yd,z: Double;
|
||
Begin
|
||
|
||
if (ToolIdx = TPCTool(toFigure)) and (Button = mbMiddle) then
|
||
exit;
|
||
|
||
if (isDragging or DragReadyInt) and (DragState in [dsHScroll,dsVScroll,dsPan,dsDetPan,dsHRuler,dsVRuler]) then
|
||
begin
|
||
// if GCadForm.PCad.GuidesVisible then
|
||
DragDropped(x,y);
|
||
end
|
||
else
|
||
if (FDetailStyle = dsZoom) and PointInDetail(x,y) then
|
||
begin
|
||
DetailHit := True;
|
||
DetailHitPoint:= Point(x,y);
|
||
xd := x;
|
||
yd := y;
|
||
z := CurrentZ;
|
||
DetDeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
If assigned(SOnMousePull) then SOnMousePull(Self,Button,Shift,Xd,Yd);
|
||
MSPull(Self,Button,Shift,Xd,Yd);
|
||
end
|
||
else
|
||
begin
|
||
DetailHit := False;
|
||
xd := x;
|
||
yd := y;
|
||
z := 0;
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
If assigned(SOnMousePull) then SOnMousePull(Self,Button,Shift,Xd,Yd);
|
||
MSPull(Self,Button,Shift,Xd,Yd);
|
||
end;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.SurfacePush(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||
var xd,yd,z: Double;
|
||
xCanvas:TCanvas;
|
||
fig: TFigure;
|
||
odactive: Boolean;
|
||
Begin
|
||
|
||
if GArchLineH <> nil then
|
||
begin
|
||
//GArchLineH.Move(0, y - GArchLineH.aP1.y);
|
||
//GArchLineV.Move(x - GArchLineV.Ap1.x, 0);
|
||
if GCadForm.PCad.TraceFigure = nil then
|
||
begin
|
||
//if GCadForm.cbMagnetWalls.Down then
|
||
// DrawShadowCrossPoints;
|
||
//if GCadForm.cbMagnetWalls.Down then
|
||
// DefineShadowCrossPoints(GCurrMousePos.x, GCurrMousePos.y);
|
||
end;
|
||
end;
|
||
|
||
GotFocus(Self);
|
||
odactive := DetailActive;
|
||
DetailActive := False;
|
||
CurrentModPoint := nil;
|
||
if PointInHScroll(x,y) then
|
||
begin
|
||
|
||
DragStartXInt := x;
|
||
OldPosX := HSCBarPosition;
|
||
DragState := dsHScroll;
|
||
DragReadyInt := True;
|
||
xCanvas :=GetActiveCanvas;
|
||
DrawScrollsToCanvas(xCanvas,True,True,False);
|
||
end
|
||
else
|
||
if PointInVScroll(x,y) then
|
||
begin
|
||
DragStartYInt := y;
|
||
OldPosY := VSCBarPosition;
|
||
DragState := dsVScroll;
|
||
DragReadyInt := True;
|
||
xCanvas :=GetActiveCanvas;
|
||
DrawScrollsToCanvas(xCanvas,True,False,True);
|
||
end
|
||
else
|
||
if PointInHRuler(x,y) then
|
||
begin
|
||
DragStartYInt := y;
|
||
DragStartXInt := x;
|
||
DragOldx := x;
|
||
DragOldY := y;
|
||
DragState := dsHRuler;
|
||
DragReadyInt := True;
|
||
end
|
||
else
|
||
if PointInVRuler(x,y) then
|
||
begin
|
||
DragStartYInt := y;
|
||
DragStartXInt := x;
|
||
DragOldx := x;
|
||
DragOldY := y;
|
||
DragState := dsVRuler;
|
||
DragReadyInt := True;
|
||
end
|
||
else
|
||
if (Button = mbMiddle) and (PointInDetail(x,y)) then
|
||
begin
|
||
DetailActive := True;
|
||
DragStartXInt := x;
|
||
DragStartYInt := y;
|
||
//OldPosY := VSCBarPosition;
|
||
//OldPosX := HSCBarPosition;
|
||
DragState := dsDetPan;
|
||
DragReadyInt := True;
|
||
//xCanvas :=GetActiveCanvas;
|
||
//DrawScrollsToCanvas(xCanvas,True,False,True);
|
||
end
|
||
else if PointInDetail(x,y) then
|
||
begin
|
||
DetailActive := True;
|
||
xd := x;
|
||
yd := y;
|
||
z := 0;
|
||
CurrentZ := 0;
|
||
DetailHit := True;
|
||
DetailHitPoint := Point(x,y);
|
||
If assigned(SOnMousePush) then SOnMousePush(Self,Button,Shift,Xd,Yd);
|
||
if ToolIdx = toSelect then begin
|
||
CurrentModPoint := HitTestModPointDetVal(x,y);
|
||
if assigned(CurrentModPoint) then
|
||
begin
|
||
z := CurrentModPoint.CoordZ;
|
||
CurrentZ := z;
|
||
end else if FDetailStyle = dsIsometry then begin
|
||
CurrentIsoFigure := nil;
|
||
fig := nil;
|
||
fig := CheckByPointInt(ActiveLayer,x,y);
|
||
if assigned(fig) then begin
|
||
CurrentIsoFigure := fig;
|
||
end;
|
||
end;
|
||
end;
|
||
DetDeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
MSPush(Self,Button,Shift,Xd,Yd);
|
||
CurrentIsoFigure := nil;
|
||
if FDetailStyle = dsIsometry then begin
|
||
MSPull(Self,Button,Shift,Xd,Yd);
|
||
end;
|
||
CurrentModPoint := nil;
|
||
end
|
||
else
|
||
if (Button = mbMiddle) and (not PointInDetail(x,y)) then
|
||
begin
|
||
if ToolIdx <> TPCTool(toFigure) then
|
||
begin
|
||
DragStartXInt := x;
|
||
DragStartYInt := y;
|
||
OldPosY := VSCBarPosition;
|
||
OldPosX := HSCBarPosition;
|
||
DragState := dsPan;
|
||
DragReadyInt := True;
|
||
xCanvas :=GetActiveCanvas;
|
||
DrawScrollsToCanvas(xCanvas,True,False,True);
|
||
end;
|
||
end
|
||
else
|
||
if FIsometric then
|
||
begin
|
||
DetailHit := False;
|
||
xd := x;
|
||
yd := y;
|
||
z := 0;
|
||
CurrentZ := 0;
|
||
If assigned(SOnMousePush) then SOnMousePush(Self,Button,Shift,Xd,Yd);
|
||
if ToolIdx = toSelect then begin
|
||
CurrentModPoint := HitTestModPointIntVal(x,y);
|
||
if assigned(CurrentModPoint) then
|
||
begin
|
||
z := CurrentModPoint.CoordZ;
|
||
CurrentZ := z;
|
||
end else begin
|
||
CurrentIsoFigure := nil;
|
||
fig := nil;
|
||
fig := CheckByPointInt(ActiveLayer,x,y);
|
||
if assigned(fig) then begin
|
||
CurrentIsoFigure := fig;
|
||
end;
|
||
end;
|
||
end;
|
||
IsoDeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
MSPush(Self,Button,Shift,Xd,Yd);
|
||
CurrentIsoFigure := nil;
|
||
CurrentModPoint := nil;
|
||
end
|
||
else
|
||
begin
|
||
xd := x;
|
||
yd := y;
|
||
z := 0;
|
||
DetailHit := False;
|
||
CurrentModPoint := nil;
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
MSPush(Self,Button,Shift,Xd,Yd);
|
||
If assigned(SOnMousePush) then SOnMousePush(Self,Button,Shift,Xd,Yd);
|
||
end;
|
||
if detailActive <> odActive then Refresh;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.LostFocus(sender:Tobject);
|
||
Begin
|
||
Container.SetFocus;
|
||
End;
|
||
|
||
Procedure TPCDrawBox.drawguideTrace(x,y: integer);
|
||
var alfa : extended;
|
||
xCanvas: TCanvas;
|
||
z,xd,yd: Double;
|
||
begin
|
||
if Locked then
|
||
exit;
|
||
if (csDesigning in self.ComponentState) then
|
||
exit;
|
||
xCanvas := GetActiveCanvas;
|
||
ClipToUnScrollRegion;
|
||
try
|
||
with xCanvas do
|
||
begin
|
||
pen.color := clRed xor clWhite;
|
||
pen.width := 1;
|
||
pen.style := psSolid;
|
||
pen.mode := pmXor;
|
||
brush.style := bsSolid;
|
||
brush.Color := clRed xor clWhite;;
|
||
|
||
if (SnapXOld <> -50000) then
|
||
begin
|
||
Ellipse(SnapXOld-4,SnapYOld-4,SnapXOld+4,SnapYOld+4);
|
||
end;
|
||
if (SnapX <> -50000) then
|
||
begin
|
||
Ellipse(SnapX-4,SnapY-4,SnapX+4,SnapY+4);
|
||
end;
|
||
pen.color := clBlue xor clWhite;
|
||
pen.style := psDot;
|
||
brush.style := bsClear;
|
||
|
||
if FDrawInCursor then
|
||
begin
|
||
pen.style := psSolid;
|
||
if (xold <> - 50000) then
|
||
begin
|
||
moveto(xold-8,yold);
|
||
lineto(xold+8,yold);
|
||
moveto(xold,yold-8);
|
||
lineto(xold,yold+8);
|
||
|
||
end;
|
||
if x <> - 50000 then
|
||
begin
|
||
moveto(x-8,y);
|
||
lineto(x+8,y);
|
||
moveto(x,y-8);
|
||
lineto(x,y+8);
|
||
end;
|
||
pen.style := psDot;
|
||
end;
|
||
|
||
|
||
case (FGuideTrace) of
|
||
gtNone: begin
|
||
if RulerVisible then begin
|
||
if (xold <> - 50000) then
|
||
begin
|
||
moveto(0,yold);lineto(30,yold);
|
||
moveto(xold,0);lineto(xold,30);
|
||
end;
|
||
if x <> - 50000 then
|
||
begin
|
||
moveto(0,y);lineto(30,y);
|
||
moveto(x,0);lineto(x,30);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
gtNinty: begin
|
||
if xold <> - 50000 then
|
||
begin
|
||
moveto(0,yold);lineto(SurfaceWidth,yold);
|
||
moveto(xold,0);lineto(xold,SurfaceHeight);
|
||
end;
|
||
if x <> - 50000 then
|
||
begin
|
||
moveto(0,y);lineto(SurfaceWidth,y);
|
||
moveto(x,0);lineto(x,SurfaceHeight);
|
||
end;
|
||
end;
|
||
|
||
gtFortyFive: begin
|
||
|
||
alfa := (2*pi)/8;
|
||
if xold <> - 50000 then
|
||
begin
|
||
moveto(0,yold-round(tan(alfa)*xold));lineto(SurfaceWidth,yold+round(tan(alfa)*(SurfaceWidth-xold)));
|
||
moveto(0,yold+round(tan(alfa)*xold));lineto(SurfaceWidth,yold-round(tan(alfa)*(SurfaceWidth-xold)));
|
||
end;
|
||
if x <> - 50000 then
|
||
begin
|
||
moveto(0,y-round(tan(alfa)*x));lineto(SurfaceWidth,y+round(tan(alfa)*(SurfaceWidth-x)));
|
||
moveto(0,y+round(tan(alfa)*x));lineto(SurfaceWidth,y-round(tan(alfa)*(SurfaceWidth-x)));
|
||
end;
|
||
|
||
end;
|
||
|
||
gtThirty: begin
|
||
|
||
alfa := (2*pi)/12;
|
||
if xold <> - 50000 then
|
||
begin
|
||
moveto(0,yold-round(tan(alfa)*xold));lineto(SurfaceWidth,yold+round(tan(alfa)*(SurfaceWidth-xold)));
|
||
moveto(0,yold+round(tan(alfa)*xold));lineto(SurfaceWidth,yold-round(tan(alfa)*(SurfaceWidth-xold)));
|
||
end;
|
||
if x <> - 50000 then
|
||
begin
|
||
moveto(0,y-round(tan(alfa)*x));lineto(SurfaceWidth,y+round(tan(alfa)*(SurfaceWidth-x)));
|
||
moveto(0,y+round(tan(alfa)*x));lineto(SurfaceWidth,y-round(tan(alfa)*(SurfaceWidth-x)));
|
||
end;
|
||
|
||
end;
|
||
|
||
gtsixty: begin
|
||
|
||
alfa := (2*pi)/6;
|
||
if xold <> - 50000 then
|
||
begin
|
||
moveto(0,yold-round(tan(alfa)*xold));lineto(SurfaceWidth,yold+round(tan(alfa)*(SurfaceWidth-xold)));
|
||
moveto(0,yold+round(tan(alfa)*xold));lineto(SurfaceWidth,yold-round(tan(alfa)*(SurfaceWidth-xold)));
|
||
end;
|
||
if x <> - 50000 then
|
||
begin
|
||
moveto(0,y-round(tan(alfa)*x));lineto(SurfaceWidth,y+round(tan(alfa)*(SurfaceWidth-x)));
|
||
moveto(0,y+round(tan(alfa)*x));lineto(SurfaceWidth,y-round(tan(alfa)*(SurfaceWidth-x)));
|
||
end;
|
||
|
||
end;
|
||
gtCustom: begin
|
||
if assigned(FCustomGuideTrace) then
|
||
begin
|
||
if xold <> - 50000 then
|
||
begin
|
||
z := 0;
|
||
xd := xold;yd := yold;
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
FCustomGuideTrace(Self,xold,yold,xd,yd,xCanvas);
|
||
end;
|
||
if x <> - 50000 then
|
||
begin
|
||
z := 0;
|
||
xd := x;yd := y;
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
FCustomGuideTrace(Self,x,y,xd,yd,xCanvas);
|
||
end;
|
||
end;
|
||
if assigned(FCustomGuideTraceVB) then
|
||
begin
|
||
if xold <> - 50000 then
|
||
begin
|
||
z := 0;
|
||
xd := xold;yd := yold;
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
FCustomGuideTraceVB(Self,xold,yold,xd,yd,xCanvas.Handle);
|
||
end;
|
||
if x <> - 50000 then
|
||
begin
|
||
z := 0;
|
||
xd := x;yd := y;
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
FCustomGuideTraceVB(Self,x,y,xd,yd,xCanvas.Handle);
|
||
end;
|
||
end;
|
||
|
||
end;
|
||
|
||
end;
|
||
yold := y;
|
||
xold := x;
|
||
SnapXOld := SnapX;
|
||
SnapYOld := SnapY;
|
||
end;
|
||
except
|
||
|
||
end;
|
||
UnClip;
|
||
end;
|
||
|
||
|
||
Procedure TPCDrawBox.checktoSnap(var x,y : Double);
|
||
var xx,yy,z: Double;
|
||
begin
|
||
SnapX := -50000;
|
||
SnapY := -50000;
|
||
if (ToolIdx = toZoom) or (ToolIdx = toDetailZoom) then exit;
|
||
if (ToolIdx = toSelect) then
|
||
begin
|
||
if not IsDragging then exit;
|
||
end;
|
||
xx := x;
|
||
yy := y;
|
||
CalculateSnapPoint(x,y);
|
||
if (xx<> x) or (yy <> y) then begin
|
||
xx := x;
|
||
yy := y;
|
||
Dengine.ConvertCoord(xx,yy,z);
|
||
SnapX := Round(xx);
|
||
SnapY := Round(yy);
|
||
end;
|
||
end;
|
||
|
||
//Procedure TPCDrawBox.CalculateSnapPoint(var x,y : Double);
|
||
Function TPCDrawBox.CalculateSnapPoint(var x,y : Double): Boolean;
|
||
Type DistRec = Record
|
||
Dist : Double;
|
||
Coord : Double;
|
||
end;
|
||
|
||
Var SnapDistance : Double;
|
||
Coord: Double;
|
||
gnumberv,gnumberh,a: integer;
|
||
DistGridx,DistGridy : DistRec;
|
||
DistGuideX,DistGuideY : Distrec;
|
||
DistNearx,DistNeary : DistRec;
|
||
NearX,NearY: Double;
|
||
Guide: TGuideLine;
|
||
grStep : double;
|
||
mx: Integer;
|
||
mval: Double;
|
||
workw,workh: Double;
|
||
dpm: double;
|
||
distx, disty: Double;
|
||
Begin
|
||
result := false;
|
||
if SnapLocked then exit;
|
||
snapDistance := 12/dotspermil; // 12 pixel
|
||
distGridx.dist := SnapDistance;
|
||
distGridy.dist := SnapDistance;
|
||
distGridx.coord := x;
|
||
distGridy.coord := y;
|
||
distGuidex.dist := SnapDistance;
|
||
distGuidey.dist := SnapDistance;
|
||
distGuidex.coord := x;
|
||
distGuidey.coord := y;
|
||
distNearx.dist := SnapDistance;
|
||
distNeary.dist := SnapDistance;
|
||
distNearx.coord := x;
|
||
distNeary.coord := y;
|
||
{
|
||
if GCadForm.cbMagnetWalls.Down then
|
||
begin
|
||
DefineShadowCrossPoints(x ,y);
|
||
if ((GWallPathPointX <> nil) or (GWallPathPointY <> nil)) then
|
||
begin
|
||
//Tolik 20/01/2022 --
|
||
if GWallPathPointX <> nil then
|
||
begin
|
||
X := GWallPathPointX.x;
|
||
distx := RoundN(Sqrt(sqr(GWallPathPointX.x - x) + sqr(GWallPathPointX.y - y)), 6);
|
||
if distx <= 1 then
|
||
Y := GWallPathPointX.y;
|
||
end;
|
||
if GWallPathPointY <> nil then
|
||
begin
|
||
if GWallPathPointX = nil then
|
||
begin
|
||
disty := RoundN(Sqrt(sqr(GWallPathPointY.x - x) + sqr(GWallPathPointY.y - y)), 6);
|
||
Y := GWallPathPointY.y;
|
||
if disty <= 1 then
|
||
X := GWallPathPointY.x;
|
||
end
|
||
else
|
||
begin
|
||
if Distx > 1 then
|
||
begin
|
||
if Disty <= 1 then
|
||
Y := GWallPathPointY.y;
|
||
end;
|
||
end;
|
||
end;
|
||
exit;
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
DrawGuideTrace(Round(x),Round(y));
|
||
exit;
|
||
end;
|
||
}
|
||
//
|
||
|
||
If FSnapToNPoint then
|
||
begin
|
||
NearX := X;
|
||
NearY := Y;
|
||
if SnapToFigures(NearX,NearY) then
|
||
begin
|
||
x := NearX;
|
||
y := NearY;
|
||
exit;
|
||
end;
|
||
end;
|
||
|
||
if FsnaptoGrids then
|
||
begin
|
||
|
||
|
||
if RulerSystem = rsMetric then
|
||
begin
|
||
WorkW := FWorkWidth;
|
||
WorkH := FWorkHeight;
|
||
dpm := DotsPerMil;
|
||
grStep := FGridStep;
|
||
end
|
||
else
|
||
begin
|
||
WorkW := ((FWorkWidth)/25.4)*16;
|
||
WorkH := ((FWorkHeight)/25.4)*16;
|
||
dpm := DotsPerMil;
|
||
grStep := (FGridStep/16)*25.4;
|
||
end;
|
||
|
||
|
||
gnumberv := trunc(workw / FGridStep) ;
|
||
if Fworkwidth = gnumberv*FGridStep then
|
||
gnumberv := gnumberv - 1;
|
||
gnumberh := trunc(workh / FGridStep) ;
|
||
if Fworkheight = gnumberh*FGridStep then
|
||
gnumberh := gnumberh - 1;
|
||
for a := 1 to gnumberv do
|
||
begin
|
||
if HorizontalZero = vzRight then
|
||
coord := FWorkWidth-a*grStep
|
||
else
|
||
coord := a*grStep;
|
||
if abs(coord - x) < DistGridx.dist then
|
||
begin
|
||
distGridx.dist := abs(coord - x);
|
||
distGridx.coord := coord;
|
||
end;
|
||
end;
|
||
for a := 1 to gnumberh do
|
||
begin
|
||
if VerticalZero = vzBottom then
|
||
coord := FWorkHeight-(a*GrStep)
|
||
else
|
||
coord := a*grStep;
|
||
if abs(coord - y) < DistGridy.dist then
|
||
begin
|
||
distGridy.dist := abs(coord - y);
|
||
distGridy.coord := coord;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
If FSnapToGuides then
|
||
begin
|
||
for a := 0 to guides.count-1 do
|
||
begin
|
||
Guide := TGuideline(guides[a]);
|
||
If guide.gType = gtHorz then
|
||
begin
|
||
If abs(guide.coord - y) < distguidey.dist then
|
||
begin
|
||
distGuidey.dist := abs(guide.coord - y);
|
||
distGuidey.coord := guide.coord;
|
||
Result := true
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
If abs(guide.coord - x) < distguidex.dist then
|
||
begin
|
||
distGuidex.dist := abs(guide.coord - x);
|
||
distGuidex.coord := guide.coord;
|
||
result := true;
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
|
||
mx := 0; mval := DistGridx.dist;
|
||
if DistGuidex.dist < mval then
|
||
begin
|
||
mVal := DistGuidex.dist;
|
||
mx := 1;
|
||
end;
|
||
if DistNearx.dist < mval then
|
||
begin
|
||
mVal := DistGuidex.dist;
|
||
mx := 2;
|
||
end;
|
||
if mx = 0 then x := DistGridx.coord
|
||
else if mx = 1 then x := DistGuidex.coord
|
||
else if mx = 2 then x := DistNearX.coord;
|
||
|
||
mx := 0; mval := DistGridy.dist;
|
||
if DistGuidey.dist < mval then
|
||
begin
|
||
mVal := DistGuidey.dist;
|
||
mx := 1;
|
||
end;
|
||
if DistNeary.dist < mval then
|
||
begin
|
||
mVal := DistGuidey.dist;
|
||
mx := 2;
|
||
end;
|
||
if mx = 0 then y := DistGridy.coord
|
||
else if mx = 1 then y := DistGuidey.coord
|
||
else if mx = 2 then y := DistNeary.coord;
|
||
|
||
end;
|
||
|
||
|
||
|
||
Procedure TPCDrawBox.MSPush(sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Double);begin end;
|
||
procedure TPCDrawBox.MSTrace(Sender: TObject; Shift: TShiftState; X,Y: Double);begin end;
|
||
procedure TPCDrawBox.MSPull(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Double);begin end;
|
||
procedure TPCDrawBox.MSDropDrag(Sender: TObject;Source:Integer; X, Y: Double);begin end;
|
||
procedure TPCDrawBox.MSDragOver(Sender: TObject;Source:Integer; X, Y: Double;State: TDragState; var Accept: Boolean);begin end;
|
||
procedure TPCDrawBox.MSEndDrag(Sender, Target: TObject; X, Y: Double);begin end;
|
||
procedure TPCDrawBox.MSStartDrag(Sender: TObject; var DragObject: TDragObject);
|
||
begin end;
|
||
procedure TPCDrawBox.MSClick(Sender: TObject);begin end;
|
||
procedure TPCDrawBox.MSDblClick(Sender: TObject);begin end;
|
||
Procedure TPCDrawBox.MSLeave(Sender: TObject);begin end;
|
||
|
||
|
||
Procedure TPCDrawBox.SyncEnv;
|
||
begin
|
||
end;
|
||
|
||
Procedure TPCDrawBox.Refresh;
|
||
begin
|
||
end;
|
||
|
||
Procedure TPCDrawBox.ResetActions;
|
||
Begin
|
||
End;
|
||
|
||
Procedure TPCDrawBox.ResetRegions;
|
||
Begin
|
||
End;
|
||
|
||
|
||
procedure TPCDrawBox.DrawToCanvas(Canvas: TCanvas);
|
||
var
|
||
a4H: Double;
|
||
Begin
|
||
with canvas do
|
||
begin
|
||
Brush.Color := FPageColor;
|
||
Brush.Style := bsSolid;
|
||
Pen.Mode:= pmCopy;
|
||
Pen.Style:= psSolid;
|
||
if BackGround = clBlack then
|
||
Pen.Color:= ClWhite
|
||
else
|
||
Pen.Color:= ClBlack;
|
||
Pen.Width := 1;
|
||
if FDrawPageBorder then
|
||
Rectangle(PageLeft, PageTop, PageLeft + PageWidth, PageTop + PageHeight);
|
||
If assigned(FBeforePaint) then
|
||
FBeforePaint(self);
|
||
Brush.Color := clWhite;
|
||
Brush.Style := bsClear;
|
||
if FShadow then
|
||
begin
|
||
Pen.Width := 2;
|
||
MoveTo(PageLeft + PageWidth + 1, PageTop + round(2 * DotsPerMil));
|
||
LineTo(PageLeft + PageWidth + 1, PageTop + PageHeight);
|
||
MoveTo(PageLeft + round(2 * DotsPerMil), PageTop + PageHeight + 1);
|
||
LineTo(PageLeft + PageWidth, PageTop + PageHeight + 1);
|
||
end;
|
||
if FGrids then
|
||
begin
|
||
DrawGrids(Canvas);
|
||
end;
|
||
{Mityai} //D0000006303
|
||
//if Assigned(GCadForm) then
|
||
if (FGuides)and(GuidesVisible) then
|
||
begin
|
||
DrawGuides(Canvas);
|
||
end;
|
||
if FCenterGuide then
|
||
begin
|
||
Pen.Style := psDot;
|
||
Pen.Color := clGreen;
|
||
Pen.width := 1;
|
||
Pen.mode := pmCopy;
|
||
Brush.Style := bsClear;
|
||
moveto(PageLeft + PageWidth div 2, PageTop + 1);
|
||
lineto(PageLeft + PageWidth div 2, PageTop + PageHeight - 1);
|
||
moveto(PageLeft + 1, PageTop + PageHeight div 2);
|
||
lineto(PageLeft+PageWidth - 1, PageTop + PageHeight div 2);
|
||
end;
|
||
if FPageGuide then
|
||
begin
|
||
Pen.Style := psDot;
|
||
Pen.Color := clGreen;
|
||
Pen.width := 1;
|
||
Pen.mode := pmCopy;
|
||
Brush.Style := bsClear;
|
||
a4H := 300;
|
||
Dengine.ConvertDim(a4H);
|
||
moveto(PageLeft, PageTop + PageHeight - round(a4H));
|
||
lineto(PageLeft + PageWidth - 1, PageTop + PageHeight - round(a4H));
|
||
a4H := 450;
|
||
Dengine.ConvertDim(a4H);
|
||
moveto(PageLeft, PageTop + PageHeight - round(a4H));
|
||
lineto(PageLeft + PageWidth - 1, PageTop + PageHeight - round(a4H));
|
||
a4H := 900;
|
||
Dengine.ConvertDim(a4H);
|
||
moveto(PageLeft, PageTop + PageHeight - round(a4H));
|
||
lineto(PageLeft + PageWidth - 1, PageTop + PageHeight - round(a4H));
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DrawGrids(Canvas: TCanvas);
|
||
var
|
||
gnumberv, gnumberh, a, b: integer;
|
||
z: double;
|
||
grx, gry: Double;
|
||
grStep: double;
|
||
workw, workh: Double;
|
||
dpm: double;
|
||
begin
|
||
if RulerSystem = rsMetric then
|
||
begin
|
||
WorkW := FWorkWidth;
|
||
WorkH := FWorkHeight;
|
||
dpm := DotsPerMil;
|
||
grStep := FGridStep;
|
||
end
|
||
else
|
||
begin
|
||
WorkW := ((FWorkWidth) / 25.4) * 16;
|
||
WorkH := ((FWorkHeight) / 25.4) * 16;
|
||
dpm := DotsPerMil;
|
||
grStep := (FGridStep / 16) * 25.4;
|
||
end;
|
||
|
||
with Canvas do
|
||
begin
|
||
Pen.Style := pssolid;
|
||
Pen.Color := FgridColor;
|
||
Pen.width := 1;
|
||
Pen.mode := pmCopy;
|
||
Brush.Style := bsClear;
|
||
gnumberv := trunc(workw / FGridStep) ;
|
||
if Fworkwidth * dotspermil <= gnumberv * FGridStep * dotspermil + 2 then
|
||
gnumberv := gnumberv - 1;
|
||
gnumberh := trunc(workh / FGridStep) ;
|
||
if Fworkheight * dotspermil <= gnumberh * FGridStep * dotspermil + 2 then
|
||
gnumberh := gnumberh - 1;
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if FGridType = grtLine then
|
||
begin
|
||
for a := 1 to gnumberv do
|
||
begin
|
||
if HorizontalZero = vzRight then
|
||
Dengine.drawline(FWorkWidth - a * grStep,(1 / dotspermil), FWorkWidth - a * grStep, FWorkHeight - (1 / dotspermil), FGridColor, 1, ord(psSolid), 0)
|
||
else
|
||
Dengine.drawline(a*grStep,(1/dotspermil),a*grStep,FWorkHeight-(1/dotspermil),FGridColor,1,ord(psSolid),0);
|
||
end;
|
||
for a := 1 to gnumberh do
|
||
begin
|
||
if VerticalZero = vzBottom then
|
||
Dengine.drawline((1/dotspermil),FWorkHeight-(a*GrStep),FWorkWidth-(1/dotspermil),FWorkHeight-(a*GrStep),FGridColor,1,ord(psSolid),0)
|
||
else
|
||
Dengine.drawline((1/dotspermil),(a*GrStep),FWorkWidth-(1/dotspermil),(a*GrStep),FGridColor,1,ord(psSolid),0);
|
||
end;
|
||
end
|
||
else
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if FGridType = grtPoint then
|
||
begin
|
||
for a := 1 to gnumberv do
|
||
begin
|
||
for b := 1 to gnumberh do
|
||
begin
|
||
if HorizontalZero = vzRight then
|
||
grx := FWorkWidth-(a * GrStep)
|
||
else
|
||
grx := (a*GrStep);
|
||
if VerticalZero = vzBottom then
|
||
gry := FWorkHeight-(b * grStep)
|
||
else
|
||
gry := (b*grStep);
|
||
DEngine.DrawPoint(DoublePOint(grx,gry),FGridColor);
|
||
end;
|
||
end;
|
||
end
|
||
else
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
begin
|
||
for a := 1 to gnumberv do
|
||
begin
|
||
for b := 1 to gnumberh do
|
||
begin
|
||
if HorizontalZero = vzRight then
|
||
grx := FWorkWidth - (a * GrStep)
|
||
else
|
||
grx := (a * GrStep);
|
||
if VerticalZero = vzBottom then
|
||
gry := FWorkHeight - (b * grStep)
|
||
else
|
||
gry := (b * grStep);
|
||
Dengine.DrawCross(DoublePoint(grx,gry),FGridColor,1,ord(psSolid),2,False);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DrawGuides(Canvas: TCanvas);
|
||
var a: integer;
|
||
g: TGuideLine;
|
||
gx,gy,z: double;
|
||
x1,x2,y1,y2: Double;
|
||
begin
|
||
DEngine.Canvas.Pen.mode := pmXor;
|
||
For a := 0 to Guides.Count -1 do
|
||
begin
|
||
g := TGuideLine(Guides[a]);
|
||
if ((not g.fautoCr) or GShowAutoCreatedGuides) then
|
||
begin
|
||
gx := g.coord;
|
||
gy := g.coord;
|
||
x1 := 0;
|
||
y1 := 0;
|
||
z := 0;
|
||
x2 := SurfaceWidth;
|
||
y2 := SurfaceHeight;
|
||
DEngine.DeConvertCoord(x1, y1, z);
|
||
DEngine.DeConvertCoord(x2, y2, z);
|
||
|
||
if g.gType = gtHorz then
|
||
begin
|
||
DEngine.drawline(x1, gy, x2, gy, FGuideColor xor FbackGround, 1, ord(psSolid), 0);
|
||
end
|
||
else
|
||
begin
|
||
DEngine.drawline(gx, y1, gx, y2, FGuideColor xor FbackGround, 1, ord(psSolid), 0);
|
||
end;
|
||
end;
|
||
end;
|
||
DEngine.Canvas.Pen.mode := pmCopy;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DrawCenterGuide(Canvas: TCanvas);
|
||
begin
|
||
with canvas do
|
||
begin
|
||
if FCenterGuide then
|
||
begin
|
||
Pen.Style := psDot;
|
||
Pen.Color := clGreen;
|
||
Pen.width := 1;
|
||
Pen.mode := pmCopy;
|
||
Brush.Style := bsClear;
|
||
moveto(PageLeft + PageWidth div 2, PageTop + 1);
|
||
lineto(PageLeft + PageWidth div 2, PageTop + PageHeight - 1);
|
||
moveto(PageLeft + 1, PageTop + PageHeight div 2);
|
||
lineto(PageLeft+PageWidth - 1, PageTop + PageHeight div 2);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DrawGuidesTop(Canvas: TCanvas);
|
||
var a: integer;
|
||
g: TGuideLine;
|
||
gx,gy,z: double;
|
||
x1,x2,y1,y2: Double;
|
||
begin
|
||
DEngine.Canvas.Pen.mode := pmCopy;
|
||
For a := 0 to Guides.Count -1 do
|
||
begin
|
||
g := TGuideLine(Guides[a]);
|
||
if ((not g.fautoCr) or GShowAutoCreatedGuides) then
|
||
begin
|
||
gx := g.coord;
|
||
gy := g.coord;
|
||
x1 := 0;
|
||
y1 := 0;
|
||
z := 0;
|
||
x2 := SurfaceWidth;
|
||
y2 := SurfaceHeight;
|
||
DEngine.DeConvertCoord(x1, y1, z);
|
||
DEngine.DeConvertCoord(x2, y2, z);
|
||
|
||
if g.gType = gtHorz then
|
||
begin
|
||
DEngine.drawline(x1, gy, x2, gy, FbackGround or FbackGround, 1, ord(psSolid), 0);
|
||
end
|
||
else
|
||
begin
|
||
DEngine.drawline(gx, y1, gx, y2, FbackGround or FbackGround, 1, ord(psSolid), 0);
|
||
end;
|
||
end;
|
||
end;
|
||
// DEngine.Canvas.Pen.mode := pmXor;
|
||
end;
|
||
|
||
|
||
|
||
Function TPCDrawBox.SnapToFigures(var x, y: double):Boolean;
|
||
begin
|
||
result := false;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetTool(aToolIndex: TPCTool; aToolInfo: String;aToolData:Integer);
|
||
var sub:string;
|
||
p: Integer;
|
||
begin
|
||
if aToolIndex = toFigure then begin
|
||
p := Pos('>',aToolInfo);
|
||
if p > 0 then begin
|
||
sub := Copy(aToolInfo,p+1,Length(aToolInfo)-p);
|
||
aToolInfo := Copy(aToolInfo,1,p-1);
|
||
CurrentUserClass := Sub;
|
||
end;
|
||
end;
|
||
fToolInfo := aToolInfo;
|
||
fToolIdx := aToolIndex;
|
||
fToolData := aToolData;
|
||
case fToolIdx of
|
||
toSelect : SetCursor(crDefault);
|
||
toZoom,toDetailZoom : SetCursor(crZoom);
|
||
toLocate:SetCursor(crLocate);
|
||
toDelete:SetCursor(crDelete);
|
||
toMWAnd:SetCursor(crUpArrow);
|
||
else SetCursor(crCross);
|
||
end;
|
||
SyncEnv;
|
||
end;
|
||
// Tolik 14/04/2021 --
|
||
function TPCDrawBox.CheckGuideLine(x, y: Double): Boolean;
|
||
var g : TGuideLine;
|
||
gx,gy,z : Double;
|
||
a : Integer;
|
||
Begin
|
||
result := False;
|
||
|
||
if TF_CAD(parent).FCreateObjectOnClick then
|
||
exit;
|
||
|
||
if not GuidesVisible then // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
exit;
|
||
|
||
z := 0;
|
||
Convertxy(x,y,z);
|
||
try
|
||
For a := 0 to Guides.Count -1 do
|
||
begin
|
||
g := TGuideLine(Guides[a]);
|
||
|
||
if ((not g.fautoCr) or GShowAutoCreatedGuides) then // <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
begin
|
||
gx := g.coord;
|
||
gy := g.coord;
|
||
z := 0;
|
||
ConvertXY(gx,gy,z);
|
||
|
||
if (g.gType = gtHorz) and (abs(y-gy) < 3) then
|
||
begin
|
||
GuideYold := Round(gy);
|
||
BeginHRulerDrag;
|
||
Guides.Remove(g);
|
||
|
||
GAutoCreatedGuide := g.fautoCr;
|
||
|
||
g.Free;
|
||
result := true;
|
||
exit;
|
||
end;
|
||
if (g.gType = gtVert) and (abs(x - gx) < 3) then
|
||
begin
|
||
GuideXold := Round(gx);
|
||
BeginVRulerDrag;
|
||
Guides.Remove(g);
|
||
|
||
GAutoCreatedGuide := g.fautoCr;
|
||
|
||
g.Free;
|
||
result := true;
|
||
exit;
|
||
end;
|
||
end;
|
||
end;
|
||
except
|
||
// on E: Exception do AddExceptionToLog(CPowerCadMessage + 'TPCDrawBox.CheckGuideLine' + E.Message);
|
||
end;
|
||
end;
|
||
(*
|
||
function TPCDrawBox.CheckGuideLine(x, y: Double): Boolean;
|
||
var g : TGuideLine;
|
||
gx,gy,z : Double;
|
||
a : Integer;
|
||
Begin
|
||
result := False;
|
||
|
||
if TF_CAD(parent).FCreateObjectOnClick then
|
||
exit;
|
||
|
||
z := 0;
|
||
Convertxy(x,y,z);
|
||
try
|
||
For a := 0 to Guides.Count -1 do
|
||
begin
|
||
g := TGuideLine(Guides[a]);
|
||
gx := g.coord;
|
||
gy := g.coord;
|
||
z := 0;
|
||
ConvertXY(gx,gy,z);
|
||
|
||
if (g.gType = gtHorz) and (abs(y-gy) < 3) then
|
||
begin
|
||
GuideYold := Round(gy);
|
||
BeginHRulerDrag;
|
||
Guides.Remove(g);
|
||
g.Free;
|
||
result := true;
|
||
exit;
|
||
end;
|
||
if (g.gType = gtVert) and (abs(x - gx) < 3) then
|
||
begin
|
||
GuideXold := Round(gx);
|
||
BeginVRulerDrag;
|
||
Guides.Remove(g);
|
||
g.Free;
|
||
result := true;
|
||
exit;
|
||
end;
|
||
end;
|
||
except
|
||
// on E: Exception do AddExceptionToLog(CPowerCadMessage + 'TPCDrawBox.CheckGuideLine' + E.Message);
|
||
end;
|
||
end;
|
||
*)
|
||
|
||
procedure TPCDrawBox.setPageColor(Value: TColor);
|
||
begin
|
||
FPageColor := Value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
evPageColor.RaiseEvent(Value);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
destructor TPCDrawBox.Destroy;
|
||
begin
|
||
// Tolik
|
||
if Self.rVRgn <> 0 then
|
||
DeleteObject(Self.rVRgn);
|
||
if Self.HsRgn <> 0 then
|
||
DeleteObject(Self.HsRgn);
|
||
if Self.rHRgn <> 0 then
|
||
DeleteObject(Self.rHRgn);
|
||
if Self.VsRgn <> 0 then
|
||
DeleteObject(Self.VsRgn);
|
||
if Self.TempBitmap <> nil then
|
||
begin
|
||
// TempBitmap.FreeImage;
|
||
FreeAndNil(TempBitmap);
|
||
end;
|
||
if Self.BaseBitmap <> nil then
|
||
//Self.BaseBitmap.FreeImage;
|
||
FreeAndNil(BaseBitmap);
|
||
|
||
//
|
||
ClearGuides;
|
||
Guides.Free;
|
||
GuidesCreatedOnDropCompon.Free;
|
||
DEngine.Free;
|
||
//Tolik
|
||
{ Container.OnResize := nil;
|
||
Surface.Visible := False;
|
||
Surface.Parent := nil;
|
||
Surface.OnPaint := nil;
|
||
Surface.OnMouseMove := nil;
|
||
|
||
Surface.OnClick := nil;
|
||
Surface.OnDblClick := nil;
|
||
Surface.OnMouseLeave := nil;
|
||
Surface.OnDragDrop := nil;
|
||
Surface.OnEndDrag := nil;
|
||
Surface.OnDragOver := nil;
|
||
Surface.OnStartDrag := nil;
|
||
Surface.OnMouseUp := nil;
|
||
Surface.OnMouseDown := nil;
|
||
Surface.OnMouseWheel := nil;
|
||
Surface.OnMiddleDblClick := nil;
|
||
FreeAndNil(Surface);}
|
||
//
|
||
inherited destroy;
|
||
end;
|
||
|
||
function TPCDrawBox.GetSelectionRect: TDoubleRect;
|
||
begin
|
||
//***
|
||
end;
|
||
|
||
function TPCDrawBox.GetDrawingRect: TDoubleRect;
|
||
begin
|
||
//***
|
||
end;
|
||
|
||
|
||
procedure TPCDrawBox.SetCursor(cr: TCursor);
|
||
begin
|
||
Surface.Cursor := cr;
|
||
if assigned(FCursorChange) then FCursorChange(Self,cr);
|
||
end;
|
||
|
||
|
||
function TPCDrawBox.SurfaceHeight: Integer;
|
||
var wndRect:Trect;
|
||
begin
|
||
if CustomWnd <> 0 then
|
||
begin
|
||
if Windows.GetWindowRect(CustomWnd,wndRect) then
|
||
Result := Abs(wndRect.top-wndrect.bottom)-FSurfaceMargin
|
||
else
|
||
Result := 300;
|
||
end
|
||
else
|
||
begin
|
||
result:= Surface.Height;
|
||
end;
|
||
end;
|
||
|
||
function TPCDrawBox.SurfaceWidth: Integer;
|
||
var wndRect:Trect;
|
||
begin
|
||
if CustomWnd <> 0 then
|
||
begin
|
||
if Windows.GetWindowRect(CustomWnd,wndRect) then
|
||
Result := Abs(wndRect.left-wndrect.right)-FSurfaceMargin
|
||
else
|
||
result := 300;
|
||
end
|
||
else
|
||
begin
|
||
result:= Surface.Width;
|
||
end;
|
||
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetScrollPositions(hPos, vPos: Integer);
|
||
begin
|
||
scHorzPos := hPos;
|
||
scVertPos := vPos;
|
||
ScHorzPos := hPos;
|
||
ScVertPos := vPos;
|
||
if FResetRegionsOnZoomScroll then //07.08.2012
|
||
ResetRegions;
|
||
if autorefresh then
|
||
DoSurfacePaint(Surface);
|
||
end;
|
||
|
||
function TPCDrawBox.HSCBarPosition: Integer;
|
||
begin
|
||
result := scHorzPos;
|
||
end;
|
||
|
||
function TPCDrawBox.VSCBarPosition: Integer;
|
||
begin
|
||
result := scVertPos;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DrawGuideOnSurface(x,y:Integer;guType:TGuideType; needDraw: boolean = True);
|
||
var xCanvas:TCanvas;
|
||
|
||
begin
|
||
if (needDraw or GShowAutoCreatedGuides) then
|
||
begin
|
||
xCanvas:= GetActiveCanvas;
|
||
ClipToUnScrollRegion;
|
||
with xCanvas do
|
||
begin
|
||
Pen.Mode := pmXor;
|
||
Pen.Style := psSolid;
|
||
pen.Color := FBackGround xor FGuideColor;
|
||
Brush.Style := bsClear;
|
||
if guType = gtHorz then
|
||
begin
|
||
if abs(guideYold - Y)> 3 then
|
||
begin
|
||
MoveTo(0,guideYold);
|
||
LineTo(SurfaceWidth,guideYold);
|
||
MoveTo(0,Y);
|
||
LineTo(SurfaceWidth,Y);
|
||
guideYold := y;
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
if abs(guideXold - X) > 3 then
|
||
begin
|
||
MoveTo(guideXold,0);
|
||
LineTo(guideXold,SurfaceHeight);
|
||
MoveTo(X,0);
|
||
LineTo(X,SurfaceHeight);
|
||
guideXold := x;
|
||
end;
|
||
end;
|
||
end;
|
||
UnClip;
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfaceClick;
|
||
begin
|
||
SurfaceClick(nil);
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfaceDblClick;
|
||
begin
|
||
SurfaceDblClick(nil);
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfaceDragDrop(Source, X, Y: Integer);
|
||
var guType: TGuideType;
|
||
GuideX,GuideY: Double;
|
||
xd,yd,z: double;
|
||
Dist: Integer;
|
||
Begin
|
||
xd := x;
|
||
yd := y;
|
||
z := 0;
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
If assigned(SOnDropDrag) then SOnDropDrag(Self,nil,Xd,Yd);
|
||
MSDropDrag(Self,Source, Xd, Yd);
|
||
DragState := 0;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfaceDragEnd(X, Y: Integer);
|
||
begin
|
||
SurfaceDragEnd(nil,nil,x,y);
|
||
DragState := 0;
|
||
end;
|
||
Procedure TPCDrawBox.DoSurfaceDragStart(Sender: TObject;var DragObject: TDragObject);
|
||
begin
|
||
SurfaceDragStart(Sender,DragObject);
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfaceDragOver(Source, X, Y, State: Integer;
|
||
var Accept: Boolean);
|
||
var xd,yd,z: Double;
|
||
guType:TGuideType;
|
||
dist: Integer;
|
||
xCanvas: TCanvas;
|
||
Begin
|
||
if (source = oleDS_Surface) then
|
||
begin
|
||
Accept := True;
|
||
if DragState = dsHScroll then
|
||
begin
|
||
Dist := x-round(DragStartXInt);
|
||
SetHScrollDelta(Dist,False);
|
||
xCanvas:=GetActiveCanvas;
|
||
DrawScrollsToCanvas(xCanvas,True,True,False);
|
||
exit;
|
||
end
|
||
else
|
||
if DragState = dsVScroll then
|
||
begin
|
||
Dist := y-round(DragStartYInt);
|
||
SetVScrollDelta(Dist,False);
|
||
xCanvas:=GetActiveCanvas;
|
||
DrawScrollsToCanvas(xCanvas,True,False,True);
|
||
exit;
|
||
end
|
||
else
|
||
if DragState = dsPan then
|
||
begin
|
||
Dist := x-round(DragStartXInt);
|
||
SetHScrollDelta(Dist,False);
|
||
Dist := y-round(DragStartYInt);
|
||
SetVScrollDelta(Dist,False);
|
||
xCanvas:=GetActiveCanvas;
|
||
DrawScrollsToCanvas(xCanvas,True,False,True);
|
||
exit;
|
||
end
|
||
else
|
||
if DragState = dsDetPan then
|
||
begin
|
||
Dist := x-round(DragStartXInt);
|
||
FDetailLeft := FDetailLeft-dist;
|
||
Dist := y-round(DragStartYInt);
|
||
FDetailTop := FDetailTop-dist;
|
||
exit;
|
||
|
||
end
|
||
else
|
||
if DragState = dsHRuler then
|
||
begin
|
||
guType := gtHorz;
|
||
DrawGuideOnSurface(x,y,guType);
|
||
exit;
|
||
end
|
||
else
|
||
if DragState = dsVRuler then
|
||
begin
|
||
guType := gtVert;
|
||
DrawGuideOnSurface(x,y,guType);
|
||
exit;
|
||
end;
|
||
end;
|
||
|
||
SurfaceMove(nil,[],X,Y);
|
||
xd := x; yd := y; z := 0;
|
||
DeConvertXY(Xd,Yd,z);
|
||
CheckToSnap(Xd,Yd);
|
||
If assigned(SOnDragTrace) then SOnDragTrace(Self,nil,Xd,Yd,TDragState(State),Accept);
|
||
MSDragOver(Self, Source, Xd, Yd, TDragState(State), Accept);
|
||
end;
|
||
|
||
procedure TPCDrawBox.DragStarted;
|
||
begin
|
||
isDragging := True;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfaceLeave;
|
||
begin
|
||
SurfaceLeave(nil);
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfaceMove(Shift, X, Y: Integer);
|
||
var dShift:TShiftState;
|
||
begin
|
||
dShift := OleShiftToDelphiSet(shift);
|
||
SurfaceMove(nil,dShift,x,y);
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfacePull(Button: Integer; Shift, X, Y: Integer);
|
||
begin
|
||
SurfacePull(nil,TMouseButton(Button),OleShiftToDelphiSet(shift),x,y);
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfacePush(Button, Shift, X, Y: Integer);
|
||
begin
|
||
SurfacePush(nil,TMouseButton(Button),OleShiftToDelphiSet(shift),x,y);
|
||
end;
|
||
|
||
procedure TPCDrawBox.BeginHRulerDrag;
|
||
begin
|
||
{Mityai} //D0000006303
|
||
if GuidesVisible then
|
||
DragState := dsHRuler;
|
||
SetCursor(crVSplit);
|
||
DragStarted;
|
||
KillTraceFigure;
|
||
end;
|
||
|
||
procedure TPCDrawBox.BeginVRulerDrag;
|
||
begin
|
||
{Mityai} //D0000006303
|
||
if GuidesVisible then
|
||
DragState := dsVRuler;
|
||
SetCursor(crHSplit);
|
||
DragStarted;
|
||
KillTraceFigure;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetCustomSurface(CWindow: HWnD; CDC:HDC);
|
||
begin
|
||
inherited;
|
||
DoPageLocate;
|
||
end;
|
||
|
||
function TPCDrawBox.GetBackColor: TColor;
|
||
begin
|
||
result := FBackGround;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DrawRulersToCanvas(Canvas: TCanvas);
|
||
var cPoint: TPoint;
|
||
dmm,hmm,mm,hcm,cm,dm,m,dam: extended;
|
||
steps : array [1..3] of Extended;
|
||
step : Extended;
|
||
textcounter,len,number,a,coord,text: integer;
|
||
inch : real;
|
||
factor : double;
|
||
rCanvas: TCanvas;
|
||
rH,rW:INteger;
|
||
rRect:Trect;
|
||
Hstart:Integer;
|
||
FRulerSystem: TRulerSystem;
|
||
FDpm: Double;
|
||
FRtype: TrulerType;
|
||
VStart: Integer;
|
||
clpRgn: HRGn;
|
||
begin
|
||
If not rulerVisible then exit;
|
||
rCanvas:= Canvas;
|
||
rw := SurfaceWidth;
|
||
rh := 30;
|
||
|
||
cPoint := RulerStart;
|
||
Hstart := cpoint.x;
|
||
inch := 2.54;
|
||
factor := 1;
|
||
FrulerSystem := RulerSystem;
|
||
Fdpm := DotsPerMil;
|
||
FRtype:= RulerType;
|
||
//RulerMode := 0;
|
||
//RulerMapScale:=500;
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
dmm := Fdpm / 10;
|
||
hmm := Fdpm / 2;
|
||
mm := Fdpm;
|
||
hcm := mm*5;
|
||
cm := mm*10;
|
||
dm := cm*10;
|
||
end else begin
|
||
mm := Fdpm*inch*10/16;
|
||
dmm := mm / 8;
|
||
hmm := mm / 2;
|
||
hcm := Fdpm*inch*10/2;
|
||
cm := Fdpm*inch*10;
|
||
dm := cm*10;
|
||
end;
|
||
|
||
SetBkMode(rCanvas.Handle,transparent);
|
||
rcanvas.font.name := 'Tahoma';
|
||
rcanvas.font.size := 7;
|
||
rcanvas.Font.Color := clBlack;
|
||
rCanvas.Font.Style := [];
|
||
rCanvas.Brush.Color := FRulerColor;
|
||
rCanvas.Brush.Style := bsSolid;
|
||
rCanvas.FillRect(Rect(0,0,rw,rh));
|
||
rCanvas.Brush.Style := bsClear;
|
||
|
||
rCanvas.Pen.Color := clBlack;
|
||
rCanvas.Pen.Width := 1;
|
||
rCanvas.Pen.Style := psSolid;
|
||
rCanvas.Pen.Mode:= pmCopy;
|
||
|
||
rCanvas.MoveTo(30,rh);
|
||
//Tolik 08/09/2021 -- commented Line draw
|
||
//rCanvas.LineTo(rw,rh);
|
||
//
|
||
|
||
case FRtype of
|
||
rtDeciMilim :begin
|
||
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := dmm;
|
||
steps[2] := 10;
|
||
steps[3] := 100;
|
||
factor := 1;
|
||
text := 2;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'mm');
|
||
factor := 1;
|
||
end else begin
|
||
if RulerMapScale < 500 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
Factor := RulerMapScale/10;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := RulerMapScale/1000;
|
||
end;
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := dmm;
|
||
steps[2] := 8;
|
||
steps[3] := 128;
|
||
text := 2;
|
||
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'Inch/16');
|
||
factor := 1;
|
||
end else begin
|
||
if RulerMapScale < 500 then begin
|
||
rCanvas.TextOut( 10,2,'Inch');
|
||
Factor := RulerMapScale/16;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'Feet');
|
||
Factor := RulerMapScale/(16*12);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
rtHalfMilim : begin
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := hmm;
|
||
steps[2] := 2;
|
||
steps[3] := 20;
|
||
text := 3;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := RulerMapScale/100;
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := hmm;
|
||
steps[2] := 2;
|
||
steps[3] := 32;
|
||
factor := 1;
|
||
text := 3;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'Inch');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'Feet');
|
||
Factor := RulerMapScale/12;
|
||
end;
|
||
end;
|
||
end;
|
||
rtMilim : begin
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := mm;
|
||
steps[2] := 5;
|
||
steps[3] := 10;
|
||
text := 3;
|
||
factor := 1;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := RulerMapScale/100;
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := mm;
|
||
steps[2] := 8;
|
||
steps[3] := 16;
|
||
text := 3;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'Inch');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'Feet');
|
||
Factor := (RulerMapScale/12);
|
||
end;
|
||
end;
|
||
end;
|
||
rtHalfCMeter : begin
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := hcm;
|
||
steps[2] := 2;
|
||
steps[3] := 20;
|
||
text := 2;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := RulerMapScale/100;
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := hcm;
|
||
steps[2] := 2;
|
||
steps[3] := 20;
|
||
text := 2;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'inch');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'feet');
|
||
Factor := RulerMapScale/12;
|
||
end;
|
||
end;
|
||
end;
|
||
rtCentiMeter : begin
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := cm;
|
||
steps[2] := 10;
|
||
steps[3] := 100;
|
||
text := 2;
|
||
factor := 10;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
factor := 10;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := 10*(RulerMapScale/100);
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := cm;
|
||
steps[2] := 10;
|
||
steps[3] := 100;
|
||
text := 2;
|
||
factor := 10;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'inch');
|
||
factor := 10;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'feet');
|
||
Factor := 10*(RulerMapScale/12);
|
||
end;
|
||
end;
|
||
end;
|
||
rtDeciMeter : begin
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := dm;
|
||
steps[2] := 1;
|
||
steps[3] := 10;
|
||
text := 2;
|
||
factor := 10;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
factor := 10;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := 10*(RulerMapScale/100);
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := dm;
|
||
steps[2] := 1;
|
||
steps[3] := 10;
|
||
text := 2;
|
||
factor := 10;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'inch');
|
||
factor := 10;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'feet');
|
||
Factor := 10*(RulerMapScale/12);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
SelectClipRgn(rcanvas.Handle,0);
|
||
clpRgn := CreateRectRgn(30,0,rw,rh);
|
||
SelectClipRgn(rcanvas.Handle,clpRgn);
|
||
|
||
if RHRgn <> 0 then DeleteObject(RHRgn);
|
||
RHRgn := CreateRectRgn(30,0,rw,rh);
|
||
|
||
step := steps[1];
|
||
textcounter := 0;
|
||
if step < 4 then exit;
|
||
|
||
|
||
number := round((rw - HStart) / step) + 1;
|
||
|
||
rcanvas.MoveTo(HStart,rh);
|
||
rcanvas.LineTo(HStart,rh-20);
|
||
rCanvas.TextOut(HStart+2,rh-20,'0');
|
||
|
||
For a := 1 to number do
|
||
begin
|
||
coord := round(Hstart + (a*step));
|
||
if (a mod round(steps[3])) = 0 then len := 20
|
||
else if (a mod round(steps[2])) = 0 then len := 10
|
||
else len := 5;
|
||
if coord > 30 then rcanvas.MoveTo(coord,rh);
|
||
if coord > 30 then rcanvas.LineTo(coord,rh-len);
|
||
if text = 1 then
|
||
begin
|
||
if coord > 30 then rCanvas.TextOut(coord+2,rh-len,floattostrf(a*factor,ffFixed,8,1));
|
||
end
|
||
else if text = 2 then
|
||
begin
|
||
if len <> 5 then
|
||
begin
|
||
inc(textcounter);
|
||
if len = 10 then len := 15;
|
||
if coord > 30 then rCanvas.TextOut(coord+2,rh-len,floattostrf(textcounter*factor,ffFixed,8,1));
|
||
end;
|
||
end
|
||
else if text = 3 then
|
||
begin
|
||
if len = 20 then
|
||
begin
|
||
inc(textcounter);
|
||
if coord > 30 then rCanvas.TextOut(coord+2,rh-len,floattostrf(textcounter*factor,ffFixed,8,1));
|
||
end;
|
||
end;
|
||
end;
|
||
TextCOunter := 0;
|
||
if HStart > 30 then begin
|
||
number := round(HStart / step) + 1;
|
||
For a := 1 to number do
|
||
begin
|
||
coord := round(Hstart - (a*step));
|
||
if (a mod round(steps[3])) = 0 then len := 20
|
||
else if (a mod round(steps[2])) = 0 then len := 10
|
||
else len := 5;
|
||
|
||
if coord > 30 then rcanvas.MoveTo(coord,rh);
|
||
if coord > 30 then rcanvas.LineTo(coord,rh-len);
|
||
if text = 1 then
|
||
begin
|
||
if coord > 30 then rCanvas.TextOut(coord+2,rh-len,floattostrf(a*factor,ffFixed,8,1));
|
||
end
|
||
else if text = 2 then
|
||
begin
|
||
if len <> 5 then
|
||
begin
|
||
inc(textcounter);
|
||
if len = 10 then len := 15;
|
||
if coord > 30 then rCanvas.TextOut(coord+2,rh-len,floattostrf(textcounter*factor,ffFixed,8,1));
|
||
end;
|
||
end
|
||
else if text = 3 then
|
||
begin
|
||
if len = 20 then
|
||
begin
|
||
inc(textcounter);
|
||
if coord > 30 then rCanvas.TextOut(coord+2,rh-len,floattostrf(textcounter*factor,ffFixed,8,1));
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
rw := 30;
|
||
rh := SurfaceHeight;
|
||
|
||
SelectClipRgn(rcanvas.Handle,0);
|
||
DeleteObJect(clpRgn);
|
||
clpRgn := CreateRectRgn(0,30,rw+1,rh);
|
||
SelectClipRgn(rcanvas.Handle,clpRgn);
|
||
|
||
if RVRgn <> 0 then DeleteObject(RVRgn);
|
||
RVRgn := CreateRectRgn(0,30,rw+1,rh);
|
||
|
||
SetBkMode(rCanvas.Handle,transparent);
|
||
rcanvas.font.name := 'Tahoma';
|
||
rcanvas.font.size := 7;
|
||
rcanvas.Font.Color := clBlack;
|
||
rCanvas.Font.Style := [];
|
||
rCanvas.Brush.Color := FRulerColor;
|
||
rCanvas.Brush.Style := bsSolid;
|
||
rCanvas.FillRect(Rect(0,30,rw,rh));
|
||
rCanvas.Brush.Style := bsClear;
|
||
rCanvas.Pen.Color := clBlack;
|
||
rCanvas.MoveTo(rw,30);
|
||
//Tolik 08/09/2021 -- commented Line draw
|
||
//rCanvas.LineTo(rw,rh);
|
||
//
|
||
|
||
factor := 1;
|
||
Vstart := cpoint.y;
|
||
inch := 2.54;
|
||
|
||
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
dmm := Fdpm / 10;
|
||
hmm := Fdpm / 2;
|
||
mm := Fdpm;
|
||
hcm := mm*5;
|
||
cm := mm*10;
|
||
dm := cm*10;
|
||
end else begin
|
||
mm := Fdpm*inch*10/16;
|
||
dmm := mm / 8;
|
||
hmm := mm / 2;
|
||
hcm := Fdpm*inch*10/2;
|
||
cm := Fdpm*inch*10;
|
||
dm := cm*10;
|
||
end;
|
||
|
||
case FRtype of
|
||
rtDeciMilim :begin
|
||
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := dmm;
|
||
steps[2] := 10;
|
||
steps[3] := 100;
|
||
factor := 1;
|
||
text := 2;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'mm');
|
||
factor := 1;
|
||
end else begin
|
||
if RulerMapScale < 500 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
Factor := RulerMapScale/10;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := RulerMapScale/1000;
|
||
end;
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := dmm;
|
||
steps[2] := 8;
|
||
steps[3] := 128;
|
||
text := 2;
|
||
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'Inch/16');
|
||
factor := 1;
|
||
end else begin
|
||
if RulerMapScale < 500 then begin
|
||
rCanvas.TextOut( 10,2,'Inch');
|
||
Factor := RulerMapScale/16;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'Feet');
|
||
Factor := RulerMapScale/(16*12);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
rtHalfMilim : begin
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := hmm;
|
||
steps[2] := 2;
|
||
steps[3] := 20;
|
||
text := 3;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := RulerMapScale/100;
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := hmm;
|
||
steps[2] := 2;
|
||
steps[3] := 32;
|
||
factor := 1;
|
||
text := 3;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'Inch');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'Feet');
|
||
Factor := RulerMapScale/12;
|
||
end;
|
||
end;
|
||
end;
|
||
rtMilim : begin
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := mm;
|
||
steps[2] := 5;
|
||
steps[3] := 10;
|
||
text := 3;
|
||
factor := 1;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := RulerMapScale/100;
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := mm;
|
||
steps[2] := 8;
|
||
steps[3] := 16;
|
||
text := 3;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'Inch');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'Feet');
|
||
Factor := (RulerMapScale/12);
|
||
end;
|
||
end;
|
||
end;
|
||
rtHalfCMeter : begin
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := hcm;
|
||
steps[2] := 2;
|
||
steps[3] := 20;
|
||
text := 2;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := RulerMapScale/100;
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := hcm;
|
||
steps[2] := 2;
|
||
steps[3] := 20;
|
||
text := 2;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'inch');
|
||
factor := 1;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'feet');
|
||
Factor := RulerMapScale/12;
|
||
end;
|
||
end;
|
||
end;
|
||
rtCentiMeter : begin
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := cm;
|
||
steps[2] := 10;
|
||
steps[3] := 100;
|
||
text := 2;
|
||
factor := 10;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
factor := 10;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := 10*(RulerMapScale/100);
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := cm;
|
||
steps[2] := 10;
|
||
steps[3] := 100;
|
||
text := 2;
|
||
factor := 10;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'inch');
|
||
factor := 10;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'feet');
|
||
Factor := 10*(RulerMapScale/12);
|
||
end;
|
||
end;
|
||
end;
|
||
rtDeciMeter : begin
|
||
if FRulerSystem = rsMetric then
|
||
begin
|
||
steps[1] := dm;
|
||
steps[2] := 1;
|
||
steps[3] := 10;
|
||
text := 2;
|
||
factor := 10;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'cm');
|
||
factor := 10;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'M');
|
||
Factor := 10*(RulerMapScale/100);
|
||
end;
|
||
|
||
end else begin
|
||
steps[1] := dm;
|
||
steps[2] := 1;
|
||
steps[3] := 10;
|
||
text := 2;
|
||
factor := 10;
|
||
if RulerMode = 0 then begin
|
||
rCanvas.TextOut( 10,2,'inch');
|
||
factor := 10;
|
||
end else begin
|
||
rCanvas.TextOut( 10,2,'feet');
|
||
Factor := 10*(RulerMapScale/12);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
|
||
step := steps[1];
|
||
if step < 4 then exit;
|
||
|
||
number := round((VStart) / step) + 1;
|
||
|
||
rcanvas.MoveTo(rw,VStart);
|
||
Rcanvas.LineTo(rw-20,VStart);
|
||
TextCounter := 0;
|
||
RCanvas.TextOut(rw-20,Vstart+2,'0');
|
||
For a := 1 to number do
|
||
begin
|
||
coord := round(Vstart - (a*step));
|
||
if (a mod round(steps[3])) = 0 then len := 20
|
||
else if (a mod round(steps[2])) = 0 then len := 10
|
||
else len := 5;
|
||
rcanvas.MoveTo(rw,coord);
|
||
rcanvas.LineTo(rw-len,coord);
|
||
if text = 1 then
|
||
begin
|
||
rCanvas.TextOut(rw-len-2,coord+2,floattostrf(a*factor,fffixed,8,1));
|
||
end
|
||
else if text = 2 then
|
||
begin
|
||
if len <> 5 then
|
||
begin
|
||
inc(textcounter);
|
||
if len = 10 then len := 20;
|
||
rCanvas.TextOut(rw-len-2,coord+2,floattostrf(textcounter*factor,fffixed,8,1));
|
||
end;
|
||
end
|
||
else if text = 3 then
|
||
begin
|
||
if len = 20 then
|
||
begin
|
||
inc(textcounter);
|
||
rCanvas.TextOut(rw-len-2,coord+2,floattostrf(textcounter*factor,fffixed,8,1));
|
||
end;
|
||
end;
|
||
|
||
end;
|
||
TextCounter := 0;
|
||
if VStart < rh then begin
|
||
number := round( (rh - VStart) / step) + 1;
|
||
For a := 1 to number do
|
||
begin
|
||
coord := round(Vstart + (a*step));
|
||
if (a mod round(steps[3])) = 0 then len := 20
|
||
else if (a mod round(steps[2])) = 0 then len := 10
|
||
else len := 5;
|
||
rcanvas.MoveTo(rw,coord);
|
||
rcanvas.LineTo(rw-len,coord);
|
||
if text = 1 then
|
||
begin
|
||
rCanvas.TextOut(rw-len-2,coord+2,floattostrf(a*factor,fffixed,8,1));
|
||
end
|
||
else if text = 2 then
|
||
begin
|
||
if len <> 5 then
|
||
begin
|
||
inc(textcounter);
|
||
if len = 10 then len := 20;
|
||
rCanvas.TextOut(rw-len-2,coord+2,floattostrf(textcounter*factor,fffixed,8,1));
|
||
end;
|
||
end
|
||
else if text = 3 then
|
||
begin
|
||
if len = 20 then
|
||
begin
|
||
inc(textcounter);
|
||
rCanvas.TextOut(rw-len-2,coord+2,floattostrf(textcounter*factor,fffixed,8,1));
|
||
end;
|
||
end;
|
||
|
||
end;
|
||
end;
|
||
|
||
SelectClipRgn(rcanvas.Handle,0);
|
||
DeleteObJect(clpRgn);
|
||
|
||
|
||
end;
|
||
|
||
procedure TPCDrawBox.ReLocate;
|
||
begin
|
||
DoPageLocate;
|
||
DrawGuideTrace(-25000,-25000);
|
||
end;
|
||
|
||
procedure TPCDrawBox.DrawScrollsToCanvas(Canvas: TCanvas; DoubleBuffered: Boolean; hpressed, vpressed: Boolean);
|
||
var
|
||
edge, sWidth, sHeight, pWidth, pHeight, pos: Integer;
|
||
i: Integer;
|
||
sRect: Trect;
|
||
temp: Tbitmap;
|
||
xCanvas: TCanvas;
|
||
hRect,vRect: TRect;
|
||
begin
|
||
Exit;
|
||
if hsRgn <> 0 then
|
||
deleteObject(hsRgn);
|
||
if vsRgn <> 0 then
|
||
deleteObject(vsRgn);
|
||
hsRgn := 0;
|
||
vsRgn := 0;
|
||
if not DrawBars then
|
||
exit;
|
||
if DoubleBuffered then
|
||
begin
|
||
Temp := Tbitmap.Create;
|
||
xCanvas := Temp.Canvas;
|
||
end
|
||
else
|
||
xCanvas := canvas;
|
||
|
||
xCanvas.Brush.Color := clWhite;
|
||
xcanvas.Brush.Style := bsSolid;
|
||
xcanvas.Pen.Color := clBlack;
|
||
xCanvas.Pen.Mode := pmCopy;
|
||
xCanvas.Pen.Style := psSolid;
|
||
edge := 15;
|
||
if HorzBarVisible and (scHorzMax > 0) then
|
||
begin
|
||
sHeight := edge;
|
||
if vertbarvisible then
|
||
sWidth := SurfaceWidth - sHeight + 1
|
||
else
|
||
sWidth := SurfaceWidth;
|
||
scHorzWidth := sWidth;
|
||
pWidth := Round(sWidth * (ScHorzPage / ScHorzMax)) - 1;
|
||
pos := Round(sWidth * (scHorzPos / scHorzMax));
|
||
|
||
xCanvas.Brush.Color := clBtnFace;
|
||
xCanvas.Pen.Color := clGray;
|
||
|
||
if DoubleBuffered then
|
||
begin
|
||
hRect := Rect(0, 0, sWidth, sHeight);
|
||
Temp.Height := sHeight;
|
||
Temp.Width := SWidth;
|
||
end
|
||
else
|
||
begin
|
||
hRect := Rect(0, SurfaceHeight - sHeight, sWidth, SurfaceHeight);
|
||
end;
|
||
xcanvas.Rectangle(hRect);
|
||
|
||
xCanvas.Brush.Color := clBtnFace;
|
||
if DoubleBuffered then
|
||
begin
|
||
hRect := Rect(pos, 0, pos + pWidth, sHeight);
|
||
end
|
||
else
|
||
begin
|
||
hRect := Rect(pos, SurfaceHeight - sHeight, pos + pWidth, SurfaceHeight);
|
||
end;
|
||
xcanvas.Rectangle(hRect);
|
||
if hpressed then
|
||
DrawEdge(xCanvas.Handle, hRect, EDGE_SUNKEN, BF_RECT)
|
||
else
|
||
DrawEdge(xCanvas.Handle, hRect, EDGE_RAISED, BF_RECT);
|
||
hsRgn := CreateRectRgn(hRect.left, hRect.Top, hRect.right, hRect.Bottom);
|
||
if DoubleBuffered then
|
||
Canvas.Draw(0, SurfaceHeight - sHeight, temp);
|
||
end;
|
||
if VertBarVisible and (scVertmax > 0) then
|
||
begin
|
||
sWidth := edge;
|
||
if horzbarvisible then
|
||
sHeight := SurfaceHeight - sWidth + 1
|
||
else
|
||
sHeight := SurfaceHeight;
|
||
scVertHeight := sHeight;
|
||
pHeight := Round(sHeight * (ScVertPage / ScVertMax)) - 1;
|
||
pos := Round(sHeight * (scVertPos / scVertMax));
|
||
xCanvas.Pen.Color := clGray;
|
||
xCanvas.Brush.Color := clBtnFace;
|
||
if DoubleBuffered then
|
||
begin
|
||
vRect := Rect(0, 0, sWidth, sHeight);
|
||
Temp.Height := sHeight;
|
||
Temp.Width := SWidth;
|
||
end
|
||
else
|
||
begin
|
||
vRect := Rect(SurfaceWidth - sWidth, 0, SurfaceWidth, SHeight);
|
||
end;
|
||
xcanvas.Rectangle(vRect);
|
||
|
||
if DoubleBuffered then
|
||
begin
|
||
vRect := Rect(0, pos, sWidth, pos + pHeight);
|
||
Temp.Height := sHeight;
|
||
Temp.Width := SWidth;
|
||
end
|
||
else
|
||
begin
|
||
vRect := Rect(SurfaceWidth - sWidth, pos, SurfaceWidth, pos + pHeight);
|
||
end;
|
||
xcanvas.Rectangle(vRect);
|
||
if vpressed then
|
||
DrawEdge(xCanvas.Handle, vRect, EDGE_SUNKEN, BF_RECT)
|
||
else
|
||
DrawEdge(xCanvas.Handle, vRect, EDGE_RAISED, BF_RECT);
|
||
|
||
vsRgn := CreateRectRgn(vRect.Left, vRect.Top, vRect.Right, vRect.Bottom);
|
||
if DoubleBuffered then
|
||
Canvas.Draw(SurfaceWidth - sWidth, 0, temp);
|
||
end;
|
||
|
||
if HorzbarVisible and VertbarVisible then
|
||
begin
|
||
if DoubleBuffered then
|
||
begin
|
||
Temp.Height := edge;
|
||
Temp.Width := edge;
|
||
hRect := Rect(0, 0, edge, edge);
|
||
end
|
||
else
|
||
begin
|
||
hRect := Rect(SurfaceWidth - edge, SurfaceHeight - edge, SurfaceWidth, SurfaceHeight);
|
||
end;
|
||
xCanvas.Pen.Color := clGray;
|
||
xCanvas.Brush.Color := clBtnFace;
|
||
xcanvas.Rectangle(hRect);
|
||
if DoubleBuffered then
|
||
Canvas.Draw(SurfaceWidth - edge, SurfaceHeight - edge, temp);
|
||
end;
|
||
if DoubleBuffered then
|
||
begin
|
||
//Tolik
|
||
Temp.FreeImage;
|
||
//
|
||
Temp.Free;
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetScrolls(SHorzMAx, SVertMax, SHorzPos, SVertPos,
|
||
SHorzPage, SVertPage: Integer);
|
||
begin
|
||
if assigned(FScrollValues) then FScrollValues(Self,SHorzMAx,SVertMax,SHorzPos,
|
||
SVertPos,SHorzPage,SVertPage,round(5 * DotsPerMil),round(20 * DotsPerMil));
|
||
ScHorzMAx := SHorzMAx;
|
||
ScVertMax := SVertMax;
|
||
ScHorzPos := SHorzPos;
|
||
ScVertPos := SVertPos;
|
||
ScHorzPage := SHorzPage;
|
||
ScVertPage := SVertPage;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetHScrollPosition(hPos: Integer; Update:Boolean);
|
||
begin
|
||
if HPos > (scHorzMax - scHorzPage) then
|
||
HPos := (scHorzMax - scHorzPage);
|
||
if hPos < 0 then
|
||
hpos := 0;
|
||
ScHorzPos := hPos;
|
||
if Update then
|
||
begin
|
||
if FResetRegionsOnZoomScroll then //07.08.2012
|
||
ResetRegions;
|
||
if autorefresh then
|
||
DoSurfacePaint(Surface);
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetVScrollPosition(vPos: Integer;Update:Boolean);
|
||
begin
|
||
if vPos > (scVertMax - scVertPage) then
|
||
vPos := (scVertMax - scVertPage);
|
||
if vPos < 0 then
|
||
vPos := 0;
|
||
ScVertPos := vPos;
|
||
if Update then
|
||
begin
|
||
if FResetRegionsOnZoomScroll then //07.08.2012
|
||
ResetRegions;
|
||
if autorefresh then
|
||
DoSurfacePaint(Surface);
|
||
end;
|
||
end;
|
||
|
||
function TPCDrawBox.PointInHRuler(x, y: Double): Boolean;
|
||
begin
|
||
result := false;
|
||
{Mityai} //D0000006303
|
||
if (RulerVisible)and(GuidesVisible) then
|
||
result := PtInRegion(rHrgn,Round(x),Round(y));
|
||
end;
|
||
|
||
function TPCDrawBox.PointInHScroll(x, y: Double): Boolean;
|
||
begin
|
||
result := false;
|
||
result := PtInRegion(hsrgn,Round(x),Round(y));
|
||
end;
|
||
|
||
function TPCDrawBox.PointInVRuler(x, y: Double): Boolean;
|
||
begin
|
||
result := false;
|
||
{Mityai} //D0000006303
|
||
if (RulerVisible)and(GuidesVisible) then
|
||
result := PtInRegion(rVrgn,Round(x),Round(y));
|
||
end;
|
||
|
||
function TPCDrawBox.PointInVScroll(x, y: Double): Boolean;
|
||
begin
|
||
result := false;
|
||
result := PtInRegion(vsrgn,Round(x),Round(y));
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetHScrollDelta(hDelta: Double;Update: Boolean);
|
||
var sgn: Integer;
|
||
begin
|
||
if hDelta = 0 then exit;
|
||
if hdelta <0 then begin
|
||
sgn := -1;
|
||
end;
|
||
sgn := 1;
|
||
if hDelta < 0 then sgn := -1;
|
||
hDelta := round(hDelta* (scHorzMax/scHorzWidth));
|
||
if (abs(hDelta) >= 0) and (abs(hDelta) < 1) then hDelta := sgn;
|
||
SetHScrollPosition(round(oldposX)+Round(hDelta),Update);
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetVScrollDelta(hDelta: Double;Update: Boolean);
|
||
var sgn: Integer;
|
||
begin
|
||
if hDelta = 0 then exit;
|
||
sgn := 1;
|
||
if hDelta < 0 then sgn := -1;
|
||
hDelta := round(hDelta* (scVertMax/scVertHeight));
|
||
if (abs(hDelta) >= 0) and (abs(hDelta) < 1) then hDelta := sgn;
|
||
SetVScrollPosition(round(oldPosY)+Round(hDelta),Update);
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetDragCursor(cr: TCursor);
|
||
begin
|
||
Surface.DragCursor := cr;
|
||
Surface.Cursor := cr;
|
||
if assigned(FCursorChange) then FCursorChange(Self,cr);
|
||
end;
|
||
|
||
Function TPCDrawBox.CheckForGuideDrop(X, Y: Integer; autoCr: boolean = False):Boolean;
|
||
var gutype: TGuideType;
|
||
guidex: Double;
|
||
guidey,z: Double;
|
||
begin
|
||
result := false;
|
||
if (DragState = dsHRuler) or (DragState = dsVRuler) then
|
||
begin
|
||
result := true;
|
||
if DragState = dsHRuler then
|
||
guType := gtHorz
|
||
else
|
||
guType := gtVert;
|
||
|
||
GuideX := x; GuideY:= y;z :=0;
|
||
DeConvertXY(GuideX,GuideY,z);
|
||
if guType = gtHorz then
|
||
begin
|
||
Guides.Add(TGuideLine.create(gtHorz,GuideY, autoCr));
|
||
guideYold := -5000;
|
||
end
|
||
else
|
||
begin
|
||
Guides.Add(TGuideLine.create(gtVert,GuideX, autoCr));
|
||
guideXold := - 5000;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
function TPCDrawBox.GetActiveCanvas: TCanvas;
|
||
begin
|
||
if CustomSurface <> nil then result := CustomSurface else result := Surface.Canvas;
|
||
end;
|
||
|
||
procedure TPCDrawBox.ClipToActiveRegion(xCanvas:TCanvas=nil);
|
||
var x1,y1,x2,y2: Integer;
|
||
dRgn: HRGN;
|
||
begin
|
||
x1 := 0;
|
||
if RulerVisible then x1 := x1+30;
|
||
y1 := 0;
|
||
if RulerVisible then y1 := y1+30;
|
||
x2 := SurfaceWidth;
|
||
y2 := SurfaceHeight;
|
||
if HorzBarVisible and (scHorzMax > 0) then y2 := y2 - 15;
|
||
if VertBarVisible and (scVertMax > 0) then x2 := x2 - 15;
|
||
if not assigned(xCanvas) then xCanvas := GetActiveCanvas;
|
||
SelectClipRgn(xCanvas.Handle,0);
|
||
if crgn <> 0 then DeleteObject(cRgn);
|
||
cRgn := CreateRectRgn(x1,y1,x2,y2);
|
||
|
||
if FDetail then begin
|
||
dRgn := CreateRectRgn(FdetailPosX,FDetailPosY,FdetailPosX+FDetailWidth,FDetailPosY+FDetailHeight);
|
||
CombineRgn(cRgn,cRgn,dRgn,RGN_DIFF);
|
||
DeleteObject(dRgn);
|
||
end;
|
||
|
||
SelectClipRgn(xCanvas.Handle,cRgn);
|
||
Dengine.ClipRgn := crgn;
|
||
end;
|
||
|
||
|
||
procedure TPCDrawBox.unClip(xCanvas:TCanvas=nil);
|
||
begin
|
||
if not assigned(xCanvas) then xCanvas := GetActiveCanvas;
|
||
SelectClipRgn(xCanvas.Handle,0);
|
||
if crgn <> 0 then DeleteObject(cRgn);
|
||
cRgn := 0;
|
||
Dengine.ClipRgn := crgn;
|
||
end;
|
||
|
||
procedure TPCDrawBox.ClipToUnScrollRegion(xCanvas:TCanvas=nil);
|
||
var x1,y1,x2,y2: Integer;
|
||
xrgn: HRGN;
|
||
begin
|
||
x1 := 0;
|
||
y1 := 0;
|
||
x2 := SurfaceWidth;
|
||
y2 := SurfaceHeight;
|
||
if HorzBarVisible and (scHorzMax > 0) then y2 := y2 - 15;
|
||
if VertBarVisible and (scVertMax > 0) then x2 := x2 - 15;
|
||
if not assigned(xCanvas) then xCanvas := GetActiveCanvas;
|
||
SelectClipRgn(xCanvas.Handle,0);
|
||
if crgn <> 0 then DeleteObject(cRgn);
|
||
cRgn := CreateRectRgn(x1,y1,x2,y2);
|
||
xRgn := CreateRectRgn(0,0,30,30);
|
||
CombineRgn(cRgn,cRgn,xRgn,RGN_DIFF);
|
||
DeleteObject(xRgn);
|
||
SelectClipRgn(xCanvas.Handle,cRgn);
|
||
Dengine.ClipRgn := crgn;
|
||
end;
|
||
|
||
procedure TPCDrawBox.ClipToDetailRegion(xCanvas: TCanvas);
|
||
begin
|
||
if not assigned(xCanvas) then xCanvas := GetActiveCanvas;
|
||
SelectClipRgn(xCanvas.Handle,0);
|
||
if crgn <> 0 then DeleteObject(cRgn);
|
||
cRgn := CreateRectRgn(FdetailPosX,FDetailPosY,FdetailPosX+FDetailWidth,FDetailPosY+FDetailHeight);
|
||
SelectClipRgn(xCanvas.Handle,cRgn);
|
||
Dengine.ClipRgn := crgn;
|
||
end;
|
||
|
||
procedure TPCDrawBox.KillTraceFigure;
|
||
begin
|
||
// this is for killing the trace figure in TPowercad
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetEngine(xCanvas: TCanvas; CPoint,DeCPoint:ConvertXYProc;
|
||
CDim,DeCdim:ConvertDimProc;isPrinting: Boolean; prBmp: TBitmap);
|
||
Begin
|
||
DEngine.Canvas := xCanvas;
|
||
DEngine.ConvertPoint := CPoint;
|
||
DEngine.ConvertLen := CDim;
|
||
DEngine.DeConvertPoint := DeCPoint;
|
||
DEngine.DeConvertLen := DeCDim;
|
||
DEngine.isPrinting := isPrinting;
|
||
DEngine.PrintBmp := prBmp;
|
||
Dengine.Isometric := FIsometric;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.SetDefaultEngine;
|
||
begin
|
||
if CustomSurface <> nil then begin
|
||
if FIsometric then begin
|
||
SetEngine(CustomSurface,IsoConvertXY,IsoDeConvertXY,IsoConvertDim,IsoDeConvertDim,false,nil);
|
||
end else begin
|
||
SetEngine(CustomSurface,ConvertXY,DeConvertXY,ConvertDim,DeConvertDim,false,nil);
|
||
end;
|
||
end else begin
|
||
if FIsometric then begin
|
||
SetEngine(Surface.Canvas,IsoConvertXY,IsoDeConvertXY,IsoConvertDim,IsoDeConvertDim,false,nil);
|
||
end else begin
|
||
SetEngine(Surface.Canvas,ConvertXY,DeConvertXY,ConvertDim,DeConvertDim,false,nil);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetDetailEngine;
|
||
begin
|
||
if CustomSurface <> nil then begin
|
||
SetEngine(CustomSurface,DetConvertXY,DetDeConvertXY,DetConvertDim,DetDeConvertDim,false,nil);
|
||
end else begin
|
||
SetEngine(Surface.Canvas,DetConvertXY,DetDeConvertXY,DetConvertDim,DetDeConvertDim,false,nil);
|
||
end;
|
||
end;
|
||
|
||
function TPCDrawBox.DoKeyEvents(Message: TWMKey): Boolean;
|
||
var
|
||
ShiftState: TShiftState;
|
||
chCode: Word;
|
||
shift: Integer;
|
||
scan_code: Byte;
|
||
const
|
||
AltMask = $20000000;
|
||
begin
|
||
shift := 0;
|
||
scan_code := (Message.KeyData shr 16) and $FF;
|
||
if GetKeyState(VK_SHIFT) < 0 then shift := shift or oleShift;
|
||
if GetKeyState(VK_CONTROL) < 0 then shift := shift or oleCtrl;
|
||
if Message.KeyData and AltMask <> 0 then shift := shift or oleAlt;
|
||
chCode := Message.CharCode;
|
||
if ((scan_code >= 59) and (scan_code <= 68)) or (scan_code = 87) or (scan_code >= 88) then
|
||
chCode := 0;
|
||
Result := DoKeyStroke(chCode,Shift);
|
||
end;
|
||
|
||
function TPCDrawBox.DoKeyStroke(ChCode, Shift: Integer): Boolean;
|
||
begin
|
||
//***
|
||
end;
|
||
|
||
procedure TPCDrawBox.setShadow(const Value: Boolean);
|
||
begin
|
||
FShadow := Value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
end;
|
||
|
||
|
||
procedure TPCDrawBox.DragMove(x, y: Integer);
|
||
var guType:TGuideType;
|
||
dist: Integer;
|
||
xCanvas: TCanvas;
|
||
ADeltaX, ADeltaY: double;
|
||
begin
|
||
// Tolik 29/03/2017 --
|
||
if (Self.Owner = nil) then
|
||
Exit;
|
||
//
|
||
if DragState = dsHScroll then
|
||
begin
|
||
Dist := x-Round(DragStartXInt);
|
||
SetHScrollDelta(Dist,False);
|
||
xCanvas:=GetActiveCanvas;
|
||
DrawScrollsToCanvas(xCanvas,True,True,False);
|
||
end
|
||
else
|
||
if DragState = dsVScroll then
|
||
begin
|
||
Dist := y-Round(DragStartYInt);
|
||
SetVScrollDelta(Dist,False);
|
||
xCanvas:=GetActiveCanvas;
|
||
DrawScrollsToCanvas(xCanvas,True,False,True);
|
||
end
|
||
else
|
||
if DragState = dsPan then
|
||
begin
|
||
{
|
||
Dist := y-Round(DragStartYInt);
|
||
SetVScrollDelta(-Dist,False);
|
||
Dist := x-Round(DragStartXInt);
|
||
SetHScrollDelta(-Dist,False);
|
||
xCanvas:=GetActiveCanvas;
|
||
ResetRegions;
|
||
Refresh;
|
||
}
|
||
ADeltaY := (y - Round(DragStartYInt)) / ZoomScale * 25;
|
||
DragStartYInt := y;
|
||
ADeltaX := (x - Round(DragStartXInt)) / ZoomScale * 25;
|
||
DragStartXInt := x;
|
||
// Tolik 29/03/2017 --
|
||
// TF_CAD(parent).MoveCADOnPan(ADeltaX, ADeltaY);
|
||
//
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||
if Self.Owner.ClassName = 'TF_CAD' then
|
||
TF_CAD(Self.Owner).MoveCADOnPan(ADeltaX, ADeltaY)
|
||
else
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if Self.Owner.ClassName = 'TF_MasterCompl' then
|
||
TF_MasterCompl(Self.Owner).MoveCADOnPan(ADeltaX, ADeltaY)
|
||
else
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||
exit;
|
||
//
|
||
end
|
||
else
|
||
if DragState = dsDetPan then
|
||
begin
|
||
Dist := x-round(DragStartXInt);
|
||
DragStartXInt := x;
|
||
FDetailLeft := FDetailLeft-dist;
|
||
Dist := y-round(DragStartYInt);
|
||
DragStartYInt := y;
|
||
FDetailTop := FDetailTop-dist;
|
||
ResetRegions;
|
||
Refresh;
|
||
end
|
||
else
|
||
{Mityai} //D0000006303
|
||
if (DragState = dsHRuler)and(GuidesVisible) then
|
||
begin
|
||
guType := gtHorz;
|
||
DrawGuideOnSurface(x,y,guType);
|
||
end
|
||
else
|
||
{Mityai} //D0000006303
|
||
if (DragState = dsVRuler)and(GuidesVisible) then
|
||
begin
|
||
guType := gtVert;
|
||
DrawGuideOnSurface(x,y,guType);
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DragDropped(x, y: Integer);
|
||
begin
|
||
if CheckForGuideDrop(x,y) then
|
||
begin
|
||
isDragging := False;
|
||
dragState := dsNone;
|
||
Refresh;
|
||
end;
|
||
if (DragState = dsHScroll) or (DragState = dsVScroll) or (DragState = dsPan) or (DragState = dsDetPan) then
|
||
begin
|
||
ResetRegions;
|
||
dragState := dsNone;
|
||
isDragging := False;
|
||
DragReadyInt := False;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
DrawTrace;
|
||
end;
|
||
SetCursor(oldCursor);
|
||
Screen.Cursor := crDefault;
|
||
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetRulerValues(MapScale: Double; Mode: Integer);
|
||
begin
|
||
RulerMapScale := MapScale;
|
||
RulerMode := Mode;
|
||
refresh;
|
||
end;
|
||
|
||
function TPCDrawBox.GetPageRect: TRect;
|
||
begin
|
||
Result := Rect(PageLeft,PageTop,PageLeft+PageWidth,PageTop+PageHeight);
|
||
end;
|
||
|
||
procedure TPCDrawBox.setCenterGuide(const Value: Boolean);
|
||
begin
|
||
FCenterGuide := Value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
evCenterGuide.RaiseEvent(Value);
|
||
Updated := True;
|
||
SyncEnv;
|
||
end;
|
||
|
||
function TPCDrawBox.GetVisibleRect: TDoubleRect;
|
||
var SWidth,SHeight,z:Double;
|
||
p:TDoublePoint;
|
||
begin
|
||
SWidth := SurfaceWidth;
|
||
SHeight := SurfaceHeight;
|
||
p := DoublePoint(0,0);
|
||
z := 0;
|
||
DeConvertXY(p.x,p.y,z);
|
||
result.Left := p.x;
|
||
result.Top := p.y;
|
||
p := DoublePoint(SWidth,SHeight);
|
||
z := 0;
|
||
DeConvertXY(p.x,p.y,z);
|
||
result.Right := p.x;
|
||
result.Bottom := p.y;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetSurfaceMargin(Value: Integer);
|
||
begin
|
||
FsurfaceMargin := Value;
|
||
Relocate;
|
||
end;
|
||
|
||
procedure TPCDrawBox.ClearGuides;
|
||
var
|
||
i: Integer;
|
||
begin
|
||
try
|
||
for i := 0 to Guides.Count - 1 do
|
||
TGuideLine(Guides[i]).Free;
|
||
|
||
GuidesCreatedOnDropCompon.Clear;
|
||
Guides.Clear;
|
||
|
||
Refresh;
|
||
except
|
||
// on E: Exception do AddExceptionToLog(CPowerCadMessage + 'TPCDrawBox.ClearGuides' + E.Message);
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.setRulerColor(const Value: TColor);
|
||
begin
|
||
FRulerColor := Value;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.setCoordZ(const Value: Double);
|
||
begin
|
||
FCoordZ := Value;
|
||
end;
|
||
|
||
|
||
|
||
procedure TPCDrawBox.CollectFaces;
|
||
begin
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetDetail(const Value: Boolean);
|
||
begin
|
||
FDetail := Value;
|
||
CalculateDetailMargins;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.setDetailHeight(const Value: Integer);
|
||
begin
|
||
FDetailHeight := Value;
|
||
FDetailPosX := SurfaceWidth-FDetailWidth-20;
|
||
FDetailPosY := 20;
|
||
|
||
CalculateDetailMargins;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.setDetailWidth(const Value: Integer);
|
||
begin
|
||
FDetailWidth := Value;
|
||
FDetailPosX := SurfaceWidth-FDetailWidth-20;
|
||
FDetailPosY := 20;
|
||
|
||
CalculateDetailMargins;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetDetailScale(Value: Integer);
|
||
begin
|
||
if Value < 10 then Value := 10;
|
||
if Value > MaxScale then
|
||
Value := MaxScale;
|
||
FDetailScale := Value;
|
||
CalculateDetailMargins;
|
||
Refresh;
|
||
end;
|
||
|
||
|
||
procedure TPCDrawBox.CenterLocation(x,y:Double);
|
||
var xrect:TDoubleRect;
|
||
FRefresh:Boolean;
|
||
lMar: Integer;
|
||
event:TScrollValuesEvent;
|
||
Begin
|
||
FbarsLocked := True;
|
||
xRect := DoubleRect(x,y,x,y);
|
||
SetDpm(FDpmOrig * (FScale/100));
|
||
FRefresh := AutoRefresh;
|
||
AutoRefresh := False;
|
||
event := FScrollValues;
|
||
FScrollValues := nil;
|
||
DoPageLocate;
|
||
FScrollValues := event;
|
||
FbarsLocked := True;
|
||
If HorzBarVisible then begin
|
||
lmar := Round(SurfaceWidth - abs(xRect.Right-xRect.Left)*DotsPermil) div 2;
|
||
if HorizontalZero = vzRight then
|
||
scHorzPos := round(((FWorkWidth-xRect.right))*DotsPerMil-lmar)
|
||
else
|
||
scHorzPos := round((xRect.Left)*DotsPerMil-lmar);
|
||
end;
|
||
If VertBarVisible then begin
|
||
lmar := Round(SurfaceHeight - abs(xRect.Top-xRect.Bottom)*DotsPermil) div 2;
|
||
if VerticalZero = vzBottom then
|
||
scVertPos := round(((FWorkHeight - xRect.Top))*DotsPerMil-lmar)
|
||
else
|
||
scVertPos := round(((xRect.Bottom))*DotsPerMil-lmar);
|
||
end;
|
||
|
||
AutoRefresh := Frefresh;;
|
||
if AutoRefresh then DoSurfacePaint(Surface);
|
||
If assigned(SOnScale) then SOnScale(self);
|
||
SyncEnv;
|
||
FbarsLocked := False;
|
||
end;
|
||
|
||
function TPCDrawBox.PointInView(x, y: Double): Boolean;
|
||
var vrect: TDoubleRect;
|
||
pt : TPoint;
|
||
irect: Trect;
|
||
z: Double;
|
||
begin
|
||
z := 0;
|
||
ConvertXY(x,y,z);
|
||
pt := Point(round(x),round(y));
|
||
vrect := GetVisibleRect;
|
||
ConvertXY(vrect.left,vrect.top,z);
|
||
ConvertXY(vrect.right,vrect.bottom,z);
|
||
irect := Rect(round(vrect.left),round(vrect.top),round(vrect.Right),round(vrect.Bottom));
|
||
result := ptInrect(irect,pt);
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetRulerSytem(const Value: TRulerSystem);
|
||
begin
|
||
if Value <> FrulerSystem then begin
|
||
if FrulerSystem = rsMetric then begin
|
||
GridStep := (GridStep/10)*8;
|
||
end else begin
|
||
GridStep := (GridStep/8)*10;
|
||
end;
|
||
end;
|
||
FRulerSystem := Value;
|
||
Refresh;
|
||
evRulerSys.RaiseEvent(ord(Value));
|
||
end;
|
||
|
||
procedure TPCDrawBox.DetConvertDim(var Dim: double);
|
||
begin
|
||
Dim := Round(Dim * DotsPerMilOrig * (FDetailScale/100));
|
||
end;
|
||
|
||
procedure TPCDrawBox.DetConvertXY(var X, Y,Z: double);
|
||
var dx,dy: Double;
|
||
p: TDoublePOint;
|
||
begin
|
||
|
||
if HorizontalZero = vzRight then x :=WorkWidth-x;
|
||
if VerticalZero = vzBottom then y :=WorkHeight-y;
|
||
if FDetailStyle = dsIsometry then
|
||
begin
|
||
p := Doublepoint(x,y,z);
|
||
p := ConvertIsometricPoint(p,FWorkHeight,isoAngle,isoType);
|
||
x := p.x-FDetMarX;
|
||
y := p.y-FDetMarY;
|
||
end;
|
||
|
||
dx := x-FDetailLeft;
|
||
dy := y-FDetailTop;
|
||
DetConvertDim(dx);
|
||
DetConvertDim(dy);
|
||
x := FDetailPosX+dx;
|
||
y := FdetailPosY+dy;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DetDeConvertDim(var Dim: Double);
|
||
begin
|
||
Dim := Dim / (DotsPerMilOrig * (FDetailScale/100));
|
||
end;
|
||
|
||
procedure TPCDrawBox.DetDeConvertXY(var X, Y,Z: Double);
|
||
var dx,dy:Double;
|
||
p: TDoublePoint;
|
||
begin
|
||
|
||
dy := y-FdetailPosY;
|
||
dx := x-FDetailPosX;
|
||
DetDeConvertDim(dx);
|
||
DetDeConvertDim(dy);
|
||
x := FDetailLeft+dx;
|
||
y := FDetailTop+dy;
|
||
if FDetailStyle = dsIsometry then
|
||
begin
|
||
x := x+FDetMarX;
|
||
y := y+FDetMarY;
|
||
p := Doublepoint(x,y,z);
|
||
p := DeConvertIsometricPoint(p,FWorkHeight,isoAngle,isoType);
|
||
x := p.x;
|
||
y := p.y;
|
||
end;
|
||
|
||
if HorizontalZero = vzRight then x :=WorkWidth-x;
|
||
if VerticalZero = vzBottom then y :=WorkHeight-y;
|
||
|
||
end;
|
||
|
||
procedure TPCDrawBox.ZoomDetailArea(ZoomRect: TDoubleRect);
|
||
var zW,zH,scw,sch,dpw,dph:Double;
|
||
begin
|
||
zw := abs(ZoomRect.Left-ZoomRect.Right);
|
||
zh := abs(Zoomrect.top-ZoomRect.bottom);
|
||
dpW := FDetailWidth/zW;
|
||
scw := 100*(dpw/DotsPermilOrig);
|
||
dpH := FDetailHeight/zH;
|
||
sch := 100*(dph/DotsPermilOrig);
|
||
if scw < sch then FDetailScale := Round(scw) else FDetailScale := Round(sch);
|
||
FDetailLeft := ZoomRect.Left;
|
||
FDetailTop := ZoomRect.Top;
|
||
if HorizontalZero = vzRight then FDetailLeft :=WorkWidth-ZoomRect.Left;
|
||
if VerticalZero = vzBottom then FDetailTop :=WorkHeight-ZoomRect.Top;
|
||
if FDetailStyle = dsIsometry then CalculateDetailMargins(True);
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.ZoomDetailPoint(ZoomCenter: TDoublePoint);
|
||
var cx,cy,cz: Double;
|
||
dw,dh: Double;
|
||
p:TDoublePoint;
|
||
begin
|
||
cx := ZoomCenter.x;
|
||
cy := ZoomCenter.y;
|
||
cz := ZoomCenter.z;
|
||
ZoomDp := ZoomCenter;
|
||
|
||
if HorizontalZero = vzRight then cx :=WorkWidth-cx;
|
||
if VerticalZero = vzBottom then cy :=WorkHeight-cy;
|
||
if FDetailStyle = dsIsometry then
|
||
begin
|
||
p := Doublepoint(cx,cy,cz);
|
||
p := ConvertIsometricPoint(p,FWorkHeight,isoAngle,isoType);
|
||
cx := p.x-FDetMarX;
|
||
cy := p.y-FDetMarY;
|
||
end;
|
||
dw := FDetailWidth/(DotsPermilOrig*(FDetailScale/100));
|
||
dh := FDetailHeight/(DotsPermilOrig*(FDetailScale/100));
|
||
FDetailLeft := cx-(dw/2);
|
||
FDetailTop := cy-(dh/2);
|
||
|
||
Refresh;
|
||
end;
|
||
|
||
|
||
function TPCDrawBox.PointInDetail(x, y: Double): Boolean;
|
||
var Drect:TDoubleRect;
|
||
begin
|
||
result := false;
|
||
if not Fdetail then exit;
|
||
if (FDetailStyle = dsIsometry) and (ToolIdx <> toSelect) then exit;
|
||
Drect := DoubleRect(SurfaceWidth-FDetailWidth-20,20,SurfaceWidth-20,FDetailHeight+20);
|
||
result := PointInRect(DoublePOint(x,y),dRect);
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetBufferEngine;
|
||
begin
|
||
if FISometric then begin
|
||
SetEngine(TempBitmap.Canvas,IsoConvertXY,IsoDeConvertXY,IsoConvertDim,IsoDeConvertDim,false,nil);
|
||
end else begin
|
||
SetEngine(TempBitmap.Canvas,ConvertXY,DeConvertXY,ConvertDim,DeConvertDim,false,nil);
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetBufferDetailEngine;
|
||
begin
|
||
SetEngine(TempBitmap.Canvas,DetConvertXY,DetDeConvertXY,DetConvertDim,DetDeConvertDim,false,nil);
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetDetailStyle(const Value: TDetailStyle);
|
||
begin
|
||
FDetailStyle := Value;
|
||
CalculateDetailMargins;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.CalculateDetailMargins(ReScale:Boolean=False);
|
||
var p1,p2,p3,p4: TDoublePoint;
|
||
z,dw,dh: Double;
|
||
x,y: Double;
|
||
minx,miny,maxX,maxY,cx,cy,mx,my,scw,sch,dpW,dpH: Double;
|
||
dRect:TDoubleRect;
|
||
begin
|
||
dw := FDetailWidth/(DotsPermilOrig*(FDetailScale/100));
|
||
dh := FDetailHeight/(DotsPermilOrig*(FDetailScale/100));
|
||
dRect := DoubleRect(FDetailLeft,FDetailTop,FDetailLeft+dw,FDetailTop+dh);
|
||
z := GetZAvg(dRect);
|
||
|
||
p1 := DoublePoint(FDetailLeft,FDetailTop,z);
|
||
p2 := DoublePoint(FDetailLeft+dw,FDetailTop,z);
|
||
p3 := DoublePoint(FDetailLeft+dw,FDetailTop+dh,z);
|
||
p4 := DoublePoint(FDetailLeft,FDetailTop+dh,z);
|
||
p1 := ConvertIsometricPoint(p1,FWorkHeight,isoAngle,isoType);
|
||
p2 := ConvertIsometricPoint(p2,FWorkHeight,isoAngle,isoType);
|
||
p3 := ConvertIsometricPoint(p3,FWorkHeight,isoAngle,isoType);
|
||
p4 := ConvertIsometricPoint(p4,FWorkHeight,isoAngle,isoType);
|
||
|
||
minX := p1.x;
|
||
minY := p1.y;
|
||
maxX := p1.x;
|
||
maxY := p1.y;
|
||
|
||
if p2.x < minX then minx := p2.x;
|
||
if p3.x < minX then minx := p3.x;
|
||
if p4.x < minX then minx := p4.x;
|
||
|
||
if p2.y < minY then minY := p2.y;
|
||
if p3.y < minY then minY := p3.y;
|
||
if p4.y < minY then minY := p4.y;
|
||
|
||
if p2.x > maxX then maxX := p2.x;
|
||
if p3.x > maxX then maxX := p3.x;
|
||
if p4.x > maxX then maxX := p4.x;
|
||
|
||
if p2.y > maxY then maxY := p2.y;
|
||
if p3.y > maxY then maxY := p3.y;
|
||
if p4.y > maxY then maxY := p4.y;
|
||
|
||
cx := (minX+MaxX)/2;
|
||
cy := (minY+MaxY)/2;
|
||
|
||
if ReScale then begin
|
||
dpW := FDetailWidth/(maxX-minx);
|
||
scw := 100*(dpw/DotsPermilOrig);
|
||
dpH := FDetailHeight/(maxY-miny);
|
||
sch := 100*(dph/DotsPermilOrig);
|
||
if scw < sch then FDetailScale := Round(scw) else FDetailScale := Round(sch);
|
||
dw := FDetailWidth/(DotsPermilOrig*(FDetailScale/100));
|
||
dh := FDetailHeight/(DotsPermilOrig*(FDetailScale/100));
|
||
end;
|
||
mx := cx - (dw/2);
|
||
my := cy - (dh/2);
|
||
FDetMarX := mx-FDetailLeft;
|
||
FDetMarY := mY-FDetailTop;
|
||
end;
|
||
|
||
function TPCDrawBox.GetZAvg(dRect: TDoubleRect): Double;
|
||
begin
|
||
result := 0;
|
||
end;
|
||
|
||
function TPCDrawBox.HitTestModPoint(x, y: Double): TModPoint;
|
||
begin
|
||
result := nil;
|
||
end;
|
||
|
||
function TPCDrawBox.HitTestModPointDetVal(x, y: Integer): TModPoint;
|
||
begin
|
||
result := nil;
|
||
end;
|
||
|
||
function TPCDrawBox.HitTestModPointInt(x, y: Double): Integer;
|
||
begin
|
||
result := 0;
|
||
end;
|
||
|
||
function TPCDrawBox.HitTestModPointIntVal(x, y: Integer): TModPoint;
|
||
begin
|
||
result := nil;
|
||
end;
|
||
|
||
function TPCDrawBox.CheckByPointInt(LayerNbr, x, y: Integer): TFigure;
|
||
begin
|
||
result := nil;
|
||
end;
|
||
|
||
Procedure TPCDrawBox.setActiveLayer(value:integer);
|
||
Begin
|
||
if value > GetLayerCount - 1 then
|
||
messagedlg('Invalid Layer Number',mterror,[mbOK],0)
|
||
else begin
|
||
FActiveLayer := value;
|
||
Updated := True;
|
||
end;
|
||
end;
|
||
|
||
function TPCDrawBox.GetLayerCount: integer;
|
||
begin
|
||
result := 0;
|
||
end;
|
||
|
||
procedure TPCDrawBox.setIsometric(const Value: Boolean);
|
||
begin
|
||
FIsometric := Value;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.IsoConvertDim(var Dim: double);
|
||
begin
|
||
Dim := Round(Dim * DotsPerMil*ConvertRatio);
|
||
end;
|
||
|
||
procedure TPCDrawBox.IsoConvertXY(var X, Y, Z: double);
|
||
begin
|
||
IsoTo2D(x,y,z);
|
||
ConvertXY(x,y,z);
|
||
end;
|
||
|
||
procedure TPCDrawBox.IsoDeConvertDim(var Dim: Double);
|
||
begin
|
||
Dim := Dim / (DotsPerMil*ConvertRatio);
|
||
end;
|
||
|
||
procedure TPCDrawBox.IsoDeConvertXY(var X, Y, Z: Double);
|
||
begin
|
||
DeConvertXY(x,y,z);
|
||
end;
|
||
|
||
procedure TPCDrawBox.CalculateIsometricMargins;
|
||
var Minx,MinY,MaxX,MaxY:Double;
|
||
var dx,dy: Double;
|
||
begin
|
||
FIsoMarX := 0;
|
||
FIsoMarY := 0;
|
||
GetIsometricBounds(MinX,MinY,MaxX,MaxY);
|
||
dx := (FWorkWidth - (MaxX-MinX))/2;
|
||
dy := (FWorkHeight - (MaxY-MinY))/2;
|
||
FIsoMarx := dx-Minx;
|
||
FIsoMarY := dy-Miny;
|
||
end;
|
||
|
||
procedure TPCDrawBox.GetIsometricBounds(var MinX, MinY, MaxX,
|
||
MaxY: Double);
|
||
begin
|
||
|
||
end;
|
||
|
||
procedure TPCDrawBox.IsoTo2D(var x, y, z: Double);
|
||
var dx,dy: Double;
|
||
p: TDoublePOint;
|
||
begin
|
||
|
||
if HorizontalZero = vzRight then x :=WorkWidth-x;
|
||
if VerticalZero = vzBottom then y :=WorkHeight-y;
|
||
p := Doublepoint(x,y,z);
|
||
p := ConvertIsometricPoint(p,FWorkHeight,isoAngle,isoType);
|
||
if HorizontalZero = vzRight then x :=WorkWidth-x;
|
||
if VerticalZero = vzBottom then y :=WorkHeight-y;
|
||
p.x := p.x+FIsoMarX;
|
||
p.y := p.y+FIsoMarY;
|
||
x := p.x;
|
||
y := p.y;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetForceDefaultEngine;
|
||
begin
|
||
if CustomSurface <> nil then begin
|
||
SetEngine(CustomSurface,ConvertXY,DeConvertXY,ConvertDim,DeConvertDim,false,nil);
|
||
end else begin
|
||
SetEngine(Surface.Canvas,ConvertXY,DeConvertXY,ConvertDim,DeConvertDim,false,nil);
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetForceBufferEngine;
|
||
begin
|
||
SetEngine(TempBitmap.Canvas,ConvertXY,DeConvertXY,ConvertDim,DeConvertDim,false,nil);
|
||
end;
|
||
|
||
|
||
procedure TPCDrawBox.MoveDetailArea(dx, dy: Double);
|
||
begin
|
||
FDetailLeft := FDetailLeft+dx;
|
||
FDetailTop := FDetailTop+dy;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DrawTrace;
|
||
begin
|
||
//
|
||
end;
|
||
|
||
procedure TPCDrawBox.SurfaceWheel(Shift: TShiftState;
|
||
WheelDelta: Integer; MousePos: TPoint);
|
||
var z,dx,dy: Double;
|
||
ar:Boolean;
|
||
delta: Integer;
|
||
zs: Double;
|
||
begin
|
||
ZoomPointFlag := False;
|
||
ar := AutoRefresh;
|
||
dx := MousePos.x;
|
||
dy := MousePos.y;
|
||
DeConvertXY(dx,dy,z);
|
||
ZoomPoint := DoublePoint(dx,dy);
|
||
if DetailActive then begin
|
||
AutoRefresh := False;
|
||
if wheelDelta > 0 then
|
||
DetailScale := DetailScale+10
|
||
else
|
||
DetailScale := DetailScale-10;
|
||
AutoRefresh := ar;
|
||
ZoomDetailPoint(zoomdp);
|
||
end else begin
|
||
|
||
delta := Round((((wheelDelta/120)*20)/100)*ZoomScale);
|
||
if delta = 0 then delta := 1;
|
||
DoZoomDelta(delta);
|
||
//PrintMessage(inttostr(wheelDelta)+':'+inttostr(ZoomScale));
|
||
end;
|
||
|
||
ZoomPointFlag := False;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SurfaceWheelPull(Shift: TShiftState; X, Y: Integer);
|
||
begin
|
||
|
||
end;
|
||
|
||
procedure TPCDrawBox.SurfaceWheelPush(Shift: TShiftState; X, Y: Integer);
|
||
begin
|
||
|
||
end;
|
||
|
||
procedure TPCDrawBox.SurfaceMouseWheel(Sender: TObject; Shift: TShiftState;
|
||
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
||
begin
|
||
//IGOR -- 12/04/2016 --
|
||
{
|
||
// TODO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> - <20><> 2.3.0 <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><><EFBFBD><EFBFBD> Handled := false;
|
||
//Handled := True;
|
||
//DoSurfaceWheel(DelphiSetToOleShift(Shift),WheelDelta,MousePos.x,MousePos.y);
|
||
}
|
||
Handled := false;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SurfaceMiddleDblClick(Sender: TObject);
|
||
begin
|
||
if self.name = 'PCad' then
|
||
begin
|
||
if ToolIdx = TPCTool(toFigure) then
|
||
begin
|
||
GIsMousePressed := GIsMousePressed;
|
||
exit;
|
||
end;
|
||
|
||
if FSCS_Main.aExpertMode.Checked then
|
||
begin
|
||
FSCS_Main.tbPanExpert.Down := True;
|
||
end
|
||
else
|
||
begin
|
||
FSCS_Main.tbPanNoob.Down := True;
|
||
end;
|
||
FSCS_Main.aToolPan.Execute;
|
||
|
||
exit;
|
||
end
|
||
else
|
||
begin
|
||
if DetailActive then begin
|
||
DetailScale := 100;
|
||
ZoomDetailPoint(ZoomDp);
|
||
end
|
||
else
|
||
begin
|
||
FitToWindow;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.CadMouseWheel(Sender: TObject; Shift: TShiftState;
|
||
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
||
begin
|
||
//MousePos := Self.ClientToScreen(MousePos);
|
||
MousePos := Surface.ScreenToClient(MousePos);
|
||
SurfaceMouseWheel(Sender,Shift,WheelDelta,MousePos,Handled);
|
||
end;
|
||
|
||
procedure TPCDrawBox.ZoomIn;
|
||
begin
|
||
DoZoomIn;
|
||
end;
|
||
|
||
procedure TPCDrawBox.ZoomOut;
|
||
begin
|
||
DoZoomOut;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoZoomDelta(Delta: Integer);
|
||
begin
|
||
ZoomScale := ZoomScale + Delta;
|
||
end;
|
||
|
||
procedure TPCDrawBox.setPageborder(const Value: Boolean);
|
||
begin
|
||
FDrawPageBorder := Value;
|
||
if autorefresh then DoSurfacePaint(Surface);
|
||
end;
|
||
|
||
procedure TPCDrawBox.GotFocus(Sender: TObject);
|
||
begin
|
||
if not Self.Focused then Self.SetFocus;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SimulateTrace(x, y: Double);
|
||
var z: Double;
|
||
begin
|
||
z := 0;
|
||
ConvertXY(x,y,z);
|
||
SurfaceMove(Self,[],round(x),round(y));
|
||
end;
|
||
|
||
procedure TPCDrawBox.SimulateDown(x, y: Double);
|
||
var z: Double;
|
||
begin
|
||
z := 0;
|
||
ConvertXY(x,y,z);
|
||
SurfacePush(Self,mbLeft,[],round(x),round(y));
|
||
end;
|
||
|
||
procedure TPCDrawBox.SimulateUp(x, y: Double);
|
||
var z: Double;
|
||
begin
|
||
z := 0;
|
||
ConvertXY(x,y,z);
|
||
SurfacePull(Self,mbLeft,[],round(x),round(y));
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetDrawInCursor(const Value: Boolean);
|
||
begin
|
||
FdrawInCursor := Value;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SimulateRightClick(x, y: Double);
|
||
var z: Double;
|
||
begin
|
||
z := 0;
|
||
ConvertXY(x,y,z);
|
||
//SurfacePush(Self,mbRight,[],round(x),round(y));
|
||
SurfacePull(Self,mbRight,[],round(x),round(y));
|
||
end;
|
||
|
||
Procedure TPCDrawBox.SnapToGrid(var x,y:Double); //01.10.2013
|
||
begin
|
||
CalculateSnapPoint(x,y);
|
||
end;
|
||
|
||
procedure TPCDrawBox.SurfacePaint; //07.08.2012
|
||
begin
|
||
DoSurfacePaint(Surface);
|
||
end;
|
||
|
||
procedure TPCDrawBox.SurfaceMouseMove(Sender: TObject; Shift: TShiftState;
|
||
X, Y: Integer);
|
||
begin
|
||
SurfaceMOve(Sender,Shift,x,y);
|
||
end;
|
||
|
||
procedure TPCDrawBox.setPageGuide(const Value: Boolean);
|
||
begin
|
||
FPageGuide := Value;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SaveScroll;
|
||
begin
|
||
scHorzPosSave := scHorzPos;
|
||
scVertPosSave := scVertPos;
|
||
end;
|
||
|
||
procedure TPCDrawBox.RestoreScroll;
|
||
begin
|
||
scHorzPos := scHorzPosSave;
|
||
scVertPos := scVertPosSave;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.SetDpmOrig(const Value: Double);
|
||
begin
|
||
FDpmOrig := Value;
|
||
Refresh;
|
||
end;
|
||
|
||
procedure TPCDrawBox.GetPageRect(var left, top, right, bottom: Integer);
|
||
var xrect:TRect;
|
||
begin
|
||
xRect := GetPageRect;
|
||
left := xRect.left;
|
||
right := xrect.right;
|
||
top := xrect.Top;
|
||
bottom := xrect.Bottom;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfaceWheel(Shift: Integer;
|
||
WheelDelta: Integer; x,y:Integer);
|
||
begin
|
||
SurfaceWheel(OleShiftToDelphiSet(shift),WheelDelta, point(x,y));
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfaceWheelPull(Shift: Integer; X, Y: Integer);
|
||
begin
|
||
SurfaceWheelPull(OleShiftToDelphiSet(shift), x,y);
|
||
end;
|
||
|
||
procedure TPCDrawBox.DoSurfaceWheelPush(Shift: Integer; X, Y: Integer);
|
||
begin
|
||
SurfaceWheelPush(OleShiftToDelphiSet(shift), x,y);
|
||
end;
|
||
|
||
function TPCDrawBox.GetToolData: Integer;
|
||
begin
|
||
result := FToolData;
|
||
end;
|
||
|
||
class function TGuideLine.CreateFromStream(Stream: TStream): TGuideLine;
|
||
var
|
||
xCode: Byte;
|
||
aType: TGuideType;
|
||
aCoord: Double;
|
||
intVal: Integer;
|
||
dblVal: Double;
|
||
xByte: Byte;
|
||
aautoCr: boolean;
|
||
begin
|
||
aautoCr := false;
|
||
repeat
|
||
Stream.Read(xCode, 1);
|
||
if xCode = 20 then
|
||
begin
|
||
Stream.Read(intVal, sizeof(intVal));
|
||
aType := TGuideType(intVal);
|
||
end;
|
||
if xCode = 220 then
|
||
begin
|
||
Stream.Read(dblVal, sizeof(dblVal));
|
||
aCoord := dblVal;
|
||
end;
|
||
if xCode = 221 then
|
||
begin
|
||
Stream.Read(xByte, sizeof(xByte));
|
||
if xByte = 1 then
|
||
aautoCr := True
|
||
else
|
||
aautoCr := False;
|
||
end;
|
||
until Stream.Position = Stream.Size;
|
||
// aType := gtHorz;
|
||
// aCoord := 100;
|
||
Result := Self.create(aType, aCoord, aautoCr);
|
||
end;
|
||
|
||
procedure TGuideLine.WriteToStream(Stream: TStream);
|
||
var
|
||
xInt: integer;
|
||
xDbl: double;
|
||
xByte: byte;
|
||
begin
|
||
xInt := Ord(Self.gType);
|
||
WriteField(20, Stream, xInt, sizeof(xInt));
|
||
xDbl := Self.coord;
|
||
if self.fautoCr then
|
||
xByte := 1
|
||
else
|
||
xByte := 0;
|
||
WriteField(220, Stream, xDbl, sizeof(xDbl));
|
||
WriteField(221, Stream, xByte, sizeof(xByte));
|
||
end;
|
||
|
||
function TPCDrawBox.CheckForExistGuide(x, y: double; guType:TGuideType): Boolean;
|
||
var g : TGuideLine;
|
||
gx,gy,z : Double;
|
||
a : Integer;
|
||
Begin
|
||
result := False;
|
||
z := 0;
|
||
CalculateSnapPoint(x,y);
|
||
Convertxy(x,y,z);
|
||
try
|
||
For a := 0 to Guides.Count -1 do
|
||
begin
|
||
g := TGuideLine(Guides[a]);
|
||
gx := g.coord;
|
||
gy := g.coord;
|
||
z := 0;
|
||
ConvertXY(gx,gy,z);
|
||
|
||
if guType = gtHorz then
|
||
if (g.gType = gtHorz) and (abs(y - gy) <= 6) then
|
||
begin
|
||
GuideYold := Round(gy);
|
||
result := true;
|
||
exit;
|
||
end;
|
||
if guType = gtVert then
|
||
if (g.gType = gtVert) and (abs(x - gx) <= 6) then
|
||
begin
|
||
GuideXold := Round(gx);
|
||
result := true;
|
||
exit;
|
||
end;
|
||
end;
|
||
except
|
||
// on E: Exception do AddExceptionToLog(CPowerCadMessage + 'TPCDrawBox.CheckGuideLine' + E.Message);
|
||
end;
|
||
end;
|
||
|
||
procedure TPCDrawBox.DestroyCreatedOnDropGuides;
|
||
var i: Integer;
|
||
GL: TGuideLine;
|
||
begin
|
||
Guides.Assign(GuidesCreatedOnDropCompon, laXor);
|
||
for i := 0 to GuidesCreatedOnDropCompon.Count - 1 do
|
||
begin
|
||
TGuideLIne(GuidesCreatedOnDropCompon[i]).free;
|
||
end;
|
||
GuidesCreatedOnDropCompon.Clear;
|
||
end;
|
||
|
||
function TPCDrawBox.CheckAndGetGuideDrop(X, Y: Integer;
|
||
var GuideLine: TGuideLine; autoCr: boolean = False): Boolean;
|
||
var gutype: TGuideType;
|
||
guidex: Double;
|
||
guidey,z: Double;
|
||
begin
|
||
result := false;
|
||
if (DragState = dsHRuler) or (DragState = dsVRuler) then
|
||
begin
|
||
if Assigned(GuideLine) then
|
||
GuideLine := nil;
|
||
result := true;
|
||
if DragState = dsHRuler then
|
||
guType := gtHorz
|
||
else
|
||
guType := gtVert;
|
||
|
||
GuideX := x; GuideY:= y;z :=0;
|
||
DeConvertXY(GuideX,GuideY,z);
|
||
if guType = gtHorz then
|
||
begin
|
||
GuideLine := TGuideLine.create(gtHorz,GuideY,autoCr);
|
||
Guides.Add(GuideLine);
|
||
guideYold := -5000;
|
||
end
|
||
else
|
||
begin
|
||
GuideLine := TGuideLine.create(gtVert,GuideX,autoCr);
|
||
Guides.Add(GuideLine);
|
||
guideXold := - 5000;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
end.
|