Features
The free edition makes a drawing visible in QGIS — one drawing at a time. Pro turns a whole folder of them into data you can query and analyse.
| Feature | Free | Pro |
|---|---|---|
| Layers, colours, line types, hatches, text | yes | yes |
| How many drawings per run | one, by hand | a whole folder |
| 3D solids drawn as faces | — | yes |
| Drawing text turned into shape attributes | — | yes |
| Batch conversion with a CSV report | — | yes |
| Open polylines closed into polygons | — | yes |
| Align to map — click the drawing, click the map | — | yes |
| Elevations (Z) kept | — | yes |
| Mapping profiles | — | yes |
| Block attributes as fields | — | yes |
| Runs from the Processing toolbox / models | — | yes |
| Converter needed | none — DXF read directly | bundled — nothing to install |
0. What both editions do — reading the drawing
This part is the same code in both editions. Nothing is held back to make the free edition worse: a drawing that opens correctly in Pro opens correctly free.
- One QGIS layer per CAD layer, split by geometry type
- Entity colour, line type (solid / dashed / dash-dot) and line width kept
- Text placed at its original size, rotation and colour
- Hatch patterns rebuilt from the drawing’s own definitions — not flattened to a solid blob
- Korean, Japanese and Chinese text read correctly whatever the drawing’s encoding says
- Optional GeoPackage output, and the coordinate system taken from your project
- Failures say why — unsupported format, empty drawing and timeout are told apart
The difference is how much of it you can do at once, and what you get back. Free is one drawing per run, through the import window, by hand, with no limit on how many. What Pro adds is below.
1. 3D solids drawn as faces
A 3DSOLID in a DWG is not a mesh. It is a boundary representation: faces, edges, and the surfaces those faces lie on. QGIS’s importer skips them, so a drawing made of nothing but solids comes in empty. On screen that reads as “the drawing is broken”, not “this is a solid”.
Pro reads the ACIS data inside the drawing and brings every face in as a 3D polygon.
- Curved surfaces come in too — cones, tori, ellipses and splines. Each face boundary is sampled along its own curves, so the polygon is the surface
- Holes are cut. A face with an inner loop becomes a polygon with an interior ring, not a filled disc
- Z is kept, so vertical walls stay vertical instead of collapsing to a line
- R14 to 2018, including drawings whose solids are stored away from the entity
The free edition still tells you what is in there. Drop a DXF with solids into it and it reports how many the drawing holds — it just does not draw them.
2. Block attributes as queryable fields
Most of the information in a drawing is not in the lines. It is in block attributes (ATTRIB): manhole numbers, pipe diameters, asset codes, parcel numbers. QGIS’s own importer does not bring these across. The drawing opens; the attributes are gone.
Pro builds one block-reference point layer per CAD layer and spreads every attribute tag found there into a field.
cad_layerandblock_namecome first, then the tag fields- Tags a block does not carry are left
NULL, so blocks with different tag sets still land in one layer - The original tag name is kept as the QGIS field alias, so a normalised field name loses nothing
Below is a room-information layer actually extracted from a public sample (a Swiss facility-management drawing), opened in the QGIS attribute table. 85 room-stamp blocks in the drawing became 85 rows with fields.
| block_name | FLAECHE | RAUMBEZ | RNR2 | B | W | D |
|---|---|---|---|---|---|---|
| bbl-raumstempel | 11.58 | Treppe | 2011.DM.04.001V | Beton gestrichen | Beton gestrichen | Beton gestrichen |
| bbl-raumstempel | 1.78 | Steigzone | 2011.DM.04.003F | |||
| bbl-raumstempel | 10.11 | Warenlift | 2011.DM.04.004V | Holz | Metall | Holz |
| bbl-raumstempel | 10.11 | Warenlift | 2011.DM.04.005V | Holz | Metall | Holz |
Sum the areas (FLAECHE), classify by room name (RAUMBEZ),
join to your register on the room number (RNR2). The door layer of the
same drawing produced 16 fields including fire rating, acoustic rating and size.
In the free edition this table does not exist at all.
3. Mapping profiles — CAD layers onto your schema
A hundred drawings arrive with a hundred layer namings. A-WALL-EXST,
A-WALL-NEW and A-WALL-2F are all the same building wall,
but QGIS receives three layers.
A profile is a list of glob-pattern rules. The first rule that matches wins, so order is priority.
{
"version": 1,
"name": "example",
"rules": [
{ "match": "A-WALL-*", "layer_name": "building_wall", "geometry": "polygon" },
{ "match": "*-TEXT", "layer_name": "annotation", "geometry": "point" }
],
"default": { "layer_name": "{cad_layer}", "geometry": "auto" }
}
Same drawing. Seven rules turned 23 layers into 10. The Defpoints at the
top matched no rule: it keeps its original name and is listed as unmatched,
so you know immediately whether something was left out.
- Several CAD layers merge into one output layer
geometryfixes the geometry type, orautosplits as the drawing does{cad_layer}is replaced by the original layer name- One JSON file, so a team can share it and keep it in git
You do not have to write the file by hand. Edit… next to Layer names lets you put CAD layers under new names and saves the rules for you.
4. Batch folder conversion with a per-file report
Drawings usually arrive by the folder, not one at a time. The free edition converts one drawing per run — open the window, pick the file, pick the coordinate system, import, repeat. That is fine for one drawing and unusable for eighty.
- Point it at a folder and every DWG inside is converted. Subfolders optional
- One file failing does not stop the rest. It does not halt half way
- Per-file results go into a CSV report, so you can see later what failed and why
- The mapping profile and coordinate system apply to the whole run
- It runs as a Processing algorithm, so it goes into a model or a script and can be re-run on next month’s delivery unchanged
import processing
processing.run("echocad:batchimportdwg", {
"INPUT_FOLDER": "D:/deliveries/2026-03/dwg",
"RECURSIVE": True,
"CRS": "EPSG:5186",
"PROFILE": "D:/office/office-schema.json",
"EXTRACT_ATTRIBS": True,
"OUTPUT": "D:/work/gpkg",
"REPORT": "D:/work/report.csv",
})
Below is a real report from one run over a folder of nine drawings. Two were R12 files last saved in 1998 and came through. One was corrupt and did not. The run did not stop there, and what failed and why is on the record.
| file | status | note | layers | features | sec |
|---|---|---|---|---|---|
| facility-2011-dm-a04.dwg | ok | Dropped 1 feature with broken coordinates / closed 7,101 open polylines / attached 1,463 texts | 62 | 36,078 | 180.3 |
| cafm-plan-de.dwg | ok | Dropped 1 feature with broken coordinates / closed 970 open polylines / attached 117 texts | 32 | 4,487 | 56.3 |
| fire-station.dwg | ok | Closed 159 open polylines / attached 157 texts | 16 | 4,010 | 49.6 |
| floorplan-elevation.dwg | ok | Closed 836 open polylines / attached 82 texts | 24 | 10,750 | 150.0 |
| building-a-floor0.dwg | ok | Closed 377 open polylines / attached 93 texts | 29 | 5,301 | 34.1 |
| fortcollins-lincoln-plan.dwg | ok | R12 drawing, recovered | 35 | 1,338 | 10.4 |
| fortcollins-lincoln-section.dwg | ok | R12 drawing, recovered | 46 | 1,655 | 10.2 |
| site-survey-3.dwg | unsupported | Format AC1012. EchoCad tried to recover it and could not. | 0 | 0 | 0.1 |
| tourist-home.dwg | ok | Dropped 5 features with broken coordinates / closed 538 open polylines / attached 602 texts | 41 | 22,158 | 135.8 |
Features dropped for broken coordinates are counted too. Drop them silently and nobody can explain the missing count later.
Pro ships with the converter for Windows and macOS. Nothing to download, no path to point at, and it works on a machine with no internet at all. On macOS the executable bit and the quarantine attribute are handled for you, so there is no Terminal step.
The bundled build is LibreDWG 0.14.8578, and the version matters: the commonly packaged 0.13.3 converts 44 of our 50 sample drawings and truncates 4, while 0.14.8578 converts 48. Fetch it yourself and you get whatever your package manager has.
Pro carries the Windows and macOS builds. Install it and it works. On macOS the execute permission and the quarantine flag are handled for you, so there is no reason to open a terminal.
Corresponding source for the bundled converter is pointed to in bin/SOURCE.md,
as GPL-3 requires.