Three.js: Importador de IFC para threejs

Creado en 24 sept. 2016  ·  62Comentarios  ·  Fuente: mrdoob/three.js

He escrito un importador ifc 2x3 para threejs. Es muy experimental, pero la mayoría de los objetos se renderizarán.

¿Es esto algo que se puede incluir en la distribución? Mi esperanza es que alguien lo desarrolle más y eventualmente también agregue soporte para ifc4

Ejemplo de ifc importado:
ifc-imported

Comentario más útil

Voto por un PR 😊. THREE.IFCLoader sería una gran contribución!

Todos 62 comentarios

olvidé mencionar que depende de ThreeCSG

Nunca he oído hablar de este formato. ¿Dónde se usa habitualmente?

Hasta donde yo sé, se utiliza principalmente en el negocio de la construcción, modelado de edificios. Compatible con Autocad, Revit, Tekla y Solibri, por mencionar algunos.

¡Ya veo ya veo!
¿Para qué necesita ThreeCSG?

Por ejemplo; un objeto Wall (forma extruida en threejs) puede tener una abertura. Y la solución más fácil que encontré fue usar ThreeCSG. También se utiliza en otros casos como IfcBooleanResult.

Enlace a la especificación IfcOpeningElement:
http://www.buildingsmart-tech.org/ifc/IFC2x3/TC1/html/ifcproductextension/lexical/ifcopeningelement.htm

puedes hacer referencia en
http://www.ifcquery.com

@mrdoob , IFC significa Industry Foundation Classes y está destinado a ser un formato de intercambio estándar para proyectos de Building Information Model / Management (BIM). Los paquetes de software normalmente relacionados con esto son Revit , ArchiCAD , VisualARQ y muchos otros. Mientras generalizo, el software BIM proporciona tipos de objetos estándar, como paredes, losas, techos, escaleras, ventanas, etc., todo impulsado por una definición de familia / estilo donde el operador define los parámetros del objeto. Por lo tanto, si tengo una pared con una capa de CMU, Placas de yeso y Azulejos, puedo definir los espesores de todas las capas. ¡Si algo cambia, cambio la definición de familia / estilo, y todo se actualiza automágicamente! ¡La realidad no es tan mágica! Es un formato polémico, ya que cada proveedor de software es libre de jugar con la definición de lo que puede constituir un muro en la importación / exportación http://buildingsmart.org/compliance/certified-software/.
Es un gran formato para apoyar, y agradezco a @kdilayer por configurarlo. @ johnney88, ¿ese espectador está usando threejs?

Sí, The Viewer usa Threejs.
Three.js escribe el archivo guardado 'ifcquery.min.js', pero está codificado.

Puedo confirmar que ifc se usa en ConSci. De hecho, utilicé una aplicación de conversión ifc para convertir los archivos de mi empresa en .objs con archivos .mtl y se leen muy bien. Por lo tanto, eliminar al intermediario sería realmente útil, ya que nuestros clientes tienden a cargar archivos ifc de todos modos.

@rhairston ¿ Una aplicación de conversión de ifc? Puede convertir un archivo ifc en un archivo obj para que Threejs pueda cargarlo bien.
Estoy en lo cierto?

aquí hay una aplicación de conversión de ifc?

¡Gracias a todos por participar!

@kdilayer a PR sería genial. Por favor, incluya ThreeCSG también 😊

¿Algún progreso aquí? Actualmente estamos convirtiendo IFC a DAE para usar con three.js y nos encantaría que three.js admitiera IFC directamente.

Hola kdilayer,

Estoy muy interesado en echarle un vistazo y llevarlo más lejos.

Hola a todos,

También lo he visto https://www.npmjs.com/package/ifc-convert
Con eso puede convertir IFC a DAE, OBJ, STP e IGS.

@kdilayer ¿ Algún progreso?

@kdilayer ¿ Algún progreso aquí? Se ahorrarán muchas cosas si three.js pudiera admitir el formato IFC directamente.

¿Nadie tiene novedades?

Modifiqué el editor para admitir archivos ifc.
Se adjuntan algunas capturas de pantalla. He trabajado en esto durante bastante tiempo ... actualmente no he visto ningún archivo IFC 2x3 que no pueda procesar ... el archivo más grande que he probado es de 180 MB ...
Impresionante.
screen shot 2017-11-15 at 19 19 31
screen shot 2017-11-15 at 19 19 20
screen shot 2017-11-15 at 19 19 08
screen shot 2017-11-15 at 19 18 45

¡Oye, genial trabajo!
¿Se puede acceder a esto directamente desde la rama maestra o el código modificado para el soporte de IFC se encuentra en otro lugar?

Tu! ¡Increíble! ¿Cómo podemos tener acceso a este código de cargador, por favor? : o

Voto por un PR 😊. THREE.IFCLoader sería una gran contribución!

También nos encantaría esta función, por ahora, estoy convirtiendo archivos IFC a obj con https://github.com/IfcOpenShell/IfcOpenShell , pero algunas geometrías más complicadas todavía no se analizan, por lo que a veces es el objeto, no 100 % completo.

Hola, me preguntaba si pudo obtener algunas de las cosas complejas, como puertas y transparencias, con ventanas cargadas en su visor y cargador. ¡Se ve increíble hasta ahora! Tengo curiosidad por saber si planeaba publicar alguna versión de esto en un futuro próximo.

¡Buena suerte !, gracias por actualizar.

Hola @kdilayer , ¿podríamos tener acceso a su aplicación?

Me interesa ver la diferencia de tamaño de archivo entre los formatos .ifc y three.js.

¡Gracias!

@Foosballfan Creo que un IFC no es un formato interesante para el tamaño, ya que es muy detallado. Es solo un formato de intercambio para software de arquitectura como AutoDesk.
Es un estándar de BIM. (pregunte a google este término que es famoso en este tipo de profesión)

@ jean-noelp Gracias por la respuesta.

Tengo un archivo ifc para un edificio de 34 MB y estoy tratando de mostrar estos datos en la web con el tamaño de descarga más pequeño posible.

Con Unity WebGL puedo reducirlo a aproximadamente 11 MB, pero me gustaría ver si es posible con WebGL más puro usando Three.js. Ojalá pueda lograr un tamaño de descarga aún menor.

¿Tiene alguna experiencia con una situación similar?

@Foosballfan para minimizar el tamaño del archivo, los pasos que probaría son:

  1. convertir a OBJ
  2. ejecutar obj-simplificar
  3. comprime el OBJ con Draco
  4. cargar con THREE.DRACOLoader

Si el archivo no se puede convertir a OBJ u otro formato, entonces probablemente no haya mucho que pueda hacer más allá de simplificar el modelo o usar gzip ... "WebGL puro usando three.js" es una forma de renderizar el archivo, pero aún debe usar algún formato u otro para que el archivo se cargue primero.

@donmccurdy ¡Se ve genial, gracias!

Lo intentaré y veré cómo resulta.

Originalmente me di por vencido con obj ya que el que hice es 220 MB del archivo de 34 MB.

Cerrando el problema ya que @kdilayer obviamente no está dispuesto a compartir su implementación. Agregué IFCLoader como tarea a la lista de deseos del cargador en # 5524.

Siempre que no haya IFCLoader , intente convertir archivos IFC a otros formatos como OBJ . Parece que la siguiente herramienta puede realizar esta conversión: http://ifcopenshell.org/ifcobj.html

Consulte también https://github.com/IfcOpenShell/IfcOpenShell

@Foosballfan : IFC es la forma más eficiente de comprimir geometría. El problema es que el enfoque de procedimiento requerido para renderizarlo no es realmente compatible con triángulos. Un IFC de 34 MB se puede extraer fácilmente a 4 GB de secuencias triangulares. IFC describe un tubo acodado con solo 4 vértices, pero se necesitarán cientos de triángulos para renderizarlo. Una mirada a las representaciones del OP y puedo decir que no hay cuchara. Claro, puede hacer líneas rectas y formas toroidales de un eje. Pero la especificación IFC incluye definiciones de superficies barridas por dos splines Bézier. Entonces, son 8 vértices 3D que definen un conjunto prácticamente infinito de triángulos. A los arquitectos les encanta esa herramienta, pero incluso renderizar una representación 2D en una computadora es problemático, ya que la fórmula no permite el enfoque f(x) = y .
Aquí, eche un vistazo a la especificación oficial de IFC: http://www.buildingsmart-tech.org/ifc/IFC4/final/html/schema/ifcgeometryresource/lexical/ifcbsplinesurface.htm

@kdilayer , ¿sigues activo en github? ¿Le gustaría compartir su implementación? : ok_hand: ¡Gracias!

El enfoque con el que me conformé fue usar BimServer para transmitir los datos IFC binarios y luego construirlos en ThreeJS. El tamaño de descarga a través del conector web es satisfactorio y tengo control total sobre el modelo en Three.

Puede echar un vistazo a la forma en que funciona BimViewer como punto de partida.

alguna respuesta?

@ Joao-b4 ¿De qué?

sobre un posible cargador IFC

Ah, supongo que depende de @kdilayer ...

Creo que @kdilayer no tendrá nada, ya que han pasado 3 años desde la publicación y no hay respuesta, ni actividad en su perfil.
No entiendo cómo funciona la creación de un cargador, y tengo un poco de conocimiento en la biblioteca, trabajo con él hace un tiempo, tendría algunos enlaces para crear un cargador, puedo obtener suficiente disposición y conocimiento en el futuro.

He delineado aquí un andamio básico de THREE.IFCLoader . La parte más difícil al escribir un cargador es comprender realmente el formato 3D respectivo. Solo entonces puede analizar el formato y transformar la geometría y / o los datos del material en entidades three.js (por ejemplo, THREE.BufferGeometry ). Recomiendo estudiar un cargador más o menos simple como THREE.PLYLoader para comprender este proceso. Y, por supuesto, el estándar IFC (https://www.iso.org/standard/51622.html)

gracias, un cargador ifc sería realmente útil, y necesito uno ahora, estoy usando lo que mencionaron anteriormente, para convertir a OBJ, pero no creo que sea la mejor manera

Esto fue hace 1,5 años, así que mi memoria está oxidada, pero creo que nuestra solución fue usar el servidor bim para entregar las geometrías desde el servidor y luego usar Three en el front-end para manejar el renderizado.

Me tomó un poco de tiempo, pero finalmente funcionó.

IfcConvert es un IfcConverter para Node.js. Convierte de .ifc a .dae, .obj, .stp y .igs. No lo probé todavía, pero si funciona como se describe, supongo que ya no necesitaríamos ningún cargador .ifc en Three.js, ¿verdad?
.ifc contiene mucha más información que solo el modelo 3D, pero en lo que respecta a Three.js, solo se debe importar el modelo 3D.
Para un exportador, esto sería diferente, ya que uno podría querer exportar su propia biblioteca BIM en un archivo .ifc, junto con el modelo 3D exportado real.
Tiene sentido ?

Aún podría ser interesante cargar directamente IFC en el navegador sin la necesidad de una herramienta de conversión separada. Sin embargo, la herramienta node.js mencionada es solo una envoltura de IfcOpenShell . Entonces no hace algo realmente nuevo ...

¡Creo que el flujo de trabajo de importación a través de IfcConverter podría ser bueno!

Por el contrario, la exportación de ifc no tiene ningún sentido para mí, porque pierdes todos los datos relevantes de ifc (componentes arquitectónicos, partes interesadas de BIM ...) en un visor lambda Three.js, a menos que se cree un editor Ifc con Three.js .

@ Mugen87 Bueno, el principal valor agregado es el paquete Node, que yo sepa, IfcOpenShell es una herramienta CLI en línea.

@ jean-noelp Tienes razón. No me refería a una exportación del "archivo .ifc maestro", sino más bien a un "archivo .ifc de biblioteca" que las partes interesadas de BIM podrían importar en su propio "archivo .ifc maestro". Por ejemplo, si es un fabricante de puertas de garaje, use Three.js para planificar la instalación para sus clientes (arquitectos, por ejemplo) y exporte la biblioteca BIM que contiene sus objetos BIM (normalmente la puerta de garaje). Ves lo que quiero decir ? Pero de todos modos, no habría forma de tener este exportador integrado en Three.js ya que cada caso de uso particular es demasiado específico (supongo).

Encuentro una HERRAMIENTA, IFC se puede resolver,
No es gratis,
Pero analizar la estructura de IFC es gratuito y de código abierto
http://www.apstex.com/

Saludos, no hay novedades de @kdilayer, ¿verdad? ¿Nunca publicó el código fuente?

?

------------------ El mensaje original ------------------
De: "Daniel Ramos" < [email protected]>;
Hora de entrega: 28 de mayo de 2020 (jueves) 22:08
Para: "mrdoob / three.js"[email protected]>;
Cc: " Deja la red de peces" < [email protected]>;
Asunto: Re: [mrdoob / three.js] Importador de IFC para threejs (# 9764)

Saludos, ¿no hay noticias de @kdilayer verdad? ¿Nunca publicó el código fuente?

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub o cancele la suscripción.

Alguna noticia sobre esto ?

¡Oye! Hace unos días comencé a implementar un analizador IFC en JS con la idea de aplicarlo a Three.js. Este es un proyecto personal que hago en mi tiempo libre, por lo que no tengo una idea clara de cuánto tiempo llevará. Sin embargo, vi este hilo hoy y pensé que podría resultarle de interés. Puedes encontrarlo aquí .

@agviegas esperando con ansias lo que haces con él! un PR podría ser realmente bienvenido

¡Por supuesto! @agviegas, podemos conseguir que más personas nos ayuden si haces un PR con él 😍

Desafortunadamente no pude publicar mi trabajo en el ifcimporter, pero puedo ayudar a @agviegas

@mrdoob Eso suena genial. Todavía estoy trabajando en las funcionalidades centrales del analizador; ya puede cargar todos los elementos de la estructura espacial y pronto comenzaré a construir la geometría. Supongo que el código también debe adaptarse a esto antes de hacer las relaciones públicas. ¿Hay alguna referencia que comprobar para preparar el código para el RP? Podemos hacer esto cuando lo desee. Cualquier ayuda con respecto a esto será bienvenida.

Por otro lado, el formato IFC es muy fácil de implementar, aunque puede resultar un poco intimidante por la dureza de la documentación oficial. Considero que conozco relativamente bien el formato IFC, por lo que si alguien está interesado en participar, seguramente podremos prepararlo antes. 🙂

Captura

Supongo que el código también debe adaptarse a esto antes de hacer las relaciones públicas.

Sí, debería usar la misma interfaz que usan los otros cargadores. Quizás MD2Loader sea ​​la referencia más simple en este momento.

No se preocupe por tener todo perfecto para las relaciones públicas. Puede enviar lo que tiene como borrador y podemos ayudar a asegurarnos de que el código se ajuste al resto.

Después de varios tropiezos y luchas con el formato, ya hay algunos resultados. Implementé la primera versión del analizador, así como algunas de las entidades geométricas (incluidas extrusiones y b-reps). Aún queda mucho por hacer, pero estoy contento con los resultados hasta ahora. La siguiente imagen muestra un pequeño IFC generado por Revit que se ejecuta sin problemas en Chrome. Cada instancia geométrica tiene asociada la información de IFC analizada (de hecho, en la escena a continuación, cada instancia tiene un material que depende de su categoría / ifclass), por lo que la creación de filtros utilizando valores de propiedades (Psets y Qsets) no debería ser difícil de archivar desde este punto. . Cualquier idea o sugerencia es bienvenida. 🙂

20201124_screenshot

@agviegas ¡Excelente!

@agviegas ¡ Muy bien hecho!

En cuanto a ideas para la gestión inmobiliaria. ¿Cómo las almacena ahora? ¿Justo como userData en las mallas o geometría, supongo?

La mayoría de nuestros clientes utilizan software como HiCad o ArchiCAD para su modelado y almacenan MUCHA información que es muy importante para los trabajadores de la construcción (densidad térmica, resistencia al viento, medidas, pesos, etc. etc.).

También tengo mucha curiosidad sobre la velocidad de análisis / carga. Los modelos con los que he probado mi implementación tardan unos 5 segundos en analizarse, pero para generar la geometría, el proceso tarda casi 2 minutos en convertirse a un modelo DAE. (Lo estoy convirtiendo en el lado del servidor debido a la falta de tiempo y experiencia de mi parte: sweat_smile:, por eso estoy tan emocionado de que este cargador funcione 'de forma nativa')

@haroldiedema Todavía no he implementado los conjuntos de propiedades, pero la estructura de datos actual consiste en un objeto JS donde las claves son las ID expresas y los valores son los objetos analizados cargados en la memoria. Cada propiedad que era un ID rápido se reemplaza por una referencia al objeto con ese ID. En la implementación actual, cada instancia de _IfcProduct_ con una o más representaciones geométricas tiene una propiedad adicional llamada _Geometry_, que es una matriz de referencias a las geometrías de la escena. Por ejemplo, cada _IfcWallStandardCase_ tiene una propiedad _Geometry_ con una referencia a la _Path_ (a Line ) a al _Body_ (a Mesh ).

Probablemente cada instancia geométrica de Three.js tendrá una propiedad que contiene la ID expresa, por lo que recuperar la entidad ifc cargada en la memoria (y la información relacionada) será fácil (por ejemplo, al hacer clic en las mallas de la escena).

En cuanto a las propiedades definidas por el usuario, habrá una o más _IfcRelDefinesByProperties_ (u otro objeto de relación indirecta) para unir todo. Quizás cada instancia de IfcProduct puede tener un atributo _hasPropertySets_ que contendría una matriz de los conjuntos de propiedades analizados relacionados (he visto este patrón en otras bibliotecas IFC, y esto es lo que estoy haciendo con otras relaciones indirectas como _IfcRelAggregates_). No me preocupa la cantidad de propiedades ya que estarán estructuradas según la CFI, pero veamos cómo va cuando llegue. 😅

Estoy haciendo todo del lado del cliente, y actualmente el análisis toma menos de un segundo y la generación geométrica de la última escena se muestra alrededor de 4 segundos. Soy consciente de que con archivos más grandes este tiempo aumentará; sin embargo, espero poder optimizar el sistema cuando haya cubierto más entidades IFC y pueda cargar IFC desde proyectos reales. 🙂 Estaré ampliando el documento _CONTRIBUTING_, en caso de que alguien quiera profundizar en algo de esto.

@agviegas ¡ eso suena genial!

Intenté clonar la rama principal de su repositorio para probar algunos de los modelos de nuestros clientes, pero desafortunadamente cada uno de ellos produce un error en la consola acerca de que _ExpressId no está definido (no todos los modelos son 100% coherentes cuando se trata de hacer referencia a registros que realmente existe). Creo que algunos programas de CAD no limpian bien las referencias a las propiedades eliminadas.

Podría compartir algunos de estos modelos con ustedes, pero tendremos que hacerlo en privado. Puede comunicarse conmigo en [email protected] si está interesado en más casos de prueba de modelos exportados con ArchiCAD o HiCAD.

@haroldiedema Todavía no he implementado los conjuntos de propiedades, pero la estructura de datos actual consiste en un objeto JS donde las claves son las ID expresas y los valores son los objetos analizados cargados en la memoria. Cada propiedad que era un ID rápido se reemplaza por una referencia al objeto con ese ID. En la implementación actual, cada instancia de _IfcProduct_ con una o más representaciones geométricas tiene una propiedad adicional llamada _Geometry_, que es una matriz de referencias a las geometrías de la escena. Por ejemplo, cada _IfcWallStandardCase_ tiene una propiedad _Geometry_ con una referencia a la _Path_ (a Line ) a al _Body_ (a Mesh ).

Probablemente cada instancia geométrica de Three.js tendrá una propiedad que contiene la ID expresa, por lo que recuperar la entidad ifc cargada en la memoria (y la información relacionada) será fácil (por ejemplo, al hacer clic en las mallas de la escena).

En cuanto a las propiedades definidas por el usuario, habrá una o más _IfcRelDefinesByProperties_ (u otro objeto de relación indirecta) para unir todo. Quizás cada instancia de IfcProduct puede tener un atributo _hasPropertySets_ que contendría una matriz de los conjuntos de propiedades analizados relacionados (he visto este patrón en otras bibliotecas IFC, y esto es lo que estoy haciendo con otras relaciones indirectas como _IfcRelAggregates_). No me preocupa la cantidad de propiedades ya que estarán estructuradas según la CFI, pero veamos cómo va cuando llegue. 😅

Estoy haciendo todo del lado del cliente, y actualmente el análisis toma menos de un segundo y la generación geométrica de la última escena se muestra alrededor de 4 segundos. Soy consciente de que con archivos más grandes este tiempo aumentará; sin embargo, espero poder optimizar el sistema cuando haya cubierto más entidades IFC y pueda cargar IFC desde proyectos reales. 🙂 Estaré ampliando el documento _CONTRIBUTING_, en caso de que alguien quiera profundizar en algo de esto.

Analizar User Defined IFC Property Sets es muy fácil. Tengo un repositorio que hace eso. Mi analizador no es tan sofisticado como el tuyo.

Sin embargo, he notado que algunas propiedades tienden a romper los analizadores sintácticos. No he usado chevrotain , así que no estoy seguro de cómo se mantendría su código. He escrito más sobre estos problemas aquí . Espero que pueda serle de alguna utilidad.

De todos modos, ¡muy buen trabajo hasta ahora! 👍

Actualización: Implementé la aplicación en páginas de Github para facilitar las pruebas de usuario durante todo el desarrollo. Esto incluye navegación receptiva para soporte para dispositivos móviles y tabletas. Además, aquí puede encontrar una implementación alternativa que carga un modelo IFC al inicio; la lógica para limpiar la escena y agregar múltiples IFC aún no está implementada, pero al menos puede ver cómo se ve la navegación. El parsing lo realiza el cliente, por lo que los tiempos de carga dependen del dispositivo utilizado. Mi computadora portátil lo hace en alrededor de 5 segundos, mientras que mi Moto G5 Plus necesita alrededor de 50 segundos para esta escena. Todavía hay clases por implementar antes de cargar un proyecto completo, pero no dude en enviarme cualquier IFC para agregarlos a los archivos de prueba.

¿Fue útil esta página
0 / 5 - 0 calificaciones