Problem with TdxfExportData.Scale
Moderators: SDS, support, admin
Problem with TdxfExportData.Scale
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 :
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>;
Hello!
1. You have missed the following line:
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:
Sergey.
please post questions to the forum or write to support@cadsofttools.com
1. You have missed the following line:
Code: Select all
E.AddLType('ACADISO03W100', [5,-5]);
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>;
please post questions to the forum or write to support@cadsofttools.com
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
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>;
Hello Schulz!
First of all try the following code instead of yours when creating block 'Test3'. And you will see that after changing
to
the start point of the rectangle remains the same.
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:
Sergey.
please post questions to the forum or write to support@cadsofttools.com
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)
Code: Select all
Data.Scale := MakeExpPoint(10, 10, 1)
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;
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;
please post questions to the forum or write to support@cadsofttools.com