terminal Consola

La plataforma bimrocket ofrece actualmente las siguientes aplicaciones:

Esta sección describe los usos y el funcionamiento de la aplicación de consola.

Usos

La aplicación de consola (bimrocket-console) está especialmente indicada para estos casos de uso:

Instalación

Para instalar la aplicación de consola, sigue los siguientes pasos:

console

Operación

La consola ofrece dos modos de funcionamiento:

La mayoria de comandos que ofrece la consola se expresan en el lenguage de programación Javascript y siguen el formato comando(arg1, arg2, ...), si bien existen dos comandos especiales que tienen una sintaxis diferente:

En modo interactivo, se puede ejecutar un comando usando la sintaxis simplificada donde no es necesario escribir paréntesis, comas ni comillas. Por ejemplo, el comando: addPsetRule("ASF_Geometria", "ASF_Volum", "CAT_Volum") se podria lanzar así: addPsetRule ASF_Geometria ASF_Volum CAT_Volum. Cuando se usa la sintaxis simplificada no es posible referenciar variables ni funciones.

La consola también admite cualquier expressión válida del lenguaje Javascript.

Ramas de un modelo

La carga de un modelo IFC se hace invocando el comando loadIFC:

> loadIFC("/home/realor/model.ifc")
Loading from /home/realor/model.ifc (2,45 MB)...
Load completed in 1.001 seconds.

Este comando carga todos los objetos del fichero IFC en la rama "main", donde una rama (branch) se puede ver como una lista de objetos IFC.

Para un mismo modelo, podemos crear diferentes ramas, donde cada una de ellas puede contener una selección distinta de objetos del modelo.

Mientras haya un modelo cargado, siempre existirá:

La mayoria de comandos de bimrocket-console actuan sobre sobre rama o el cursor actual.

Se puede saber cual es la rama actual invocando el comando branches:

> branches
branches()
main
walls (current)
roots

Este comando nos muestra todas las ramas existentes y cual de ellas es la actual.

Podemos ver cual es el objecto apuntado por el cursor actual mediante el comando list:

> list
list()
  #13410 IfcWallStandardCase:
  [0] GlobalId: 3rPX_Juz59peXXY6wDJl18
  [1] OwnerHistory: IfcOwnerHistory[...]
  [2] Name: Wand-Ext-ERDG-1
  [3] Description: null
  [4] ObjectType: null
  [5] ObjectPlacement: IfcLocalPlacement[...]
  [6] Representation: IfcProductDefinitionShape[...]
  [7] Tag: BEF1E630-DE4B-41C5-AD-66-B87F1A8D67A1
  [8] PredefinedType: null
...

Si el cursor apunta a una entidad nos mostrará sus atributos y si apunta a una colección, los elementos que ésta contenga. Podemos mover el cursor a uno de los objetos interiores mediante el comando enter(<index>) o enter(<attribute>):

> enter 5
> list
list()
#13386 IfcLocalPlacement:
  [0] PlacementRelTo: IfcLocalPlacement[...]
  [1] RelativePlacement: IfcAxis2Placement3D[...]

Para mover el cursor al objeto padre hay que usar el comando exit().

Podemos hacer una búsqueda de objetos que cumplan cierta condición mediante el comando find:

> find(e => e.isWall("IfcWindow") && e.get("OverallWidth") > 2, "walls")
Matches found: 4
Current branch is walls

Este comando añade a la rama indicada, walls, todos los objetos de la rama actual que cumplan la condición especificada (paredes de más de 2 metros de anchura). Si la rama no existe, la crea y la hace actual.

Podemos cambiar de rama, mediante el comando branch:

> branch main
branch("main")
current branch is main

Este comando posiciona el cursor sobre la lista superior de la rama indicada.

Es posible saber cuantos objetos hay de cada tipo, a partir del cursor actual, mediante el comando histogram:

> histogram
histogram()
Entities found: 44249
IfcAnnotation: 14
IfcApplication: 1
IfcArbitraryClosedProfileDef: 22
IfcAxis2Placement2D: 94
IfcAxis2Placement3D: 364
...

Ejemplos

Esta seria la secuencia de comandos para extraer la paredes (IfcWall) de un fichero IFC:

> loadIFC("/home/realor/model.ifc")
Loading from /home/realor/model.ifc (2,45 MB)...
Load completed in 1.001 seconds.
> find(e => e.is("IfcWall"))
Matches found: 13
Current branch is output
> exportIFC("/home/realor/walls.ifc")
Exporting to /home/realor/walls.ifc...
Export completed in 0.033 seconds.

Para cambiar el nombre de las propiedades de un IfcPropertySet podríamos usar estos comandos:

> loadIFC("/home/realor/model.ifc")
Loading from /home/realor/model.ifc (2,45 MB)...
Load completed in 1.001 seconds.
> addPsetRule("ASF_Geometria", "ASF_Volum", "CAT_Volum")
> addPsetRule("ASF_Geometria", "ASF_Perimetre", "CAT_Perimetre")
> addPsetRule("ASF_Geometria", "ASF_Alçada", "CAT_Alçada")
> transformPsets()
...
> exportIFC("/home/realor/model_cat.ifc")
Exporting to /home/realor/model_cat.ifc...
Export completed in 0.824 seconds.

El siguiente programa Javascript se puede ejecutar en modo por lotes para transformar las propiedades de los IfcPropertySet de todos archivos IFC contenidos en un determinado directorio:

const inputDir = "/home/realor/Descargas/";
const outputDir = "/home/realor/output_ifc/";

addPsetRule("ASF_Geometria", "ASF_Volum", "CAT_Volum");
addPsetRule("ASF_Geometria", "ASF_Perimetre", "CAT_Perimetre");
addPsetRule("ASF_Geometria", "ASF_Alçada", "CAT_Alçada");

const files = paths(inputDir, "*.ifc");
for (let file of files)
{
  console.info("---------------------");
  try
  {
    loadIFC(inputDir + file);
    transformPsets();
    exportIFC(outputDir + file);
  }
  catch (ex)
  {
    console.error(ex);
  }
}