The intake is the format mix, not any one format
The first time you build a drawing parser you assume the input is one file. Maybe a PDF. Maybe a STEP. You write a parser per format, you get reasonable extraction on each, and you ship. Then you watch a real engineering intake hit the inbox and discover that the unit of work is not a file. It is a bundle.
A representative bundle for a single new part proposal looks like this: a PDF drawing exported from SolidWorks with view callouts and a title block; a STEP file with the 3D geometry and no human-readable annotation; a DWG someone exported in 2014 that has the original detail dimensions; a native CAD file the customer will not let you open without their licence; and an email body where paragraphs two through four contain the actual spec changes the customer cares about, none of which are reflected in the title block.
The job is not to parse any one of these. The job is to reconcile all five into a single typed BOM that downstream procurement and planning can act on without anyone re-keying the part.
· drawing.pdf (SolidWorks export, title block + 3 views) · geometry.step (3D, no annotation) · legacy.dwg (2014 export, original detail dims) · assembly.sldasm (native, licence-gated) · email body (spec changes in ¶2-4, qty in ¶4)
| Component | Qty | Unit | Spec | Source |
|---|---|---|---|---|
| Hub forging | 1 | ea | A36 · zinc | pdf + dwg |
| Bearing race | 2 | ea | 38 mm | step + pdf |
| Bolt M8 × 24 | 4 | ea | A325 | pdf · email |
| Lock washer | 4 | ea | split · 8 mm | |
| Seal ring | 1 | ea | EPDM 38 mm | step + email |
| Grease pack | 1 | pack | NLGI 2 | email · review |
Figures illustrative · drawn from observed pattern, not a named deployment
Five input artifacts collapse into one typed BOM row set. The interesting engineering is not the per-format parsers. it is the reconciliation step that decides which artifact wins when they disagree.
A representative discrete-manufacturing intake desk, sampled across two weeks of intake events. Numbers reflect what we have seen, not what we have promised.
Figures illustrative · drawn from observed pattern, not a named deployment
What each format actually carries
A common mistake is treating the five artifacts as five copies of the same information. They are not. Each carries a different slice of the spec, and the reconciler is only as good as your understanding of what each slice actually contains. Five short dives.
The drawn-out source of truth. but only for what was drawn
A PDF from SolidWorks, Inventor, NX, or Creo carries structured information in fixed regions: the title block (part number, revision, material code, drafter initials, sheet of N), the views with their dimension callouts, the parts list (for assemblies), and the notes block (tolerance standard, finish callouts, surface roughness). It does not carry anything the drafter chose not to draw - finish callouts that live on a separate quality spec, assembly torque values that live in the work instruction, customer-side spec overrides that landed in the cover email.
A PDF intake parser that does not know which CAD package produced the PDF will misread the title block half the time. Title-block layouts vary per package and per template; the right approach is per-package positional grammar against the template, not generic OCR.
Geometry with no annotation, no material, no semantics
STEP carries the 3D boundary representation: surfaces, edges, assembly tree, sometimes part names. It does not carry tolerance callouts, finish, material, or any information the drafter wrote on the drawing rather than modelled into the geometry. You can compute a cylinder's diameter from STEP; you cannot tell from STEP alone whether that cylinder is intended to be a bearing race, an idler pulley, or a spacer.
STEP is most useful as a cross-check. If the drawing PDF says the hub bore is 38 mm and the STEP says 37.8 mm, something is wrong somewhere and the field gets flagged for human review.
Drafted geometry plus layer-based intent. fragile across exports
DWG/DXF carry 2D drafted geometry, dimensions, and (crucially) layer assignments. Layers encode intent: a layer named HIDDEN contains the construction lines, a layer named DIM contains the dimension entities, a layer named NOTES contains the callouts. The layer scheme is also wildly inconsistent across CAD operators and across decades. a 2014 export from AutoCAD LT will not share layers with a 2024 export from BricsCAD.
We treat legacy DWG as a fallback. When the PDF crop has lost a detail dimension (because the PDF was page-trimmed at export time, which happens), the DWG often still has it. The parser walks the dimension layer and reads the call-out string back.
The complete feature tree + PMI. and the one you cannot read
Native CAD files carry everything: feature tree, parametric dimensions, PMI (product manufacturing information) annotations, configuration variants, assembly mates. They are also licence-gated. Most contract manufacturers will not install a $5k/seat licence per CAD package on their intake desk, and most customers will not grant view-only access to their full feature tree.
The honest posture is that native CAD is a request-only fallback. When the bundle is missing a critical dimension and the customer has shared the native file, you ask for the dimension by name and the customer's engineer answers out of band. We do not try to parse native files in the general case.
Semi-structured prose with the actual changes in paragraph three
Email is where the spec overrides land. "Please use A325 bolts on this rev, not A307" in paragraph three is a first-class spec change. So is "qty 4 per assembly, not 6 as shown on the parts list. the parts list is from the old rev." So is "ignore the finish note in the title block; per our QA spec PMR-QA-118, this surface is electroless nickel, not zinc."
Treating the email body as a natural-language source. with a per-customer rule pack that knows what kinds of overrides are common. is what separates a usable reconciler from one that silently ships the title-block defaults and lets the customer's spec changes fall through.[1]
What gets lost when you treat them all the same
The wrong shape. and we have built this shape and regretted it. is to convert every artifact into a common intermediate and then parse that. It sounds principled. It loses fidelity at every conversion step.
PDF-to-text loses the positional grammar of the title block. STEP-to-mesh loses the parametric named features. DWG-to-PDF collapses the layer information. Email-to-prose strips the quoted-reply structure that often disambiguates which override replaces which prior value. By the time you have unified everything into a single intermediate, you have thrown away the per-format signal that made each artifact worth parsing in the first place.
The shape that worked was the opposite: keep each parser format-native, let it produce a candidate field set in the shared schema, and let the reconciler do the merging. The reconciler can ask each parser, by name, "what is your reading of material_grade and how confident are you?" and apply explicit rules.
Every extractor is solvable. The reconciler is the product.
The reconciler is the actual product
Once each artifact has been parsed to a candidate field set, you have five competing readings of the same part. The reconciler decides which one wins for each field, and on what evidence.
The rules are not exotic. They are mostly:
- Title-block fields (part number, revision, material) come from the most-recent PDF unless the email body explicitly overrides them.
- Quantities come from the parts list region of the PDF, with the email body as an explicit override path when the words "qty" / "quantity" / a numeric followed by "ea" appear in the same sentence as a known component.
- Material grade callouts come from the drawing first, the email second, the STEP never. If the drawing and the email disagree, the field gets marked for human review.
- Dimensions come from the drawing PDF first; the legacy DWG is consulted only when the drawing crop is missing detail. STEP geometry is used as a sanity check, not a source.
- New parts (not yet in the item master) get flagged as
new; matched parts get flagged asmatched; parts whose attributes drifted from the matched master get flagged asreview.
These rules are unglamorous. They are also where most of the engineering value lives, because they are the rules the senior intake engineer at the customer was already running in their head. Writing them down makes them inspectable.
- Bundleemail + 5 attachments
- PDF extractortitle block · views
- STEP extractorgeometry only
- DWG extractorlayers + dims
- Email extractoroverrides · qty
- Reconcilerper-field winner
- Convention packper-customer rules
- Proposalqueue · provenance
- Item masterBOM write
- ProcurementRFQ kick
Figures illustrative · drawn from observed pattern, not a named deployment
The full intake cycle as a flow graph. Per-format extractors run in parallel. The reconciler merges candidate field sets per row. The proposal is the human surface. Acceptance writes back to the item master and notifies the procurement queue.
The proposal is reviewable, not silent
The reconciled BOM does not get written to the ERP. It gets drafted into an intake proposal that surfaces in a queue, with per-row provenance for every field. Every cell shows which source artifact it came from. Every review flag is justified with the conflicting readings side by side.
The intake engineer reviews the proposal. They override the two or three fields the reconciler got wrong, accept the rest, and the BOM lands in the ERP as a new item or a revision bump. The work the engineer used to do. opening five files, comparing them in three windows, cross-checking the email - collapses into a screen.
Intake · proposal review
| Component | Qty | Unit | Spec | Status |
|---|---|---|---|---|
| Hub forging | 1 | ea | A36 · zinc | matched |
| Bearing race | 2 | ea | 38 mm | matched |
| Bolt M8 × 24 | 4 | ea | A325 | new |
| Lock washer | 4 | ea | split · 8 mm | new |
| Seal ring | 1 | ea | EPDM 38 mm | matched |
| Grease pack | 1 | pack | NLGI 2 | review |
Figures illustrative · drawn from observed pattern, not a named deployment
The intake proposal screen. Source artifact on the left, the parsed BOM on the right, with per-row status and provenance. The accept / reject decision is one click per row.
- Situation
- Drawings landed from three customer engineering teams across the week. Each revision triggered a full BOM re-type into the ERP, an RFQ packet build, and a sweep of open POs for downstream impact.
- What was breaking
- Of every ten revisions, two missed an affected open PO. Those misses surfaced 3–5 weeks later as the wrong rev shipped to a customer, a scrap event on the floor, or a vendor invoice that no longer matched the PO.
- BOM extraction + RFQ
- Engineering revisions
- Quote-to-procure
Five traps we hit and now actively guard against
A list of the specific reconciliation traps that ate hours of intake-engineer time before we wrote rules for them. None of these are theoretical. All of them have shipped bad data into a production BOM at least once before the rule existed.
- 1M8 vs M10 typo on bolt calloutsDrawing parts list says
M8 × 24; email cover saysM10 × 24, see note 3 on the QA spec. The reconciler used to take the drawing silently. Now: any thread-size disagreement between drawing and email forces areviewflag. The intake engineer picks. Wrong bolt is a torque spec violation and a scrap event on assembly. - 2ISO 2768 vs ASME Y14.5 tolerance call driftTwo drawings of nominally the same part, one with
ISO 2768-mas default tolerance, one withASME Y14.5 ±0.1. The tolerance envelopes do not match for several dimension ranges. The reconciler now records the tolerance standard as a first-class field and refuses to accept a silent change between revs without an explicit acknowledgement.[2] - 3Finish callout missing on zinc-plate vs powderTitle block says
FINISH: ZN. Powder-coat callout was on a separate finish spec sheet that arrived a week earlier and was filed against an older rev. The reconciler now treats finish as a required field for any part with a paintable surface and refuses to ship a proposal that has finish empty. - 4Colour spec ambiguity: RAL vs PMS vs hexDrawing says
colour per cust spec. Customer email saysRAL 5005in one thread andPMS 2935in another, which are nominally similar but produce visibly different parts on a powder-coat line. The reconciler now flags any colour callout that does not name its system (RAL / PMS / hex / customer-internal code) asreview. - 5Stale rev tag in PDF title blockPDF title block says
REV v6because the drafter forgot to bump the title block when they pushed the geometry change. STEP geometry reflects v7. Email cover says "rev 7 attached." The reconciler now cross-checks PDF rev against email subject and against STEP file metadata; mismatch produces a flag, never a silent default.
The thing that does not scale is the surface area, not the parsing
One operational lesson worth recording: the cost driver is not the per-format parser quality. The cost driver is the surface area of conventions per customer.
One shop exports drawings landscape, with the title block on the right; the next exports portrait with the title block at the bottom. One shop puts revision in cell K2; the next puts it in the filename. One shop writes material grade in plain English; the next writes ASTM codes only. These are not parser bugs. These are conventions, and the ingestion pipeline has to learn them per customer.
The shape that works in production is a small per-customer conventions pack. a few dozen rules. sitting above a shared extractor library. The pack is editable by the intake engineer when a new convention surfaces. Most customer-specific surprises are absorbed in the pack within a week of going live.
Every downstream system. procurement, planning, the floor - asks the BOM the same first question: what are the parts and how many of each? If that question has the wrong answer, no amount of downstream automation recovers it. The BOM is the spine. Bending the spine breaks every limb attached to it.
What we have stopped trying to do
Two approaches we have explicitly abandoned, because they looked clever but did not survive contact with real bundles.
First, single-call LLM extraction over the entire bundle. It works for the happy path, fails silently for the rest, and gives no provenance. The bundle is not a prose document. It is a structured artifact with known regions per format, and treating it as prose throws away most of the signal.
Second, building a unified intermediate representation for every drawing format before reconciliation. Sounds principled. In practice it adds an extra translation step that loses fidelity, and the per-format extractors are easier to debug when they speak the format's native vocabulary.
What survived is a small per-format extractor library, an opinionated reconciler with explicit per-field rules, and a surface that always returns a proposal for human review. The interesting engineering is in the reconciler. The interesting product is the proposal.
Footnotes
- [1]The per-customer rule pack typically grows fastest in the first two weeks of a deployment, then asymptotes. Most customers have ~20-40 stable override conventions. We have not yet seen a customer with more than ~80.
- [2]Mixing tolerance standards across revs of the same part is more common than it should be. It usually traces to a CAD-template change that nobody propagated to in-flight drawings. The reconciler treats the standard itself as a versioned field for this reason.
