Drawings and scans together: 2D information as the prior for modelling

State 24.10.2026, plan; nothing of it is built yet. Decided by the user on 24.10.2026: the 2D drawings are analysed first and act as the prior; the scan measures the geometry and wins on geometry; the drawings win on what a scan cannot see. Every extracted piece of information is a fact in facts.json per project; a person verifies the facts on a review page at gate 1 before the builders use them. Decisions: decisions.md; the local LLM's part: local-llm.md; the feature list: open-tasks.md (F17 to F24).

1. Why

A scan sees surfaces: wall faces, floor tops, ceiling undersides, openings where they are open. It does not see what is inside a wall or slab, behind furniture, above a suspended ceiling, the names of rooms, or the build-up of a floor. Drawings carry exactly that, but they show the design, not necessarily the building as it is. So:

QuestionWho answers itWhy
Where is a wall face, a floor top, an opening edgescanmeasured; drawings may be outdated
How thick is a wall seen from one side onlydrawing (verified), else assumedthe scan sees one face
What is a slab made of, how thick is the structural slabsection or build-up legendthe scan sees only the finished surfaces
Storey heights, levels (OK FFB, OK RFB, UK RD)scan where seen; drawing for the rest and as a checksections carry every level, scans only what was scanned
Room names, numbers, units, usedrawing (room stamps, room schedules)not in a scan
Door and window sizes, sill and head where the scan saw nonedrawing (labels, elevations, schedules)a closed door or a slice route shows no head
Walls the scan missed (behind furniture, dense floors)drawing as hypothesis, scan as testthe drawn wall tells the detector where to look

Conflicts beyond the tolerance of a fact type (table 3) go to a person; the model never quietly takes the drawing over a measurement.

2. Catalogue: what 2D sources carry and how to get it

Sources by kind: plan (Grundriss), section (Schnitt), elevation (Ansicht), detail / build-up legend (Aufbauten, Details), schedule (door, window, room lists), site plan (Situation, Lageplan), title block (on every sheet). Methods: V-text text of a vector PDF or DXF read by rules (patterns, position); V-geom vector geometry (fills, lines, arcs, hatches); R-vision raster or scanned sheets (own reader, plan-extract, local vision model); LLM-text a text block classified or parsed by the local LLM when the rules give no clear answer (always proposed, never accepted automatically); human entered on the review page.

#InformationSourceMethodFact typeUsed by (stage)Verify
1Scale (1:50, 1:100)title block, scale barV-text, else dimension chainssheet.scaleevery readeryes, once per sheet
2Sheet kind, storey, plan number, date, revisiontitle blockV-text, LLM-textsheet.metaintake, orderingbulk
3Storey drawings on a sheet and their labelsplanV-geom clusters + labels (built: plans/sheet.py)sheet.drawingplans manbulk
4North arrow, orientationplan, site planV-geom (arrow symbol), humansite.northstructure man (true north)yes
5Survey coordinates, footprint on the sitesite planV-text (LV95 values), V-geomsite.positionstructure man, alignmentyes
6Levels: OK FFB, OK RFB, UK RD per storeysection, elevation, plan level marksV-text (+2.75, ±0.00, labels) + level symbols (A2 in development)level.markstructure manyes
7Storey height, clear room heightsectionfrom 6; room height labels (LH 2.40)level.heightstructure man, roomsfrom 6
8Floor build-up: layers, thickness each, totalsection, build-up legendV-text block near the cut ("Parkett 15, Unterlagsboden 70, Trittschall 20, Beton 220"), LLM-text to parsebuildup.floorload-bearing man (slab thickness), family manyes
9Wall build-up: layers, total thicknessbuild-up legend, details, plan hatchesV-text, hatch pattern per layerbuildup.wallfamily man, load-bearing manyes
10Roof build-up, roof pitch, eaves and ridge heightssection, elevationV-text, V-geom (roof lines)roof.*later: roofsyes
11Wall position and thicknessplanV-geom (built: wall pairs, wall fills)wall.drawnprior for detection and for one-sided wallsconflicts only
12Wall kind: load-bearing, masonry, concrete, drywallplan hatches, legendV-geom hatch classes, LLM-text for the legendwall.kindfamily man (later typed walls)yes
13Openings: position, widthplanV-geom (built)opening.drawnfit man (prior), checkconflicts only
14Door and window labels (T 90/210, F 120/140, BRH 90)planV-text near the opening, LLM-text where unclearopening.sizefit man: width, height, sillyes
15Swing side and hingeplanV-geom (built: arcs, swing chains)opening.swingfit manconflicts only
16Window sill and head heightselevation, sectionV-geom (window outlines against levels)opening.heightsfit man (replaces assumed heights of the slice route)yes
17Room stamps: name, number, unit, area, floor finishplanV-text (built: plans/sheet.py stamps), LLM-text for odd stampsroom.stampfit man (rooms)bulk; conflicts
18Room schedule: name, number, area, usescheduleV-text table reader, LLM-textroom.schedulefit man, check (areas)yes
19Stairs: risers, riser and tread (17 St. 17.6/27), directionplan, sectionV-text, V-geom (built for plans)stair.drawnload-bearing man (stairs)yes
20Slab openings, shaftsplan (crossed boxes, labels), sectionV-geom (crossed box = shaft, see filters), V-textslab.openingload-bearing manyes
21Columns, beams, downstand beamsplan (dashed outlines), sectionV-geom, V-textstructure.memberlater: F8yes
22Section cut lines (A-A) and their position in planplanV-text + V-geom (cut markers)sheet.cutlinks section facts to plan positionsbulk
23Grid axesplanV-text + long dash-dot linesgrid.axisalignment, later grids in Revitbulk
24Dimension chains: exact distancesplan, sectionV-text numbers on dimension linesdimensionchecks (drawn vs measured), scale checkno (used as checks)
25Ceiling: suspended ceiling heightsection, ceiling planV-textceiling.heightlater: ceilingsyes
26Facade: materials, openings per storeyelevationV-geom, LLM-text for notesfacade.*check against the facade scan (F16)bulk
27Terrain, ground floor height above terrainelevation, section, site planV-text level markssite.terrainstructure manyes
28Fire ratings (EI30 doors, fire walls)plan labels, door scheduleV-textopening.fire, wall.firelater: type parametersyes
29Notes that are not building (furniture, dimensions, annotation)allfilters (built: plans/filters.json)none (listed in qa)–no

Rows 3, 11, 13, 15, 17 and parts of 1, 6 and 19 exist today in scan2revit/plans/; the rest is to build.

3. Facts: what is stored, and how

One file per project: scan2revit/data/projects/<project>/project/facts.json (git-ignored like all project data):

``json { "schema": "scan2revit.facts/1", "sources": [ {"id": "S1", "file": "A60.pdf", "sha256": "...", "kind": "plan", "pages": [0], "scale": 100} ], "alignment": {"source": "S1", "drawing": "EG", "to": "scan frame", "rotation_deg": 0.0, "translation": [0.0, 0.0], "rms_m": 0.0, "status": "proposed"}, "facts": [ {"id": "F-0042", "type": "buildup.floor", "subject": {"level": "1.OG"}, "value": {"layers": [["Parkett", 0.015], ["Unterlagsboden", 0.07], ["Trittschall", 0.02], ["Beton", 0.22]], "total": 0.325}, "unit": "m", "where": {"source": "S3", "page": 0, "bbox_pt": [412, 220, 530, 290], "crop": "crops/F-0042.jpeg"}, "method": "V-text", "confidence": 0.9, "status": "proposed", "verified_by": null, "verified_at": null, "note": "", "conflicts": []} ] } ``

4. Verification by a person: the review page

A local tool (scan2revit/tools/facts_review.py, to build) serves a review page on localhost for one project:

The page runs only on this machine and reads the project folder; nothing leaves it (customer drawings).

5. The standard plan, updated (phases)

The changes to the team's phases (agent-team.md, applied after the current development round is merged):

PhaseWhoNew or changed
1 Intakeproject managerlists every source by kind (plan, section, elevation, build-up, schedule, site, scan, IFC)
2a Drawings firstplans manreads every sheet: catalogue rows 1-29 into facts.json, crops for the review page; no geometry decisions yet
2b Input checkpoint cloud man, IFC manas today, with the facts as priors: expected levels for the vertical sections, expected walls as hypotheses for the slice route (search the scan near each drawn wall), expected thicknesses for one-sided walls
2c Alignmentplans man + point cloud mandrawing to scan frame per storey; conflicts filled in facts.json
Gate 1project manager, the userreview page: facts and conflicts decided; data quality, coordinates, storeys
3 Structurestructure manlevels from the scan where measured, else from accepted level facts; every level says which
4 Familiesfamily manwall and floor types; build-up facts kept as type data (decision D-5 on layered types)
5 Load-bearingload-bearing manslab thickness from accepted build-ups where the scan sees only the surfaces; one-sided walls with the drawn thickness
6 Fit-outfit manroom names and numbers from stamps placed onto the scan's rooms through the alignment; opening heights from accepted facts
7 Checkcheckernew: drawn vs measured (every accepted fact with a measured counterpart: difference and verdict), unused facts listed

6. Measured, drawn, assumed

The modelling guideline knows measured and assumed (section 2, scan2revit source). With drawings a third source appears: drawn (taken from an accepted fact). Proposal for the guideline (decision D-4, not yet in SKILL.md): scan2revit source = measured, drawn: <what> (F-0042), assumed: <what>; a drawn value never replaces a measured one without a conflict decision.

7. Development order

1. F17 fact store and catalogue readers for the types already half built (rows 1, 3, 6, 11, 13, 15, 17), then sections (6, 7, 8) and labels (14, 16, 19). 2. F18 review page. 3. F19 alignment of drawings to the scan frame. 4. F20 priors in modelling: levels, one-sided wall thickness, slab thickness, opening heights, room names. 5. F21 drawn vs measured in the checker. 6. F23 build-up parsing, with the local LLM where the rules give no answer (F22, local-llm.md).

Test data: the user's real sheets (plans, elevations) of a building that also has a scan are needed for steps 3 to 5; until then the A60 / A61 sheets serve for steps 1 and 2 (no generated test sheets).