Home All Groups Group Topic Archive Search About

Saving PointF data in MSAccess

Author
18 Jun 2006 12:13 PM
Keith G
VS2003 using VB.Net

I want to be able to save drawing path data in a database.
If I store the Points array for each GraphicsPath I can then reproduce (in
this case) filled polygons at run time. The user will create the polygons
initially.
The number of points in the polygons will vary so I only want to save this
data in one field (rectangles would have been a lot easier).

The only way I can think of doing this is by saving the points as a string
in a Memo field; looping through all the points in the Array and using
GetValue to add the points to the string e.g.:
{x=369, y=89}{x=500, y=200}{x=700, y=300}

To retrieve the polygon at the next run time then seems a bit messy i.e. to
extract the points from the string and get them in the PointF format e.g.:
PointArray(intZoneCount).SetValue(New PointF(369, 89), 0) (would be the
first point)
I can see how this can be done and I'm sure it will work but can anyone
suggest a better way? or am I missing something blindingly obvious!

Thanks in advance.

Author
18 Jun 2006 7:00 PM
Göran Andersson
How about using a binarywriter to write the values to a memorystream,
get the byte array from the stream and use the Convert.ToBase64String
method to turn it into a string?

Keith G wrote:
Show quoteHide quote
> VS2003 using VB.Net
>
> I want to be able to save drawing path data in a database.
> If I store the Points array for each GraphicsPath I can then reproduce (in
> this case) filled polygons at run time. The user will create the polygons
> initially.
> The number of points in the polygons will vary so I only want to save this
> data in one field (rectangles would have been a lot easier).
>
> The only way I can think of doing this is by saving the points as a string
> in a Memo field; looping through all the points in the Array and using
> GetValue to add the points to the string e.g.:
> {x=369, y=89}{x=500, y=200}{x=700, y=300}
>
> To retrieve the polygon at the next run time then seems a bit messy i.e. to
> extract the points from the string and get them in the PointF format e.g.:
> PointArray(intZoneCount).SetValue(New PointF(369, 89), 0) (would be the
> first point)
> I can see how this can be done and I'm sure it will work but can anyone
> suggest a better way? or am I missing something blindingly obvious!
>
> Thanks in advance.
Author
19 Jun 2006 4:16 AM
Cor Ligthert [MVP]
Keith,

In addition to Goran.

http://www.vb-tips.com/default.aspx?ID=5ad37c7b-3732-4558-8dd7-e68d238952a5

I hope this helps,

Cor

Show quoteHide quote
"Keith G" <Kei***@discussions.microsoft.com> schreef in bericht
news:6C60F4F6-4452-4F78-B571-1AF92B711D66@microsoft.com...
> VS2003 using VB.Net
>
> I want to be able to save drawing path data in a database.
> If I store the Points array for each GraphicsPath I can then reproduce (in
> this case) filled polygons at run time. The user will create the polygons
> initially.
> The number of points in the polygons will vary so I only want to save this
> data in one field (rectangles would have been a lot easier).
>
> The only way I can think of doing this is by saving the points as a string
> in a Memo field; looping through all the points in the Array and using
> GetValue to add the points to the string e.g.:
> {x=369, y=89}{x=500, y=200}{x=700, y=300}
>
> To retrieve the polygon at the next run time then seems a bit messy i.e.
> to
> extract the points from the string and get them in the PointF format e.g.:
> PointArray(intZoneCount).SetValue(New PointF(369, 89), 0) (would be the
> first point)
> I can see how this can be done and I'm sure it will work but can anyone
> suggest a better way? or am I missing something blindingly obvious!
>
> Thanks in advance.
Author
21 Jun 2006 12:25 PM
Keith G
Thanks Cor and Göran

I can see how the image data is converted into the Byte Array (and back)
from the code example. Which is very neat.
However, and this is the bit I'm struggling with, how do I save a
GraphicsPath to a MemoryStream?
Göran is suggesting using the BinaryWriter but how do I do that from a
PointF array?

The save and retrieve process to/from the database would therefore be:
SAVE
[GraphicsPath]->[BinaryWriter?]->[MemoryStream]->[Byte
Array]->[ToBase64String]
RETRIEVE
[FromBase64String]->[Byte
Array]->[MemoryStream]->[BinaryReader?]->[GraphicsPath]





Show quoteHide quote
"Cor Ligthert [MVP]" wrote:

> Keith,
>
> In addition to Goran.
>
> http://www.vb-tips.com/default.aspx?ID=5ad37c7b-3732-4558-8dd7-e68d238952a5
>
> I hope this helps,
>
> Cor
>
> "Keith G" <Kei***@discussions.microsoft.com> schreef in bericht
> news:6C60F4F6-4452-4F78-B571-1AF92B711D66@microsoft.com...
> > VS2003 using VB.Net
> >
> > I want to be able to save drawing path data in a database.
> > If I store the Points array for each GraphicsPath I can then reproduce (in
> > this case) filled polygons at run time. The user will create the polygons
> > initially.
> > The number of points in the polygons will vary so I only want to save this
> > data in one field (rectangles would have been a lot easier).
> >
> > The only way I can think of doing this is by saving the points as a string
> > in a Memo field; looping through all the points in the Array and using
> > GetValue to add the points to the string e.g.:
> > {x=369, y=89}{x=500, y=200}{x=700, y=300}
> >
> > To retrieve the polygon at the next run time then seems a bit messy i.e.
> > to
> > extract the points from the string and get them in the PointF format e.g.:
> > PointArray(intZoneCount).SetValue(New PointF(369, 89), 0) (would be the
> > first point)
> > I can see how this can be done and I'm sure it will work but can anyone
> > suggest a better way? or am I missing something blindingly obvious!
> >
> > Thanks in advance.
>
>
>
Author
22 Jun 2006 12:12 AM
Göran Andersson
The PointsF struct contains two float values; X and Y. Loop through the
array of PointFs and write each pair of values to the BinaryWriter.

To recreate the array you get two float values from the BinaryReader to
create each PointF struct.

As each float value is four bytes you can calculate the length of the
PointF array by taking the length of the byte array and divide by eight.


Keith G wrote:
Show quoteHide quote
> Thanks Cor and Göran
>
> I can see how the image data is converted into the Byte Array (and back)
> from the code example. Which is very neat.
> However, and this is the bit I'm struggling with, how do I save a
> GraphicsPath to a MemoryStream?
> Göran is suggesting using the BinaryWriter but how do I do that from a
> PointF array?
>
> The save and retrieve process to/from the database would therefore be:
> SAVE
> [GraphicsPath]->[BinaryWriter?]->[MemoryStream]->[Byte
> Array]->[ToBase64String]
> RETRIEVE
> [FromBase64String]->[Byte
> Array]->[MemoryStream]->[BinaryReader?]->[GraphicsPath]
>
>
>
>
>
> "Cor Ligthert [MVP]" wrote:
>
>> Keith,
>>
>> In addition to Goran.
>>
>> http://www.vb-tips.com/default.aspx?ID=5ad37c7b-3732-4558-8dd7-e68d238952a5
>>
>> I hope this helps,
>>
>> Cor
>>
>> "Keith G" <Kei***@discussions.microsoft.com> schreef in bericht
>> news:6C60F4F6-4452-4F78-B571-1AF92B711D66@microsoft.com...
>>> VS2003 using VB.Net
>>>
>>> I want to be able to save drawing path data in a database.
>>> If I store the Points array for each GraphicsPath I can then reproduce (in
>>> this case) filled polygons at run time. The user will create the polygons
>>> initially.
>>> The number of points in the polygons will vary so I only want to save this
>>> data in one field (rectangles would have been a lot easier).
>>>
>>> The only way I can think of doing this is by saving the points as a string
>>> in a Memo field; looping through all the points in the Array and using
>>> GetValue to add the points to the string e.g.:
>>> {x=369, y=89}{x=500, y=200}{x=700, y=300}
>>>
>>> To retrieve the polygon at the next run time then seems a bit messy i.e.
>>> to
>>> extract the points from the string and get them in the PointF format e.g.:
>>> PointArray(intZoneCount).SetValue(New PointF(369, 89), 0) (would be the
>>> first point)
>>> I can see how this can be done and I'm sure it will work but can anyone
>>> suggest a better way? or am I missing something blindingly obvious!
>>>
>>> Thanks in advance.
>>
>>
Author
22 Jun 2006 5:58 PM
Keith G
I have now successfully saved and retrieved the PointF data using the
BinaryWriter and BinaryReader.

For anybody else that might be interested the read and write loops
respectively have ended up like this:
----------
For i = PointArray(intZoneCount).GetLowerBound(0) To
PointArray(intZoneCount).GetUpperBound(0)
         pt = PointArray(intZoneCount).GetValue(i)
         bt = pt.X
         bw.Write(bt)
         bt = pt.Y
         bw.Write(bt)
Next

For i As Integer = 0 To intPts
         intX = br.ReadSingle
         intY = br.ReadSingle
         PointArray(intZoneCount).SetValue(New PointF(intX, intY), i)
Next
---------------

Thanks to Göran and Cor for your help.

Regards..


Show quoteHide quote
"Göran Andersson" wrote:

> The PointsF struct contains two float values; X and Y. Loop through the
> array of PointFs and write each pair of values to the BinaryWriter.
>
> To recreate the array you get two float values from the BinaryReader to
> create each PointF struct.
>
> As each float value is four bytes you can calculate the length of the
> PointF array by taking the length of the byte array and divide by eight.
>
>
> Keith G wrote:
> > Thanks Cor and Göran
> >
> > I can see how the image data is converted into the Byte Array (and back)
> > from the code example. Which is very neat.
> > However, and this is the bit I'm struggling with, how do I save a
> > GraphicsPath to a MemoryStream?
> > Göran is suggesting using the BinaryWriter but how do I do that from a
> > PointF array?
> >
> > The save and retrieve process to/from the database would therefore be:
> > SAVE
> > [GraphicsPath]->[BinaryWriter?]->[MemoryStream]->[Byte
> > Array]->[ToBase64String]
> > RETRIEVE
> > [FromBase64String]->[Byte
> > Array]->[MemoryStream]->[BinaryReader?]->[GraphicsPath]
> >
> >
> >
> >
> >
> > "Cor Ligthert [MVP]" wrote:
> >
> >> Keith,
> >>
> >> In addition to Goran.
> >>
> >> http://www.vb-tips.com/default.aspx?ID=5ad37c7b-3732-4558-8dd7-e68d238952a5
> >>
> >> I hope this helps,
> >>
> >> Cor
> >>
> >> "Keith G" <Kei***@discussions.microsoft.com> schreef in bericht
> >> news:6C60F4F6-4452-4F78-B571-1AF92B711D66@microsoft.com...
> >>> VS2003 using VB.Net
> >>>
> >>> I want to be able to save drawing path data in a database.
> >>> If I store the Points array for each GraphicsPath I can then reproduce (in
> >>> this case) filled polygons at run time. The user will create the polygons
> >>> initially.
> >>> The number of points in the polygons will vary so I only want to save this
> >>> data in one field (rectangles would have been a lot easier).
> >>>
> >>> The only way I can think of doing this is by saving the points as a string
> >>> in a Memo field; looping through all the points in the Array and using
> >>> GetValue to add the points to the string e.g.:
> >>> {x=369, y=89}{x=500, y=200}{x=700, y=300}
> >>>
> >>> To retrieve the polygon at the next run time then seems a bit messy i.e.
> >>> to
> >>> extract the points from the string and get them in the PointF format e.g.:
> >>> PointArray(intZoneCount).SetValue(New PointF(369, 89), 0) (would be the
> >>> first point)
> >>> I can see how this can be done and I'm sure it will work but can anyone
> >>> suggest a better way? or am I missing something blindingly obvious!
> >>>
> >>> Thanks in advance.
> >>
> >>
>