1#!/usr/bin/perl
2=head1 USAGE
3
4    perl examples/log_unknown_dxf.pl examples/alldwg.inc
5    make -C examples alldxf_0.inc
6
7    Creates the 3 examples/alldxf_*.inc includes from the examples/alldwg.inc
8    parsed from the logs, and mixed with the values from the matching DXF sources.
9
10    In C we cannot statically initialize variable-sized arrays of structs,
11    so we split it up into 3 parts.
12
13e.g.
14
15    { "MATERIAL", "004014080405aa6a9aa404014080405aa6a9aa404000000000000e03f4080405aa6a9aa4054080405aa6a9aa4050201016a9aa6a90150201016a9aa6a900aa4fe41d0801e40130018401e4019401c802aaa1803824882e464030dfbfb8", "11", "Drawing_2007.log", "test/test-data/Drawing_2007.dxf", 0x96, 746 },
16
17Search 0 MATERIAL + Handle 96 in test/test-data/Drawing_2007.dxf =>
18
19      0
20    MATERIAL
21      5
22    96
23-     1
24-   ByLayer
25-    94
26-          63
27=>
28    FIELD_T   1  "ByLayer"    => dwg.spec: FIELD_T (name, 1);
29    FIELD_BL 94 63  (int32_t) => dwg.spec: FIELD_BL (channel_flags, 94);
30
31calc. number of same-typed: value fields as num.
32
33=cut
34
35use strict;
36use File::Basename qw(dirname);
37
38# DXF types
39use constant UNKNOWN => 0;
40use constant B       => 1;
41use constant NUM     => 2; #BL, BS, RL, RS or RC
42use constant HDL     => 3;
43use constant STR     => 4;
44use constant HEXSTR  => 5;
45use constant DBL     => 6;
46use B ();
47
48#require dirname(__FILE__)."/unstable.pm";
49my $dir = dirname(__FILE__);
50open my $f0, ">", "$dir/alldxf_0.inc" or die "$!";
51open my $f1a, ">", "$dir/alldxf_1.inc" or die "$!";
52open my $f2, ">", "$dir/alldxf_2.inc" or die "$!";
53my $i = 0;
54my (%skip, %dupl);
55
56if (0) {
57  open my $skip_fh, "<", "examples/alldwg.skip"
58    or warn "examples/alldwg.skip missing";
59  while (<$skip_fh>) {
60    my @F = split(' ');
61    shift @F;
62    # NAME-HANDLE-BITSIZE
63    $F[2] =~ s/^0x//;
64    $skip{"$F[0]-$F[2]-$F[3]"} = \@F;
65  }
66  close $skip_fh;
67}
68
69my @ASSOCACTION_fields = (
70    90  => 'class_version',
71    90  => 'geometry_status',
72    330 => 'owningnetwork',
73    360 => 'actionbody',
74    90  => 'action_index',
75    90  => 'max_assoc_dep_index',
76    90  => 'num_deps',
77    360 => 'dep',
78
79    # class_version > 1:
80    90  => '',                         # 0
81    90  => 'num_owned_params',
82    360 => 'owned_params',
83    90  => '',                         # 0
84    90  => 'num_owned_value_params',
85    360 => 'owned_value_params',
86);
87
88my @AcDbAssocPathBasedSurfaceActionBody = (
89    100 => 'AcDbAssocActionBody',
90    90  => 'aab_version',
91    100 => 'AcDbAssocParamBasedActionBody',
92    90  => 'pab_status',
93    90  => 'pab_l2',
94    90  => 'num_deps',
95    360 => 'writedeps',
96    90  => 'pab_l4',
97    90  => 'pab_l5',
98    330 => 'readdeps',
99    1   => 'description',
100    100 => 'AcDbAssocSurfaceActionBody',
101    90  => 'sab_status',
102    290 => 'sab_b1',
103    90  => 'sab_l2',
104    290 => 'sab_b2',
105    70  => 'sab_s1',
106    100 => 'AcDbAssocPathBasedSurfaceActionBody',
107    90  => 'pbsab_status'
108);
109
110my @AcDbAssocAnnotationActionBody = (
111    100 => 'AcDbAssocActionBody',
112    90  => 'aab_version',
113    100 => 'AcDbAssocParamBasedActionBody',
114    90  => 'pab_status',
115    90  => 'pab_l2',
116    90  => 'num_deps',
117    360 => 'writedeps',
118    90  => 'pab_l4',
119    90  => 'pab_l5',
120    330 => 'readdeps',
121    1   => 'description',
122    100 => 'AcDbAssocSurfaceActionBody',
123    90  => 'sab_status',
124    290 => 'sab_b1',
125    90  => 'sab_l2',
126    290 => 'sab_b2',
127    70  => 'sab_s1',
128    100 => 'AcDbAssocPathBasedSurfaceActionBody',
129    90  => 'pbsab_status'
130);
131
132my @AcDbEvalExpr = (
133    100 => 'AcDbEvalExpr',
134    90  => 'evalexpr.nodeid',
135    0   => 'evalexpr.parentid',
136    98  => 'evalexpr.major',
137    99  => 'evalexpr.minor',
138    70  => 'evalexpr.value_code',
139    40  => 'evalexpr.value.num40',
140    10  => 'evalexpr.value.pt2d',
141    11  => 'evalexpr.value.pt3d',
142    1   => 'evalexpr.value.text1',
143    90  => 'evalexpr.value.long90',
144    91  => 'evalexpr.value.handle91',
145    70  => 'evalexpr.value.short70'
146);
147
148sub trans {
149  my ($code, $name, $num) = @_;
150  $num = 16 unless $num;
151  my @arr;
152  for (0 .. $num -1 ) {
153    push @arr, ($code, $name. "[$_]");
154  }
155  return @arr;
156}
157
158my @AcDbShHistoryNode = (
159  100 => 'AcDbShHistoryNode',
160  90    => 'history_node.major',
161  91  => 'history_node.minor',
162  trans (40, 'history_node.trans'),
163  62  => 'history_node.color',
164  92  => 'history_node.step_id',
165  347 => 'history_node.material'
166  );
167
168my @DIMASSOC_Ref = (
169  1 => 'DIMASSOC_Ref.classname',
170  72 => 'DIMASSOC_Ref.osnap_type',
171  331 => 'DIMASSOC_Ref.mainobjs',
172  73 => 'DIMASSOC_Ref.main_subent_type',
173  91 => 'DIMASSOC_Ref.main_gsmarker',
174  301 => 'DIMASSOC_Ref.xrefobj',
175  40 => 'DIMASSOC_Ref.osnap_dist',
176  10 => 'DIMASSOC_Ref.osnap_pt.x',
177  20 => 'DIMASSOC_Ref.osnap_pt.y',
178  30 => 'DIMASSOC_Ref.osnap_pt.z',
179  75 => 'DIMASSOC_Ref.has_lastpt_ref',
180  # rarely:
181  332 => 'DIMASSOC_Ref.intsectobj',
182  74 => 'DIMASSOC_Ref.intsect_subent_type');
183
184# dxf names, not obj names.
185# The name in the all*.inc files.
186# which comes from the (?:Unhandled|Unstable) Class (object|entity) \d+ (\w+) warning
187# which uses the klass->dxfname.
188my $known = {
189  ACAD_EVALUATION_GRAPH => [
190    96 => 'has_graph',
191    97 => 'unknown1',
192    91 => 'nodeid',
193    93 => 'edge_flags',
194    95 => 'num_evalexpr',
195    92 => 'node_edge1',
196    92 => 'node_edge2',
197    92 => 'node_edge3',
198    92 => 'node_edge4',
199    360 => 'evalexpr'
200    ],
201  DBCOLOR => [
202    62  => 'color',
203    420 => 'rgb',
204    430 => 'name',
205    330 => 'ownerhandle',
206    ],
207  MATERIAL => [
208    330 => 'ownerhandle',
209    1 => 'name',
210    2 => 'description',
211    70 => 'ambient_color.flag',
212    40 => 'ambient_color.factor',
213    90 => 'ambient_color.rgb',
214    71 => 'diffuse_color.flag',
215    41 => 'diffuse_color.factor',
216    92 => 'diffuse_color.rgb',
217    72 => 'diffusemap.source',
218    3  => 'diffusemap.filename',
219    42 => 'diffusemap.blendfactor',
220    73 => 'diffusemap.projection',
221    74 => 'diffusemap.tiling',
222    75 => 'diffusemap.autotransform',
223    trans (43, 'diffusemap.transmatrix'),
224    44 => 'specular_gloss_factor',
225    76 => 'specular_color.flag',
226    45 => 'specular_color.factor',
227    92 => 'specular_color.rbg',
228    77 => 'specularmap.source',
229    4  => 'specularmap.filename',
230    46 => 'specularmap.blendfactor',
231    78 => 'specularmap.projection',
232    74 => 'specularmap.tiling',
233    170 => 'specularmap.autotransform',
234    trans (47, 'specularmap.transmatrix'),
235    171 => 'reflectionmap.source',
236    6   => 'reflectionmap.filename',
237    48  => 'reflectionmap.blendfactor',
238    172 => 'reflectionmap.projection',
239    173 => 'reflectionmap.tiling',
240    174 => 'reflectionmap.autotransform',
241    trans (49, 'reflectionmap.transmatrix'),
242    140 => 'opacity_percent',
243    175 => 'opacitymap.source',
244    7   => 'opacitymap.filename',
245    141 => 'opacitymap.blendfactor',
246    176 => 'opacitymap.projection',
247    177 => 'opacitymap.tiling',
248    178 => 'opacitymap.autotransform',
249    142 => 'opacitymap.transmatrix[0]',
250    142 => 'opacitymap.transmatrix[1]',
251    142 => 'opacitymap.transmatrix[2]',
252    142 => 'opacitymap.transmatrix[3]',
253    142 => 'opacitymap.transmatrix[4]',
254    142 => 'opacitymap.transmatrix[5]',
255    142 => 'opacitymap.transmatrix[6]',
256    142 => 'opacitymap.transmatrix[7]',
257    142 => 'opacitymap.transmatrix[8]',
258    142 => 'opacitymap.transmatrix[9]',
259    142 => 'opacitymap.transmatrix[10]',
260    142 => 'opacitymap.transmatrix[11]',
261    142 => 'opacitymap.transmatrix[12]',
262    142 => 'opacitymap.transmatrix[13]',
263    142 => 'opacitymap.transmatrix[14]',
264    142 => 'opacitymap.transmatrix[15]',
265    179 => 'bumpmap.source',
266    8   => 'bumpmap.filename',
267    143 => 'bumpmap.blendfactor',
268    270 => 'bumpmap.projection',
269    271 => 'bumpmap.tiling',
270    272 => 'bumpmap.autotransform',
271    144 => 'bumpmap.transmatrix[0]',
272    144 => 'bumpmap.transmatrix[1]',
273    144 => 'bumpmap.transmatrix[2]',
274    144 => 'bumpmap.transmatrix[3]',
275    144 => 'bumpmap.transmatrix[4]',
276    144 => 'bumpmap.transmatrix[5]',
277    144 => 'bumpmap.transmatrix[6]',
278    144 => 'bumpmap.transmatrix[7]',
279    144 => 'bumpmap.transmatrix[8]',
280    144 => 'bumpmap.transmatrix[9]',
281    144 => 'bumpmap.transmatrix[10]',
282    144 => 'bumpmap.transmatrix[11]',
283    144 => 'bumpmap.transmatrix[12]',
284    144 => 'bumpmap.transmatrix[13]',
285    144 => 'bumpmap.transmatrix[14]',
286    144 => 'bumpmap.transmatrix[15]',
287    145 => 'refraction_index',
288    273 => 'refractionmap.source',
289    9   => 'refractionmap.filename',
290    146 => 'refractionmap.blendfactor',
291    274 => 'refractionmap.projection',
292    275 => 'refractionmap.tiling',
293    276 => 'refractionmap.autotransform',
294    147 => 'refractionmap.transmatrix[0]',
295    147 => 'refractionmap.transmatrix[1]',
296    147 => 'refractionmap.transmatrix[2]',
297    147 => 'refractionmap.transmatrix[3]',
298    147 => 'refractionmap.transmatrix[4]',
299    147 => 'refractionmap.transmatrix[5]',
300    147 => 'refractionmap.transmatrix[6]',
301    147 => 'refractionmap.transmatrix[7]',
302    147 => 'refractionmap.transmatrix[8]',
303    147 => 'refractionmap.transmatrix[9]',
304    147 => 'refractionmap.transmatrix[10]',
305    147 => 'refractionmap.transmatrix[11]',
306    147 => 'refractionmap.transmatrix[12]',
307    147 => 'refractionmap.transmatrix[13]',
308    147 => 'refractionmap.transmatrix[14]',
309    147 => 'refractionmap.transmatrix[15]',
310    148 => 'translucence',
311    149 => 'self_illumination',
312    468 => 'reflectivity',
313    93 => 'illumination_model',
314    94 => 'channel_flags',
315    282 => 'mode',
316
317    460 => 'color_bleed_scale',
318    461 => 'indirect_bump_scale',
319    462 => 'reflectance_scale',
320    463 => 'transmittance_scale',
321    290 => 'two_sided_material',
322    464 => 'luminance',
323    #270 => 'luminance_mode',
324    #271 => 'normalmap.method',
325    #465 => 'normalmap.strength',
326    #72 => 'normalmap.source',
327    #3   => 'normalmap.filename',
328    #42 => 'normalmap.blendfactor',
329    #73 => 'normalmap.projection',
330    #74 => 'normalmap.tiling',
331    #75 => 'normalmap.autotransform',
332    #43 => 'normalmap.transmatrix[0]',
333    #43 => 'normalmap.transmatrix[1]',
334    #43 => 'normalmap.transmatrix[2]',
335    #43 => 'normalmap.transmatrix[3]',
336    #43 => 'normalmap.transmatrix[4]',
337    #43 => 'normalmap.transmatrix[5]',
338    #43 => 'normalmap.transmatrix[6]',
339    #43 => 'normalmap.transmatrix[7]',
340    #43 => 'normalmap.transmatrix[8]',
341    #43 => 'normalmap.transmatrix[9]',
342    #43 => 'normalmap.transmatrix[10]',
343    #43 => 'normalmap.transmatrix[11]',
344    #43 => 'normalmap.transmatrix[12]',
345    #43 => 'normalmap.transmatrix[13]',
346    #43 => 'normalmap.transmatrix[14]',
347    #43 => 'normalmap.transmatrix[15]',
348    293 => 'is_anonymous',
349    272 => 'global_illumination',
350    273 => 'final_gather',
351    300 => 'genprocname',
352    291 => 'genprocvalbool',
353    271 => 'genprocvalint',
354    469 => 'genprocvalreal',
355    301 => 'genprocvaltext',
356    292 => 'genproctableend',
357    62 => 'genprocvalcolorindex',
358    420 => 'genprocvalcolorrgb',
359    430 => 'genprocvalcolorname',
360    #270 => 'map_utile',
361    148 => 'translucence',
362    90 => 'self_illumination',
363    468 => 'reflectivity',
364    93 => 'illumination_model',
365    94 => 'channel_flags',
366    ],
367  PLOTSETTINGS => [
368    1 => 'page_setup_name',
369    2 => 'printer_cfg_file',
370    3 => 'paper_size',
371    6 => 'plotview',
372    40 => 'left_margin',
373    41 => 'bottom_margin',
374    42 => 'right_margin',
375    43 => 'top_margin',
376    44 => 'paper_width',
377    45 => 'paper_height',
378    4 => 'canonical_media_name',
379    46 => 'plot_origin',
380    48 => 'plot_window_ll',
381    140 => 'plot_window_ur',
382    142 => 'num_custom_print_scale',
383    143 => 'den_custom_print_scale',
384    70 => 'plot_layout',
385    72 => 'plot_paper_units',
386    73 => 'plot_rotation',
387    74 => 'plot_type',
388    7 => 'stylesheet',
389    75 => 'std_scale_type',
390    147 => 'std_scale_factor',
391    148 => 'paper_image_origin',
392    76 => 'shade_plot_mode',
393    77 => 'shade_plot_res_level',
394    78 => 'shade_plot_custom_dpi',
395    333 => 'shadeplot',
396    ],
397  ACDBASSOCACTION => [
398    @ASSOCACTION_fields,
399    90 => 'num_deps',
400    90 => 'status',
401    ],
402  ACDBASSOCDEPENDENCY => [
403    #100 => 'AcDbAssocDependency',
404    90 => 'class_version',
405    90 => 'status',
406    290 => 'isread_dep',
407    290 => 'iswrite_dep',
408    290 => 'isobjectstate_dep',
409    290 => 'unknown_b4',
410    90 => 'order',
411    290 => 'unknown_b5',
412    #330 => 'ownerhandle',
413    330 => 'owner',
414    330 => 'readdep',
415    330 => 'node',
416    360 => 'writedep',
417    90 => 'depbodyid',
418    ],
419  ACDBASSOCALIGNEDDIMACTIONBODY => [
420    90 => 'aab_version',
421    #100 => 'AcDbAssocParamBasedActionBody',
422    90 => 'pab_status',
423    90 => 'pab_l2',
424    90 => 'num_deps',
425    360 => 'writedep',
426    90 => 'pab_l4',
427    90 => 'pab_l5',
428    330 => 'readdep',
429    #100 => ACDBASSOCALIGNEDDIMACTIONBODY,
430    90 => 'dcm_status',
431    330 => 'd_node',
432    330 => 'r_node',
433    ],
434  ACDBASSOCNETWORK => [
435    @ASSOCACTION_fields,
436    #100 => 'AcDbAssocNetwork',
437    90 => 'unknown_n1',
438    90 => 'unknown_n2',
439    90 => 'num_actions',
440    330 => 'actions',
441    ],
442  ACDBASSOCBLENDSURFACEACTIONBODY => [
443    @AcDbAssocPathBasedSurfaceActionBody,
444    100 => 'AcDbAssocBlendSurfaceActionBody',
445    90 => 'class_version',
446    290 => 'b1',
447    291 => 'b2',
448    292 => 'b3',
449    72 => 'blend_options',
450    293 => 'b4',
451    294 => 'b5',
452    73 => 'bs2',
453    ],
454  ACDBASSOCPATCHSURFACEACTIONBODY => [
455    @AcDbAssocPathBasedSurfaceActionBody,
456    100 => 'AcDbAssocPlaneSurfaceActionBody',
457    90 => 'class_version',
458    ],
459  ACDBASSOCPLANESURFACEACTIONBODY => [
460    @AcDbAssocPathBasedSurfaceActionBody,
461    100 => 'AcDbAssocPlaneSurfaceActionBody',
462    90 => 'psab_status',
463    ],
464  ACDBASSOCEDGECHAMFERSURFACEACTIONBODY => [
465    @AcDbAssocPathBasedSurfaceActionBody,
466    100 => 'AcDbAssocEdgeChamferActionBody',
467  ],
468  ACDBASSOCEDGEFILLETSURFACEACTIONBODY => [
469    @AcDbAssocPathBasedSurfaceActionBody,
470    100 => 'AcDbAssocEdgeFilletActionBody',
471  ],
472  ACDBASSOCEXTRUDEDSURFACEACTIONBODY => [
473    @AcDbAssocPathBasedSurfaceActionBody,
474    100 => 'AcDbAssocExtrudedSurfaceActionBody',
475    90 => 'esab_status',
476  ],
477  ACDBASSOCFILLETSURFACEACTIONBODY => [
478    @AcDbAssocPathBasedSurfaceActionBody,
479    100 => 'AcDbAssocFilletSurfaceActionBody',
480    90 => 'class_version',
481    70 => 'status',
482    10 => 'pt1',
483    10 => 'pt2',
484  ],
485  ACDBASSOCLOFTEDSURFACEACTIONBODY => [
486    @AcDbAssocPathBasedSurfaceActionBody,
487    100 => 'AcDbAssocLoftedSurfaceActionBody',
488    90 => 'lsab_status',
489  ],
490  ACDBASSOCREVOLVEDSURFACEACTIONBODY => [
491    @AcDbAssocPathBasedSurfaceActionBody,
492    100 => 'AcDbAssocRevolvedSurfaceActionBody',
493    90 => 'rsab_status',
494  ],
495  ACDBASSOCSWEPTSURFACEACTIONBODY => [
496    @AcDbAssocPathBasedSurfaceActionBody,
497    100 => 'AcDbAssocSweptSurfaceActionBody',
498    90 => 'ssab_status',
499    ],
500  ACDBASSOCTRIMSURFACEACTIONBODY => [
501    @AcDbAssocPathBasedSurfaceActionBody,
502    100 => 'AcDbAssocBlendSurfaceActionBody',
503    90 => 'class_version',
504    290 => 'b1',
505    290 => 'b2',
506    40 => 'distance',
507    ],
508  ACDBASSOCRESTOREENTITYSTATEACTIONBODY => [
509    100 => 'AcDbAssocActionBody',
510    90 => 'aap_version',
511    100 => 'AcDbAssocRestoreEntityStateActionBody',
512    90 => 'class_version',
513    5 => 'entity',
514  ],
515  ACDBASSOMLEADERACTIONBODY => [
516    @AcDbAssocAnnotationActionBody,
517    100 => 'AcDbAssocMLeaderActionBody',
518    90 => 'class_version',
519    90 => 'num_actions',
520    # 90 => 'actions[0].depid',
521    330 => 'actions[0].dep',
522  ],
523  ACDBASSOCALIGNEDDIMACTIONBODY => [
524    @AcDbAssocAnnotationActionBody,
525    100 => 'AcDbAssocAlignedDimActionBody',
526    90 => 'class_version',
527    330 => 'r_node',
528    330 => 'd_node',
529  ],
530  ACDBASSOC3POINTANGULARDIMACTIONBODY => [
531    @AcDbAssocAnnotationActionBody,
532    100 => 'Assoc3PointAngularDimActionBody',
533    90 => 'class_version',
534    330 => 'r_node',
535    330 => 'd_node',
536    330 => 'assocdep',
537  ],
538  ACDBASSOCORDINATEDIMACTIONBODY => [
539    @AcDbAssocAnnotationActionBody,
540    100 => 'AssocOrdinatedDimActionBody',
541    90 => 'class_version',
542    330 => 'r_node',
543    330 => 'd_node',
544  ],
545  ACDBASSOCROTATEDDIMACTIONBODY => [
546    @AcDbAssocAnnotationActionBody,
547    100 => 'AssocRotatedDimActionBody',
548    90 => 'class_version',
549    330 => 'r_node',
550    330 => 'd_node',
551  ],
552  ACDBPERSSUBENTMANAGER => [
553    100 => 'AcDbPersSubentManager',
554    90 => 'class_version',
555    90 => 'unknown_bl1',
556    90 => 'unknown_bl2',
557    90 => 'unknown_bl3',
558    90 => 'unknown_bl4',
559    90 => 'unknown_bl5',
560    90 => 'unknown_bl6',
561    ],
562  ACDBASSOCPERSSUBENTMANAGER => [
563    100 => 'AcDbAssocPersSubentManager',
564    90 => 'class_version',
565    90 => 'unknown_bl1',
566    90 => 'unknown_bl2',
567    90 => 'unknown_bl3',
568    90 => 'unknown_bl4',
569    90 => 'unknown_bl5',
570    90 => 'unknown_bl6',
571    90 => 'unknown_bl6a',
572    90 => 'unknown_bl7a',
573    90 => 'unknown_bl7',
574    90 => 'unknown_bl7',
575    90 => 'unknown_bl8',
576    90 => 'unknown_bl9',
577    90 => 'unknown_bl10',
578    90 => 'unknown_bl11',
579    90 => 'unknown_bl12',
580    90 => 'unknown_bl13',
581    90 => 'unknown_bl14',
582    90 => 'unknown_bl15',
583    90 => 'unknown_bl16',
584    90 => 'unknown_bl17',
585    90 => 'unknown_bl18',
586    90 => 'unknown_bl19',
587    90 => 'unknown_bl20',
588    90 => 'unknown_bl21',
589    90 => 'unknown_bl22',
590    90 => 'unknown_bl23',
591    90 => 'unknown_bl24',
592    90 => 'unknown_bl25',
593    90 => 'unknown_bl26',
594    90 => 'unknown_bl27',
595    90 => 'unknown_bl28',
596    90 => 'unknown_bl29',
597    90 => 'unknown_bl30',
598    90 => 'unknown_bl31',
599    90 => 'unknown_bl32',
600    90 => 'unknown_bl33',
601    90 => 'unknown_bl34',
602    90 => 'unknown_bl35',
603    90 => 'unknown_bl36',
604    290 => 'unknown_b37',
605    ],
606  ACDBASSOC2DCONSTRAINTGROUP => [
607    @ASSOCACTION_fields,
608    10 => 'workplane',
609    360 => 'h1',
610    90 => 'l6',
611    360 => 'h2',
612    360 => 'h3',
613    90 => 'l7',
614    90 => 'l8',
615    1  => 't1', # AcConstrainedCircle
616    330 => 'h4',
617    90 => 'cl1',
618    70 => 'cs1',
619    90 => 'cl2',
620    90 => 'cl3',
621    330 => 'h5',
622    90 => 'cl4',
623    10 => 'c1',
624    10 => 'c2',
625    10 => 'c3',
626    40 => 'w1',
627    40 => 'w2',
628    40 => 'w3',
629    1 => 't2', # AcConstrainedImplicitPoint
630    ],
631  ACDBASSOCOSNAPPOINTREFACTIONPARAM => [
632    90 => 'status',
633    90 => 'flags',
634    90 => 'num_actions',
635    360 => 'writedep',
636    330 => 'actions',
637    #40 => 'unknown3',
638    #...
639    ],
640  ACDBASSOCGEOMDEPENDENCY => [
641    # 100 AcDbAssocDependency
642    90 => 'class_version',
643    90 => 'dependent_on_object_status',
644    290 => 'has_cached_value',
645    290 => 'is_actionevaluation_in_progress',
646    290 => 'is_attached_to_object',
647    290 => 'is_delegating_to_owning_action',
648    90 => 'bs90_2',
649    330 => 'h330_1',
650    290 => 'b290_5',
651    330 => 'h330_2',
652    330 => 'h330_3',
653    360 => 'h360',
654    90 => 'bs90_3',
655    # 100 AcDbAssocGeomDependency
656    90 => 'bs90_4',
657    290 => 'b290_6',
658    1 => 't', # AcDbAssocSingleEdgePersSubentId
659    290 => 'dependent_on_compound_object',
660    ],
661  ACSH_BOX_CLASS => [
662    @AcDbEvalExpr,
663    @AcDbShHistoryNode,
664    100 => 'AcDbShPrimitive',
665    100 => 'AcDbShBox',
666    90 => 'major',
667    91 => 'minor',
668    40 => 'length',
669    41 => 'width',
670    42 => 'height',
671    ],
672  ACSH_WEDGE_CLASS => [
673    @AcDbEvalExpr,
674    @AcDbShHistoryNode,
675    100 => 'AcDbShPrimitive',
676    100 => 'AcDbShWedge',
677    90 => 'major',
678    91 => 'minor',
679    40 => 'length',
680    41 => 'width',
681    42 => 'height',
682    ],
683  ACSH_SPHERE_CLASS => [
684    @AcDbEvalExpr,
685    @AcDbShHistoryNode,
686    100 => 'AcDbShPrimitive',
687    100 => 'AcDbShSphere',
688    90 => 'major',
689    91 => 'minor',
690    40 => 'radius',
691    ],
692  ACSH_CYLINDER_CLASS => [
693    @AcDbEvalExpr,
694    @AcDbShHistoryNode,
695    100 => 'AcDbShPrimitive',
696    100 => 'AcDbShCylinder',
697    90 => 'major',
698    91 => 'minor',
699    40 => 'height',
700    41 => 'major_radius',
701    42 => 'minor_radius',
702    43 => 'x_radius',
703    ],
704  ACSH_CONE_CLASS => [
705    @AcDbEvalExpr,
706    @AcDbShHistoryNode,
707    100 => 'AcDbShPrimitive',
708    100 => 'AcDbShCone',
709    90 => 'major',
710    91 => 'minor',
711    40 => 'base_radius',
712    41 => 'top_major_radius',
713    42 => 'top_minor_radius',
714    43 => 'top_x_radius',
715    ],
716  ACSH_PYRAMID_CLASS => [
717    @AcDbEvalExpr,
718    @AcDbShHistoryNode,
719    100 => 'AcDbShPrimitive',
720    100 => 'AcDbShPyramid',
721    90 => 'major',
722    91 => 'minor',
723    40 => 'height',
724    92 => 'sides',
725    41 => 'radius',
726    42 => 'topradius',
727    ],
728  ACSH_FILLET_CLASS => [
729    @AcDbEvalExpr,
730    @AcDbShHistoryNode,
731    100 => 'AcDbShPrimitive',
732    100 => 'AcDbShFillet',
733    90 => 'major',
734    91 => 'minor',
735    92 => 'bl92',
736    93 => 'num_edges',
737    94 => 'edges',
738    95 => 'num_radiuses',
739    41 => 'radiuses',
740    96 => 'num_startsetbacks',
741    97 => 'num_endsetbacks',
742    43 => 'endsetbacks',
743    42 => 'startsetbacks',
744    ],
745  ACSH_CHAMFER_CLASS => [
746    @AcDbEvalExpr,
747    @AcDbShHistoryNode,
748    100 => 'AcDbShPrimitive',
749    100 => 'AcDbShChamfer',
750    90 => 'major',
751    91 => 'minor',
752    92 => 'bl92',
753    41 => 'base_dist',
754    42 => 'other_dist',
755    93 => 'num_edges',
756    94 => 'edges',
757    95 => 'bl95',
758    ],
759  ACSH_TORUS_CLASS => [
760    @AcDbEvalExpr,
761    @AcDbShHistoryNode,
762    100 => 'AcDbShPrimitive',
763    100 => 'AcDbShTorus',
764    90 => 'major',
765    91 => 'minor',
766    40 => 'major_radius',
767    41 => 'minor_radius',
768    ],
769  ACSH_BREP_CLASS => [
770    @AcDbEvalExpr,
771    @AcDbShHistoryNode,
772    100 => 'AcDbShPrimitive',
773    100 => 'AcDbShBrep',
774    90 => 'major',
775    91 => 'minor',
776    70 => 'modeler_format_version',
777    ],
778  ACSH_BOOLEAN_CLASS => [
779    @AcDbEvalExpr,
780    @AcDbShHistoryNode,
781    100 => 'AcDbShPrimitive',
782    100 => 'AcDbShBoolean',
783    90 => 'major',
784    91 => 'minor',
785    280 => 'operation',
786    92 => 'operand1',
787    93 => 'operand2',
788    ],
789  ACSH_SWEEP_CLASS => [
790    @AcDbEvalExpr,
791    @AcDbShHistoryNode,
792    100 => 'AcDbShPrimitive',
793    # 100 => AcDbShSweepBase
794    90 => 'shsw_bl90',
795    91 => 'shsw_bl91',
796    10 => 'basept',
797    92 => 'shsw_bl92',
798    90 => 'shsw_text_size',
799    310 => 'shsw_text',
800    93 => 'shsw_bl93',
801    90 => 'shsw_text2_size',
802    310 => 'shsw_text2',
803    42 => 'draft_angle',
804    43 => 'start_draft_dist',
805    44 => 'end_draft_dist',
806    45 => 'scale_factor',
807    48 => 'twist_angle',
808    49 => 'align_angle',
809    46 => 'sweepentity_transform',
810    47 => 'pathentity_transform',
811    70 => 'align_option',
812    71 => 'miter_option',
813    290 => 'has_align_start',
814    292 => 'bank',
815    293 => 'check_intersections',
816    294 => 'shsw_b294',
817    295 => 'shsw_b295',
818    296 => 'shsw_b296',
819    11 => 'pt2',
820    ],
821  ACSH_HISTORY_CLASS => [
822    # 100 => AcDbEvalExpr
823    90 => 'class_version',
824    98 => 'ee_bl98',
825    99 => 'ee_bl99',
826    # 100 => AcDbShHistoryNode
827    90 => 'shhn_bl90',
828    91 => 'shhn_bl91',
829    40 => 'shhn_pts',
830    62 => 'color',
831    92 => 'shhn_b92',
832    347 => 'shhn_bl347',
833    ],
834  ARC_DIMENSION => [
835    210 => 'extrusion',
836    2 => 'block_name',
837    10 => 'def_pt',
838    11 => 'text_midpt',
839    31 => 'elevation',
840    70 => 'flag',
841    1 => 'user_text',
842    53 => 'text_rotation',
843    51 => 'horiz_dir',
844    40 => 'leader_len',
845    54 => 'ins_rotation',
846    71 => 'attachment',
847    72 => 'lspace_style',
848    41 => 'lspace_factor',
849    42 => 'act_measurement',
850    3 => 'dimstyle',
851    73 => 'unknown',
852    74 => 'flip_arrow1',
853    75 => 'flip_arrow2',
854    12 => 'clone_ins_pt',
855
856    10 => 'def_pt',
857    13 => 'xline1_pt',
858    14 => 'xline2_pt',
859    15 => 'center_pt',
860    16 => 'leader1_pt',
861    17 => 'leader2_pt',
862    40 => 'leader_len',
863    41 => 'arc_start_param',
864    42 => 'arc_end_param',
865    70 => 'is_partial',
866    ],
867  DATALINK => [
868    70 => 'class_version',
869    1 => 'data_adapter',
870    300 => 'description',
871    301 => 'tooltip',
872    302 => 'connection_string',
873    90 => 'option',
874    91 => 'update_option',
875    92 => 'bl92',
876    170 => 'year',
877    171 => 'month',
878    172 => 'day',
879    173 => 'hour',
880    174 => 'minute',
881    175 => 'seconds',
882    176 => 'msec',
883    177 => 'path_option',
884    93 => 'bl93',
885    304 => 'update_status',
886    94 => 'num_customdata',
887    #305 => '', # CUSTOMDATA
888    #1 => '', # DATAMAP_BEGIN
889    330 => 'customdata.target',
890    304 => 'customdata.text',
891    360 => 'hardowner',
892    #309 => '', # DATAMAP_END
893    ],
894  DIMASSOC => [
895    330 => 'dimensionobj',
896    90 => 'associativity',
897    70 => 'trans_space_flag',
898    71 => 'rotated_type',
899    @DIMASSOC_Ref,
900    @DIMASSOC_Ref,
901    @DIMASSOC_Ref,
902    @DIMASSOC_Ref,
903    92 => 'intsect_gsmarker',
904    301 => 'xrefobj',
905    302 => 'intsectxrefobj',
906    302 => 'intsectxrefobj',
907    ],
908  LIGHT => [
909    90 => 'class_version',
910    1 => 'name',
911    70 => 'type',
912    290 => 'status',
913    90 => 'color.rgb', #r2000 only
914    63 => 'color',
915    291 => 'plot_glyph',
916    40 => 'intensity',
917    10 => 'position',
918    11 => 'target',
919    72 => 'attenuation_type',
920    292 => 'use_attenuation_limits',
921    41 => 'attenuation_start_limit',
922    42 => 'attenuation_end_limit',
923    50 => 'hotspot_angle',
924    51 => 'falloff_angle',
925    293 => 'cast_shadows',
926    73 => 'shadow_type',
927    91 => 'shadow_map_size',
928    280 => 'shadow_map_softness',
929    #0 => 'lamp_color_preset',
930    #0 => 'lamp_color_type',
931    #0 => 'physical_intensity_method',
932    #0 => 'drawable_type',
933    #0 => 'glyph_display_type',
934    #0 => 'glyph_display',
935    ],
936  NAVISWORKSMODELDEF => [
937    #100 => AcDbNavisworksModelDef
938    1 => 'path',
939    290 => 'status',
940    10 => 'min_extent',
941    11 => 'max_extent',
942    290 => 'host_drawing_visibility',
943    ],
944  RENDERENVIRONMENT => [
945    # 100 => AcDbRenderEnvironment
946    90 => 'class_version',
947    290 => 'fog_enabled',
948    290 => 'fog_background_enabled',
949    280 => 'fog_color',
950    40 => 'fog_density_near',
951    40 => 'fog_density_far',
952    40 => 'fog_distance_near',
953    40 => 'fog_distance_far',
954    290 => 'environ_image_enabled',
955    1 => 'environ_image_filename',
956    ],
957  RENDERSETTINGS => [
958    # 100 => AcDbRenderSettings
959    90 => 'class_version',
960    1 => 'name',
961    290 => 'fog_enabled',
962    290 => 'fog_background_enabled',
963    290 => 'backfaces_enabled',
964    290 => 'environ_image_enabled',
965    1 => 'environ_image_filename',
966    1 => 'description',
967    90 => 'display_index',
968    290 => 'has_predefined',
969    ],
970  RAPIDRTRENDERSETTINGS => [
971    # 100 => AcDbRenderSettings
972    90 => 'class_version',
973    1 => 'name',
974    290 => 'fog_enabled',
975    290 => 'fog_background_enabled',
976    290 => 'backfaces_enabled',
977    290 => 'environ_image_enabled',
978    1 => 'environ_image_filename',
979    1 => 'description',
980    90 => 'display_index',
981    290 => 'has_predefined',
982    # 100 => AcDbRapidRTRenderSettings
983    90 => 'rapidrt_version',
984    70 => 'render_target',
985    90 => 'render_level',
986    90 => 'render_time',
987    70 => 'lighting_model',
988    70 => 'filter_type',
989    40 => 'filter_width',
990    40 => 'filter_height',
991    290 => 'has_predefined',
992    ],
993  MENTALRAYRENDERSETTINGS => [
994    # 100 => AcDbRenderSettings
995    90 => 'class_version',
996    1 => 'name',
997    290 => 'fog_enabled',
998    290 => 'fog_background_enabled',
999    290 => 'backfaces_enabled',
1000    290 => 'environ_image_enabled',
1001    1 => 'environ_image_filename',
1002    1 => 'description',
1003    90 => 'display_index',
1004    290 => 'has_predefined',
1005    # 100 => AcDbMentalRayRenderSettings
1006    90 => 'mr_version',
1007    90 => 'sampling1',
1008    90 => 'sampling2',
1009    70 => 'sampling_mr_filter',
1010    40 => 'sampling_filter1',
1011    40 => 'sampling_filter2',
1012    40 => 'sampling_contrast_color1',
1013    40 => 'sampling_contrast_color2',
1014    40 => 'sampling_contrast_color3',
1015    40 => 'sampling_contrast_color4',
1016    70 => 'shadow_mode',
1017    290 => 'shadow_maps_enabled',
1018    290 => 'ray_tracing_enabled',
1019    90 => 'ray_trace_depth1',
1020    90 => 'ray_trace_depth2',
1021    90 => 'ray_trace_depth3',
1022    290 => 'global_illumination_enabled',
1023    90 => 'gi_sample_count',
1024    290 => 'gi_sample_radius_enabled',
1025    40 => 'gi_sample_radius',
1026    90 => 'gi_photons_per_light',
1027    90 => 'photon_trace_depth1',
1028    90 => 'photon_trace_depth2',
1029    90 => 'photon_trace_depth3',
1030    290 => 'final_gathering_enabled',
1031    90 => 'fg_ray_count',
1032    290 => 'fg_sample_radius_state1',
1033    290 => 'fg_sample_radius_state2',
1034    290 => 'fg_sample_radius_state3',
1035    40 => 'fg_sample_radius1',
1036    40 => 'fg_sample_radius2',
1037    40 => 'light_luminance_scale',
1038    70 => 'diagnostics_mode',
1039    70 => 'diagnostics_grid_mode',
1040    40 => 'diagnostics_grid_float',
1041    70 => 'diagnostics_photon_mode',
1042    70 => 'diagnostics_bsp_mode',
1043    290 => 'export_mi_enabled',
1044    1 => 'mr_description',
1045    90 => 'tile_size',
1046    70 => 'tile_order',
1047    90 => 'memory_limit',
1048    290 => 'diagnostics_samples_mode',
1049    40 => 'energy_multiplier',
1050    ],
1051  RENDERGLOBAL => [
1052    # 100 => AcDbRenderGlobal
1053    90 => 'class_version',
1054    90 => 'procedure',
1055    90 => 'destination',
1056    290 => 'save_enabled',
1057    1 => 'save_filename',
1058    90 => 'image_width',
1059    90 => 'image_height',
1060    290 => 'predef_presets_first',
1061    290 => 'highlevel_info',
1062    ],
1063  RENDERENTRY => [
1064    90 => 'class_version',
1065    1 => 'image_file_name',
1066    1 => 'preset_name',
1067    1 => 'view_name',
1068    90 => 'dimension_x',
1069    90 => 'dimension_y',
1070    70 => 'start_year',
1071    70 => 'start_month',
1072    70 => 'start_day',
1073    70 => 'start_minute',
1074    70 => 'start_second',
1075    70 => 'start_msec',
1076    40 => 'render_time',
1077    90 => 'memory_amount',
1078    90 => 'material_count',
1079    90 => 'light_count',
1080    90 => 'triangle_count',
1081    90 => 'display_index',
1082  ],
1083  SUN => [
1084    90 => 'class_version',
1085    290 => 'is_on',
1086    291 => 'has_shadow',
1087    292 => 'is_dst',
1088    421 => 'unknown',
1089    40 => 'intensity',
1090    291 => 'has_shadow',
1091    91 => 'julian_day',
1092    92 => 'time',
1093    292 => 'is_dst',
1094    #0 => 'altitude',
1095    #0 => 'azimuth',
1096    #0 => 'direction',
1097    70 => 'shadow_type',
1098    280 => 'shadow_softness',
1099    71 => 'shadow_mapsize',
1100    330 => 'ownerhandle',
1101    63 => 'color',
1102    ],
1103  SUNSTUDY => [
1104    90 => 'class_version',
1105    1 => 'setup_name',
1106    2 => 'description',
1107    70 => 'output_type',
1108    290 => 'use_subset',
1109    3 => 'sheet_set_name',
1110    4 => 'sheet_subset_name',
1111    291 => 'select_dates_from_calendar',
1112    91 => 'num_dates',
1113    90 => 'dates.julian_day',
1114    90 => 'dates.time',
1115    292 => 'select_range_of_dates',
1116    93 => 'start_time',
1117    94 => 'end_time',
1118    95 => 'interval',
1119    91 => 'num_hours',
1120    290 => 'hours',
1121    74 => 'shade_plot_type',
1122    75 => 'numvports',
1123    76 => 'numrows',
1124    77 => 'numcols',
1125    40 => 'spacing',
1126    293 => 'lock_viewports',
1127    294 => 'label_viewports',
1128    330 => 'ownerhandle',
1129    340 => 'page_setup_wizard',
1130    341 => 'view',
1131    342 => 'visual_style',
1132    343 => 'text_style',
1133    ],
1134  ACAD_TABLE => [
1135    #SUBCLASS (AcDbBlockReference)
1136    10 => 'insertion_point',
1137    41 => 'scale.x',
1138    #0 => 'scale_flag',
1139    42 => 'scale.y',
1140    43 => 'scale.z',
1141    50 => 'rotation',
1142    210 => 'extrusion',
1143    66 => 'has_attribs',
1144    #0 => 'num_owned',
1145    90 => 'flag_for_table_value',
1146    11 => 'horiz_direction',
1147    92 => 'num_cols',
1148    91 => 'num_rows',
1149    142 => 'col_widths',
1150    141 => 'row_heights',
1151    #SUBCLASS (AcDbDataCell)
1152    171 => 'cells.type',
1153    172 => 'cells.flags',
1154    173 => 'cells.merged_value',
1155    174 => 'cells.autofit_flag',
1156    175 => 'cells.merged_width_flag',
1157    176 => 'cells.merged_height_flag',
1158    145 => 'cells.rotation_value',
1159    1 => 'cells.text_value',
1160    144 => 'cells.block_scale',
1161    #0 => 'cells.additional_data_flag',
1162    179 => 'cells.num_attr_defs',
1163    #0 => 'cells.attr_def_index',
1164    300 => 'cells.attr_def_text',
1165    #0 => 'cells.additional_data_flag',
1166    177 => 'cells.cell_flag_override',
1167    178 => 'cells.virtual_edge_flag',
1168    170 => 'cells.cell_alignment',
1169    283 => 'cells.background_fill_none',
1170    63 => 'cells.background_color',
1171    64 => 'cells.content_color',
1172    7 => 'cells.text_style',
1173    140 => 'cells.text_height',
1174    69 => 'cells.top_grid_color',
1175    279 => 'cells.top_grid_linewt',
1176    289 => 'cells.top_visibility',
1177    65 => 'cells.right_grid_color',
1178    275 => 'cells.right_grid_linewt',
1179    285 => 'cells.right_visibility',
1180    66 => 'cells.bottom_grid_color',
1181    276 => 'cells.bottom_grid_linewt',
1182    286 => 'cells.bottom_visibility',
1183    68 => 'cells.left_grid_color',
1184    278 => 'cells.left_grid_linewt',
1185    288 => 'cells.left_visibility',
1186    #0 => 'cells.unknown',
1187    #0 => 'has_table_overrides',
1188    93 => 'table_flag_override',
1189    280 => 'title_suppressed',
1190    281 => 'header_suppressed',
1191    70 => 'flow_direction',
1192    40 => 'horiz_cell_margin',
1193    41 => 'vert_cell_margin',
1194    64 => 'title_row_color',
1195    64 => 'header_row_color',
1196    64 => 'data_row_color',
1197    283 => 'title_row_fill_none',
1198    283 => 'header_row_fill_none',
1199    283 => 'data_row_fill_none',
1200    63 => 'title_row_fill_color',
1201    63 => 'header_row_fill_color',
1202    63 => 'data_row_fill_color',
1203    170 => 'title_row_alignment',
1204    170 => 'header_row_alignment',
1205    170 => 'data_row_alignment',
1206    7 => 'title_text_style',
1207    7 => 'header_text_style',
1208    7 => 'data_text_style',
1209    140 => 'title_row_height',
1210    140 => 'header_row_height',
1211    140 => 'data_row_height',
1212    #0 => 'has_border_color_overrides',
1213    94 => 'border_color_overrides_flag',
1214    64 => 'title_horiz_top_color',
1215    65 => 'title_horiz_ins_color',
1216    66 => 'title_horiz_bottom_color',
1217    63 => 'title_vert_left_color',
1218    68 => 'title_vert_ins_color',
1219    69 => 'title_vert_right_color',
1220    64 => 'header_horiz_top_color',
1221    65 => 'header_horiz_ins_color',
1222    66 => 'header_horiz_bottom_color',
1223    63 => 'header_vert_left_color',
1224    68 => 'header_vert_ins_color',
1225    69 => 'header_vert_right_color',
1226    64 => 'data_horiz_top_color',
1227    65 => 'data_horiz_ins_color',
1228    66 => 'data_horiz_bottom_color',
1229    63 => 'data_vert_left_color',
1230    68 => 'data_vert_ins_color',
1231    69 => 'data_vert_right_color',
1232    #0 => 'has_border_lineweight_overrides',
1233    95 => 'border_lineweight_overrides_flag',
1234    #0 => 'title_horiz_top_linewt',
1235    #0 => 'title_horiz_ins_linewt',
1236    #0 => 'title_horiz_bottom_linewt',
1237    #0 => 'title_vert_left_linewt',
1238    #0 => 'title_vert_ins_linewt',
1239    #0 => 'title_vert_right_linewt',
1240    #0 => 'header_horiz_top_linewt',
1241    #0 => 'header_horiz_ins_linewt',
1242    #0 => 'header_horiz_bottom_linewt',
1243    #0 => 'header_vert_left_linewt',
1244    #0 => 'header_vert_ins_linewt',
1245    #0 => 'header_vert_right_linewt',
1246    #0 => 'data_horiz_top_linewt',
1247    #0 => 'data_horiz_ins_linewt',
1248    #0 => 'data_horiz_bottom_linewt',
1249    #0 => 'data_vert_left_linewt',
1250    #0 => 'data_vert_ins_linewt',
1251    #0 => 'data_vert_right_linewt',
1252    #0 => 'has_border_visibility_overrides',
1253    96 => 'border_visibility_overrides_flag',
1254    0 => 'title_horiz_top_visibility',
1255    0 => 'title_horiz_ins_visibility',
1256    0 => 'title_horiz_bottom_visibility',
1257    0 => 'title_vert_left_visibility',
1258    0 => 'title_vert_ins_visibility',
1259    0 => 'title_vert_right_visibility',
1260    0 => 'header_horiz_top_visibility',
1261    0 => 'header_horiz_ins_visibility',
1262    0 => 'header_horiz_bottom_visibility',
1263    0 => 'header_vert_left_visibility',
1264    0 => 'header_vert_ins_visibility',
1265    0 => 'header_vert_right_visibility',
1266    0 => 'data_horiz_top_visibility',
1267    0 => 'data_horiz_ins_visibility',
1268    0 => 'data_horiz_bottom_visibility',
1269    0 => 'data_vert_left_visibility',
1270    0 => 'data_vert_ins_visibility',
1271    0 => 'data_vert_right_visibility',
1272    2 => 'block_header',
1273    #0 => 'first_attrib',
1274    #0 => 'last_attrib',
1275    #0 => 'seqend',
1276    342 => 'table_style_id',
1277    344 => 'cells.cell_handle',
1278    340 => 'cells.cell_handle',
1279    331 => 'cells.attr_def_id',
1280    7 => 'cells.text_style_override',
1281    7 => 'title_row_style_override',
1282    7 => 'header_row_style_override',
1283    7 => 'data_row_style_override',
1284    0 => 'unknown_bs',
1285    11 => 'hor_dir',
1286    #0 => 'has_break_data',
1287    #0 => 'break_flag',
1288    #0 => 'break_flow_direction',
1289    #0 => 'break_spacing',
1290    #0 => 'break_unknown1',
1291    #0 => 'break_unknown2',
1292    #0 => 'num_break_heights',
1293    #0 => 'break_heights.position',
1294    #0 => 'break_heights.height',
1295    #0 => 'break_heights.flag',
1296    #0 => 'num_break_rows',
1297    #0 => 'break_rows.position',
1298    #0 => 'break_rows.start',
1299    ],
1300  TABLECONTENT => [
1301    #100 => AcDbDataTableContent
1302    1 => 'ldata.name',
1303    300 => 'ldata.desc',
1304    90 => 'tdata.num_cols',
1305    300 => 'tdata.cols.name',
1306    91 => 'tdata.cols.custom_data',
1307    #Cell_Style_Fields(tdata.cols.cell_style);
1308    90 => 'tdata.num_rows',
1309    90 => 'row.num_cells',
1310    90 => 'cell.flag',
1311    300 => 'cell.tooltip',
1312    91 => 'cell.customdata',
1313    90 => 'cell.num_customdata_items',
1314    300 => 'cell.customdata_items.name',
1315    92 => 'cell.has_linked_data',
1316    340 => 'cell.data_link',
1317    93 => 'cell.num_rows',
1318    94 => 'cell.num_cols',
1319    96 => 'cell.unknown',
1320    95 => 'cell.num_cell_contents',
1321    90 => 'content.type',
1322    # Table_Value(content.value)
1323    340 => 'content.handle',
1324    91 => 'content.num_attrs',
1325    330 => 'attr.attdef',
1326    301 => 'attr.value',
1327    92 => 'attr.index',
1328    # Content_Format(content.content_format);
1329    90 => 'cell.style_id',
1330    91 => 'cell.has_geom_data',
1331    91 => 'cell.geom_data_flag',
1332    40 => 'cell.unknown_d40',
1333    41 => 'cell.unknown_d41',
1334    #0 => 'cell.has_cell_geom',
1335    330 => 'cell.tablegeometry',
1336    94 => 'cell.num_geometry',
1337    10 => 'geom.dist_top_left',
1338    11 => 'geom.dist_center',
1339    43 => 'geom.content_width',
1340    44 => 'geom.content_height',
1341    45 => 'geom.width',
1342    46 => 'geom.height',
1343    95 => 'geom.unknown',
1344    91 => 'row.custom_data',
1345    90 => 'row.num_customdata_items',
1346    300 => 'row.customdata_items.name',
1347    #Table_Value(row.customdata_items[rcount3].value);
1348    #Cell_Style_Fields(row.cell_style);
1349    90 => 'row.style_id',
1350    40 => 'row.height',
1351    #0 => 'tdata.num_field_refs',
1352    #0 => 'tdata.field_refs',
1353    90 => 'fdata.num_merged_cells',
1354    91 => 'merged.top_row',
1355    92 => 'merged.left_col',
1356    93 => 'merged.bottom_row',
1357    94 => 'merged.right_col',
1358    340 => 'table_style, 3',
1359    ],
1360  TABLEGEOMETRY => [
1361    90 => 'num_rows',
1362    91 => 'num_cols',
1363    92 => 'num_cells',
1364    93 => 'cells.geom_data_flag',
1365    40 => 'cells.width_w_gap',
1366    41 => 'cells.height_w_gap',
1367    330 => 'cells.tablegeometry',
1368    94 => 'cells.num_geometry',
1369    10 => 'cell.geometry.dist_top_left',
1370    11 => 'cell.geometry.dist_center',
1371    43 => 'cell.geometry.content_width',
1372    44 => 'cell.geometry.content_height',
1373    45 => 'cell.geometry.width',
1374    46 => 'cell.geometry.height',
1375    95 => 'cell.geometry.unknown',
1376    ],
1377  TABLESTYLE => [
1378    100 => 'AcDbTableStyle',
1379    3 => 'name',
1380    70 => 'flow_direction',
1381    71 => 'flags',
1382    40 => 'horiz_cell_margin',
1383    41 => 'vert_cell_margin',
1384    280 => 'title_suppressed',
1385    281 => 'header_suppressed',
1386    7 => 'rowstyles.text_style',
1387    140 => 'rowstyles.text_height',
1388    170 => 'rowstyles.text_alignment',
1389    62 => 'rowstyles.text_color',
1390    63 => 'rowstyles.fill_color',
1391    283 => 'rowstyles.has_bgcolor',
1392    274 => 'rowstyles.borders.linewt',
1393    284 => 'rowstyles.borders.visible',
1394    264 => 'rowstyles.borders.color',
1395    275 => 'rowstyles.borders.linewt',
1396    285 => 'rowstyles.borders.visible',
1397    265 => 'rowstyles.borders.color',
1398    276 => 'rowstyles.borders.linewt',
1399    286 => 'rowstyles.borders.visible',
1400    266 => 'rowstyles.borders.color',
1401    277 => 'rowstyles.borders.linewt',
1402    287 => 'rowstyles.borders.visible',
1403    267 => 'rowstyles.borders.color',
1404    278 => 'rowstyles.borders.linewt',
1405    288 => 'rowstyles.borders.visible',
1406    268 => 'rowstyles.borders.color',
1407    279 => 'rowstyles.borders.linewt',
1408    289 => 'rowstyles.borders.visible',
1409    269 => 'rowstyles.borders.color',
1410    90 => 'rowstyles.data_type',
1411    91 => 'rowstyles.unit_type',
1412    1 => 'rowstyles.format_string',
1413    ],
1414  ACDB_ALDIMOBJECTCONTEXTDATA_CLASS => [
1415    100 => 'AcDbObjectContextData',
1416    70 => 'class_version',
1417    290 => 'is_default',
1418    100 => 'AcDbAnnotScaleObjectContextData',
1419    340 => 'scale',
1420    100 => 'AcDbDimensionObjectContextData',
1421    2 => 'name',
1422    10 => 'def_pt',
1423    293 => 'b293',
1424    294 => 'b294',
1425    140 => 'bd140',
1426    298 => 'b298',
1427    291 => 'b291',
1428    70 => 'flag',
1429    292 => 'b292',
1430    71 => 'bs71',
1431    280 => 'b280',
1432    295 => 'b295',
1433    296 => 'b296',
1434    297 => 'b297',
1435    100 => 'AcDbAlignedDimensionObjectContextData',
1436    11 => '_11pt',
1437    ],
1438  ACDB_BLKREFOBJECTCONTEXTDATA_CLASS => [
1439    100 => 'AcDbObjectContextData',
1440    70 => 'class_version',
1441    290 => 'is_default',
1442    100 => 'AcDbAnnotScaleObjectContextData',
1443    340 => 'scale',
1444    ],
1445  ACDB_LEADEROBJECTCONTEXTDATA_CLASS => [
1446    100 => 'AcDbObjectContextData',
1447    70 => 'class_version',
1448    290 => 'is_default',
1449    100 => 'AcDbAnnotScaleObjectContextData',
1450    340 => 'scale',
1451    70 => 'num_points',
1452    10 => 'points[0]',
1453    10 => 'points[1]',
1454    10 => 'points[2]',
1455    11 => 'x_direction',
1456    290 => 'b290', # arrowhead_on?
1457    12 => 'inspt_offset',
1458    13 => 'endptproj',
1459    ],
1460  ACDB_MLEADEROBJECTCONTEXTDATA_CLASS => [
1461    100 => 'AcDbObjectContextData',
1462    70 => 'class_version',
1463    290 => 'defaultflag',
1464    100 => 'AcDbAnnotScaleObjectContextData',
1465    340 => 'scale',
1466    ],
1467  ACDB_TEXTOBJECTCONTEXTDATA_CLASS => [
1468    100 => 'AcDbObjectContextData',
1469    70 => 'class_version',
1470    290 => 'is_default',
1471    100 => 'AcDbAnnotScaleObjectContextData',
1472    340 => 'scale',
1473    70 => 'flag',
1474    50 => 'rotation',
1475    10 => 'ins_pt',
1476    11 => 'alignment_pt',
1477    ],
1478  ACDB_MTEXTATTRIBUTEOBJECTCONTEXTDATA_CLASS => [
1479    100 => 'AcDbObjectContextData',
1480    70 => 'class_version',
1481    290 => 'in_dwg',
1482    90 => 'is_default',
1483    100 => 'AcDbAnnotScaleObjectContextData',
1484    340 => 'scale',
1485  ],
1486  ACDB_MTEXTOBJECTCONTEXTDATA_CLASS => [
1487    100 => 'AcDbObjectContextData',
1488    70 => 'class_version',
1489    290 => 'is_default',
1490    100 => 'AcDbAnnotScaleObjectContextData',
1491    340 => 'scale',
1492    70 => 'flag',
1493    11 => 'ins_pt',
1494    10 => 'x_axis_dir',
1495    40 => 'text_height',
1496    41 => 'rect_width',
1497    42 => 'extents_width',
1498    43 => 'extents_height',
1499    71 => 'attachment',
1500    72 => 'drawing_dir',
1501    73 => 'linespace_style',
1502    44 => 'linespace_factor',
1503    45 => 'bd45',
1504    74 => 'bs74',
1505    46 => 'rect_height',
1506    ],
1507  # keep it for dxf_test
1508  MULTILEADER => [
1509    270 => 'class_version',
1510    70 => 'ctx.class_version',
1511    #0 => 'ctx.has_xdic_file',
1512    290 => 'ctx.is_default',
1513    340 => 'ctx.scale_handle',
1514    302 => 'LEADER{',
1515    #0 => 'ctx.num_leaders',
1516    290 => 'lev1.is_valid',
1517    291 => 'lev1.unknown',
1518    10 => 'lev1.connection',
1519    11 => 'lev1.direction',
1520    #0 => 'lev1.num_breaks',
1521    12 => 'lev1.breaks.start',
1522    13 => 'lev1.breaks.end',
1523    90 => 'lev1.index',
1524    40 => 'lev1.landing_distance',
1525    304 => 'LEADER_LINE{',
1526    #0 => 'lev2.num_points',
1527    10 => 'lev2.points',
1528    #0 => 'lev2.num_breaks',
1529    90 => 'lev2.segment_index',
1530    11 => 'lev2.breaks.start',
1531    12 => 'lev2.breaks.end',
1532    91 => 'lev2.index',
1533    170 => 'lev2.type',
1534    92 => 'lev2.color',
1535    340 => 'lev2.type_handle',
1536    171 => 'lev2.weight',
1537    40 => 'lev2.arrow_size',
1538    341 => 'lev2.arrow_handle',
1539    93 => 'lev2.flags',
1540    305 => '}',
1541    271 => 'lev1.attach_dir',
1542    303 => '}',
1543    40 => 'ctx.scale',
1544    10 => 'ctx.content_base',
1545    41 => 'ctx.text_height',
1546    140 => 'ctx.arrow_size',
1547    145 => 'ctx.landing_gap',
1548    174 => 'ctx.text_left',
1549    175 => 'ctx.text_right',
1550    176 => 'ctx.text_alignment',
1551    177 => 'ctx.attach_type',
1552    290 => 'ctx.has_content_txt',
1553    304 => 'ctx.txt.label',
1554    11 => 'ctx.txt.normal',
1555    340 => 'ctx.txt.style',
1556    12 => 'ctx.txt.location',
1557    13 => 'ctx.txt.direction',
1558    42 => 'ctx.txt.rotation',
1559    43 => 'ctx.txt.width',
1560    44 => 'ctx.txt.height',
1561    45 => 'ctx.txt.line_spacing_factor',
1562    170 => 'ctx.txt.line_spacing_style',
1563    90 => 'ctx.txt.color',
1564    171 => 'ctx.txt.alignment',
1565    172 => 'ctx.txt.flow',
1566    91 => 'ctx.txt.bg_color',
1567    141 => 'ctx.txt.bg_scale',
1568    92 => 'ctx.txt.bg_transparency',
1569    291 => 'ctx.txt.is_bg_fill',
1570    292 => 'ctx.txt.is_bg_mask_fill',
1571    173 => 'ctx.txt.col_type',
1572    293 => 'ctx.txt.is_height_auto',
1573    142 => 'ctx.txt.col_width',
1574    143 => 'ctx.txt.col_gutter',
1575    294 => 'ctx.txt.is_col_flow_reversed',
1576    #0 => 'ctx.txt.num_col_sizes',
1577    144 => 'ctx.txt.col_sizes',
1578    295 => 'ctx.txt.word_break',
1579    #0 => 'ctx.txt.unknown',
1580    296 => 'ctx.has_content_blk',
1581    341 => 'ctx.blk.block_table',
1582    14 => 'ctx.blk.normal',
1583    15 => 'ctx.blk.location',
1584    16 => 'ctx.blk.scale',
1585    46 => 'ctx.blk.rotation',
1586    93 => 'ctx.blk.color',
1587    47 => 'ctx.blk.transform',
1588    110 => 'ctx.base',
1589    111 => 'ctx.base_dir',
1590    112 => 'ctx.base_vert',
1591    297 => 'ctx.is_normal_reversed',
1592    273 => 'ctx.text_top',
1593    272 => 'ctx.text_bottom',
1594    301 => '}',
1595    340 => 'mleaderstyle',
1596    90 => 'flags',
1597    170 => 'type',
1598    91 => 'color',
1599    341 => 'ltype',
1600    171 => 'linewt',
1601    290 => 'landing',
1602    291 => 'dog_leg',
1603    41 => 'landing_dist',
1604    342 => 'arrow_head',
1605    42 => 'arrow_head_size',
1606    172 => 'style_content',
1607    343 => 'text_style',
1608    95 => 'text_left',
1609    95 => 'text_right',
1610    174 => 'text_angletype',
1611    175 => 'attach_type',
1612    92 => 'text_color',
1613    292 => 'text_frame',
1614    344 => 'block_style',
1615    93 => 'block_color',
1616    10 => 'block_scale',
1617    43 => 'block_rotation',
1618    176 => 'style_attachment',
1619    293 => 'is_annotative',
1620    #0 => 'num_arrowheads',
1621    94 => 'arrowheads.is_default',
1622    345 => 'arrowheads.arrowhead',
1623    #0 => 'num_blocklabels',
1624    330 => 'blocklabels.attdef',
1625    302 => 'blocklabels.label_text',
1626    177 => 'blocklabels.ui_index',
1627    44 => 'blocklabels.width',
1628    294 => 'neg_textdir',
1629    178 => 'ipe_alignment',
1630    179 => 'justification',
1631    45 => 'scale_factor',
1632    271 => 'attach_dir',
1633    273 => 'attach_top',
1634    272 => 'attach_bottom',
1635    295 => 'text_extended',
1636    ],
1637  POSITIONMARKER => [ # GEOPOSITIONMARKER
1638    100 => 'AcDbGeoPositionMarker',
1639    90 => 'class_version',
1640    10 => 'position',
1641    40 => 'radius',
1642    1 => 'notes',
1643    40 => 'landing_gap',
1644    290 => 'mtext_visible',
1645    280 => 'text_alignment',
1646    290 => 'enable_frame_text',
1647    101 => 'Embedded Object',
1648    ],
1649  EXTRUDEDSURFACE => [
1650    #100 => AcDbModelerGeometry,
1651    70 => 'modeler_format_version',
1652    #100 => AcDbSurface,
1653    71 => 'u_isolines',
1654    72 => 'v_isolines',
1655    #100 => AcDbExtrudedSurface
1656    90 => 'class_version',
1657    10 => 'sweep_vector',
1658    40 => 'sweep_transmatrix', #x16
1659    42 => 'draft_angle',
1660    43 => 'draft_start_distance',
1661    44 => 'draft_end_distance',
1662    45 => 'twist_angle',
1663    48 => 'scale_factor',
1664    49 => 'align_angle',
1665    46 => 'sweep_entity_transmatrix',
1666    47 => 'path_entity_transmatrix',
1667    290 => 'solid',
1668    290 => 'sweep_alignment_flags',
1669    292 => 'align_start',
1670    293 => 'bank',
1671    294 => 'base_point_set',
1672    295 => 'sweep_entity_transform_computed',
1673    296 => 'path_entity_transform_computed',
1674    11 => 'reference_vector_for_controlling_twist',
1675    ],
1676  LOFTEDSURFACE => [
1677    #100 => AcDbModelerGeometry,
1678    70 => 'modeler_format_version',
1679    #100 => AcDbSurface,
1680    71 => 'u_isolines',
1681    72 => 'v_isolines',
1682    #100 => AcDbLoftedSurface
1683    40 => 'loft_entity_transmatrix', #x16
1684    #90 => 'class_version',
1685    70 => 'plane_normal_lofting_type',
1686    41 => 'start_draft_angle',
1687    42 => 'end_draft_angle',
1688    43 => 'start_draft_magnitude',
1689    44 => 'end_draft_magnitude',
1690    290 => 'arc_length_parameterization',
1691    291 => 'no_twist',
1692    292 => 'align_direction',
1693    293 => 'simple_surfaces',
1694    294 => 'closed_surfaces',
1695    295 => 'solid',
1696    296 => 'ruled_surface',
1697    297 => 'virtual_guide',
1698    90  => 'num_cross_sections',
1699    310 => 'cross_sections',
1700    90  => 'num_guide_curves',
1701    310 => 'guide_curves',
1702    5   => 'path_curve',
1703    ],
1704  REVOLVEDSURFACE => [
1705    #100 => AcDbModelerGeometry,
1706    70 => 'modeler_format_version',
1707    #100 => AcDbSurface,
1708    71 => 'u_isolines',
1709    72 => 'v_isolines',
1710    #100 => AcDbRevolvedSurface
1711    90 => 'class_version',
1712    90 => 'id',
1713    90 => 'num_bindata',
1714    310 => 'bindata',
1715    10 => 'axis_point',
1716    11 => 'axis_vector',
1717    40 => 'revolve_angle',
1718    41 => 'start_angle',
1719    42 => 'revolved_entity_transmatrix',
1720    43 => 'draft_angle',
1721    44 => 'draft_start_distance',
1722    45 => 'draft_end_distance',
1723    46 => 'twist_angle',
1724    290 => 'solid',
1725    291 => 'close_to_axis',
1726    ],
1727  SWEPTSURFACE => [
1728    #100 => AcDbModelerGeometry,
1729    70 => 'modeler_format_version',
1730    #100 => AcDbSurface,
1731    71 => 'u_isolines',
1732    72 => 'v_isolines',
1733    #100 => AcDbSweptSurface
1734    90 => 'class_version',
1735    90 => 'swept_entity_id',
1736    90 => 'num_sweepdata',
1737    310 => 'sweepdata',
1738    90 => 'path_entity_id',
1739    90 => 'num_pathdata',
1740    310 => 'pathdata',
1741    40 => 'sweep_entity_transmatrix',
1742    41 => 'path_entity_transmatrix',
1743    42 => 'draft_angle',
1744    43 => 'draft_start_distance',
1745    44 => 'draft_end_distance',
1746    45 => 'twist_angle',
1747    48 => 'scale_factor',
1748    290 => 'solid',
1749    70 => 'sweep_alignment',
1750    292 => 'align_start',
1751    293 => 'bank',
1752    294 => 'base_point_set',
1753    295 => 'sweep_entity_transform_computed',
1754    296 => 'path_entity_transform_computed',
1755    11 => 'reference_vector_for_controlling_twist',
1756    ],
1757  NURBSURFACE => [
1758    100 => 'AcDbModelerGeometry',
1759    70 => 'modeler_format_version',
1760    100 => 'AcDbSurface',
1761    71 => 'u_isolines',
1762    72 => 'v_isolines',
1763    100 => 'AcDbNurbSurface',
1764    170 => 'short170',
1765    290 => 'cv_hull_display',
1766    10 => 'uvec1',
1767    11 => 'vvec1',
1768    12 => 'uvec2',
1769    13 => 'vvec2',
1770    ],
1771  PLANESURFACE => [
1772    #100 => AcDbModelerGeometry,
1773    70 => 'modeler_format_version',
1774    #100 => AcDbSurface,
1775    71 => 'u_isolines',
1776    72 => 'v_isolines',
1777    100 => 'AcDbPlaneSurface',
1778    90 => 'class_version',
1779    ],
1780  MESH => [
1781    90 => 'class_version',
1782    # 100 => AcDbSubDMesh
1783    71 => 'dlevel',
1784    72 => 'is_watertight',
1785    91 => 'num_subdiv_vertex',
1786    10 => 'subdiv_vertex',
1787    92 => 'num_vertex',
1788    10 => 'vertex',
1789    93 => 'num_faces',
1790    90 => 'faces',
1791    94 => 'num_edges',
1792    90 => 'edges.from',
1793    90 => 'edges.to',
1794    95 => 'num_crease',
1795    # 90?  BD crease
1796    ],
1797  GEOMAPIMAGE => [
1798    # 100 => AcDbGeomapImage
1799    90 => 'class_version',
1800    10 => 'pt0',
1801    13 => 'size',
1802    70 => 'display_props',
1803    280 => 'clipping',
1804    281 => 'brightness',
1805    282 => 'contrast',
1806    283 => 'fade',
1807    ],
1808  UNDERLAY => [
1809    10 => 'ins_pt',
1810    41 => 'scale',
1811    50 => 'angle',
1812    210 => 'extrusion',
1813    11 => 'clip_boundary->pt',
1814    280 => 'flag',
1815    281 => 'contrast',
1816    282 => 'fade',
1817    340 => 'definition_id',
1818    ],
1819  UNDERLAYDEFINITION => [
1820    1 => 'filename',
1821    2 => 'name',
1822    ],
1823  VISUALSTYLE => [
1824    2 => 'description',
1825    70 => 'style_type',
1826    177 => 'ext_lighting_model',
1827    291 => 'internal_only',
1828    71 => 'face_lighting_model',
1829    72 => 'face_lighting_quality',
1830    73 => 'face_color_mode',
1831    40 => 'face_opacity',
1832    41 => 'face_specular',
1833    90 => 'face_modifier',
1834    62 => 'color',
1835    420 => 'color.rgb',
1836    63 => 'face_mono_color',
1837    421 => 'face_mono_color.rgb',
1838    74 => 'edge_model',
1839    91 => 'edge_style',
1840    64 => 'edge_intersection_color',
1841    65 => 'edge_obscured_color',
1842    75  => 'edge_obscured_ltype',
1843    175 => 'edge_intersection_ltype',
1844    42 => 'edge_crease_angle',
1845    92 => 'edge_modifier',
1846    66 => 'edge_color',
1847    43 => 'edge_opacity',
1848    76 => 'edge_width',
1849    77 => 'edge_overhang',
1850    78 => 'edge_jitter',
1851    67 => 'edge_silhouette_color',
1852    79 => 'edge_silhouette_width',
1853    170 => 'edge_halo_gap',
1854    171 => 'edge_isolines',
1855    290 => 'edge_do_hide_precision',
1856    174 => 'edge_style_apply',
1857    93 => 'display_settings',
1858    44 => 'display_brightness',
1859    173 => 'display_shadow_type',
1860    45 => 'bd2007_45',
1861    ],
1862  HELIX => [
1863    90 => 'major_version',
1864    91 => 'maint_version',
1865    10 => 'axis_base_pt.x',
1866    20 => 'axis_base_pt.y',
1867    30 => 'axis_base_pt.z',
1868    11 => 'start_pt.x',
1869    21 => 'start_pt.y',
1870    31 => 'start_pt.z',
1871    12 => 'axis_vector.x',
1872    22 => 'axis_vector.y',
1873    32 => 'axis_vector.z',
1874    40 => 'radius',
1875    41 => 'turns',
1876    42 => 'height',
1877    290 => 'handedness',
1878    280 => 'constraint_type',
1879    ],
1880  ACDBDETAILVIEWSTYLE => [
1881    100 => 'AcDbModelDocViewStyle',
1882    70 => 'class_version',
1883    3 => 'name',
1884    290 => 'is_modified_for_recompute',
1885    100 => 'AcDbDetailViewStyle',
1886    70 => 'identifier_placement',
1887    90 => 'model_edge',
1888    280 => 'show_arrowheads',
1889    71 => 'connection_line_weight',
1890    62 => 'connection_line_color',
1891    62 => 'identifier_color',
1892    62 => 'arrow_symbol_color',
1893    62 => 'boundary_line_color',
1894    62 => 'viewlabel_text_color',
1895    40 => 'identifier_height',
1896    42 => 'identifier_offset',
1897    340 => 'identifier_style',
1898    340 => 'arrow_symbol',
1899    40 => 'arrow_symbol_size',
1900    71 => 'boundary_line_weight',
1901    340 => 'boundary_line_type',
1902    340 => 'viewlabel_text_style',
1903    340 => 'connection_line_type',
1904    40 => 'viewlabel_text_height',
1905    300 => 'viewlabel_field',
1906    42 => 'viewlabel_offset',
1907    70 => 'viewlabel_attachment',
1908    72 => 'viewlabel_alignment',
1909    90 => 'viewlabel_pattern',
1910    280 => 'show_viewlabel',
1911    71 => 'borderline_weight',
1912    62 => 'borderline_color',
1913    340 => 'borderline_type',
1914    ],
1915  ACDBSECTIONVIEWSTYLE => [
1916    100 => 'AcDbModelDocViewStyle',
1917    70 => 'class_version',
1918    3 => 'name',
1919    290 => 'is_modified_for_recompute',
1920    300 => 'description',
1921    90 => 'identifier_exclude_characters',
1922    100 => 'AcDbSectionViewStyle',
1923    62 => 'identifier_color',
1924    40 => 'identifier_height',
1925    62 => 'plane_line_color',
1926    42 => 'identifier_offset',
1927    300 => 'viewlabel_text',
1928    40 => 'identifier_position',
1929    90 => 'viewlabel_pattern',
1930    62 => 'arrow_symbol_color',
1931    90 => 'hatch_pattern',
1932    62 => 'bend_line_color',
1933    40 => 'arrow_symbol_size',
1934    40 => 'arrow_position',
1935    62 => 'viewlabel_text_color',
1936    40 => 'bend_line_length',
1937    62 => 'hatch_color',
1938    62 => 'hatch_bg_color',
1939    340 => 'identifier_style',
1940    340 => 'arrow_start_symbol',
1941    340 => 'arrow_end_symbol',
1942    40 => 'arrow_symbol_extension_length',
1943    71 => 'plane_line_weight',
1944    340 => 'plane_line_type',
1945    340 => 'bend_line_type',
1946    340 => 'viewlabel_text_style',
1947    0 => 'bend_line_weight',
1948    0 => 'end_line_length',
1949    40 => 'viewlabel_text_height',
1950    300 => 'viewlabel_field',
1951    42 => 'viewlabel_offset',
1952    70 => 'viewlabel_attachment',
1953    72 => 'viewlabel_alignment',
1954    0 => 'hatch_scale',
1955    0 => 'hatch_angles',
1956    0 => 'hatch_transparency',
1957    290 => 'is_continuous_labeling',
1958    290 => 'show_arrowheads',
1959    290 => 'show_viewlabel',
1960    290 => 'show_all_plane_lines',
1961    290 => 'show_all_bend_indentifiers',
1962    290 => 'show_end_and_bend_lines',
1963    ],
1964  SECTIONOBJECT => [
1965    # AcDbSection
1966    90 => 'state',
1967    91 => 'flags',
1968    1 => 'name',
1969    10 => 'vert_dir',
1970    40 => 'top_height',
1971    41 => 'bottom_height',
1972    70 => 'indicator_alpha',
1973    62 => 'indicator_color',
1974    92 => 'num_verts',
1975    11 => 'verts.x',
1976    21 => 'verts.y',
1977    31 => 'verts.z',
1978    93 => 'num_blverts',
1979    12 => 'blverts.x',
1980    22 => 'blverts.y',
1981    32 => 'blverts.z',
1982    360 => 'section_settings',
1983  ],
1984  LAYERFILTER => [
1985    2 => 'name',
1986    3 => 'description',
1987    ],
1988  LAYOUTPRINTCONFIG => [
1989    93 => 'flag',
1990    ],
1991  ATEXT => [
1992      1 => 'text_value',
1993      2 => 't2',
1994      3 => 't3',
1995      7 => 'style',
1996      10 => 'center',
1997      40 => 'radius',
1998      41 => 'xscale',
1999      42 => 'text_size',
2000      43 => 'char_spacing',
2001      44 => 'offset_from_arc',
2002      45 => 'right_offset',
2003      46 => 'left_offset',
2004      50 => 'start_angle',
2005      51 => 'end_angle',
2006      70 => 'is_reverse',
2007      71 => 'text_direction',
2008      72 => 'alignment',
2009      73 => 'text_position',
2010      74 => 'font_19',
2011      75 => 'bs2',
2012      76 => 'is_underlined',
2013      77 => 'bs1',
2014      78 => 'font',
2015      79 => 'is_shx',
2016      90 => 'color.index',
2017      210 => 'extrusion',
2018      280 => 'wizard_flag',
2019      330 => 'arc_handle',
2020    ],
2021  RTEXT => [
2022      10 => 'pt',
2023      210 => 'extrusion',
2024      50 => 'rotation',
2025      50 => 'height',
2026      7 => 'style',
2027      70 => 'flags',
2028      1 => 'text_value',
2029    ],
2030  ACDB_BLOCKREPRESENTATION_DATA => [
2031    70 => 'flag',
2032    340 => 'block',
2033    ],
2034  ACMECOMMANDHISTORY => [
2035    ],
2036  ACMESCOPE => [
2037    ],
2038  ACMESTATEMGR => [
2039    ],
2040};
2041
2042my $firstline = "/* ex: set ro ft=c: -*- mode: c; buffer-read-only: t -*- */\n"
2043              . "/* generated by make regen-unknown, do not modify */\n\n";
2044print $f0 $firstline;
2045print $f0 "// name, dxf, handle, bytes, is_entity, num_bits, commonsize, hdloff, ".
2046          "strsize, hdlsize, bitsize, fieldptr\n";
2047print $f1a $firstline;
2048print $f2 $firstline;
2049my ($f, $f1, $foundobj, $prevdxf, $prevobj, $foundOBJECTS);
2050my $seekfirstobj = 0;
2051
2052LINE:
2053while (<>) {
2054  my @F = split(' ');
2055
2056  my $obj = substr($F[1],1,-2); # "MATERIAL",
2057  my $log = substr($F[2],1,-2); # "xxx.log",
2058  my $dxf = $F[5];
2059  my $fdxf = substr($dxf, 1, -2);
2060  if ($dxf eq 'NULL,') {
2061    if (-f "$dir/../$fdxf") {
2062      warn "$dxf magically re-appeared\n";
2063    } else {
2064      if (!exists $skip{$log}) {
2065        warn "skip no dxf for $log\n";
2066        $skip{$log}++;
2067      }
2068      next LINE; # -n
2069    }
2070  }
2071  if ($dxf !~ /\.dxf",/) {
2072    warn "skip wrong dxf $dxf in $_\n";
2073    next LINE; # -n
2074  }
2075  if (!-f $fdxf) {
2076    if (!-f "../$fdxf") {
2077      $fdxf = "$dir/../$dxf";
2078      if (!-f "$fdxf") {
2079        warn "$fdxf not found";
2080      }
2081    } else {
2082      $fdxf = "../$fdxf";
2083    }
2084  }
2085  #next LINE if $F[0] =~ m|//{|; # skip duplicates
2086  $dxf   = substr($dxf, 1, -2);
2087  my $hdl   = "".substr($F[3],2,-1); # 0xXXX,
2088  my $hexhdl = hex($hdl);
2089  my $bytes = substr($F[4],1,-2);
2090  my $is_entity  = substr($F[6],0,-1);
2091  my $num_bits   = substr($F[7],0,-1);
2092  my $commonsize = substr($F[8],0,-1);
2093  my $hdloff     = substr($F[9],0,-1);
2094  my $strsize    = substr($F[10],0,-1);
2095  my $hdlsize    = substr($F[11],0,-1);
2096  my $bitsize    = substr($F[12],0,-1);
2097  if ($skip{"$obj-$hdl-$num_bits"}) { # skip empty unknowns
2098    warn "skip empty $obj-$hdl-$num_bits $dxf\n";
2099    next LINE;
2100  }
2101  # picat runs out of memory there
2102  if ($num_bits > 50000) {
2103    warn "skip overlarge $obj-$hdl-$num_bits $dxf\n";
2104    next LINE;
2105  }
2106
2107  my $unknown = pack ("H*", $bytes);
2108  $unknown = join("", map { sprintf("\\%03o", $_) } unpack("C*", $unknown));
2109  $unknown = substr($unknown, 0, $num_bits);
2110
2111  if (exists $dupl{"$obj-$unknown"}) {
2112    warn "skip duplicate $obj-$hdl-$num_bits $dxf\n";
2113    next LINE;
2114  } else {
2115    $dupl{"$obj-$unknown"}++;
2116  }
2117  #warn "$dxf: $obj HANDLE($hdl)\n";
2118  # 9080187 5160203 9080187 201AA 51E0204 90C0202 35200204 20640A8 2D22020C 90A01D1
2119  #if ($hdl =~ /^([0-9A-F]){1,4}0([0-9A-F]+)$/) {
2120  #  $hdl = $2;
2121  #  #warn "=> try HANDLE($hdl)\n";
2122  #}
2123
2124  # linear search in dxf file for this obj-handle
2125
2126  my ($foundhdl, @FIELD, $in_entity);
2127  my ($react, $xdict, $seen100, @avail, @availcopy);
2128
2129  if (!$f or $fdxf ne $prevdxf) {
2130    close $f if $f;
2131    $foundOBJECTS = $seekfirstobj ? 1 : 0;
2132    $seekfirstobj = 0;
2133    open $f, "$fdxf" or next LINE;
2134    $prevdxf = $fdxf;
2135  }
2136  if ($obj ne $prevobj) {
2137    # FIXME: Only needed when ENTITIES changes to OBJECTS. Within a SECTION
2138    # the handles strictly rise.
2139    seek $f, $seekfirstobj, 0;
2140    # also enforce a new dxffile, as the prev obj might have been be after the current one
2141    # and we cannot walk back.
2142    $prevobj = $obj;
2143    print $f1a "#include \"alldxf_$obj.inc\"\n";
2144    close $f1 if $f1;
2145    # objects ARE sorted
2146    open $f1, ">", "$dir/alldxf_$obj.inc" or next LINE;
2147    print $f1 $firstline;
2148    print $f1 "// code, value, bits, pre_bits, num_bits, type, name, num, pos[]\n";
2149
2150#  } else {
2151#    open $f1, ">>", "$dir/alldxf_$obj.inc" or next LINE;
2152  }
2153
2154  if ($obj =~ /^(?:PDF|DWF|DGN)UNDERLAY/) {
2155    @avail = @{$known->{UNDERLAY}};
2156  }
2157  elsif ($obj =~ /^(?:PDF|DWF|DGN)DEFINITION/) {
2158    @avail = @{$known->{UNDERLAYDEFINITION}};
2159  }
2160  @avail = @{$known->{$obj}} if exists $known->{$obj};
2161  @availcopy = @avail;
2162
2163  # cannot walk back
2164  while (my $code = <$f>) {
2165    $code =~ s/\cM\cJ//;
2166    my $v = <$f>;
2167    my $name = "";
2168    $v =~ s/\cM\cJ//;
2169    $v =~ s/^\s*//;
2170    $foundOBJECTS = ($code == '  2' && $v =~ /^(ENTITIES|OBJECTS)$/) ? 1 : 0;
2171    if ($code eq '  0') { # next obj
2172      $foundobj = $v eq $obj;
2173      if ($foundhdl) {
2174        $foundhdl = 0;
2175        # search FIELD for duplicates
2176        my %sorted = ();
2177        for (@FIELD) {
2178          my $t = dxf_type($_->[0]);
2179          $sorted{"$t:$_->[1]"}++;
2180        }
2181        for (@FIELD) {
2182          my $t = dxf_type($_->[0]);
2183          my $count = $sorted{"$t:$_->[1]"};
2184          emit_field($f1, $obj, $count, @$_);
2185        }
2186        @FIELD = ();
2187        print $f1 "    { 0, NULL, NULL, 0, BITS_UNKNOWN, NULL, 0, {-1,-1,-1,-1,-1}}\n};\n";
2188        last;
2189      }
2190    }
2191    elsif ($code eq '  5') {
2192      $seekfirstobj = tell $f if !$seekfirstobj && $foundOBJECTS;
2193      if ($foundobj) {
2194        $name = "handle";
2195        $foundhdl = $v eq $hdl;
2196        if ($foundhdl) {
2197          warn "found $obj $hdl in $dxf\n";
2198          print $f0  "  { \"$obj\", \"$dxf\", 0x$hdl, /* $i */\n";
2199          printf $f0  "    \"%s\", %d, %d, %d, %d, %d, %d, %d, NULL },\n",
2200            $unknown, $is_entity, $num_bits, $commonsize, $hdloff, $strsize,
2201            $hdlsize, $bitsize;
2202
2203          print $f1 "/* $obj $hdl in $dxf */\n";
2204          print $f1 "static struct _unknown_field unknown_dxf_${obj}_${i}\[\] = {\n";
2205          print $f2 "unknown_dxf\[$i\].fields = unknown_dxf_${obj}_${i};\n";
2206          @FIELD = ();
2207          @avail = @availcopy;
2208          $i++;
2209        }
2210      }
2211      elsif ($foundOBJECTS && hex($v) > $hexhdl) {
2212        warn "not found $obj $hdl in $dxf\n";
2213        last;
2214      }
2215    }
2216    if ($foundhdl) {
2217      my $x;
2218      $code =~ s/\s//g;
2219      # fill-in the field name, from heuristics and some already known classes
2220      if ($code == 5) {
2221        $name = "handle";
2222      } elsif ($code == 330) {
2223        if ($react) {
2224          $react--;
2225          $name = "reactors[$react]";
2226          $react++; $react++;
2227        } elsif (!$seen100) {
2228          $name = "ownerhandle";
2229        }
2230      } elsif ($code == 360 and $xdict) {
2231        $name = "xdicobjhandle";
2232      } elsif ($code == 100) {
2233        if ($v eq 'AcDbEntity') { $in_entity++ }
2234        else { $in_entity = 0 }
2235        $seen100++;
2236        if ($v eq 'AcDbModelerGeometry') {
2237          push @FIELD, [$code, $v, $name];
2238          push @FIELD, [1, "ACIS BinaryFile", "bin_sat_data"];
2239          next;
2240        }
2241      } elsif ($code == 102) {
2242        if ($v eq '{ACAD_REACTORS') {
2243          $react = 1;
2244        } elsif ($v eq '{ACAD_XDICTIONARY') {
2245          $xdict = 1;
2246        } elsif ($v eq '}') {
2247          $xdict = 0; $react = 0;
2248        }
2249      } elsif ($code == 430 && $obj eq 'DBCOLOR' &&
2250               $v =~ /DIC COLOR GUIDE\(R\)\$DIC (\d+)/)
2251      {
2252        push @FIELD, [430, "DIC $1", "name"];
2253        $v = "DIC COLOR GUIDE(R)";
2254        $name = "catalog";
2255      } elsif ($x = find_name($code, $obj, \@avail, \@FIELD)) {
2256        $name = $x;
2257        @avail = @availcopy unless @avail; # if exhausted via loop, restart
2258      } elsif ($code == 8) {
2259        $name = "layer";
2260      } elsif ($code >= 60 && $code <= 65) {
2261        $name = "color";
2262      } elsif ($code == 7) {
2263        $name = "ltype";
2264      }
2265      if ($in_entity && is_common_entity($code, $v, $name)) {
2266        push @FIELD, [$code, $v, $name, 1];
2267      } elsif ($code >= 1000) { # no EED
2268        push @FIELD, [$code, $v, $name, 1];
2269      } elsif ($code == 5 && !$seen100) {
2270        push @FIELD, [$code, $v, $name, 1];
2271      } else {
2272        push @FIELD, [$code, $v, $name];
2273      }
2274    }
2275  }
2276  # stay in there. only close on new obj or changed dxf
2277  #close $f;
2278}
2279close $f; close $f0; close $f1; close $f1a; close $f2;
2280
2281sub is_common_entity {
2282  my ($code, $v, $name) = @_;
2283  return 1 if $code == 8 or $code == 6 or $code == 7 or $code == 62 or
2284              $code == 92 or $code == 160 or
2285              $code == 310 or $code == 420 or $code == 440;
2286}
2287
2288sub dxf_type {
2289  my $code = shift;
2290  if ($code < 5) {
2291    return STR;
2292  } elsif ($code == 5) {
2293    return HDL;
2294  } elsif ($code < 10) {
2295    return STR;
2296  } elsif ($code < 60) {
2297    return DBL;
2298  } elsif ($code < 100) {
2299    return NUM;
2300  } elsif ($code == 102) {
2301    return STR;
2302  } elsif ($code == 105) {
2303    return HDL;
2304  } elsif ($code < 110) {
2305    return STR;
2306  } elsif ($code < 160) {
2307    return DBL;
2308  } elsif ($code < 210) {
2309    return NUM;
2310  } elsif ($code < 240) {
2311    return DBL;
2312  } elsif ($code < 289) {
2313    return NUM;
2314  } elsif ($code < 299) {
2315    return B;
2316  } elsif ($code < 320) {
2317    return STR;
2318  } elsif ($code < 370) {
2319    return HDL;
2320  } elsif ($code < 390) {
2321    return NUM;
2322  } elsif ($code < 400) {
2323    return HDL;
2324  } elsif ($code < 410) {
2325    return NUM;
2326  } elsif ($code < 420) {
2327    return STR;
2328  } elsif ($code < 430) {
2329    return NUM;
2330  } elsif ($code < 440) {
2331    return STR;
2332  } elsif ($code < 460) {
2333    return NUM;
2334  } elsif ($code < 470) {
2335    return DBL;
2336  } elsif ($code < 480) {
2337    return STR;
2338  } elsif ($code < 481) {
2339    return HDL;
2340  } elsif ($code < 1010) { # eed fields:
2341    return STR;
2342  } elsif ($code < 1060) {
2343    return DBL;
2344  } elsif ($code <= 1071) {
2345    return NUM;
2346  }
2347  warn "unknown DXF code $code\n";
2348  return UNKNOWN;
2349}
2350
2351sub find_name {
2352  my ($code, $obj, $avail, $fieldsref) = @_;
2353  my @f = @$avail;
2354  return undef if !@f;
2355  my $len = scalar @f;
2356  for my $j (0..(2*$len)-1) {
2357    my $c = $f[$j];
2358    if ($c == $code) {
2359      # delete ($c,$n) from $avail
2360      splice @$avail, $j, 2;
2361      my $n = $f[$j+1];
2362      return $n;
2363    }
2364  }
2365  return undef;
2366}
2367
2368sub emit_field {
2369  my ($f, $obj, $count, $code, $v, $name, $hidden) = @_;
2370  #warn "$code: $v\n";
2371  #return if $code == 100;
2372  $v =~ s/\\/\\\\/g;
2373  $v =~ s/"/\\"/g;
2374  # encode $v via cquote
2375  my $vq = B::cstring ($v);
2376  $count = 0 unless $count;
2377  # code, value, bytes, bitsize, type, name, num, pos[]
2378  if ($hidden) {
2379    print $f "  //";
2380  } else {
2381    print $f "    ";
2382  }
2383  my $bits = 0;
2384  my $type = "BITS_UNKNOWN";
2385  # need stronger hints for some fields
2386  if ($obj eq 'DIMASSOC') {
2387    if ($name =~ /(osnap_type|trans_space_flag)$/) {
2388      $type = "BITS_RC";
2389      $bits = 8;
2390    }
2391    elsif ($name =~ /has_lastpt_ref/) { # weird dxf code
2392      $type = "BITS_B";
2393      $bits = 1;
2394    }
2395    elsif ($name =~ /\.osnap_/) {
2396      $type = "BITS_BD";
2397    }
2398  }
2399  print $f "{ $code, $vq, NULL, $bits, $type, \"$name\", $count, {-1,-1,-1,-1,-1} },\n";
2400}
2401