Problem with TdxfExportData.Scale

Discuss and ask questions about CAD VCL (Delphi and C++ Builder).

Moderators: SDS, support, admin

Post Reply
schulz
Posts: 16
Joined: 03 Apr 2006, 18:02
Location: Germany

Problem with TdxfExportData.Scale

Post by schulz » 04 Aug 2006, 15:47

Hello,
I have a problem with TdxfExportData.Scale.
When I insert a group and fill the Scale-attribut with data like(0.9,0.9,1)
the start-position of the group change.
What have I to do when i want to scale a group and freeze point down/left
A example :

Code: Select all

<b>procedure</b> TTestForm.Test_Scale_BtnClick(Sender: TObject);
<b>var</b>
 E : TsgDXFExport;
 Data : TdxfExportData;
 vLayer: TsgExpDXFLayer;
 pPoint : PdxfPoint;
<b>begin</b>
  E := TsgDXFExport.Create;
  E.Use01MM := True;
  //Create block 'Test1'
    E.BeginBlock('Test1');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLUE;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(25, 50, 0);
      Data.Point1 := MakeExpPoint(75, 50, 0);
      E.AddLine(Data);
    E.EndBlock;
//Insert block 'Test1' to the drawing
    FillChar(Data, SizeOf(Data), 0);
    vLayer := TsgExpDXFLayer.Create('Block1');
    E.CurrentLayer := vLayer;
    Data.Thickness := 0;
    Data.Text := 'Test1';
    Data.Scale := MakeExpPoint(1, 1, 0);
    Data.Point := MakeExpPoint(25, -25, 0);
    E.Insert(Data);
//Create block 'Test2'
    E.BeginBlock('Test2');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLUE;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(100, 0, 0);
      Data.Point1 := MakeExpPoint(100, 50, 0);
      E.AddLine(Data);
    E.EndBlock;
//Insert block 'Test2' to the drawing
    FillChar(Data, SizeOf(Data), 0);
    vLayer := TsgExpDXFLayer.Create('Block2');
    E.CurrentLayer := vLayer;
    Data.Thickness := 1;
    Data.Text := 'Test2';
    Data.Point := MakeExpPoint(-25, 0, 0);
    Data.Scale := MakeExpPoint(1, 1, 0);
    E.Insert(Data);

  //Create block 'Test3'
    E.BeginBlock('Test3');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLACK;
      Data.Thickness := 3;
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLACK;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(50, 0, 0);
      Data.Point1 := MakeExpPoint(50, 50, 0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(50, 50, 0);
      Data.Point1 := MakeExpPoint(100, 50, 0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(100, 50, 0);
      Data.Point1 := MakeExpPoint(100, 0, 0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(100, 0, 0);
      Data.Point1 := MakeExpPoint(50, 0, 0);
      E.AddLine(Data);
    E.EndBlock;
  //Insert block 'Test3' to the drawing
    FillChar(Data, SizeOf(Data), 0);
    vLayer := TsgExpDXFLayer.Create('Block3');
    E.CurrentLayer := vLayer;
    Data.Thickness := 1;
    Data.Text := 'Test3';
    Data.Point := MakeExpPoint(0, 0, 0);
    Data.Scale := MakeExpPoint(0.9, 0.9, 1); //  MakeExpPoint(1, 1, 1);
    E.Insert(Data);
//  Save file
    E.SaveToFile('C:\tmp\MoveTest_2.dxf');
    E.Free;
<b>end</b>;

support
Posts: 3272
Joined: 30 Mar 2005, 11:36
Contact:

Post by support » 08 Aug 2006, 12:31

Hello!

1. You have missed the following line:

Code: Select all

E.AddLType('ACADISO03W100', [5,-5]);
2. Property <b>TsgDXFInsert.Point</b> is responsible for the insert point of the block. A scale factor (<b>TdxfExportData.Scale</b>) influences the insert point in no way.

Try the following code:

Code: Select all

<b>procedure</b> TForm1.Forum3041Click(Sender: TObject);
<b>var</b>
 E: TsgDXFExport;
 Data: TdxfExportData;
 vLayer: TsgExpDXFLayer;
 pPoint: PdxfPoint;
<b>begin</b>
  E := TsgDXFExport.Create;
  E.Use01MM := False;
  //Create block 'Test1'
  E.AddLType('ACADISO03W100', [5,-5]);
    E.BeginBlock('Test1');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype  // bad line type
      Data.Color := DXF_BLUE;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(25, 50, 0);
      Data.Point1 := MakeExpPoint(75, 50, 0);
      E.AddLine(Data);
    E.EndBlock;
//Insert block 'Test1' to the drawing
    FillChar(Data, SizeOf(Data), 0);
    vLayer := TsgExpDXFLayer.Create('Block1');
    E.CurrentLayer := vLayer;
    Data.Thickness := 0;
    Data.Text := 'Test1';
    Data.Scale := MakeExpPoint(1, 1, 0);
    Data.Point := MakeExpPoint(25, -25, 0);
    E.Insert(Data);
//Create block 'Test2'
    E.BeginBlock('Test2');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLUE;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(100, 0, 0);
      Data.Point1 := MakeExpPoint(100, 50, 0);
      E.AddLine(Data);
    E.EndBlock;
//Insert block 'Test2' to the drawing
    FillChar(Data, SizeOf(Data), 0);
    vLayer := TsgExpDXFLayer.Create('Block2');
    E.CurrentLayer := vLayer;
    Data.Thickness := 1;
    Data.Text := 'Test2';
    Data.Point := MakeExpPoint(-25, 0, 0);
    Data.Scale := MakeExpPoint(1, 1, 0);
    E.Insert(Data);

  //Create block 'Test3'
    E.BeginBlock('Test3');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLACK;
      Data.Thickness := 3;
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLACK;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(50, 0, 0);
      Data.Point1 := MakeExpPoint(50, 50, 0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(50, 50, 0);
      Data.Point1 := MakeExpPoint(100, 50, 0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(100, 50, 0);
      Data.Point1 := MakeExpPoint(100, 0, 0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(100, 0, 0);
      Data.Point1 := MakeExpPoint(50, 0, 0);
      E.AddLine(Data);
    E.EndBlock;
  //Insert block 'Test3' to the drawing
    FillChar(Data, SizeOf(Data), 0);
    vLayer := TsgExpDXFLayer.Create('Block3');
    E.CurrentLayer := vLayer;
    Data.Thickness := 1;
    Data.Text := 'Test3';
    Data.Point := MakeExpPoint(50, 100,0);//MakeExpPoint(0, 0, 0);
    Data.Scale := MakeExpPoint(10, 10, 1); //MakeExpPoint(0.9, 0.9, 1)
    E.Insert(Data);
//  Save file
    E.SaveToFile('C:\tmp\MoveTest_2.dxf');
    E.Free;
<b>end</b>;

<b>procedure</b> TForm1.Forum304Test1Click(Sender: TObject);
<b>var</b>
  I: Integer;
  vImg: TsgDXFImage;
  vInsert: TsgDXFInsert;
  S: string;
<b>begin</b>
  sgImage1.LoadFromFile('C:\tmp\MoveTest_2.dxf');
  <b>if not</b> (sgImage1.Picture.Graphic <b>is</b> TsgDXFImage) <b>then</b>
    Exit;
  vImg := TsgDXFImage(sgImage1.Picture.Graphic);
  S := '';
  <b>for</b> I := 0 <b>to</b> vImg.Converter.Sections[csEntities].Count - 1 <b>do
  begin
    if</b> vImg.Converter.Sections[csEntities].Entities[I] <b>is</b> TsgDXFInsert <b>then
    begin</b>
      vInsert := TsgDXFInsert(vImg.Converter.Sections[csEntities].Entities[I]);
      S := S + 'TsgDXFInsert.EntName = ' + vInsert.EntName + #13#10;
      S := S + 'TsgDXFInsert.Point.X = ' + FloatToStr(vInsert.Point.X) + #13#10;
      S := S + 'TsgDXFInsert.Point.Y = ' + FloatToStr(vInsert.Point.Y) + #13#10;
      S := S + 'TsgDXFInsert.Point.Z = ' + FloatToStr(vInsert.Point.Z) + #13#10 + #13#10;
      S := S + 'TsgDXFInsert.Block.EntName = ' + vInsert.Block.EntName + #13#10;
      S := S + 'TsgDXFInsert.Block.Name = ' + vInsert.Block.Name + #13#10;
      S := S + 'TsgDXFInsert.Block.Offset.X = ' + FloatToStr(vInsert.Block.Offset.X) + #13#10;
      S := S + 'TsgDXFInsert.Block.Offset.Y = ' + FloatToStr(vInsert.Block.Offset.Y) + #13#10;
      S := S + 'TsgDXFInsert.Block.Offset.Z = ' + FloatToStr(vInsert.Block.Offset.Z) + #13#10 + #13#10;
    <b>end</b>;
  <b>end</b>;
  ShowMessage(S);
<b>end</b>;
Sergey.

please post questions to the forum or write to support@cadsofttools.com

schulz
Posts: 16
Joined: 03 Apr 2006, 18:02
Location: Germany

Post by schulz » 08 Aug 2006, 15:26

Hi Sergey,
I change your example to explain what is my problem.
1. All blocks are inserted at the same coordinates (0,0,0)
2. No block is scaled.
When i run this example the 3. block is in the 3. sector of the cross(block 1 and block 2)
When i change the scale values in block 3 to (10,10,1) the startpoint for drawing the box changes (corner down-left).
The box did't start at (50,0,0).
It seems i must change the InsertPoint of the group.

Thx
schulz

Code: Select all

<b>procedure</b> TForm1.Button1Click(Sender: TObject);
<b>var</b>
  E: TsgDXFExport;
  Data: TdxfExportData;
  vLayer: TsgExpDXFLayer;
  pPoint: PdxfPoint;
<b>begin</b>
  E := TsgDXFExport.Create;
  E.Use01MM := False;
  //Create block 'Test1'
  E.AddLType('ACADISO03W100', [5,-5]);
    E.BeginBlock('Test1');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype  // bad line type
      Data.Color := DXF_BLUE;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(0, 50, 0);
      Data.Point1 := MakeExpPoint(100, 50, 0);
      E.AddLine(Data);
    E.EndBlock;
//Insert block 'Test1' to the drawing
    FillChar(Data, SizeOf(Data), 0);
    vLayer := TsgExpDXFLayer.Create('Block1');
    E.CurrentLayer := vLayer;
    Data.Thickness := 0;
    Data.Text := 'Test1';
    Data.Scale := MakeExpPoint(1, 1, 0);
    Data.Point := MakeExpPoint(0, 0, 0);
    E.Insert(Data);
//Create block 'Test2'
    E.BeginBlock('Test2');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLUE;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(50, 0, 0);
      Data.Point1 := MakeExpPoint(50, 100, 0);
      E.AddLine(Data);
    E.EndBlock;
//Insert block 'Test2' to the drawing
    FillChar(Data, SizeOf(Data), 0);
    vLayer := TsgExpDXFLayer.Create('Block2');
    E.CurrentLayer := vLayer;
    Data.Thickness := 1;
    Data.Text := 'Test2';
    Data.Point := MakeExpPoint(0, 0, 0);
    Data.Scale := MakeExpPoint(1, 1, 0);
    E.Insert(Data);

  //Create block 'Test3'
    E.BeginBlock('Test3');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLACK;
      Data.Thickness := 3;
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLACK;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(50, 0, 0);
      Data.Point1 := MakeExpPoint(50, 50, 0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(50, 50, 0);
      Data.Point1 := MakeExpPoint(100, 50, 0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(100, 50, 0);
      Data.Point1 := MakeExpPoint(100, 0, 0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(100, 0, 0);
      Data.Point1 := MakeExpPoint(50, 0, 0);
      E.AddLine(Data);
    E.EndBlock;
  //Insert block 'Test3' to the drawing
    FillChar(Data, SizeOf(Data), 0);
    vLayer := TsgExpDXFLayer.Create('Block3');
    E.CurrentLayer := vLayer;
    Data.Thickness := 1;
    Data.Text := 'Test3';
    Data.Point := MakeExpPoint(0, 0, 0);//MakeExpPoint(50, 100,0);
    Data.Scale := MakeExpPoint(1, 1, 1); //MakeExpPoint(0.9, 0.9, 1)
    E.Insert(Data);
//  Save file
    E.SaveToFile('C:\tmp\MoveTest_2.dxf');
    E.Free;
<b>end</b>;

support
Posts: 3272
Joined: 30 Mar 2005, 11:36
Contact:

Post by support » 09 Aug 2006, 10:53

Hello Schulz!

First of all try the following code instead of yours when creating block 'Test3'. And you will see that after changing

Code: Select all

Data.Scale := MakeExpPoint(1, 1, 1)
to

Code: Select all

Data.Scale := MakeExpPoint(10, 10, 1)
the start point of the rectangle remains the same.

Code: Select all

  //Create block 'Test3'
    E.BeginBlock('Test3');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLACK;
      Data.Thickness := 3;
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLACK;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(0,0,0);
      Data.Point1 := MakeExpPoint(0,50,0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(0,50,0);
      Data.Point1 := MakeExpPoint(50,50,0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(50,50,0);
      Data.Point1 := MakeExpPoint(50,0,0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(50,0,0);
      Data.Point1 := MakeExpPoint(0,0,0);
      E.AddLine(Data);
    E.EndBlock;
Secondly, if you need to scale your block equally in all directions it is necessary to set its coordinates basing on point of origin (X=0,Y=0,Z=0) as the following code:

Code: Select all

  //Create block 'Test3'
    E.BeginBlock('Test3');
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLACK;
      Data.Thickness := 3;
      FillChar(Data, SizeOf(Data), 0);
      Data.Text := 'ACADISO03W100';// linetype
      Data.Color := DXF_BLACK;
      Data.Thickness := 3;
      Data.Point := MakeExpPoint(-25,-25,0);
      Data.Point1 := MakeExpPoint(25,-25,0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(25,-25,0);
      Data.Point1 := MakeExpPoint(25,25,0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(25,25,0);
      Data.Point1 := MakeExpPoint(-25,25,0);
      E.AddLine(Data);
      Data.Point := MakeExpPoint(-25,25,0);
      Data.Point1 := MakeExpPoint(-25,-25,0);
      E.AddLine(Data);
    E.EndBlock;
Sergey.

please post questions to the forum or write to support@cadsofttools.com

Post Reply