1 /*****************************************************************************/
2 /* LibreDWG - free implementation of the DWG file format */
3 /* */
4 /* Copyright (C) 2020 Free Software Foundation, Inc. */
5 /* */
6 /* This library is free software, licensed under the terms of the GNU */
7 /* General Public License as published by the Free Software Foundation, */
8 /* either version 3 of the License, or (at your option) any later version. */
9 /* You should have received a copy of the GNU General Public License */
10 /* along with this program. If not, see <http://www.gnu.org/licenses/>. */
11 /*****************************************************************************/
12
13 /*
14 * classes.c: map type to name. classify into unstable, debugging and unhandled.
15 * written by Reini Urban
16 */
17
18 #include "config.h"
19 #include <string.h>
20 #include <stdlib.h>
21 #include <assert.h>
22 #include "common.h"
23 #include "classes.h"
24 #include "dynapi.h"
25
26 // Now with direct O[1] access by type.
27 static const char *const _dwg_type_names_fixed[] =
28 {
29 "UNUSED", /* DWG_TYPE_UNUSED 0x00 */
30 "TEXT", /* DWG_TYPE_TEXT 0x01 */
31 "ATTRIB", /* DWG_TYPE_ATTRIB 0x02 */
32 "ATTDEF", /* DWG_TYPE_ATTDEF 0x03 */
33 "BLOCK", /* DWG_TYPE_BLOCK 0x04 */
34 "ENDBLK", /* DWG_TYPE_ENDBLK 0x05 */
35 "SEQEND", /* DWG_TYPE_SEQEND 0x06 */
36 "INSERT", /* DWG_TYPE_INSERT 0x07 */
37 "MINSERT", /* DWG_TYPE_MINSERT 0x08 */
38 NULL, /* DWG_TYPE_<UNKNOWN> = 0x09, */
39 "VERTEX_2D", /* DWG_TYPE_VERTEX_2D 0x0a */
40 "VERTEX_3D", /* DWG_TYPE_VERTEX_3D 0x0b */
41 "VERTEX_MESH", /* DWG_TYPE_VERTEX_MESH 0x0c */
42 "VERTEX_PFACE", /* DWG_TYPE_VERTEX_PFACE 0x0d */
43 "VERTEX_PFACE_FACE",/* DWG_TYPE_VERTEX_PFACE_FACE 0x0e */
44 "POLYLINE_2D", /* DWG_TYPE_POLYLINE_2D 0x0f */
45 "POLYLINE_3D", /* DWG_TYPE_POLYLINE_3D 0x10 */
46 "ARC", /* DWG_TYPE_ARC 0x11 */
47 "CIRCLE", /* DWG_TYPE_CIRCLE 0x12 */
48 "LINE", /* DWG_TYPE_LINE 0x13 */
49 "DIMENSION_ORDINATE",/* DWG_TYPE_DIMENSION_ORDINATE 0x14 */
50 "DIMENSION_LINEAR", /* DWG_TYPE_DIMENSION_LINEAR 0x15 */
51 "DIMENSION_ALIGNED",/* DWG_TYPE_DIMENSION_ALIGNED 0x16 */
52 "DIMENSION_ANG3PT", /* DWG_TYPE_DIMENSION_ANG3PT 0x17 */
53 "DIMENSION_ANG2LN", /* DWG_TYPE_DIMENSION_ANG2LN 0x18 */
54 "DIMENSION_RADIUS", /* DWG_TYPE_DIMENSION_RADIUS 0x19 */
55 "DIMENSION_DIAMETER",/* DWG_TYPE_DIMENSION_DIAMETER 0x1A */
56 "POINT", /* DWG_TYPE_POINT 0x1b */
57 "3DFACE", /* DWG_TYPE__3DFACE 0x1c */
58 "POLYLINE_PFACE", /* DWG_TYPE_POLYLINE_PFACE 0x1d */
59 "POLYLINE_MESH", /* DWG_TYPE_POLYLINE_MESH 0x1e */
60 "SOLID", /* DWG_TYPE_SOLID 0x1f */
61 "TRACE", /* DWG_TYPE_TRACE 0x20 */
62 "SHAPE", /* DWG_TYPE_SHAPE 0x21 */
63 "VIEWPORT", /* DWG_TYPE_VIEWPORT 0x22 */
64 "ELLIPSE", /* DWG_TYPE_ELLIPSE 0x23 */
65 "SPLINE", /* DWG_TYPE_SPLINE 0x24 */
66 "REGION", /* DWG_TYPE_REGION 0x25 */
67 "3DSOLID", /* DWG_TYPE__3DSOLID 0x26 */
68 "BODY", /* DWG_TYPE_BODY 0x27 */
69 "RAY", /* DWG_TYPE_RAY 0x28 */
70 "XLINE", /* DWG_TYPE_XLINE 0x29 */
71 "DICTIONARY", /* DWG_TYPE_DICTIONARY 0x2a */
72 "OLEFRAME", /* DWG_TYPE_OLEFRAME = 0x2b */
73 "MTEXT", /* DWG_TYPE_MTEXT = 0x2c */
74 "LEADER", /* DWG_TYPE_LEADER = 0x2d */
75 "TOLERANCE", /* DWG_TYPE_TOLERANCE = 0x2e */
76 "MLINE", /* DWG_TYPE_MLINE 0x2f */
77 "BLOCK_CONTROL", /* DWG_TYPE_BLOCK_CONTROL 0x30 */
78 "BLOCK_HEADER", /* DWG_TYPE_BLOCK_HEADER 0x31 */
79 "LAYER_CONTROL", /* DWG_TYPE_LAYER_CONTROL 0x32 */
80 "LAYER", /* DWG_TYPE_LAYER 0x33 */
81 "STYLE_CONTROL", /* DWG_TYPE_STYLE_CONTROL 0x34 */
82 "STYLE", /* DWG_TYPE_STYLE 0x35 */
83 NULL, /* DWG_TYPE_<UNKNOWN> = 0x36, */
84 NULL, /* DWG_TYPE_<UNKNOWN> = 0x37, */
85 "LTYPE_CONTROL", /* DWG_TYPE_LTYPE_CONTROL 0x38 */
86 "LTYPE", /* DWG_TYPE_LTYPE 0x39 */
87 NULL, /* DWG_TYPE_<UNKNOWN> = 0x3a, */
88 NULL, /* DWG_TYPE_<UNKNOWN> = 0x3b, */
89 "VIEW_CONTROL", /* DWG_TYPE_VIEW_CONTROL 0x3c */
90 "VIEW", /* DWG_TYPE_VIEW 0x3d */
91 "UCS_CONTROL", /* DWG_TYPE_UCS_CONTROL 0x3e */
92 "UCS", /* DWG_TYPE_UCS 0x3f */
93 "VPORT_CONTROL", /* DWG_TYPE_VPORT_CONTROL 0x40 */
94 "VPORT", /* DWG_TYPE_VPORT 0x41 */
95 "APPID_CONTROL", /* DWG_TYPE_APPID_CONTROL 0x42 */
96 "APPID", /* DWG_TYPE_APPID 0x43 */
97 "DIMSTYLE_CONTROL", /* DWG_TYPE_DIMSTYLE_CONTROL 0x44 */
98 "DIMSTYLE", /* DWG_TYPE_DIMSTYLE 0x45 */
99 "VX_CONTROL", /* DWG_TYPE_VX_CONTROL 0x46 */
100 "VX_TABLE_RECORD", /* DWG_TYPE_VX_TABLE_RECORD 0x47 */
101 "GROUP", /* DWG_TYPE_GROUP 0x48 */
102 "MLINESTYLE", /* DWG_TYPE_MLINESTYLE 0x49 */
103 "OLE2FRAME", /* DWG_TYPE_OLE2FRAME 0x4a */
104 "DUMMY", /* DWG_TYPE_DUMMY 0x4b */
105 "LONG_TRANSACTION", /* DWG_TYPE_LONG_TRANSACTION 0x4c */
106 "LWPOLYLINE", /* DWG_TYPE_LWPOLYLINE 0x4d */
107 "HATCH", /* DWG_TYPE_HATCH 0x4e */
108 "XRECORD", /* DWG_TYPE_XRECORD 0x4f */
109 "PLACEHOLDER", /* DWG_TYPE_PLACEHOLDER 0x50 */
110 "VBA_PROJECT", /* DWG_TYPE_VBA_PROJECT 0x51 */
111 "LAYOUT", /* DWG_TYPE_LAYOUT 0x52 */
112 };
113
114 // "PROXY_ENTITY" 0x1f2 498
115 // "PROXY_OBJECT" 0x1f3 499
116
117 // Auto-generated array of names starting at index 500, with direct access by fixedtype.
118 static const char *const _dwg_type_names_variable[] =
119 {
120 /* Start auto-generated variable. Do not modify */
121 "ACDSRECORD", /* 500 */
122 "ACDSSCHEMA", /* 501 */
123 "ACMECOMMANDHISTORY", /* 502 */
124 "ACMESCOPE", /* 503 */
125 "ACMESTATEMGR", /* 504 */
126 "ACSH_BOOLEAN_CLASS", /* 505 */
127 "ACSH_BOX_CLASS", /* 506 */
128 "ACSH_BREP_CLASS", /* 507 */
129 "ACSH_CHAMFER_CLASS", /* 508 */
130 "ACSH_CONE_CLASS", /* 509 */
131 "ACSH_CYLINDER_CLASS", /* 510 */
132 "ACSH_EXTRUSION_CLASS", /* 511 */
133 "ACSH_FILLET_CLASS", /* 512 */
134 "ACSH_HISTORY_CLASS", /* 513 */
135 "ACSH_LOFT_CLASS", /* 514 */
136 "ACSH_PYRAMID_CLASS", /* 515 */
137 "ACSH_REVOLVE_CLASS", /* 516 */
138 "ACSH_SPHERE_CLASS", /* 517 */
139 "ACSH_SWEEP_CLASS", /* 518 */
140 "ACSH_TORUS_CLASS", /* 519 */
141 "ACSH_WEDGE_CLASS", /* 520 */
142 "ALDIMOBJECTCONTEXTDATA", /* 521 */
143 "ALIGNMENTPARAMETERENTITY", /* 522 */
144 "ANGDIMOBJECTCONTEXTDATA", /* 523 */
145 "ANNOTSCALEOBJECTCONTEXTDATA", /* 524 */
146 "ARCALIGNEDTEXT", /* 525 */
147 "ARC_DIMENSION", /* 526 */
148 "ASSOC2DCONSTRAINTGROUP", /* 527 */
149 "ASSOC3POINTANGULARDIMACTIONBODY", /* 528 */
150 "ASSOCACTION", /* 529 */
151 "ASSOCACTIONPARAM", /* 530 */
152 "ASSOCALIGNEDDIMACTIONBODY", /* 531 */
153 "ASSOCARRAYACTIONBODY", /* 532 */
154 "ASSOCARRAYMODIFYACTIONBODY", /* 533 */
155 "ASSOCARRAYMODIFYPARAMETERS", /* 534 */
156 "ASSOCARRAYPATHPARAMETERS", /* 535 */
157 "ASSOCARRAYPOLARPARAMETERS", /* 536 */
158 "ASSOCARRAYRECTANGULARPARAMETERS", /* 537 */
159 "ASSOCASMBODYACTIONPARAM", /* 538 */
160 "ASSOCBLENDSURFACEACTIONBODY", /* 539 */
161 "ASSOCCOMPOUNDACTIONPARAM", /* 540 */
162 "ASSOCDEPENDENCY", /* 541 */
163 "ASSOCDIMDEPENDENCYBODY", /* 542 */
164 "ASSOCEDGEACTIONPARAM", /* 543 */
165 "ASSOCEDGECHAMFERACTIONBODY", /* 544 */
166 "ASSOCEDGEFILLETACTIONBODY", /* 545 */
167 "ASSOCEXTENDSURFACEACTIONBODY", /* 546 */
168 "ASSOCEXTRUDEDSURFACEACTIONBODY", /* 547 */
169 "ASSOCFACEACTIONPARAM", /* 548 */
170 "ASSOCFILLETSURFACEACTIONBODY", /* 549 */
171 "ASSOCGEOMDEPENDENCY", /* 550 */
172 "ASSOCLOFTEDSURFACEACTIONBODY", /* 551 */
173 "ASSOCMLEADERACTIONBODY", /* 552 */
174 "ASSOCNETWORK", /* 553 */
175 "ASSOCNETWORKSURFACEACTIONBODY", /* 554 */
176 "ASSOCOBJECTACTIONPARAM", /* 555 */
177 "ASSOCOFFSETSURFACEACTIONBODY", /* 556 */
178 "ASSOCORDINATEDIMACTIONBODY", /* 557 */
179 "ASSOCOSNAPPOINTREFACTIONPARAM", /* 558 */
180 "ASSOCPATCHSURFACEACTIONBODY", /* 559 */
181 "ASSOCPATHACTIONPARAM", /* 560 */
182 "ASSOCPERSSUBENTMANAGER", /* 561 */
183 "ASSOCPLANESURFACEACTIONBODY", /* 562 */
184 "ASSOCPOINTREFACTIONPARAM", /* 563 */
185 "ASSOCRESTOREENTITYSTATEACTIONBODY", /* 564 */
186 "ASSOCREVOLVEDSURFACEACTIONBODY", /* 565 */
187 "ASSOCROTATEDDIMACTIONBODY", /* 566 */
188 "ASSOCSWEPTSURFACEACTIONBODY", /* 567 */
189 "ASSOCTRIMSURFACEACTIONBODY", /* 568 */
190 "ASSOCVALUEDEPENDENCY", /* 569 */
191 "ASSOCVARIABLE", /* 570 */
192 "ASSOCVERTEXACTIONPARAM", /* 571 */
193 "BASEPOINTPARAMETERENTITY", /* 572 */
194 "BLKREFOBJECTCONTEXTDATA", /* 573 */
195 "BLOCKALIGNEDCONSTRAINTPARAMETER", /* 574 */
196 "BLOCKALIGNMENTGRIP", /* 575 */
197 "BLOCKALIGNMENTPARAMETER", /* 576 */
198 "BLOCKANGULARCONSTRAINTPARAMETER", /* 577 */
199 "BLOCKARRAYACTION", /* 578 */
200 "BLOCKBASEPOINTPARAMETER", /* 579 */
201 "BLOCKDIAMETRICCONSTRAINTPARAMETER", /* 580 */
202 "BLOCKFLIPACTION", /* 581 */
203 "BLOCKFLIPGRIP", /* 582 */
204 "BLOCKFLIPPARAMETER", /* 583 */
205 "BLOCKGRIPLOCATIONCOMPONENT", /* 584 */
206 "BLOCKHORIZONTALCONSTRAINTPARAMETER", /* 585 */
207 "BLOCKLINEARCONSTRAINTPARAMETER", /* 586 */
208 "BLOCKLINEARGRIP", /* 587 */
209 "BLOCKLINEARPARAMETER", /* 588 */
210 "BLOCKLOOKUPACTION", /* 589 */
211 "BLOCKLOOKUPGRIP", /* 590 */
212 "BLOCKLOOKUPPARAMETER", /* 591 */
213 "BLOCKMOVEACTION", /* 592 */
214 "BLOCKPARAMDEPENDENCYBODY", /* 593 */
215 "BLOCKPOINTPARAMETER", /* 594 */
216 "BLOCKPOLARGRIP", /* 595 */
217 "BLOCKPOLARPARAMETER", /* 596 */
218 "BLOCKPOLARSTRETCHACTION", /* 597 */
219 "BLOCKPROPERTIESTABLE", /* 598 */
220 "BLOCKPROPERTIESTABLEGRIP", /* 599 */
221 "BLOCKRADIALCONSTRAINTPARAMETER", /* 600 */
222 "BLOCKREPRESENTATION", /* 601 */
223 "BLOCKROTATEACTION", /* 602 */
224 "BLOCKROTATIONGRIP", /* 603 */
225 "BLOCKROTATIONPARAMETER", /* 604 */
226 "BLOCKSCALEACTION", /* 605 */
227 "BLOCKSTRETCHACTION", /* 606 */
228 "BLOCKUSERPARAMETER", /* 607 */
229 "BLOCKVERTICALCONSTRAINTPARAMETER", /* 608 */
230 "BLOCKVISIBILITYGRIP", /* 609 */
231 "BLOCKVISIBILITYPARAMETER", /* 610 */
232 "BLOCKXYGRIP", /* 611 */
233 "BLOCKXYPARAMETER", /* 612 */
234 "CAMERA", /* 613 */
235 "CELLSTYLEMAP", /* 614 */
236 "CONTEXTDATAMANAGER", /* 615 */
237 "CSACDOCUMENTOPTIONS", /* 616 */
238 "CURVEPATH", /* 617 */
239 "DATALINK", /* 618 */
240 "DATATABLE", /* 619 */
241 "DBCOLOR", /* 620 */
242 "DETAILVIEWSTYLE", /* 621 */
243 "DGNDEFINITION", /* 622 */
244 "DGNUNDERLAY", /* 623 */
245 "DICTIONARYVAR", /* 624 */
246 "DICTIONARYWDFLT", /* 625 */
247 "DIMASSOC", /* 626 */
248 "DMDIMOBJECTCONTEXTDATA", /* 627 */
249 "DWFDEFINITION", /* 628 */
250 "DWFUNDERLAY", /* 629 */
251 "DYNAMICBLOCKPROXYNODE", /* 630 */
252 "DYNAMICBLOCKPURGEPREVENTER", /* 631 */
253 "EVALUATION_GRAPH", /* 632 */
254 "EXTRUDEDSURFACE", /* 633 */
255 "FCFOBJECTCONTEXTDATA", /* 634 */
256 "FIELD", /* 635 */
257 "FIELDLIST", /* 636 */
258 "FLIPPARAMETERENTITY", /* 637 */
259 "GEODATA", /* 638 */
260 "GEOMAPIMAGE", /* 639 */
261 "GEOPOSITIONMARKER", /* 640 */
262 "GRADIENT_BACKGROUND", /* 641 */
263 "GROUND_PLANE_BACKGROUND", /* 642 */
264 "HELIX", /* 643 */
265 "IBL_BACKGROUND", /* 644 */
266 "IDBUFFER", /* 645 */
267 "IMAGE", /* 646 */
268 "IMAGEDEF", /* 647 */
269 "IMAGEDEF_REACTOR", /* 648 */
270 "IMAGE_BACKGROUND", /* 649 */
271 "INDEX", /* 650 */
272 "LARGE_RADIAL_DIMENSION", /* 651 */
273 "LAYERFILTER", /* 652 */
274 "LAYER_INDEX", /* 653 */
275 "LAYOUTPRINTCONFIG", /* 654 */
276 "LEADEROBJECTCONTEXTDATA", /* 655 */
277 "LIGHT", /* 656 */
278 "LIGHTLIST", /* 657 */
279 "LINEARPARAMETERENTITY", /* 658 */
280 "LOFTEDSURFACE", /* 659 */
281 "MATERIAL", /* 660 */
282 "MENTALRAYRENDERSETTINGS", /* 661 */
283 "MESH", /* 662 */
284 "MLEADEROBJECTCONTEXTDATA", /* 663 */
285 "MLEADERSTYLE", /* 664 */
286 "MOTIONPATH", /* 665 */
287 "MPOLYGON", /* 666 */
288 "MTEXTATTRIBUTEOBJECTCONTEXTDATA", /* 667 */
289 "MTEXTOBJECTCONTEXTDATA", /* 668 */
290 "MULTILEADER", /* 669 */
291 "NAVISWORKSMODEL", /* 670 */
292 "NAVISWORKSMODELDEF", /* 671 */
293 "NPOCOLLECTION", /* 672 */
294 "NURBSURFACE", /* 673 */
295 "OBJECT_PTR", /* 674 */
296 "ORDDIMOBJECTCONTEXTDATA", /* 675 */
297 "PARTIAL_VIEWING_INDEX", /* 676 */
298 "PDFDEFINITION", /* 677 */
299 "PDFUNDERLAY", /* 678 */
300 "PERSUBENTMGR", /* 679 */
301 "PLANESURFACE", /* 680 */
302 "PLOTSETTINGS", /* 681 */
303 "POINTCLOUD", /* 682 */
304 "POINTCLOUDCOLORMAP", /* 683 */
305 "POINTCLOUDDEF", /* 684 */
306 "POINTCLOUDDEFEX", /* 685 */
307 "POINTCLOUDDEF_REACTOR", /* 686 */
308 "POINTCLOUDDEF_REACTOR_EX", /* 687 */
309 "POINTCLOUDEX", /* 688 */
310 "POINTPARAMETERENTITY", /* 689 */
311 "POINTPATH", /* 690 */
312 "POLARGRIPENTITY", /* 691 */
313 "RADIMLGOBJECTCONTEXTDATA", /* 692 */
314 "RADIMOBJECTCONTEXTDATA", /* 693 */
315 "RAPIDRTRENDERSETTINGS", /* 694 */
316 "RASTERVARIABLES", /* 695 */
317 "RENDERENTRY", /* 696 */
318 "RENDERENVIRONMENT", /* 697 */
319 "RENDERGLOBAL", /* 698 */
320 "RENDERSETTINGS", /* 699 */
321 "REVOLVEDSURFACE", /* 700 */
322 "ROTATIONPARAMETERENTITY", /* 701 */
323 "RTEXT", /* 702 */
324 "SCALE", /* 703 */
325 "SECTIONOBJECT", /* 704 */
326 "SECTIONVIEWSTYLE", /* 705 */
327 "SECTION_MANAGER", /* 706 */
328 "SECTION_SETTINGS", /* 707 */
329 "SKYLIGHT_BACKGROUND", /* 708 */
330 "SOLID_BACKGROUND", /* 709 */
331 "SORTENTSTABLE", /* 710 */
332 "SPATIAL_FILTER", /* 711 */
333 "SPATIAL_INDEX", /* 712 */
334 "SUN", /* 713 */
335 "SUNSTUDY", /* 714 */
336 "SWEPTSURFACE", /* 715 */
337 "TABLE", /* 716 */
338 "TABLECONTENT", /* 717 */
339 "TABLEGEOMETRY", /* 718 */
340 "TABLESTYLE", /* 719 */
341 "TEXTOBJECTCONTEXTDATA", /* 720 */
342 "TVDEVICEPROPERTIES", /* 721 */
343 "VISIBILITYGRIPENTITY", /* 722 */
344 "VISIBILITYPARAMETERENTITY", /* 723 */
345 "VISUALSTYLE", /* 724 */
346 "WIPEOUT", /* 725 */
347 "WIPEOUTVARIABLES", /* 726 */
348 "XREFPANELOBJECT", /* 727 */
349 "XYPARAMETERENTITY", /* 728 */
350 /* End auto-generated variable */
351 };
352
353 // after 1.0 add new types here for binary compat
354 /*
355 { DWG_TYPE_FREED , "FREED " }, // 0xfffd
356 { DWG_TYPE_UNKNOWN_ENT, "UNKNOWN_ENT" }, // 0xfffe
357 { DWG_TYPE_UNKNOWN_OBJ, "UNKNOWN_OBJ" }, // 0xffff
358 */
359
360 /* Fast type -> name */
dwg_type_name(const Dwg_Object_Type type)361 const char *dwg_type_name (const Dwg_Object_Type type)
362 {
363 #if 1
364 if (type <= DWG_TYPE_LAYOUT)
365 return _dwg_type_names_fixed[type];
366 else if ((unsigned)type >= 500 && type <= DWG_TYPE_XYPARAMETERENTITY)
367 return _dwg_type_names_variable[type - 500];
368 else if (type == DWG_TYPE_UNKNOWN_ENT)
369 return "UNKNOWN_ENT";
370 else if (type == DWG_TYPE_UNKNOWN_OBJ)
371 return "UNKNOWN_OBJ";
372 else if (type == DWG_TYPE_PROXY_ENTITY)
373 return "ACAD_PROXY_ENTITY";
374 else if (type == DWG_TYPE_PROXY_OBJECT)
375 return "ACAD_PROXY_OBJECT";
376 else if (type == DWG_TYPE_FREED)
377 return "FREED";
378 else
379 return NULL;
380 #else
381 const struct _obj_type_name *s = (struct _obj_type_name *)_dwg_type_name;
382 // linear, TODO better binary search. Or a switch jumptable, as in free.
383 // just 12 unhandled are missing in objects.inc
384 for (; s->type != DWG_TYPE_UNKNOWN_OBJ; s++)
385 {
386 if (type == s->type)
387 return s->name;
388 }
389 return NULL;
390 #endif
391 }
392
393 // gperf lookup: name -> type, dxfname
dwg_name_type(const char * name)394 Dwg_Object_Type dwg_name_type (const char *name)
395 {
396 #if 1
397 Dwg_Object_Type type;
398 if (dwg_object_name (name, NULL, &type, NULL, NULL))
399 return type;
400 else
401 return DWG_TYPE_UNUSED;
402 #else
403 struct _obj_type_name *s = (struct _obj_type_name *)_dwg_type_name;
404 for (; s->type != DWG_TYPE_UNKNOWN_OBJ; s++)
405 {
406 if (strEQ (name, s->name))
407 return s->type;
408 }
409 return DWG_TYPE_UNUSED;
410 #endif
411 }
412
413 bool
is_type_stable(const Dwg_Object_Type type)414 is_type_stable (const Dwg_Object_Type type)
415 {
416 // clang-format off
417 return !is_type_unstable (type)
418 && !is_type_debugging (type)
419 && !is_type_unstable (type)
420 && type != DWG_TYPE_UNKNOWN_OBJ
421 && type != DWG_TYPE_UNKNOWN_ENT
422 && type != DWG_TYPE_FREED;
423 // clang-format on
424 }
425
426 bool
is_type_unstable_all(const Dwg_Object_Type type)427 is_type_unstable_all (const Dwg_Object_Type type)
428 {
429 return is_type_unstable (type)
430 || is_type_debugging (type);
431 }
432
is_type_unstable(const Dwg_Object_Type type)433 bool is_type_unstable (const Dwg_Object_Type type)
434 {
435 #if 1
436 return is_class_unstable (dwg_type_name (type));
437 #else
438 // unsorted, only linear
439 for (int i = 0; i < ARRAY_SIZE(_classes_unstable); i++)
440 {
441 if (type == _classes_unstable[i])
442 return true;
443 }
444 #endif
445 return false;
446 }
is_type_debugging(const Dwg_Object_Type type)447 bool is_type_debugging (const Dwg_Object_Type type)
448 {
449 #if 1
450 return is_class_debugging (dwg_type_name (type));
451 #else
452 // unsorted, only linear
453 for (int i = 0; i < ARRAY_SIZE(_classes_debugging); i++)
454 {
455 if (type == _classes_debugging[i])
456 return true;
457 }
458 #endif
459 return false;
460 }
is_type_unhandled(const Dwg_Object_Type type)461 bool is_type_unhandled (const Dwg_Object_Type type)
462 {
463 #if 1
464 return is_class_unhandled (dwg_type_name (type));
465 #else
466 // unsorted, only linear
467 for (int i = 0; i < ARRAY_SIZE(_classes_unhandled); i++)
468 {
469 if (type == _classes_unhandled[i])
470 return true;
471 }
472 #endif
473 return false;
474 }
475
is_class_stable(const char * name)476 bool is_class_stable (const char* name)
477 {
478 #if 1
479 // hash lookup
480 Dwg_Class_Stability stable;
481 if (dwg_object_name (name, NULL, NULL, NULL, &stable))
482 return stable == DWG_CLASS_STABLE;
483 else
484 return false;
485 #else
486 return is_type_stable (dwg_name_type (name));
487 #endif
488 }
is_class_unstable(const char * name)489 bool is_class_unstable (const char* name)
490 {
491 #if 1
492 // hash lookup
493 Dwg_Class_Stability stable;
494 if (dwg_object_name (name, NULL, NULL, NULL, &stable))
495 return stable == DWG_CLASS_UNSTABLE;
496 else
497 return false;
498 #else
499 return is_type_unstable (dwg_name_type (name));
500 #endif
501 }
is_class_debugging(const char * name)502 bool is_class_debugging (const char* name)
503 {
504 #if 1
505 // hash lookup
506 Dwg_Class_Stability stable;
507 if (dwg_object_name (name, NULL, NULL, NULL, &stable))
508 return stable == DWG_CLASS_DEBUGGING;
509 else
510 return false;
511 #else
512 return is_type_debugging (dwg_name_type (name));
513 #endif
514 }
is_class_unhandled(const char * name)515 bool is_class_unhandled (const char* name)
516 {
517 #if 1
518 // hash lookup
519 Dwg_Class_Stability stable;
520 if (dwg_object_name (name, NULL, NULL, NULL, &stable))
521 return stable == DWG_CLASS_UNHANDLED;
522 else
523 return true;
524 #else
525 return is_type_unhandled (dwg_name_type (name));
526 #endif
527 }
528
dwg_find_class(const Dwg_Data * restrict dwg,const char * dxfname,BITCODE_BS * numberp)529 bool dwg_find_class (const Dwg_Data *restrict dwg, const char* dxfname, BITCODE_BS *numberp)
530 {
531 assert(dwg);
532 assert(dxfname);
533 // linear search is good enough, with ~20 classes
534 for (BITCODE_BS i = 0; i < dwg->num_classes; i++)
535 {
536 // ->dxfname is always ASCII/UTF-8, dxfname_u is the TU counterpart
537 if (dwg->dwg_class[i].dxfname && strEQ (dwg->dwg_class[i].dxfname, dxfname))
538 {
539 if (numberp)
540 *numberp = dwg->dwg_class[i].number;
541 return true;
542 }
543 }
544 return false;
545 }
546
547 // Similar to _dwg_type_name, just with immediate access, no linear/binary search.
548 static const char *_dwg_dxfnames_fixed[] = {
549 NULL, /* UNUSED = 0x00, */
550 "TEXT", /* 0x01 */
551 "ATTRIB", /* 0x02 */
552 "ATTDEF", /* 0x03, */
553 "BLOCK", /* 0x04, */
554 "ENDBLK", /* 0x05, */
555 "SEQEND", /* 0x06, */
556 "INSERT", /* 0x07, */
557 "INSERT", /* MINSERT 0x08, */
558 "TRACE", /* TRACE_old = 0x09, old TRACE r10-r11 only */
559 "VERTEX", /* _2D 0x0a, */
560 "VERTEX", /* _3D 0x0b, */
561 "VERTEX", /* _MESH 0x0c, */
562 "VERTEX", /* _PFACE 0x0d, */
563 "VERTEX", /* _PFACE_FACE 0x0e, */
564 "POLYLINE", /* _2D 0x0f, */
565 "POLYLINE", /* _3D 0x10, */
566 "ARC", /* 0x11, */
567 "CIRCLE", /* 0x12, */
568 "LINE", /* 0x13, */
569 "DIMENSION", /* _ORDINATE 0x14, */
570 "DIMENSION", /* _LINEAR 0x15, */
571 "DIMENSION", /* _ALIGNED 0x16, */
572 "DIMENSION", /* _ANG3PT 0x17, */
573 "DIMENSION", /* _ANG2LN 0x18, */
574 "DIMENSION", /* _RADIUS 0x19, */
575 "DIMENSION", /* _DIAMETER 0x1A, */
576 "POINT", /* 0x1b, */
577 "3DFACE", /* 0x1c, */
578 "POLYLINE", /* POLYLINE_PFACE 0x1d, */
579 "POLYLINE", /* POLYLINE_MESH 0x1e, */
580 "SOLID", /* 0x1f, */
581 "TRACE", /* 0x20, */
582 "SHAPE", /* 0x21, */
583 "VIEWPORT", /* 0x22, */
584 "ELLIPSE", /* 0x23, */
585 "SPLINE", /* 0x24, */
586 "REGION", /* 0x25, */
587 "3DSOLID", /* 0x26, */
588 "BODY", /* 0x27, */
589 "RAY", /* 0x28, */
590 "XLINE", /* 0x29, */
591 "DICTIONARY", /* 0x2a, */
592 "OLEFRAME", /* 0x2b, */
593 "MTEXT", /* 0x2c, */
594 "LEADER", /* 0x2d, */
595 "TOLERANCE", /* 0x2e, */
596 "MLINE", /* 0x2f, */
597 "BLOCK_CONTROL", /* 0x30, */
598 "BLOCK_HEADER", /* 0x31, */
599 "LAYER_CONTROL", /* 0x32, */
600 "LAYER", /* 0x33, */
601 "STYLE_CONTROL", /* 0x34, 52 SHAPEFILE_CONTROL */
602 "STYLE", /* 0x35, */
603 NULL, /* DWG_TYPE_<UNKNOWN> = 0x36, */
604 NULL, /* DWG_TYPE_<UNKNOWN> = 0x37, */
605 "LTYPE_CONTROL", /* 0x38, */
606 "LTYPE", /* 0x39, */
607 NULL, /* DWG_TYPE_<UNKNOWN> = 0x3a, */
608 NULL, /* DWG_TYPE_<UNKNOWN> = 0x3b, */
609 "VIEW_CONTROL", /* 0x3c, */
610 "VIEW", /* 0x3d, */
611 "UCS_CONTROL", /* 0x3e, */
612 "UCS", /* 0x3f, */
613 "VPORT_CONTROL", /* 0x40, */
614 "VPORT", /* 0x41, */
615 "APPID_CONTROL", /* 0x42, */
616 "APPID", /* 0x43, */
617 "DIMSTYLE_CONTROL", /* 0x44, */
618 "DIMSTYLE", /* 0x45, */
619 "VX_CONTROL", /* 0x46, */
620 "VX_TABLE_RECORD", /* 0x47, */
621 "GROUP", /* 0x48, */
622 "MLINESTYLE", /* 0x49, */
623 "OLE2FRAME", /* 0x4a, */
624 "DUMMY", /* 0x4b, */
625 "LONG_TRANSACTION", /* 0x4c, */
626 "LWPOLYLINE", /* 0x4d */
627 "HATCH", /* 0x4e, */
628 "XRECORD", /* 0x4f, */
629 "ACDBPLACEHOLDER", /* 0x50, */
630 "VBA_PROJECT", /* 0x51, */
631 "LAYOUT" /* 0x52 */
632 };
633
634 /* Non-fixed types > 500. Not stored as type, but as fixedtype. */
635 static const char *_dwg_dxfnames_variable[] =
636 {
637 /* Start auto-generated dxfnames. Do not modify */
638 "ACDSRECORD", /* 500 */
639 "ACDSSCHEMA", /* 501 */
640 "ACMECOMMANDHISTORY", /* 502 */
641 "ACMESCOPE", /* 503 */
642 "ACMESTATEMGR", /* 504 */
643 "ACSH_BOOLEAN_CLASS", /* 505 */
644 "ACSH_BOX_CLASS", /* 506 */
645 "ACSH_BREP_CLASS", /* 507 */
646 "ACSH_CHAMFER_CLASS", /* 508 */
647 "ACSH_CONE_CLASS", /* 509 */
648 "ACSH_CYLINDER_CLASS", /* 510 */
649 "ACSH_EXTRUSION_CLASS", /* 511 */
650 "ACSH_FILLET_CLASS", /* 512 */
651 "ACSH_HISTORY_CLASS", /* 513 */
652 "ACSH_LOFT_CLASS", /* 514 */
653 "ACSH_PYRAMID_CLASS", /* 515 */
654 "ACSH_REVOLVE_CLASS", /* 516 */
655 "ACSH_SPHERE_CLASS", /* 517 */
656 "ACSH_SWEEP_CLASS", /* 518 */
657 "ACSH_TORUS_CLASS", /* 519 */
658 "ACSH_WEDGE_CLASS", /* 520 */
659 "ACDB_ALDIMOBJECTCONTEXTDATA_CLASS", /* 521 */
660 "ALIGNMENTPARAMETERENTITY", /* 522 */
661 "ACDB_ANGDIMOBJECTCONTEXTDATA_CLASS", /* 523 */
662 "ACDB_ANNOTSCALEOBJECTCONTEXTDATA_CLASS", /* 524 */
663 "ARCALIGNEDTEXT", /* 525 */
664 "ARC_DIMENSION", /* 526 */
665 "ACDBASSOC2DCONSTRAINTGROUP", /* 527 */
666 "ACDBASSOC3POINTANGULARDIMACTIONBODY", /* 528 */
667 "ACDBASSOCACTION", /* 529 */
668 "ACDBASSOCACTIONPARAM", /* 530 */
669 "ACDBASSOCALIGNEDDIMACTIONBODY", /* 531 */
670 "ACDBASSOCARRAYACTIONBODY", /* 532 */
671 "ACDBASSOCARRAYMODIFYACTIONBODY", /* 533 */
672 "ACDBASSOCARRAYMODIFYPARAMETERS", /* 534 */
673 "ACDBASSOCARRAYPATHPARAMETERS", /* 535 */
674 "ACDBASSOCARRAYPOLARPARAMETERS", /* 536 */
675 "ACDBASSOCARRAYRECTANGULARPARAMETERS", /* 537 */
676 "ACDBASSOCASMBODYACTIONPARAM", /* 538 */
677 "ACDBASSOCBLENDSURFACEACTIONBODY", /* 539 */
678 "ACDBASSOCCOMPOUNDACTIONPARAM", /* 540 */
679 "ACDBASSOCDEPENDENCY", /* 541 */
680 "ACDBASSOCDIMDEPENDENCYBODY", /* 542 */
681 "ACDBASSOCEDGEACTIONPARAM", /* 543 */
682 "ACDBASSOCEDGECHAMFERACTIONBODY", /* 544 */
683 "ACDBASSOCEDGEFILLETACTIONBODY", /* 545 */
684 "ACDBASSOCEXTENDSURFACEACTIONBODY", /* 546 */
685 "ACDBASSOCEXTRUDEDSURFACEACTIONBODY", /* 547 */
686 "ACDBASSOCFACEACTIONPARAM", /* 548 */
687 "ACDBASSOCFILLETSURFACEACTIONBODY", /* 549 */
688 "ACDBASSOCGEOMDEPENDENCY", /* 550 */
689 "ACDBASSOCLOFTEDSURFACEACTIONBODY", /* 551 */
690 "ACDBASSOCMLEADERACTIONBODY", /* 552 */
691 "ACDBASSOCNETWORK", /* 553 */
692 "ACDBASSOCNETWORKSURFACEACTIONBODY", /* 554 */
693 "ACDBASSOCOBJECTACTIONPARAM", /* 555 */
694 "ACDBASSOCOFFSETSURFACEACTIONBODY", /* 556 */
695 "ACDBASSOCORDINATEDIMACTIONBODY", /* 557 */
696 "ACDBASSOCOSNAPPOINTREFACTIONPARAM", /* 558 */
697 "ACDBASSOCPATCHSURFACEACTIONBODY", /* 559 */
698 "ACDBASSOCPATHACTIONPARAM", /* 560 */
699 "ACDBASSOCPERSSUBENTMANAGER", /* 561 */
700 "ACDBASSOCPLANESURFACEACTIONBODY", /* 562 */
701 "ACDBASSOCPOINTREFACTIONPARAM", /* 563 */
702 "ACDBASSOCRESTOREENTITYSTATEACTIONBODY", /* 564 */
703 "ACDBASSOCREVOLVEDSURFACEACTIONBODY", /* 565 */
704 "ACDBASSOCROTATEDDIMACTIONBODY", /* 566 */
705 "ACDBASSOCSWEPTSURFACEACTIONBODY", /* 567 */
706 "ACDBASSOCTRIMSURFACEACTIONBODY", /* 568 */
707 "ACDBASSOCVALUEDEPENDENCY", /* 569 */
708 "ACDBASSOCVARIABLE", /* 570 */
709 "ACDBASSOCVERTEXACTIONPARAM", /* 571 */
710 "BASEPOINTPARAMETERENTITY", /* 572 */
711 "ACDB_BLKREFOBJECTCONTEXTDATA_CLASS", /* 573 */
712 "BLOCKALIGNEDCONSTRAINTPARAMETER", /* 574 */
713 "BLOCKALIGNMENTGRIP", /* 575 */
714 "BLOCKALIGNMENTPARAMETER", /* 576 */
715 "BLOCKANGULARCONSTRAINTPARAMETER", /* 577 */
716 "BLOCKARRAYACTION", /* 578 */
717 "BLOCKBASEPOINTPARAMETER", /* 579 */
718 "BLOCKDIAMETRICCONSTRAINTPARAMETER", /* 580 */
719 "BLOCKFLIPACTION", /* 581 */
720 "BLOCKFLIPGRIP", /* 582 */
721 "BLOCKFLIPPARAMETER", /* 583 */
722 "BLOCKGRIPLOCATIONCOMPONENT", /* 584 */
723 "BLOCKHORIZONTALCONSTRAINTPARAMETER", /* 585 */
724 "BLOCKLINEARCONSTRAINTPARAMETER", /* 586 */
725 "BLOCKLINEARGRIP", /* 587 */
726 "BLOCKLINEARPARAMETER", /* 588 */
727 "BLOCKLOOKUPACTION", /* 589 */
728 "BLOCKLOOKUPGRIP", /* 590 */
729 "BLOCKLOOKUPPARAMETER", /* 591 */
730 "BLOCKMOVEACTION", /* 592 */
731 "BLOCKPARAMDEPENDENCYBODY", /* 593 */
732 "BLOCKPOINTPARAMETER", /* 594 */
733 "BLOCKPOLARGRIP", /* 595 */
734 "BLOCKPOLARPARAMETER", /* 596 */
735 "BLOCKPOLARSTRETCHACTION", /* 597 */
736 "BLOCKPROPERTIESTABLE", /* 598 */
737 "BLOCKPROPERTIESTABLEGRIP", /* 599 */
738 "BLOCKRADIALCONSTRAINTPARAMETER", /* 600 */
739 "ACDB_BLOCKREPRESENTATION_DATA", /* 601 */
740 "BLOCKROTATEACTION", /* 602 */
741 "BLOCKROTATIONGRIP", /* 603 */
742 "BLOCKROTATIONPARAMETER", /* 604 */
743 "BLOCKSCALEACTION", /* 605 */
744 "BLOCKSTRETCHACTION", /* 606 */
745 "BLOCKUSERPARAMETER", /* 607 */
746 "BLOCKVERTICALCONSTRAINTPARAMETER", /* 608 */
747 "BLOCKVISIBILITYGRIP", /* 609 */
748 "BLOCKVISIBILITYPARAMETER", /* 610 */
749 "BLOCKXYGRIP", /* 611 */
750 "BLOCKXYPARAMETER", /* 612 */
751 "CAMERA", /* 613 */
752 "CELLSTYLEMAP", /* 614 */
753 "CONTEXTDATAMANAGER", /* 615 */
754 "CSACDOCUMENTOPTIONS", /* 616 */
755 "ACDBCURVEPATH", /* 617 */
756 "DATALINK", /* 618 */
757 "DATATABLE", /* 619 */
758 "DBCOLOR", /* 620 */
759 "ACDBDETAILVIEWSTYLE", /* 621 */
760 "DGNDEFINITION", /* 622 */
761 "DGNUNDERLAY", /* 623 */
762 "DICTIONARYVAR", /* 624 */
763 "ACDBDICTIONARYWDFLT", /* 625 */
764 "DIMASSOC", /* 626 */
765 "ACDB_DMDIMOBJECTCONTEXTDATA_CLASS", /* 627 */
766 "DWFDEFINITION", /* 628 */
767 "DWFUNDERLAY", /* 629 */
768 "ACAD_DYNAMICBLOCKPROXYNODE", /* 630 */
769 "ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION", /* 631 */
770 "ACAD_EVALUATION_GRAPH", /* 632 */
771 "EXTRUDEDSURFACE", /* 633 */
772 "ACDB_FCFOBJECTCONTEXTDATA_CLASS", /* 634 */
773 "FIELD", /* 635 */
774 "FIELDLIST", /* 636 */
775 "FLIPPARAMETERENTITY", /* 637 */
776 "GEODATA", /* 638 */
777 "GEOMAPIMAGE", /* 639 */
778 "POSITIONMARKER", /* 640 */
779 "GRADIENT_BACKGROUND", /* 641 */
780 "GROUND_PLANE_BACKGROUND", /* 642 */
781 "HELIX", /* 643 */
782 "RAPIDRTRENDERENVIRONMENT", /* 644 */
783 "IDBUFFER", /* 645 */
784 "IMAGE", /* 646 */
785 "IMAGEDEF", /* 647 */
786 "IMAGEDEF_REACTOR", /* 648 */
787 "IMAGE_BACKGROUND", /* 649 */
788 "INDEX", /* 650 */
789 "LARGE_RADIAL_DIMENSION", /* 651 */
790 "LAYERFILTER", /* 652 */
791 "LAYER_INDEX", /* 653 */
792 "LAYOUTPRINTCONFIG", /* 654 */
793 "ACDB_LEADEROBJECTCONTEXTDATA_CLASS", /* 655 */
794 "LIGHT", /* 656 */
795 "LIGHTLIST", /* 657 */
796 "LINEARPARAMETERENTITY", /* 658 */
797 "LOFTEDSURFACE", /* 659 */
798 "MATERIAL", /* 660 */
799 "MENTALRAYRENDERSETTINGS", /* 661 */
800 "MESH", /* 662 */
801 "ACDB_MLEADEROBJECTCONTEXTDATA_CLASS", /* 663 */
802 "MLEADERSTYLE", /* 664 */
803 "ACDBMOTIONPATH", /* 665 */
804 "MPOLYGON", /* 666 */
805 "ACDB_MTEXTATTRIBUTEOBJECTCONTEXTDATA_CLASS", /* 667 */
806 "ACDB_MTEXTOBJECTCONTEXTDATA_CLASS", /* 668 */
807 "MULTILEADER", /* 669 */
808 "COORDINATION_MODEL", /* 670 */
809 "ACDBNAVISWORKSMODELDEF", /* 671 */
810 "NPOCOLLECTION", /* 672 */
811 "NURBSURFACE", /* 673 */
812 "OBJECT_PTR", /* 674 */
813 "ACDB_ORDDIMOBJECTCONTEXTDATA_CLASS", /* 675 */
814 "PARTIAL_VIEWING_INDEX", /* 676 */
815 "PDFDEFINITION", /* 677 */
816 "PDFUNDERLAY", /* 678 */
817 "ACDBPERSSUBENTMANAGER", /* 679 */
818 "PLANESURFACE", /* 680 */
819 "PLOTSETTINGS", /* 681 */
820 "ACDBPOINTCLOUD", /* 682 */
821 "ACDBPOINTCLOUDCOLORMAP", /* 683 */
822 "ACDBPOINTCLOUDDEF", /* 684 */
823 "ACDBPOINTCLOUDDEFEX", /* 685 */
824 "ACDBPOINTCLOUDDEF_REACTOR", /* 686 */
825 "ACDBPOINTCLOUDDEF_REACTOR_EX", /* 687 */
826 "ACDBPOINTCLOUDEX", /* 688 */
827 "POINTPARAMETERENTITY", /* 689 */
828 "ACDBPOINTPATH", /* 690 */
829 "POLARGRIPENTITY", /* 691 */
830 "ACDB_RADIMLGOBJECTCONTEXTDATA_CLASS", /* 692 */
831 "ACDB_RADIMOBJECTCONTEXTDATA_CLASS", /* 693 */
832 "RAPIDRTRENDERSETTINGS", /* 694 */
833 "RASTERVARIABLES", /* 695 */
834 "RENDERENTRY", /* 696 */
835 "RENDERENVIRONMENT", /* 697 */
836 "RENDERGLOBAL", /* 698 */
837 "RENDERSETTINGS", /* 699 */
838 "REVOLVEDSURFACE", /* 700 */
839 "ROTATIONPARAMETERENTITY", /* 701 */
840 "RTEXT", /* 702 */
841 "SCALE", /* 703 */
842 "SECTIONOBJECT", /* 704 */
843 "ACDBSECTIONVIEWSTYLE", /* 705 */
844 "SECTION_MANAGER", /* 706 */
845 "SECTION_SETTINGS", /* 707 */
846 "SKYLIGHT_BACKGROUND", /* 708 */
847 "SOLID_BACKGROUND", /* 709 */
848 "SORTENTSTABLE", /* 710 */
849 "SPATIAL_FILTER", /* 711 */
850 "SPATIAL_INDEX", /* 712 */
851 "SUN", /* 713 */
852 "SUNSTUDY", /* 714 */
853 "SWEPTSURFACE", /* 715 */
854 "ACAD_TABLE", /* 716 */
855 "TABLE", /* 717 */
856 "TABLEGEOMETRY", /* 718 */
857 "TABLESTYLE", /* 719 */
858 "ACDB_TEXTOBJECTCONTEXTDATA_CLASS", /* 720 */
859 "TVDEVICEPROPERTIES", /* 721 */
860 "VISIBILITYGRIPENTITY", /* 722 */
861 "VISIBILITYPARAMETERENTITY", /* 723 */
862 "VISUALSTYLE", /* 724 */
863 "WIPEOUT", /* 725 */
864 "WIPEOUTVARIABLES", /* 726 */
865 "EXACXREFPANELOBJECT", /* 727 */
866 "XYPARAMETERENTITY", /* 728 */
867 /* End auto-generated dxfnames */
868 };
869
870 /* Find the dxfname for our internal object/entity name.
871 * The reverse of the _alias() functions, replaces dxf_encode_alias (name).
872 * Only needed for the add API.
873 * Some names return either NULL or one of many possibilities,
874 * like UNDERLAY => PDFUNDERLAY.
875 */
dwg_type_dxfname(const Dwg_Object_Type type)876 const char* dwg_type_dxfname (const Dwg_Object_Type type)
877 {
878 if (type <= DWG_TYPE_LAYOUT)
879 return _dwg_dxfnames_fixed[type];
880 else if ((unsigned)type >= 500 && type <= DWG_TYPE_XYPARAMETERENTITY)
881 return _dwg_dxfnames_variable[type - 500];
882 // DWG_TYPE_PROXY_ENTITY = 0x1f2, /* 498 */
883 // DWG_TYPE_PROXY_OBJECT = 0x1f3, /* 499 */
884 else if (type == DWG_TYPE_PROXY_ENTITY)
885 return "ACAD_PROXY_ENTITY";
886 else if (type == DWG_TYPE_PROXY_OBJECT)
887 return "ACAD_PROXY_OBJECT";
888 else if (type == DWG_TYPE_FREED || type == DWG_TYPE_UNKNOWN_ENT || type == DWG_TYPE_UNKNOWN_OBJ)
889 return NULL;
890 else
891 {
892 //LOG_ERROR ("Unkown object type %d", type)
893 return NULL;
894 }
895 }
896
897 // dxfname => name
898 void
object_alias(char * restrict name)899 object_alias (char *restrict name)
900 {
901 const int len = strlen (name);
902 // check aliases (dxfname => name)
903 if (strEQc (name, "ACAD_PROXY_OBJECT"))
904 strcpy (name, "PROXY_OBJECT");
905 else if (strEQc (name, "ACDBPERSSUBENTMANAGER"))
906 strcpy (name, "PERSUBENTMGR");
907 else if (strEQc (name, "ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION"))
908 strcpy (name, "DYNAMICBLOCKPURGEPREVENTER");
909 else if (strEQc (name, "EXACXREFPANELOBJECT"))
910 strcpy (name, "XREFPANELOBJECT");
911 else if (strstr (name, "_BACKGROUND"))
912 strcpy (name, "BACKGROUND");
913 // ACDB_*OBJECTCONTEXTDATA_CLASS => *OBJECTCONTEXTDATA
914 else if (memBEGINc (name, "ACAD_") && len > 28 && strEQc (&name[len-6], "_CLASS"))
915 {
916 name[len-6] = '\0';
917 if (is_dwg_object (&name[5]))
918 memmove (name, &name[5], len - 4);
919 else
920 name[len-6] = '_';
921 }
922 // strip ACAD_ prefix
923 else if (memBEGINc (name, "ACAD_") && is_dwg_object (&name[5]))
924 memmove (name, &name[5], len - 4);
925 // strip the ACDB prefix
926 else if (memBEGINc (name, "ACDB") && is_dwg_object (&name[4]))
927 memmove (name, &name[4], len - 3);
928 }
929
930 // dxfname => name
931 void
entity_alias(char * restrict name)932 entity_alias (char *restrict name)
933 {
934 const int len = strlen (name);
935 // check aliases (dxfname => name)
936 if (strEQc (name, "ACAD_TABLE"))
937 strcpy (name, "TABLE");
938 else if (strEQc (name, "ACAD_PROXY_ENTITY"))
939 strcpy (name, "PROXY_ENTITY");
940 /* else if (strEQc (name, "ACAD_PROXY_ENTITY_WRAPPER"))
941 strcpy (name, "PROXY_ENTITY_WRAPPER"); */
942 else if (strEQc (name, "ACDBPLACEHOLDER"))
943 strcpy (name, "PLACEHOLDER");
944 else if (strEQc (name, "POLYLINE"))
945 strcpy (name, "POLYLINE_2D"); // other POLYLINE_* by flag or subclass?
946 else if (strEQc (name, "VERTEX"))
947 strcpy (name, "VERTEX_2D"); // other VERTEX_* by flag?
948 else if (strEQc (name, "SURFACE"))
949 strcpy (name, "PLANESURFACE");
950 else if (strEQc (name, "COORDINATION_MODEL")) //??
951 strcpy (name, "NAVISWORKSMODEL");
952 else if (strEQc (name, "POSITIONMARKER"))
953 strcpy (name, "GEOPOSITIONMARKER");
954 // if (strEQc (name, "BLOCK"))
955 // strcpy (name, "BLOCK_HEADER");
956 // else if (strEQc (name, "VERTEX_MESH") || strEQc (name, "VERTEX_PFACE"))
957 // strcpy (name, "VERTEX_3D");
958 // else if (strEQc (name, "DIMENSION"))
959 // strcpy (name, "DIMENSION_ANG2LN"); // allocate room for the largest
960 // strip a ACAD_ prefix
961 else if (memBEGINc (name, "ACAD_") && is_dwg_entity (&name[5]))
962 memmove (name, &name[5], len - 4);
963 // strip the ACDB prefix
964 else if (memBEGINc (name, "ACDB") && is_dwg_entity (&name[4]))
965 memmove (name, &name[4], len - 3);
966 }
967
has_entity_DD(const Dwg_Object * obj)968 bool has_entity_DD (const Dwg_Object* obj)
969 {
970 const Dwg_Version_Type version = obj->parent->header.version;
971 const Dwg_Object_Type type = obj->fixedtype;
972 if (version < R_2000)
973 return false;
974 if (type == DWG_TYPE_LWPOLYLINE ||
975 type == DWG_TYPE_LINE ||
976 type == DWG_TYPE_INSERT ||
977 type == DWG_TYPE_MINSERT ||
978 type == DWG_TYPE_TABLE)
979 return true;
980 return false;
981 }
982
obj_has_strings(const Dwg_Object * obj)983 bool obj_has_strings (const Dwg_Object* obj)
984 {
985 const Dwg_Version_Type version = obj->parent->header.from_version;
986 const Dwg_Object_Type type = obj->fixedtype;
987 if (version >= R_2007)
988 return obj->has_strings ? true : false;
989 if (dwg_obj_is_table (obj))
990 return true;
991 if (type == DWG_TYPE_TEXT ||
992 type == DWG_TYPE_ATTRIB ||
993 type == DWG_TYPE_ATTDEF ||
994 type == DWG_TYPE_BLOCK ||
995 type == DWG_TYPE_DIMENSION_ORDINATE ||
996 type == DWG_TYPE_DIMENSION_LINEAR ||
997 type == DWG_TYPE_DIMENSION_ALIGNED ||
998 type == DWG_TYPE_DIMENSION_ANG3PT ||
999 type == DWG_TYPE_DIMENSION_ANG2LN ||
1000 type == DWG_TYPE_DIMENSION_RADIUS ||
1001 type == DWG_TYPE_DIMENSION_DIAMETER ||
1002 type == DWG_TYPE_LARGE_RADIAL_DIMENSION ||
1003 type == DWG_TYPE_ARC_DIMENSION ||
1004 type == DWG_TYPE_SHAPE ||
1005 type == DWG_TYPE_VIEWPORT ||
1006 type == DWG_TYPE__3DSOLID ||
1007 type == DWG_TYPE_REGION ||
1008 type == DWG_TYPE_BODY ||
1009 type == DWG_TYPE_DICTIONARY ||
1010 type == DWG_TYPE_DICTIONARYVAR ||
1011 type == DWG_TYPE_DICTIONARYWDFLT ||
1012 type == DWG_TYPE_MTEXT ||
1013 type == DWG_TYPE_TOLERANCE ||
1014 type == DWG_TYPE_BLOCK_HEADER ||
1015 type == DWG_TYPE_GROUP ||
1016 type == DWG_TYPE_MLINESTYLE ||
1017 type == DWG_TYPE_HATCH ||
1018 type == DWG_TYPE_MPOLYGON ||
1019 type == DWG_TYPE_IMAGEDEF ||
1020 type == DWG_TYPE_LAYER_INDEX ||
1021 type == DWG_TYPE_PLOTSETTINGS ||
1022 type == DWG_TYPE_LAYOUT ||
1023 type == DWG_TYPE_OLE2FRAME ||
1024 type == DWG_TYPE_FIELD ||
1025 type == DWG_TYPE_GEODATA ||
1026 type == DWG_TYPE_TABLECONTENT ||
1027 type == DWG_TYPE_TABLE ||
1028 type == DWG_TYPE_TABLESTYLE ||
1029 type == DWG_TYPE_CELLSTYLEMAP ||
1030 type == DWG_TYPE_SCALE ||
1031 type == DWG_TYPE_MULTILEADER ||
1032 type == DWG_TYPE_MLEADERSTYLE ||
1033 type == DWG_TYPE_PDFDEFINITION ||
1034 type == DWG_TYPE_DGNDEFINITION ||
1035 type == DWG_TYPE_DWFDEFINITION ||
1036 type == DWG_TYPE_SECTIONOBJECT ||
1037 type == DWG_TYPE_SECTION_SETTINGS ||
1038 type == DWG_TYPE_VISUALSTYLE ||
1039 type == DWG_TYPE_LIGHT ||
1040 type == DWG_TYPE_LIGHTLIST ||
1041 type == DWG_TYPE_SUN ||
1042 type == DWG_TYPE_RENDERSETTINGS ||
1043 type == DWG_TYPE_MENTALRAYRENDERSETTINGS ||
1044 type == DWG_TYPE_RAPIDRTRENDERSETTINGS ||
1045 type == DWG_TYPE_DBCOLOR ||
1046 type == DWG_TYPE_MATERIAL ||
1047 type == DWG_TYPE_LAYERFILTER ||
1048 type == DWG_TYPE_ASSOCDEPENDENCY ||
1049 type == DWG_TYPE_ASSOCEDGEACTIONPARAM ||
1050 type == DWG_TYPE_CONTEXTDATAMANAGER ||
1051 (type >= DWG_TYPE_ACSH_BOOLEAN_CLASS && type <= DWG_TYPE_ACSH_WEDGE_CLASS) ||
1052 (type >= DWG_TYPE_ASSOC2DCONSTRAINTGROUP && type <= DWG_TYPE_ASSOCVERTEXACTIONPARAM) ||
1053 dwg_has_subclass (obj->name, "AcDbEvalVariant") ||
1054 dwg_has_subclass (obj->name, "AcDbValueParam") ||
1055 dwg_has_subclass (obj->name, "AcDbAssocActionParam") ||
1056 dwg_has_subclass (obj->name, "AcDbAssocDependency") ||
1057 dwg_has_subclass (obj->name, "AcDbEvalExpr") ||
1058 dwg_has_subclass (obj->name, "AdDbAssocIndexPersSubentId") ||
1059 dwg_has_subclass (obj->name, "AcDbAssocPersSubentId") ||
1060 dwg_has_subclass (obj->name, "AcDbAssocEdgePersSubentId") ||
1061 dwg_has_subclass (obj->name, "AcDbBlockElement") ||
1062 dwg_has_subclass (obj->name, "AcDbBlockGripExpr") ||
1063 type == DWG_TYPE_DIMASSOC ||
1064 type == DWG_TYPE_SUNSTUDY ||
1065 type == DWG_TYPE_GEOPOSITIONMARKER ||
1066 type == DWG_TYPE_NAVISWORKSMODELDEF ||
1067 type == DWG_TYPE_DATATABLE ||
1068 type == DWG_TYPE_DATALINK ||
1069 type == DWG_TYPE_DETAILVIEWSTYLE ||
1070 type == DWG_TYPE_SECTIONVIEWSTYLE ||
1071 type == DWG_TYPE_IBL_BACKGROUND ||
1072 type == DWG_TYPE_IMAGE_BACKGROUND ||
1073 type == DWG_TYPE_RENDERENTRY ||
1074 type == DWG_TYPE_RENDERENVIRONMENT ||
1075 type == DWG_TYPE_RENDERGLOBAL ||
1076 type == DWG_TYPE_ARCALIGNEDTEXT ||
1077 type == DWG_TYPE_RTEXT ||
1078 type == DWG_TYPE_POINTCLOUD ||
1079 type == DWG_TYPE_POINTCLOUDEX ||
1080 type == DWG_TYPE_POINTCLOUDDEF ||
1081 type == DWG_TYPE_POINTCLOUDDEFEX ||
1082 type == DWG_TYPE_POINTCLOUDCOLORMAP ||
1083 type == DWG_TYPE_ASSOCVARIABLE ||
1084 dwg_has_subclass (obj->name, "AcDbCompoundObjectId") ||
1085 type == DWG_TYPE_BLOCKPOLARPARAMETER ||
1086 type == DWG_TYPE_ASSOCDIMDEPENDENCYBODY ||
1087 type == DWG_TYPE_BLOCKANGULARCONSTRAINTPARAMETER ||
1088 dwg_has_subclass (obj->name, "AcDbAssocArrayActionBody") ||
1089 dwg_has_subclass (obj->name, "AcDbAssocArrayCommonParameters") ||
1090 dwg_has_subclass (obj->name, "AcDbImpAssocDimDependencyBodyBase") ||
1091 dwg_has_subclass (obj->name, "AcDbBlockConstraintParameter") ||
1092 type == DWG_TYPE_BLOCKLOOKUPACTION ||
1093 type == DWG_TYPE_BLOCKLOOKUPPARAMETER ||
1094 type == DWG_TYPE_BLOCKPOINTPARAMETER ||
1095 type == DWG_TYPE_BLOCKUSERPARAMETER ||
1096 0
1097 )
1098 return true;
1099 return false;
1100 }
1101