Three.js: Importador IFC para threejs

Criado em 24 set. 2016  ·  62Comentários  ·  Fonte: mrdoob/three.js

Escrevi um importador ifc 2x3 para threejs. É muito experimental, mas a maioria dos objetos será renderizada.

Isso é algo que pode ser incluído na distribuição? Minha esperança é que alguém o desenvolva ainda mais e, eventualmente, também adicione suporte para ifc4

Exemplo de ifc importado:
ifc-imported

Comentários muito úteis

Eu voto em um PR 😊. THREE.IFCLoader seria uma grande contribuição!

Todos 62 comentários

esqueci de mencionar que depende do ThreeCSG

Nunca ouvi falar desse formato. Onde geralmente é usado?

Tanto quanto eu sei, é usado principalmente no negócio de construção, modelagem de edifícios. Suportado por Autocad, Revit, Tekla e Solibri para mencionar alguns.

Eu vejo eu vejo!
Para que ele precisa do ThreeCSG?

Por exemplo; um objeto Wall (forma extrudada em três) pode ter uma abertura. E a solução mais fácil que encontrei foi usar o ThreeCSG. Também usado em outros casos, como IfcBooleanResult.

Link para a especificação IfcOpeningElement:
http://www.buildingsmart-tech.org/ifc/IFC2x3/TC1/html/ifcproductextension/lexical/ifcopeningelement.htm

você pode referenciar em
http://www.ifcquery.com

@mrdoob , IFC significa Industry Foundation Classes e pretende ser um formato de intercâmbio padrão para projetos de Building Information Model / Management (BIM). Pacotes de software tipicamente relacionados a isso são Revit , ArchiCAD , VisualARQ e alguns outros. Enquanto estou generalizando, o software BIM fornece tipos de objetos padrão, como paredes, lajes, telhados, escadas, janelas, etc., todos orientados por uma definição de família / estilo em que o operador define os parâmetros para o objeto. Portanto, se eu tiver uma parede com uma camada de CMU, Plasterboard e Tile, posso definir a espessura de todas as camadas. Se algo muda, eu mudo a definição de família / estilo, e tudo se atualiza automaticamente! A realidade não é tão mágica! É um formato controverso, já que cada fornecedor de software é livre para brincar com a definição do que uma parede pode constituir na importação / exportação http://buildingsmart.org/compliance/certified-software/.
É um ótimo formato de suporte e agradeço a @kdilayer por configurá-lo. @ johnney88 aquele visualizador está usando threejs?

Sim, o Visualizador usa Threejs.
O arquivo salvo 'ifcquery.min.js' foi escrito por Three.js, mas está codificado.

Posso confirmar que ifc é usado no ConSci. Na verdade, usei um aplicativo conversor ifc para converter os arquivos da minha empresa em .objs com arquivos .mtl e eles leram muito bem. Tirar o intermediário seria muito útil, pois nossos clientes tendem a fazer upload de arquivos ifc de qualquer maneira

@rhairston Um aplicativo conversor
Estou certo?

aqui está um aplicativo conversor ifc?

Obrigado a todos por participarem!

@kdilayer um PR seria ótimo. Por favor, inclua ThreeCSG também 😊

Algum progresso aqui? No momento, estamos convertendo IFC em DAE para uso com three.js e adoraríamos se three.js suportasse IFC diretamente.

Olá kdilayer,

Estou muito interessado em dar uma olhada e levá-lo adiante.

Oi pessoal,

Eu também vi isso https://www.npmjs.com/package/ifc-convert
Com isso você pode converter IFC para DAE, OBJ, STP e IGS.

@kdilayer Algum progresso?

@kdilayer Algum progresso aqui? Isso poupará muitas coisas se three.js puder suportar o formato IFC diretamente.

Ninguém tem novidades?

Eu ajustei o editor para fornecer arquivos ifc.
Algumas imagens em anexo. Trabalho nisso há algum tempo ... atualmente não vi nenhum arquivo IFC 2x3 que não possa ser processado ... o maior arquivo que experimentei tem 180 MB ...
Impressionante.
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

Ei, trabalho incrível!
Isso pode ser acessado diretamente do branch master ou o código ajustado para suporte IFC fica em outro lugar?

Sim! Awsome! Como podemos ter acesso a este código do carregador, por favor? : o

Eu voto em um PR 😊. THREE.IFCLoader seria uma grande contribuição!

Nós adoraríamos esse recurso também, por enquanto, estou convertendo arquivos IFC em obj com https://github.com/IfcOpenShell/IfcOpenShell , mas algumas geometrias mais complicadas ainda não foram analisadas, então às vezes é o objeto, não 100 % completo.

Olá, gostaria de saber se você conseguiu algumas coisas complexas, como portas e transparências, com o carregamento de janelas em seu visualizador e carregador. Parece incrível até agora! Estou curioso para saber se você planeja lançar alguma versão disso em um futuro próximo.

Boa sorte! Obrigado por atualizar.

Olá @kdilayer , podemos ter acesso à sua aplicação?

Estou interessado em ver a diferença de tamanho de arquivo entre os formatos .ifc e three.js.

Obrigado!

@Foosballfan Acho que um IFC não é um formato interessante para o tamanho, já que é muito prolixo. É apenas um formato de troca para software de arquitetura como AutoDesk.
É um padrão do BIM. (peça ao google este termo que é famoso neste tipo de profissão)

@ jean-noelp Obrigado pela resposta.

Tenho um arquivo ifc para um edifício de 34 MB e estou tentando exibir esses dados na web com o menor tamanho de download possível.

Com o Unity WebGL, posso reduzir para cerca de 11 MB, mas gostaria de ver se isso é possível com WebGL mais puro usando Three.js. Espero conseguir um tamanho de download ainda menor.

Você tem alguma experiência com situação semelhante?

@Foosballfan para minimizar o tamanho do arquivo, as etapas que eu tentaria são:

  1. converter para OBJ
  2. percorrer obj-simplify
  3. comprimir o OBJ com Draco
  4. carregar com THREE.DRACOLoader

Se o arquivo não pode ser convertido para OBJ ou outro formato, então provavelmente não há muito que você possa fazer além de simplificar o modelo ou usar gzip ... "WebGL puro usando three.js" é uma maneira de renderizar o arquivo, mas você ainda deve usar um formato ou outro para carregar o arquivo primeiro.

@donmccurdy Isso parece ótimo, obrigado!

Vou tentar e ver como fica.

Originalmente, desisti do obj, pois o que fiz é de 220 MB do arquivo de 34 MB.

Encerrando o problema, já que @kdilayer obviamente não está disposto a compartilhar sua implementação. Eu adicionei IFCLoader como uma tarefa para a lista de desejos do carregador em # 5524.

Desde que não haja IFCLoader , tente converter IFC arquivos para outros formatos como OBJ . Parece que a seguinte ferramenta pode realizar essa conversão: http://ifcopenshell.org/ifcobj.html

Veja também https://github.com/IfcOpenShell/IfcOpenShell

@Foosballfan : IFC é a maneira mais eficiente de compactar geometria. O problema é que a abordagem processual necessária para renderizá-lo não é realmente compatível com triângulos. Um IFC de 34 MB pode facilmente extrair até 4 GB de fluxos triangulares. A IFC descreve um cotovelo com apenas 4 vértices, mas serão necessários centenas de triângulos para renderizá-lo. Uma olhada nas renderizações do OP e posso dizer que não há colher. Claro, ele pode fazer linhas retas e formas toroidais de um eixo. Mas, a especificação IFC inclui definições de superfícies varridas por duas splines de Bezier. Portanto, são 8 vértices 3D definindo um conjunto praticamente infinito de triângulos. Os arquitetos adoram essa ferramenta, mas mesmo renderizar uma representação 2D dela em um computador é problemático, uma vez que a fórmula não permite a abordagem f(x) = y .
Aqui, dê uma olhada nas especificações oficiais da IFC: http://www.buildingsmart-tech.org/ifc/IFC4/final/html/schema/ifcgeometryresource/lexical/ifcbsplinesurface.htm

@kdilayer você ainda está ativo no github? gostaria de compartilhar sua implementação? : ok_hand: Obrigado!

A abordagem que me decidi foi usar o BimServer para transmitir os dados binários IFC e, em seguida, construí-los no ThreeJS. O tamanho do download pelo web socket é satisfatório e tenho controle total sobre o modelo do Three.

Você pode dar uma olhada em como o BimViewer funciona como ponto de partida.

alguma resposta?

@ Joao-b4 Sobre o quê?

sobre um possível carregador IFC

Ah, acho que depende de @kdilayer ...

Acredito que @kdilayer não terá nada, visto que já se passaram 3 anos desde a publicação e nenhuma resposta, nem atividade em seu perfil.
Não entendo como funciona a criação de um carregador, e tenho um pouco de conhecimento na biblioteca, trabalho com isso há pouco tempo, gostaria de ter alguns links para criar um carregador, posso obter disposição e conhecimento suficiente em o futuro.

Descrevi aqui um andaime básico de THREE.IFCLoader . A parte mais difícil ao escrever um carregador é realmente entender o respectivo formato 3D. Só então você pode analisar o formato e transformar a geometria e / ou os dados do material em entidades three.js (por exemplo, THREE.BufferGeometry ). Eu recomendo estudar um carregador mais ou menos simples como THREE.PLYLoader para entender este processo. E, claro, o padrão IFC (https://www.iso.org/standard/51622.html)

obrigado, um carregador ifc seria muito útil, e eu preciso de um agora, estou usando o que eles mencionaram acima, para converter para OBJ, mas não acho que seja a melhor maneira

Isso foi há 1,5 anos, então minha memória está enferrujada, mas acredito que nossa solução foi usar o servidor bim para entregar as geometrias do servidor e, em seguida, usar o Três no front-end para lidar com a renderização.

Demorou um pouco, mas eventualmente funcionou.

IfcConvert é um IfcConverter para Node.js. Ele converte de .ifc para .dae, .obj, .stp e .igs. Ainda não tentei, mas se funcionar conforme descrito, acho que não precisaríamos mais de nenhum carregador .ifc em Three.js, certo?
.ifc contém muito mais informações do que apenas o modelo 3D, mas no que diz respeito ao Three.js, apenas o modelo 3D deve ser importado.
Para um exportador, isso seria diferente, pois pode-se querer exportar sua própria biblioteca BIM em um arquivo .ifc, junto com o modelo 3D exportado.
Isso faz sentido ?

Ainda pode ser interessante carregar IFC diretamente no navegador sem a necessidade de uma ferramenta de conversão separada. No entanto, a ferramenta node.js mencionada é apenas um invólucro em torno de IfcOpenShell . Então não faz algo realmente novo ...

Acho que o fluxo de trabalho de importação por meio do IfcConverter pode ser bom!

Pelo contrário, a exportação ifc não faz nenhum sentido para mim, porque você perde todos os dados ifc relevantes (componentes arquitetônicos, partes interessadas BIM ...) em um visualizador lambda Three.js, a menos que seja criado um Editor Ifc com Three.js .

@ Mugen87 Bem, o principal valor agregado é o pacote Node, pois até onde sei o IfcOpenShell é uma ferramenta CLI online.

@ jean-noelp Você está certo. Eu não quis dizer uma exportação do "arquivo .ifc mestre", mas sim um "arquivo .ifc de biblioteca" que os stakeholders BIM poderiam importar em seu próprio "arquivo .ifc mestre". Por exemplo, você é um fabricante de portas de garagem, use Three.js para planejar a instalação para seus clientes (arquitetos, por exemplo) e exporte a biblioteca BIM contendo seus objetos BIM (normalmente a porta de garagem). Percebes o que quero dizer ? Mas, de qualquer forma, não haveria maneira de ter esse exportador construído em Three.js, pois cada caso de uso particular é muito específico (eu acho).

Eu encontro uma FERRAMENTA, o IFC pode ser resolvido,
Não é grátis,
Mas a análise da estrutura IFC é gratuita e de código aberto
http://www.apstex.com/

Saudações, não há notícias de @kdilayer, certo? ele nunca lançou o código-fonte?

?

------------------ A mensagem original ------------------
De: "Daniel Ramos" < notificaçõ[email protected]>;
Prazo de entrega: 28 de maio de 2020 (quinta-feira) 22h08
Para: "mrdoob / three.js"[email protected]>;
Cc: " Deixe a rede de peixes" < [email protected]>;
Assunto: Re: [mrdoob / three.js] importador IFC para threejs (# 9764)

Saudações, não há notícias de @kdilayer, certo? Ele nunca lançou o código-fonte?

-
Você está recebendo isto porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub ou cancele a inscrição.

alguma notícia sobre isso?

Ei! Há poucos dias comecei a implementar um analisador IFC em JS com a ideia de aplicá-lo ao Three.js. Este é um projeto pessoal que faço nas minhas horas vagas, por isso não tenho ideia de quanto tempo vai demorar. No entanto, eu vi este tópico hoje e pensei que você pode achar interessante. Você pode encontrar aqui .

@agviegas ansioso pelo que você fará com ele! um PR poderia ser muito bem-vindo

De fato! @agviegas podemos ter mais pessoas ajudando nisso se você fizer uma RP com ele 😍

Infelizmente não consegui liberar meu trabalho no ifcimporter, mas posso ajudar @agviegas

@mrdoob Parece ótimo. Ainda estou trabalhando nas principais funcionalidades do analisador; ele já pode carregar todos os elementos da estrutura espacial e irei começar a construir a geometria em breve. Suponho que o código também precise ser adaptado a isso antes de fazer o PR. Existe alguma referência a verificar para preparar o código para o PR? Podemos fazer isso sempre que você quiser. Qualquer ajuda em relação a isso será bem-vinda.

Por outro lado, o formato IFC é muito fácil de implementar, embora possa ser um pouco intimidante devido à dureza da documentação oficial. Considero que conheço o formato da IFC relativamente bem, então, se alguém estiver interessado em participar, com certeza podemos prepará-lo mais cedo. 🙂

Captura

Suponho que o código também precise ser adaptado a isso antes de fazer o PR.

Sim, ele deve usar a mesma interface que os outros carregadores usam. Talvez o MD2Loader seja a referência mais simples agora.

Não se preocupe em ter tudo perfeito para o PR. Você pode enviar o que você tem como rascunho e podemos ajudar a garantir que o código se encaixa no resto.

Depois de vários tropeços e lutas com o formato já existem alguns resultados. Implementei a primeira versão do analisador, bem como algumas das entidades geométricas (incluindo extrusões e b-reps). Ainda há muito a ser feito, mas estou feliz com os resultados até agora. A imagem abaixo mostra um pequeno IFC gerado pelo Revit funcionando perfeitamente no Chrome. Cada instância geométrica tem as informações IFC analisadas associadas (na verdade, na cena abaixo cada instância tem um material dependendo de sua categoria / ifcclass), portanto, criar filtros usando valores de propriedades (Psets e Qsets) não deve ser difícil de arquivar a partir deste ponto . Quaisquer ideias ou sugestões são bem-vindas. 🙂

20201124_screenshot

@agviegas Excelente!

@agviegas Muito bem!

Quanto a ideias para gestão de propriedades. Como você está armazenando isso agora? Assim como userData nas malhas ou geometria, suponho?

A maioria de nossos clientes usa softwares como HiCad ou ArchiCAD para sua modelagem e eles armazenam MUITAS informações que são muito importantes para os trabalhadores da construção (densidade térmica, resistência ao vento, medidas, pesos, etc. etc.).

Também estou muito curioso sobre a velocidade de análise / carregamento. Os modelos com os quais testei minha implementação levam cerca de 5 segundos para serem analisados, mas para gerar a geometria, o processo leva quase 2 minutos para ser convertido em um modelo DAE. (Estou convertendo-o do lado do servidor devido à falta de tempo e experiência da minha parte: sweat_smile :, é por isso que estou tão animado para que este carregador funcione 'nativamente')

@haroldiedema Eu não implementei os conjuntos de propriedades ainda, mas a estrutura de dados atual consiste em um objeto JS onde as chaves são os IDs expressos e os valores são os objetos analisados ​​carregados na memória. Cada propriedade que era um ID expresso é substituída por uma referência ao objeto com aquele ID. Na implementação atual, cada instância de _IfcProduct_ com uma ou mais representações geométricas tem uma propriedade adicional chamada _Geometry_, que é uma matriz de referências às geometrias da cena. Por exemplo, cada _IfcWallStandardCase_ tem uma propriedade _Geometry_ com uma referência ao _Path_ (a Line ) a ao _Body_ (a Mesh ).

Provavelmente, cada instância geométrica de Three.js terá uma propriedade contendo o ID expresso, então encontrar de volta a entidade ifc carregada na memória (e as informações relacionadas) será fácil (por exemplo, ao clicar nas malhas na cena).

Quanto às propriedades definidas pelo usuário, haverá um ou mais _IfcRelDefinesByProperties_ (ou outro objeto de relacionamento indireto) para ligar tudo junto. Talvez cada instância de IfcProduct possa ter um atributo _hasPropertySets_ que conteria uma matriz dos conjuntos de propriedades analisadas relacionadas (vi esse padrão em outras bibliotecas IFC e é isso que estou fazendo com outros relacionamentos indiretos, como _IfcRelAggregates_). Não estou preocupado com a quantidade de imóveis pois estarão estruturados de acordo com o IFC, mas vamos ver como fica quando eu chegar lá. 😅

Estou fazendo tudo do lado do cliente, e atualmente a análise leva menos de um segundo e a geração geométrica da última cena mostrada em cerca de 4 segundos. Estou ciente de que com arquivos maiores esse tempo aumentará; no entanto, espero ser capaz de otimizar o sistema quando tiver coberto mais entidades da IFC e puder carregar IFCs de projetos reais. 🙂 Estarei estendendo o documento _CONTRIBUINDO_, caso alguém queira se aprofundar em alguma coisa.

@agviegas isso parece incrível!

Eu tentei clonar o branch principal de seu repo para testar alguns de nossos modelos de clientes, mas infelizmente cada um deles produz um erro no console sobre _ExpressId é indefinido (nem todos os modelos são 100% coerentes quando se trata de registros de referência que realmente existe). Acho que alguns softwares CAD não limpam bem as referências às propriedades removidas.

Eu poderia compartilhar alguns desses modelos com você, mas teremos que fazer isso em particular. Você pode entrar em contato comigo em

@haroldiedema Eu não implementei os conjuntos de propriedades ainda, mas a estrutura de dados atual consiste em um objeto JS onde as chaves são os IDs expressos e os valores são os objetos analisados ​​carregados na memória. Cada propriedade que era um ID expresso é substituída por uma referência ao objeto com aquele ID. Na implementação atual, cada instância de _IfcProduct_ com uma ou mais representações geométricas tem uma propriedade adicional chamada _Geometry_, que é uma matriz de referências às geometrias da cena. Por exemplo, cada _IfcWallStandardCase_ tem uma propriedade _Geometry_ com uma referência ao _Path_ (a Line ) a ao _Body_ (a Mesh ).

Provavelmente, cada instância geométrica de Three.js terá uma propriedade contendo o ID expresso, então encontrar de volta a entidade ifc carregada na memória (e as informações relacionadas) será fácil (por exemplo, ao clicar nas malhas na cena).

Quanto às propriedades definidas pelo usuário, haverá um ou mais _IfcRelDefinesByProperties_ (ou outro objeto de relacionamento indireto) para ligar tudo junto. Talvez cada instância de IfcProduct possa ter um atributo _hasPropertySets_ que conteria uma matriz dos conjuntos de propriedades analisadas relacionadas (vi esse padrão em outras bibliotecas IFC e é isso que estou fazendo com outros relacionamentos indiretos, como _IfcRelAggregates_). Não estou preocupado com a quantidade de imóveis pois estarão estruturados de acordo com o IFC, mas vamos ver como fica quando eu chegar lá. 😅

Estou fazendo tudo do lado do cliente, e atualmente a análise leva menos de um segundo e a geração geométrica da última cena mostrada em cerca de 4 segundos. Estou ciente de que com arquivos maiores esse tempo aumentará; no entanto, espero ser capaz de otimizar o sistema quando tiver coberto mais entidades da IFC e puder carregar IFCs de projetos reais. 🙂 Estarei estendendo o documento _CONTRIBUINDO_, caso alguém queira se aprofundar em alguma coisa.

Analisar User Defined IFC Property Sets é muito fácil. Eu tenho um repo que faz isso. Meu analisador não é tão sofisticado quanto o seu.

No entanto, percebi que algumas propriedades tendem a interromper os analisadores. Não usei o chevrotain , então não tenho certeza de como seu código se comportaria. Escrevi mais sobre esses problemas aqui . Espero que possa ser útil para você.

De qualquer forma, muito bom trabalho até agora! 👍

Atualização: Implantei o aplicativo nas páginas do Github para facilitar o teste do usuário durante o desenvolvimento. Isso inclui navegação responsiva para suporte a celulares e tablets. Além disso, aqui você pode encontrar uma implementação alternativa que carrega um modelo IFC na inicialização; a lógica para limpar a cena e adicionar vários IFCs ainda não foi implementada, mas pelo menos você pode ver como fica a navegação. A análise é feita pelo cliente, portanto os tempos de carregamento dependem do dispositivo utilizado. Meu laptop faz isso em cerca de 5 segundos, enquanto meu Moto G5 Plus precisa de cerca de 50 segundos para essa cena. Ainda há classes a serem implementadas antes de carregar um projeto completo, mas sinta-se à vontade para me enviar quaisquer IFCs para adicioná-los aos arquivos de teste.

Esta página foi útil?
0 / 5 - 0 avaliações