# Copyright (c) 2022-2024, Manfred Moitzi # License: MIT License import enum from ezdxf.version import __version__ # SAT Export Requirements for Autodesk Products # --------------------------------------------- # Script to create test files: # examples/acistools/create_3dsolid_cube.py # DXF R2000, R2004, R2007, R2010: OK, tested with TrueView 2022 # ACIS version 700 # ACIS version string: "ACIS 32.0 NT" # record count: 0, not required # body count: 1, required # ASM header: no # end-marker: "End-of-ACIS-data" # DXF R2004, R2007, R2010: OK, tested with TrueView 2022 # ACIS version 20800 # ACIS version string: "ACIS 208.00 NT" # record count: 0, not required # body count: n + 1 (asm-header), required # ASM header: "208.0.4.7009" # end-marker: "End-of-ACIS-data" # SAB Export Requirements for Autodesk Products # --------------------------------------------- # DXF R2013, R2018: OK, tested with TrueView 2022 # ACIS version 21800 # ACIS version string: "ACIS 208.00 NT" # record count: 0, not required # body count: n + 1 (asm-header), required # ASM header: "208.0.4.7009" # end-marker: "End-of-ASM-data" ACIS_VERSION = { 400: "ACIS 4.00 NT", # DXF R2000, no asm header - only R2000 700: "ACIS 32.0 NT", # DXF R2000-R2010, no asm header 20800: "ACIS 208.00 NT", # DXF R2013 with asm-header, asm-end-marker 21800: "ACIS 218.00 NT", # DXF R2013 with asm-header, asm-end-marker 22300: "ACIS 223.00 NT", # DXF R2018 with asm-header, asm-end-marker } ASM_VERSION = { 20800: "208.0.4.7009", # DXF R2004, R2007, R2010 21800: "208.0.4.7009", # DXF R2013, default version for R2013 and R2018 22300: "222.0.0.1700", # DXF R2018 } EZDXF_BUILDER_ID = f"ezdxf v{__version__} ACIS Builder" MIN_EXPORT_VERSION = 700 # ACIS version 700 is the default version for DXF R2000, R2004, R2007 and R2010 (SAT) # ACIS version 21800 is the default version for DXF R2013 and R2018 (SAB) DEFAULT_SAT_VERSION = 700 DEFAULT_SAB_VERSION = 21800 DATE_FMT = "%a %b %d %H:%M:%S %Y" END_OF_ACIS_DATA_SAT = "End-of-ACIS-data" END_OF_ACIS_DATA_SAB = b"\x0e\x03End\x0e\x02of\x0e\x04ACIS\x0d\x04data" END_OF_ASM_DATA_SAT = "End-of-ASM-data" END_OF_ASM_DATA_SAB = b"\x0e\x03End\x0e\x02of\x0e\x03ASM\x0d\x04data" BEGIN_OF_ACIS_HISTORY_DATA = "Begin-of-ACIS-History-data" END_OF_ACIS_HISTORY_DATA = "End-of-ACIS-History-data" DATA_END_MARKERS = ( END_OF_ACIS_DATA_SAT, BEGIN_OF_ACIS_HISTORY_DATA, END_OF_ASM_DATA_SAT, ) NULL_PTR_NAME = "null-ptr" NONE_ENTITY_NAME = "none-entity" NOR_TOL = 1e-10 RES_TOL = 9.9999999999999995e-7 BOOL_SPECIFIER = { "forward": True, "forward_v": True, "reversed": False, "reversed_v": False, "single": True, "double": False, } ACIS_SIGNATURE = b"ACIS BinaryFile" # DXF R2013/R2018 ASM_SIGNATURE = b"ASM BinaryFile4" # DXF R2018 SIGNATURES = [ACIS_SIGNATURE, ASM_SIGNATURE] def is_valid_export_version(version: int): return version >= MIN_EXPORT_VERSION and version in ACIS_VERSION class Tags(enum.IntEnum): NO_TYPE = 0x00 BYTE = 0x01 # not used in files! CHAR = 0x02 # not used in files! SHORT = 0x03 # not used in files! INT = 0x04 # 32-bit signed integer FLOAT = 0x05 # not used in files! DOUBLE = 0x06 # 64-bit double precision floating point value STR = 0x07 # count is the following 8-bit uchar STR2 = 0x08 # not used in files! STR3 = 0x09 # not used in files! # bool value for reversed, double, I - depends on context BOOL_TRUE = 0x0A # bool value forward, single, forward_v - depends on context BOOL_FALSE = 0x0B POINTER = 0x0C ENTITY_TYPE = 0x0D ENTITY_TYPE_EX = 0x0E SUBTYPE_START = 0x0F SUBTYPE_END = 0x10 RECORD_END = 0x11 LITERAL_STR = 0x12 # count ia a 32-bit uint, see transform entity LOCATION_VEC = 0x13 # vector (3 doubles) DIRECTION_VEC = 0x14 # vector (3 doubles) # Enumeration are stored as strings in SAT and ints in SAB. # It's not possible to translate SAT enums (strings) to SAB enums (int) and # vice versa without knowing the implementation details. Each enumeration # is specific to the class where it is used. ENUM = 0x15 # 0x16: ??? UNKNOWN_0x17 = 0x17 # double # entity type structure: # 0x0D 0x04 (char count of) "body" = SAT "body" # 0x0E 0x05 "plane" 0x0D 0x07 "surface" = SAT "plane-surface" # 0x0E 0x06 "ref_vt" 0x0E 0x03 "eye" 0x0D 0x06 "attrib" = SAT "ref_vt-eye-attrib" class Flags(enum.IntFlag): HAS_HISTORY = 1 class AcisException(Exception): pass class InvalidLinkStructure(AcisException): pass class ParsingError(AcisException): pass class ExportError(AcisException): pass class EndOfAcisData(AcisException): pass class Features: LAW_SPL = 400 CONE_SCALING = 400 LOFT_LAW = 400 REF_MIN_UV_GRID = 400 VBLEND_AUTO = 400 BL_ENV_SF = 400 ELLIPSE_OFFSET = 500 TOL_MODELING = 500 APPROX_SUMMARY = 500 TAPER_SCALING = 500 LAZY_B_SPLINE = 500 DM_MULTI_SURF = 500 GA_COPY_ACTION = 600 DM_MULTI_SURF_COLOR = 600 RECAL_SKIN_ERROR = 520 TAPER_U_RULED = 600 DM_60 = 600 LOFT_PCURVE = 600 EELIST_OWNER = 600 ANNO_HOOKED = 700 PATTERN = 700 ENTITY_TAGS = 700 AT = 700 NET_LAW = 700 STRINGLESS_HISTORY = 700