Vectorworks 8.5.0 Release Notes

This document describes all changes made since the release of 8.0.1 in the main Vectorworks application and plug-ins.

Vectorworks/Renderworks 8.5 Beta

    PLUG-INS AND SYMBOLS

  • Plug-in Objects and Symbols now have a default class associated with them. When creating plug-in objects, developers can specify a class that will be created/used when the user inserts that object without having to write code. For symbols, the default class is set in the Symbol Options dialog box. See the Custom Solutions Guide, page 7-10.
  • Convert To Group/Plug-in Object is a new menu command to replace Symbol to Group and Shallow Symbol to Group. It converts ALL container objects to groups (such as dimensions, extrudes, walls, and symbols), with options for the user on whether to convert nested containers. Works on symbols in walls and converts symbols with a single plug-in object to a plug-in object rather than a group. See the Custom Solutions Guide, page 11-7.
  • Create Symbol has been expanded to work on plug-in objects that are attached to walls. There is also a new option to put an instance of the newly created symbol in place of the original geometry. See the Custom Solutions Guide, page 11-5.
  • New plug-in object types: Rectangular and Linear. See the Custom Solutions Guide, page 7-1.
  • All plug-in objects now can have control points. See the Custom Solutions Guide, pages 7-3 and 8-1.
  • Plug-in objects can optionally be "Reset" more frequently, such as when moving or rotating. These options are accessible from the Create Plug-in dialog. See the Custom Solutions Guide, page 8-8.
  • Tools and menus can now save default data. See the Custom Solutions Guide, pages 5-2 and 6-2.
  • The Object Browser is a new palette to make the insertion of symbols and plug-in objects simpler. See the Custom Solutions Guide, page 11-3.
  • New symbol insertion options. There is a new option to convert symbols to groups or plug-in objects when inserted. See the Custom Solutions Guide, page 11-3.

    RENDERING

  • OpenGL support for Windows. This rendering mode has similar capabilities to QuickDraw 3D, but has much wider video driver support on Windows. With an OpenGL compatible video-driver, rendering will be accelerated and some tools (such as the Fly-Over tool will rotate rendered models). Some of the 3D preference options changed to more generic names to indicate that they affect both QuickDraw 3D and OpenGL.
  • Improved Rendering pipeline. Reduces the memory requirements and improves the speed of QD3D interactive mode.

    MISC

  • QuickTime 4 Support. This includes new file formats with expanded format specific options (new formats are TIFF, PNG, SGI, MacPaint, and TGA). Also, we've added the ability for the user to specify resolution and color depth when handling image files. The memory required during export has been reduced roughly in half. There will be a new document in the 8.5 help system that describes this with more detail (to be posted Monday).
  • Import EPS will now display TIFF previews of the image if it exists (when QuickTime 3 or higher is installed).
  • New editing modes for bitmaps and PICTs. These objects can now be rotated and stretched in place like the new rectangular plug-in objects.
  • Preferences dialog includes a button to edit the serial numbers installed on that machine.
  • Windows versions now check serial numbers when running on a network.
  • Support for 680x0 machines has been dropped.

8.5 VECTORSCRIPT LANGUAGE

    RE-ENTRANCY

  • VectorScript now supports re-entrancy. It is now possible for scripts to call other scripts, as well as write fully recursive subroutines in VectorScript.

    INCLUDE files

  • VectorScript now supports the use of external code references, aka, include files. The syntax is

    {$INCLUDE}

    Include files declarations support full and partial file paths, and either Macintosh(:) and Windows(\) style path delimiters may be used when specifying paths. If only the file name is specified, the path defaults to the folder containing the original script (if the script is run was from a file), otherwise to the folder containing the Vectorworks application.

    Include files are assumed to be text files on disk, either ordinary text or encrypted. An include file is treated as encrypted if its Mac file type is '#TXT' or its name ends in the extension ".xxt". Encrypted include files may be used with unencrypted scripts, and vice-versa.

    Namespaces

  • VectorScript supports name-spaces for predefined functions/constants. This means that user-declared names can override names in the library of predefined procedures, functions, and constants.

    FOR statement indexes

  • CHAR variables can now be used to index FOR statements (e.g., FOR cc := 'a' to 'z' ...).

    Functions allowed when defining CONST values

  • Certain functions are now allowed in constant expressions (evaluated at compile time): Abs(), Sqr(), Ord(), Chr(), Trunc(), Round(), Sqrt(), Sin(), Cos(), Tan(), Arcsin(),Arccos(), Arctan(), Ln(), Exp().

    Using Sqrt() and the trig functions to define constants is a good way to speed up execution. Defining

    CONST sin30 = sin(30);

    and using sin30 later in the program allows the sine calculation to be done at compile time instead of during execution.

  • ARRAYs of VECTOR are now allowed.

  • VectorScript supports arrays of vectors. Notation for the z element of a vector V is V[3]. Notation for the 8th vector in A:ARRAY[1..10] of VECTOR is A[8]. Notation for the z element of the 8th vector in A is A[8][3]. Notation for the z element of a vector in a two-dimensional array of vectors is A[1,8][3].

    Function/Procedure enhancements

  • Functions can now return any defined data type, including arrays (even arrayss of VECTOR).
  • Any defined data type, including an ARRAY, can now be passed to a procedure or function (with or without VAR).

    Example:

    PROCEDURE Foo;
    VAR
      theInput:ARRAY [1..10] OF REAL;
      j:INTEGER;
    FUNCTION Bar(data:ARRAY [1..10] OF REAL):BOOLEAN;
    VAR
      i:INTEGER;
     status:BOOLEAN;
    BEGIN
      status:=FALSE;
     FOR i:=1 TO 10 DO BEGIN
       IF (data[i] <>1) THEN status:= TRUE;
      END;
      Bar:=status;
    END;
    BEGIN
     FOR j:=1 TO 9 DO theInput[j]:= 1;
     IF Bar(theInput) THEN Message('Ack!);
    END;
    Run(Foo);

  • Procedures and functions can now be passed as parameters to other procedures/functions. The arguments (and function result) must be the same data types. Implementation of this feature follows the description in Apple's "MPW 3.0 Pascal Reference" for Procedural Parameters and Functional Parameters on pages 145-147.

    Example:

    PROCEDURE Foo;
    PROCEDURE Tadd(i,j:integer; VAR r:real);
    BEGIN
     r := i+j;
    END;;
    PROCEDURE Tsubtract(i,j:integer; VAR r:real);
    BEGIN
      r := i-j;
    END;
    PROCEDURE DoIt(PROCEDURE DoWhat(i,j:integer; VAR r:real); kk, mm: integer);
    VAR
      rr:real;
    BEGIN
      DoWhat(kk,mm,rr);
      Message(rr);
        Wait(2);
    END;
    BEGIN
      DoIt(Tadd,4,6);
      DoIt(Tsubtract,4,6);
    END;
    Run(Foo);

  • Array Type/Size Checking improved An ARRAY being assigned into another array, received as a function result, or being passed as an argument to a procedure or function is type-checked strictly. The array dimensions must be exactly the same, and the underlying type (CHAR, INTEGER, VECTOR, etc.) must be the same.

VECTORSCRIPT API

Here are the new functions for Vectorworks 8.5. This is the initial draft documentation. Look for updated/revised documentation in the on-line help starting with 8.5.0b3. At the end of this list you can find a more detailed description of the new ForEachObject routines. Also, dialog list boxes are now supported in all of the choice item calls.

PROCEDURE AddHelpItem(helpTitle:STRING; itemID, x1, y1, x2, y2:INTEGER);
Adds a help item to a dialog.

PROCEDURE SetHelpString(itemID:INTEGER; helpString:STRING);
Adds a help string for a particular dialog item. Cannot be called before AddHelpItem.

PROCEDURE HUngroup(h:HANDLE);

Ungroups the objects contained in the group specified by the passed in object handle.

FUNCTION AddSurface(s1, s2:HANDLE):HANDLE;
AddSurface will combine the two surfaces represented by h1 and h2 and return a handle to that surface, leaving s1 and s2 unmodified.

FUNCTION IntersectSurface(s1, s2:HANDLE):HANDLE;
Returns the intersection of surfaces s1 and s2 leaving s1 and s2 unmodified. If multiple intersecting surfaces exist, a group handle of those surfaces is returned.

PROCEDURE ClipSurface(s1, s2:HANDLE);
Modifies the surface represented by s1 by subtracting the intersection of surfaces s1 and s2 from s1. If there is no intersection, surface s1 will be unmodified.

PROCEDURE HMoveForward(h:HANDLE; toFront:BOOLEAN);
Moves the object h forward in it's layer if toFront is FALSE and to the front of that layer if toFront is TRUE.

PROCEDURE HMoveBackward(h:HANDLE; toBack:BOOLEAN);
Moves the object h backward in it's layer if toBack is FALSE and to the front of that layer if toFront is TRUE.

FUNCTION GetParent(h:HANDLE):HANDLE;
Returns a handle to the parent of h, such as a wall, group or 3D object. A handle to the layer in which h exists is returned if this object is not inside a container object.

FUNCTION GetWallControlOffset:REAL;
Returns the wall control line offset value.

PROCEDURE SetWallControlOffset(offset:REAL);
Sets wall control line offset value.

PROCEDURE InsertSymbolInFolder(targetFolder, symbolDef:HANDLE);
Inserts the symbol definition (symbolDef) into the container object handle specified by targetFolder.

FUNCTION GetLayerOptions:INTEGER;
Gets layer options visibility settings

PROCEDURE SetLayerOptions(layerOpts:INTEGER);
Sets layer options visibility settings.

FUNCTION GetClassOptions:INTEGER;
Gets class options visibility settings.

PROCEDURE SetClassOptions(classOpts:INTEGER);
Sets class options visibility settings.

FUNCTION GetLayerByName(layerName:STRING):HANDLE;
Returns a handle to the layer specified by layerName.

PROCEDURE RenameClass(className, newName:STRING);
Changes the name of the class specified by "className" to "newName".

FUNCTION GetTickCount:LONGINT;
Returns number of ticks (1/60th second) since system startup.

FUNCTION CrossProduct(v1,v2:VECTOR):VECTOR;
Returns the cross product of [[p:1]] and [[p:2]].

FUNCTION GetLastFileErr:INTEGER;
When called after a file operation, such as Open or Rewrite, this function returns an error code indicating whether an error occurred and, if so, what that error was.

PROCEDURE UseDefaultFileErrorHandling(enable:BOOLEAN);
Enable or disable alert dialogs when File I/O errors occur.

PROCEDURE SetSymbolOptionsN(name:STRING; insertMode, breakMode:INTEGER;className:STRING);
Sets the insert and break options for a specifed symbol. Also sets the default class for the symbol.

PROCEDURE GetSymbolOptionsN(name:STRING; VAR insertMode, breakMode:INTEGER; VAR className:STRING);
Returns insertion options from a specified symbol.

PROCEDURE GetSprdSortSumColumns(sheetHd: HANDLE; row: INTEGER; VAR sortCol1, sortCol2, sortCol3, sumCol1, sumCol2, sumCol3: INTEGER);
returns the sorting and summation options for a database row. Replaces GetSprdSortSum.

PROCEDURE SetSprdSortSumColumns(sheetHd: HANDLE; row, sortCol1, sortCol2, sortCol3, sumCol1, sumCol2, sumCol3: INTEGER);
Sets sorting and summation options for a database row. Replaces SetSprdSortSum.

FUNCTION QTInitialize:INTEGER;
Initializes QuickTime and returns the version number. 0 indicates QuickTime is not available

PROCEDURE QTTerminate;
Disables QuickTime for VectorScript and disposes internal data structures.

PROCEDURE QTSetMovieOptions(movieRef:INTEGER; frameRate:REAL; keyFrameRate:LONGINT; useDlg, useDlgPreview:BOOLEAN);
Allows movie frame rate, key frame rate to be set. Optional standard compression dialog display allows more specific settings.

PROCEDURE QTGetMovieOptions(movieRef:INTEGER; VAR frameRate:REAL; VAR keyFrameRate:LONGINT);
Retrieves frame rate and key frame rate information from the specified movie

FUNCTION QTOpenMovieFile(fileName:STRING):INTEGER;
Opens the file specified as a movie file for writing. A movie reference number is returned for subsequent operations. -1 indicates failure.

PROCEDURE QTCloseMovieFile(movieRef:INTEGER);
Closes the specified movie file.

PROCEDURE QTWriteFrame(movieRef:INTEGER);
Draws the current drawing into the movie file specified.

FUNCTION CreateCustomObject(objectName:STRING; pX, pY:REAL; rotationAngle:REAL):HANDLE;
Create a custom object at specified location and angle of rotation. Return handle to new object or nil if it fails.

PROCEDURE ForEachObjectInLayer(actionFunc:PROCEDURE; objOptions:INTEGER; travOptions:INTEGER; layerOptions:INTEGER);
Traverses through all specified objects in specified layers and performs the specified function; aborts when actionFunc returns true.

PROCEDURE ForEachObjectInList(actionFunc:PROCEDURE; objOptions:INTEGER; travOptions:INTEGER; list:HANDLE);
Traverses through all specified objects in a list and performs the specified function; aborts when actionFunc returns true.

PROCEDURE Get2DPt(obj : HANDLE; index : INTEGER; VAR locX, locY : REAL);
Returns the coords for the x and y position of the specified vertex of the specified object.

FUNCTION GetClosestPt(obj : HANDLE; ptX, ptY : REAL):INTEGER;
Returns the index of the vertex of the specified object that is closest to the specified location. Returns 0 if no vertex close to the location. Only supports 2D objects. Returns 1 if object is unsupported.

PROCEDURE GetClosestSide(obj : HANDLE; ptX, ptY : REAL; VAR index1, index2 : INTEGER);
Returns the indices of the vertices of the specified object that define the side of the object closest to the specified location. Only supports 2D objects. Returns 1 and 2 if the object is unsupported.

FUNCTION GetRField(h:HANDLE; record, field:STRING):STRING;

PROCEDURE GetPolylineVertex(obj:HANDLE; vertexNum:INTEGER; VAR pX, pY:REAL;
VAR vertexType:INTEGER; VAR arcRadius:REAL);

PROCEDURE SetPolylineVertex(obj:HANDLE; vertexNum:INTEGER; pX, pY:REAL;
vertexType:INTEGER; arcRadius:REAL; recalcBounds:BOOLEAN);

VectorScript supports two new list search-and-process routines: ForEachObjectInLayer, and ForEachObjectInList.

ForEachObjectInList, is a easier and quicker way to traverse lists of objects, as well as providing additonal filtering options for traversal. ForEachObjectInLayer acts on an object list derived from the selected layer options.

PROCEDURE ForEachObjectInList(FUNCTION actionFunc:BOOLEAN;
objOptions,travOptions:INTEGER;firstObjInList:HANDLE);

PROCEDURE ForEachObjectInLayer(FUNCTION actionFunc:BOOLEAN;
objOptions,travOptions,layerOptions:INTEGER);

Object options
--------------
Visible Objects only 1
Selected Objects only 2
Locked objects only 4
Traversal options
-----------------
Traverse Groups 1 Specifies that the inside of groups is traversed.
Traverse Deep 2 Specifies that all container objects (sweeps,
extrudes,etc) are traversed.
Layer options
--------------
Current layer 0
All layers 1
Visible layers 2
Editable layers 4
Snappable layers 8

The action function takes a handle as it's single parameter, through which the selected object is passed for processing. The dfunction returns a BOOLEAN controllin whether the ForEach..() function will continue executing. Normally you will return FALSE. If you are doing a search, and return TRUE when you find the object being searched for, the procedurecall to ForEach..() will terminate.

Examples:

Assume the following exist:

VAR
  total :INTEGER;
  myList:HANDLE;
FUNCTION Count(h:HANDLE):BOOLEAN;
BEGIN
  total:=total+1;
END;

Example - Count all objects in a list

ForEachObjectInList(Count,0,0,myList);

Example - Count all visible selected objects in a list

ForEachObjectInList(Count,3,0,myList);

Example - Count all visible selected objects in a list, including objects in groups

ForEachObjectInList(Count,3,1,myList);

Example - Count all visible selected objects in a list, including objects in groups and objects in side of container objects

ForEachObjectInList(Count,3,3,myList);