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