Support Links

Technical Bulletins

Customer Downloads

Code Generators

SmartCAM Email Forum

Patches and Utilities

Misc Resources

The Learning SmartCAM Tutorial

SmartCAM V11 Exploring Guides

Contacts


Maintenance Customer
Premium Content

SmartCAMcnc Technical Support

Topic: Macro String Functionality in SmartCAM

Technote 158 Date: June 1997 Product:All SmartCAM Applications Version: v10.x and up
Previous versions of SmartCAM have had very limited string manipulation capabilities within the macro language. The v10.0 release of SmartCAM includes several new options and functions for using strings. Procedure: The new functions can be broken down as follows:

  • Testing for string length
  • Display of multi-line string in Pause window
  • Extracting sub-strings from existing strings
  • Compare string contents to a known value
  • Concatenating several strings together into one
  • Access to long file names and JOS text information
  • These new macro words and their corresponding syntax formats are also available in the v8.21 Edit Plus that ships with the v10.0 release of SmartCAM. You can find them under Options - Template on the main menu. Once the Template dialog is displayed, set the Type field to MCL Commands and scroll down through the list of template words until you see the string functions.


    Testing for String Length
    Version 10.0 allows you to obtain the length of a string and assign it to a variable or use it as a testing tool. The string can be directly used, or can be accessed by using the variable name it has been assigned to, as in the following examples:

      // All string variables need to be defined as such at the beginning of the macro.
      STRING: #mystr
      // Assign a string value to the variable #mystr:
      #mystr = "teststring"
      // This string has a length of 10 characters.
      // You can evaluate this length and assign the number to another variable using the STRLEN function
      // in two ways: use the original string or use the variable name:
      #strlength = STRLEN(#mystr)
      #strlength = STRLEN("teststring")
      // Either way, the variable #strlength now has a value of 10.

      // Also, you can use the string length directly - without evaluating it to another variable - for testing.
      // In this case: if the length of the string stored in #mystr is not equal to 20 characters,
      // then display the following message in the readout line:
      IF(STRLEN(#mystr)<>20)
      READOUT[TX="String is not the correct length - hit any key to continue."]
      ENDIF
      // Alternatively, using the string directly:
      IF(STRLEN("teststring")<>20)
      READOUT[TX="String is not the correct length - hit any key to continue"]
      ENDIF


    Display of Multi-line String in Pause Window
    Version 10.0 allows you to include line feed characters within the string itself, and have those line feeds become active when the string is output in a pause window command. The following examples illustrate this behavior:

      // Define the string variable:
      STRING: #mystr
      // Assign a string value to the variable #mystr:
      // Note that the '\n' is seen as one character - the line feed character.
      #mystr = "This is a test\n
      of the multi-line\n
      string output function."
      PAUSE[TX=STRTMP("%mystr")]
      // This also works using the string directly, with no variable assignments:
      PAUSE[TX="This is a test\n
      of the multi-line\n
      string output function."]


    Extracting Sub-Strings from Existing Strings
    Version 10.0 allows you to extract a sub-string of any length and starting with any character within an existing string. The syntax follows the form of naming the original string, naming the starting character number of the partial string to be extracted, then giving a length of the string to be extracted. The following text provides working examples of this function:

      // Define the string variables:
      STRING: #mystr
      STRING: #mysub
      // Assign a value to the variable:
      #mystr = "Original string"
      // Extract a sub-string starting with the tenth character and having a length of six characters:
      #mysub = STRSUB(#mystr,10,6)
      READOUT[TX=STRTMP("%mysub")]
      // This returns the value of #mysub in the readout line - here it would be "string"
      // since the tenth character in #mystr is the 's' and the six character length,
      // which includes this starting character would take the sub-string to the 'g'.
      // Note that if you were to extract a sub-string starting with the tenth character and having
      // a length of ten characters (past the end of the original string), the resulting sub-string
      // would consist of only as many characters as the original string had to fill it. Here, the
      // value of #mysub would be the same. The next lines illustrate another example of this:
      #mystr = "A short String"
      #mysub = STRSUB(#mystr,10,26)
      READOUT[TX=STRTMP("%mysub")]
      // This returns a value of "tring" to the readout line.

      // These functions are also available using the actual string itself, without any variable assignments.
      #mysub = STRSUB("Original string",10,6)
      READOUT[TX=STRTMP("%mysub")]
      #mysub = STRSUB("A short String",10,26)
      READOUT[TX=STRTMP("%mysub")]


    Compare String Contents to a Known Value
    Version 10.0 allows you to compare the value of a string variable to that of a known or existing string. This is useful for testing the contents of a string and performing other operations based on that result. The following illustrates this function:

      // Define the string variables:
      STRING: #mystr
      STRING: #mysub
      // Assign a value to the variable:
      #mystr = "Original string"
      // Extract a sub-string starting with the tenth character and having a length of six characters:
      #mysub = STRSUB(#mystr,10,6)
      // Test the contents of the sub-string against what we would like it to be:
      IF(STREQUAL(#mysub,"string")<>1)
      READOUT[TX="Sub-string does not check out - press any key to continue"]
      ENDIF
      IF(STREQUAL(#mysub,"string")=1)
      READOUT[TX="Sub-string is ok - press any key to continue"]
      ENDIF
      // Test the contents of the sub-string against what we know it shouldn't be.
      // Note the capital 'S' in the string to compare the variable to:
      IF(STREQUAL(#mysub,"String")<>1)
      READOUT[TX="Sub-string does not check out - press any key to continue"]
      ENDIF
      // The STREQUAL function is a true/false test. If the strings are identical, the function will
      // return a value of 1. For any other condition where the strings are not identical, it will
      // return a value of 0.


    Concatenating Several Strings Together into One
    Version 10.0 allows you to put several strings together and assign them as a single entity to a string variable using the STRTMP command. The following examples show how to use this function:

      // Define the string variables:
      STRING: #mystr
      STRING: #mystr2
      STRING: #result
      // Assign values to the variables:
      #mystr = "String Number One"
      #mystr2 = "The SeCoNd string.I wrote."
      // Add the contents of #mystr and #mystr2 and assign the solution to #result:
      #result = STRTMP(%mystr%mystr2)
      READOUT[TX=STRTMP("%result")]
      // You can also add literal text to the string variables called in the STRTMP function:
      // Note that spaces entered within the STRTMP command are not retained upon
      // creation of the result string unless they are within double quotes.
      #result = STRTMP("Some literal text and %mystr %mystr %mystr2")
      READOUT[TX=STRTMP("%result")]


    Access to Long File Names and JOS Information
    The string functions in v10.0 can be used to access and manipulate "outside" information such as long file names on the system or information from JOS planner input fields. The first example assumes that you have created a file in the \sm9\shared\sysmcl\ directory named 'long filename test.mcl' and uses this file with the F_EXIST command to test for file's existance. You could also use this type of logic to store any path and file name information to be used elsewhere as string data.

      // Define the string variables:
      STRING: #lfname
      // Set the anticipated case variable - the F_EXIST function is a true/false test that
      // will return a 1 if the file by the given name exists and return a 0 if no file by that
      // name exists. In this case, we assume that the file to be tested for does exist
      // and set the anticipated case to a 'true' value:
      #case1 = 1
      // set the string variable to the name of the file we are testing for. This data could be a
      // constant file name, or come from a JOS input field:
      #lfname = "long filename test.mcl"
      // test for the existence of a file by that name:
      #case2 = F_EXIST(STRTMP("c:\sm9\shared\sysmcl\%lfname"))
      // Output an appropriate message based on this test:
      IF(#case2=#case1)
      READOUT[TX="File exists - press any key to continue"]
      ELSE
      READOUT[TX="File does not exist - press any key to continue"]
      ENDIF

    The second example shows how to access and manipulate a text string obtained from the planner. Any JOS information can be accessed this way, including job notes, tool notes, step notes, etc. The following example takes the job notes field from the current .jof file and outputs the contents in reverse order. This isn't really a practical example, but it does show the possibilities of the new string manipulation functions. It combines accessing JOS data, concatenating strings, and extracting sub-strings as discussed above.

      // Define the string variables:
      STRING: #part
      STRING: #temp
      STRING: #reverse
      STRING: #notes
      // Clear out the value of #reverse by setting it equal to an empty string:
      #reverse = ""
      // Retrieve the job notes from the JOS system as a string:
      JOS_CONTEXT_OPEN[BASEITEM=16,USERNAME=""]
      #notes = JOS_STR(job_note)
      JOS_CONTEXT_CLOSE[]
      // Echo the original job notes to the screen in a pause window:
      PAUSE[TX=STRTMP("%notes"), SR=15]
      // Establish the length of the job notes string #notes:
      #count = STRLEN(#notes)
      // Echo the length of the string to the readout line
      READOUT[TX=STRTMP("%count")]
      // Increment backwards through the job notes string, extracting each character as a
      // sub-string, then reassemble these characters in reverse order into a temporary
      // string variable named #temp:
      WHILE(#count>0)
      #part = STRSUB(#notes,#count,1)
      #temp = STRTMP(%reverse%part)
      #reverse = #temp
      #count = #count-1
      ENDW
      // Echo the result of the reordering to the screen in a pause window:
      PAUSE[TX=STRTMP("%reverse"), SR=15]
      // This will output the job notes of the current job file in exact reverse order.

    More examples of all these functions can be found within the \tech_supp directoy on your v10.0 / v11.x CD in the Custom Macro section. The examples provided on this technote are meant as basic introductions to the new string functions in SmartCAM version 10.0. The macro file referenced in the above link provides some more in-depth uses and combinations of these functions, and should be used as a reference for more advanced string evaluations.