I’ve made a couple of updates to the Clipboard Manager in this latest version.
Firstly I wanted to remove a peculiar situation that occurred in the previous versions when you copy something to the clipboard that isn’t AutoCAD geometry: for some reason this act invalidates the ability to access data – such as the preview images – from the items in the Clipboard Manager. The pasting into the drawing still works, as setting an AutoCAD object back onto the clipboard re-enables access to AutoCAD data. You can try this with the previous version by creating a number of entries on the Clipboard Manager before copying some text to the clipboard from Notepad (although the issue was first reported with copying text from the MText IPE). Doing so stops the preview from working properly (and whether that blanks the preview image or causes an old one to remain depends on the version you’re using).
Anyway, the fix I decided upon is simple enough but could create user confusion: if the preview image is blank – as we attempt to retrieve it – when selection is changed in the Clipboard Manager, then we copy the contents of that entry to the clipboard. This allows us to get the preview image, and life is good. The downside is that this clears the previous contents of the clipboard – which may well be undesirable from the user’s perspective. That said, the fact that the user has clicked onto the Clipboard Manager palette does imply they want to use it for something, and so perhaps this is an acceptable compromise. Let me know if you have thoughts on this – I’d be happy to hear them.
The second change is the promised “Export to DWG” capability. I thought this would be very easy to implement – as we already had our function to get the temporary DWG file from AutoCAD’s clipboard data – but it proved harder than expected for one reason: AutoCAD only keeps the temporary DWG while the contents are on the clipboard. As soon as an item gets relegated to 2nd place, its temporary DWG file gets deleted from disk! This took me a while to work out and frankly I’m still scratching my head as to how the Clipboard Manager actually functions at all: if the DWG is inaccessible then PASTECLIP must retrieve it or regenerate it from somewhere else, but I don’t know how or why. At some point I may dig a little deeper into the implementation of the PASTECLIP command, but for now I’ll just be happy that it works when prior clipboard objects are copied back onto the clipboard.
The logical way to get around this situation is to copy the DWG file while it’s still valid, when the entry is first placed onto the clipboard. This means we then have to maintain a list of these temporary DWGs that might get used by the Export option but then they might very well not: this seems an acceptable overhead, especially if we clean up after ourselves. We then also have to store the location of this DWG file along with the DataObject defining the clipboard contents. We were previously just storing the DataObject in the “tag” property of each DataGridViewRow (a very handy field that can be used to associate arbitrary data with an item in the list). Now that we have more data to store we’ll instead store a key into a dictionary of “clipboard data items”, each of which stores the DataObject and the temporary DWG path. You’ll find this in the new “Clipboard_Data.vb” file implementing the CbDataManager class which manages items of class CbEntry. This manager object also knows how to clean up after itself by deleting temporary DWGs from disk when items are removed from the list or when the session finishes.
The resultant EXPORTCB command (as wherever possible we want to drive commands from modeless dialogs such as palettes) ends up being pretty simple:
<CommandMethod("ADNPLUGINS", "EXPORTCB", CommandFlags.Modal)> _
Public Shared Sub ExportClipboard()
' Make sure we only have one item selected
If _cp.clipboardDataGridView.SelectedRows.Count = 1 Then
' Get the selected item and its associated DWG file
Dim item As DataGridViewRow = _
_cp.clipboardDataGridView.SelectedRows.Item(0)
Dim dwgFile As String = _cp.GetTempDwg(item.Tag)
If Not String.IsNullOrEmpty(dwgFile) Then
Dim ed As Editor = _
Autodesk.AutoCAD.ApplicationServices.Application _
.DocumentManager.MdiActiveDocument.Editor()
' Get the name of the entry as shown in the list
Dim itemName As String = item.Cells(0).FormattedValue
' Set up our Save dialog options
Dim opts As PromptSaveFileOptions = _
New PromptSaveFileOptions( _
"Export """ + itemName + """ Contents To")
opts.Filter = "Drawing (*.dwg)|*.dwg"
opts.InitialDirectory = _
My.Computer.FileSystem.SpecialDirectories.MyDocuments
opts.InitialFileName = itemName + ".dwg"
' Ask the user to selected the output location
Dim pr As PromptFileNameResult = ed.GetFileNameForSave(opts)
If pr.Status = PromptStatus.OK Then
Try
Dim dwgDest As String = pr.StringResult
' If the file exists, the user has already
' chosen to overwrite it
If File.Exists(dwgDest) Then
File.Delete(dwgDest)
End If
' Copy the file
File.Copy(dwgFile, dwgDest)
' Inform the user of success
ed.WriteMessage( _
vbCr + "Exported contents of ""{0}"" to ""{1}""", _
itemName, dwgDest)
Catch
End Try
End If
End If
End If
End Sub
Here’s the Clipboard Manager containing four nicely-renamed entries:
Here’s the temporary location containing our four DWG files:
As items get removed from the list, the corresponding DWG files also get removed. When we want to export a particular item to DWG, we simply right-click it and select “Export to DWG”:
At which point we see our file selection dialog for the destination DWG file:
And selecting “Save” will result in a simple file-copy from the temporary file to our specified destination, and a confirmation on the command-line:
Exported contents of "Six Circles" to "C:\Users\walmslk\Documents\Six Circles.dwg"
That’s it for today’s update. There’s one last issue that’s been reported that I’m working through: sometimes you need to click twice in the drawing after selecting “paste” from a newly-selected item for it to place the geometry. There’s clearly some kind of focus-related issue, but it’s proving a little tricky to chase down (such issues often prove tough to debug). Hopefully I’ll find a way to address it, otherwise I’ll just recommend people to right-click directly, which appears to avoid the problem.