DEV Community

Cover image for Automating a 60-Sheet Plan Set and a Props Library: What Broke First
Generate Build
Generate Build

Posted on

Automating a 60-Sheet Plan Set and a Props Library: What Broke First

Two months ago I inherited a plan set for a public works campus: a salt barn, a maintenance shed, a yard, and a small water plant, spread across sixty sheets that nobody could update in one sitting. Every revision meant an afternoon of hunting for the one detail that still showed the old fence line. I spent three weeks building something that updates itself, and I want to write down the parts that broke, because the failures were more educational than the automation.

The problem was never the drawing, it was the copies

The old set was six people over four years, which is how you get the same curb detail drawn four ways. Before touching any script, I flattened the structure: one base terrain, one site layout, one building model, and every sheet as a thin layer on top through references. That refactor took two days and removed about nine sheets nobody needed.

Scripting the boring half

MicroStation has a macro environment that will run through a batch of files without a human watching, so I used it for the work I could describe in a sentence: rename layers to the standard, refresh the plan index, export the review PDFs every Friday. Two lessons from the first week. The script that deletes the old exports needs a guard, because the day I got the path wrong it ate a folder of submitted drawings. And keep batch runs away from files a person has open; the lock behavior is not something you want to learn from a client call.

Version control for binary files, and why it hurt

Our drawings are binary, and I came from a world where a diff tells you what changed. I solved it the boring way: every batch run exports a text report of sheet names, revision marks and a checksum per file, and that report goes into git. If a drawing changes and no revision mark moves, the report shows it. It has caught two accidental edits in a month, which is two more than the folder of zip files ever caught.

OpenRoads data as a dependency, not a background

The yard layout comes from the road model, and the road model changes when survey finds something. Once I treated that as a dependency instead of a backdrop, the loop got simple: pull the latest terrain, rebuild the yard surfaces, and let the sheets update through their references. The failure mode is coordinate drift, and it bit me once. A survey update arrived in a different unit setting and the whole yard moved a few inches relative to the building pad. Now the batch refuses to run if the unit tags do not match what the log says.

Site3D in the loop

Vehicle turning gets checked by a person before any lot is stamped, so I made it part of the run. Site3D sweeps the apparatus and the delivery trucks through the yard, exports the swept envelopes, and the plan sheet shows them. A reviewer can see the check happened without opening another program, and when a curb radius changes the envelope redraws on the next run.

Shapezo for the context layer

The campus sits next to a residential block, and the shadow and noise conversation needed context I did not have models for. I outlined the neighborhood on the map and Shapezo generated a 3D model of that area to drop in behind the yard. It is rough, the rooflines are generalized and one garage is missing, and I labeled it as illustrative in the sheet notes. For the price of outlining a box it is a good deal.

Meshy as a prop service

The client kept asking for benches, bollards, cabinets, and a few scale figures of equipment. Meshy returns a 3D object from a text description through its own interface, and I generated a props library over a couple of evenings, then cleaned and renamed everything into one folder the site model references. Keep the descriptions short, budget the polygon count before you place twenty of something, and treat every asset as replaceable, because you will replace it.

What I would keep

The convention document, the guard rails on delete, the unit check, and the text report in git. Everything else is convenience. The automation is not clever. It is just that the set updates in twenty minutes now instead of an afternoon, and nobody has to remember which sheet is lying.

Top comments (0)