Page 1 of 1
CADImage and Stream
Posted: 24 Jan 2017, 01:23
by FieldConsult
How to save a CADImage to stream (file or memory) and restore from and, two CADImage in the same stream ex:
Code: Select all
CADImage1.SaveToStream(ms);
CADImage2.SaveToStream(ms);
and later
Code: Select all
CADImage1.LoadFromStream(ms);
CADImage2.LoadFromStream(ms);
I try with one CADImage
ms is TMemoryStream to a TFileStream.
Code: Select all
CADImage.SaveToStream(ms);
ms.SaveToFile(fileName);
later
Code: Select all
ms.LoadFromFile(fileName);
CADImage.LoadFromStream(ms);
and the result stream is empty, no entities on the CADImage????
Thanks!!
Re: CADImage and Stream
Posted: 24 Jan 2017, 17:39
by support
Hello,
TsgCADImage.SaveToStream results in an empty stream if you save a drawing which was created programmatically. To get a non-empty stream, you should load a drawing from file, setting a value of
KeepOriginal variable to True beforehand. For example:
Code: Select all
uses
CADImage, DXF, DWG, sgConsts;
...
implementation
{$R *.dfm}
function CreateImageByFileFormat(AFileName: string): TsgCADImage;
var
vFileExt: string;
begin
Result := nil;
vFileExt := AnsiLowerCase(ExtractFileExt(AFileName));
if (vFileExt = '.dxf') then
Result := TsgCADdxfImage.Create;
if (vFileExt = '.dwg') then
Result := TsgDWGImage.Create;
end;
...
var
CADImage: TsgCADImage;
ms: TMemoryStream;
...
ms := TMemoryStream.Create;
KeepOriginal := True;
CADImage := CreateImageByFileFormat(fileName);
CADImage.LoadFromFile(fileName);
...
CADImage.SaveToStream(ms);
Mikhail
Re: CADImage and Stream
Posted: 24 Jan 2017, 21:01
by FieldConsult
Thanks for the answer but the result is the same.
I am working with a very complex drawing, which contains a series of mesh, and one of which is composed of almost 10,000 faces of an origin of 20,000 points.
Each mesh is loaded from dwg file and its points are analysed in clockwise order and then sorted by angle to get the convex hull of the points cloud and the minimum rectangle between points, among other things. Each mesh has a complex data structure associated so I need to store all the information in a single file and not have to perform the analysis every time I read the file with the mesh.
In short, I load a serie of dwg files, each one containing a mesh and group them into a single CADImage, then I perform a series of complex geometric calculations, which require a certain amount of time to complete, so I want to record all the information in a series of streams that are grouped into a single stream file (multi stream file) for later use.
The idea is to load the file containing the multiple stream and get the calculation information immediately without having to recalculate everything one more time, which would be the case that you should read the files with mesh each time.
The only problem I have is when I group the different streams with the one originated by a CADImage, this stream is the first to be added to the file and the first to be read, the stream structure has an index position for each stream which allows to locate the stream to read it, but when I read the stream originated by CADImage I always get an empty image
I tried to write the contents of the CADImage to a temporary dwg file, then I load it on the CADImage itself (using KeepOriginal on True) and later I recorded that CADImage in a stream but, the result is the same, I get an empty CADImage.
Thanks!!
Re: CADImage and Stream
Posted: 24 Jan 2017, 22:18
by support
In short, I load a serie of dwg files, each one containing a mesh and group them into a single CADImage
When you group objects loaded from different CAD files in a single CADImage, you actually create a CAD drawing programmatically. In this case TsgCADImage.SaveToStream results in an empty stream.
Generally, TsgCADImage.SaveToStream can be used in development of database related software, when a very popular task is to load a CAD drawing file and save it in some BLOB field of the database table by using a TBlobStream object.
Mikhail
Re: CADImage and Stream
Posted: 24 Jan 2017, 22:32
by FieldConsult
When you group objects loaded from different CAD files in a single CADImage, you actually create a CAD drawing programmatically. In this case TsgCADImage.SaveToStream results in an empty stream.
That's why I first save the contents of the resulting CADImage to a normal dwg file! And then load it again on the same CADImage as if it were a normal file with the option KeepOriginal on True, as you indicated earlier.
I tried to write the contents of the CADImage to a temporary dwg file, then I load it on the CADImage itself (using KeepOriginal on True) and later I recorded that CADImage in a stream but, the result is the same, I get an empty CADImage.
To get a non-empty stream, you should load a drawing from file, setting a value of KeepOriginal variable to True beforehand.
That is, if I write all the contents of a CADImage to a dwg file, it is a normal procedure and I get a normal file. I then load the new file into a CADImage to get the non-empty stream, but I get an empty stream again. (In your example you use a TMemoryStream and I use the same).
Thanks!
Re: CADImage and Stream
Posted: 24 Jan 2017, 22:41
by support
if I write all the contents of a CADImage to a dwg file, it is a normal procedure and I get a normal file. I then load the new file into a CADImage to get the non-empty stream, but I get an empty stream again. (In your example you use a TMemoryStream and I use the same).
Please send this .dwg file to the Technical Support e-mail, I'll test my code example with your file and try to clear up this point.
Mikhail