1# Copyright (c) 2011-2020, Manfred Moitzi
2# License: MIT License
3from enum import IntEnum, IntFlag
4
5DXF9 = 'AC1004'
6DXF10 = 'AC1006'
7DXF12 = 'AC1009'
8DXF13 = 'AC1012'
9DXF14 = 'AC1014'
10DXF2000 = 'AC1015'
11DXF2004 = 'AC1018'
12DXF2007 = 'AC1021'
13DXF2010 = 'AC1024'
14DXF2013 = 'AC1027'
15DXF2018 = 'AC1032'
16
17acad_release = {
18    DXF9: 'R9',
19    DXF10: 'R10',
20    DXF12: 'R12',
21    DXF13: 'R13',
22    DXF14: 'R14',
23    DXF2000: 'R2000',
24    DXF2004: 'R2004',
25    DXF2007: 'R2007',
26    DXF2010: 'R2010',
27    DXF2013: 'R2013',
28    DXF2018: 'R2018',
29}
30
31acad_maint_ver = {
32    DXF12: 0,
33    DXF2000: 6,
34    DXF2004: 0,
35    DXF2007: 25,
36    DXF2010: 6,
37    DXF2013: 105,
38    DXF2018: 4,
39}
40
41versions_supported_by_new = [
42    DXF12, DXF2000, DXF2004, DXF2007, DXF2010, DXF2013, DXF2018]
43versions_supported_by_save = versions_supported_by_new
44LATEST_DXF_VERSION = versions_supported_by_new[-1]
45
46acad_release_to_dxf_version = {
47    acad: dxf for dxf, acad in acad_release.items()
48}
49
50
51class DXFError(Exception):
52    pass
53
54
55class InvalidGeoDataException(DXFError):
56    pass
57
58
59class DXFStructureError(DXFError):
60    pass
61
62
63class DXFAppDataError(DXFStructureError):
64    pass
65
66
67class DXFXDataError(DXFStructureError):
68    pass
69
70
71class DXFVersionError(DXFError):
72    """ Errors related to features not supported by the chosen DXF Version """
73    pass
74
75
76class DXFInternalEzdxfError(DXFError):
77    """ Indicates internal errors -  should be fixed by mozman """
78    pass
79
80
81class DXFUnsupportedFeature(DXFError):
82    """ Indicates unsupported features for DXFEntities e.g. translation for
83    ACIS data
84    """
85    pass
86
87
88class DXFValueError(DXFError, ValueError):
89    pass
90
91
92class DXFKeyError(DXFError, KeyError):
93    pass
94
95
96class DXFAttributeError(DXFError, AttributeError):
97    pass
98
99
100class DXFIndexError(DXFError, IndexError):
101    pass
102
103
104class DXFTypeError(DXFError, TypeError):
105    pass
106
107
108class DXFTableEntryError(DXFValueError):
109    pass
110
111
112class DXFEncodingError(DXFError):
113    pass
114
115
116class DXFDecodingError(DXFError):
117    pass
118
119
120class DXFInvalidLineType(DXFValueError):
121    pass
122
123
124class DXFBlockInUseError(DXFValueError):
125    pass
126
127
128class DXFUndefinedBlockError(DXFKeyError):
129    pass
130
131
132MANAGED_SECTIONS = {
133    'HEADER', 'CLASSES', 'TABLES', 'BLOCKS', 'ENTITIES', 'OBJECTS', 'ACDSDATA'
134}
135
136TABLE_NAMES_ACAD_ORDER = [
137    'VPORT',
138    'LTYPE',
139    'LAYER',
140    'STYLE',
141    'VIEW',
142    'UCS',
143    'APPID',
144    'DIMSTYLE',
145    'BLOCK_RECORD',
146]
147
148APP_DATA_MARKER = 102
149SUBCLASS_MARKER = 100
150XDATA_MARKER = 1001
151COMMENT_MARKER = 999
152STRUCTURE_MARKER = 0
153HEADER_VAR_MARKER = 9
154ACAD_REACTORS = '{ACAD_REACTORS'
155ACAD_XDICTIONARY = '{ACAD_XDICTIONARY'
156XDICT_HANDLE_CODE = 360
157REACTOR_HANDLE_CODE = 330
158OWNER_CODE = 330
159
160# Special tag codes for internal purpose:
161# -1 to -5 id reserved by AutoCAD for internal use, but this tags will never be
162# saved to file.
163# Same approach here, the following tags have to be converted/transformed into
164# normal tags before saved to file.
165COMPRESSED_TAGS = -10
166
167BYBLOCK = 0
168BYLAYER = 256
169BYOBJECT = 257
170RED = 1
171YELLOW = 2
172GREEN = 3
173CYAN = 4
174BLUE = 5
175MAGENTA = 6
176BLACK = 7
177WHITE = 7
178
179
180class ACI(IntEnum):
181    BYBLOCK = 0
182    BYLAYER = 256
183    BYOBJECT = 257
184    RED = 1
185    YELLOW = 2
186    GREEN = 3
187    CYAN = 4
188    BLUE = 5
189    MAGENTA = 6
190    BLACK = 7
191    WHITE = 7
192
193
194LINEWEIGHT_BYLAYER = -1
195LINEWEIGHT_BYBLOCK = -2
196LINEWEIGHT_DEFAULT = -3
197
198VALID_DXF_LINEWEIGHTS = (
199    0, 5, 9, 13, 15, 18, 20, 25, 30, 35, 40, 50, 53, 60, 70, 80, 90,
200    100, 106, 120, 140, 158, 200, 211,
201)
202MAX_VALID_LINEWEIGHT = VALID_DXF_LINEWEIGHTS[-1]
203VALID_DXF_LINEWEIGHT_VALUES = set(VALID_DXF_LINEWEIGHTS) | {
204    LINEWEIGHT_DEFAULT, LINEWEIGHT_BYLAYER, LINEWEIGHT_BYBLOCK}
205
206# Entity: Polyline, Polymesh
207# 70 flags
208POLYLINE_CLOSED = 1
209POLYLINE_MESH_CLOSED_M_DIRECTION = POLYLINE_CLOSED
210POLYLINE_CURVE_FIT_VERTICES_ADDED = 2
211POLYLINE_SPLINE_FIT_VERTICES_ADDED = 4
212POLYLINE_3D_POLYLINE = 8
213POLYLINE_3D_POLYMESH = 16
214POLYLINE_MESH_CLOSED_N_DIRECTION = 32
215POLYLINE_POLYFACE = 64
216POLYLINE_GENERATE_LINETYPE_PATTERN = 128
217
218# Entity: Polymesh
219# 75 surface smooth type
220POLYMESH_NO_SMOOTH = 0
221POLYMESH_QUADRATIC_BSPLINE = 5
222POLYMESH_CUBIC_BSPLINE = 6
223POLYMESH_BEZIER_SURFACE = 8
224
225# Entity: Vertex
226# 70 flags
227VERTEXNAMES = ('vtx0', 'vtx1', 'vtx2', 'vtx3')
228VTX_EXTRA_VERTEX_CREATED = 1  # Extra vertex created by curve-fitting
229VTX_CURVE_FIT_TANGENT = 2  # Curve-fit tangent defined for this vertex.
230# A curve-fit tangent direction of 0 may be omitted from the DXF output, but is
231# significant if this bit is set.
232# 4 = unused, never set in dxf files
233VTX_SPLINE_VERTEX_CREATED = 8  # Spline vertex created by spline-fitting
234VTX_SPLINE_FRAME_CONTROL_POINT = 16
235VTX_3D_POLYLINE_VERTEX = 32
236VTX_3D_POLYGON_MESH_VERTEX = 64
237VTX_3D_POLYFACE_MESH_VERTEX = 128
238
239VERTEX_FLAGS = {
240    'AcDb2dPolyline': 0,
241    'AcDb3dPolyline': VTX_3D_POLYLINE_VERTEX,
242    'AcDbPolygonMesh': VTX_3D_POLYGON_MESH_VERTEX,
243    'AcDbPolyFaceMesh': VTX_3D_POLYGON_MESH_VERTEX | VTX_3D_POLYFACE_MESH_VERTEX,
244}
245POLYLINE_FLAGS = {
246    'AcDb2dPolyline': 0,
247    'AcDb3dPolyline': POLYLINE_3D_POLYLINE,
248    'AcDbPolygonMesh': POLYLINE_3D_POLYMESH,
249    'AcDbPolyFaceMesh': POLYLINE_POLYFACE,
250}
251
252# block-type flags (bit coded values, may be combined):
253# Entity: BLOCK
254# 70 flags
255
256# This is an anonymous block generated by hatching, associative dimensioning,
257# other internal operations, or an application:
258BLK_ANONYMOUS = 1
259
260# This block has non-constant attribute definitions (this bit is not set if the
261# block has any attribute definitions that are constant, or has no attribute
262# definitions at all)
263BLK_NON_CONSTANT_ATTRIBUTES = 2
264
265# This block is an external reference (xref):
266BLK_XREF = 4
267
268# This block is an xref overlay:
269BLK_XREF_OVERLAY = 8
270
271# This block is externally dependent:
272BLK_EXTERNAL = 16
273
274# This is a resolved external reference, or dependent of an external reference
275# (ignored on input):
276BLK_RESOLVED = 32
277
278# This definition is a referenced external reference (ignored on input):
279BLK_REFERENCED = 64
280
281LWPOLYLINE_CLOSED = 1
282LWPOLYLINE_PLINEGEN = 128
283
284TEXT_ALIGN_FLAGS = {
285    'LEFT': (0, 0),
286    'CENTER': (1, 0),
287    'RIGHT': (2, 0),
288    'ALIGNED': (3, 0),
289    'MIDDLE': (4, 0),
290    'FIT': (5, 0),
291    'BOTTOM_LEFT': (0, 1),
292    'BOTTOM_CENTER': (1, 1),
293    'BOTTOM_RIGHT': (2, 1),
294    'MIDDLE_LEFT': (0, 2),
295    'MIDDLE_CENTER': (1, 2),
296    'MIDDLE_RIGHT': (2, 2),
297    'TOP_LEFT': (0, 3),
298    'TOP_CENTER': (1, 3),
299    'TOP_RIGHT': (2, 3),
300}
301TEXT_ALIGNMENT_BY_FLAGS = dict(
302    (flags, name) for name, flags in TEXT_ALIGN_FLAGS.items()
303)
304
305LEFT = 0
306CENTER = 1
307RIGHT = 2
308ALIGNED = 3
309# MIDDLE = 4
310FIT = 5
311
312BASELINE = 0
313BOTTOM = 1
314MIDDLE = 2
315TOP = 3
316MIRROR_X = 2
317BACKWARD = MIRROR_X
318MIRROR_Y = 4
319UPSIDE_DOWN = MIRROR_Y
320
321VERTICAL_STACKED = 4  # only stored in TextStyle.dxf.flags!
322
323# Special char and encodings used in TEXT, ATTRIB and ATTDEF:
324# "%%d" -> "°"
325SPECIAL_CHAR_ENCODING = {
326    'c': 'Ø',  # alt-0216
327    'd': '°',  # alt-0176
328    'p': '±',  # alt-0177
329}
330# Inline codes for strokes in TEXT, ATTRIB and ATTDEF
331# %%u underline
332# %%o overline
333# %%k strike through
334# Formatting will be applied until the same code appears again or the end
335# of line.
336# Special codes and formatting is case insensitive: d=D, u=U
337
338MTEXT_TOP_LEFT = 1
339MTEXT_TOP_CENTER = 2
340MTEXT_TOP_RIGHT = 3
341MTEXT_MIDDLE_LEFT = 4
342MTEXT_MIDDLE_CENTER = 5
343MTEXT_MIDDLE_RIGHT = 6
344MTEXT_BOTTOM_LEFT = 7
345MTEXT_BOTTOM_CENTER = 8
346MTEXT_BOTTOM_RIGHT = 9
347
348MTEXT_ALIGN_FLAGS = {
349    'TOP_LEFT': 1,
350    'TOP_CENTER': 2,
351    'TOP_RIGHT': 3,
352    'MIDDLE_LEFT': 4,
353    'MIDDLE_CENTER': 5,
354    'MIDDLE_RIGHT': 6,
355    'BOTTOM_LEFT': 7,
356    'BOTTOM_CENTER': 8,
357    'BOTTOM_RIGHT': 9,
358}
359
360
361class MTextEntityAlignment(IntEnum):
362    TOP_LEFT = MTEXT_TOP_LEFT
363    TOP_CENTER = MTEXT_TOP_CENTER
364    TOP_RIGHT = MTEXT_TOP_RIGHT
365    MIDDLE_LEFT = MTEXT_MIDDLE_LEFT
366    MIDDLE_CENTER = MTEXT_MIDDLE_CENTER
367    MIDDLE_RIGHT = MTEXT_MIDDLE_RIGHT
368    BOTTOM_LEFT = MTEXT_BOTTOM_LEFT
369    BOTTOM_CENTER = MTEXT_BOTTOM_CENTER
370    BOTTOM_RIGHT = MTEXT_BOTTOM_RIGHT
371
372
373class MTextParagraphAlignment(IntEnum):
374    DEFAULT = 0
375    LEFT = 1
376    RIGHT = 2
377    CENTER = 3
378    JUSTIFIED = 4
379    DISTRIBUTED = 5
380
381
382MTEXT_LEFT_TO_RIGHT = 1
383MTEXT_TOP_TO_BOTTOM = 3
384MTEXT_BY_STYLE = 5
385
386
387class MTextFlowDirection(IntEnum):
388    LEFT_TO_RIGHT = MTEXT_LEFT_TO_RIGHT
389    TOP_TO_BOTTOM = MTEXT_TOP_TO_BOTTOM
390    BY_STYLE = MTEXT_BY_STYLE
391
392
393class MTextLineAlignment(IntEnum):  # exclusive state
394    BOTTOM = 0
395    MIDDLE = 1
396    TOP = 2
397
398
399class MTextStroke(IntFlag):  # Combination of flags is possible
400    UNDERLINE = 1
401    STRIKE_THROUGH = 2
402    OVERLINE = 4
403
404
405MTEXT_AT_LEAST = 1
406MTEXT_EXACT = 2
407
408
409class MTextLineSpacing(IntEnum):
410    AT_LEAST = MTEXT_AT_LEAST
411    EXACT = MTEXT_EXACT
412
413
414MTEXT_COLOR_INDEX = {
415    'red': RED,
416    'yellow': YELLOW,
417    'green': GREEN,
418    'cyan': CYAN,
419    'blue': BLUE,
420    'magenta': MAGENTA,
421    'white': WHITE,
422}
423
424MTEXT_BG_OFF = 0
425MTEXT_BG_COLOR = 1
426MTEXT_BG_WINDOW_COLOR = 2
427MTEXT_BG_CANVAS_COLOR = 3
428MTEXT_TEXT_FRAME = 16
429
430
431class MTextBackgroundColor(IntEnum):
432    OFF = MTEXT_BG_OFF
433    COLOR = MTEXT_BG_COLOR
434    WINDOW = MTEXT_BG_WINDOW_COLOR
435    CANVAS = MTEXT_BG_CANVAS_COLOR
436
437
438MTEXT_INLINE_ALIGN = {
439    'BOTTOM': MTextLineAlignment.BOTTOM,
440    'MIDDLE': MTextLineAlignment.MIDDLE,
441    'TOP': MTextLineAlignment.TOP,
442}
443
444CLOSED_SPLINE = 1
445PERIODIC_SPLINE = 2
446RATIONAL_SPLINE = 4
447PLANAR_SPLINE = 8
448LINEAR_SPLINE = 16
449
450# Hatch constants
451HATCH_TYPE_USER_DEFINED = 0
452HATCH_TYPE_PREDEFINED = 1
453HATCH_TYPE_CUSTOM = 2
454
455HATCH_STYLE_NORMAL = 0
456HATCH_STYLE_NESTED = 0
457HATCH_STYLE_OUTERMOST = 1
458HATCH_STYLE_IGNORE = 2
459
460BOUNDARY_PATH_DEFAULT = 0
461BOUNDARY_PATH_EXTERNAL = 1
462BOUNDARY_PATH_POLYLINE = 2
463BOUNDARY_PATH_DERIVED = 4
464BOUNDARY_PATH_TEXTBOX = 8
465BOUNDARY_PATH_OUTERMOST = 16
466
467GRADIENT_TYPES = frozenset([
468    'LINEAR',
469    'CYLINDER',
470    'INVCYLINDER',
471    'SPHERICAL',
472    'INVSPHERICAL',
473    'HEMISPHERICAL',
474    'INVHEMISPHERICAL',
475    'CURVED',
476    'INVCURVED'
477])
478
479# Viewport Status Flags (VSF) group code=90
480VSF_PERSPECTIVE_MODE = 0x1  # enabled if set
481VSF_FRONT_CLIPPING = 0x2  # enabled if set
482VSF_BACK_CLIPPING = 0x4  # enabled if set
483VSF_USC_FOLLOW = 0x8  # enabled if set
484VSF_FRONT_CLIPPING_NOT_AT_EYE = 0x10  # enabled if set
485VSF_UCS_ICON_VISIBILITY = 0x20  # enabled if set
486VSF_UCS_ICON_AT_ORIGIN = 0x40  # enabled if set
487VSF_FAST_ZOOM = 0x80  # enabled if set
488VSF_SNAP_MODE = 0x100  # enabled if set
489VSF_GRID_MODE = 0x200  # enabled if set
490VSF_ISOMETRIC_SNAP_STYLE = 0x400  # enabled if set
491VSF_HIDE_PLOT_MODE = 0x800  # enabled if set
492
493# If set and kIsoPairRight is not set, then isopair top is enabled.
494# If both kIsoPairTop and kIsoPairRight are set, then isopair left is enabled:
495VSF_KISOPAIR_TOP = 0x1000
496
497# If set and kIsoPairTop is not set, then isopair right is enabled:
498VSF_KISOPAIR_RIGHT = 0x2000
499VSF_VIEWPORT_ZOOM_LOCKING = 0x4000  # enabled if set
500VSF_LOCK_ZOOM = 0x4000  # enabled if set
501VSF_CURRENTLY_ALWAYS_ENABLED = 0x8000  # always set without a meaning :)
502VSF_NON_RECTANGULAR_CLIPPING = 0x10000  # enabled if set
503VSF_TURN_VIEWPORT_OFF = 0x20000
504VSF_NO_GRID_LIMITS = 0x40000
505VSF_ADAPTIVE_GRID_DISPLAY = 0x80000
506VSF_SUBDIVIDE_GRID = 0x100000
507VSF_GRID_FOLLOW_WORKPLANE = 0x200000
508
509# Viewport Render Mode (VRM) group code=281
510VRM_2D_OPTIMIZED = 0
511VRM_WIREFRAME = 1
512VRM_HIDDEN_LINE = 2
513VRM_FLAT_SHADED = 3
514VRM_GOURAUD_SHADED = 4
515VRM_FLAT_SHADED_WITH_WIREFRAME = 5
516VRM_GOURAUD_SHADED_WITH_WIREFRAME = 6
517
518IMAGE_SHOW = 1
519IMAGE_SHOW_WHEN_NOT_ALIGNED = 2
520IMAGE_USE_CLIPPING_BOUNDARY = 4
521IMAGE_TRANSPARENCY_IS_ON = 8
522
523UNDERLAY_CLIPPING = 1
524UNDERLAY_ON = 2
525UNDERLAY_MONOCHROME = 4
526UNDERLAY_ADJUST_FOR_BG = 8
527
528DIM_LINEAR = 0
529DIM_ALIGNED = 1
530DIM_ANGULAR = 2
531DIM_DIAMETER = 3
532DIM_RADIUS = 4
533DIM_ANGULAR_3P = 5
534DIM_ORDINATE = 6
535DIM_BLOCK_EXCLUSIVE = 32
536DIM_ORDINATE_TYPE = 64
537DIM_USER_LOCATION_OVERRIDE = 128
538
539DIMZIN_SUPPRESS_ZERO_FEET_AND_PRECISELY_ZERO_INCHES = 0
540DIMZIN_INCLUDES_ZERO_FEET_AND_PRECISELY_ZERO_INCHES = 1
541DIMZIN_INCLUDES_ZERO_FEET_AND_SUPPRESSES_ZERO_INCHES = 2
542DIMZIN_INCLUDES_ZERO_INCHES_AND_SUPPRESSES_ZERO_FEET = 3
543DIMZIN_SUPPRESSES_LEADING_ZEROS = 4  # only decimal dimensions
544DIMZIN_SUPPRESSES_TRAILING_ZEROS = 8  # only decimal dimensions
545
546# ATTRIB & ATTDEF flags
547ATTRIB_INVISIBLE = 1  # Attribute is invisible (does not appear)
548ATTRIB_CONST = 2  # This is a constant attribute
549ATTRIB_VERIFY = 4  # Verification is required on input of this attribute
550ATTRIB_IS_PRESET = 8  # no prompt during insertion
551
552# '|' is allowed in layer name, as ltype name ...
553INVALID_NAME_CHARACTERS = '<>/\\":;?*=`'
554INVALID_LAYER_NAME_CHARACTERS = set(INVALID_NAME_CHARACTERS)
555
556STD_SCALES = {
557    1: (1. / 128., 12.),
558    2: (1. / 64., 12.),
559    3: (1. / 32., 12.),
560    4: (1. / 16., 12.),
561    5: (3. / 32., 12.),
562    6: (1. / 8., 12.),
563    7: (3. / 16., 12.),
564    8: (1. / 4., 12.),
565    9: (3. / 8., 12.),
566    10: (1. / 2., 12.),
567    11: (3. / 4., 12.),
568    12: (1., 12.),
569    13: (3., 12.),
570    14: (6., 12.),
571    15: (12., 12.),
572    16: (1., 1.),
573    17: (1., 2.),
574    18: (1., 4.),
575    19: (1., 8.),
576    20: (1., 10.),
577    21: (1., 16.),
578    22: (1., 20.),
579    23: (1., 30.),
580    24: (1., 40.),
581    25: (1., 50.),
582    26: (1., 100.),
583    27: (2., 1.),
584    28: (4., 1.),
585    29: (8., 1.),
586    30: (10., 1.),
587    31: (100., 1.),
588    32: (1000., 1.),
589}
590
591RASTER_UNITS = {
592    'mm': 1,
593    'cm': 2,
594    'm': 3,
595    'km': 4,
596    'in': 5,
597    'ft': 6,
598    'yd': 7,
599    'mi': 8,
600}
601
602MODEL_SPACE_R2000 = '*Model_Space'
603MODEL_SPACE_R12 = '$Model_Space'
604PAPER_SPACE_R2000 = '*Paper_Space'
605PAPER_SPACE_R12 = '$Paper_Space'
606TMP_PAPER_SPACE_NAME = '*Paper_Space999999'
607
608MODEL_SPACE = {
609    MODEL_SPACE_R2000.lower(),
610    MODEL_SPACE_R12.lower(),
611}
612
613PAPER_SPACE = {
614    PAPER_SPACE_R2000.lower(),
615    PAPER_SPACE_R12.lower(),
616}
617
618LAYOUT_NAMES = {
619    PAPER_SPACE_R2000.lower(),
620    PAPER_SPACE_R12.lower(),
621    MODEL_SPACE_R2000.lower(),
622    MODEL_SPACE_R12.lower(),
623}
624
625
626class SortEntities:
627    DISABLE = 0
628    SELECTION = 1  # 1 = Sorts for object selection
629    SNAP = 2  # 2 = Sorts for object snap
630    REDRAW = 4  # 4 = Sorts for redraws; obsolete
631    MSLIDE = 8  # 8 = Sorts for MSLIDE command slide creation; obsolete
632    REGEN = 16  # 16 = Sorts for REGEN commands
633    PLOT = 32  # 32 = Sorts for plotting
634    POSTSCRIPT = 64  # 64 = Sorts for PostScript output; obsolete
635
636
637DIMJUST = {
638    'center': 0,
639    'left': 1,
640    'right': 2,
641    'above1': 3,
642    'above2': 4,
643}
644
645DIMTAD = {
646    'above': 1,
647    'center': 0,
648    'below': 4,
649}
650
651
652class InsertUnits(IntEnum):
653    Unitless = 0
654    Inches = 1
655    Feet = 2
656    Miles = 3
657    Millimeters = 4
658    Centimeters = 5
659    Meters = 6
660    Kilometers = 7
661    Microinches = 8
662    Mils = 9
663    Yards = 10
664    Angstroms = 11
665    Nanometers = 12
666    Microns = 13
667    Decimeters = 14
668    Decameters = 15
669    Hectometers = 16
670    Gigameters = 17
671    AstronomicalUnits = 18
672    Lightyears = 19
673    Parsecs = 20
674    USSurveyFeet = 21
675    USSurveyInch = 22
676    USSurveyYard = 23
677    USSurveyMile = 24
678
679
680DEFAULT_ENCODING = 'cp1252'
681
682MLINE_TOP = 0
683MLINE_ZERO = 1
684MLINE_BOTTOM = 2
685MLINE_HAS_VERTICES = 1
686MLINE_CLOSED = 2
687MLINE_SUPPRESS_START_CAPS = 4
688MLINE_SUPPRESS_END_CAPS = 8
689
690MLINESTYLE_FILL = 1
691MLINESTYLE_MITER = 2
692MLINESTYLE_START_SQARE = 16
693MLINESTYLE_START_INNER_ARC = 32
694MLINESTYLE_START_ROUND = 64
695MLINESTYLE_END_SQUARE = 256
696MLINESTYLE_END_INNER_ARC = 512
697MLINESTYLE_END_ROUND = 1024
698