nobim-image-generator
Generate images and visualizations from Revit/IFC files without BIM software. Python-based noBIM tool for batch processing.
git clone --depth 1 https://github.com/datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction /tmp/nobim-image-generator && cp -r /tmp/nobim-image-generator/1_DDC_Toolkit/BIM-Visualization/nobim-image-generator ~/.claude/skills/nobim-image-generatorSKILL.md
# noBIM Image Generator
## Business Case
### Problem Statement
Creating visualizations from BIM models typically requires:
- Expensive BIM software licenses
- Manual screenshot capture
- Time-consuming rendering
- Impossible to batch process
### Solution
noBIM tool extracts data and generates visualizations using Python libraries, processing hundreds of projects without BIM software.
### Business Value
- **No license required** - Pure Python solution
- **Batch processing** - Generate images for 1000s of projects
- **Customizable** - Create exactly the visualizations you need
- **Automatable** - Integrate into data pipelines
## Technical Implementation
### Installation
```bash
pip install pandas matplotlib seaborn plotly ifcopenshell
```
### Core Functionality
```python
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from pathlib import Path
from typing import List, Optional, Tuple
class NoBIMVisualizer:
def __init__(self):
self.elements = None
self.project_name = ""
def load_from_excel(self, xlsx_path: str) -> int:
"""Load BIM data from converted Excel file."""
self.elements = pd.read_excel(xlsx_path, sheet_name="Elements")
self.project_name = Path(xlsx_path).stem
return len(self.elements)
def generate_3d_scatter(self, output_path: str,
color_by: str = "Category",
size: Tuple[int, int] = (12, 10)) -> str:
"""Generate 3D scatter plot of elements."""
if not all(col in self.elements.columns
for col in ['BBox_CenterX', 'BBox_CenterY', 'BBox_CenterZ']):
raise ValueError("Bounding box data required. Export with 'bbox' option.")
fig = plt.figure(figsize=size)
ax = fig.add_subplot(111, projection='3d')
# Get unique categories for coloring
categories = self.elements[color_by].unique()
colors = plt.cm.tab20(np.linspace(0, 1, len(categories)))
color_map = dict(zip(categories, colors))
for cat in categories:
subset = self.elements[self.elements[color_by] == cat]
ax.scatter(
subset['BBox_CenterX'],
subset['BBox_CenterY'],
subset['BBox_CenterZ'],
c=[color_map[cat]],
label=cat[:20],
alpha=0.6,
s=10
)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title(f'{self.project_name} - 3D Element Distribution')
ax.legend(loc='upper left', fontsize=8, ncol=2)
plt.savefig(output_path, dpi=150, bbox_inches='tight')
plt.close()
return output_path
def generate_floor_plan(self, output_path: str, level: str,
size: Tuple[int, int] = (14, 10)) -> str:
"""Generate floor plan visualization for specific level."""
level_elements = self.elements[self.elements['Level'] == level]
if level_elements.empty:
raise ValueError(f"No elements found for level: {level}")
fig, ax = plt.subplots(figsize=size)
# Draw walls
walls = level_elements[level_elements['Category'] == 'Walls']
for _, wall in walls.iterrows():
rect = plt.Rectangle(
(wall['BBox_MinX'], wall['BBox_MinY']),
wall['BBox_MaxX'] - wall['BBox_MinX'],
wall['BBox_MaxY'] - wall['BBox_MinY'],
fill=True, facecolor='gray', edgecolor='black', alpha=0.7
)
ax.add_patch(rect)
# Draw rooms
rooms = level_elements[level_elements['Category'] == 'Rooms']
for _, room in rooms.iterrows():
center_x = (room['BBox_MinX'] + room['BBox_MaxX']) / 2
center_y = (room['BBox_MinY'] + room['BBox_MaxY']) / 2
ax.annotate(room.get('RoomName', 'Room'),
(center_x, center_y), ha='center', fontsize=8)
ax.set_aspect('equal')
ax.set_title(f'{self.project_name} - {level}')
ax.set_xlabel('X (m)')
ax.set_ylabel('Y (m)')
plt.savefig(output_path, dpi=150, bbox_inches='tight')
plt.close()
return output_path
def generate_category_chart(self, output_path: str,
size: Tuple[int, int] = (12, 8)) -> str:
"""Generate bar chart of element categories."""
cat_counts = self.elements['Category'].value_counts().head(20)
fig, ax = plt.subplots(figsize=size)
bars = ax.barh(cat_counts.index, cat_counts.values,
color=plt.cm.viridis(np.linspace(0, 1, len(cat_counts))))
ax.set_xlabel('Element Count')
ax.set_title(f'{self.project_name} - Element Categories')
# Add count labels
for bar, count in zip(bars, cat_counts.values):
ax.text(bar.get_width() + 1, bar.get_y() + bar.get_height()/2,
f'{count}', va='center', fontsize=9)
plt.tight_layout()
plt.savefig(output_path, dpi=150, bbox_inches='tight')
plt.close()
return output_path
def generate_volume_treemap(self, output_path: str) -> str:
"""Generate treemap of volumes by category."""
import plotly.express as px
vol_by_cat = self.elements.groupby('Category')['Volume'].sum().reset_index()
vol_by_cat = vol_by_cat[vol_by_cat['Volume'] > 0].sort_values('Volume', ascending=False)
fig = px.treemap(
vol_by_cat.head(30),
path=['Category'],
values='Volume',
title=f'{self.project_name} - Volume Distribution'
)
fig.write_image(output_path)
return output_path
def batch_generate(self, xlsx_files: List[str], output_dir: str) -> List[str]:
"""Generate standard visualizations for multiple projects."""
output_dir = Path(outputGenerate automated daily progress reports from site data. Track work completed, labor hours, equipment usage, and weather conditions.
Analyze labor productivity from site data. Compare planned vs actual, identify trends, benchmark against industry standards.
Create interactive KPI dashboards for construction projects. Track schedule, cost, quality, and safety metrics in real-time.
Detect and analyze geometric clashes in BIM models. Identify MEP, structural, and architectural conflicts before construction.
Classify BIM elements using AI and standard classification systems. Map elements to UniFormat, MasterFormat, OmniClass, and CWICR codes.
Generate comprehensive BIM model validation reports. Check data quality, completeness, and compliance with standards.
Calculate CO2 emissions and carbon footprint from BIM model data. Analyze embodied carbon by material, element, and building system.
Extract quantities from IFC/Revit models for quantity takeoff. Uses DDC converters to get element counts, areas, volumes, lengths with grouping and reporting.