Hello Alex,
First of all thank you very much for the congratulations. From the name of all CADSoftTools team let me wish you in the come new year wealth, health and success in all your beginings.
According to your questions:
<blockquote id="quote"><font size="2" face="Verdana, Arial, Helvetica" id="quote">quote:<hr height="1" noshade id="quote">I want to draw on NavImage rectangle that shows the visible part of whole image according to point of view and current scale. It's for showing user what exactly part of image he does see in sgImage1.<hr height="1" noshade id="quote"></font id="quote"></blockquote id="quote">
Here go two ways of solving this task:
<b>The first one</b>:
Code: Select all
<b>uses</b>
... SGImage, DXFImage, sgConsts, DXFConv;
<b>type</b>
TForm1 = <b>class</b>(TForm)
...
btnOpenFile: TButton;
sgImage1: TsgImage;
NavImage: TsgImage;
OpenDialog1: TOpenDialog;
<b>procedure</b> btnOpenFileClick(Sender: TObject);
<b>procedure</b> NavImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
<b>procedure</b> FormCreate(Sender: TObject);
<b>private</b>
<font color="blue"><i>{ Private declarations }</i></font id="blue">
FImg: TsgDXFImage;
OldNavRect: TRect;
...
<b>var</b>
Form1: TForm1;
<b>implementation</b>
{$R *.dfm}
<b>function</b> GetRealPointUsingsgImagePoint(AImage: TImage; X, Y: Integer): TFPoint;
<b>var</b>
vRect: TRect;
vXScaled, vYScaled: Extended;
<b>begin</b>
vRect := TsgImage(AImage).PictureRect;
<b>if</b> ((vRect.Right - vRect.Left) <= AImage.Width) <b>or</b> ((vRect.Bottom - vRect.Top) <= AImage.Height) <b>then
begin</b>
vXScaled := X / (vRect.Right - vRect.Left);
vYScaled := (AImage.Height - Y) / (vRect.Bottom - vRect.Top);
<b>end
else
begin</b>
vXScaled := (-(vRect.Left - AImage.Left) + X) / (vRect.Right - vRect.Left);
vYScaled := 1 - (Y - (vRect.Top - AImage.Top)) / (vRect.Bottom - vRect.Top);
<b>end</b>;
Result := TsgDXFImage(AImage.Picture.Graphic).GetCADCoords(vXScaled, vYScaled);
<b>end</b>;
<b>procedure</b> TForm1.btnOpenFileClick(Sender: TObject);
<b>var</b>
vGraph: TGraphic;
vCenter: TPoint;
ScaleSizes: Boolean;
<b>begin
if not</b> OpenDialog1.Execute <b>then</b>
Exit;
sgImage1.LoadFromFile(OpenDialog1.FileName);
vGraph := TGraphicClass(sgImage1.Picture.Graphic.ClassType).Create;
vGraph.Assign(sgImage1.Picture.Graphic);
<b>if</b> sgImage1.Picture.Graphic <b>is</b> TsgDXFImage <b>then
begin</b>
sgImage1.Align := alNone;
NavImage.Picture.Graphic := vGraph;
NavImage.Align := alClient;
ScaleSizes := true;
vCenter.X := sgImage1.Width <b>shr</b> 1;
vCenter.Y := sgImage1.Height <b>shr</b> 1;
sgImage1.ChangeScale(ScaleSizes, NavImage.Scale * 8, vCenter);
FImg := TsgDXFImage(sgImage1.Picture.Graphic);
<b>end
else
begin</b>
FImg := <b>nil</b>;
<b>end</b>;
vGraph.Free;
<b>end</b>;
<b>procedure</b> TForm1.NavImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
<b>var</b>
vPoint, vPoint2: TFPoint;
FRect: TFRect;
OldPenMode: TPenMode;
NewNavRect: TRect;
vImg: TsgDXFImage;
<b>procedure</b> CalcParamsForShowPoint(<b>var</b> Location: TFPoint;
AsgImage: TsgImage; <b>var</b> APoint: TFPoint; <b>var</b> ARect: TFRect);
<b>var</b>
vPoint: TPoint;
vRect: TRect;
R: Double;
<b>begin</b>
vPoint := FImg.GetPoint(Location);
APoint := MakeFPoint(vPoint.X, vPoint.Y, 0);
vRect := AsgImage.PictureRect;
<b>if</b> AsgImage.UsePictureRect <b>then
begin</b>
vRect.Left := vRect.Left - AsgImage.Left;
vRect.Right := vRect.Right - AsgImage.Left;
vRect.Top := vRect.Top - AsgImage.Top;
vRect.Bottom := vRect.Bottom - AsgImage.Top;
<b>end</b>;
ARect := MakeFRect(vRect.Left, vRect.Top, 0, vRect.Right, vRect.Bottom, 0);
<b>if not</b> AsgImage.UsePictureRect <b>then
begin</b>
APoint.X := APoint.X + ARect.Left;
APoint.Y := APoint.Y + ARect.Top;
<b>end</b>;
<font color="blue"><i>//The TFRect top must be greater than bottom</i></font id="blue">
R := ARect.Top;
ARect.Top := ARect.Bottom;
ARect.Bottom := R;
<b>end</b>;
<b>begin
if</b> FImg = <b>nil then</b>
Exit;
sgImage1.Align := alNone;
vPoint := GetRealPointUsingsgImagePoint(NavImage, X ,Y);
NewNavRect.Left := X - NavImage.ClientWidth <b>div</b> 16;
NewNavRect.Top := Y - NavImage.ClientHeight <b>div</b> 16;
NewNavRect.Right := X + NavImage.ClientWidth <b>div</b> 16;
NewNavRect.Bottom := Y + NavImage.ClientHeight <b>div</b> 16;
CalcParamsForShowPoint(vPoint, sgImage1, vPoint2, FRect);
sgImage1.ShowPoint(vPoint2, 8 * NavImage.Scale * 100, FRect);
OldPenMode := NavImage.Canvas.Pen.Mode;
NavImage.Canvas.Brush.Style := bsClear;
NavImage.Canvas.Pen.Mode := pmXor;
NavImage.Canvas.Pen.Color := <b>not</b> NavImage.Canvas.Brush.Color;
NavImage.Canvas.Rectangle(OldNavRect);
NavImage.Canvas.Rectangle(NewNavRect);
OldNavRect := NewNavRect;
NavImage.Canvas.Pen.Mode := OldPenMode;
<b>end</b>;
<b>procedure</b> TForm1.FormCreate(Sender: TObject);
<b>begin</b>
OldNavRect := Rect(0,0,0,0);
<b>end</b>;
<b>end</b>.
<b>The second one</b>:
Code: Select all
<b>uses</b>
... SGImage, DXFImage, sgConsts, DXFConv;
<b>type</b>
TForm2 = <b>class</b>(TForm)
...
btnOpenFile: TButton;
NavImage: TsgImage;
sgImage1: TsgImage;
OpenDialog1: TOpenDialog;
<b>procedure</b> btnOpenFileClick(Sender: TObject);
<b>procedure</b> NavImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
<b>procedure</b> FormCreate(Sender: TObject);
<b>procedure</b> NavImagePaint(Sender: TObject);
<b>private</b>
<font color="blue"><i>{ Private declarations }</i></font id="blue">
OldNavRect: TRect;
...
<b>var</b>
Form2: TForm2;
<b>implementation</b>
{$R *.dfm}
<b>function</b> GetRealPointUsingsgImagePoint(AImage: TImage; X, Y: Integer): TFPoint;
<b>var</b>
vRect: TRect;
vXScaled, vYScaled: Extended;
<b>begin</b>
vRect := TsgImage(AImage).PictureRect;
<b>if</b> ((vRect.Right - vRect.Left) <= AImage.Width) <b>or</b> ((vRect.Bottom - vRect.Top) <= AImage.Height) <b>then
begin</b>
vXScaled := X / (vRect.Right - vRect.Left);
vYScaled := (AImage.Height - Y) / (vRect.Bottom - vRect.Top);
<b>end
else
begin</b>
vXScaled := (-(vRect.Left - AImage.Left) + X) / (vRect.Right - vRect.Left);
vYScaled := 1 - (Y - (vRect.Top - AImage.Top)) / (vRect.Bottom - vRect.Top);
<b>end</b>;
Result := TsgDXFImage(AImage.Picture.Graphic).GetCADCoords(vXScaled, vYScaled);
<b>end</b>;
<b>procedure</b> TForm2.btnOpenFileClick(Sender: TObject);
<b>begin
if</b> OpenDialog1.Execute <b>then</b>
NavImage.LoadFromFile(OpenDialog1.FileName);
<b>if</b> NavImage.Picture.Graphic <b>is</b> TsgDXFImage <b>then</b>
NavImage.Align := alClient;
<b>end</b>;
<b>procedure</b> TForm2.NavImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
<b>var</b>
FRect: TFRect;
vImg: TsgDXFImage;
<b>begin</b>
vImg := TsgDXFImage(NavImage.Picture.Graphic);
<b>if</b> vImg = <b>nil then</b>
Exit;
OldNavRect.Left := X - NavImage.ClientWidth <b>div</b> 16;
OldNavRect.Top := Y - NavImage.ClientHeight <b>div</b> 16;
OldNavRect.Right := X + NavImage.ClientWidth <b>div</b> 16;
OldNavRect.Bottom := Y + NavImage.ClientHeight <b>div</b> 16;
FRect.TopLeft := GetRealPointUsingsgImagePoint(NavImage, OldNavRect.Left, OldNavRect.Top);
FRect.BottomRight := GetRealPointUsingsgImagePoint(NavImage, OldNavRect.Right, OldNavRect.Bottom);
vImg.DrawRect(sgImage1.Canvas.Handle, FRect, sgImage1.ClientRect);
<b>end</b>;
<b>procedure</b> TForm2.FormCreate(Sender: TObject);
<b>begin</b>
OldNavRect := Rect(0,0,0,0);
<b>end</b>;
<b>procedure</b> TForm2.NavImagePaint(Sender: TObject);
<b>begin</b>
NavImage.Canvas.Brush.Style := bsClear;
NavImage.Canvas.Rectangle(OldNavRect);
<b>end</b>;
<b>end</b>.
<blockquote id="quote"><font size="2" face="Verdana, Arial, Helvetica" id="quote">quote:<hr height="1" noshade id="quote">If I use TsgDXFLine(Entity).Thickness := 100 and TsgDXFLine(Entity).SetLWeight (100) I receive different results.<hr height="1" noshade id="quote"></font id="quote"></blockquote id="quote">
TsgDXFLine(Entity).SetLWeight converts entered value to AutoCAD units type (into the 100 of millimeters, thus TsgDXFLine(Entity).SetLWeight(100) means 1 millimeter for lineweight).
TsgDXFLine(Entity).Thickness sets this value as is. We do not recommend to use TsgDXFLine(Entity).Thickness, because it will be changed in future versions of the library.
Sergey.
Please post questions to the forum or write to
support@cadsofttools.com