Several blocks inside one block

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

Moderators: support, SDS, admin

Post Reply
FieldConsult
Posts: 54
Joined: 14 Mar 2015, 22:33

Several blocks inside one block

Post by FieldConsult » 21 Jun 2018, 16:31

HI,

I have several blocks, in a in memory CADImage, and I need to include these blocks in a single resulting block. I need the blocks to remain as independent blocks within the new block and not copy the entities to a new block.

Can yo show the necessary code to iterate between all the entities in the in memory CADImage and recognize the blocks to be included in the new block. Each source block is associated with its respective TsgDXFInsert and since the TsgDXFInsert only accept one block at a time I have not been able to associate several blocks to a single TsgDXFInsert in a correct way.

Any Idea, thanks!!!

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

Re: Several blocks inside one block

Post by support » 21 Jun 2018, 22:35

Hello,

If you want to combine several blocks in a new single block, you need to create a reference (TsgDXFInsert) for each source block, and then add this block reference to the new block as an entity. Below you will find a code which demonstrates this approach.

Code: Select all

procedure LoadBlockToConverter(ACADImage: TsgCADImage; ABlock: TsgDXFBlock);
var
  I: Integer;
begin
  for I := 0 to ABlock.Count - 1 do
  begin
    ACADImage.Converter.OnCreate(ABlock.Entities[I]);
    ACADImage.Converter.Loads(ABlock.Entities[I]);
  end;
  // If the block doesn't exist, add it to the BLOCKS section
  if ACADImage.Converter.BlockByName(ABlock.Name) = nil then
    ACADImage.Converter.Sections[csBlocks].AddEntity(ABlock);
  // Reload the block in the TsgDXFConverter
  ACADImage.Converter.Loads(ABlock);
end;

procedure CombineBlocksInNewBlock(ATargetImage: TsgCADImage; ANewBlockName: string);
var
  I: Integer;
  vSrcBlock, vNewBlock: TsgDXFBlock;
  vSrcBlockInsert: TsgDXFInsert;
begin
  // Create a definition of the new block
  vNewBlock := TsgDXFBlock.Create;
  vNewBlock.Name := ANewBlockName;
  // Iterate through the source blocks in CADImage
  for I := 0 to ATargetImage.Converter.Sections[csBlocks].Count - 1 do
  begin
    // Read a source block
    vSrcBlock := ATargetImage.Converter.Blocks[I];
    // Create a reference (INSERT) for the source block
    vSrcBlockInsert := TsgDXFInsert.Create;
    vSrcBlockInsert.Block := vSrcBlock;
    vSrcBlockInsert.Point := MakeFPoint(0, 0, 0); // specify coordinates of the insertion point according to your needs
    vSrcBlockInsert.Scale := MakeFPoint(1, 1, 1);
    vSrcBlockInsert.Angle := 0;
    // Add the block reference to the new block
    vNewBlock.AddEntity(vSrcBlockInsert);
  end;
  LoadBlockToConverter(ATargetImage, vNewBlock);
end;
Mikhail
Technical Support E-mail: support@cadsofttools.com
Chat support on Skype: cadsofttools.support

FieldConsult
Posts: 54
Joined: 14 Mar 2015, 22:33

Re: Several blocks inside one block

Post by FieldConsult » 22 Jun 2018, 01:10

Hi,

I followed the code as you indicated it but it causes an error in the resulting file can not be opened in autocad. As I have indicated each source block is already belonging to its own Insert, when associating each block with the new block, I think that a conflict of ownership (Owner) of the entities is generated and therefore the code does not work as expected.

I have also tried to create a new CADImage and place the blocks there but the result is also wrong.

Post Reply