Motor de Disposición Automática de Bloques Estructurales para Integración BIM
- Descripción General
- Características Principales
- Arquitectura del Sistema
- Requisitos
- Instalación y Configuración
- Guía de Uso
- Configuración Técnica
- Estructura del Proyecto
- Flujos de Ejecución
- Integración con Revit
- Desarrollo y Contribución
- Equipo
MotorBloques es un prototipo técnico desarrollado para GKS que automatiza la disposición óptima de bloques estructurales en entornos BIM. El sistema implementa un algoritmo híbrido (Greedy + No-Corte) programado en C# (.NET 8.0) que garantiza:
- ✅ Traba estructural mediante el sistema Mata-Junta
- ✅ Cumplimiento normativo con las reglas de construcción GKS
- ✅ Optimización de cortes minimizando desperdicios
- ✅ Salida BIM-Ready para integración directa con Revit
El motor procesa configuraciones de muros y genera coordenadas precisas de cada bloque, listas para ser consumidas por la API de Revit y crear geometría paramétrica en el modelo 3D.
| Característica | Tecnología | Descripción |
|---|---|---|
| Lógica No-Corte | C# (.NET) | Algoritmo que minimiza cortes de bloques respetando tolerancias definidas |
| Sistema Mata-Junta | Offset Calculation | Desplazamiento alternado entre filas para garantizar traba estructural |
| Manejo de Unidades | Auto-Conversion | Conversión automática entre m, cm y mm con validación y alerta |
| Optimización Greedy | Hybrid Algorithm | Selección inteligente de bloques para maximizar eficiencia |
| Componente | Formato | Propósito |
|---|---|---|
| Salida BIM | JSON | Coordenadas (X, Y) y dimensiones en milímetros para Revit API |
| Demo Interactiva | HTML/JS/SVG | Validación visual sin recompilar código |
| Consola Debug | Terminal | Tabla de coordenadas para verificación inmediata |
| Exportación Flexible | JSON | El framework soporta exportación de datos estructurados para análisis externo |
- 🔧 Revit API Ready: Esqueleto de add-in preparado para conexión directa con el núcleo C#
- 📊 Salida Estructurada: JSON con datos completos de cada bloque
- 🎨 Visualización Web: Demo interactiva para pruebas rápidas
┌─────────────────────────────────────────────────────────────┐
│ MOTORBLOQUES SYSTEM │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┴───────────────┐
│ │
📁 CONFIG 🖥️ ENTORNOS
(config.json) │
│ ┌───────────┴──────────┐
│ │ │
│ 🔷 C# CORE 🌐 WEB DEMO
│ (.NET 8.0) (HTML/JS)
│ │ │
└──────────┬────────┘ │
│ │
⚙️ MOTOR 📊 VISUALIZER
(MotorBloques.cs) (Visualizador.js)
│ │
📐 ALGORITMO 🎨 SVG RENDER
(No-Corte + Offset) │
│ │
└──────────┬────────────────────┘
│
📤 OUTPUT
┌──────────┴──────────┐
│ │
📄 JSON FILE 🏢 REVIT API
(output.json) (Future Integration)
- .NET SDK 8.0 o superior - Descargar
- Navegador Web Moderno (Chrome, Firefox, Edge) para la demo interactiva
- (Opcional) Autodesk Revit 2023+ para integración BIM completa
- C# básico para modificaciones del motor
- JSON para configuración de parámetros
- Conceptos BIM para integración con Revit
git clone https://github.com/RetaCode/MotorBloques_GKS.Latam
cd MotorBloquesEdita el archivo MotorBloques/config/config.json con tus especificaciones:
{
"AnchoArea": 1000,
"AltoArea": 500,
"Junta": 2,
"Tolerancia": 1,
"TamanosBloque": [300, 400, 500],
"OffsetMataJunta": 150,
"AltoBloque": 98,
"UnidadEntrada": "mm",
"GrosorParedFinal": 150
}cd MotorBloques/MotorBloques
dotnet buildPropósito: Validar la lógica del motor y generar salida JSON para Revit.
cd MotorBloques/MotorBloques/ConsoleDemo
dotnet runUnidadEntrada es diferente de "mm", el programa mostrará una advertencia, pero procederá con la conversión y el cálculo en milímetros.
Salidas Generadas:
| Archivo | Ubicación | Contenido |
|---|---|---|
| Terminal | Console Output | Tabla resumen con primeras coordenadas |
output.json |
ConsoleDemo/output/ |
Datos completos para Revit API |
Ejemplo de Salida en Terminal:
╔═══════════════════════════════════════════════════════╗
║ MOTORBLOQUES GKS - RESULTADOS ║
╚═══════════════════════════════════════════════════════╝
📐 Configuración del Muro:
- Dimensiones: 1000mm x 500mm
- Bloques disponibles: 300, 400, 500 mm
- Junta: 2mm | Offset: 150mm
🧱 Bloques Generados: 12
┌──────┬────────┬────────┬────────┬────────┐
│ # │ X │ Y │ Ancho │ Tipo │
├──────┼────────┼────────┼────────┼────────┤
│ 1 │ 0 │ 0 │ 500 │ 500 │
│ 2 │ 502 │ 0 │ 400 │ 400 │
│ 3 │ 904 │ 0 │ 96 │ 96 │
└──────┴────────┴────────┴────────┴────────┘
✅ Archivo generado: output/output.json
Propósito: Probar diferentes configuraciones visualmente sin recompilar.
- Abre
web/index.htmlen tu navegador - Ajusta los parámetros en el panel de control:
- Ancho y Alto del muro
- Tamaños de bloques disponibles
- Grosor de junta
- Offset de Mata-Junta
- Clic en "GENERAR MURO"
- Observa la disposición en el visor SVG
Características de la Demo:
- ✅ Visualización en tiempo real
- ✅ Ajuste de parámetros sin código
- ✅ Validación visual de Mata-Junta
- ✅ Verificación de tolerancias
Todos los parámetros del motor se controlan desde este archivo central.
{
"AnchoArea": 1000,
"AltoArea": 500,
"TamanosBloque": [300, 400, 500],
"Junta": 2,
"OffsetMataJunta": 150,
"Tolerancia": 1,
"AltoBloque": 98,
"UnidadEntrada": "mm",
"GrosorParedFinal": 150
}| Parámetro | Tipo | Descripción | Valor Típico |
|---|---|---|---|
AnchoArea |
int |
Dimensión horizontal total del muro | 1000 - 10000 mm |
AltoArea |
int |
Dimensión vertical total del muro | 500 - 5000 mm |
TamanosBloque |
int[] |
Lista de tamaños de bloques disponibles | [300, 400, 500] |
Junta |
int |
Espacio entre bloques y filas | 1 - 5 mm |
OffsetMataJunta |
int |
Desplazamiento horizontal para traba | 100 - 250 mm |
Tolerancia |
int |
Error máximo permitido en fin de fila | 0 - 2 mm |
AltoBloque |
int |
Altura del bloque estándar | 95 - 100 mm |
UnidadEntrada |
string |
Unidad de medida de entrada | "mm", "cm", "m" |
GrosorParedFinal |
int |
Espesor final del muro ensamblado | 120 - 200 mm |
El motor implementa las siguientes normativas:
| Regla | Implementación |
|---|---|
| No-Corte | Algoritmo optimizado para ajustar el final de la fila dentro de la Tolerancia |
| Mata-Junta (Offset) | Desplazamiento horizontal de filas alternas (OffsetMataJunta) |
| Unidades | Conversión automática de UnidadEntrada a milímetros en el constructor de MotorBloques.cs |
Busca combinaciones de bloques que minimicen el desperdicio al final de cada fila.
Espacio Restante ≤ Tolerancia → ✅ Fila Válida
Espacio Restante > Tolerancia → ⚠️ Optimizar con Greedy
Desplaza horizontalmente las filas alternas para garantizar la traba estructural.
Fila Par (0, 2, 4...): X_inicio = 0
Fila Impar (1, 3, 5...): X_inicio = OffsetMataJunta
Unidad Interna Estándar: Milímetros (mm)
// Conversión automática al cargar configuración
switch (UnidadEntrada) {
case "m": factor = 1000; break;
case "cm": factor = 10; break;
case "mm": factor = 1; break;
}El motor C# devuelve una lista de objetos, todos en MILÍMETROS.
[
{
"X": 0,
"Y": 0,
"Ancho": 500,
"Alto": 98,
"Tipo": "500"
},
{
"X": 502,
"Y": 0,
"Ancho": 400,
"Alto": 98,
"Tipo": "400"
}
]MotorBloques/
│
├── MotorBloques/ # 🔷 Solución Principal C# (.NET)
│ ├── Models/ # Clases de datos (Bloque, Configuracion)
│ │ ├── Bloque.cs # Definición del bloque estructural
│ │ └── Configuracion.cs # Modelo de configuración
│ │
│ ├── Motor/ # ⚙️ Núcleo del Algoritmo
│ │ └── MotorBloques.cs # Lógica principal (No-Corte + Mata-Junta)
│ │
│ ├── ConsoleDemo/ # 🖥️ Demo de Consola
│ │ ├── Program.cs # Punto de entrada
│ │ └── output/ # Carpeta de salida JSON
│ │
│ ├── config/ # ⚙️ Configuración Global
│ │ └── config.json # Parámetros del motor
│ │
│ └── revit/ # 🏢 Add-in para Revit (Futuro)
│ ├── RevitAddin.cs # Esqueleto del add-in
│ └── manifest.addin # Manifiesto de Revit
│
├── web/ # 🌐 Demo Web Interactiva
│ ├── index.html # Interfaz principal
│ ├── css/
│ │ └── styles.css # Estilos de la aplicación
│ └── js/
│ ├── MotorBloques.js # Motor en JavaScript
│ ├── Visualizador.js # Renderizado SVG
│ └── config.js # Configuración web
│
├── docs/ # 📚 Documentación Técnica
│ └── TECHNICAL.md # Documentación detallada
│
├── README.md # Este archivo
└── LICENSE # Licencia del proyecto
┌─────────────┐
│ config.json │
└──────┬──────┘
│ 1. Carga de configuración
↓
┌─────────────────────┐
│ MotorBloques.cs │
│ - ConvertToInternal │ 2. Conversión de unidades
│ - ValidateConfig │ 3. Validación de parámetros
└──────┬──────────────┘
│ 4. Ejecución algoritmo
↓
┌─────────────────────┐
│ Run() Method │
│ - No-Corte Logic │ 5. Cálculo de disposición
│ - Mata-Junta Offset │ 6. Aplicación de traba
└──────┬──────────────┘
│ 7. Generación de lista
↓
┌─────────────────────┐
│ List<Bloque> │ 8. Salida en memoria
└──────┬──────────────┘
│
├──→ 📄 output.json (Development)
└──→ 🏢 Revit API (Production)
┌──────────────┐
│ index.html │
│ (User Input) │
└──────┬───────┘
│ 1. Captura de parámetros
↓
┌────────────────────┐
│ Visualizador.js │ 2. Recopilación de datos
└──────┬─────────────┘
│ 3. Instanciación del motor
↓
┌────────────────────┐
│ MotorBloques.js │ 4. Ejecución de algoritmo
│ (JS Port) │ 5. Generación de coordenadas
└──────┬─────────────┘
│ 6. Retorno de array
↓
┌────────────────────┐
│ Visualizador.js │ 7. Renderizado SVG
│ (Render Layer) │ 8. Dibujo de bloques
└──────┬─────────────┘
│ 9. Actualización de vista
↓
┌────────────────────┐
│ SVG Canvas │ 10. Visualización final
└────────────────────┘
El proyecto incluye un esqueleto de add-in preparado para la integración final:
revit/
├── RevitAddin.cs # Clase principal del add-in
├── manifest.addin # Descriptor de Revit
└── README.md # Guía de integración
-
Instalación del Add-in:
- Compilar el proyecto como biblioteca .NET
- Copiar el .dll a la carpeta de add-ins de Revit
- Registrar el manifest.addin
-
Consumo de Datos:
// El add-in consumirá directamente la lista de bloques
var motor = new MotorBloques(config);
List<Bloque> bloques = motor.Run();
// Crear geometría en Revit
foreach (var bloque in bloques) {
CrearBloqueEnRevit(bloque.X, bloque.Y, bloque.Ancho, bloque.Alto);
}- Validación:
- Verificar coordenadas en modelo 3D
- Confirmar traba estructural
- Validar dimensiones y tolerancias
Cada bloque incluye toda la información necesaria:
public class Bloque {
public double X { get; set; } // Coordenada X (mm)
public double Y { get; set; } // Coordenada Y (mm)
public double Ancho { get; set; } // Ancho del bloque (mm)
public double Alto { get; set; } // Alto del bloque (mm)
public string Tipo { get; set; } // Identificador de tamaño
}- .NET SDK 8.0+
- IDE recomendado: Visual Studio 2022 / VS Code + C# Extension
- Git para control de versiones
# Clonar repositorio
git clone https://github.com/RetaCode/MotorBloques_GKS.Latam
cd MotorBloques
# Restaurar dependencias
cd MotorBloques/MotorBloques
dotnet restore
# Compilar
dotnet build --configuration Release
# Ejecutar tests (si existen)
dotnet testEl archivo principal es Motor/MotorBloques.cs:
// Ejemplo: Cambiar el algoritmo de selección
private int SeleccionarBloque(int espacioDisponible) {
// Tu lógica personalizada aquí
return tamaño;
}|
Esteban Retana |
René Soto |
| Área | Descripción |
|---|---|
| 💻 Algoritmo Core | Desarrollo, optimización y mantenimiento del motor de cálculo |
| 🏗️ Integración BIM | Pruebas, validación y compatibilidad con Revit |
| 📊 Exportación de Datos | Formatos de salida y procesamiento de resultados |
| 🧪 Testing & QA | Validación de reglas estructurales GKS |
💬 Nota: Ambos desarrolladores colaboran en todas las áreas según la fase del proyecto.
Propietario: GKS
Tipo: Uso Interno / Propietario
Restricciones: Este es un prototipo técnico para uso exclusivo de GKS.
Si encuentras problemas o tienes sugerencias:
- Verifica que tu configuración
config.jsonsea válida - Revisa los logs de salida en la consola
- Contacta al equipo de desarrollo con:
- Descripción del problema
- Archivo
config.jsonusado - Salida de error (si existe)
- ✅ Núcleo Algorítmico: Completo y validado
- ✅ Demo Interactiva: Funcional
- ✅ Salida JSON: Implementada
- 🟡 Add-in de Revit: En desarrollo
- 🟡 Exportación Excel: En desarrollo
- ⏳ Tests Unitarios: Pendiente
- ⏳ Documentación API: Pendiente
MotorBloques GKS - Automatización de Disposición de Bloques para BIM
Desarrollado por Esteban Retana y René Soto