Start a conversation

MicroSurvey CAD LISP Programming

MicroSurvey CAD Lisp Programming Functions

The LISP programming extensions are a set of LISP routines designed to help you customize MicroSurvey CAD or inCAD to your needs. The LISP extensions allow you to use the information in the MicroSurvey database to extend MicroSurvey in any direction you choose.  Note that most of these functions work equally well in both MicroSurvey CAD and MicroSurvey inCAD.  In this document, we refer to MicroSurvey.

Many of the functions provided here are the same C language routines MicroSurvey uses internally, with the LISP interface simply allowing you to call them directly. We cannot predict the types of programs you will write using MicroSurvey programming extensions, but these functions should provide a firm foundation for your efforts. The MicroSurvey database is open and at your disposal. What other Surveying Software company provides you with this kind of power?

LISP routines can be activated two ways with MicroSurvey CAD:

1. You can open Tools | Load Application, Pick "Add File... , select "Lisp Application" from the "Files of type" pulldown and then navigate to the location you have stored the lisp file.  See  the IntelliCAD Help article on the APPLOAD function for further details.  After that you can activate the routine by typing the command in the command line.

2. If you need to use the lisp routine on a regular basis, follow these steps after you've tested the routine and are confident it will work properly:

i. ensure you are logged in as an administrator and that MicroSurvey CAD is closed

ii. Copy the lisp file(s) into:

Windows XP: C:\Documents and Settings\All Users\Application Data\MicroSurvey\MSCAD\yyyy\mscad

Windows Vista,7,8 or newer: C:\ProgramData\MicroSurvey\MSCAD\yyyy\mscad

iii. Open this file in Windows Notepad:

64 bit systems: C:\Program Files\MicroSurvey\MSCADyyyy\icad.lsp

32 bit systems: C:\Program Files (x86)\MicroSurvey\MSCADyyyy\icad.lsp

iv. Add an additional line to the file for each lisp routine you wish to have loaded when the program starts in the format:

(load "mylisproutine")

 

For example:

(load "qsopts")

(load "origin")

(load "rorigin")

(load "mylisproutine")

;(load "tablet/tablet") 

 

v. (IMPORTANT) When you're finished editing icad.lsp you must first save it to the desktop and then copy it back to its original location to overwrite the original; otherwise it won't update properly.  Windows Vista and newer operating systems will not allow you to save the file directly into the Program file folder without special arrangements.

vi. Run MicroSurveyCAD.  You can type the command for the lisp routine in the command line to activate it, or you can add the command to a customized menu or toolbar.

 


 

 

Please note that the MicroSurvey lisp programming extensions currently only support numeric point numbers; alphanumeric point names cannot be used.

Toggle Control Functions
Drawing Control Functions
Unit Functions
Coordinate Database Functions
Line Database Functions
Annotation Functions


MicroSurvey Toggle Control Functions

The MicroSurvey Toggle Control Functions control the settings of the System Toggles. All these functions work the same way. Passing a value to a function will cause that value to be set in its associated toggle; calling a function without passing a value will return the existing setting.

To use one of these functions, evaluate the LISP expression

(function_name [bool])

where

  • function_name is the name of the function
  • bool is an optional Boolean value, 1 or nil

The expression evaluates to the final value of the toggle. Examples:

To set the Input Scale Factor toggle ON:

(setq togval (in_scale_tog 1))

To set the same toggle OFF:

(setq togval (in_scale_tog nil))

To return the current setting:

(setq togval (in_scale_tog))

MicroSurvey Toggle Control Functions:

‚ 

Function Name

Toggle Controlled

in_scale_tog

Input Scale Factor

out_scale_tog

Output Scale Factor

ss_trav_tog

Side Shot/Traverse Mode

auto_num_tog

Auto Numbering Toggle

auto_coord_tog

Auto Coordinate Toggle

desc_tog

Descriptions Toggle

offset_tog

Offsets Toggle

pt_protect_tog

Point Protection Toggle

elev_tog

Elevations Toggle

desc_trans_tog

Descriptions Translations Toggle

vert_ang_tog

Vertical Angle in COGO Toggle

meas_tog

Hz Angle & Hz Distance Prompt Toggle


MicroSurvey Drawing Control Functions

The MicroSurvey Drawing Control Functions control the settings of the MicroSurvey Drawing Control Toggles described in the manual. These functions work just like the MicroSurvey Control Functions described above; you set a toggle by passing a Boolean value to the function, or pass no value to return the existing setting.

Examples:

To set the Draw Lines toggle ON:

(setq togval (drawlines_tog 1))

To set the same toggle OFF:

(setq togval (drawlines_tog nil))

To return the current setting:

(setq togval (drawlines_tog))

MicroSurvey Drawing Control Toggles

‚ 

Function Name

Toggle Controlled

drawlines_tog

Add Lines in COGO Toggle

drawbearing_tog

Add Bearings in COGO Toggle

drawdistance_tog

Add Distances in COGO Toggle

drawelev_tog

Add Elevation text to screen Toggle

drawnum_tog

Add Point Number text to screen Toggle

drawpoint_tog

Add Point entity to screen Toggle

drawblock_tog

Add Custom CAD Blocks Toggle


MicroSurvey Unit Functions

The MicroSurvey Unit Functions return the values of MicroSurvey system variables. To use a function, evaluate the LISP expression

(function_name)

where function_name is the name of the function. For example, to read the drawing scale factor, use:

(setq scale (get_scale_factor))

To set the scale factor use set_scale_factor.

(set_scale_factor 100.0) would set the scale to 1"=100' if the units are feet, or 1:100 if the units are metric.

MicroSurvey Unit Functions

Function Name

get_scale_factor

set_scale_factor

get_elevation_decimal_places

get_distance_decimal_places

get_slope_decimal_places

set_slope_decimal_places

get_stationing_decimal_places

set_stationing_decimal_places

get_coordinate_decimal_places

set_coordinate_decimal_places

get_Metric_Imperial

get_Input_Scale_Factor  (new in MSCAD2009)

set_Input_Scale_Factor  (new in MSCAD2009)

get_Output_Scale_Factor  (new in MSCAD2009)

set_Output_Scale_Factor  (new in MSCAD2009)


MicroSurvey Coordinate Database Functions

The MicroSurvey Coordinate Database Functions manipulate coordinate points in the database. All these functions return nil if an error occurs. Descriptions of these functions follow.

get_coordinate

The function get_coordinate returns the information stored with a point in the coordinate database.

Syntax: (get_coordinate pointnum)

Integer: pointnum

Return Value: Returns a list:

("number" (east north elev) desc)

where

  • number is a string variable; you can convert this to a number with (itoa)
  • (east north elev) is a list of real numbers in MicroSurvey Point variable format
  • desc is a string variable of up to 50 characters

Example 1:

(setq ptnum (getint "\nEnter the Point number:"))
(setq ptlist (get_coordinate ptnum))

This sequence will accept a point number from the operator and return the point data in ptlist. To get each item of information into a variable, use the following:

(if (/= nil ptlist) ; check to make sure it came back
(setq ptnum (itoa (car ptlist)))
(setq ptxyz (cadr ptlist)) ; the point itself
(setq x (car ptxyz))
(setq y (cadr ptxyz))
(setq z (caddr ptxyz))
(setq ptdesc(caddr ptlist))

Example 2: This program will draw lines by point numbers:

 (defun drawlines()
 
 (while
      (setq‚  pt1xyz (cadr (get_coordinate (getint "\nEnter the first Point number:"))))
      (setq pt2xyz (cadr (get_coordinate‚  (getint "\nEnter the second Point number:"))))
      (command "line" pt1xyz pt2xyz "")
   )
)

store_coordinate 

The function store_coordinate stores a point in the coordinate database, with full Point Protection. If the Point Protection toggle is ON, you will be prompted with the standard options if you attempt to overwrite a point.

Syntax: (store_coordinate "number" (east north elev) ["description"])

Where:

  • number is a string variable; you can convert a number to a string with (itoa)
  • (east north elev) is a list of real numbers in MicroSurvey Point variable format
  • description is an optional string variable of up to 50 characters

Return Value: Returns a list:

("number" (east north elev) desc)

where

  • number is a string variable; you can convert this to a number with (itoa)
  • (east north elev) is a list of real numbers in MicroSurvey Point variable format
  • desc is a string variable of up to 50 characters

It is important to examine the returned list, because Point Protection can affect the values. If you choose New or Unused in response to a Point Protection prompt, the returned point number will be changed.

Example:

 (setq pt (getpoint "\nPick a Point:"))
(setq number (getstring "\nEnter the Point number:"))
(setq desc (getstring "\nEnter the description:"))
(setq ptreturned (store_coordinate‚ ‚ number pt desc))
(if (/=‚ (atoi (car ptreturned))‚ (atoi number))
(princ‚ "\nDifferent number returned!")
)


delete_coordinate 

The function delete_coordinate deletes a coordinate from the MicroSurvey coordinate database. If you erase a point, all lines, bearings, distances, elevations, descriptions, and point numbers related to that point will disappear from the screen and the MicroSurvey drawing file.

Syntax: (delete_coordinate num)

where num is an integer

Return Value: returns the string "Ok" if successful.

returns nil if the point does not exist

Example:

(setq ptnum (getint "\nEnter the Point number to delete:"))
(if (/= nil ptnum)
(delete_coordinate ptnum)
)

find_coordinate 

The function find_coordinate finds all points within a specified search radius of a given CAD point (not necessarily a MicroSurvey point). It can be used in a stake out program, or a program for automatic connectivity.

Syntax: (find_coordinate (east north elev) distance)

where

  • east north elev is an CAD Point variable (X Y Z)
  • distance is a real number search radius

Return Value: Returns a list:

("num1" "num2" ...)

where

  • num1, num2... are string variables containing the point numbers of the points found within the search radius

Example:

 (setq radius (getreal "\nEnter the search radius:"))
(setq searchpoint (getpoint "\nPick the Point to search around:"))
(setq pointlist (find_coordinate‚ searchpoint radius)
(princ pointlist)
get_highest 

The function get_highest finds the highest used point number in the database. This is useful if you wish to write a program that will add coordinates to the database.

Syntax: (get_highest)

Return Value: Returns a string:

("num1")

get_lowest_available 

The function get_lowest_available finds the lowest unused point number in the database. This is useful if you wish to write a program that will add coordinates to the database. Syntax is idential to (get_highest)

find_coordinate_description

The function find_coordinate_description finds all the points with this description:

Syntax: (find_coordinate_desc "POST")

Return Value: Returns a list:

"1174" "1223"

get_descriptions 

The function get_descriptions returns a list of all the descriptions used in the coordinate file.

Syntax: (get_descriptions)

Return Value: Returns a list:

"TREE" "POST" "HYDRO POLE" "BAR"

MicroSurvey Coordinate Database Functions

‚ 

Function Name

Toggle Controlled

get_coordinate

Get a Coordinate

store_coordinate

Store N,E,Elev,Description for a point

delete_coordinate

Erase N,E,Elev,Description

find_coordinate

Finds nearest coordinate within radius

find_coordinate_desc

Returns a list of all points with this description

get_highest

Returns the highest database coordinate

get_lowest_available

Returns the first available coordinate number

get_descriptions

Returns a list of all the descriptions in the file


MicroSurvey Line Database Functions

The MicroSurvey Line Database Functions manipulate lines in the line database. All these functions return nil if an error occurs. Descriptions of these functions follow.

add_line 

The function add_line adds a line to the line database. The presence of this line allows MicroSurvey to automatically recalculate bearings and distances if a point at either end of the line moves.

Syntax: (add_line start_num end_num [center_num])

where

  • start_num, end_num are required integers representing point numbers at the start and end of the line
  • center_num is an optional integer representing a radial point number for a curve

Return Value: Returns a string "line_hndl"

where 

  • line_hndl is a string variable containing the CAD handle of the line. The handle is a hexadecimal number that is converted to a long integer and becomes an index into the MicroSurvey line database. This value is returned for your information only.

Example: 

 
(setq pt1num (getint "\nEnter first Point number:"))
(setq pt2num (getint "\nEnter second Point number:"))
(setq linehandle‚  (add_line pt1num pt2num))

get_line 

The function get_line returns the CAD handle of a MicroSurvey line that connects two points.

Syntax: (get_line start_num end_num [center_num])

where

  • start_num, end_num are required integers representing point numbers at the start and end of the line
  • center_num is an optional integer representing a radial point number for a curve

Return Value: Returns a string "line_hndl"

where

  • line_hndl is the string handle of the line connecting the two points. The handle is a hexadecimal number.

Returns nil if there is no MicroSurvey line connecting the points.

Example:

(setq pt1num (getint "\nEnter first Point number:"))
(setq pt2num (getint "\nEnter second Point number:"))
(setq linehandle (get_line pt1num pt2num))

find_line 

The function find_line finds all points that are connected to a given point by lines and curves. It is useful, for example, in finding what points are connected to a lot corner.

Syntax: (find_line num)

where num is an integer point number

Return Value: Returns a list:

("line_hndl1" "line_hndl2" ...)

where

"line_hndl1", "line_hndl2"... are CAD string handles to the lines.

Example:

(setq pt1 (getint "\nEnter the Point number to search for connections:"))
(setq pointlist‚ (find_line‚ pt1))
(if (/= nil pointlist)
(princ (strcat "\nSome lines were found connecting to Point:"‚ (itoa‚ pt1)))
)

get_line_data 

The function get_line_data returns all the information stored in connection with a line. This information could be used to move points, or erase bearings or distances.

Syntax: (get_line_data "line_hndl")

where 

line_hndl is a string variable of the form returned from find_line above.

Return Value: Returns a list:

(line_hndl start_num end_num center_num bear_hndl dist_hndl)

where

  • line_hndl should be the same string variable passed as a parameter to get_line_data
  • start_num and end_num are point number strings. These can be converted to integers with (atoi)
  • center_num is a point number string representing a radial point if this is a curve
  • bear_hndl and dist_hndl are string handles of the bearing and distance annotations on the line, if the line has been annotated. They are 0 if the line has not had a bearing or distance added to it.

Example:

(setq handlelist (find_line 1)) 
;finds the line handles connected to point number 1
(setq linedata (get_line (car handlelist))

delete_line 

The function delete_line removes a line from the line database. All related information (bearings and distances) will be removed automatically.

Syntax: (delete_line "line_hndl")

where

line_hndl is a string variable containing a hexadecimal CAD handle for the line.

Return Value: Returns "Ok" if successful and nil if unsuccessful

Example:

(setq list (find_line 3))
(if (/= nil list)
(delete_line (car list))
)

This sequence will delete any existing lines that connect to point 3.

MicroSurvey Line Database Functions

‚ 

Function Name

Toggle Controlled

add_line

Adds line connectivity between points

get_line

Find CAD handle of a line

find_line

Finds all lines connected to a point

get_line_data

Get all information known about a line

delete_line

Remove a line from the database


MicroSurvey Annotation Functions

The MicroSurvey Annotation Functions add bearings and distances to lines in your drawing. Descriptions of these functions follow.

auto_bearing 

The function auto_bearing adds a bearing to a line. This is the routine used by the Auto Bearing function in MicroSurvey, but calling it from LISP lets you use it on any CAD line whether it was generated by MicroSurvey or not.

Syntax: (auto_bearing "line_hndl")

where

line_hndl is a string variable containing a hexadecimal CAD handle for the line.

A large arrow will appear on the line in question, and you will be asked what side of the line you want the bearing placed.

Return Value: Returns "Ok" if successful, and nil otherwise

Example:
(setq linehndl (find_line 3))
(auto_bearing linehndl)

auto_distance 

The function auto_distance adds a distance to a line. This is the routine used by the Auto Distance function in MicroSurvey, but calling it from LISP lets you use it on any CAD line whether it was generated by MicroSurvey or not.

Syntax: (auto_distance "line_hndl")

where

line_hndl is a string variable containing a hexadecimal CAD handle for the line.

A large arrow will appear on the line in question, and you will be asked what side of the line you want the distance placed.

Return Value: Returns "Ok" if successful, and nil otherwise

Example:

(setq linehndl (find_line 3))
(auto_distance linehndl)

auto_beardist

The function auto_beardist adds a bearing and a distance to a line. This is the routine used by the Auto Bear/Dist function in MicroSurvey, but calling it from LISP lets you use it on any line whether it was generated by MicroSurvey or not.

Syntax: (auto_beardist "line_hndl")

where

line_hndl is a string variable containing a CAD hexadecimal handle.

A large arrow will appear on the line in question, and you will be asked what side of the line you want the bearing placed.

Return Value Returns "Ok" if successful, or nil otherwise.

 


 

Created on: May 25, 2003
Updated: January 5, 2010 to fix some formatting problems

Choose files or drag and drop files
Was this article helpful?
Yes
No
  1. Jason Poitras

  2. Posted
  3. Updated

Comments