44import java .io .PrintWriter ;
55import java .nio .ByteBuffer ;
66import java .nio .ByteOrder ;
7- import java .util .ArrayList ;
8- import java .util .List ;
7+ import java .util .*;
98
109import org .bimserver .emf .IdEObject ;
1110import org .bimserver .emf .IfcModelInterface ;
@@ -46,10 +45,21 @@ public void reset() {
4645 protected boolean write (OutputStream outputStream , ProgressReporter progressReporter ) {
4746 if (getMode () == Mode .BODY ) {
4847 out = new PrintWriter (outputStream );
49- out .println ("[" );
50- writeGeometries ();
51- out .println ();
52- out .println ("]" );
48+ out .println ("{" );
49+ out .println (" \" metadata\" : { \" formatVersion\" : 4.3, \" type\" : \" object\" , \" generator\" : \" BIMserver three.js serializer\" }, " );
50+ out .println (" \" geometries\" : [" );
51+ Map <String , GeometryInfo > geometryData = collectGeometryData ();
52+ writeGeometries (geometryData );
53+ out .println (" ]" );
54+ out .println (" \" object\" : {" );
55+ out .println (" \" uuid\" : \" root\" ," );
56+ out .println (" \" type\" : \" Scene\" ," );
57+ out .println (" \" matrix\" : [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]," );
58+ out .println (" \" children\" : [" );
59+ writeObjects (geometryData );
60+ out .println (" ]" );
61+ out .println (" }" );
62+ out .println ("}" );
5363 out .flush ();
5464
5565 setMode (Mode .FINISHED );
@@ -59,13 +69,11 @@ protected boolean write(OutputStream outputStream, ProgressReporter progressRepo
5969 }
6070 }
6171
62- private void writeGeometry (GeometryData geometryData , IfcRoot ifcRoot ) {
63- out .println (" \" id\" : \" " + ifcRoot .getGlobalId () + "\" , " );
64- out .println (" \" type\" : \" " + ifcRoot .eClass ().getName ().toUpperCase () + "\" , " );
65- out .println (" \" geometry\" : {" );
66- out .println (" \" metadata\" : { \" formatVersion\" : 3 }, " );
67- out .println (" \" materials\" : []," );
68- out .print (" \" vertices\" : [ " );
72+ private void writeGeometry (GeometryData geometryData ) {
73+ out .println (" \" uuid\" : \" " + geometryData .getOid () + "\" , " );
74+ out .println (" \" type\" : \" BufferGeometry\" , " );
75+ out .println (" \" data\" : {" );
76+ out .print (" \" vertices\" : [ " );
6977
7078 List <Float > vertices = getFloatList (geometryData .getVertices ());
7179 if (vertices != null && vertices .size () > 0 ) {
@@ -76,7 +84,7 @@ private void writeGeometry(GeometryData geometryData, IfcRoot ifcRoot) {
7684 }
7785 }
7886
79- out .println (" ], " );
87+ out .println ("], " );
8088 out .print (" \" normals\" : [" );
8189
8290 List <Float > normals = getFloatList (geometryData .getNormals ());
@@ -88,10 +96,9 @@ private void writeGeometry(GeometryData geometryData, IfcRoot ifcRoot) {
8896 }
8997 }
9098
91- out .println (" ]," );
92- out .println (" \" colors\" : [ ]," );
93- out .println (" \" uvs\" : [ ]," );
94- out .print (" \" faces\" : [ " );
99+ out .println ("]," );
100+ out .println (" \" uvs\" : [ ]," );
101+ out .print (" \" faces\" : [ " );
95102
96103 List <Integer > indices = getIntegerList (geometryData .getIndices ());
97104 if (indices != null && indices .size () > 0 ) {
@@ -103,33 +110,70 @@ private void writeGeometry(GeometryData geometryData, IfcRoot ifcRoot) {
103110 }
104111 }
105112
106- out .println (" ]" );
107- out .println (" }" );
108- out .println ();
113+ out .println ("]" );
109114 }
110115
111116 @ SuppressWarnings ("unchecked" )
112- private void writeGeometries () {
117+ private Map <String , GeometryInfo > collectGeometryData () {
118+ Map <String , GeometryInfo > geometryData = new HashMap <String , GeometryInfo >();
113119 Class <IdEObject >[] eClasses = new Class [] {
114120 IfcWall .class , IfcWindow .class , IfcDoor .class , IfcSlab .class , IfcColumn .class ,
115121 org .bimserver .models .ifc4 .IfcWall .class ,org .bimserver .models .ifc4 .IfcWindow .class ,
116122 org .bimserver .models .ifc4 .IfcDoor .class , org .bimserver .models .ifc4 .IfcSlab .class ,
117123 org .bimserver .models .ifc4 .IfcColumn .class
118124 };
119-
120- boolean first = true ;
121125 for (Class <? extends IdEObject > eClass : eClasses ) {
122- for (IdEObject object : model .getAllWithSubTypes (eClass )) {
126+ for (IdEObject object : model .getAllWithSubTypes (eClass )) {
123127 IfcProduct ifcRoot = (IfcProduct ) object ;
124- GeometryInfo geometryInfo = ifcRoot .getGeometry ();
125- if (geometryInfo != null ) {
126- out .println (first ? " {" : " ,{" );
127- first = false ;
128- writeGeometry (geometryInfo .getData (), ifcRoot );
129- out .print (" }" );
130- }
128+ GeometryInfo geometryInfo = ifcRoot .getGeometry ();
129+ if (geometryInfo != null ) {
130+ geometryData .put (ifcRoot .getGlobalId (), geometryInfo );
131+ }
132+ }
133+ }
134+ return geometryData ;
135+ }
136+
137+
138+ private void writeGeometries (Map <String , GeometryInfo > geometryInfos ) {
139+ boolean first = true ;
140+ Set <Long > writtenGeometries = new HashSet <Long >();
141+ for (GeometryInfo geometryInfo : geometryInfos .values ()){
142+ if (!writtenGeometries .contains (geometryInfo .getData ().getOid ())){
143+ out .println (first ? " {" : " ,{" );
144+ first = false ;
145+ writeGeometry (geometryInfo .getData ());
146+ out .print (" }" );
147+ writtenGeometries .add (geometryInfo .getData ().getOid ());
131148 }
132149 }
150+ out .println ();
151+ }
152+
153+ private void writeObjects (Map <String , GeometryInfo > geometryInfos ) {
154+ boolean first = true ;
155+ for (Map .Entry <String , GeometryInfo > geometryEntry : geometryInfos .entrySet ()) {
156+ String guid = geometryEntry .getKey ();
157+ GeometryInfo geometryInfo = geometryEntry .getValue ();
158+ out .println (first ? " {" : " , {" );
159+ writeObject (guid , geometryInfo );
160+ out .print (" }" );
161+ first = false ;
162+ }
163+ out .println ();
164+ }
165+
166+ private void writeObject (String guid , GeometryInfo geometryInfo ) {
167+ out .println (" \" uuid\" : \" " + guid + "\" , " );
168+ out .println (" \" type\" : \" Mesh\" , " );
169+ out .println (" \" geometry\" : \" " + geometryInfo .getData ().getOid () + "\" , " );
170+ out .print ( " \" matrix\" : " );
171+ boolean first = true ;
172+ for (int i : getIntegerList (geometryInfo .getTransformation ())){
173+ out .print (first ? "" : "," );
174+ out .print (i );
175+ first =false ;
176+ }
133177 }
134178
135179 private List <Float > getFloatList (byte [] byteArray ) {
0 commit comments