@mlightcad/data-model 1.15.21 → 1.15.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/dist/data-model.cjs +16 -16
  2. package/lib/base/AcDbDxfFiler.d.ts +27 -0
  3. package/lib/base/AcDbDxfFiler.d.ts.map +1 -1
  4. package/lib/base/AcDbDxfFiler.js +85 -9
  5. package/lib/base/AcDbDxfFiler.js.map +1 -1
  6. package/lib/base/AcDbObject.d.ts +10 -0
  7. package/lib/base/AcDbObject.d.ts.map +1 -1
  8. package/lib/base/AcDbObject.js +38 -1
  9. package/lib/base/AcDbObject.js.map +1 -1
  10. package/lib/database/AcDbBlockTableRecord.d.ts +11 -0
  11. package/lib/database/AcDbBlockTableRecord.d.ts.map +1 -1
  12. package/lib/database/AcDbBlockTableRecord.js +22 -1
  13. package/lib/database/AcDbBlockTableRecord.js.map +1 -1
  14. package/lib/database/AcDbDatabase.d.ts +60 -0
  15. package/lib/database/AcDbDatabase.d.ts.map +1 -1
  16. package/lib/database/AcDbDatabase.js +647 -157
  17. package/lib/database/AcDbDatabase.js.map +1 -1
  18. package/lib/database/AcDbDimStyleTableRecord.js +1 -1
  19. package/lib/database/AcDbDimStyleTableRecord.js.map +1 -1
  20. package/lib/database/AcDbDwgVersion.d.ts +6 -0
  21. package/lib/database/AcDbDwgVersion.d.ts.map +1 -1
  22. package/lib/database/AcDbDwgVersion.js +2 -1
  23. package/lib/database/AcDbDwgVersion.js.map +1 -1
  24. package/lib/database/AcDbViewportTableRecord.d.ts +1 -1
  25. package/lib/database/AcDbViewportTableRecord.d.ts.map +1 -1
  26. package/lib/database/AcDbViewportTableRecord.js +18 -11
  27. package/lib/database/AcDbViewportTableRecord.js.map +1 -1
  28. package/lib/dxf/AcDbDxfDocumentReader.d.ts +19 -1
  29. package/lib/dxf/AcDbDxfDocumentReader.d.ts.map +1 -1
  30. package/lib/dxf/AcDbDxfDocumentReader.js +92 -12
  31. package/lib/dxf/AcDbDxfDocumentReader.js.map +1 -1
  32. package/lib/dxf/AcDbDxfEntityFactory.d.ts.map +1 -1
  33. package/lib/dxf/AcDbDxfEntityFactory.js +20 -1
  34. package/lib/dxf/AcDbDxfEntityFactory.js.map +1 -1
  35. package/lib/dxf/AcDbDxfHeaderReader.d.ts.map +1 -1
  36. package/lib/dxf/AcDbDxfHeaderReader.js +76 -7
  37. package/lib/dxf/AcDbDxfHeaderReader.js.map +1 -1
  38. package/lib/dxf/AcDbDxfObjectRecordName.d.ts +13 -0
  39. package/lib/dxf/AcDbDxfObjectRecordName.d.ts.map +1 -0
  40. package/lib/dxf/AcDbDxfObjectRecordName.js +98 -0
  41. package/lib/dxf/AcDbDxfObjectRecordName.js.map +1 -0
  42. package/lib/dxf/AcDbDxfObjectsReader.d.ts +15 -2
  43. package/lib/dxf/AcDbDxfObjectsReader.d.ts.map +1 -1
  44. package/lib/dxf/AcDbDxfObjectsReader.js +226 -110
  45. package/lib/dxf/AcDbDxfObjectsReader.js.map +1 -1
  46. package/lib/dxf/AcDbDxfRawTags.d.ts +50 -0
  47. package/lib/dxf/AcDbDxfRawTags.d.ts.map +1 -0
  48. package/lib/dxf/AcDbDxfRawTags.js +116 -0
  49. package/lib/dxf/AcDbDxfRawTags.js.map +1 -0
  50. package/lib/entity/AcDb2dPolyline.d.ts.map +1 -1
  51. package/lib/entity/AcDb2dPolyline.js +53 -1
  52. package/lib/entity/AcDb2dPolyline.js.map +1 -1
  53. package/lib/entity/AcDb2dVertex.d.ts +5 -0
  54. package/lib/entity/AcDb2dVertex.d.ts.map +1 -1
  55. package/lib/entity/AcDb2dVertex.js +98 -0
  56. package/lib/entity/AcDb2dVertex.js.map +1 -1
  57. package/lib/entity/AcDb3dPolyline.d.ts.map +1 -1
  58. package/lib/entity/AcDb3dPolyline.js +20 -1
  59. package/lib/entity/AcDb3dPolyline.js.map +1 -1
  60. package/lib/entity/AcDb3dSolid.d.ts +5 -0
  61. package/lib/entity/AcDb3dSolid.d.ts.map +1 -1
  62. package/lib/entity/AcDb3dSolid.js +70 -0
  63. package/lib/entity/AcDb3dSolid.js.map +1 -1
  64. package/lib/entity/AcDb3dVertex.d.ts +5 -0
  65. package/lib/entity/AcDb3dVertex.d.ts.map +1 -1
  66. package/lib/entity/AcDb3dVertex.js +65 -0
  67. package/lib/entity/AcDb3dVertex.js.map +1 -1
  68. package/lib/entity/AcDbArc.d.ts.map +1 -1
  69. package/lib/entity/AcDbArc.js +11 -0
  70. package/lib/entity/AcDbArc.js.map +1 -1
  71. package/lib/entity/AcDbArcAlignedText.d.ts.map +1 -1
  72. package/lib/entity/AcDbArcAlignedText.js +254 -0
  73. package/lib/entity/AcDbArcAlignedText.js.map +1 -1
  74. package/lib/entity/AcDbAttribute.d.ts +5 -0
  75. package/lib/entity/AcDbAttribute.d.ts.map +1 -1
  76. package/lib/entity/AcDbAttribute.js +156 -0
  77. package/lib/entity/AcDbAttribute.js.map +1 -1
  78. package/lib/entity/AcDbAttributeDefinition.d.ts +5 -0
  79. package/lib/entity/AcDbAttributeDefinition.d.ts.map +1 -1
  80. package/lib/entity/AcDbAttributeDefinition.js +167 -0
  81. package/lib/entity/AcDbAttributeDefinition.js.map +1 -1
  82. package/lib/entity/AcDbBlockReference.d.ts.map +1 -1
  83. package/lib/entity/AcDbBlockReference.js +57 -3
  84. package/lib/entity/AcDbBlockReference.js.map +1 -1
  85. package/lib/entity/AcDbCircle.d.ts.map +1 -1
  86. package/lib/entity/AcDbCircle.js +11 -0
  87. package/lib/entity/AcDbCircle.js.map +1 -1
  88. package/lib/entity/AcDbEntity.d.ts +9 -0
  89. package/lib/entity/AcDbEntity.d.ts.map +1 -1
  90. package/lib/entity/AcDbEntity.js +54 -1
  91. package/lib/entity/AcDbEntity.js.map +1 -1
  92. package/lib/entity/AcDbFace.d.ts +7 -0
  93. package/lib/entity/AcDbFace.d.ts.map +1 -1
  94. package/lib/entity/AcDbFace.js +99 -0
  95. package/lib/entity/AcDbFace.js.map +1 -1
  96. package/lib/entity/AcDbFcf.d.ts.map +1 -1
  97. package/lib/entity/AcDbFcf.js +66 -0
  98. package/lib/entity/AcDbFcf.js.map +1 -1
  99. package/lib/entity/AcDbHatch.d.ts.map +1 -1
  100. package/lib/entity/AcDbHatch.js +187 -0
  101. package/lib/entity/AcDbHatch.js.map +1 -1
  102. package/lib/entity/AcDbLine.d.ts.map +1 -1
  103. package/lib/entity/AcDbLine.js +44 -0
  104. package/lib/entity/AcDbLine.js.map +1 -1
  105. package/lib/entity/AcDbMLeader.d.ts +8 -0
  106. package/lib/entity/AcDbMLeader.d.ts.map +1 -1
  107. package/lib/entity/AcDbMLeader.js +340 -0
  108. package/lib/entity/AcDbMLeader.js.map +1 -1
  109. package/lib/entity/AcDbMLine.d.ts.map +1 -1
  110. package/lib/entity/AcDbMLine.js +119 -1
  111. package/lib/entity/AcDbMLine.js.map +1 -1
  112. package/lib/entity/AcDbMText.d.ts +40 -8
  113. package/lib/entity/AcDbMText.d.ts.map +1 -1
  114. package/lib/entity/AcDbMText.js +395 -22
  115. package/lib/entity/AcDbMText.js.map +1 -1
  116. package/lib/entity/AcDbPoint.d.ts.map +1 -1
  117. package/lib/entity/AcDbPoint.js +55 -0
  118. package/lib/entity/AcDbPoint.js.map +1 -1
  119. package/lib/entity/AcDbPolyline.d.ts.map +1 -1
  120. package/lib/entity/AcDbPolyline.js +46 -2
  121. package/lib/entity/AcDbPolyline.js.map +1 -1
  122. package/lib/entity/AcDbProxyEntity.d.ts +5 -0
  123. package/lib/entity/AcDbProxyEntity.d.ts.map +1 -1
  124. package/lib/entity/AcDbProxyEntity.js +77 -0
  125. package/lib/entity/AcDbProxyEntity.js.map +1 -1
  126. package/lib/entity/AcDbRasterImage.d.ts.map +1 -1
  127. package/lib/entity/AcDbRasterImage.js +99 -0
  128. package/lib/entity/AcDbRasterImage.js.map +1 -1
  129. package/lib/entity/AcDbShape.d.ts.map +1 -1
  130. package/lib/entity/AcDbShape.js +63 -0
  131. package/lib/entity/AcDbShape.js.map +1 -1
  132. package/lib/entity/AcDbSpline.d.ts +6 -0
  133. package/lib/entity/AcDbSpline.d.ts.map +1 -1
  134. package/lib/entity/AcDbSpline.js +182 -0
  135. package/lib/entity/AcDbSpline.js.map +1 -1
  136. package/lib/entity/AcDbTable.d.ts.map +1 -1
  137. package/lib/entity/AcDbTable.js +24 -2
  138. package/lib/entity/AcDbTable.js.map +1 -1
  139. package/lib/entity/AcDbText.d.ts +4 -0
  140. package/lib/entity/AcDbText.d.ts.map +1 -1
  141. package/lib/entity/AcDbText.js +254 -119
  142. package/lib/entity/AcDbText.js.map +1 -1
  143. package/lib/entity/AcDbTextExtentsHelpers.d.ts +14 -1
  144. package/lib/entity/AcDbTextExtentsHelpers.d.ts.map +1 -1
  145. package/lib/entity/AcDbTextExtentsHelpers.js +28 -5
  146. package/lib/entity/AcDbTextExtentsHelpers.js.map +1 -1
  147. package/lib/entity/AcDbTrace.d.ts +6 -0
  148. package/lib/entity/AcDbTrace.d.ts.map +1 -1
  149. package/lib/entity/AcDbTrace.js +117 -0
  150. package/lib/entity/AcDbTrace.js.map +1 -1
  151. package/lib/entity/AcDbUnknownEntity.d.ts +46 -0
  152. package/lib/entity/AcDbUnknownEntity.d.ts.map +1 -0
  153. package/lib/entity/AcDbUnknownEntity.js +210 -0
  154. package/lib/entity/AcDbUnknownEntity.js.map +1 -0
  155. package/lib/entity/AcDbViewport.d.ts +5 -0
  156. package/lib/entity/AcDbViewport.d.ts.map +1 -1
  157. package/lib/entity/AcDbViewport.js +307 -0
  158. package/lib/entity/AcDbViewport.js.map +1 -1
  159. package/lib/entity/AcDbWipeout.d.ts.map +1 -1
  160. package/lib/entity/AcDbWipeout.js +12 -1
  161. package/lib/entity/AcDbWipeout.js.map +1 -1
  162. package/lib/entity/dimension/AcDbDimension.d.ts.map +1 -1
  163. package/lib/entity/dimension/AcDbDimension.js +22 -2
  164. package/lib/entity/dimension/AcDbDimension.js.map +1 -1
  165. package/lib/entity/dimension/AcDbOrdinateDimension.d.ts.map +1 -1
  166. package/lib/entity/dimension/AcDbOrdinateDimension.js +5 -1
  167. package/lib/entity/dimension/AcDbOrdinateDimension.js.map +1 -1
  168. package/lib/entity/index.d.ts +1 -0
  169. package/lib/entity/index.d.ts.map +1 -1
  170. package/lib/entity/index.js +1 -0
  171. package/lib/entity/index.js.map +1 -1
  172. package/lib/ly/AcLyLayerFilterIO.d.ts +2 -0
  173. package/lib/ly/AcLyLayerFilterIO.d.ts.map +1 -1
  174. package/lib/ly/AcLyLayerFilterIO.js.map +1 -1
  175. package/lib/object/AcDbDictionary.d.ts +16 -0
  176. package/lib/object/AcDbDictionary.d.ts.map +1 -1
  177. package/lib/object/AcDbDictionary.js +37 -1
  178. package/lib/object/AcDbDictionary.js.map +1 -1
  179. package/lib/object/AcDbObjectContextData.d.ts +21 -0
  180. package/lib/object/AcDbObjectContextData.d.ts.map +1 -1
  181. package/lib/object/AcDbObjectContextData.js +49 -0
  182. package/lib/object/AcDbObjectContextData.js.map +1 -1
  183. package/lib/object/AcDbUnknownObject.d.ts +24 -0
  184. package/lib/object/AcDbUnknownObject.d.ts.map +1 -0
  185. package/lib/object/AcDbUnknownObject.js +97 -0
  186. package/lib/object/AcDbUnknownObject.js.map +1 -0
  187. package/lib/object/index.d.ts +1 -0
  188. package/lib/object/index.d.ts.map +1 -1
  189. package/lib/object/index.js +1 -0
  190. package/lib/object/index.js.map +1 -1
  191. package/package.json +5 -5
@@ -103,7 +103,9 @@ import { AcDbObject, TEMP_OBJECT_ID_PREFIX, acdbAssignWorkingDatabase } from '..
103
103
  import { AcDbOpenMode } from '../base/AcDbOpenMode.js';
104
104
  import { AcDbRegenerator } from '../converter/AcDbRegenerator.js';
105
105
  import { AcDbDatabaseConverterManager, AcDbFileType } from './AcDbDatabaseConverterManager.js';
106
+ import { AcDbEntity } from '../entity/AcDbEntity.js';
106
107
  import { AcDbPolyline } from '../entity/AcDbPolyline.js';
108
+ import { AcDbUnknownEntity } from '../entity/AcDbUnknownEntity.js';
107
109
  import { ACAD_APPID, ACDB_COMPAREHATCH_DEFAULT, ACDB_COMPAREHATCH_MAX, ACDB_COMPAREHATCH_MIN, ACDB_COMPARERCMARGIN_DEFAULT, ACDB_COMPARERCMARGIN_MAX, ACDB_COMPARERCMARGIN_MIN, ACDB_COMPARETEXT_DEFAULT, ACDB_COMPARETEXT_MAX, ACDB_COMPARETEXT_MIN, ACDB_COMPARETOLERANCE_DEFAULT, ACDB_COMPARETOLERANCE_MAX, ACDB_COMPARETOLERANCE_MIN, acdbCoerceIntegerSysVar, ACTIVE_VPORT_NAME, ByBlock, ByLayer, DEFAULT_MLEADER_STYLE, DEFAULT_MLINE_STYLE, DEFAULT_LINE_TYPE, DEFAULT_TEXT_STYLE, MLIGHTCAD_APPID } from '../misc/AcDbConstants.js';
108
110
  import { AcDbAngleUnits } from '../misc/AcDbAngleUnits.js';
109
111
  import { AcDbDataGenerator } from '../misc/AcDbDataGenerator.js';
@@ -112,6 +114,7 @@ import { AcDbFormatter } from '../misc/AcDbFormatter.js';
112
114
  import { AcDbLinearUnits } from '../misc/AcDbLinearUnits.js';
113
115
  import { AcDbUnitsValue } from '../misc/AcDbUnitsValue.js';
114
116
  import { AcDbDictionary } from '../object/AcDbDictionary.js';
117
+ import { AcDbGroup } from '../object/AcDbGroup.js';
115
118
  import { AcDbMLeaderStyle } from '../object/AcDbMLeaderStyle.js';
116
119
  import { AcDbMlineStyle } from '../object/AcDbMlineStyle.js';
117
120
  import { AcDbXrecord } from '../object/AcDbXrecord.js';
@@ -144,6 +147,50 @@ import { AcDbLayout } from '../object/layout/AcDbLayout.js';
144
147
  import { AcDbLayoutDictionary } from '../object/layout/AcDbLayoutDictionary.js';
145
148
  import { AcDbSymbolTable } from './AcDbSymbolTable.js';
146
149
  import { AcDbDatabaseTransactionManager } from './transaction/AcDbDatabaseTransactionManager.js';
150
+ import { acdbDxfObjectRecordName } from '../dxf/AcDbDxfObjectRecordName.js';
151
+ /**
152
+ * HEADER variables {@link AcDbDatabase.dxfOut} writes from the live model.
153
+ * Verbatim copies preserved from the source file are never written for these.
154
+ */
155
+ var DXF_HEADER_NATIVE_VARS = new Set([
156
+ '$ACADVER',
157
+ '$HANDSEED',
158
+ '$DWGCODEPAGE',
159
+ '$INSUNITS',
160
+ '$LUNITS',
161
+ '$LUPREC',
162
+ '$UNITMODE',
163
+ '$MEASUREMENT',
164
+ '$LTSCALE',
165
+ '$LWDISPLAY',
166
+ '$CELTSCALE',
167
+ '$CELWEIGHT',
168
+ '$CECOLOR',
169
+ '$TILEMODE',
170
+ '$PSLTSCALE',
171
+ '$CLAYER',
172
+ '$CELTYPE',
173
+ '$CETRANSPARENCY',
174
+ '$CMLSTYLE',
175
+ '$CMLSCALE',
176
+ '$CMLEADERSTYLE',
177
+ '$HPCOLOR',
178
+ '$HPBACKGROUNDCOLOR',
179
+ '$HPLAYER',
180
+ '$HPTRANSPARENCY',
181
+ '$TEXTSTYLE',
182
+ '$DIMSTYLE',
183
+ '$ANGBASE',
184
+ '$ANGDIR',
185
+ '$AUNITS',
186
+ '$AUPREC',
187
+ '$EXTMIN',
188
+ '$EXTMAX',
189
+ '$PDMODE',
190
+ '$PDSIZE',
191
+ '$OSMODE',
192
+ '$ORTHOMODE'
193
+ ]);
147
194
  /**
148
195
  * The AcDbDatabase class represents an AutoCAD drawing file.
149
196
  *
@@ -183,6 +230,18 @@ var AcDbDatabase = /** @class */ (function (_super) {
183
230
  * Set from {@link AcDbOpenDatabaseOptions.circleSides} when opening a database.
184
231
  */
185
232
  _this._drawCircleSides = ACDB_DRAW_CIRCLE_SIDES_DRAFT;
233
+ /**
234
+ * DXF HEADER variables without a native model, kept verbatim in file order
235
+ * and re-emitted by {@link dxfOut} (ezdxf keeps the whole HEADER section).
236
+ */
237
+ _this._dxfHeaderExtras = [];
238
+ /** DWG version value of the file {@link _dxfHeaderExtras} came from. */
239
+ _this._dxfHeaderExtrasVersion = 0;
240
+ /**
241
+ * OBJECTS-section records without a native class, kept verbatim
242
+ * ({@link AcDbUnknownObject}) and re-emitted by {@link dxfOut}.
243
+ */
244
+ _this._dxfUnknownObjects = [];
186
245
  _this._eventBatchDepth = 0;
187
246
  _this._pendingEntityAppended = [];
188
247
  _this._pendingEntityErased = [];
@@ -1583,7 +1642,7 @@ var AcDbDatabase = /** @class */ (function (_super) {
1583
1642
  _this._dwgname = nextValue;
1584
1643
  });
1585
1644
  };
1586
- Object.defineProperty(AcDbDatabase.prototype, "thumbnailImage", {
1645
+ Object.defineProperty(AcDbDatabase.prototype, "dxfHeaderExtras", {
1587
1646
  /**
1588
1647
  * Gets or sets the drawing thumbnail preview image.
1589
1648
  *
@@ -1593,6 +1652,48 @@ var AcDbDatabase = /** @class */ (function (_super) {
1593
1652
  *
1594
1653
  * @returns Thumbnail image bytes, or `undefined` when none exist.
1595
1654
  */
1655
+ /**
1656
+ * HEADER variables read from DXF that have no native model, in file order.
1657
+ * @internal
1658
+ */
1659
+ get: function () {
1660
+ return this._dxfHeaderExtras;
1661
+ },
1662
+ enumerable: false,
1663
+ configurable: true
1664
+ });
1665
+ /** @internal Used by the DXF HEADER reader. */
1666
+ AcDbDatabase.prototype.addDxfHeaderExtra = function (name, pairs) {
1667
+ var index = this._dxfHeaderExtras.findIndex(function (v) { return v.name === name; });
1668
+ if (index >= 0) {
1669
+ this._dxfHeaderExtras[index] = { name: name, pairs: pairs };
1670
+ }
1671
+ else {
1672
+ this._dxfHeaderExtras.push({ name: name, pairs: pairs });
1673
+ }
1674
+ this._dxfHeaderExtrasVersion = this._version.value;
1675
+ };
1676
+ Object.defineProperty(AcDbDatabase.prototype, "dxfUnknownObjects", {
1677
+ /**
1678
+ * OBJECTS records read from DXF without a native class.
1679
+ * @internal
1680
+ */
1681
+ get: function () {
1682
+ return this._dxfUnknownObjects;
1683
+ },
1684
+ enumerable: false,
1685
+ configurable: true
1686
+ });
1687
+ /** @internal Used by the DXF OBJECTS reader. */
1688
+ AcDbDatabase.prototype.addDxfUnknownObject = function (object) {
1689
+ this._dxfUnknownObjects.push(object);
1690
+ };
1691
+ /** @internal Used by the DXF HEADER reader. */
1692
+ AcDbDatabase.prototype.clearDxfHeaderExtras = function () {
1693
+ this._dxfHeaderExtras = [];
1694
+ this._dxfHeaderExtrasVersion = 0;
1695
+ };
1696
+ Object.defineProperty(AcDbDatabase.prototype, "thumbnailImage", {
1596
1697
  get: function () {
1597
1698
  return this._thumbnailImage;
1598
1699
  },
@@ -2416,7 +2517,7 @@ var AcDbDatabase = /** @class */ (function (_super) {
2416
2517
  * @returns ASCII DXF string, or `Uint8Array` when format is `'binary'`.
2417
2518
  */
2418
2519
  AcDbDatabase.prototype.dxfOut = function (_fileName, precision, version, optionsOrThumbnail) {
2419
- var _a, _b;
2520
+ var _a, _b, _c;
2420
2521
  if (precision === void 0) { precision = 16; }
2421
2522
  if (version === void 0) { version = this.version.name; }
2422
2523
  if (optionsOrThumbnail === void 0) { optionsOrThumbnail = false; }
@@ -2441,12 +2542,17 @@ var AcDbDatabase = /** @class */ (function (_super) {
2441
2542
  version: outVersion,
2442
2543
  outputFormat: options.format
2443
2544
  });
2545
+ var objectsPlan = filer.capabilities.supportsObjectsSection
2546
+ ? this.planDxfObjectsSection(filer)
2547
+ : undefined;
2548
+ filer.writtenObjectIds = (_c = objectsPlan === null || objectsPlan === void 0 ? void 0 : objectsPlan.writtenObjectIds) !== null && _c !== void 0 ? _c : new Set();
2549
+ this.ensureXDataAppIds(objectsPlan);
2444
2550
  this.writeDxfHeaderSection(filer);
2445
2551
  this.writeDxfClassesSection(filer);
2446
2552
  this.writeDxfTablesSection(filer, outVersion);
2447
2553
  this.writeDxfBlocksSection(filer);
2448
2554
  this.writeDxfEntitiesSection(filer);
2449
- this.writeDxfObjectsSection(filer);
2555
+ this.writeDxfObjectsSection(filer, objectsPlan);
2450
2556
  this.writeDxfThumbnailImageSection(filer, options.saveThumbnailImage);
2451
2557
  filer.writeStart('EOF');
2452
2558
  // `$HANDSEED` is written early in HEADER; patch it now that every handle
@@ -2916,8 +3022,38 @@ var AcDbDatabase = /** @class */ (function (_super) {
2916
3022
  filer.writeInt32(70, this.osmode);
2917
3023
  filer.writeString(9, '$ORTHOMODE');
2918
3024
  filer.writeInt16(70, this.orthomode);
3025
+ this.writeDxfHeaderExtras(filer);
2919
3026
  filer.endSection();
2920
3027
  };
3028
+ /**
3029
+ * Re-emits HEADER variables preserved verbatim from the source DXF.
3030
+ *
3031
+ * Skipped when exporting to an older version than the source, since newer
3032
+ * variables (and their value encodings) may be invalid there.
3033
+ */
3034
+ AcDbDatabase.prototype.writeDxfHeaderExtras = function (filer) {
3035
+ var e_14, _a;
3036
+ var _b, _c;
3037
+ var target = (_c = (_b = filer.version) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : this.version.value;
3038
+ if (target < this._dxfHeaderExtrasVersion)
3039
+ return;
3040
+ try {
3041
+ for (var _d = __values(this._dxfHeaderExtras), _e = _d.next(); !_e.done; _e = _d.next()) {
3042
+ var _f = _e.value, name_5 = _f.name, pairs = _f.pairs;
3043
+ if (DXF_HEADER_NATIVE_VARS.has(name_5))
3044
+ continue;
3045
+ filer.writeString(9, name_5);
3046
+ filer.writeRawPairs(pairs);
3047
+ }
3048
+ }
3049
+ catch (e_14_1) { e_14 = { error: e_14_1 }; }
3050
+ finally {
3051
+ try {
3052
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
3053
+ }
3054
+ finally { if (e_14) throw e_14.error; }
3055
+ }
3056
+ };
2921
3057
  /**
2922
3058
  * Writes `$EXTMIN` / `$EXTMAX`. Empty drawings use AutoCAD's 1e20 / -1e20
2923
3059
  * convention; otherwise extents are taken from the database box, refreshed
@@ -2941,7 +3077,7 @@ var AcDbDatabase = /** @class */ (function (_super) {
2941
3077
  };
2942
3078
  /** Expands {@link _extents} from model-space entity geometry when possible. */
2943
3079
  AcDbDatabase.prototype.refreshExtentsFromModelSpace = function () {
2944
- var e_14, _a;
3080
+ var e_15, _a;
2945
3081
  try {
2946
3082
  for (var _b = __values(this.tables.blockTable.modelSpace.newIterator()), _c = _b.next(); !_c.done; _c = _b.next()) {
2947
3083
  var entity = _c.value;
@@ -2956,12 +3092,12 @@ var AcDbDatabase = /** @class */ (function (_super) {
2956
3092
  }
2957
3093
  }
2958
3094
  }
2959
- catch (e_14_1) { e_14 = { error: e_14_1 }; }
3095
+ catch (e_15_1) { e_15 = { error: e_15_1 }; }
2960
3096
  finally {
2961
3097
  try {
2962
3098
  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
2963
3099
  }
2964
- finally { if (e_14) throw e_14.error; }
3100
+ finally { if (e_15) throw e_15.error; }
2965
3101
  }
2966
3102
  };
2967
3103
  /**
@@ -2973,7 +3109,7 @@ var AcDbDatabase = /** @class */ (function (_super) {
2973
3109
  * @param filer - DXF output writer.
2974
3110
  */
2975
3111
  AcDbDatabase.prototype.writeDxfClassesSection = function (filer) {
2976
- var e_15, _a;
3112
+ var e_16, _a;
2977
3113
  if (!filer.capabilities.supportsClassesSection ||
2978
3114
  this._classes.length === 0) {
2979
3115
  return;
@@ -2992,12 +3128,12 @@ var AcDbDatabase = /** @class */ (function (_super) {
2992
3128
  filer.writeInt8(281, dxfClass.isEntity ? 1 : 0);
2993
3129
  }
2994
3130
  }
2995
- catch (e_15_1) { e_15 = { error: e_15_1 }; }
3131
+ catch (e_16_1) { e_16 = { error: e_16_1 }; }
2996
3132
  finally {
2997
3133
  try {
2998
3134
  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
2999
3135
  }
3000
- finally { if (e_15) throw e_15.error; }
3136
+ finally { if (e_16) throw e_16.error; }
3001
3137
  }
3002
3138
  filer.endSection();
3003
3139
  };
@@ -3028,7 +3164,7 @@ var AcDbDatabase = /** @class */ (function (_super) {
3028
3164
  * @param filer - DXF output writer.
3029
3165
  */
3030
3166
  AcDbDatabase.prototype.writeDxfBlocksSection = function (filer) {
3031
- var e_16, _a, e_17, _b;
3167
+ var e_17, _a, e_18, _b;
3032
3168
  filer.startSection('BLOCKS');
3033
3169
  try {
3034
3170
  for (var _c = __values(this.tables.blockTable.newIterator()), _d = _c.next(); !_d.done; _d = _c.next()) {
@@ -3036,28 +3172,28 @@ var AcDbDatabase = /** @class */ (function (_super) {
3036
3172
  btr.dxfOutBlockBegin(filer);
3037
3173
  if (!btr.isModelSapce && !btr.isPaperSapce) {
3038
3174
  try {
3039
- for (var _e = (e_17 = void 0, __values(btr.newIterator())), _f = _e.next(); !_f.done; _f = _e.next()) {
3175
+ for (var _e = (e_18 = void 0, __values(btr.newIterator())), _f = _e.next(); !_f.done; _f = _e.next()) {
3040
3176
  var entity = _f.value;
3041
3177
  this.writeDxfEntity(filer, entity);
3042
3178
  }
3043
3179
  }
3044
- catch (e_17_1) { e_17 = { error: e_17_1 }; }
3180
+ catch (e_18_1) { e_18 = { error: e_18_1 }; }
3045
3181
  finally {
3046
3182
  try {
3047
3183
  if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
3048
3184
  }
3049
- finally { if (e_17) throw e_17.error; }
3185
+ finally { if (e_18) throw e_18.error; }
3050
3186
  }
3051
3187
  }
3052
3188
  btr.dxfOutBlockEnd(filer);
3053
3189
  }
3054
3190
  }
3055
- catch (e_16_1) { e_16 = { error: e_16_1 }; }
3191
+ catch (e_17_1) { e_17 = { error: e_17_1 }; }
3056
3192
  finally {
3057
3193
  try {
3058
3194
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
3059
3195
  }
3060
- finally { if (e_16) throw e_16.error; }
3196
+ finally { if (e_17) throw e_17.error; }
3061
3197
  }
3062
3198
  filer.endSection();
3063
3199
  };
@@ -3067,7 +3203,7 @@ var AcDbDatabase = /** @class */ (function (_super) {
3067
3203
  * @param filer - DXF output writer.
3068
3204
  */
3069
3205
  AcDbDatabase.prototype.writeDxfEntitiesSection = function (filer) {
3070
- var e_18, _a, e_19, _b;
3206
+ var e_19, _a, e_20, _b;
3071
3207
  filer.startSection('ENTITIES');
3072
3208
  try {
3073
3209
  for (var _c = __values(this.tables.blockTable.newIterator()), _d = _c.next(); !_d.done; _d = _c.next()) {
@@ -3075,47 +3211,48 @@ var AcDbDatabase = /** @class */ (function (_super) {
3075
3211
  if (!btr.isModelSapce && !btr.isPaperSapce)
3076
3212
  continue;
3077
3213
  try {
3078
- for (var _e = (e_19 = void 0, __values(btr.newIterator())), _f = _e.next(); !_f.done; _f = _e.next()) {
3214
+ for (var _e = (e_20 = void 0, __values(btr.newIterator())), _f = _e.next(); !_f.done; _f = _e.next()) {
3079
3215
  var entity = _f.value;
3080
3216
  this.writeDxfEntity(filer, entity);
3081
3217
  }
3082
3218
  }
3083
- catch (e_19_1) { e_19 = { error: e_19_1 }; }
3219
+ catch (e_20_1) { e_20 = { error: e_20_1 }; }
3084
3220
  finally {
3085
3221
  try {
3086
3222
  if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
3087
3223
  }
3088
- finally { if (e_19) throw e_19.error; }
3224
+ finally { if (e_20) throw e_20.error; }
3089
3225
  }
3090
3226
  }
3091
3227
  }
3092
- catch (e_18_1) { e_18 = { error: e_18_1 }; }
3228
+ catch (e_19_1) { e_19 = { error: e_19_1 }; }
3093
3229
  finally {
3094
3230
  try {
3095
3231
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
3096
3232
  }
3097
- finally { if (e_18) throw e_18.error; }
3233
+ finally { if (e_19) throw e_19.error; }
3098
3234
  }
3099
3235
  filer.endSection();
3100
3236
  };
3101
3237
  /**
3102
- * Writes the OBJECTS section for the DXF export.
3238
+ * Decides which OBJECTS-section records a DXF export writes.
3103
3239
  *
3104
- * @param filer - DXF output writer.
3240
+ * Like ezdxf / ODA, every record reachable from the named object dictionary
3241
+ * and from extension dictionaries (of tables, table records, entities and
3242
+ * objects) is written, including records preserved verbatim
3243
+ * ({@link AcDbUnknownObject}, context data). Only records that are actually
3244
+ * written are listed in their dictionaries, so the output never carries
3245
+ * dangling 350/360 handles.
3246
+ *
3247
+ * Must run before any section is written: {@link AcDbObject} consults the
3248
+ * resulting handle set when it emits extension-dictionary pointers.
3105
3249
  */
3106
- AcDbDatabase.prototype.writeDxfObjectsSection = function (filer) {
3107
- var e_20, _a, e_21, _b, e_22, _c, e_23, _d, e_24, _e, e_25, _f, e_26, _g, e_27, _h, e_28, _j;
3108
- if (!filer.capabilities.supportsObjectsSection) {
3109
- return;
3110
- }
3111
- filer.startSection('OBJECTS');
3250
+ AcDbDatabase.prototype.planDxfObjectsSection = function (filer) {
3251
+ var e_21, _a, e_22, _b, e_23, _c, e_24, _d, e_25, _e, e_26, _f, e_27, _g, e_28, _h, e_29, _j, e_30, _k, e_31, _l;
3252
+ var _this = this;
3253
+ var _m, _o;
3112
3254
  var rootDict = this.objects.dictionary;
3113
3255
  rootDict.ownerId = '0';
3114
- var writeDictionary = function (dict) {
3115
- // Dictionary entries (3/350 pairs) are embedded in the DICTIONARY object.
3116
- filer.writeStart('DICTIONARY');
3117
- dict.dxfOut(filer, true);
3118
- };
3119
3256
  var ensureRootEntry = function (key, dict) {
3120
3257
  if (rootDict.getAt(key) !== dict) {
3121
3258
  rootDict.setAt(key, dict);
@@ -3159,164 +3296,480 @@ var AcDbDatabase = /** @class */ (function (_super) {
3159
3296
  else {
3160
3297
  dropRootEntry('ISM_RASTER_IMAGE_DICT');
3161
3298
  }
3162
- if (this.objects.xrecord.numEntries > 0) {
3163
- ensureRootEntry('MLIGHT_XRECORD', this.objects.xrecord);
3164
- }
3165
- else {
3166
- dropRootEntry('MLIGHT_XRECORD');
3167
- }
3168
- writeDictionary(rootDict);
3169
- writeDictionary(this.objects.layout);
3170
- writeDictionary(this.objects.group);
3171
- if (this.objects.sortentsTable.numEntries > 0) {
3172
- writeDictionary(this.objects.sortentsTable);
3173
- }
3174
- if (writeMLeader) {
3175
- writeDictionary(this.objects.mleaderStyle);
3176
- }
3177
- if (this.objects.mlineStyle.numEntries > 0) {
3178
- writeDictionary(this.objects.mlineStyle);
3179
- }
3180
- if (this.objects.imageDefinition.numEntries > 0) {
3181
- writeDictionary(this.objects.imageDefinition);
3182
- }
3183
- if (this.objects.xrecord.numEntries > 0) {
3184
- writeDictionary(this.objects.xrecord);
3299
+ var norm = function (id) { return (id !== null && id !== void 0 ? id : '').trim().toUpperCase(); };
3300
+ var classNames = new Set(this._classes.map(function (item) { var _a; return ((_a = item.name) !== null && _a !== void 0 ? _a : '').toUpperCase(); }));
3301
+ var records = new Map();
3302
+ // Records replaced by freshly generated ones (Layer Manager filter tree):
3303
+ // neither written nor collected into MLIGHT_XRECORD.
3304
+ var superseded = new Set();
3305
+ var xrecordContainer = this.objects.xrecord;
3306
+ var queue = [];
3307
+ var visit = function (object) {
3308
+ if (!object || object === xrecordContainer)
3309
+ return;
3310
+ var key = norm(object.objectId);
3311
+ if (!key || records.has(key) || superseded.has(key))
3312
+ return;
3313
+ var type = acdbDxfObjectRecordName(object, classNames);
3314
+ if (!type)
3315
+ return;
3316
+ records.set(key, { object: object, type: type });
3317
+ queue.push(object);
3318
+ };
3319
+ var visitExtensionDictionary = function (owner) {
3320
+ var id = owner.extensionDictionary;
3321
+ if (id)
3322
+ visit(_this.getObjectById(id));
3323
+ };
3324
+ var next = 0;
3325
+ var drain = function () {
3326
+ var e_32, _a;
3327
+ while (next < queue.length) {
3328
+ var object = queue[next++];
3329
+ visitExtensionDictionary(object);
3330
+ if (object instanceof AcDbDictionary) {
3331
+ try {
3332
+ for (var _b = (e_32 = void 0, __values(object.entries())), _c = _b.next(); !_c.done; _c = _b.next()) {
3333
+ var _d = __read(_c.value, 2), entry = _d[1];
3334
+ visit(entry);
3335
+ }
3336
+ }
3337
+ catch (e_32_1) { e_32 = { error: e_32_1 }; }
3338
+ finally {
3339
+ try {
3340
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
3341
+ }
3342
+ finally { if (e_32) throw e_32.error; }
3343
+ }
3344
+ if (object.defaultId)
3345
+ visit(_this.getObjectById(object.defaultId));
3346
+ }
3347
+ }
3348
+ };
3349
+ var markSuperseded = function (object) {
3350
+ var e_33, _a;
3351
+ if (!object)
3352
+ return;
3353
+ var key = norm(object.objectId);
3354
+ if (!key || superseded.has(key))
3355
+ return;
3356
+ superseded.add(key);
3357
+ if (object.extensionDictionary) {
3358
+ markSuperseded(_this.getObjectById(object.extensionDictionary));
3359
+ }
3360
+ if (object instanceof AcDbDictionary) {
3361
+ try {
3362
+ for (var _b = __values(object.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
3363
+ var _d = __read(_c.value, 2), entry = _d[1];
3364
+ markSuperseded(entry);
3365
+ }
3366
+ }
3367
+ catch (e_33_1) { e_33 = { error: e_33_1 }; }
3368
+ finally {
3369
+ try {
3370
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
3371
+ }
3372
+ finally { if (e_33) throw e_33.error; }
3373
+ }
3374
+ }
3375
+ };
3376
+ // The named object dictionary must be the first record of OBJECTS.
3377
+ visit(rootDict);
3378
+ drain();
3379
+ // The Layer Manager filter tree is regenerated by
3380
+ // writeAcLyLayerFilterObjects, which also writes the layer table's
3381
+ // extension dictionary. Keep its other entries.
3382
+ var layerTable = this.tables.layerTable;
3383
+ var writesLayerFilters = this._layerFilters.root.getNestedFilters().length > 0;
3384
+ if (writesLayerFilters && layerTable.extensionDictionary) {
3385
+ var layerExtId = layerTable.extensionDictionary;
3386
+ var layerExt = this.getObjectById(layerExtId);
3387
+ superseded.add(norm(layerExtId));
3388
+ if (layerExt instanceof AcDbDictionary) {
3389
+ try {
3390
+ for (var _p = __values(layerExt.entries()), _q = _p.next(); !_q.done; _q = _p.next()) {
3391
+ var _r = __read(_q.value, 2), key = _r[0], entry = _r[1];
3392
+ if (key === ACLY_DICTIONARY_NAME || key === ACAD_LAYERFILTERS_NAME) {
3393
+ markSuperseded(entry);
3394
+ }
3395
+ else {
3396
+ visit(entry);
3397
+ }
3398
+ }
3399
+ }
3400
+ catch (e_21_1) { e_21 = { error: e_21_1 }; }
3401
+ finally {
3402
+ try {
3403
+ if (_q && !_q.done && (_a = _p.return)) _a.call(_p);
3404
+ }
3405
+ finally { if (e_21) throw e_21.error; }
3406
+ }
3407
+ }
3185
3408
  }
3186
3409
  try {
3187
- for (var _k = __values(this.objects.layout.entries()), _l = _k.next(); !_l.done; _l = _k.next()) {
3188
- var _m = __read(_l.value, 2), _ = _m[0], layout = _m[1];
3189
- filer.writeStart('LAYOUT');
3190
- layout.dxfOut(filer, true);
3410
+ for (var _s = __values(Object.values(this.tables)), _t = _s.next(); !_t.done; _t = _s.next()) {
3411
+ var table = _t.value;
3412
+ visitExtensionDictionary(table);
3413
+ try {
3414
+ for (var _u = (e_23 = void 0, __values(table.newIterator())), _v = _u.next(); !_v.done; _v = _u.next()) {
3415
+ var record = _v.value;
3416
+ visitExtensionDictionary(record);
3417
+ }
3418
+ }
3419
+ catch (e_23_1) { e_23 = { error: e_23_1 }; }
3420
+ finally {
3421
+ try {
3422
+ if (_v && !_v.done && (_c = _u.return)) _c.call(_u);
3423
+ }
3424
+ finally { if (e_23) throw e_23.error; }
3425
+ }
3191
3426
  }
3192
3427
  }
3193
- catch (e_20_1) { e_20 = { error: e_20_1 }; }
3428
+ catch (e_22_1) { e_22 = { error: e_22_1 }; }
3194
3429
  finally {
3195
3430
  try {
3196
- if (_l && !_l.done && (_a = _k.return)) _a.call(_k);
3431
+ if (_t && !_t.done && (_b = _s.return)) _b.call(_s);
3197
3432
  }
3198
- finally { if (e_20) throw e_20.error; }
3433
+ finally { if (e_22) throw e_22.error; }
3199
3434
  }
3200
3435
  try {
3201
- for (var _o = __values(this.objects.group.entries()), _p = _o.next(); !_p.done; _p = _o.next()) {
3202
- var _q = __read(_p.value, 2), key = _q[0], group = _q[1];
3203
- if (!group.name)
3204
- group.name = key;
3205
- filer.writeStart('GROUP');
3206
- group.dxfOut(filer, true);
3436
+ for (var _w = __values(this.tables.blockTable.newIterator()), _x = _w.next(); !_x.done; _x = _w.next()) {
3437
+ var btr = _x.value;
3438
+ try {
3439
+ for (var _y = (e_25 = void 0, __values(btr.newIterator())), _z = _y.next(); !_z.done; _z = _y.next()) {
3440
+ var entity = _z.value;
3441
+ visitExtensionDictionary(entity);
3442
+ var attributes = (_o = (_m = entity).attributeIterator) === null || _o === void 0 ? void 0 : _o.call(_m);
3443
+ if (attributes) {
3444
+ try {
3445
+ for (var attributes_1 = (e_26 = void 0, __values(attributes)), attributes_1_1 = attributes_1.next(); !attributes_1_1.done; attributes_1_1 = attributes_1.next()) {
3446
+ var attribute = attributes_1_1.value;
3447
+ visitExtensionDictionary(attribute);
3448
+ }
3449
+ }
3450
+ catch (e_26_1) { e_26 = { error: e_26_1 }; }
3451
+ finally {
3452
+ try {
3453
+ if (attributes_1_1 && !attributes_1_1.done && (_f = attributes_1.return)) _f.call(attributes_1);
3454
+ }
3455
+ finally { if (e_26) throw e_26.error; }
3456
+ }
3457
+ }
3458
+ }
3459
+ }
3460
+ catch (e_25_1) { e_25 = { error: e_25_1 }; }
3461
+ finally {
3462
+ try {
3463
+ if (_z && !_z.done && (_e = _y.return)) _e.call(_y);
3464
+ }
3465
+ finally { if (e_25) throw e_25.error; }
3466
+ }
3207
3467
  }
3208
3468
  }
3209
- catch (e_21_1) { e_21 = { error: e_21_1 }; }
3469
+ catch (e_24_1) { e_24 = { error: e_24_1 }; }
3210
3470
  finally {
3211
3471
  try {
3212
- if (_p && !_p.done && (_b = _o.return)) _b.call(_o);
3472
+ if (_x && !_x.done && (_d = _w.return)) _d.call(_w);
3213
3473
  }
3214
- finally { if (e_21) throw e_21.error; }
3474
+ finally { if (e_24) throw e_24.error; }
3215
3475
  }
3476
+ drain();
3216
3477
  try {
3217
- for (var _r = __values(this.objects.sortentsTable.entries()), _s = _r.next(); !_s.done; _s = _r.next()) {
3218
- var _t = __read(_s.value, 2), _ = _t[0], sortents = _t[1];
3219
- filer.writeStart('SORTENTSTABLE');
3220
- sortents.dxfOut(filer, true);
3478
+ // Index objects are not dictionary entries; written as before.
3479
+ for (var _0 = __values(this.objects.layerFilter.entries()), _1 = _0.next(); !_1.done; _1 = _0.next()) {
3480
+ var _2 = __read(_1.value, 2), layerFilter = _2[1];
3481
+ visit(layerFilter);
3221
3482
  }
3222
3483
  }
3223
- catch (e_22_1) { e_22 = { error: e_22_1 }; }
3484
+ catch (e_27_1) { e_27 = { error: e_27_1 }; }
3224
3485
  finally {
3225
3486
  try {
3226
- if (_s && !_s.done && (_c = _r.return)) _c.call(_r);
3487
+ if (_1 && !_1.done && (_g = _0.return)) _g.call(_0);
3227
3488
  }
3228
- finally { if (e_22) throw e_22.error; }
3489
+ finally { if (e_27) throw e_27.error; }
3229
3490
  }
3230
3491
  try {
3231
- for (var _u = __values(this.objects.imageDefinition.entries()), _v = _u.next(); !_v.done; _v = _u.next()) {
3232
- var _w = __read(_v.value, 2), _ = _w[0], imageDef = _w[1];
3233
- filer.writeStart('IMAGEDEF');
3234
- imageDef.dxfOut(filer, true);
3492
+ for (var _3 = __values(this.objects.layerIndex.entries()), _4 = _3.next(); !_4.done; _4 = _3.next()) {
3493
+ var _5 = __read(_4.value, 2), layerIndex = _5[1];
3494
+ visit(layerIndex);
3235
3495
  }
3236
3496
  }
3237
- catch (e_23_1) { e_23 = { error: e_23_1 }; }
3497
+ catch (e_28_1) { e_28 = { error: e_28_1 }; }
3238
3498
  finally {
3239
3499
  try {
3240
- if (_v && !_v.done && (_d = _u.return)) _d.call(_u);
3500
+ if (_4 && !_4.done && (_h = _3.return)) _h.call(_3);
3241
3501
  }
3242
- finally { if (e_23) throw e_23.error; }
3502
+ finally { if (e_28) throw e_28.error; }
3243
3503
  }
3244
3504
  try {
3245
- for (var _x = __values(this.objects.layerFilter.entries()), _y = _x.next(); !_y.done; _y = _x.next()) {
3246
- var _z = __read(_y.value, 2), _ = _z[0], layerFilter = _z[1];
3247
- filer.writeStart('LAYER_FILTER');
3248
- layerFilter.dxfOut(filer, true);
3505
+ // Preserved records owned by an entity or object rather than a
3506
+ // dictionary (e.g. IMAGEDEF_REACTOR) — kept while their owner exists.
3507
+ for (var _6 = __values(this._dxfUnknownObjects), _7 = _6.next(); !_7.done; _7 = _6.next()) {
3508
+ var object = _7.value;
3509
+ var owner = this.getObjectById(object.ownerId);
3510
+ // Kept while the owner is exported; a removed dictionary entry is not.
3511
+ if (owner instanceof AcDbEntity ||
3512
+ (owner &&
3513
+ !(owner instanceof AcDbDictionary) &&
3514
+ records.has(norm(owner.objectId)))) {
3515
+ visit(object);
3516
+ }
3249
3517
  }
3250
3518
  }
3251
- catch (e_24_1) { e_24 = { error: e_24_1 }; }
3519
+ catch (e_29_1) { e_29 = { error: e_29_1 }; }
3252
3520
  finally {
3253
3521
  try {
3254
- if (_y && !_y.done && (_e = _x.return)) _e.call(_x);
3522
+ if (_7 && !_7.done && (_j = _6.return)) _j.call(_6);
3255
3523
  }
3256
- finally { if (e_24) throw e_24.error; }
3524
+ finally { if (e_29) throw e_29.error; }
3257
3525
  }
3526
+ drain();
3527
+ // XRecords not owned by any written dictionary go to MLIGHT_XRECORD.
3528
+ var looseXrecords = [];
3258
3529
  try {
3259
- for (var _0 = __values(this.objects.layerIndex.entries()), _1 = _0.next(); !_1.done; _1 = _0.next()) {
3260
- var _2 = __read(_1.value, 2), _ = _2[0], layerIndex = _2[1];
3261
- filer.writeStart('LAYER_INDEX');
3262
- layerIndex.dxfOut(filer, true);
3530
+ for (var _8 = __values(xrecordContainer.entries()), _9 = _8.next(); !_9.done; _9 = _8.next()) {
3531
+ var _10 = __read(_9.value, 2), xrecord = _10[1];
3532
+ var key = norm(xrecord.objectId);
3533
+ if (!key || records.has(key) || superseded.has(key))
3534
+ continue;
3535
+ looseXrecords.push(xrecord);
3263
3536
  }
3264
3537
  }
3265
- catch (e_25_1) { e_25 = { error: e_25_1 }; }
3538
+ catch (e_30_1) { e_30 = { error: e_30_1 }; }
3266
3539
  finally {
3267
3540
  try {
3268
- if (_1 && !_1.done && (_f = _0.return)) _f.call(_0);
3541
+ if (_9 && !_9.done && (_k = _8.return)) _k.call(_8);
3269
3542
  }
3270
- finally { if (e_25) throw e_25.error; }
3543
+ finally { if (e_30) throw e_30.error; }
3271
3544
  }
3272
- if (writeMLeader) {
3545
+ if (looseXrecords.length > 0) {
3546
+ ensureRootEntry('MLIGHT_XRECORD', xrecordContainer);
3547
+ }
3548
+ else {
3549
+ dropRootEntry('MLIGHT_XRECORD');
3550
+ }
3551
+ var writtenObjectIds = new Set(records.keys());
3552
+ if (looseXrecords.length > 0) {
3553
+ writtenObjectIds.add(norm(xrecordContainer.objectId));
3273
3554
  try {
3274
- for (var _3 = __values(this.objects.mleaderStyle.entries()), _4 = _3.next(); !_4.done; _4 = _3.next()) {
3275
- var _5 = __read(_4.value, 2), _ = _5[0], mleaderStyle = _5[1];
3276
- filer.writeStart('MLEADERSTYLE');
3277
- mleaderStyle.dxfOut(filer, true);
3555
+ for (var looseXrecords_1 = __values(looseXrecords), looseXrecords_1_1 = looseXrecords_1.next(); !looseXrecords_1_1.done; looseXrecords_1_1 = looseXrecords_1.next()) {
3556
+ var xrecord = looseXrecords_1_1.value;
3557
+ writtenObjectIds.add(norm(xrecord.objectId));
3278
3558
  }
3279
3559
  }
3280
- catch (e_26_1) { e_26 = { error: e_26_1 }; }
3560
+ catch (e_31_1) { e_31 = { error: e_31_1 }; }
3281
3561
  finally {
3282
3562
  try {
3283
- if (_4 && !_4.done && (_g = _3.return)) _g.call(_3);
3563
+ if (looseXrecords_1_1 && !looseXrecords_1_1.done && (_l = looseXrecords_1.return)) _l.call(looseXrecords_1);
3284
3564
  }
3285
- finally { if (e_26) throw e_26.error; }
3565
+ finally { if (e_31) throw e_31.error; }
3286
3566
  }
3287
3567
  }
3568
+ if (writesLayerFilters && layerTable.extensionDictionary) {
3569
+ writtenObjectIds.add(norm(layerTable.extensionDictionary));
3570
+ }
3571
+ return {
3572
+ records: __spreadArray([], __read(records.values()), false),
3573
+ looseXrecords: looseXrecords,
3574
+ writtenObjectIds: writtenObjectIds,
3575
+ restoreMLeaderRoot: restoreMLeaderRoot
3576
+ };
3577
+ };
3578
+ /**
3579
+ * Registers an APPID record for every application whose XData is about to
3580
+ * be written. AutoCAD rejects a DXF whose XData names an unregistered
3581
+ * application (ezdxf's auditor adds the missing records the same way).
3582
+ */
3583
+ AcDbDatabase.prototype.ensureXDataAppIds = function (plan) {
3584
+ var e_34, _a, e_35, _b, e_36, _c, e_37, _d, e_38, _e, e_39, _f, e_40, _g;
3585
+ var _h, _j;
3586
+ var appIdTable = this.tables.appIdTable;
3587
+ var register = function (object) {
3588
+ var e_41, _a;
3589
+ try {
3590
+ for (var _b = __values(object.xDataAppIds()), _c = _b.next(); !_c.done; _c = _b.next()) {
3591
+ var appId = _c.value;
3592
+ if (appId && !appIdTable.has(appId)) {
3593
+ appIdTable.add(new AcDbRegAppTableRecord(appId));
3594
+ }
3595
+ }
3596
+ }
3597
+ catch (e_41_1) { e_41 = { error: e_41_1 }; }
3598
+ finally {
3599
+ try {
3600
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
3601
+ }
3602
+ finally { if (e_41) throw e_41.error; }
3603
+ }
3604
+ };
3288
3605
  try {
3289
- for (var _6 = __values(this.objects.mlineStyle.entries()), _7 = _6.next(); !_7.done; _7 = _6.next()) {
3290
- var _8 = __read(_7.value, 2), _ = _8[0], mlineStyle = _8[1];
3291
- filer.writeStart('MLINESTYLE');
3292
- mlineStyle.dxfOut(filer, true);
3606
+ for (var _k = __values(Object.values(this.tables)), _l = _k.next(); !_l.done; _l = _k.next()) {
3607
+ var table = _l.value;
3608
+ try {
3609
+ for (var _m = (e_35 = void 0, __values(table.newIterator())), _o = _m.next(); !_o.done; _o = _m.next()) {
3610
+ var record = _o.value;
3611
+ register(record);
3612
+ }
3613
+ }
3614
+ catch (e_35_1) { e_35 = { error: e_35_1 }; }
3615
+ finally {
3616
+ try {
3617
+ if (_o && !_o.done && (_b = _m.return)) _b.call(_m);
3618
+ }
3619
+ finally { if (e_35) throw e_35.error; }
3620
+ }
3293
3621
  }
3294
3622
  }
3295
- catch (e_27_1) { e_27 = { error: e_27_1 }; }
3623
+ catch (e_34_1) { e_34 = { error: e_34_1 }; }
3296
3624
  finally {
3297
3625
  try {
3298
- if (_7 && !_7.done && (_h = _6.return)) _h.call(_6);
3626
+ if (_l && !_l.done && (_a = _k.return)) _a.call(_k);
3299
3627
  }
3300
- finally { if (e_27) throw e_27.error; }
3628
+ finally { if (e_34) throw e_34.error; }
3301
3629
  }
3302
3630
  try {
3303
- for (var _9 = __values(this.objects.xrecord.entries()), _10 = _9.next(); !_10.done; _10 = _9.next()) {
3304
- var _11 = __read(_10.value, 2), _ = _11[0], xrecord = _11[1];
3305
- filer.writeStart('XRECORD');
3306
- xrecord.dxfOut(filer, true);
3631
+ for (var _p = __values(this.tables.blockTable.newIterator()), _q = _p.next(); !_q.done; _q = _p.next()) {
3632
+ var btr = _q.value;
3633
+ try {
3634
+ for (var _r = (e_37 = void 0, __values(btr.newIterator())), _s = _r.next(); !_s.done; _s = _r.next()) {
3635
+ var entity = _s.value;
3636
+ register(entity);
3637
+ var attributes = (_j = (_h = entity).attributeIterator) === null || _j === void 0 ? void 0 : _j.call(_h);
3638
+ if (attributes) {
3639
+ try {
3640
+ for (var attributes_2 = (e_38 = void 0, __values(attributes)), attributes_2_1 = attributes_2.next(); !attributes_2_1.done; attributes_2_1 = attributes_2.next()) {
3641
+ var attribute = attributes_2_1.value;
3642
+ register(attribute);
3643
+ }
3644
+ }
3645
+ catch (e_38_1) { e_38 = { error: e_38_1 }; }
3646
+ finally {
3647
+ try {
3648
+ if (attributes_2_1 && !attributes_2_1.done && (_e = attributes_2.return)) _e.call(attributes_2);
3649
+ }
3650
+ finally { if (e_38) throw e_38.error; }
3651
+ }
3652
+ }
3653
+ }
3654
+ }
3655
+ catch (e_37_1) { e_37 = { error: e_37_1 }; }
3656
+ finally {
3657
+ try {
3658
+ if (_s && !_s.done && (_d = _r.return)) _d.call(_r);
3659
+ }
3660
+ finally { if (e_37) throw e_37.error; }
3661
+ }
3307
3662
  }
3308
3663
  }
3309
- catch (e_28_1) { e_28 = { error: e_28_1 }; }
3664
+ catch (e_36_1) { e_36 = { error: e_36_1 }; }
3310
3665
  finally {
3311
3666
  try {
3312
- if (_10 && !_10.done && (_j = _9.return)) _j.call(_9);
3667
+ if (_q && !_q.done && (_c = _p.return)) _c.call(_p);
3668
+ }
3669
+ finally { if (e_36) throw e_36.error; }
3670
+ }
3671
+ if (plan) {
3672
+ try {
3673
+ for (var _t = __values(plan.records), _u = _t.next(); !_u.done; _u = _t.next()) {
3674
+ var object = _u.value.object;
3675
+ register(object);
3676
+ }
3677
+ }
3678
+ catch (e_39_1) { e_39 = { error: e_39_1 }; }
3679
+ finally {
3680
+ try {
3681
+ if (_u && !_u.done && (_f = _t.return)) _f.call(_t);
3682
+ }
3683
+ finally { if (e_39) throw e_39.error; }
3684
+ }
3685
+ try {
3686
+ for (var _v = __values(plan.looseXrecords), _w = _v.next(); !_w.done; _w = _v.next()) {
3687
+ var xrecord = _w.value;
3688
+ register(xrecord);
3689
+ }
3690
+ }
3691
+ catch (e_40_1) { e_40 = { error: e_40_1 }; }
3692
+ finally {
3693
+ try {
3694
+ if (_w && !_w.done && (_g = _v.return)) _g.call(_v);
3695
+ }
3696
+ finally { if (e_40) throw e_40.error; }
3697
+ }
3698
+ }
3699
+ };
3700
+ /**
3701
+ * Writes the OBJECTS section for the DXF export.
3702
+ *
3703
+ * @param filer - DXF output writer.
3704
+ * @param plan - Records chosen by {@link planDxfObjectsSection}.
3705
+ */
3706
+ AcDbDatabase.prototype.writeDxfObjectsSection = function (filer, plan) {
3707
+ var e_42, _a, e_43, _b, e_44, _c;
3708
+ if (!plan)
3709
+ return;
3710
+ filer.startSection('OBJECTS');
3711
+ var isWritten = function (object) { var _a; return plan.writtenObjectIds.has(((_a = object.objectId) !== null && _a !== void 0 ? _a : '').trim().toUpperCase()); };
3712
+ try {
3713
+ for (var _d = __values(plan.records), _e = _d.next(); !_e.done; _e = _d.next()) {
3714
+ var _f = _e.value, object = _f.object, type = _f.type;
3715
+ if (object instanceof AcDbDictionary) {
3716
+ filer.writeStart(type);
3717
+ object.dxfOutFiltered(filer, isWritten);
3718
+ continue;
3719
+ }
3720
+ if (object instanceof AcDbGroup && !object.name) {
3721
+ try {
3722
+ // Keep the group name in sync with its ACAD_GROUP key.
3723
+ for (var _g = (e_43 = void 0, __values(this.objects.group.entries())), _h = _g.next(); !_h.done; _h = _g.next()) {
3724
+ var _j = __read(_h.value, 2), key = _j[0], group = _j[1];
3725
+ if (group === object)
3726
+ object.name = key;
3727
+ }
3728
+ }
3729
+ catch (e_43_1) { e_43 = { error: e_43_1 }; }
3730
+ finally {
3731
+ try {
3732
+ if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
3733
+ }
3734
+ finally { if (e_43) throw e_43.error; }
3735
+ }
3736
+ }
3737
+ filer.writeStart(type);
3738
+ object.dxfOut(filer, true);
3739
+ }
3740
+ }
3741
+ catch (e_42_1) { e_42 = { error: e_42_1 }; }
3742
+ finally {
3743
+ try {
3744
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
3745
+ }
3746
+ finally { if (e_42) throw e_42.error; }
3747
+ }
3748
+ if (plan.looseXrecords.length > 0) {
3749
+ var container = this.objects.xrecord;
3750
+ container.ownerId = this.objects.dictionary.objectId;
3751
+ filer.writeStart('DICTIONARY');
3752
+ container.dxfOutFiltered(filer, isWritten);
3753
+ try {
3754
+ for (var _k = __values(plan.looseXrecords), _l = _k.next(); !_l.done; _l = _k.next()) {
3755
+ var xrecord = _l.value;
3756
+ xrecord.ownerId = container.objectId;
3757
+ filer.writeStart('XRECORD');
3758
+ xrecord.dxfOut(filer, true);
3759
+ }
3760
+ }
3761
+ catch (e_44_1) { e_44 = { error: e_44_1 }; }
3762
+ finally {
3763
+ try {
3764
+ if (_l && !_l.done && (_c = _k.return)) _c.call(_k);
3765
+ }
3766
+ finally { if (e_44) throw e_44.error; }
3313
3767
  }
3314
- finally { if (e_28) throw e_28.error; }
3315
3768
  }
3316
3769
  this.writeAcLyLayerFilterObjects(filer);
3317
3770
  filer.endSection();
3318
- if (restoreMLeaderRoot) {
3319
- rootDict.setAt('ACAD_MLEADERSTYLE', this.objects.mleaderStyle);
3771
+ if (plan.restoreMLeaderRoot) {
3772
+ this.objects.dictionary.setAt('ACAD_MLEADERSTYLE', this.objects.mleaderStyle);
3320
3773
  }
3321
3774
  };
3322
3775
  /**
@@ -3327,9 +3780,9 @@ var AcDbDatabase = /** @class */ (function (_super) {
3327
3780
  * @param filer - DXF output writer.
3328
3781
  */
3329
3782
  AcDbDatabase.prototype.writeAcLyLayerFilterObjects = function (filer) {
3330
- var e_29, _a, e_30, _b, e_31, _c, e_32, _d, e_33, _e;
3783
+ var e_45, _a, e_46, _b, e_47, _c, e_48, _d, e_49, _e, e_50, _f, e_51, _g;
3331
3784
  var _this = this;
3332
- var _f;
3785
+ var _h;
3333
3786
  var serialized = acdbSerializeLayerFilterTree(this._layerFilters);
3334
3787
  if (serialized.nodes.length === 0) {
3335
3788
  return;
@@ -3337,14 +3790,14 @@ var AcDbDatabase = /** @class */ (function (_super) {
3337
3790
  var dicts = [];
3338
3791
  var xrecs = [];
3339
3792
  var layerTable = this.tables.layerTable;
3340
- var layerExtHandle = (_f = layerTable.extensionDictionary) !== null && _f !== void 0 ? _f : this.generateHandle();
3793
+ var layerExtHandle = (_h = layerTable.extensionDictionary) !== null && _h !== void 0 ? _h : this.generateHandle();
3341
3794
  layerTable.extensionDictionary = layerExtHandle;
3342
3795
  var aclyHandle = this.generateHandle();
3343
3796
  var acadHandle = this.generateHandle();
3344
3797
  var rootAclyEntries = [];
3345
3798
  var rootAcadEntries = [];
3346
3799
  var emit = function (node, parentAclyHandle, addToLegacy) {
3347
- var e_34, _a;
3800
+ var e_52, _a;
3348
3801
  var xHandle = _this.generateHandle();
3349
3802
  var extensionDictionaryId;
3350
3803
  if (node.children.length > 0) {
@@ -3360,12 +3813,12 @@ var AcDbDatabase = /** @class */ (function (_super) {
3360
3813
  });
3361
3814
  }
3362
3815
  }
3363
- catch (e_34_1) { e_34 = { error: e_34_1 }; }
3816
+ catch (e_52_1) { e_52 = { error: e_52_1 }; }
3364
3817
  finally {
3365
3818
  try {
3366
3819
  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
3367
3820
  }
3368
- finally { if (e_34) throw e_34.error; }
3821
+ finally { if (e_52) throw e_52.error; }
3369
3822
  }
3370
3823
  dicts.push({
3371
3824
  handle: extHandle,
@@ -3391,36 +3844,36 @@ var AcDbDatabase = /** @class */ (function (_super) {
3391
3844
  return xHandle;
3392
3845
  };
3393
3846
  try {
3394
- for (var _g = __values(serialized.nodes), _h = _g.next(); !_h.done; _h = _g.next()) {
3395
- var node = _h.value;
3847
+ for (var _j = __values(serialized.nodes), _k = _j.next(); !_k.done; _k = _j.next()) {
3848
+ var node = _k.value;
3396
3849
  rootAclyEntries.push({
3397
3850
  name: node.key,
3398
3851
  id: emit(node, aclyHandle, true)
3399
3852
  });
3400
3853
  }
3401
3854
  }
3402
- catch (e_29_1) { e_29 = { error: e_29_1 }; }
3855
+ catch (e_45_1) { e_45 = { error: e_45_1 }; }
3403
3856
  finally {
3404
3857
  try {
3405
- if (_h && !_h.done && (_a = _g.return)) _a.call(_g);
3858
+ if (_k && !_k.done && (_a = _j.return)) _a.call(_j);
3406
3859
  }
3407
- finally { if (e_29) throw e_29.error; }
3860
+ finally { if (e_45) throw e_45.error; }
3408
3861
  }
3409
3862
  var layerExtEntries = new Map();
3410
3863
  var existingLayerExt = this.getObjectById(layerExtHandle);
3411
3864
  if (existingLayerExt instanceof AcDbDictionary) {
3412
3865
  try {
3413
- for (var _j = __values(existingLayerExt.entries()), _k = _j.next(); !_k.done; _k = _j.next()) {
3414
- var _l = __read(_k.value, 2), key = _l[0], value = _l[1];
3866
+ for (var _l = __values(existingLayerExt.entries()), _m = _l.next(); !_m.done; _m = _l.next()) {
3867
+ var _o = __read(_m.value, 2), key = _o[0], value = _o[1];
3415
3868
  layerExtEntries.set(key, value.objectId);
3416
3869
  }
3417
3870
  }
3418
- catch (e_30_1) { e_30 = { error: e_30_1 }; }
3871
+ catch (e_46_1) { e_46 = { error: e_46_1 }; }
3419
3872
  finally {
3420
3873
  try {
3421
- if (_k && !_k.done && (_b = _j.return)) _b.call(_j);
3874
+ if (_m && !_m.done && (_b = _l.return)) _b.call(_l);
3422
3875
  }
3423
- finally { if (e_30) throw e_30.error; }
3876
+ finally { if (e_46) throw e_46.error; }
3424
3877
  }
3425
3878
  }
3426
3879
  layerExtEntries.set(ACLY_DICTIONARY_NAME, aclyHandle);
@@ -3442,8 +3895,36 @@ var AcDbDatabase = /** @class */ (function (_super) {
3442
3895
  entries: rootAcadEntries
3443
3896
  });
3444
3897
  try {
3898
+ // Generated here, after planning: register them so the extension
3899
+ // dictionary pointers of the filter XRecords are written.
3445
3900
  for (var dicts_1 = __values(dicts), dicts_1_1 = dicts_1.next(); !dicts_1_1.done; dicts_1_1 = dicts_1.next()) {
3446
3901
  var dict = dicts_1_1.value;
3902
+ filer.markObjectIdWritten(dict.handle);
3903
+ }
3904
+ }
3905
+ catch (e_47_1) { e_47 = { error: e_47_1 }; }
3906
+ finally {
3907
+ try {
3908
+ if (dicts_1_1 && !dicts_1_1.done && (_c = dicts_1.return)) _c.call(dicts_1);
3909
+ }
3910
+ finally { if (e_47) throw e_47.error; }
3911
+ }
3912
+ try {
3913
+ for (var xrecs_1 = __values(xrecs), xrecs_1_1 = xrecs_1.next(); !xrecs_1_1.done; xrecs_1_1 = xrecs_1.next()) {
3914
+ var item = xrecs_1_1.value;
3915
+ filer.markObjectIdWritten(item.handle);
3916
+ }
3917
+ }
3918
+ catch (e_48_1) { e_48 = { error: e_48_1 }; }
3919
+ finally {
3920
+ try {
3921
+ if (xrecs_1_1 && !xrecs_1_1.done && (_d = xrecs_1.return)) _d.call(xrecs_1);
3922
+ }
3923
+ finally { if (e_48) throw e_48.error; }
3924
+ }
3925
+ try {
3926
+ for (var dicts_2 = __values(dicts), dicts_2_1 = dicts_2.next(); !dicts_2_1.done; dicts_2_1 = dicts_2.next()) {
3927
+ var dict = dicts_2_1.value;
3447
3928
  filer.writeStart('DICTIONARY');
3448
3929
  filer.writeHandle(5, dict.handle);
3449
3930
  filer.writeObjectId(330, dict.ownerId);
@@ -3451,31 +3932,31 @@ var AcDbDatabase = /** @class */ (function (_super) {
3451
3932
  filer.writeInt16(280, 1);
3452
3933
  filer.writeInt16(281, 1);
3453
3934
  try {
3454
- for (var _m = (e_32 = void 0, __values(dict.entries)), _o = _m.next(); !_o.done; _o = _m.next()) {
3455
- var entry = _o.value;
3935
+ for (var _p = (e_50 = void 0, __values(dict.entries)), _q = _p.next(); !_q.done; _q = _p.next()) {
3936
+ var entry = _q.value;
3456
3937
  filer.writeString(3, entry.name);
3457
3938
  filer.writeObjectId(350, entry.id);
3458
3939
  }
3459
3940
  }
3460
- catch (e_32_1) { e_32 = { error: e_32_1 }; }
3941
+ catch (e_50_1) { e_50 = { error: e_50_1 }; }
3461
3942
  finally {
3462
3943
  try {
3463
- if (_o && !_o.done && (_d = _m.return)) _d.call(_m);
3944
+ if (_q && !_q.done && (_f = _p.return)) _f.call(_p);
3464
3945
  }
3465
- finally { if (e_32) throw e_32.error; }
3946
+ finally { if (e_50) throw e_50.error; }
3466
3947
  }
3467
3948
  }
3468
3949
  }
3469
- catch (e_31_1) { e_31 = { error: e_31_1 }; }
3950
+ catch (e_49_1) { e_49 = { error: e_49_1 }; }
3470
3951
  finally {
3471
3952
  try {
3472
- if (dicts_1_1 && !dicts_1_1.done && (_c = dicts_1.return)) _c.call(dicts_1);
3953
+ if (dicts_2_1 && !dicts_2_1.done && (_e = dicts_2.return)) _e.call(dicts_2);
3473
3954
  }
3474
- finally { if (e_31) throw e_31.error; }
3955
+ finally { if (e_49) throw e_49.error; }
3475
3956
  }
3476
3957
  try {
3477
- for (var xrecs_1 = __values(xrecs), xrecs_1_1 = xrecs_1.next(); !xrecs_1_1.done; xrecs_1_1 = xrecs_1.next()) {
3478
- var item = xrecs_1_1.value;
3958
+ for (var xrecs_2 = __values(xrecs), xrecs_2_1 = xrecs_2.next(); !xrecs_2_1.done; xrecs_2_1 = xrecs_2.next()) {
3959
+ var item = xrecs_2_1.value;
3479
3960
  var xrecord = new AcDbXrecord();
3480
3961
  xrecord.objectId = item.handle;
3481
3962
  xrecord.ownerId = item.ownerId;
@@ -3487,12 +3968,12 @@ var AcDbDatabase = /** @class */ (function (_super) {
3487
3968
  xrecord.dxfOut(filer);
3488
3969
  }
3489
3970
  }
3490
- catch (e_33_1) { e_33 = { error: e_33_1 }; }
3971
+ catch (e_51_1) { e_51 = { error: e_51_1 }; }
3491
3972
  finally {
3492
3973
  try {
3493
- if (xrecs_1_1 && !xrecs_1_1.done && (_e = xrecs_1.return)) _e.call(xrecs_1);
3974
+ if (xrecs_2_1 && !xrecs_2_1.done && (_g = xrecs_2.return)) _g.call(xrecs_2);
3494
3975
  }
3495
- finally { if (e_33) throw e_33.error; }
3976
+ finally { if (e_51) throw e_51.error; }
3496
3977
  }
3497
3978
  };
3498
3979
  /**
@@ -3505,7 +3986,7 @@ var AcDbDatabase = /** @class */ (function (_super) {
3505
3986
  * @param recordType - DXF record type name for each table record.
3506
3987
  */
3507
3988
  AcDbDatabase.prototype.writeDxfTable = function (filer, tableName, table, records, recordType) {
3508
- var e_35, _a;
3989
+ var e_53, _a;
3509
3990
  var items = __spreadArray([], __read(records), false);
3510
3991
  filer.startTable(tableName);
3511
3992
  table.dxfOut(filer);
@@ -3521,12 +4002,12 @@ var AcDbDatabase = /** @class */ (function (_super) {
3521
4002
  record.dxfOut(filer, true);
3522
4003
  }
3523
4004
  }
3524
- catch (e_35_1) { e_35 = { error: e_35_1 }; }
4005
+ catch (e_53_1) { e_53 = { error: e_53_1 }; }
3525
4006
  finally {
3526
4007
  try {
3527
4008
  if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
3528
4009
  }
3529
- finally { if (e_35) throw e_35.error; }
4010
+ finally { if (e_53) throw e_53.error; }
3530
4011
  }
3531
4012
  filer.endTable();
3532
4013
  };
@@ -3541,6 +4022,13 @@ var AcDbDatabase = /** @class */ (function (_super) {
3541
4022
  * @param entity - Entity to serialize.
3542
4023
  */
3543
4024
  AcDbDatabase.prototype.writeDxfEntity = function (filer, entity) {
4025
+ // Preserved tags only fit the layout they were read in: R13+ tags (with
4026
+ // subclass markers) cannot go to R12 and vice versa; ezdxf drops such
4027
+ // entities as well.
4028
+ if (entity instanceof AcDbUnknownEntity &&
4029
+ entity.hasSubclassData !== filer.capabilities.supportsSubclassMarkers) {
4030
+ return;
4031
+ }
3544
4032
  if (entity instanceof AcDbPolyline &&
3545
4033
  !filer.capabilities.supportsLwPolyline) {
3546
4034
  filer.writeStart('POLYLINE');
@@ -3587,6 +4075,8 @@ var AcDbDatabase = /** @class */ (function (_super) {
3587
4075
  this.transactionManager.clearUndoStack();
3588
4076
  // Clear all tables and dictionaries
3589
4077
  this._classes = [];
4078
+ this.clearDxfHeaderExtras();
4079
+ this._dxfUnknownObjects = [];
3590
4080
  this._tables.blockTable.removeAll();
3591
4081
  this._tables.dimStyleTable.removeAll();
3592
4082
  this._tables.linetypeTable.removeAll();