The highest level function for decoding a file is dwg_read_file
.
Open filename and decode it, saving information into dwg. Return 0 if successful.
You can then iterate over the entities in model space or paper space via two ways:
1. by using the dwg.h data structures. Via dwg->object[0]
, which is of
type Dwg_Object_BLOCK_CONTROL
,
and a custom void process_BLOCK_HEADER(Dwg_Object_Ref* ref)
:
Dwg_Object_BLOCK_CONTROL* block_control = dwg->block_control; // first all entities in the model space process_BLOCK_HEADER(dwg->header_vars.BLOCK_RECORD_MSPACE); // then all entities in the blocks for (i=0; i < block_control->num_entries; i++) { process_BLOCK_HEADER(block_control->block_headers[i]); } // and last all entities in the paper space process_BLOCK_HEADER(dwg->header_vars.BLOCK_RECORD_PSPACE);
or 2. by using the API functions from dwg_api.h:
Dwg_Object_BLOCK_CONTROL* block_control = dwg_block_control(dwg); process_BLOCK_HEADER(dwg_model_space_ref(dwg)); for (i=0; i < block_control->num_entries; i++) { process_BLOCK_HEADER(block_control->block_headers[i]); } process_BLOCK_HEADER(dwg_paper_space_ref(dwg));
and inside the process_BLOCK_HEADER
function, you iterate over the entities
from the block_header via:
Dwg_Object* obj = get_first_owned_entity(ref->obj); while (obj) { process_object(obj); obj = get_next_owned_entity(ref->obj, obj); }
where process_object
checks the type of each entity under the
Dwg_Object* obj.
For each entity or object type (i.e. a non-graphical dwg object, also tables)
there also exist the simple and expensive dwg_getall_ENTITY
and dwg_getall_OBJECT
functions:
Return a malloc’ed NULL-terminated array of all such entities for Model Space, Paper Space or an individual block.
Return a malloc’ed NULL-terminated array of all such DWG objects.
The decoder is driven by the fields definition in the src/dwg.spec, which adds each field to the object. This is done in the src/decode.c or src/decode_r2007.c.
Sets the fields for the object from the DWG bitstream.
Note: Pre-R13 DWG’s do contain all deleted entities, which e.g. where moved into a BLOCK. Those entities do have a type > 127. You need to filter them out by yourself, when processing the DWG.