Metadata-Version: 2.4
Name: bimforge
Version: 0.1.96
Summary: Standalone CAD/BIM toolkit: DXF -> IFC -> takeoff pipeline, sheet production, org-neutral CAD engine.
License-Expression: Apache-2.0
Project-URL: Homepage, https://github.com/BrandonLewis/BIMForge
Project-URL: Source, https://github.com/BrandonLewis/BIMForge
Project-URL: Changelog, https://github.com/BrandonLewis/BIMForge/blob/main/CHANGELOG.md
Project-URL: Security, https://github.com/BrandonLewis/BIMForge/security/policy
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: NOTICE
Requires-Dist: pyyaml
Requires-Dist: ezdxf
Requires-Dist: ifcopenshell<0.10,>=0.9
Requires-Dist: shapely
Requires-Dist: pyproj
Requires-Dist: numpy
Provides-Extra: bim
Requires-Dist: pymupdf; extra == "bim"
Provides-Extra: draw
Requires-Dist: matplotlib; extra == "draw"
Provides-Extra: solids
Requires-Dist: build123d; extra == "solids"
Provides-Extra: xlsx
Requires-Dist: openpyxl; extra == "xlsx"
Provides-Extra: terrain
Requires-Dist: pillow; extra == "terrain"
Requires-Dist: scipy; extra == "terrain"
Requires-Dist: laspy[lazrs]; extra == "terrain"
Requires-Dist: trimesh; extra == "terrain"
Requires-Dist: manifold3d; extra == "terrain"
Requires-Dist: networkx; extra == "terrain"
Provides-Extra: all
Requires-Dist: pymupdf; extra == "all"
Requires-Dist: matplotlib; extra == "all"
Requires-Dist: build123d; extra == "all"
Requires-Dist: openpyxl; extra == "all"
Dynamic: license-file

# bimforge

A standalone CAD/BIM toolkit in Python: measure 2D plan sheets, author
parametric IFC models, roll them up into quantities, stage them in 4D/5D, and
produce control, layout and structure sheets.

- **`bimforge.bim`** — DXF → IFC authoring (IFC4X3 by default, exact
  extrusions and alignment sweeps), IFC → quantity takeoff, plan-sheet
  calibration and vector measurement, georeferencing, 3D KML/KMZ for Google
  Earth, 4D schedule embed/read-back (`IfcWorkSchedule`) and 5D cost and
  resource loading (`IfcCostSchedule`). Schedule readers for GanttWarrior JSON,
  Primavera P6 XER and MS Project MSPDI live here too.
- **`bimforge.author`** — the structure-family kernel: alignments, section
  prisms, battered walls, reinforcing bars, plates, saddles, spillways,
  standard-plan families, with quantities taken from the emitted geometry and
  never from a parallel formula.
- **`bimforge.sheets`** and **`bimforge.cad`** — sheet production and the
  org-neutral DXF/KML/geo engine, styled by pluggable **style packs**.
- **`bimforge.terrain`** — terrain grids, watertight terrain solids and
  excavation carves from point clouds and contours.
- **`bimforge.blender`** — Blender add-ons. *Alignment Section* puts a station
  slider in the 3D view sidebar that cuts a live cross-section along an IFC4X3
  `IfcAlignment` (see below).

## Install

```bash
pip install bimforge            # IFC stack included (ifcopenshell, ezdxf, shapely, pyproj, numpy)
pip install 'bimforge[all]'     # + PDF plan sheets, matplotlib drawing, build123d exact solids
pip install 'bimforge[terrain]' # + point-cloud / mesh terrain
```

Two CLIs ship with the package:

```bash
est-bim --help      # dxf2bim, ifc2dxf, takeoff, schedule, cost5d, kml, calibrate, measure, build, ...
est-sheets --help   # control / layout / structure sheet production
```

## Blender: alignment section slider

```bash
python -m bimforge.blender        # writes bimforge_alignment_section.zip
```

In Blender 4.2+ install the zip from *Edit > Preferences > Add-ons > Install
from Disk*. It needs ifcopenshell inside Blender, which Bonsai provides. Then
go to *3D View > Sidebar (N) > Section*, pick **Bonsai** (the IFC Bonsai has
open) or **File**, and press **Load Alignments**. Drag **Station** to slide the
section. You can also step by a fixed interval or type a station and press
**Go**. **View Section** looks through an orthographic camera whose near clip
sits on the cut. Every mesh is cut at the plane, and the cut is filled into
*Section Cut*. Each item is filled per its own styling: its material's
colour, which is the IFC surface style when Bonsai loaded it. An unstyled
item (no material, or the default grey) is filled by what its material or
object name says it is: concrete, rebar, asphalt, gravel, steel, timber or
earthwork. **Single colour** switches back to one highlight colour.
Every cut edge is also drawn as a thin dark line. That outlines the fills and
shows open cuts, such as a ground surface, which has no inside to fill.

**Offsets.** An offset ruler runs across the section: CL, then ticks every
*Every* (10' Lt, 10' Rt, ...) at a set height above grade. **Locate** puts
the 3D cursor at the current station plus an offset Lt or Rt, at the grade
elevation. It then reads the top model surface straight below, for example
`Sta 12+50.00, 3.50 Rt | PG EL 160.16 | top EL 150.92 existing-grade`.
**Inquire** reads the 3D cursor back as station and offset, and **Cut** also
slides the section to it.

**4D date.** When the IFC carries a 4D schedule (IfcTask links, as written
by `est-bim schedule`), the panel shows the model as it stands at the end of
a day. A construction task's elements appear at its start, and a demolition,
dismantle or removal task's elements disappear at its start. Hidden elements
are not cut. Type a date, step by a day or a week, or jump to the previous
or next day on which something appears or goes. The panel counts what is
standing, not yet built and removed. The panel reports station, grade elevation, grade and bearing.
With **Follow timeline** on, frames sweep the whole alignment, so rendering
the animation makes a fly-through. Stations read in feet when the project is
in feet or its map conversion is to a feet grid.

## GIS (QGIS)

```bash
est-bim ifc2gis --ifc model.4d.ifc --out model.gpkg
```

The output is a true-3D GeoPackage in the project CRS. It has one layer of
solids and one of lines (the alignment), and each feature carries its class,
name, GlobalId, cost code and quantities. If the IFC has a 4D schedule, each
feature also carries `appear_date` and `vanish_date`. If it has an
alignment, each feature carries its station and offset range. Drag the file
into QGIS and set the project CRS to match. Use *View > 3D Map Views* to
see the Z, and the Temporal Controller (Layer Properties > Temporal >
separate start and end date fields) to play the staging.

## Style packs

CAD styling (title-block borders, layer colours, KML and IFC surface styles)
comes from a *style pack*: a package or directory with `templates/*.dxf` and an
optional `styles.yaml`. Resolution is explicit argument → registered providers
→ built-in neutral defaults. Any installed distribution can register a provider
through the `bimforge.style_packs` entry-point group (a zero-argument callable
returning a pack spec or `None`).

## Fixture provenance

Test fixtures cite public sources or derive their quantities in-repo. They
carry no employer bid numbers and no working-directory paths, and CI's
de-org scan refuses a change that adds one.

## License

Apache-2.0. See `LICENSE` and `NOTICE`. Security reports: `SECURITY.md`.
