Skill: datadrivenconstruction/rvt-to-excel (version 2.0.0)

--- name: "rvt-to-excel" description: "Convert RVT/RFA files to Excel databases. Extract BIM element data, properties, and quantities." --- # RVT to Excel Conversion ## Business Case ### Problem Statement BIM data inside RVT files needs to be extracted for: - Processing multiple projects in batch - Integrating BIM data with analytics pipelines - Sharing structured data with stakeholders - Generating reports and quantity takeoffs ### Solution Convert RVT files to structured Excel databases for analysis and reporting. ### Business Value - **Batch processing** - Convert multiple projects - **Data accessibility** - Excel format for universal access - **Pipeline integration** - Feed data to BI tools, ML models - **Structured output** - Organized element data and properties ## Technical Implementation ### CLI Syntax ```bash RvtExporter.exe <input_path> [export_mode] [options] ``` ### Export Modes | Mode | Categories | Description | |------|-----------|-------------| | `basic` | 309 | Essential structural elements | | `standard` | 724 | Standard BIM categories | | `complete` | 1209 | All Revit categories | | `custom` | User-defined | Specific categories only | ### Options | Option | Description | |--------|-------------| | `bbox` | Include bounding box coordinates | | `rooms` | Include room associations | | `schedules` | Export all schedules to sheets | | `sheets` | Export sheets to PDF | ### Examples ```bash # Basic export RvtExporter.exe "C:\Projects\Building.rvt" basic # Complete with bounding boxes RvtExporter.exe "C:\Projects\Building.rvt" complete bbox # Full export with all options RvtExporter.exe "C:\Projects\Building.rvt" complete bbox rooms schedules sheets # Batch processing for /R "C:\Projects" %f in (*.rvt) do RvtExporter.exe "%f" standard bbox ``` ### Python Integration ```python import subprocess import pandas as pd from pathlib import Path from typing import List, Optional class RevitExporter: def __init__(self, exporter_path: str = "RvtExporter.exe"): self.exporter = Path(exporter_path) if not self.exporter.exists(): raise FileNotFoundError(f"RvtExporter not found: {exporter_path}") def convert(self, rvt_file: str, mode: str = "complete", options: List[str] = None) -> Path: """Convert Revit file to Excel.""" rvt_path = Path(rvt_file) if not rvt_path.exists(): raise FileNotFoundError(f"Revit file not found: {rvt_file}") cmd = [str(self.exporter), str(rvt_path), mode] if options: cmd.extend(options) result = subprocess.run(cmd, capture_output=True, text=True) if result.returncode != 0: raise RuntimeError(f"Export failed: {result.stderr}") # Output file is same name with .xlsx extension output_file = rvt_path.with_suffix('.xlsx') return output_file def batch_convert(self, folder: str, mode: str = "standard", pattern: str = "*.rvt") -> List[Path]: """Convert all Revit files in folder.""" folder_path = Path(folder) converted = [] for rvt_file in folder_path.glob(pattern): try: output = self.convert(str(rvt_file), mode) converted.append(output) print(f"Converted: {rvt_file.name}") except Exception as e: print(f"Failed: {rvt_file.name} - {e}") return converted def read_elements(self, xlsx_file: str) -> pd.DataFrame: """Read converted Excel as DataFrame.""" return pd.read_excel(xlsx_file, sheet_name="Elements") def get_quantities(self, xlsx_file: str, group_by: str = "Category") -> pd.DataFrame: """Get quantity summary grouped by category.""" df = self.read_elements(xlsx_file) # Group and count summary = df.groupby(group_by).agg({ 'ElementId': 'count', 'Area': 'sum', 'Volume': 'sum' }).reset_index() summary.columns = [group_by, 'Count', 'Total_Area', 'Total_Volume'] return summary ``` ## Output Structure ### Excel Sheets | Sheet | Content | |-------|---------| | Elements | All BIM elements with properties | | Categories | Element categories summary | | Levels | Building levels | | Materials | Material definitions | | Parameters | Shared parameters | ### Element Columns | Column | Type | Description | |--------|------|-------------| | ElementId | int | Unique Revit ID | | Category | string | Element category | | Family | string | Family name | | Type | string | Type name | | Level | string | Associated level | | Area | float | Surface area (m²) | | Volume | float | Volume (m³) | | BBox_MinX/Y/Z | float | Bounding box min | | BBox_MaxX/Y/Z | float | Bounding box max | ## Usage Example ```python # Initialize exporter exporter = RevitExporter("C:/Tools/RvtExporter.exe") # Convert single file xlsx = exporter.convert("C:/Projects/Office.rvt", "complete", ["bbox", "rooms"]) # Read and analyze df = exporter.read_elements(str(xlsx)) print(f"Total elements: {len(df)}") # Quantity summary quantities = exporter.get_quantities(str(xlsx)) print(quantities) # Export to CSV for further processing df.to_csv("elements.csv", index=False) ``` ## Integration with DDC Pipeline ```python # Full pipeline: Revit → Excel → Cost Estimate from semantic_search import CWICRSemanticSearch # 1. Convert Revit exporter = RevitExporter() xlsx = exporter.convert("project.rvt", "complete", ["bbox"]) # 2. Extract quantities df = exporter.read_elements(str(xlsx)) quantities = df.groupby('Category')['Volume'].sum().to_dict() # 3. Search CWICR for pricing search = CWICRSemanticSearch() costs = {} for category, volume in quantities.items(): results = search.search_work_items(category, limit=5) if not results.empty: avg_price = results['unit_price'].mean() costs[category] = volume * avg_price print(f"Total estimate: ${sum(costs.values()):,.2f}") ``` ## Best Practices 1. **Use appropriate mode** - `basic` for quick analysis, `complete` for full data 2. **Include bbox** - Required for spatial analysis and visualization 3. **Batch carefully** - Large files may take time; process overnight 4. **Validate output** - Check element counts against Revit schedules ## Resources - **GitHub**: [cad2data Pipeline](https://github.com/datadrivenconstruction/cad2data-Revit-IFC-DWG-DGN-pipeline-with-conversion-validation-qto) - **Download**: See repository releases for RvtExporter.exe

path: claw.json
content: {
  "name": "rvt-to-excel",
  "version": "2.0.0",
  "description": "Convert RVT/RFA files to Excel databases. Extract BIM element data, properties, and quantities.",
  "author": "datadrivenconstruction",
  "license": "MIT",
  "permissions": ["filesystem"],
  "entry": "instructions.md",
  "tags": ["construction", "BIM", "Revit", "RVT", "Excel", "data-conversion", "QTO"],
  "models": ["claude-*", "gpt-*"],
  "minOpenClawVersion": "0.8.0"
}


path: instructions.md
content: You are a BIM data conversion assistant. You help users convert Autodesk Revit files (RVT/RFA) to structured Excel databases using the DDC RvtExporter tool.

When the user asks to convert Revit to Excel:
1. Verify the input file path (.rvt or .rfa)
2. Select export mode: complete (all elements), categories (specific), or schedule
3. Run RvtExporter to extract element data, parameters, quantities, and geometry
4. Present the resulting Excel structure (one sheet per category)

When the user asks to analyze Revit data:
1. Summarize by category (walls, floors, columns, doors, etc.)
2. Show quantities: count, area, volume, length per type
3. Help filter by level, phase, or workset
4. Extract specific parameters (mark, comments, custom parameters)

## Input Format
- Revit file path (.rvt or .rfa)
- Export mode: "complete" | "categories" | "schedule"
- Optional: specific categories to export (e.g., Walls, Floors, Columns)

## Output Format
- Excel file with one sheet per Revit category
- Each element: ElementId, Category, Family, Type, Level, Phase, parameters
- Quantities: Area (m2), Volume (m3), Length (m), Count
- Optional: bounding box coordinates for 4D/5D linking

## Constraints
- Filesystem permission required for reading RVT files and writing Excel
- DDC RvtExporter CLI tool must be installed locally
- subprocess.run() is used solely for invoking RvtExporter
- No Revit license required — uses custom extraction engine


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)