OCAD 11 Dateiformat
Version: 2012-02-09
General
This is a description of the file format of OCAD 11 files.
Be aware that this is an internal format and may change in future versions.
Data types used
OCAD is written in 32-bit Delphi and this description uses the names for the data types as they appear in Delphi. However the same data types are available in other development systems like C++.
Integer | 32-bit signed integer |
SmallInt | 16-bit signed integer |
Word | 16-bit unsigned integer |
WordBool | 16-bit boolean |
String[x] |
Widestring. The first byte contains the number of characters followed by the characters. The string is not zero-terminated. The maximum number of characters is x. It occupies x + 1 bytes in the file. |
Double | 64-bit floating point number |
TDPoly | A special data type (64-bit) used for all coordinates and text. It is defined as
TDPoly = record The lowest 8 Bits are used to mark special points: Marks for the x-coordinate: Marks for y-coordinate: The upper 24 bits contain the coordinate value measured in units of 0.01 mm. |
Note: all file positions are in bytes starting from the beginning of the file.
File Header
OCAD files start with a file header.
TFileHeader = record | Size = 48 Byte |
---|---|
OCADMark: SmallInt; | 3245 (hex 0cad) |
FileType: Byte; | file type (0: normal map, 1: course setting project, 8: file is saved in Server) |
FileStatus: Byte; | not used |
Version: SmallInt; | 11 |
Subversion: Byte; | number of subversion (0 for 11.00, 1 for 11.1 etc.) |
SubSubversion: Byte; | number of subsubversion (0 for 11.0.0, 1 for 11.0.1) |
FirstSymbolIndexBlock: integer; | file position of the first symbol index block |
ObjectIndexBlock: integer; | file position of object index block |
OfflineSyncSerial: integer; | serialNumber for offline work in Server mode |
Res1: integer; | not used |
Res2: integer; | not used |
Res3: integer; | not used |
FirstStringIndexBlock: longint; | file position of string index block |
FileNamePos: integer; | file position of file name, used for temporary files only |
FileNameSize: integer; | size of the file name, used for temporary files only |
Res4: longint; | not used |
TFileHeader = record // size = 48 Byte OCADMark: SmallInt; // 3245 (hex 0cad) FileType: Byte; // file type (0: normal map, 1: course setting project, 8: file is saved in Server) FileStatus: Byte; // not used Version: SmallInt; // 11 Subversion: Byte; // number of subversion (0 for 11.0, 1 for 11.1 etc.) SubSubversion: Byte; // number of subsubversion (0 for 11.0.0, 1 for 11.0.1) FirstSymbolIndexBlk: integer; // file position of the first symbol index block ObjectIndexBlock: integer; // file position of the object index list OfflineSyncSerial: integer; // serialNumber for offline work in Server mode Res1: integer; // not used Res2: longint; // not used Res3: longint; // not used FirstStringIndexBlk: longint; // file position of the first string index block FileNamePos: integer; // file position of the file name, used for temporary files only FileNameSize: integer; // size of the file name, used for temporary files only Res4: integer; // not used
Symbols
Each Symbol Index Block contains the position of the next Symbol Index Block and the file position of 256 symbols.
TSymbolIndexBlock= record // Size: 1028 Bytes NextSymbolIndexBlock: integer; SymbolPosition: array[0..255] of integer; end;
The different types of symbols are defined in different structures. There is an abstract type TBaseSym, which contains the fields common to all symbols types. It is used for programming reasons, but does not exist in real OCAD files.
TBaseSym = packed record Size: integer; // Size of the symbol in bytes. This depends on the // type. Coordinates following the symbol are included. SymNum: integer; // Symbol number. This is 1000 times the integer // part of the number + the fractional part // "right adjusted" // examples: // 101.5 is stored as 101005 // 203.45 is stored as 203045 // 203.145 is stored as 203145 Otp: byte; // Object type // 1: Point symbol // 2: Line symbol or Line text symbol // 3: Area symbol // 4: Text symbol // 6: Line text symbol // 7: Rectangle symbol Flags: byte; // 1: rotatable symbol (not oriented to north) // 4: belongs to favorites Selected: boolean; // Symbol is selected in the symbol box Status: byte; // Status of the symbol // 0: Normal // 1: Protected // 2: Hidden // AND 16: selected PreferredDrawingTool: byte;// Preferred drawing tool // 0: off // 1: Curve mode // 2: Ellipse mode // 3: Circle mode // 4: Rectangular line mode // 5: Rectangular area mode // 6: Straight line mode // 7: Freehand mode // 8: Numeric mode // 9: Stairway mode CsMode: byte; // Course setting mode // 0: not used for course setting // 1: course symbol // 2: control description symbol CsObjType: byte; // Course setting object type // 0: Start symbol // 1: Control symbol // 2: Finish symbol // 3: Marked route // 4: Control description symbol // 5: Course title // 6: Start number // 7: Relay variant // 8: Text block for control description CsCdFlags: byte; // Course setting control description flags // a combination of the flags // 64: available in column B // 32: available in column C // 16: available in column D // 8: available in column E // 4: available in column F // 2: available in column G // 1: available in column H Extent: integer; // Extent how much the rendered symbols can reach // outside the coordinates of an object with // this symbol. For a point object it tells how // far away from the coordinates of the object // anything of the point symbol can appear FilePos: integer; // Used internally. Value in the file is // not defined. notUsed1: Byte; // OCAD 10 + OCAD 11 Alpha: Group ID in the symbol tree. 0 = not in group notUsed2: Byte; // OCAD 10 + OCAD 11 Alpha: Group ID in the symbol tree. 0 = not in group nColors: SmallInt; // Number of colors of the symbol max. 14 // -1: the number of colors is > 14 Colors: array[0..13] of SmallInt; // Colors of the symbol Description: array[0..63] of char;// Description text IconBits: array[0..483] of byte; // Each byte represents a pixel of the icon // in a 256 color palette SymbolTreeGroup: Array[0..63] of Word; // replace SymbolTreeGroup1 and SymbolTreeGroup2
Objects
TODO
Parameter Strings
TODO