Reply

Copy solid view into an image in VB .net

Hi,

I'm working on upgrading old VB6 code to vb .net (under visual studio 2012 & .net V4.0)

 

In VB6 I had a code that copied a draft view from Solid Edge, put it into PictureBox object, and then made a save to bmp.

     Image1.picture=Clipboard.GetData(vbCFMetafile)

 

I tried to do the same in vb .net, but for some strange reason the .net will not get the solid clipboard object into an image object:

 

Open SE draft, select a drawing view and do Copy, now run this code.

 

Private Sub Form1_load () Handles MyBase.Load

           Dim bmp as Bitmap

           bmp = Clipboard.GetImage

           bmp = Ctype(Clipboard.GetImage, Bitmap)

           bmp = Ctype(Clipboard.GetData(System.Windows.Forms.DataFormats.MetafilePict),Bitmap)

End Sub

 

None of the bmp= lines work Smiley Sad

 

What am I doing wrong?

 

Thanks,

Zohar

6 REPLIES

Re: Copy solid view into an image in VB .net

[ Edited ]

Hi Zohar,

 

After copying a view in SE Draft, I am able to Paste it to MS Paint so there is certainly some data on the clipboard, but,

 

MessageBox.Show(Clipboard.ContainsImage) 

pops False.

 

Also, copying a  shaded viewin draft, pastes a wireframe of it in MS Paint, so I doubt the format of the data on the Clipboard is in a usable format. The following is False too:

 

MessageBox.Show(Clipboard.GetDataObject().GetDataPresent(DataFormats.Bitmap)) 

So data on the clipboard cannot be assigned to Bitmap even using CType.

 

BR,

Re: Copy solid view into an image in VB .net

I would suggest a workaround by first saving the view into a temporary image file and reading the file into the picture box as below:

 

oView.SaveAsImage(Path & "\Temp.bmp", 400, 300, , , , SolidEdgeConstants.SeImageQualityType.seImageQualityHigh)

PictureBox1.Image = System.Drawing.Image.FromFile(Path & "\Temp.bmp")

 Later you can delete the temp file:

 

If System.IO.File.Exists(Path & "\Temp.bmp") Then
System.IO.File.Delete(Path & "\Temp.bmp")
End If

 

Hope that was useful.

 

Meanwhile, if you find a solution to your original problem about "bmp = Nothing", kindly do post it here. Thanks.

 

Regards,

~Tushar

http://surfandcode.blogspot.in

 

Re: Copy solid view into an image in VB .net

Zohar,

 

  Here's a solution if you do not want to use the temp file on disk method.

  Create some views in Draft, place a PictureBox1 control on the Form and call the following from a Button Click:

 

Private Sub Button23_Click(sender As System.Object, e As System.EventArgs) Handles Button23.Click

Dim oApp As SolidEdgeFramework.Application = Marshal.GetActiveObject("SolidEdge.Application")
Dim oDoc As SolidEdgeDraft.DraftDocument = oApp.ActiveDocument Dim oSheet As SolidEdgeDraft.Sheet = oDoc.ActiveSheet Dim oViews As DrawingViews = oSheet.DrawingViews For Each oView As DrawingView In oSheet.DrawingViews oView.Copy() PictureBox1.Image = GetEnhMetafileOnClipboard(Me.Handle) MessageBox.Show("Click OK for next View.") Next
End Sub

 

To use the GetEnhMetafileOnClipboard, add the code below anywhere within your Form Class in VB.Net:

 

Const CF_ENHMETAFILE As Integer = 14

<DllImport("user32.dll")> _
Private Shared Function OpenClipboard(ByVal hWndNewOwner As IntPtr) As Boolean
End Function

<DllImport("user32.dll")> _
Private Shared Function IsClipboardFormatAvailable(ByVal wFormat As Integer) As Integer
End Function

<DllImport("user32.dll")> _
Private Shared Function GetClipboardData(ByVal wFormat As Integer) As IntPtr
End Function

<DllImport("user32.dll")> _
Private Shared Function CloseClipboard() As Integer
End Function

Public Shared Function GetEnhMetafileOnClipboard(ByVal hWnd As IntPtr) As System.Drawing.Imaging.Metafile
Dim meta As System.Drawing.Imaging.Metafile = Nothing
If OpenClipboard(hWnd) Then
  Try
    If IsClipboardFormatAvailable(CF_ENHMETAFILE) <> 0 Then
      Dim hmeta As IntPtr = GetClipboardData(CF_ENHMETAFILE)
      meta = New System.Drawing.Imaging.Metafile(hmeta, True)
    End If
  Finally
    CloseClipboard()
  End Try
End If

Return meta
End Function

 

Hope you find this useful.

 

BR,

Tushar Suradkar

http://surfandcode,blogspot.in

www.cadvertex.com

 

 

Re: Copy solid view into an image in VB .net

Tushar

Thanks, it works great!

 

But can you make it even better:

In the copyed image all the lines have the same line width.

If I make the copy into MS word the image has the correct line width for each line type.

 

Can this allso be done in VB?

 

Zohar

 

Re: Copy solid view into an image in VB .net

Zohar,

 

I think it has hit a dead-end.

Solid Edge does copy line-width data to the metafile on the clipboard.

The picturebox control is not able to read it properly.

 

Not just the line-width, a shaded Solid Edge view pastes shaded in MS Word but not in the picturebox control. Only line data without line-width info gets pasted.

 

Original SE View:

 

Pasted in MS Word and scaled by dragging handles:

 

 

Same view in the picturebox:

 

 

So I think any further coding may not be of use or does not exist, nor the picturebox control has any property to display images any better.

 

Re: Copy solid view into an image in VB .net

The starnge thing is that the VB6

Image1.picture=Clipboard.GetData(vbCFMetafile)

do get the image with the correct width for the body lines.

 

Well Microsoft always go two steps forword & one step back.

 

Zohar