2354 lines
96 KiB
Python
Executable File
2354 lines
96 KiB
Python
Executable File
Here is the Autodesk spec, and a C program that reads DXF:
|
||
|
||
[ This file is an excerpt from the AutoCAD Release 10 Reference Manual.
|
||
Copyright (C) 1988 Autodesk, Inc. All rights reserved. ]
|
||
|
||
Appendix C
|
||
Drawing Interchange and File Formats
|
||
|
||
|
||
AutoCAD can be used by itself as a complete drawing editor. In some appli-
|
||
cations, however, other programs must examine drawings created by AutoCAD
|
||
or generate drawings to be viewed, modified, or plotted with AutoCAD.
|
||
|
||
For example, if you've made an architectural drawing with AutoCAD, using
|
||
INSERTed parts to represent windows, doors, and so on, you can process the
|
||
drawing file and produce a bill of materials of all the items used in the
|
||
drawing, or even make energy use calculations based on the area and the
|
||
number and type of windows used. Another possible application is to use
|
||
AutoCAD to describe structures that are then sent to a large computer for
|
||
finite element structural analysis. You can compute stresses and displace-
|
||
ments and send back information to display the deformed structure as an
|
||
AutoCAD drawing.
|
||
|
||
Since the AutoCAD drawing database (.dwg file) is written in a very compact
|
||
format that changes significantly from time to time as new features are
|
||
added, we do not document its format and do not recommend that you attempt
|
||
to write programs to read it directly. To assist in interchanging drawings
|
||
between AutoCAD and other programs, a "Drawing Interchange" file format
|
||
(DXF(tm)) has been defined. All implementations of AutoCAD accept this
|
||
format and are able to convert it to and from their internal drawing file
|
||
representation.
|
||
|
||
AutoCAD also supports the Initial Graphics Exchange Standard (IGES) file
|
||
format. The information comprising an AutoCAD drawing can be written out
|
||
in IGES format, and IGES files can be read and converted to AutoCAD's
|
||
internal format.
|
||
|
||
|
||
C.1 ASCII Drawing Interchange (DXF) Files
|
||
|
||
This section describes AutoCAD's DXF (drawing interchange) file format and
|
||
the commands provided to read and write these files. DXF files are stan-
|
||
dard ASCII text files. They can easily be translated to the formats of
|
||
other CAD systems, or submitted to other programs for specialized analysis.
|
||
|
||
|
||
C.1.1 DXFOUT Command - Writing a DXF File
|
||
|
||
You can generate a drawing interchange file from an existing drawing by
|
||
means of the Drawing Editor's DXFOUT command. The command format is:
|
||
|
||
Command: DXFOUT File name <default>: (name or RETURN)
|
||
|
||
The default name for the output file is the same as that of the current
|
||
drawing, but with a file type of ".dxf". If you specify an explicit file
|
||
name, do not include a file type; ".dxf" is assumed. If a file with the
|
||
same name already exists, it is deleted. Next, DXFOUT asks what precision
|
||
|
||
1
|
||
AutoCAD Reference Manual
|
||
|
||
you want for floating-point numbers and permits output of a partial DXF
|
||
file containing only selected objects.
|
||
|
||
Enter decimal places of accuracy (0 to 16)/Entities/Binary <6>:
|
||
|
||
The "Binary" option is described later in this appendix. If you respond
|
||
with "Entities" (or just "E"), DXFOUT will ask you to select the objects
|
||
you want written to the DXF file. Only the objects you select will be
|
||
included in the output file - symbol tables (including Block Definitions)
|
||
will not be included. Once you've selected the desired objects, AutoCAD
|
||
will prompt again for the numeric precision:
|
||
|
||
Enter decimal places of accuracy (0 to 16)/Binary <6>:
|
||
|
||
|
||
C.1.2 DXFIN Command - Loading a DXF File
|
||
|
||
A drawing interchange file can be converted into an AutoCAD drawing by
|
||
means of the DXFIN command. First enter the Drawing Editor using the
|
||
"Create new drawing" task from the Main Menu. Then issue the DXFIN com-
|
||
mand.
|
||
|
||
Command: DXFIN File name: (name)
|
||
|
||
Enter the name of the drawing interchange file to be loaded.
|
||
|
||
|
||
Full DXFIN
|
||
|
||
To load a complete DXF file, you must use DXFIN in an empty drawing, before
|
||
any entities have been drawn and before any additional Block definitions,
|
||
layers, linetypes, text styles, named views, named coordinate systems, or
|
||
named viewport configurations have been created. (If your prototype draw-
|
||
ing contains any such items, use Main Menu Task 1's "name=" technique to
|
||
create a new drawing without a prototype.)
|
||
|
||
If any errors are detected during the input, the new drawing is discarded.
|
||
Otherwise, an automatic "ZOOM All" is performed to set the drawing extents.
|
||
|
||
|
||
Partial DXFIN
|
||
|
||
If the current drawing is not empty, DXFIN loads only the ENTITIES section
|
||
of the DXF file, adding the entities found there to the current drawing.
|
||
In this case, DXFIN displays the message:
|
||
|
||
Not a new drawing -- only ENTITIES section will be input.
|
||
|
||
If errors are detected during such partial DXF input, the drawing is
|
||
returned to the state it was in before the DXFIN command. Otherwise, the
|
||
newly added entities are drawn.
|
||
|
||
|
||
|
||
2
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
C.1.3 DXF File Format
|
||
|
||
This section describes the format of a DXF file in detail. It contains a
|
||
great deal of technical information that you need only if you're writing
|
||
your own program to process DXF files. Otherwise, you can skip this sec-
|
||
tion.
|
||
|
||
It would probably be helpful to produce a DXF file from a small drawing,
|
||
print it out, and refer to it occasionally while reading the information
|
||
presented below.
|
||
|
||
|
||
C.1.3.1 General File Structure
|
||
|
||
A Drawing Interchange File is simply an ASCII text file with a file type of
|
||
".dxf" and specially-formatted text. The overall organization of a DXF
|
||
file is as follows:
|
||
|
||
1. HEADER section - General information about the drawing is found in
|
||
this section of the DXF file. Each parameter has a variable name
|
||
and an associated value.
|
||
|
||
2. TABLES section -- This section contains definitions of named
|
||
items.
|
||
|
||
o Linetype (LTYPE) table
|
||
o Layer table
|
||
o Text style (STYLE) table
|
||
o View table
|
||
o User Coordinate System (UCS) table
|
||
o Viewport configuration (VPORT) table
|
||
o Drawing manager (DWGMGR) table (for future use)
|
||
|
||
3. BLOCKS section - This section contains Block Definition entities
|
||
describing the entities comprising each Block in the drawing.
|
||
|
||
4. ENTITIES section - This section contains the drawing entities,
|
||
including any Block References.
|
||
|
||
5. END OF FILE
|
||
|
||
If you use DXFOUT's "Entities" option, the resulting DXF file will contain
|
||
only the ENTITIES and END OF FILE sections, and the ENTITIES section will
|
||
reflect only the objects you select for output.
|
||
|
||
A DXF file is composed of a multiplicity of groups, each of which occupies
|
||
two lines in the DXF file. The first line of a group is a group code,
|
||
which is a positive nonzero integer output in FORTRAN "I3" format (that is,
|
||
right justified and blank filled in a three character field). The second
|
||
line of the group is the group value, in a format which depends on the type
|
||
of the group as specified by the group code.
|
||
|
||
|
||
|
||
3
|
||
AutoCAD Reference Manual
|
||
|
||
The specific assignment of group codes depends upon the item being
|
||
described in the file. However, the type of the value this group supplies
|
||
is derived from the group code in the following way:
|
||
|
||
Group code range Following value
|
||
0 - 9 String
|
||
10 - 59 Floating-point
|
||
60 - 79 Integer
|
||
210 - 239 Floating-point
|
||
999 Comment (string)
|
||
|
||
Thus a program can easily read the value following a group code without
|
||
knowing the particular use of this group in an item in the file. The
|
||
appearance of values in the DXF file is not affected by the setting of the
|
||
UNITS command: coordinates are always represented as decimal (or possibly
|
||
scientific notation if very large) numbers, and angles are always repre-
|
||
sented in decimal degrees with zero degrees to the east of origin.
|
||
|
||
Variables, table entries, and entities are described by a group that intro-
|
||
duces the item, giving its type and/or name, followed by multiple groups
|
||
that supply the values associated with the item. In addition, special
|
||
groups are used for file separators such as markers for the beginning and
|
||
end of sections, tables, and the file itself.
|
||
|
||
Entities, table entries, and file separators are always introduced with a 0
|
||
group code that is followed by a name describing the item.
|
||
|
||
|
||
C.1.3.2 Group Codes
|
||
|
||
Group codes are used both to indicate the type of the value of the group,
|
||
as explained above, and to indicate the general use of the group. The spe-
|
||
cific function of the group code depends on the actual variable, table
|
||
item, or entity description. This section indicates the general use of
|
||
groups, noting as "(fixed)" any that always have the same function.
|
||
|
||
Group code Value type
|
||
0 Identifies the start of an entity, table entry, or file
|
||
separator. The text value that follows indicates which.
|
||
1 The primary text value for an entity.
|
||
2 A name; Attribute tag, Block name, etc.
|
||
3-4 Other textual or name values.
|
||
5 Entity handle expressed as a hexadecimal string.
|
||
6 Line type name (fixed).
|
||
7 Text style name (fixed).
|
||
8 Layer name (fixed).
|
||
9 Variable name identifier (used only in HEADER section of
|
||
the DXF file).
|
||
10 Primary X coordinate (start point of a Line or Text
|
||
entity, center of a Circle, etc.).
|
||
11-18 Other X coordinates.
|
||
continued ...
|
||
|
||
|
||
4
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
Group code Value type
|
||
20 Primary Y coordinate. 2n values always correspond to 1n
|
||
values and immediately follow them in the file.
|
||
21-28 Other Y coordinates.
|
||
30 Primary Z coordinate. 3n values always correspond to 1n
|
||
and 2n values and immediately follow them in the file.
|
||
31-37 Other Z coordinates.
|
||
38 This entity's elevation if nonzero (fixed). Output only
|
||
if system variable FLATLAND is set to 1.
|
||
39 This entity's thickness if nonzero (fixed).
|
||
40-48 Floating-point values (text height, scale factors, etc.).
|
||
49 Repeated value - multiple 49 groups may appear in one
|
||
entity for variable length tables (such as the dash
|
||
lengths in the LTYPE table). A 7x group always appears
|
||
before the first 49 group to specify the table length.
|
||
50-58 Angles.
|
||
62 Color number (fixed).
|
||
66 "Entities follow" flag (fixed).
|
||
70-78 Integer values, such as repeat counts, flag bits, or
|
||
modes.
|
||
210, 220, 230 X, Y, and Z components of extrusion direction.
|
||
999 Comments
|
||
|
||
|
||
C.1.4 Comments
|
||
|
||
The 999 group code indicates that the following line is a comment string.
|
||
DXFOUT does not currently include such groups in its output file, but DXFIN
|
||
honors them and ignores the comments. Thus, you can use the 999 group to
|
||
include comments in a DXF file you've edited. For example:
|
||
|
||
999
|
||
This is a comment.
|
||
999
|
||
This is another comment.
|
||
|
||
|
||
C.1.5 File Sections
|
||
|
||
The DXF file is subdivided into four sections. File separator groups are
|
||
used to delimit these file sections. The following is an example of a void
|
||
DXF file with only the section markers and table headers present.
|
||
|
||
0 (Begin HEADER section)
|
||
SECTION
|
||
2
|
||
HEADER
|
||
<<<<Header variable items go here>>>>
|
||
0
|
||
ENDSEC (End HEADER section)
|
||
0 (Begin TABLES section)
|
||
SECTION
|
||
2
|
||
|
||
5
|
||
AutoCAD Reference Manual
|
||
|
||
TABLES
|
||
0
|
||
TABLE
|
||
2
|
||
VPORT
|
||
70
|
||
(viewport table maximum item count)
|
||
<<<<viewport table items go here>>>>
|
||
0
|
||
ENDTAB
|
||
0
|
||
TABLE
|
||
2
|
||
LTYPE, LAYER, STYLE, VIEW, UCS, or DWGMGR
|
||
70
|
||
(Table maximum item count)
|
||
<<<<Table items go here>>>>
|
||
0
|
||
ENDTAB
|
||
0
|
||
ENDSEC (End TABLES section)
|
||
0 (Begin BLOCKS section)
|
||
SECTION
|
||
2
|
||
BLOCKS
|
||
<<<<Block definition entities go here>>>>
|
||
0
|
||
ENDSEC (End BLOCKS section)
|
||
0 (Begin ENTITIES section)
|
||
SECTION
|
||
2
|
||
ENTITIES
|
||
<<<<Drawing entities go here>>>>
|
||
0
|
||
ENDSEC (End ENTITIES section)
|
||
0
|
||
EOF (End of file)
|
||
|
||
|
||
C.1.5.1 HEADER Section
|
||
|
||
The HEADER section of the DXF file contains settings of variables
|
||
associated with the drawing. These variables are set with various commands
|
||
and are the type of information displayed by the STATUS command. Each
|
||
variable is specified in the header section by a 9 group giving its name,
|
||
followed by groups that supply its value. The header variables, the groups
|
||
that follow, and their meanings are listed below.
|
||
|
||
Although this list is very similar to the list of system variables in
|
||
Appendix A, the two lists are not identical. Be sure you're referring to
|
||
the proper list.
|
||
|
||
|
||
|
||
6
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
$ACADVER 1 the AutoCAD drawing database version number.
|
||
$ANGBASE 50 Angle 0 direction.
|
||
$ANGDIR 70 1=clockwise angles, 0=counterclockwise.
|
||
$ATTDIA 70 Attribute entry dialogues, 1 = on, 0 = off
|
||
$ATTMODE 70 Attribute visibility: 0=none, 1=normal, 2=all.
|
||
$ATTREQ 70 Attribute prompting during INSERT, 1 = on, 0 = off
|
||
$AUNITS 70 UNITS format for angles.
|
||
$AUPREC 70 UNITS precision for angles.
|
||
$AXISMODE 70 axis on if nonzero.
|
||
$AXISUNIT 10,20 axis X and Y tick spacing.
|
||
$BLIPMODE 70 blip mode on if nonzero.
|
||
$CECOLOR 62 entity color number; 0 = BYBLOCK, 256 = BYLAYER.
|
||
$CELTYPE 6 entity linetype name, or BYBLOCK or BYLAYER.
|
||
$CHAMFERA 40 first chamfer distance.
|
||
$CHAMFERB 40 second chamfer distance.
|
||
$CLAYER 8 current layer name.
|
||
$COORDS 70 0=static coordinate display, 1=continuous update,
|
||
2="d<a" format.
|
||
$DIMALT 70 alternate unit dimensioning performed if nonzero.
|
||
$DIMALTD 70 alternate unit decimal places.
|
||
$DIMALTF 40 alternate unit scale factor.
|
||
$DIMAPOST 1 alternate dimensioning suffix
|
||
$DIMASO 70 1=create associative dimensioning, 0=draw
|
||
individual entities.
|
||
$DIMASZ 40 dimensioning arrow size.
|
||
$DIMBLK 2 arrow block name.
|
||
$DIMBLK1 1 first arrow block name.
|
||
$DIMBLK2 1 second arrow block name.
|
||
$DIMCEN 40 size of center mark/lines.
|
||
$DIMDLE 40 dimension line extension.
|
||
$DIMDLI 40 dimension line increment.
|
||
$DIMEXE 40 extension line extension.
|
||
$DIMEXO 40 extension line offset.
|
||
$DIMLFAC 40 linear measurements scale factor.
|
||
$DIMLIM 70 dimension limits generated if nonzero.
|
||
$DIMPOST 1 general dimensioning suffix
|
||
$DIMRND 40 rounding value for dimension distances.
|
||
$DIMSAH 70 use separate arrow blocks if nonzero.
|
||
$DIMSCALE 40 overall dimensioning scale factor.
|
||
$DIMSE1 70 first extension line suppressed if nonzero.
|
||
$DIMSE2 70 second extension line suppressed if nonzero.
|
||
$DIMSHO 70 1=Recompute dimensions while dragging,
|
||
0=drag original image.
|
||
$DIMSOXD 70 suppress outside-extensions dimension lines
|
||
if nonzero.
|
||
$DIMTAD 70 text above dimension line if nonzero.
|
||
$DIMTIH 70 text inside horizontal if nonzero.
|
||
$DIMTIX 70 force text inside extensions if nonzero.
|
||
$DIMTM 40 minus tolerance.
|
||
$DIMTOFL 70 if text outside extensions, force line between
|
||
extensions if nonzero.
|
||
$DIMTOH 70 text outside horizontal if nonzero.
|
||
|
||
|
||
7
|
||
AutoCAD Reference Manual
|
||
|
||
$DIMTOL 70 dimension tolerances generated if nonzero.
|
||
$DIMTP 40 plus tolerance.
|
||
$DIMTSZ 40 dimensioning tick size: 0=no ticks.
|
||
$DIMTVP 40 text vertical position.
|
||
$DIMTXT 40 dimensioning text height.
|
||
$DIMZIN 70 zero suppression for "feet & inch" dimensions.
|
||
$DRAGMODE 70 0=off, 1=on, 2=auto.
|
||
$ELEVATION 40 current elevation set by ELEV command.
|
||
$EXTMAX 10,20,30 XY drawing extents upper right corner (in WCS).
|
||
$EXTMIN 10,20,30 XY drawing extents lower left corner (in WCS).
|
||
$FILLETRAD 40 fillet radius.
|
||
$FILLMODE 70 FILL mode on if nonzero.
|
||
$FLATLAND 70 force compatibility with older versions if nonzero.
|
||
$HANDLING 70 handles enabled if nonzero.
|
||
$HANDSEED 5 next available handle.
|
||
$INSBASE 10,20,30 insertion base set by BASE command (in WCS).
|
||
$LIMCHECK 70 nonzero if limits checking is on.
|
||
$LIMMAX 10,20 XY drawing limits upper right corner (in WCS).
|
||
$LIMMIN 10,20 XY drawing limits lower left corner (in WCS).
|
||
$LTSCALE 40 global linetype scale.
|
||
$LUNITS 70 UNITS format for coordinates and distances.
|
||
$LUPREC 70 UNITS precision for coordinates and distances.
|
||
$MENU 1 name of menu file.
|
||
$MIRRTEXT 70 MIRROR text if nonzero.
|
||
$ORTHOMODE 70 ORTHO mode on if nonzero.
|
||
$OSMODE 70 running object snap modes.
|
||
$PDMODE 70 point display mode.
|
||
$PDSIZE 40 point display size.
|
||
$PLINEWID 40 default Polyline width.
|
||
$QTEXTMODE 70 quick text mode on if nonzero.
|
||
$REGENMODE 70 REGENAUTO mode on if nonzero.
|
||
$SKETCHINC 40 sketch record increment.
|
||
$SKPOLY 70 0=sketch lines, 1=sketch polylines.
|
||
$SPLFRAME 70 spline control polygon display, 1 = on, 0 = off.
|
||
$SPLINESEGS 70 number of line segments per spline patch.
|
||
$SPLINETYPE 70 spline curve type for "PEDIT Spline"
|
||
(see Appendix A).
|
||
$SURFTAB1 70 number of mesh tabulations in first direction.
|
||
$SURFTAB2 70 number of mesh tabulations in second direction.
|
||
$SURFTYPE 70 surface type for "PEDIT Smooth" (see Appendix A).
|
||
$SURFU 70 surface density (for "PEDIT Smooth") in M direction.
|
||
$SURFV 70 surface density (for "PEDIT Smooth") in N direction.
|
||
$TDCREATE 40 date/time of drawing creation.
|
||
$TDINDWG 40 cumulative editing time for this drawing.
|
||
$TDUPDATE 40 date/time of last drawing update.
|
||
$TDUSRTIMER 40 user elapsed timer.
|
||
$TEXTSIZE 40 default text height.
|
||
$TEXTSTYLE 7 current text style name.
|
||
$THICKNESS 40 current thickness set by ELEV command.
|
||
$TRACEWID 40 default Trace width.
|
||
$UCSNAME 1 Name of current UCS.
|
||
$UCSORG 10,20,30 origin of current UCS (in WCS).
|
||
|
||
|
||
8
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
$UCSXDIR 10,20,30 direction of current UCS's X axis
|
||
(in World coordinates).
|
||
$UCSYDIR 10,20,30 direction of current UCS's Y axis
|
||
(in World coordinates).
|
||
$USERI1 - 5 70 Five integer variables intended for use by
|
||
third-party developers.
|
||
$USERR1 - 5 40 Five real variables intended for use by
|
||
third-party developers.
|
||
$USRTIMER 70 0=timer off, 1=timer on.
|
||
$WORLDVIEW 70 1=set UCS to WCS during DVIEW/VPOINT,
|
||
0=don't change UCS
|
||
|
||
The header variables listed below existed prior to AutoCAD Release 10 but
|
||
now have independent settings for each active viewport. They are not
|
||
output by DXFOUT unless system variable FLATLAND is set to 1. DXFIN honors
|
||
these variables when read from DXF files, but if a VPORT symbol table with
|
||
"*ACTIVE" entries is present (as is true for any DXF file produced by
|
||
Release 10 or higher), the values in the VPORT table entries will override
|
||
the values of these header variables.
|
||
|
||
$FASTZOOM 70 fast zoom enabled if nonzero.
|
||
$GRIDMODE 70 grid mode on if nonzero.
|
||
$GRIDUNIT 10,20 grid X and Y spacing.
|
||
$SNAPANG 50 snap grid rotation angle.
|
||
$SNAPBASE 10,20 snap/grid base point (in UCS).
|
||
$SNAPISOPAIR 70 isometric plane: 0=left, 1=top, 2=right.
|
||
$SNAPMODE 70 snap mode on if nonzero.
|
||
$SNAPSTYLE 70 snap style: 0=standard, 1=isometric.
|
||
$SNAPUNIT 10,20 snap grid X and Y spacing.
|
||
$VIEWCTR 10,20 XY center of current view on screen.
|
||
$VIEWDIR 10,20,30 viewing direction (direction from target, in WCS).
|
||
$VIEWSIZE 40 height of view.
|
||
|
||
The date/time variables ($TDCREATE and $TDUPDATE) are output as real num-
|
||
bers in the format:
|
||
|
||
<Julian date>.<Fraction>
|
||
|
||
The elapsed time variables ($TDINDWG and $TDUSRTIMER) have a similar
|
||
format:
|
||
|
||
<Number of days>.<Fraction>
|
||
|
||
|
||
C.1.5.2 TABLES Section
|
||
|
||
The TABLES section contains several tables, each of which in turn contains
|
||
a variable number of table entries. The order of the tables may change, but
|
||
the LTYPE table will always precede the LAYER table. Each table is intro-
|
||
duced with a 0 group with the label "TABLE". This is followed by a 2 group
|
||
identifying the particular table (VPORT, LTYPE, LAYER, STYLE, VIEW, UCS, or
|
||
DWGMGR) and a 70 group that specifies the maximum number of table entries
|
||
|
||
9
|
||
AutoCAD Reference Manual
|
||
|
||
that may follow. The tables in a drawing may contain deleted items, but
|
||
these are not written to the DXF file. Thus, fewer table entries may
|
||
follow the table header than are indicated by the 70 group, so don't use
|
||
the count in the 70 group as an index to read in the table. It is provided
|
||
so that your program to read DXF files can allocate an array in advance
|
||
large enough to hold all the table entries that follow.
|
||
|
||
Following this header for each table are the table entries. Each table
|
||
item consists of a 0 group identifying the item type (same as table name,
|
||
e.g., "LTYPE" or "LAYER"), a 2 group giving the name of the table entry, a
|
||
70 group specifying flags relevant to the table entry (defined for each
|
||
table below), and additional groups that give the value of the table entry.
|
||
The end of each table is indicated by a 0 group with the value "ENDTAB".
|
||
|
||
If any table entry has bit value 64 set in its group 70 flags, the table
|
||
entry was referenced by at least one entity in the drawing the last time
|
||
the drawing editor was entered to edit this drawing. This "referenced"
|
||
flag is for the benefit of the PURGE command; it can be ignored by most
|
||
programs that read DXF files, and need not be set by programs that write
|
||
DXF files.
|
||
|
||
The following are the groups used for each type of table item. All groups
|
||
are present for each table item.
|
||
|
||
LTYPE 3 (descriptive text for linetype), 72 (alignment code), 73
|
||
(number of dash length items), 40 (total pattern length), 49
|
||
(dash length 1), 49 (dash length 2), . . .
|
||
|
||
LAYER 62 (color number, negative if layer is off), 6 (linetype
|
||
name). The 1 bit is set in the 70 group flags if the layer is
|
||
frozen.
|
||
|
||
STYLE 40 (fixed text height; 0 if not fixed), 41 (width factor), 50
|
||
(obliquing angle), 71 (text generation flags), 42 (last height
|
||
used), 3 (primary font file name), 4 ("bigfont" file name;
|
||
blank if none). If the third bit (4) is set in the 70 group
|
||
flags, this is a vertically-oriented text style.
|
||
|
||
A STYLE table item is used to record shape file LOAD requests
|
||
also. In this case the first bit (1) is set in the 70 group
|
||
flags and only the 3 group (shape file name) is meaningful
|
||
(all the other groups are output, however).
|
||
|
||
The "text generation flags" are a bit-coded field with the
|
||
following bit meanings:
|
||
|
||
Flag bit value Meaning
|
||
2 Text is backwards (mirrored in X)
|
||
4 Text is upside down (mirrored in Y)
|
||
|
||
|
||
|
||
|
||
|
||
10
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
VIEW 40 and 41 (view height and width), 10 and 20 (view center
|
||
point), 11, 21, 31 (view direction from target, in WCS), 12,
|
||
22, 32 (target point, in WCS), 42 (lens length), 43 and 44
|
||
(front and back clipping planes-offsets from target point), 50
|
||
(twist angle), 71 view mode (see VIEWMODE system variable
|
||
Appendix A).
|
||
|
||
UCS 10, 20, 30 (origin), 11, 21, 31 (X axis direction), 12, 22, 32
|
||
(Y axis direction). All in World coordinates.
|
||
|
||
VPORT 10 and 20 (lower left corner of viewport; 0.0 to 1.0), 11 and
|
||
21 (upper right corner), 12 and 22 (view center point), 13 and
|
||
23 (snap base point), 14 and 24 (snap spacing, X and Y), 15
|
||
and 25 (grid spacing, X and Y), 16, 26, 36 (view direction
|
||
from target point), 17, 27, 37 (view target point), 40 (view
|
||
height), 41 (viewport aspect ratio), 42 (lens length), 43 and
|
||
44 (front and back clipping planes; offsets from target
|
||
point), 50 (snap rotation angle), 51 (view twist angle), 71
|
||
(view mode; see VIEWMODE system variable in Appendix A), 72
|
||
(circle zoom percent), 73 (fast zoom setting), 74 (UCSICON
|
||
setting), 75 (snap on/off), 76 (grid on/off), 77 (snap style),
|
||
78 (snap isopair).
|
||
|
||
The VPORT table is unique in that it may contain several
|
||
entries with the same name (indicating a multiple-viewport
|
||
configuration). The entries corresponding to the active view-
|
||
port configuration all have the name "*ACTIVE". The first
|
||
such entry describes the current viewport.
|
||
|
||
DWGMGR For future use. Fields not yet defined.
|
||
|
||
|
||
C.1.5.3 BLOCKS Section
|
||
|
||
The BLOCKS section of the DXF file contains all the Block Definitions.
|
||
This section contains the entities that make up the Blocks used in the
|
||
drawing, including "anonymous" Blocks generated by the HATCH command and by
|
||
associative dimensioning. The format of the entities in this section is
|
||
identical to those in the ENTITIES section described below, so refer to
|
||
that section for details. All entities in the BLOCKS section appear
|
||
between BLOCK and ENDBLK entities. BLOCK and ENDBLK entities appear only
|
||
in the BLOCKS section. Block definitions are never nested (that is, no
|
||
BLOCK or ENDBLK entity ever appears within another BLOCK-ENDBLK pair).
|
||
|
||
|
||
C.1.5.4 ENTITIES Section
|
||
|
||
Entity items appear in both the BLOCK and ENTITIES sections of the DXF
|
||
file. The appearance of entities in the two sections is identical, with
|
||
the exception that entities in the BLOCK section never have handles. The
|
||
following gives the format of each entity as it appears in the file. Some
|
||
groups that define an entity always appear, and some are optional and
|
||
appear only if they differ from their default values. In the following
|
||
|
||
11
|
||
AutoCAD Reference Manual
|
||
|
||
discussion, groups that always occur are given by their group number and
|
||
function, while optional groups are indicated by "-optional N" following
|
||
the group description. "N" is the default value if the group is omitted.
|
||
|
||
Programs that read DXF files should not assume that the groups describing
|
||
an entity occur in the order given here. The end of the groups that make
|
||
up an entity is indicated by the next 0 group, beginning the next entity or
|
||
indicating the end of the section.
|
||
|
||
Remember that a DXF file is a complete representation of the drawing data-
|
||
base, and that as AutoCAD is further enhanced, new groups will be added to
|
||
entities to accommodate additional features. Writing your DXF processing
|
||
program in a table-driven way, making no assumptions about the order of
|
||
groups in an entity, and ignoring any groups not presently defined, will
|
||
make it much easier to accommodate DXF files from future releases of
|
||
AutoCAD.
|
||
|
||
Each entity begins with a 0 group identifying the entity type. The names
|
||
used for the entities are given in the table that follows. Every entity
|
||
contains an 8 group that gives the name of the layer on which the entity
|
||
resides. Each entity may have elevation, thickness, linetype, or color
|
||
information associated with it. If handles are enabled, every entity has a
|
||
5 group containing its handle (as a string representing a hexadecimal
|
||
number). The following groups are included only if the entity has nonde-
|
||
fault values for these properties.
|
||
|
||
Group code Meaning
|
||
6 Linetype name (if not "BYLAYER"). The special name "BYBLOCK"
|
||
indicates a floating linetype.
|
||
|
||
38 Elevation (if nonzero). Output only if system variable
|
||
FLATLAND is 1. Otherwise, Z coordinates are supplied as
|
||
3x-groups as part of each of the entity's defining points.
|
||
|
||
39 Thickness (if nonzero).
|
||
|
||
62 Color number (if not "BYLAYER"). Zero indicates the
|
||
"BYBLOCK" (floating) color.
|
||
|
||
210, These groups are included for each Line, Point, Circle, Shape,
|
||
220, Text, Arc, Trace, Solid, Block Reference, Polyline, Dimension,
|
||
230 Attribute, and Attribute Definition entity if its extrusion
|
||
direction is not parallel to the World Z axis. The indicate
|
||
the X, Y, and Z components of the entity's extrusion direction.
|
||
|
||
The rest of the groups that make up an entity item are described below.
|
||
Many of the entities include "flag" groups. These are integer codes (6x or
|
||
7x groups) that encode various pieces of information regarding the entity,
|
||
and are specific to the particular entity type. In the following descrip-
|
||
tions, the term "bit-coded" means that the flag contains various true/false
|
||
values coded as the sum of the bit values given. Any bits not defined in
|
||
the following section should be ignored in these fields and set to zero
|
||
when constructing a DXF file.
|
||
|
||
12
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
LINE 10, 20, 30 (start point), 11, 21, 31 (end point).
|
||
|
||
POINT 10, 20, 30 (point), 50 (angle of X axis for the UCS in effect
|
||
when the Point was drawn -optional 0, for use when PDMODE is
|
||
nonzero).
|
||
|
||
CIRCLE 10, 20, 30 (center), 40 (radius).
|
||
|
||
ARC 10, 20, 30 (center), 40 (radius), 50 (start angle), 51 (end
|
||
angle).
|
||
|
||
TRACE Four points defining the corners of the trace: (10, 20, 30),
|
||
(11, 21, 31), (12, 22, 32), and (13, 23, 33).
|
||
|
||
SOLID Four points defining the corners of the solid: (10, 20, 30),
|
||
(11, 21, 31), (12, 22, 32), and (13, 23, 33). If only three
|
||
points were entered (forming a triangular solid), the third
|
||
and fourth points will be the same.
|
||
|
||
TEXT 10, 20, 30 (insertion point), 40 (height), 1 (text value), 50
|
||
(rotation angle -optional 0), 41 (relative X scale factor
|
||
-optional 1), 51 (obliquing angle -optional 0), 7 (text style
|
||
name -optional "STANDARD"), 71 (text generation flags
|
||
-optional 0), 72 (justification type -optional 0), 11, 21, 31
|
||
(alignment point -optional, appears only if 72 group is
|
||
present and nonzero).
|
||
|
||
The "text generation flags" are a bit-coded field with mean-
|
||
ings as follows:
|
||
|
||
Flag bit value Meaning
|
||
2 Text is backwards (mirrored in X)
|
||
4 Text is upside down (mirrored in Y)
|
||
|
||
The "justification type" value (not bit-coded) indicates the
|
||
text justification style used on this entity, as shown in the
|
||
following table.
|
||
|
||
Value Meaning
|
||
0 Text is left justified
|
||
1 Text is centered along its baseline
|
||
2 Text is right justified
|
||
3 Text is aligned between two points (height varies)
|
||
4 Text is "middle" (fully) centered
|
||
5 Text is fit between two points (width varies)
|
||
|
||
If the justification is anything other than 0 (left justi-
|
||
fied), 11, 21, and 31 groups will also appear in the entity
|
||
to specify the alignment point of the text (center, right-
|
||
most, or second alignment point).
|
||
|
||
DXFOUT handles ASCII control characters in text strings by
|
||
expanding the character into a "^" (caret) followed by the
|
||
|
||
13
|
||
AutoCAD Reference Manual
|
||
|
||
appropriate letter. For example, an ASCII Control-G (BEL,
|
||
decimal code 7) is output as "^G". If the text itself con-
|
||
tains a caret character, it is expanded to "^ " (caret,
|
||
space). DXFIN performs the complementary conversion.
|
||
|
||
SHAPE 10, 20, 30 (insertion point), 40 (size), 2 (shape name), 50
|
||
(rotation angle -optional 0), 41 (relative X scale factor
|
||
-optional 1), 51 (obliquing angle -optional 0).
|
||
|
||
BLOCK 2 (Block name), 70 (Block type flags), 10, 20, 30 (Block base
|
||
point). Appears only in BLOCKS section. The "Block type
|
||
flags" are bit-coded, with the following bit meanings:
|
||
|
||
Flag bit value Meaning
|
||
1 This is an "anonymous" Block generated by
|
||
hatching, associative dimensioning, or
|
||
other internal operations.
|
||
2 This Block has Attributes.
|
||
|
||
ENDBLK No groups. Appears only in BLOCKS section.
|
||
|
||
INSERT 66 ("Attributes follow" flag -optional 0), 2 (Block name),
|
||
10, 20, 30 (insertion point), 41 (X scale factor -optional
|
||
1), 42 (Y scale factor -optional 1), 43 (Z scale factor
|
||
-optional 1), 50 (rotation angle -optional 0), 70 and 71
|
||
(column and row counts -optional 1), 44 and 45 (column and
|
||
row spacing -optional 0).
|
||
|
||
If the value of the "Attributes follow" flag is 1, a series
|
||
of Attribute (ATTRIB) entities is expected to follow the
|
||
INSERT, terminated by a sequence end (SEQEND) entity.
|
||
|
||
ATTDEF 10, 20, 30 (text start), 40 (text height), 1 (default value,
|
||
see TEXT above for handling of ASCII control characters), 3
|
||
(prompt string), 2 (tag string), 70 (Attribute flags), 73
|
||
(field length -optional 0), 50 (text rotation -optional 0),
|
||
41 (relative X scale factor -optional 1), 51 (obliquing angle
|
||
-optional 0), 7 (text style name -optional "STANDARD"), 71
|
||
(text generation flags -optional 0, see TEXT above), 72 (text
|
||
justification type -optional 0, see TEXT above)), 11, 21, 31
|
||
(alignment point -optional, appears only if 72 group is
|
||
present and nonzero).
|
||
|
||
The "Attribute flags" are a bit-coded field in which the bits
|
||
have the following meanings:
|
||
|
||
Flag bit value Meaning
|
||
1 Attribute is invisible (does not display)
|
||
2 This is a constant Attribute
|
||
4 Verification is required on input of this
|
||
Attribute.
|
||
8 Attribute is preset (no prompt during
|
||
insertion)
|
||
|
||
14
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
ATTRIB 10, 20, 30 (text start), 40 (text height), 1 (value, see TEXT
|
||
above for handling of ASCII control characters), 2 (Attribute
|
||
tag), 70 (Attribute flags; see ATTDEF above), 73 (field
|
||
length -optional 0), 50 (text rotation -optional 0), 41 (rel-
|
||
ative X scale factor -optional 1), 51 (obliquing angle
|
||
-optional 0), 7 (text style name -optional "STANDARD"), 71
|
||
(text generation flags -optional 0, see TEXT above), 72 (text
|
||
justification type -optional 0, see TEXT above), 11, 21, 31
|
||
(alignment point -optional, appears only if 72 group is
|
||
present and nonzero).
|
||
|
||
POLYLINE 66 ("vertices follow flag"), 70 (Polyline flags), 40 (default
|
||
starting width), 41 (default ending width), 71 and 72 (poly-
|
||
gon mesh M and N vertex counts -optional 0), 73 and 74
|
||
(smooth surface M and N densities -optional 0), 75 (smooth
|
||
surface type -optional 0). The default widths apply to any
|
||
vertex that doesn't supply widths (see below).
|
||
|
||
The "vertices follow" flag is always 1, indicating that a
|
||
series of VERTEX entities is expected to follow the POLYLINE,
|
||
terminated by a sequence end (SEQEND) entity. The "polyline
|
||
flags" group is a bit-coded field with bits defined as fol-
|
||
lows:
|
||
|
||
Flag bit value Meaning
|
||
1 This is a closed Polyline (or a polygon
|
||
mesh closed in the M direction)
|
||
2 Curve-fit vertices have been added
|
||
4 Spline-fit vertices have been added
|
||
8 This is a 3D Polyline
|
||
16 This is a 3D polygon mesh. Group 75 indi-
|
||
cates the smooth surface type, as follows:
|
||
|
||
0 = no smooth surface fitted
|
||
5 = quadratic B-spline surface
|
||
6 = cubic B-spline surface
|
||
8 = Bezier surface
|
||
|
||
32 The polygon mesh is closed in the N direc-
|
||
tion
|
||
|
||
VERTEX 10, 20, 30 (location), 40 (starting width -optional, see
|
||
above), 41 (ending width -optional, see above), 42 (bulge),
|
||
70 (vertex flags), 50 (curve fit tangent direction
|
||
-optional). The bulge is the tangent of 1/4 the included
|
||
angle for an arc segment, made negative if the arc goes
|
||
clockwise from the start point to the end point; a bulge of 0
|
||
indicates a straight segment, and a bulge of 1 is a semicir-
|
||
cle. The meanings of the bit-coded "vertex flags" are shown
|
||
in the following table.
|
||
|
||
|
||
|
||
|
||
15
|
||
AutoCAD Reference Manual
|
||
|
||
Flag bit value Meaning
|
||
1 Extra vertex created by curve fitting
|
||
2 Curve fit tangent defined for this vertex.
|
||
A curve fit tangent direction of 0 may be
|
||
omitted from the DXF output, but is signif-
|
||
icant if this bit is set.
|
||
4 Unused (never set in DXF files)
|
||
8 Spline vertex created by spline fitting
|
||
16 Spline frame control point
|
||
32 3D Polyline vertex
|
||
64 3D polygon mesh vertex
|
||
|
||
SEQEND No fields. This entity marks the end of vertices (VERTEX
|
||
type name) for a Polyline, or the end of Attribute entities
|
||
(ATTRIB type name) for an INSERT entity that has Attributes
|
||
(indicated by 66 group present and nonzero in INSERT entity).
|
||
|
||
3DLINE 10, 20, 30 (start point), 11, 21, 31 (end point).
|
||
|
||
3DFACE Four points defining the corners of the face: (10, 20, 30),
|
||
(11, 21, 31), (12, 22, 32), and (13, 23, 33). 70 (invisible
|
||
edge flags -optional 0). If only three points were entered
|
||
(forming a triangular face), the third and fourth points will
|
||
be the same. The meanings of the bit-coded "invisible edge
|
||
flags" are shown in the following table.
|
||
|
||
Flag bit value Meaning
|
||
1 First edge is invisible
|
||
2 Second edge is invisible
|
||
4 Third edge is invisible
|
||
8 Fourth edge is invisible
|
||
|
||
DIMENSION 2 (name of pseudo-Block containing the current dimension pic-
|
||
ture), 10, 20, 30 (definition point for all dimension types),
|
||
11, 21, 31 (middle point of dimension text), 12, 22, 32
|
||
(insertion point for clones of a dimension (for BASELINE and
|
||
CONTINUE), 70 (Dimension type; 0=rotated, horizontal, or ver-
|
||
tical; 1=aligned; 2=angular; 3=diameter; 4=radius - the value
|
||
128 is added to this field if the dimension text has been
|
||
positioned at a user-defined location rather than at the
|
||
default location), 1 (dimension text explicitly entered by
|
||
the user. If null, the dimension measurement is drawn as the
|
||
text. Otherwise, this text is drawn (but if it includes the
|
||
sequence "<>", the dimension measurement is drawn in place of
|
||
the "<>")), 13, 23, 33 (definition point for linear and angu-
|
||
lar dimensions), 14, 24, 34 (definition point for linear and
|
||
angular dimensions), 15, 25, 35 (definition point for diame-
|
||
ter, radius, and angular dimensions), 16, 26, 36 (point
|
||
defining dimension arc for angular dimensions), 40 (leader
|
||
length for radius and diameter dimensions), 50 (angle of
|
||
rotated, horizontal, or vertical linear dimensions).
|
||
|
||
|
||
|
||
16
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
In addition, all dimension types have an optional group (code
|
||
51) that indicates the "horizontal" direction for the Dimen-
|
||
sion entity. This determines the orientation of dimension
|
||
text and dimension lines for horizontal, vertical and rotated
|
||
linear dimensions. The group value is the negative of the
|
||
ECS angle of the UCS X axis in effect when the Dimension was
|
||
drawn. In other words, the X axis of the UCS in effect when
|
||
the Dimension was drawn is always parallel to the XY plane
|
||
for the Dimension's ECS, and the angle between the UCS X axis
|
||
and the ECS X axis is a single 2D angle. The value in group
|
||
51 is the angle from "horizontal" (the effective X axis) to
|
||
the ECS X axis. Entity Coordinate Systems (ECS) are
|
||
described later in this section.
|
||
|
||
For all dimension types, the following groups represent 3D
|
||
WCS points, regardless of the FLATLAND setting.
|
||
|
||
10, 20, 30
|
||
13, 23, 33
|
||
14, 24, 34
|
||
15, 25, 35
|
||
|
||
For all dimension types, the following groups represent ECS
|
||
points, and are 2D or 3D depending on the FLATLAND setting.
|
||
|
||
11, 21(, 31)
|
||
12, 22(, 32)
|
||
16, 26(, 36)
|
||
|
||
Linear (13,23,33) The point used to specify the first extension line.
|
||
(14,24,34) The point used to specify the second extension line.
|
||
(10,20,30) The point used to specify the dimension line.
|
||
|
||
Angular (13,23,33) and (14,24,34) The endpoints of the first line
|
||
(10,20,30) and (15,25,35) The endpoints of the second line
|
||
(16,26,36) The point used to specify the dimen-
|
||
sion line arc
|
||
|
||
Diameter (15,25,35) The point used to pick the circle/arc to dimension
|
||
(10,20,30) The point on that circle directly across from the
|
||
pick point.
|
||
|
||
Radius (15,25,35) The point used to pick the circle/arc to dimension
|
||
(10,20,30) The center of that circle.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
17
|
||
AutoCAD Reference Manual
|
||
|
||
Entity Coordinate Systems (ECS)
|
||
|
||
To save space in the drawing database (and in the DXF file), the points
|
||
associated with each entity are expressed in terms of its own Entity Coor-
|
||
dinate System (ECS). The Entity Coordinate System allows AutoCAD to use a
|
||
much more compact means of representation for entities. With ECS, the only
|
||
additional information needed to describe its position in 3D space is the
|
||
3D vector describing the Z axis of the ECS, and the elevation value.
|
||
|
||
For a given Z axis (or extrusion) direction, there is an infinite number of
|
||
coordinate systems, defined by translating the origin in 3D space and by
|
||
rotating the X and Y axes around the Z axis. However, for the same Z axis
|
||
direction, there is only one Entity Coordinate System. It has the follow-
|
||
ing properties:
|
||
|
||
o Its origin coincides with the WCS origin.
|
||
o The orientation of the X and Y axes within the XY plane are calcu-
|
||
lated in an arbitrary, but consistent manner. AutoCAD performs
|
||
this calculation using the "arbitrary axis" algorithm described
|
||
below.
|
||
|
||
For some entities, the ECS is equivalent to the World Coordinate System and
|
||
all points (DXF groups 10-37) are expressed in World coordinates. See the
|
||
following table.
|
||
|
||
Entities Notes
|
||
LINE, POINT, 3DFACE, 3D These entities do not lie in
|
||
Polyline, 3D Vertex, 3D a particular plane. All
|
||
Mesh, 3D Mesh vertex points are expressed in
|
||
World coordinates. Of these
|
||
entities, only Lines and
|
||
Points can be extruded;
|
||
their extrusion direction can
|
||
differ from the World Z axis.
|
||
|
||
CIRCLE, ARC, SOLID, TRACE, These entities are planar in
|
||
TEXT, ATTRIB, ATTDEF, SHAPE, nature. All points are
|
||
INSERT, 2D Polyline, 2D expressed in Entity coordi-
|
||
Vertex nates. All these entities
|
||
can be extruded; their
|
||
extrusion direction can
|
||
differ from the World Z axis.
|
||
|
||
DIMENSION Some of a Dimension's points are
|
||
expressed in WCS, and some in ECS.
|
||
|
||
Others The remaining entities have
|
||
no point data and their
|
||
coordinate systems are
|
||
therefore irrelevant.
|
||
|
||
Once AutoCAD has established the ECS for a given entity, here's how it
|
||
works:
|
||
|
||
18
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
o The elevation value stored with an entity indicates how far along
|
||
the Z axis to shift the XY plane from the WCS origin to make it
|
||
coincide with the plane that the entity is in. How much of this
|
||
is the user-defined elevation is unimportant.
|
||
o Any 2D points describing the entity that were entered through the
|
||
UCS are transformed into the corresponding 2D points in the ECS,
|
||
which (more often than not) is shifted and rotated with respect to
|
||
the UCS.
|
||
|
||
A few ramifications of this process are:
|
||
|
||
o You can not reliably find out what UCS was in effect when an
|
||
entity was acquired. You can only find out where the entity is in
|
||
the current UCS if the current UCS has the same Z axis direction
|
||
as the original UCS (i.e., they both reduce to the same ECS).
|
||
o When you enter the XY coordinates of an entity in a given UCS and
|
||
then do a DXFOUT, you probably won't recognize those XY coordi-
|
||
nates in the DXF file. You'll have to know the method by which
|
||
AutoCAD calculates the X and Y axes in order to work with these
|
||
values.
|
||
o The elevation value stored with an entity and output in DXF files
|
||
will be a sum of the Z coordinate difference between the UCS XY
|
||
plane and the ECS XY plane, and the elevation value that the user
|
||
specified at the time the entity was drawn.
|
||
|
||
|
||
Arbitrary Axis Algorithm
|
||
|
||
The arbitrary axis algorithm is used by AutoCAD internally to implement the
|
||
"arbitrary but consistent" generation of Entity Coordinate Systems for all
|
||
entities except Lines, Points, 3D Faces, and 3D Polylines, which contain
|
||
points in World coordinates.
|
||
|
||
Given a unit-length vector to be used as the Z axis of a coordinate system,
|
||
the arbitrary axis algorithm generates a corresponding X axis for the coor-
|
||
dinate system. The Y axis follows by application of the right hand rule.
|
||
|
||
The method is to examine the given Z axis (also called the normal vector)
|
||
and see if it is close to the positive or negative World Z axis. If it is,
|
||
cross the World Y axis with the given Z axis to arrive at the arbitrary X
|
||
axis. If not, cross the World Z axis with the given Z axis to arrive at
|
||
the arbitrary X axis. The boundary at which the decision is made was
|
||
chosen to be both inexpensive to calculate and completely portable across
|
||
machines. This is achieved by having a sort of "square" polar cap, the
|
||
bounds of which is 1/64, which is precisely specifiable in 6 decimal frac-
|
||
tion digits and in 6 binary fraction bits.
|
||
|
||
In mathematical terms, the algorithm does the following (all "vectors" are
|
||
assumed to be in 3D space, specified in the World Coordinate System).
|
||
|
||
Let the given normal vector be called N.
|
||
Let the World Y axis be called Wy, which is always (0,1,0).
|
||
Let the World Z axis be called Wz, which is always (0,0,1).
|
||
|
||
19
|
||
AutoCAD Reference Manual
|
||
|
||
We are looking for the arbitrary X and Y axes to go with the normal N.
|
||
They'll be called Ax and Ay. N could also be called Az (the arbitrary Z
|
||
axis).
|
||
|
||
If (Nx < 1/64) and (Ny < 1/64) then
|
||
Ax = Wy * N (where "*" is the cross-product operator).
|
||
Otherwise,
|
||
Ax = Wz * N.
|
||
Scale Ax to unit length.
|
||
|
||
The method of getting the Ay vector would be:
|
||
|
||
Ay = N * Ax.
|
||
Scale Ay to unit length.
|
||
|
||
|
||
C.1.6 Writing DXF Interface Programs
|
||
|
||
Writing a program that communicates with AutoCAD via the DXF mechanism
|
||
often appears far more difficult than it really is. The DXF file contains
|
||
a seemingly overwhelming amount of information, and examining a DXF file
|
||
manually may lead to the conclusion that the task is hopeless.
|
||
|
||
However, the DXF file has been designed to be easy to process by program,
|
||
not manually. The format was constructed with the deliberate intention of
|
||
making it easy to ignore information you don't care about while easily
|
||
reading the information you need. Just remember to handle the groups in
|
||
any order and ignore any group you don't care about, and you'll be home
|
||
free.
|
||
|
||
As an example, the following is a Microsoft BASIC program that reads a DXF
|
||
file and extracts all the LINE entities from the drawing (ignoring lines
|
||
that appear inside Blocks). It prints the endpoints of these lines on the
|
||
screen. As an exercise you might try entering this program into your com-
|
||
puter, running it on a DXF file from one of your drawings, then enhancing
|
||
it to print the center point and radius of any circles it encounters. This
|
||
program is not put forward as an example of clean programming technique nor
|
||
the way a general DXF processor should be written; it is presented as an
|
||
example of just how simple a DXF-reading program can be.
|
||
|
||
1000 REM
|
||
1010 REM Extract lines from DXF file
|
||
1020 REM
|
||
1030 G1% = 0
|
||
1040 LINE INPUT "DXF file name: "; A$
|
||
1050 OPEN "i", 1, A$ + ".dxf"
|
||
1060 REM
|
||
1070 REM Ignore until section start encountered
|
||
1080 REM
|
||
1090 GOSUB 2000
|
||
1100 IF G% <> 0 THEN 1090
|
||
1110 IF S$ <> "SECTION" THEN 1090
|
||
|
||
|
||
20
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
1120 GOSUB 2000
|
||
1130 REM
|
||
1140 REM Skip unless ENTITIES section
|
||
1150 REM
|
||
1160 IF S$ <> "ENTITIES" THEN 1090
|
||
1170 REM
|
||
1180 REM Scan until end of section, processing LINEs
|
||
1190 REM
|
||
1200 GOSUB 2000
|
||
1210 IF G% = 0 AND S$ = "ENDSEC" THEN 2200
|
||
1220 IF G% = 0 AND S$ = "LINE" THEN GOSUB 1400 : GOTO 1210
|
||
1230 GOTO 1200
|
||
1400 REM
|
||
1410 REM Accumulate LINE entity groups
|
||
1420 REM
|
||
1430 GOSUB 2000
|
||
1440 IF G% = 10 THEN X1 = X : Y1 = Y : Z1 = Z
|
||
1450 IF G% = 11 THEN X2 = X : Y2 = Y : Z2 = Z
|
||
1460 IF G% = 0 THEN PRINT "Line from (";X1;",";Y1;",";Z1;") to (";X2;
|
||
",";Y2;",";Z2;")
|
||
1470 GOTO 1430
|
||
2000 REM
|
||
2010 REM Read group code and following value
|
||
2020 REM For X coordinates, read Y and possibly Z also
|
||
2030 REM
|
||
2040 IF G1% < 0 THEN G% = -G1% : G1% = 0 ELSE INPUT #1, G%
|
||
2050 IF G% < 10 OR G% = 999 THEN LINE INPUT #1, S$ : RETURN
|
||
2060 IF G% >= 38 AND G% <= 49 THEN INPUT #1, V : RETURN
|
||
2080 IF G% >= 50 AND G% <= 59 THEN INPUT #1, A : RETURN
|
||
2090 IF G% >= 60 AND G% <= 69 THEN INPUT #1, P% : RETURN
|
||
2100 IF G% >= 70 AND G% <= 79 THEN INPUT #1, F% : RETURN
|
||
2110 IF G% >= 210 AND G% <= 219 THEN 2130
|
||
2120 IF G% >= 20 THEN PRINT "Invalid group code";G% : STOP
|
||
2130 INPUT #1, X
|
||
2140 INPUT #1, G1%
|
||
2150 IF G1% <> (G%+10) THEN PRINT "Invalid Y coord code";G1% : STOP
|
||
2160 INPUT #1, Y
|
||
2170 INPUT #1, G1%
|
||
2180 IF G1% <> (G%+20) THEN G1% = -G1% ELSE INPUT #1, Z
|
||
2190 RETURN
|
||
2200 CLOSE 1
|
||
|
||
Writing a program that constructs a DXF file is more difficult, because you
|
||
must maintain consistency within the drawing in order for AutoCAD to find
|
||
it acceptable. AutoCAD allows you to omit many items in a DXF file and
|
||
still obtain a usable drawing. The entire HEADER section can be omitted if
|
||
you don't need to set any header variables. Any of the tables in the
|
||
TABLES section can be omitted if you don't need to make any entries, and in
|
||
fact the entire TABLES section can be dropped if nothing in it is required.
|
||
If you define any linetypes in the LTYPE table, this table must appear
|
||
before the LAYER table. If no Block Definitions are used in the drawing,
|
||
the BLOCKS section can be omitted. If present, however, it must appear
|
||
before the ENTITIES section. Within the ENTITIES section, you can refer-
|
||
ence layer names even though you haven't defined them in the LAYER table.
|
||
|
||
21
|
||
AutoCAD Reference Manual
|
||
|
||
Such layers will be automatically created with color 7 and the CONTINUOUS
|
||
linetype. The EOF item must be present at the end of file.
|
||
|
||
The following Microsoft BASIC program constructs a DXF file representing a
|
||
polygon with a specified number of sides, leftmost origin point, and side
|
||
length. This program supplies only the ENTITIES section of the DXF file,
|
||
and places all entities generated on the default layer "0". This may be
|
||
taken as an example of a minimum DXF generation program. Since this pro-
|
||
gram doesn't create the drawing header, the drawing limits, extents, and
|
||
current view will be invalid after performing a DXFIN on the drawing gener-
|
||
ated by this program. You can do a "ZOOM E" to fill the screen with the
|
||
drawing generated. Then adjust the limits manually.
|
||
|
||
1000 REM
|
||
1010 REM Polygon generator
|
||
1020 REM
|
||
1030 LINE INPUT "Drawing (DXF) file name: "; A$
|
||
1040 OPEN "o", 1, A$ + ".dxf"
|
||
1050 PRINT #1, 0
|
||
1060 PRINT #1, "SECTION"
|
||
1070 PRINT #1, 2
|
||
1080 PRINT #1, "ENTITIES"
|
||
1090 PI = ATN(1) * 4
|
||
1100 INPUT "Number of sides for polygon: "; S%
|
||
1110 INPUT "Starting point (X,Y): "; X, Y
|
||
1120 INPUT "Polygon side: "; D
|
||
1130 A1 = (2 * PI) / S%
|
||
1140 A = PI / 2
|
||
1150 FOR I% = 1 TO S%
|
||
1160 PRINT #1, 0
|
||
1170 PRINT #1, "LINE"
|
||
1180 PRINT #1, 8
|
||
1190 PRINT #1, "0"
|
||
1200 PRINT #1, 10
|
||
1210 PRINT #1, X
|
||
1220 PRINT #1, 20
|
||
1230 PRINT #1, Y
|
||
1240 PRINT #1, 30
|
||
1250 PRINT #1, 0.0
|
||
1260 NX = D * COS(A) + X
|
||
1270 NY = D * SIN(A) + Y
|
||
1280 PRINT #1, 11
|
||
1290 PRINT #1, NX
|
||
1300 PRINT #1, 21
|
||
1310 PRINT #1, NY
|
||
1320 PRINT #1, 31
|
||
1330 PRINT #1, 0.0
|
||
1340 X = NX
|
||
1350 Y = NY
|
||
1360 A = A + A1
|
||
1370 NEXT I%
|
||
1380 PRINT #1, 0
|
||
1390 PRINT #1, "ENDSEC"
|
||
|
||
22
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
1400 PRINT #1, 0
|
||
1410 PRINT #1, "EOF"
|
||
1420 CLOSE 1
|
||
|
||
The DXFIN command is relatively forgiving with respect to the format of
|
||
data items. As long as a properly formatted item appears on the line on
|
||
which the data is expected, DXFIN will accept it (of course, string items
|
||
should not have leading spaces unless these are intended to be part of the
|
||
string). The above program takes advantage of this flexibility in input
|
||
format, and does not go to great effort to generate a file appearing
|
||
exactly like one generated by AutoCAD.
|
||
|
||
In the case of error loading a DXF file using DXFIN, AutoCAD reports the
|
||
error with a message indicating the nature of the error detected and the
|
||
last line processed in the DXF file before the error was detected. This
|
||
may not be the line on which the error occurred, especially in the case of
|
||
such errors as omission of required groups.
|
||
|
||
|
||
|
||
C.2 Binary Drawing Interchange Files
|
||
|
||
The ASCII DXF file format described in the preceding sections of this
|
||
appendix is a complete representation of an AutoCAD drawing in an ASCII
|
||
text form easily processed by other programs. In addition, AutoCAD can
|
||
produce or read a binary form of the full DXF file, and accepts limited
|
||
input in another binary file format. These binary files are described in
|
||
the following sections.
|
||
|
||
|
||
C.2.1 Binary DXF Files
|
||
|
||
The DXFOUT command provides a "Binary" option that writes binary DXF files.
|
||
Such a file contains all of the information present in an ASCII DXF file,
|
||
but in a much more compact form that takes, typically, 25% less file space
|
||
and can be read and written more quickly (typically 5 times faster) by
|
||
AutoCAD. Unlike ASCII DXF files, which entail a trade-off between size and
|
||
floating-point accuracy, binary DXF files preserve all of the accuracy in
|
||
the drawing database. AutoCAD Release 10 is the first version to support
|
||
this form of DXF file; it cannot be read by older versions.
|
||
|
||
A binary DXF file begins with a 22-byte sentinel consisting of:
|
||
|
||
"AutoCAD Binary DXF<CR><LF><SUB><NUL>"
|
||
|
||
Following the sentinel are (group,value) pairs as in an ASCII DXF file, but
|
||
represented in binary form. The group code is a single-byte binary value,
|
||
and the value that follows is one of the following:
|
||
|
||
o a two-byte integer with the least significant byte first and the
|
||
most significant byte last,
|
||
|
||
|
||
|
||
23
|
||
AutoCAD Reference Manual
|
||
|
||
o an eight-byte IEEE double precision floating-point number stored
|
||
with the least significant byte first and the most significant
|
||
byte last, or
|
||
|
||
o an ASCII string terminated by a zero (NUL) byte.
|
||
|
||
The type of the datum following a group is determined from the group code
|
||
according to the same rules used in decoding ASCII DXF files. Translation
|
||
of angles to degrees, and dates to fractional Julian date representation,
|
||
is performed for binary files as well as for ASCII DXF files. The comment
|
||
group, 999, is not used in binary DXF files.
|
||
|
||
DXFOUT writes binary DXF files with the same file type (".dxf") as for
|
||
ASCII DXF files. The DXFIN command automatically recognizes a binary file
|
||
(by means of its sentinel string) and loads it. There is no need for you
|
||
to identify it as a binary file.
|
||
|
||
If DXFIN encounters an error in a binary DXF file, it reports the byte
|
||
address within the file where the error was detected.
|
||
|
||
|
||
C.3 Binary Drawing Interchange (DXB) Files
|
||
|
||
The DXF file formats described earlier in this appendix are complete repre-
|
||
sentations of an AutoCAD drawing that can be written and read by AutoCAD
|
||
and other programs. However, AutoShade(tm) and programs executed via the
|
||
"external commands" facility (Appendix B) often have a need to supply
|
||
simple geometric input to AutoCAD. For these purposes, another file format
|
||
even more compact than the binary DXF format is supported. This format,
|
||
called DXB (for "drawing interchange binary") is limited in the entities it
|
||
can represent. Furthermore, AutoCAD has a command to read such files, but
|
||
no direct method of writing them. (The ADI plotter driver can plot to a
|
||
file in DXB format.)
|
||
|
||
|
||
C.3.1 DXBIN Command
|
||
|
||
To load a DXB file produced by a program such as AutoShade, enter the DXBIN
|
||
command:
|
||
|
||
Command: DXBIN
|
||
DXB file:
|
||
|
||
enter the name of the file you wish to load. Don't include a file type;
|
||
".dxb" is assumed.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
24
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
C.3.2 DXB File Format
|
||
|
||
This information is for experienced programmers, and is subject to change
|
||
without notice.
|
||
|
||
The format of a DXB file is as follows:
|
||
|
||
Header: "AutoCAD DXB 1.0" CR LF ^Z NUL (19 bytes)
|
||
Data: . . . Zero or more data records . . .
|
||
Terminator: NUL (1 byte)
|
||
|
||
Each data record begins with a single byte giving its type, followed by
|
||
data items. The data items have various forms of representation and encod-
|
||
ing. In the descriptions below, each data item is prefixed with a letter
|
||
and a hyphen. The meaning of the letter codes is as follows:
|
||
|
||
w- 16-bit integer, byte reversed in the standard 8086 style (least
|
||
significant byte first, most significant byte second).
|
||
|
||
f- IEEE 64-bit floating-point value stored with lsb first, msb last
|
||
(as stored by an 8087).
|
||
|
||
l- 32-bit integer with the bytes reversed 8086-style.
|
||
|
||
n- Number which may be either a 16-bit integer or a floating-point
|
||
number depending on the most recent setting of the "number mode"
|
||
data item. The number mode defaults to 0, signifying integers. If
|
||
set to 1, all n- items will be read as floating-point.
|
||
|
||
u- Item which is either a 32-bit integer or a floating-point number
|
||
depending on the most recent number mode setting. If a 32-bit
|
||
integer, the value is scaled by multiplying it by 65536 (2^16). If
|
||
a floating-point value, no scaling is applied.
|
||
|
||
a- Item representing an angle. If number mode is integer, this is a
|
||
32-bit integer representing an angle in units of millionths of a
|
||
degree (range 0 to 360,000,000). If a floating-point number, rep-
|
||
resents degrees.
|
||
|
||
In the following table, the lengths include the item-type byte and assume
|
||
the number mode is set to zero (integer mode). If number mode is floating-
|
||
point, add 6 bytes to the length for each n- item present and 4 bytes for
|
||
each a-, or u- item present.
|
||
|
||
Item type Code Data items Length
|
||
(decimal) (bytes)
|
||
LINE 1 n-fromx n-fromy 9
|
||
n-tox n-toy
|
||
POINT 2 n-x n-y 5
|
||
CIRCLE 3 n-ctrx n-ctry n-rad 7
|
||
ARC 8 n-ctrx n-ctry n-rad 19
|
||
a-starta a-enda
|
||
continued ...
|
||
|
||
25
|
||
AutoCAD Reference Manual
|
||
|
||
Item type Code Data items Length
|
||
(decimal) (bytes)
|
||
TRACE 9 n-x1 n-y1 n-x2 n-y2 17
|
||
n-x3 n-y3 n-x4 n-y4
|
||
SOLID 11 n-x1 n-y1 n-x2 n-y2 17
|
||
n-x3 n-y3 n-x4 n-y4
|
||
SEQEND 17 (none) 1
|
||
POLYLINE 19 w-closureflag 3
|
||
VERTEX 20 n-x n-y 5
|
||
3DLINE 21 n-fromx n-fromy n-fromz 13
|
||
n-tox n-toy n-toz
|
||
3DFACE 22 n-x1 n-y1 n-z1 25
|
||
n-x2 n-y2 n-x2
|
||
n-x3 n-y3 n-z3
|
||
n-x4 n-y4 n-z4
|
||
SCALE FACTOR 128 f-scalefac 9
|
||
NEW LAYER 129 "layername" NUL "layername"
|
||
length + 2
|
||
LINE EXTENSION 130 n-tox n-toy 5
|
||
TRACE EXTENSION 131 n-x3 n-y3 n-x4 n-y4 9
|
||
BLOCK BASE 132 n-bx n-by 5
|
||
BULGE 133 u-2h/d 5
|
||
WIDTH 134 n-startw n-endw 5
|
||
NUMBER MODE 135 w-mode 3
|
||
NEW COLOR 136 w-colornum 3
|
||
3DLINE EXTENSION 137 n-tox n-toy n-toz 7
|
||
|
||
The LINE EXTENSION item extends the last line or line extension from its
|
||
"to" point to a new "to point". The trace extension item similarly extends
|
||
the last trace solid, or trace extension from its x3,y3-x4,y4 ending line
|
||
to a new x3,y3-x4,y4 line.
|
||
|
||
The SCALE FACTOR is a floating-point value by which all integer coordinates
|
||
are multiplied to obtain the floating-point coordinates used by the actual
|
||
entities. The initial scale factor when a file is read is 1.0. The NEW
|
||
LAYER item will create a layer if none exists, giving it the same defaults
|
||
as the "LAYER NEW" command, and will set that layer as the current layer
|
||
for subsequent entities. At the end of the DXB file load, the layer in
|
||
effect before the command will be restored.
|
||
|
||
The BLOCK BASE item specifies the base (origin) point of a Block being cre-
|
||
ated. The Block base must be defined before the first entity record is
|
||
encountered. If DXB is not defining a Block, this specification will be
|
||
ignored.
|
||
|
||
A Polyline consists of straight segments of fixed width connecting the ver-
|
||
tices, except as overridden by the BULGE and WIDTH items described below.
|
||
The closure flag should be 0 or 1; if it is 1, then there is an implicit
|
||
segment from the last vertex (immediately before the SEQEND) to the first
|
||
vertex.
|
||
|
||
A BULGE item, encountered between two VERTEX items (or after the last
|
||
VERTEX of a closed Polyline), indicates that the two vertices are connected
|
||
|
||
26
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
by an arc rather than a straight segment. If the line segment connecting
|
||
the vertices would have length d, and the perpendicular distance from the
|
||
midpoint of that segment to the arc is h, then the magnitude of the BULGE
|
||
is (2 * h / d). The sign is negative if the arc from the first vertex to
|
||
the second is clockwise. A semicircle thus has a bulge of 1 (or -1). If
|
||
the number mode is 0 (integer), BULGE items are scaled by 216. If the
|
||
number mode has been set to floating-point, then the floating-point value
|
||
supplied is just 2*h/d (not scaled).
|
||
|
||
The WIDTH item indicates the starting and ending widths of the segment
|
||
(straight or curved) connecting two vertices. This width stays in effect
|
||
until the next width item or the SEQEND. If there is a WIDTH item between
|
||
the POLYLINE item and the first VERTEX, it is stored as a default width for
|
||
the Polyline; this will save considerable database space if the Polyline
|
||
has several segments of this width.
|
||
|
||
The NUMBER MODE item controls the mode of items with types given in the
|
||
table above as n-, a-, or u-. If the value supplied is zero, these values
|
||
will be integers, otherwise floating-point. The storage and implicit scal-
|
||
ing conventions for these values in both modes are described above.
|
||
|
||
LINEs and 3DLINEs share the same cells to remember the last to-point, so
|
||
you shouldn't mix extension groups for the two entities without an initial
|
||
group before the extension. There is no "extension" group for 3DFACEs, as
|
||
there's no obvious edge to extend from.
|
||
|
||
The "NEW COLOR" group specifies the color for subsequent entities in the
|
||
DXB file. The "w-colornum" word argument is in the range from 0 to 256. 0
|
||
means color by block, 1-255 are the standard AutoCAD colors, and 256 means
|
||
color by layer. A color outside the range from 0 to 256 sets the color
|
||
back to the current entity color (you can do this deliberately, and it can
|
||
be quite handy). The initial entity color of material added by DXBIN is
|
||
the current entity color.
|
||
|
||
All points specified in the DXB file are interpreted in terms of the cur-
|
||
rent UCS at the time the DXBIN command is executed.
|
||
|
||
|
||
C.3.3 Writing DXB Files
|
||
|
||
There is no direct AutoCAD command to write a DXB file, but the special
|
||
"ADI" plotter driver can write such a file. If you want to create a DXB
|
||
file from an AutoCAD drawing, configure the "ADI" plotter and select its
|
||
DXB file output option.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
27
|
||
AutoCAD Reference Manual
|
||
|
||
C.4 Initial Graphics Exchange Standard (IGES) Files
|
||
|
||
Using the commands described in this section, you can instruct AutoCAD to
|
||
read and write IGES format interchange files.
|
||
|
||
NOTE: The format of IGES files and the mapping performed to translate
|
||
between AutoCAD drawing information and IGES are described in the separate
|
||
AutoCAD / IGES Interface Specifications document (one of the items supplied
|
||
when you return your AutoCAD license registration card).
|
||
|
||
|
||
C.4.1 IGESOUT Command
|
||
|
||
You can generate an Initial Graphics Exchange Standard (IGES) interchange
|
||
file from an existing AutoCAD drawing by means of the Drawing Editor's
|
||
IGESOUT command. The command format is:
|
||
|
||
Command: IGESOUT File name: (name or RETURN)
|
||
|
||
The default name for the output file is the same as that of the current
|
||
drawing, but with a file type of ".igs". If you specify an explicit file
|
||
name without including a file type, ".igs" is assumed. If a file with the
|
||
same name already exists, it is deleted.
|
||
|
||
|
||
C.4.2 IGESIN Command
|
||
|
||
An IGES interchange file can be converted into an AutoCAD drawing by means
|
||
of the IGESIN command. First enter the Drawing Editor using the "Create
|
||
new drawing" task from the Main Menu. Then issue the IGESIN command.
|
||
|
||
Command: IGESIN File name: (name)
|
||
|
||
Enter the name of the IGES file to be loaded.
|
||
|
||
If a serious error is encountered, the input process is halted and an error
|
||
message is displayed reporting where the error was found. The partial
|
||
drawing is not discarded.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
28
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
C.5 Slide File Format
|
||
|
||
AutoCAD slide files are screen images written by the MSLIDE command and
|
||
read by the VSLIDE command. This section describes the format of slide
|
||
files, for the benefit of developers who wish to incorporate support for
|
||
AutoCAD slides into their programs.
|
||
|
||
This information is for experienced programmers, and is subject to change
|
||
without notice.
|
||
|
||
The general format of a slide file is:
|
||
|
||
1. Header (31 bytes)
|
||
2. One or more data records (variable length)
|
||
|
||
All coordinates and sizes written to the slide file reflect the graphics
|
||
area of the display device from which the slide was created, with point
|
||
(0,0) located at the lower left corner of the graphics area. For AutoCAD
|
||
Release 9 and later, the slide file header consists of the following
|
||
fields:
|
||
|
||
Field Bytes Description
|
||
Id string 17 "AutoCAD Slide" CR LF ^Z NUL
|
||
|
||
Type indicator 1 Currently set to 86 (decimal).
|
||
|
||
Level indicator 1 Currently set to 2.
|
||
|
||
High X dot 2 Width of the graphics area - 1, in pixels.
|
||
|
||
High Y dot 2 Height of the graphics area - 1, in pixels.
|
||
|
||
Aspect ratio 4 Aspect ratio (horizontal size / vertical size in
|
||
inches) of the graphics area, scaled by
|
||
10,000,000. This value is always written with
|
||
the least significant byte first.
|
||
|
||
Hardware fill 2 Either 0 or 2 (value is unimportant).
|
||
|
||
Test number 2 A number (1234 hex) used to determine whether
|
||
all 2-byte values in this slide file were writ-
|
||
ten with the high byte first (as by Intel
|
||
8086-family CPUs) or the low byte first (as by
|
||
Motorola 68000-family CPUs).
|
||
|
||
Data records follow the header. Each data record begins with a 2-byte
|
||
field whose high-order byte is the record type. The remainder of the
|
||
record may be composed of 1-byte or 2-byte fields, as described in the fol-
|
||
lowing table. To determine whether the 2-byte fields are written with the
|
||
high byte first or the low byte first, examine the Test number field of the
|
||
header, described above.
|
||
|
||
|
||
|
||
29
|
||
AutoCAD Reference Manual
|
||
|
||
Record Length Meaning Description
|
||
type (hex) (bytes)
|
||
00 - 7F 8 Vector The from-X coordinate for an
|
||
ordinary vector. From-Y, to-X,
|
||
and to-Y follow in that order, as
|
||
2-byte values. The from point is
|
||
saved as the last point.
|
||
80 - FA - Undefined Reserved for future use.
|
||
FB 5 Offset vector The low-order byte and the fol-
|
||
lowing three bytes specify the
|
||
endpoints (from-X, from-Y, to-X,
|
||
to-Y) of a vector, in terms of
|
||
offsets (-128 to +127) from the
|
||
saved last point. The adjusted
|
||
from point is saved as the last
|
||
point for use by subsequent vec-
|
||
tors.
|
||
FC 2 End of file The low-order byte is 00.
|
||
FD 6 Solid fill The low-order byte is always
|
||
zero. The following two 2-byte
|
||
values specify the X and Y coor-
|
||
dinates of one vertex of a poly-
|
||
gon to be solid-filled. 3 to 10
|
||
such records occur in sequence.
|
||
A Solid fill record with a nega-
|
||
tive Y coordinate indicates the
|
||
start or end of such a flood
|
||
sequence. In the start record,
|
||
the X coordinate indicates the
|
||
number of vertex records to
|
||
follow.
|
||
FE 3 Common This is a vector starting at the
|
||
endpoint last point. The low-order byte
|
||
vector and the following byte specify
|
||
to-X and to-Y in terms of offsets
|
||
(-128 to +127) from the saved
|
||
last point. The adjusted to
|
||
point is saved as the last point
|
||
for use by subsequent vectors.
|
||
FF 2 New color Subsequent vectors are to be
|
||
drawn using the color number
|
||
indicated by the low-order byte.
|
||
|
||
If a slide contains any vectors at all, a New color record will be the
|
||
first data record. The order of the vectors in a slide, and the order of
|
||
the endpoints of those vectors, may vary.
|
||
|
||
For example, the following is an annotated hex dump of a simple slide file
|
||
created on an IBM PC/AT with an IBM Enhanced Graphics Adapter. The slide
|
||
consists of a white diagonal line from the lower left corner to the upper
|
||
right corner of the graphics area, a green vertical line near the lower
|
||
left corner, and a small red rectangle at the lower left corner.
|
||
|
||
|
||
30
|
||
(C) Drawing Interchange and File Formats
|
||
|
||
41 75 74 6F 43 41 Id string ("AutoCAD Slide" CR LF ^Z NUL)
|
||
44 20 53 6C 69 64
|
||
65 0D 0A 1A 00
|
||
56 Type indicator (86)
|
||
02 Level indicator (2)
|
||
3C 02 High X dot (572)
|
||
24 01 High Y dot (292)
|
||
0B 80 DF 00 Aspect ratio (14,647,307 / 10,000,000 = 1.46)
|
||
02 00 Hardware fill (2)
|
||
34 12 Test number (1234 hex)
|
||
07 FF New color (7 = white)
|
||
3C 02 24 01 00 00 00 00 Vector from 572,292 to 0,0. 572,292 becomes
|
||
"last" point
|
||
03 FF New color (3 = green)
|
||
0F 00 32 00 0F 00 13 00 Vector from 15,50 to 15,19. 15,50 becomes
|
||
"last" point
|
||
01 FF New color (1 = red)
|
||
12 FB E7 12 CE Offset vector from 15+18,50-25 (33,25) to
|
||
15+18,50-50 (33,0). 33,25 becomes "last" point
|
||
DF FE 00 Common-endpoint vector from 33,25 to
|
||
33-33,25+0 (0,25). 0,25 becomes "last" point
|
||
00 FE E7 Common-endpoint vector from (0,25) to
|
||
0+0,25-25 (0,0). 0,0 becomes "last" point
|
||
21 FE 00 Common-endpoint vector from (0,0) to
|
||
0+33,0+0 (33,0). 33,0 becomes "last" point
|
||
00 FC End of file
|
||
|
||
|
||
Old Slide Header
|
||
|
||
The slide format described above is that produced by AutoCAD Release 9 and
|
||
later, and is portable among all computers running AutoCAD Release 9 or
|
||
later. Previous versions of AutoCAD (as well as AutoShade 1.0 and
|
||
AutoSketch 1.02) produce slides with a somewhat different header, as shown
|
||
below.
|
||
|
||
Field Bytes Description
|
||
Id string 17 "AutoCAD Slide" CR LF ^Z NUL
|
||
Type indicator 1 86 (decimal).
|
||
Level indicator 1 1 (old format).
|
||
High X dot 2 Width of the graphics area - 1, in pixels.
|
||
High Y dot 2 Height of the graphics area - 1, in pixels.
|
||
Aspect ratio 8 Aspect ratio (horizontal size / vertical size in
|
||
inches) of the graphics area, written as a
|
||
floating-point number.
|
||
Hardware fill 2 Either 0 or 2 (value is unimportant).
|
||
Filler byte 1 Unused
|
||
|
||
Note that the old-format header does not contain a Test number field. The
|
||
floating-point aspect ratio value and all two-byte integers are written in
|
||
the native format of the CPU used to create the file (for 8086-family CPUs,
|
||
IEEE double-precision and low byte first). Old-format slide files are not
|
||
portable across machine types, but they can be read by any version of AutoCAD
|
||
running on the same CPU type as the CPU with which the slide was created.
|
||
|
||
31
|
||
AutoCAD Reference Manual
|
||
|
||
C.6 Slide Library File Format
|
||
|
||
This section describes the format of AutoCAD slide libraries (Release 9 and
|
||
later), for the benefit of developers who wish to incorporate support for
|
||
slide libraries into their programs.
|
||
|
||
This information is for experienced programmers, and is subject to change
|
||
without notice.
|
||
|
||
The general format of a slide library is:
|
||
|
||
1. Header (32 bytes)
|
||
"AutoCAD Slide Library 1.0" CR LF ^Z NUL NUL NUL NUL
|
||
2. One or more slide directory entries (36 bytes each)
|
||
3. One or more slides (variable length)
|
||
|
||
Slide directory entries have the following format:
|
||
|
||
1. Slide name (NUL terminated) (32 bytes)
|
||
2. Address of slide within library file (4 bytes)
|
||
|
||
The slide address is always written with the low byte first. Each slide to
|
||
which the directory points is a complete slide file as described in the
|
||
previous section. The end of the slide directory is signified by an entry
|
||
with a null slide name (first byte is NUL). A slide library may contain a
|
||
mixture of old-format and new-format slides.
|
||
|
||
|
||
<end of document>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
32
|
||
|
||
dxf/dxf.doc: 1825 lines
|
||
(continue editing letter)
|
||
/* AutoCAD DXF file to DKB Data File Converter */
|
||
/* Version 1.0 By Aaron A. Collins. Written 8/13/90 */
|
||
/* This program is released to the public domain. */
|
||
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
|
||
#define BUFSIZE 2048
|
||
#define FABS(x) ((x<0.0)?-x:x)
|
||
|
||
int getline (void);
|
||
void writeobj (void);
|
||
void finishobj (int color);
|
||
void lookupcolor (int color, float *red, float *green, float *blue);
|
||
int checkdegen(int a, int b, int c);
|
||
|
||
int groupcode;
|
||
char inname[80], outname[80];
|
||
char linbuf[BUFSIZE];
|
||
FILE *infile, *outfile;
|
||
long primitives = 0L, degenerates = 0L;
|
||
char curobj[80];
|
||
int curcolor;
|
||
float curthick;
|
||
float xcoords[10];
|
||
float ycoords[10];
|
||
float zcoords[10];
|
||
float floats[10];
|
||
float angles[10];
|
||
int ints[10];
|
||
float max_x, max_y, max_z, min_x, min_y, min_z;
|
||
|
||
main(argc, argv)
|
||
int argc;
|
||
char *argv[];
|
||
{
|
||
char *index;
|
||
|
||
printf("\n\nAutoCad DXF to DKB .Data file Translator\n");
|
||
printf("Version 1.0 Written By Aaron A. Collins, 8/13/90\n");
|
||
printf("This program is released to the public domain.\n\n");
|
||
if (argc < 2 || argc > 3)
|
||
{
|
||
printf("Usage: %s infile[.DXF] [outfile[.DAT]]\n", argv[0]);
|
||
exit(1);
|
||
}
|
||
strcpy(inname, argv[1]); /* make copy we can mess with */
|
||
if (!strchr(inname, '.')) /* no dot present in filename? */
|
||
strcat(inname, ".DXF");
|
||
if (!(infile = fopen(inname, "r")))
|
||
{
|
||
printf("Cannot open input file %s!\n", inname);
|
||
exit(1);
|
||
}
|
||
if (argc < 3) /* i.e. no 2nd name supplied... */
|
||
{
|
||
strcpy(outname, inname);
|
||
index = strchr(outname, '.'); /* find the dot */
|
||
strcpy(index, ".DAT"); /* make new ext. .DAT... */
|
||
}
|
||
else
|
||
{
|
||
strcpy(outname, argv[2]);
|
||
if (!strchr(inname, '.')) /* no dot in filename? */
|
||
strcat(inname, ".DAT"); /* add .DAT extension */
|
||
}
|
||
if (!(outfile = fopen(outname, "w")))
|
||
{
|
||
printf("Cannot create output file %s!\n", outname);
|
||
fclose(infile);
|
||
exit(1);
|
||
}
|
||
|
||
printf("\nPlease wait; Processing...");
|
||
|
||
fprintf(outfile, "{ %s: Converted from AutoCad DXF File: %s }\n\n", outname,
|
||
inname);
|
||
fprintf(outfile, "INCLUDE \"basicshapes.data\"\n\n");
|
||
fprintf(outfile, "{ Put a VIEW_POINT here... }\n\n");
|
||
fprintf(outfile, "{ Put a LIGHT_SOURCE here... }\n\n");
|
||
fprintf(outfile, "COMPOSITE\n");
|
||
|
||
curobj[0] = '\0'; /* not working on any object currently */
|
||
curcolor = 7; /* and it also doesn't have a color yet... */
|
||
max_x = max_y = max_z = -10000000.0; /* init bounding limits */
|
||
min_x = min_y = min_z = 10000000.0;
|
||
|
||
find: while (!feof(infile)) /* run file up to the "ENTITIES" section */
|
||
{
|
||
if (getline()) /* get a group code and a line */
|
||
goto stopit;
|
||
if (groupcode == 0) /* file section mark */
|
||
{
|
||
if (strstr(linbuf, "EOF"))
|
||
goto stopit;
|
||
if (strstr(linbuf, "SECTION"))
|
||
{
|
||
if (getline())
|
||
goto stopit;
|
||
if (groupcode != 2)
|
||
continue;
|
||
if (strstr(linbuf, "ENTITIES"))
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
while (!feof(infile)) /* scan ENTITIES section */
|
||
{
|
||
if (getline()) /* get a group code and a line */
|
||
break;
|
||
if (groupcode < 10) /* cardinal group codes */
|
||
{
|
||
switch(groupcode)
|
||
{
|
||
case 0: /* start of entity, table, file sep */
|
||
if (strstr(linbuf, "EOF"))
|
||
{
|
||
writeobj(); /* dump object */
|
||
goto stopit;
|
||
}
|
||
if (strstr(linbuf, "ENDSEC"))
|
||
{
|
||
writeobj(); /* dump object */
|
||
goto find;
|
||
}
|
||
writeobj(); /* dump old object */
|
||
curobj[0] = '\0'; /* reset object */
|
||
curcolor = 7;
|
||
strcpy(curobj, linbuf); /* get new */
|
||
break;
|
||
case 1: /* primary text value for entity (?)*/
|
||
break;
|
||
case 2: /* block name, attribute tag, etc */
|
||
case 3: /* other names */
|
||
case 4:
|
||
break;
|
||
case 5: /* entity handle (hex string) */
|
||
break;
|
||
case 6: /* line type name */
|
||
break;
|
||
case 7: /* text style name */
|
||
break;
|
||
case 8: /* layer name */
|
||
break;
|
||
case 9: /* variable name ID (only in header)*/
|
||
break;
|
||
}
|
||
}
|
||
else if (groupcode >= 10 && groupcode < 19) /* Some X coord */
|
||
{
|
||
sscanf(linbuf, "%f", &(xcoords[groupcode-10]));
|
||
if (xcoords[groupcode-10] > max_x)
|
||
max_x = xcoords[groupcode-10];
|
||
if (xcoords[groupcode-10] < min_x)
|
||
min_x = xcoords[groupcode-10];
|
||
}
|
||
else if (groupcode >= 20 && groupcode < 29) /* Some Y coord */
|
||
{
|
||
sscanf(linbuf, "%f", &(ycoords[groupcode-20]));
|
||
if (ycoords[groupcode-20] > max_y)
|
||
max_y = ycoords[groupcode-20];
|
||
if (ycoords[groupcode-20] < min_y)
|
||
min_y = ycoords[groupcode-20];
|
||
}
|
||
else if (groupcode >= 30 && groupcode < 38) /* Some Z coord */
|
||
{
|
||
sscanf(linbuf, "%f", &(zcoords[groupcode-30]));
|
||
if (zcoords[groupcode-30] > max_z)
|
||
max_z = zcoords[groupcode-30];
|
||
if (zcoords[groupcode-30] < min_z)
|
||
min_z = zcoords[groupcode-30];
|
||
}
|
||
else if (groupcode == 38) /* entity elevation if nonzero */
|
||
{
|
||
}
|
||
else if (groupcode == 39) /* entity thickness if nonzero */
|
||
{
|
||
}
|
||
else if (groupcode >= 40 && groupcode < 49) /* misc floats */
|
||
{
|
||
sscanf(linbuf, "%f", &(floats[groupcode-40]));
|
||
}
|
||
else if (groupcode == 49) /* repeated value groups */
|
||
{
|
||
}
|
||
else if (groupcode >= 50 && groupcode < 59) /* misc angles */
|
||
{
|
||
sscanf(linbuf, "%f", &(angles[groupcode-50]));
|
||
}
|
||
else if (groupcode == 62) /* Color number */
|
||
{
|
||
sscanf(linbuf, "%6d", &curcolor);
|
||
}
|
||
else if (groupcode == 66) /* "entities follow" flag */
|
||
{
|
||
}
|
||
else if (groupcode >= 70 && groupcode < 79) /* misc ints */
|
||
{
|
||
sscanf(linbuf, "%f", &(ints[groupcode-70]));
|
||
}
|
||
else if (groupcode == 210 || groupcode == 220 || groupcode == 230)
|
||
{ /* X, Y, Z components of extrusion direction */
|
||
}
|
||
}
|
||
stopit: fprintf(outfile, " BOUNDED_BY\n INTERSECTION\n");
|
||
fprintf(outfile, " PLANE <1.0 0.0 0.0> %1.04f END_PLANE\n",
|
||
FABS(max_x) * 1.01);
|
||
fprintf(outfile, " PLANE <-1.0 0.0 0.0> %1.04f END_PLANE\n",
|
||
FABS(min_x) * 1.01);
|
||
fprintf(outfile, " PLANE <0.0 1.0 0.0> %1.04f END_PLANE\n",
|
||
FABS(max_y) * 1.01);
|
||
fprintf(outfile, " PLANE <0.0 -1.0 0.0> %1.04f END_PLANE\n",
|
||
FABS(min_y) * 1.01);
|
||
fprintf(outfile, " PLANE <0.0 0.0 1.0> %1.04f END_PLANE\n",
|
||
FABS(max_z) * 1.01);
|
||
fprintf(outfile, " PLANE <0.0 0.0 -1.0> %1.04f END_PLANE\n",
|
||
FABS(min_z) * 1.01);
|
||
fprintf(outfile, " END_INTERSECTION\n END_BOUND\n \nEND_COMPOSITE\n");
|
||
fclose(infile);
|
||
fflush(outfile);
|
||
fclose(outfile);
|
||
printf("Finished.\n\nTotal objects written to output file: %ld\n\n",
|
||
primitives);
|
||
printf("Total degenerate triangles removed from scene: %ld\n\n",
|
||
degenerates);
|
||
printf ("X bounding values range from %f to %f\n", min_x, max_x);
|
||
printf ("Y bounding values range from %f to %f\n", min_y, max_y);
|
||
printf ("Z bounding values range from %f to %f\n", min_z, max_z);
|
||
exit(0);
|
||
}
|
||
|
||
|
||
int getline() /* read a group code and the next line from infile */
|
||
{
|
||
fgets(linbuf, BUFSIZE, infile); /* get a line from .DXF */
|
||
if (feof(infile))
|
||
return(1);
|
||
sscanf(linbuf, "%3d", &groupcode); /* scan out group code */
|
||
fgets(linbuf, BUFSIZE, infile); /* get a line from .DXF */
|
||
if (feof(infile))
|
||
return(1);
|
||
return(0);
|
||
}
|
||
|
||
void writeobj() /* dump out current object we should have all info on */
|
||
{
|
||
if (strstr(curobj, "LINE")) /* a VERY skinny triangle! */
|
||
{
|
||
if (xcoords[0] == xcoords[1] && ycoords[0] == ycoords[1] &&
|
||
zcoords[0] == zcoords[1])
|
||
{
|
||
degenerates++;
|
||
return;
|
||
}
|
||
|
||
fprintf(outfile, "OBJECT\n");
|
||
fprintf(outfile, " TRIANGLE <%1.06f %1.06f %1.06f> <%1.06f %1.06f
|
||
%1.06f> <%1.06f %1.06f %1.06f> END_TRIANGLE\n", xcoords[0], ycoords[0], zcoords[0],
|
||
xcoords[1], ycoords[1], zcoords[1], xcoords[1]+0.01, ycoords[1], zcoords[1]);
|
||
finishobj(curcolor);
|
||
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "POINT")) /* an itty, bitty sphere! */
|
||
{
|
||
fprintf(outfile, "OBJECT\n");
|
||
fprintf(outfile, " SPHERE <%1.06f %1.06f %1.06f> 0.1 END_SPHERE\n",
|
||
xcoords[0], ycoords[0], zcoords[0]);
|
||
finishobj(curcolor);
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "CIRCLE")) /* a VERY short cylinder! */
|
||
{
|
||
fprintf(outfile, "OBJECT\n");
|
||
fprintf(outfile, " INTERSECTION\n");
|
||
fprintf(outfile, " QUADRIC Cylinder_Z SCALE <%1.06f %1.06f %1.06f>
|
||
END_QUADRIC\n", floats[0], floats[0], floats[0]);
|
||
fprintf(outfile, " PLANE <0.0 0.0 1.0> 0.1 END_PLANE\n");
|
||
fprintf(outfile, " PLANE <0.0 0.0 -1.0> 0.1 END_PLANE\n");
|
||
fprintf(outfile, " END_INTERSECTION\n");
|
||
fprintf(outfile, " TRANSLATE <%1.06f %1.06f %1.06f>\n", xcoords[0],
|
||
ycoords[0], zcoords[0]);
|
||
finishobj(curcolor);
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "ARC")) /* not implemented for now */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "TRACE")) /* 2 back-to-back triangles */
|
||
{
|
||
if (checkdegen(0, 1, 2))
|
||
{
|
||
degenerates++;
|
||
return;
|
||
}
|
||
|
||
fprintf(outfile, "OBJECT\n");
|
||
fprintf(outfile, " TRIANGLE <%1.06f %1.06f %1.06f> <%1.06f %1.06f
|
||
%1.06f> <%1.06f %1.06f %1.06f> END_TRIANGLE\n", xcoords[0], ycoords[0], zcoords[0],
|
||
xcoords[1], ycoords[1], zcoords[1], xcoords[2], ycoords[2], zcoords[2]);
|
||
finishobj(curcolor);
|
||
|
||
if (checkdegen(0, 3, 2))
|
||
{
|
||
degenerates++;
|
||
return;
|
||
}
|
||
|
||
fprintf(outfile, "OBJECT\n");
|
||
fprintf(outfile, " TRIANGLE <%1.06f %1.06f %1.06f> <%1.06f %1.06f
|
||
%1.06f> <%1.06f %1.06f %1.06f> END_TRIANGLE\n", xcoords[0], ycoords[0], zcoords[0],
|
||
xcoords[3], ycoords[3], zcoords[3], xcoords[2], ycoords[2], zcoords[2]);
|
||
finishobj(curcolor);
|
||
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "SOLID")) /* 1 or 2 triangles */
|
||
{
|
||
if (checkdegen(0, 1, 2))
|
||
{
|
||
degenerates++;
|
||
return;
|
||
}
|
||
|
||
fprintf(outfile, "OBJECT\n");
|
||
fprintf(outfile, " TRIANGLE <%1.06f %1.06f %1.06f> <%1.06f %1.06f
|
||
%1.06f> <%1.06f %1.06f %1.06f> END_TRIANGLE\n", xcoords[0], ycoords[0], zcoords[0],
|
||
xcoords[1], ycoords[1], zcoords[1], xcoords[2], ycoords[2], zcoords[2]);
|
||
finishobj(curcolor);
|
||
|
||
if (xcoords[2] == xcoords[3] && ycoords[2] == ycoords[3] &&
|
||
zcoords[2] == zcoords[3])
|
||
return; /* one triangle was enough... */
|
||
|
||
if (checkdegen(0, 3, 2))
|
||
{
|
||
degenerates++;
|
||
return;
|
||
}
|
||
|
||
fprintf(outfile, "OBJECT\n");
|
||
fprintf(outfile, " TRIANGLE <%1.06f %1.06f %1.06f> <%1.06f %1.06f
|
||
%1.06f> <%1.06f %1.06f %1.06f> END_TRIANGLE\n", xcoords[0], ycoords[0], zcoords[0],
|
||
xcoords[3], ycoords[3], zcoords[3], xcoords[2], ycoords[2], zcoords[2]);
|
||
finishobj(curcolor);
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "TEXT")) /* not implemented for now */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "SHAPE")) /* these look very hard */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "BLOCK")) /* these look very hard */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "ENDBLK")) /* these look very hard */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "INSERT")) /* these look very hard */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "ATTDEF")) /* not implemented for now */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "ATTRIB")) /* not implemented for now */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "POLYLINE")) /* these look fairly hard */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "VERTEX")) /* these look fairly hard */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "SEQEND")) /* these look fairly hard */
|
||
{
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "3DLINE")) /* a VERY skinny triangle! */
|
||
{
|
||
if (xcoords[0] == xcoords[1] && ycoords[0] == ycoords[1] &&
|
||
zcoords[0] == zcoords[1])
|
||
{
|
||
degenerates++;
|
||
return;
|
||
}
|
||
|
||
fprintf(outfile, "OBJECT\n");
|
||
fprintf(outfile, " TRIANGLE <%1.06f %1.06f %1.06f> <%1.06f %1.06f
|
||
%1.06f> <%1.06f %1.06f %1.06f> END_TRIANGLE\n", xcoords[0], ycoords[0], zcoords[0],
|
||
xcoords[1], ycoords[1], zcoords[1], xcoords[1]+0.1, ycoords[1], zcoords[1]);
|
||
finishobj(curcolor);
|
||
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "3DFACE")) /* 1 or 2 triangles */
|
||
{
|
||
if (checkdegen(0, 1, 2))
|
||
{
|
||
degenerates++;
|
||
return;
|
||
}
|
||
|
||
fprintf(outfile, "OBJECT\n");
|
||
fprintf(outfile, " TRIANGLE <%1.06f %1.06f %1.06f> <%1.06f %1.06f
|
||
%1.06f> <%1.06f %1.06f %1.06f> END_TRIANGLE\n", xcoords[0], ycoords[0], zcoords[0],
|
||
xcoords[1], ycoords[1], zcoords[1], xcoords[2], ycoords[2], zcoords[2]);
|
||
finishobj(curcolor);
|
||
|
||
if (xcoords[2] == xcoords[3] && ycoords[2] == ycoords[3] &&
|
||
zcoords[2] == zcoords[3])
|
||
return; /* one triangle was enough... */
|
||
|
||
if (checkdegen(0, 3, 2))
|
||
{
|
||
degenerates++;
|
||
return;
|
||
}
|
||
|
||
fprintf(outfile, "OBJECT\n");
|
||
fprintf(outfile, " TRIANGLE <%1.06f %1.06f %1.06f> <%1.06f %1.06f
|
||
%1.06f> <%1.06f %1.06f %1.06f> END_TRIANGLE\n", xcoords[0], ycoords[0], zcoords[0],
|
||
xcoords[3], ycoords[3], zcoords[3], xcoords[2], ycoords[2], zcoords[2]);
|
||
finishobj(curcolor);
|
||
return;
|
||
}
|
||
else if (strstr(curobj, "DIMENSION")) /* not implemented for now */
|
||
{
|
||
return;
|
||
}
|
||
return; /* no current object defined... */
|
||
}
|
||
|
||
void finishobj(color) /* conclude a DKB-style object definition */
|
||
int color;
|
||
{
|
||
float red, green, blue;
|
||
|
||
lookupcolor(color, &red, &green, &blue);
|
||
fprintf(outfile, "\n COLOR RED %1.06f GREEN %1.06f BLUE %1.06f\n", red,
|
||
green, blue);
|
||
fprintf(outfile, " TEXTURE Dull END_TEXTURE\n"); /* default surf. */
|
||
fprintf(outfile, "END_OBJECT\n\n");
|
||
printf("."); /* activity echo (happy dots) */
|
||
primitives++; /* count another output file primitive */
|
||
}
|
||
|
||
void lookupcolor(color, red, green, blue) /* basic AutoCAD 9-color pallette */
|
||
int color;
|
||
float *red, *green, *blue;
|
||
{
|
||
switch (color)
|
||
{
|
||
case 0: /* black */
|
||
*red = *green = *blue = 0.0;
|
||
break;
|
||
case 1: /* red */
|
||
*red = 1.0;
|
||
*blue = *green = 0.0;
|
||
break;
|
||
case 2: /* yellow */
|
||
*red = *green = 1.0;
|
||
*blue = 0.0;
|
||
break;
|
||
case 3: /* green */
|
||
*green = 1.0;
|
||
*red = *blue = 0.0;
|
||
break;
|
||
case 4: /* cyan */
|
||
*blue = *green = 1.0;
|
||
*red = 0.0;
|
||
break;
|
||
case 5: /* blue */
|
||
*blue = 1.0;
|
||
*red = *green = 0.0;
|
||
break;
|
||
case 6: /* magenta */
|
||
*blue = *red = 1.0;
|
||
*green = 0.0;
|
||
break;
|
||
case 8: /* dk. grey */
|
||
*red = *green = *blue = 0.5;
|
||
break;
|
||
case 9: /* lt. grey */
|
||
*red = *green = *blue = 0.75;
|
||
break;
|
||
case 7: /* white */
|
||
default: /* make anything else white (?) */
|
||
*red = *green = *blue = 1.0;
|
||
}
|
||
return;
|
||
}
|
||
|
||
int checkdegen(a, b, c) /* check for degenerate triangle structure */
|
||
int a, b, c;
|
||
{
|
||
if (
|
||
(xcoords[a] == xcoords[b] &&
|
||
ycoords[a] == ycoords[b] &&
|
||
zcoords[a] == zcoords[b]) ||
|
||
|
||
(xcoords[b] == xcoords[c] &&
|
||
ycoords[b] == ycoords[c] &&
|
||
zcoords[b] == zcoords[c]) ||
|
||
|
||
(xcoords[a] == xcoords[c] &&
|
||
ycoords[a] == ycoords[c] &&
|
||
zcoords[a] == zcoords[c]))
|
||
return(1);
|
||
return(0);
|
||
}
|
||
|
||
|