@@ -11,6 +11,9 @@ import { ConvertThreeGeometryToMesh } from '../threejs/threeutils.js';
11
11
import { ImporterBase } from './importerbase.js' ;
12
12
import { UpdateMaterialTransparency } from './importerutils.js' ;
13
13
import { TextureMap } from '../model/material.js' ;
14
+ import { Mesh } from '../model/mesh.js' ;
15
+ import { Line } from '../model/line.js' ;
16
+ import { ArrayToCoord3D } from '../geometry/coord3d.js' ;
14
17
15
18
export class Importer3dm extends ImporterBase
16
19
{
@@ -130,17 +133,16 @@ export class Importer3dm extends ImporterBase
130
133
return ;
131
134
}
132
135
133
- let rhinoMesh = null ;
134
- let deleteMesh = false ;
135
-
136
136
if ( objectType === this . rhino . ObjectType . Mesh ) {
137
- rhinoMesh = rhinoGeometry ;
138
- deleteMesh = false ;
137
+ this . ImportRhinoGeometryAsMesh ( rhinoDoc , rhinoGeometry , rhinoObject , rhinoInstanceReferences ) ;
139
138
} else if ( objectType === this . rhino . ObjectType . Extrusion ) {
140
- rhinoMesh = rhinoGeometry . getMesh ( this . rhino . MeshType . Any ) ;
141
- deleteMesh = true ;
139
+ let rhinoMesh = rhinoGeometry . getMesh ( this . rhino . MeshType . Any ) ;
140
+ if ( rhinoMesh !== null ) {
141
+ this . ImportRhinoGeometryAsMesh ( rhinoDoc , rhinoMesh , rhinoObject , rhinoInstanceReferences ) ;
142
+ rhinoMesh . delete ( ) ;
143
+ }
142
144
} else if ( objectType === this . rhino . ObjectType . Brep ) {
143
- rhinoMesh = new this . rhino . Mesh ( ) ;
145
+ let rhinoMesh = new this . rhino . Mesh ( ) ;
144
146
let faces = rhinoGeometry . faces ( ) ;
145
147
for ( let i = 0 ; i < faces . count ; i ++ ) {
146
148
let face = faces . get ( i ) ;
@@ -153,11 +155,17 @@ export class Importer3dm extends ImporterBase
153
155
}
154
156
faces . delete ( ) ;
155
157
rhinoMesh . compact ( ) ;
156
- deleteMesh = true ;
158
+ this . ImportRhinoGeometryAsMesh ( rhinoDoc , rhinoMesh , rhinoObject , rhinoInstanceReferences ) ;
159
+ rhinoMesh . delete ( ) ;
157
160
} else if ( objectType === this . rhino . ObjectType . SubD ) {
158
161
rhinoGeometry . subdivide ( 3 ) ;
159
- rhinoMesh = this . rhino . Mesh . createFromSubDControlNet ( rhinoGeometry ) ;
160
- deleteMesh = true ;
162
+ let rhinoMesh = this . rhino . Mesh . createFromSubDControlNet ( rhinoGeometry ) ;
163
+ if ( rhinoMesh !== null ) {
164
+ this . ImportRhinoGeometryAsMesh ( rhinoDoc , rhinoMesh , rhinoObject , rhinoInstanceReferences ) ;
165
+ rhinoMesh . delete ( ) ;
166
+ }
167
+ } else if ( objectType === this . rhino . ObjectType . Curve ) {
168
+ this . ImportRhinoGeometryAsMesh ( rhinoDoc , rhinoGeometry , rhinoObject , rhinoInstanceReferences ) ;
161
169
} else if ( objectType === this . rhino . ObjectType . InstanceReference ) {
162
170
let parentDefinitionId = rhinoGeometry . parentIdefId ;
163
171
if ( this . instanceIdToDefinition . has ( parentDefinitionId ) ) {
@@ -174,22 +182,58 @@ export class Importer3dm extends ImporterBase
174
182
}
175
183
}
176
184
}
177
-
178
- if ( rhinoMesh !== null ) {
179
- this . ImportRhinoMesh ( rhinoDoc , rhinoMesh , rhinoObject , rhinoInstanceReferences ) ;
180
- if ( deleteMesh ) {
181
- rhinoMesh . delete ( ) ;
182
- }
183
- }
184
185
}
185
186
186
- ImportRhinoMesh ( rhinoDoc , rhinoMesh , rhinoObject , rhinoInstanceReferences )
187
+ ImportRhinoGeometryAsMesh ( rhinoDoc , rhinoGeometry , rhinoObject , rhinoInstanceReferences )
187
188
{
188
- let rhinoAttributes = rhinoObject . attributes ( ) ;
189
+ function GetSegmentedCurveLine ( curveGeometry )
190
+ {
191
+ let domainLength = curveGeometry . domain [ 1 ] - curveGeometry . domain [ 0 ] ;
192
+ let segmentCount = Math . max ( parseInt ( domainLength / 0.2 , 10 ) , 1 ) ;
193
+ let segmentLength = domainLength / segmentCount ;
194
+ let vertices = [ ] ;
195
+ for ( let i = 0 ; i <= segmentCount ; i ++ ) {
196
+ if ( i === segmentCount && curveGeometry . isClosed ) {
197
+ vertices . push ( vertices [ 0 ] ) ;
198
+ } else {
199
+ let position = rhinoGeometry . pointAt ( curveGeometry . domain [ 0 ] + i * segmentLength ) ;
200
+ vertices . push ( mesh . AddVertex ( ArrayToCoord3D ( position ) ) ) ;
201
+ }
202
+ }
203
+ return new Line ( vertices ) ;
204
+ }
189
205
190
206
let materialIndex = this . GetMaterialIndex ( rhinoDoc , rhinoObject , rhinoInstanceReferences ) ;
191
- let threeJson = rhinoMesh . toThreejsJSON ( ) ;
192
- let mesh = ConvertThreeGeometryToMesh ( threeJson . data , materialIndex , null ) ;
207
+ let mesh = null ;
208
+ if ( rhinoGeometry . objectType === this . rhino . ObjectType . Mesh ) {
209
+ let threeJson = rhinoGeometry . toThreejsJSON ( ) ;
210
+ mesh = ConvertThreeGeometryToMesh ( threeJson . data , materialIndex , null ) ;
211
+ } else if ( rhinoGeometry . objectType === this . rhino . ObjectType . Curve ) {
212
+ mesh = new Mesh ( ) ;
213
+ if ( rhinoGeometry instanceof this . rhino . LineCurve ) {
214
+ let fromVertex = mesh . AddVertex ( ArrayToCoord3D ( rhinoGeometry . line . from ) ) ;
215
+ let toVertex = mesh . AddVertex ( ArrayToCoord3D ( rhinoGeometry . line . to ) ) ;
216
+ let line = new Line ( [ fromVertex , toVertex ] ) ;
217
+ line . SetMaterial ( materialIndex ) ;
218
+ mesh . AddLine ( line ) ;
219
+ } else if ( rhinoGeometry instanceof this . rhino . NurbsCurve ) {
220
+ let line = GetSegmentedCurveLine ( rhinoGeometry ) ;
221
+ line . SetMaterial ( materialIndex ) ;
222
+ mesh . AddLine ( line ) ;
223
+ } else if ( rhinoGeometry instanceof this . rhino . ArcCurve ) {
224
+ let line = GetSegmentedCurveLine ( rhinoGeometry ) ;
225
+ line . SetMaterial ( materialIndex ) ;
226
+ mesh . AddLine ( line ) ;
227
+ }
228
+ }
229
+
230
+ // TODO: BezierCurve, PolyCurve
231
+
232
+ if ( mesh === null ) {
233
+ return null ;
234
+ }
235
+
236
+ let rhinoAttributes = rhinoObject . attributes ( ) ;
193
237
mesh . SetName ( rhinoAttributes . name ) ;
194
238
195
239
let userStrings = rhinoAttributes . getUserStrings ( ) ;
@@ -234,6 +278,15 @@ export class Importer3dm extends ImporterBase
234
278
let layerMaterialIndex = layer . renderMaterialIndex ;
235
279
if ( layerMaterialIndex > - 1 ) {
236
280
return rhinoDoc . materials ( ) . get ( layerMaterialIndex ) ;
281
+ } else {
282
+ // use layer color only in case of curves
283
+ let rhinoGeometry = rhinoObject . geometry ( ) ;
284
+ if ( rhinoGeometry . objectType === rhino . ObjectType . Curve ) {
285
+ let material = new rhino . Material ( ) ;
286
+ material . name = layer . name ;
287
+ material . diffuseColor = layer . color ;
288
+ return material ;
289
+ }
237
290
}
238
291
}
239
292
} else if ( rhinoAttributes . materialSource === rhino . ObjectMaterialSource . MaterialFromParent ) {
0 commit comments