CATIA V5 Automation

Using file open and save dialogs

Advertisements

Many programming projects require the user of the program to specify either a file to open or save.  That file could be anything from a native CATIA file such as a CATPart or CATDrawing to a simple text file.  Luckily, the CATIA automation API provides methods to display familiar file dialogs just like those you see in any other Windows application.  In this article I will show how easy they are to incorporate into your programming project and also how to deal with some common file related issues.

Overview

The ability to display these dialogs is made possible by the FileSelectionBox method provided by the CATIA Application object.  Realize that when the user selects a file using this method, it only returns a string indicating the full path of the file.  It does not actually open or save a file.  This gives you the flexibility to use these dialogs for many different purposes, file types and applications. The general syntax looks like this,


strFilePath = CATIA.FileSelectionBox(iTitle, iExtension, iMode)

There are three input arguments and a return value as described below:

iTitle – The text to display in the title bar of the dialog

iExtension – The file extensions allowed (sets the filter at the bottom of the dialog)

iMode – The type of dialog to display (CatFileSelectionModeOpen = 0, CatFileSelectionModeSave = 1)

strFilePath – The full file path selected or empty string (“”) if Cancel was clicked

Example 1: Open

Let’s assume you are creating a program that needs to read a comma-separated value (csv) file to get some input values for your program.  You want to first prompt the user to browse and select a file having this format, then read in the values to use in the program.


Dim strFilePath As String
Dim objFile As File
Dim objTextStream As TextStream
Dim strLine As String

'Display file open dialog
strFilePath = CATIA.FileSelectionBox("Select Text File", "*.txt, *.csv", 0)

'If user clicked cancel (empty string is returned), then exit the program
If strFilePath = "" Then Exit Sub

'Open the file, read the first line then close the file
Set objFile = CATIA.FileSystem.GetFile(strFilePath)
Set objTextStream = objFile.OpenAsTextStream("ForReading")
strLine = objTextStream.ReadLine
objTextStream.Close

'Display the read text value…just to show it was read.
Msgbox "First line: " &strLine, 0, "Text File Content"

The result will be something like this,

Example 2: Save

In this example, let’s assume your program has just built a new CATPart and now you want to have the user specify a file folder and name for it to be saved.


Dim objBody As Body
Dim objDoc As Document
Dim strFilePath As String
Dim strMsg As String

'Create a new part and add a new body
Set objDoc = CATIA.Documents.Add("Part")
Set objBody = objDoc.Part.Bodies.Add
objBody.Name = "Body generated by automation!"

'Prompt user for where to save the new part
strFilePath = CATIA.FileSelectionBox("SaveAs", "*.CATPart", 0)

'If user clicked cancel (empty string is returned), then exit the program
If strFilePath = "" Then
  strMsg = "Save operation was cancelled, so the new part will not be saved!"
  Msgbox strMsg, 48, "File Not Saved"
  Exit Sub
End If

'Save the part
objDoc.SaveAs strFilePath

The result will be something like this,

Don’t assume the returned file path is valid

After you make a call to the FileSelectionBox method, you should always check the return value before trying to use it in any downstream open or save operation.   Below, I will show a few common situations that occur with file operations.

Handling a cancel click by the user

If the user clicked Cancel, the returned file path will be an empty string.  You should always detect this and display some message or maybe even immediately end the program.

For example,


Dim strFilePath As String

strFilePath = CATIA.FileSelectionBox("SaveAs", "*.CATPart", 0)
If strFilePath = "" Then
   strMsg = "File selection was cancelled, so the program will end."
   Msgbox strMsg, 64, "Program End"
   Exit Sub
End If

Catching a save error

For a save operation, you will likely want to check to see whether the save was successful.  This way you can notify the user of a problem rather than allowing your program to crash.

Expanding the previous example a bit we get:


'For this example, assume a CATPart is currently open

Dim strFilePath As String

strFilePath = CATIA.FileSelectionBox("SaveAs", "*.CATPart", 0)
If strFilePath = "" Then
   strMsg = "File selection was cancelled, so the program will end."
   Msgbox strMsg, 64, "Program End"
   Exit Sub
Else
   'Try to save
   On Error Resume Next
   CATIA.ActiveDocument.SaveAs strFilePath
   If Err.Number <> 0 Then   'Any value other than zero is an error
      Msgbox "A save error occurred.  Program will end.", 64, "Save Error"
      Exit Sub
   Else
      'Reset error handler
      On Error Goto 0
   End If
End If

Checking write permission

If you want to go a step further, you may want to confirm that the user has write permission to the selected path.  Why not just check for an error and notify the user that an error occurred?  Whenever you can, it’s best to give the user an accurate assessment of the problem so they can attempt to resolve it rather than leaving them confused.  For example, you might be able to detect a permissions problem as opposed to some other problem such as running out of disk space.  Then you could prompt them try to select a different file path.

Checking write permission can sometimes be accomplished by querying the folder permissions in Windows, but honestly this can be very tricky.  This is especially true on a networked file system with group permissions.  I have found that the easiest way is to simply test whether a file can be written to the specified folder.

Again adding to the previous example we get,


'For this example, assume a CATPart is currently open

Dim strFilePath As String
Dim intPos As Integer
Dim strFolder As String
Dim objFile As File

strFilePath = CATIA.FileSelectionBox("SaveAs", "*.CATPart", 0)
If strFilePath = "" Then
   Msgbox "File selection was cancelled, so the program will end.", 64, "Program End"
   Exit Sub
Else
   'First we need to get just the folder path of the selected file
   'Find the position of the last \ character
   intPos = InStrRev(strFilePath, "\")   
   'Get the portion of string up to last \ character
   strFolder = Left(strFilePath, intPos)   

   'Test write permission by writing a test file in this folder
   On Error Resume Next
   Set objFile = CATIA.FileSystem.CreateFile(strFolder &"\1A2B3C4D5E.txt",false)
   If Err.Number <> 0 Then
      strMsg = "File could not be saved to this location.  Please check"
      strMsg = strMsg &"that you have permission to save to this folder…"
      Msgbox strMsg, 64, “Save Error”
      Exit Sub
   Else
      'Delete the test file if the save was successful
      CATIA.DeleteFile strFolder &"\1A2B3C4D5E.txt”
      'Reset error handler
      On Error Goto 0
   End If

   'Try to save the actual document
   On Error Resume Next
   CATIA.ActiveDocument.SaveAs strFilePath
   If Err.Number <> 0 Then
      strMsg = "An unknown save error occurred." &vbCrLf &"Check disk space, etc…"
      Msgbox strMsg, 64, "Save Error"
      Exit Sub
   Else
      On Error Goto 0
   End If
End If

Advanced options for file and folder browsing

These two dialogs should meet your needs for nearly all open and save tasks.  However, if you need to further customize these dialogs or if you need a folder selection dialog box, you will need to use the WinAPI.  In this case, your project will need to be done in VBA or outside CATIA using any language that supports COM and allows you to declare and call a WinAPI.  This is supported in VB6, any of the .NET languages, and many others.  Unfortunately, you cannot make calls to the WinAPI from CATIA V5 scripts. I did a quick google search and found some code for a BrowseFolder dialog here.

Please take a moment to rate this article…Just click the stars up near the title.

Add to: del.icio.us, StumbleUpon, Digg, Google

Advertisements