REVIT ARCHITECTURE (990) – PYTHON – Bucles (74) – Bucles while en Python y Revit: contando con condiciones

En Python, los bucles while son muy útiles cuando queremos repetir una acción hasta que una condición deje de cumplirse. Hoy vamos a resolver un ejercicio clásico: imprimir números impares en pantalla entre 0 y 10.

Ejemplo en Python

Explicación línea por línea

x = 0

Inicializamos la variable x en 0. Este será nuestro contador.

Iniciamos un bucle while que se ejecutará mientras x sea menor o igual que 10.
Cuando x llegue a 11, el bucle se detendrá.

Usamos el operador módulo %.

x % 2 calcula el resto de dividir x entre 2.

Si el resto es 1, significa que x es un número impar.

Si la condición es verdadera, mostramos un mensaje en pantalla indicando el número impar.

Finalmente, incrementamos x en 1 en cada iteración para avanzar en el conteo.
Si olvidamos esta línea, el bucle sería infinito.

Relación con el flujo Open Source Revit Converter

En un proyecto real con Revit, podemos aplicar exactamente la misma lógica.
Por ejemplo, imaginemos que queremos recorrer una lista de muros y solo procesar aquellos con un ID impar (esto es un simple criterio de filtrado, como en el ejemplo con números).

Explicación:

muros = obtener_muros_revit() → simulamos obtener todos los muros de Revit.

while i < len(muros): → recorremos todos los elementos de la lista usando un bucle while.

if muros[i][«id»] % 2 == 1: → filtramos muros con un ID impar.

exportar_muro(muros[i]) → solo exportamos los muros que cumplen la condición.

Así, el mismo concepto de filtrar e imprimir impares se traduce en filtrar y procesar elementos de un modelo BIM.

Estudio en detalle la línea:

if muros[i][«id»] % 2 == 1:

muros[i]

Se accede al elemento en la posición i de la lista muros.

Riesgo: si i está fuera de rango → IndexError.

Recomendación: si no necesitas el índice, recorre directamente for muro in muros: para evitar este riesgo.

muros[i][«id»]

Se obtiene el valor asociado a la clave «id» del diccionario que está en muros[i].

Riesgo: si la clave «id» no existe → KeyError.

Recomendación: usar muros[i].get(«id») para devolver None en lugar de lanzar error, o comprobar la clave antes.

% 2 (operador módulo)

Calcula el resto de dividir el id entre 2.

Para enteros:

si el número es par → id % 2 == 0

si es impar → id % 2 == 1

Nota importante sobre negativos: en Python -3 % 2 == 1. Es decir, los enteros impares negativos también devuelven resto 1, por lo que la condición detecta impares negativos igualmente.

Riesgo: si id no es entero (p. ej. None, str, float) → TypeError o comportamiento no deseado. Conviene asegurar el tipo (int(…)) o manejar excepciones.

== 1 (comparación)

Compara el resto con 1; si coincide, la expresión entera es True y entra el if.

Alternativa equivalente y a veces más clara: id % 2 != 0.

Qué significa en palabras:

«Si el id del muro en la posición i es un número impar (resto 1 al dividir por 2), entonces…» (y se ejecuta el cuerpo del if).

Ejemplo con posible fallo y salida esperada

Dada la lista:

Para i = 2 la condición sería True (3 es impar).

Versión más segura y legible

Recomendación: evita indexar si no hace falta, valida/convierte id y maneja errores:

Atajo bit a bit (opcional)

Para enteros, otra forma (micro-optimización) es usar bitwise:

Funciona porque el último bit de un impar es 1. Es más rápido pero menos explícito para lectores menos técnicos.

Consideraciones específicas para Revit

En un entorno Revit el id puede no ser un simple entero: en la API el identificador puede venir como ElementId u otro objeto. En ese caso, obtén el entero explícitamente (ejemplo conceptual):

Siempre valida el tipo antes de hacer % 2.

Resumen de buenas prácticas

Preferir for muro in muros: frente a for i in range(len(muros)): si solo necesitas el elemento.

Usar .get(«id») para evitar KeyError.

Convertir/validar id antes de aplicar %.

Usar m % 2 != 0 (más legible) o m & 1 (micro-optimización).

Manejar valores atípicos y registrar errores para trazabilidad.

Bonus

Un truco muy útil es que este tipo de bucles pueden transformarse en versiones más compactas usando listas por comprensión en Python.

Por ejemplo:

Esto reduce el código y nos da directamente la lista de elementos filtrados.
En el contexto de Revit, podríamos hacer algo similar para obtener solo ciertos muros o ventanas de forma compacta.

Bonus 2: Editor, Consola y Depurador en Python

Cuando trabajamos con Python solemos movernos en tres entornos básicos:

Editor  → donde escribes tu código en archivos .py. Puede ser un editor sencillo (como VS Code o Sublime Text) o un entorno más completo (como PyCharm).

Consola → donde ejecutas directamente tus programas o pruebas fragmentos de código de forma inmediata. Muy útil para hacer experimentos rápidos.

Depurador (Debugger)→ herramienta que permite pausar la ejecución, revisar variables paso a paso y encontrar errores sin necesidad de imprimirlos manualmente.

¿Por qué se llama scripting language y hablamos de scripts?

Python se considera un lenguaje de scripting porque:

No necesita compilación previa como ya explicamos en el artículo anterior (Bonus 2), escribes el código y lo ejecutas directamente.

Sus programas suelen llamarse scripts → pequeños archivos de instrucciones que automatizan tareas.

En el contexto de Revit y el Open Source Converter, un script en Python puede ser ese fragmento de código que:

filtra muros,

exporta ventanas,

o transforma materiales.

Pequeñas piezas de automatización que, al combinarse, construyen flujos de trabajo BIM más potentes.

Ejemplo de Script en Python

Qué muestra este script

Cómo simular la obtención de datos desde Revit.

Uso de for para recorrer muros.

Validación con if para:

detener el proceso si hay muros mal definidos (break),

saltar muros interiores (continue).

Uso de else en un bucle for → confirma que todos los muros fueron procesados si no hubo interrupciones.

Todas estas instrucciones han sido detalladamente explicadas en los artículos anteriores sobre bucles en Python, de forma que si quieres más información puedes leer los artículos anteriores.

Licencia Creative Commons Contenido Web de Yolanda Muriel está sujeto bajo Licencia Creative Commons Atribución-NoComercial-SinDerivadas 3.0 Unported.

Deja un comentario