51
51
#include < vtkQuadraticWedge.h>
52
52
#include < vtkTetra.h>
53
53
#include < vtkTriangle.h>
54
+ #include < vtkUnsignedCharArray.h>
54
55
#include < vtkUnstructuredGrid.h>
55
56
#include < vtkWedge.h>
56
57
#include < vtkXMLPUnstructuredGridReader.h>
@@ -309,10 +310,8 @@ void exportFemMeshFaces(vtkSmartPointer<vtkUnstructuredGrid> grid,
309
310
{
310
311
Base::Console ().Log (" Start: VTK mesh builder faces.\n " );
311
312
312
- vtkSmartPointer<vtkCellArray> triangleArray = vtkSmartPointer<vtkCellArray>::New ();
313
- vtkSmartPointer<vtkCellArray> quadTriangleArray = vtkSmartPointer<vtkCellArray>::New ();
314
- vtkSmartPointer<vtkCellArray> quadArray = vtkSmartPointer<vtkCellArray>::New ();
315
- vtkSmartPointer<vtkCellArray> quadQuadArray = vtkSmartPointer<vtkCellArray>::New ();
313
+ vtkSmartPointer<vtkCellArray> elemArray = vtkSmartPointer<vtkCellArray>::New ();
314
+ std::vector<int > types;
316
315
317
316
for (; aFaceIter->more ();) {
318
317
const SMDS_MeshFace* aFace = aFaceIter->next ();
@@ -324,7 +323,8 @@ void exportFemMeshFaces(vtkSmartPointer<vtkUnstructuredGrid> grid,
324
323
tria->GetPointIds ()->SetId (1 , aFace->GetNode (1 )->GetID () - 1 );
325
324
tria->GetPointIds ()->SetId (2 , aFace->GetNode (2 )->GetID () - 1 );
326
325
327
- triangleArray->InsertNextCell (tria);
326
+ elemArray->InsertNextCell (tria);
327
+ types.push_back (VTK_TRIANGLE);
328
328
}
329
329
// quad
330
330
else if (aFace->NbNodes () == 4 ) {
@@ -334,7 +334,8 @@ void exportFemMeshFaces(vtkSmartPointer<vtkUnstructuredGrid> grid,
334
334
quad->GetPointIds ()->SetId (2 , aFace->GetNode (2 )->GetID () - 1 );
335
335
quad->GetPointIds ()->SetId (3 , aFace->GetNode (3 )->GetID () - 1 );
336
336
337
- quadArray->InsertNextCell (quad);
337
+ elemArray->InsertNextCell (quad);
338
+ types.push_back (VTK_QUAD);
338
339
}
339
340
// quadratic triangle
340
341
else if (aFace->NbNodes () == 6 ) {
@@ -346,7 +347,9 @@ void exportFemMeshFaces(vtkSmartPointer<vtkUnstructuredGrid> grid,
346
347
tria->GetPointIds ()->SetId (3 , aFace->GetNode (3 )->GetID () - 1 );
347
348
tria->GetPointIds ()->SetId (4 , aFace->GetNode (4 )->GetID () - 1 );
348
349
tria->GetPointIds ()->SetId (5 , aFace->GetNode (5 )->GetID () - 1 );
349
- quadTriangleArray->InsertNextCell (tria);
350
+
351
+ elemArray->InsertNextCell (tria);
352
+ types.push_back (VTK_QUADRATIC_TRIANGLE);
350
353
}
351
354
// quadratic quad
352
355
else if (aFace->NbNodes () == 8 ) {
@@ -360,26 +363,16 @@ void exportFemMeshFaces(vtkSmartPointer<vtkUnstructuredGrid> grid,
360
363
quad->GetPointIds ()->SetId (6 , aFace->GetNode (6 )->GetID () - 1 );
361
364
quad->GetPointIds ()->SetId (7 , aFace->GetNode (7 )->GetID () - 1 );
362
365
363
- quadQuadArray->InsertNextCell (quad);
366
+ elemArray->InsertNextCell (quad);
367
+ types.push_back (VTK_QUADRATIC_QUAD);
364
368
}
365
369
else {
366
- throw std::runtime_error (" Face not yet supported by FreeCAD's VTK mesh builder\n " );
370
+ throw Base::TypeError (" Face not yet supported by FreeCAD's VTK mesh builder\n " );
367
371
}
368
372
}
369
- if (triangleArray->GetNumberOfCells () > 0 ) {
370
- grid->SetCells (VTK_TRIANGLE, triangleArray);
371
- }
372
-
373
- if (quadArray->GetNumberOfCells () > 0 ) {
374
- grid->SetCells (VTK_QUAD, quadArray);
375
- }
376
373
377
- if (quadTriangleArray->GetNumberOfCells () > 0 ) {
378
- grid->SetCells (VTK_QUADRATIC_TRIANGLE, quadTriangleArray);
379
- }
380
-
381
- if (quadQuadArray->GetNumberOfCells () > 0 ) {
382
- grid->SetCells (VTK_QUADRATIC_QUAD, quadQuadArray);
374
+ if (elemArray->GetNumberOfCells () > 0 ) {
375
+ grid->SetCells (types.data (), elemArray);
383
376
}
384
377
385
378
Base::Console ().Log (" End: VTK mesh builder faces.\n " );
@@ -390,14 +383,8 @@ void exportFemMeshCells(vtkSmartPointer<vtkUnstructuredGrid> grid,
390
383
{
391
384
Base::Console ().Log (" Start: VTK mesh builder volumes.\n " );
392
385
393
- vtkSmartPointer<vtkCellArray> tetraArray = vtkSmartPointer<vtkCellArray>::New ();
394
- vtkSmartPointer<vtkCellArray> pyramidArray = vtkSmartPointer<vtkCellArray>::New ();
395
- vtkSmartPointer<vtkCellArray> wedgeArray = vtkSmartPointer<vtkCellArray>::New ();
396
- vtkSmartPointer<vtkCellArray> hexaArray = vtkSmartPointer<vtkCellArray>::New ();
397
- vtkSmartPointer<vtkCellArray> quadTetraArray = vtkSmartPointer<vtkCellArray>::New ();
398
- vtkSmartPointer<vtkCellArray> quadPyramidArray = vtkSmartPointer<vtkCellArray>::New ();
399
- vtkSmartPointer<vtkCellArray> quadWedgeArray = vtkSmartPointer<vtkCellArray>::New ();
400
- vtkSmartPointer<vtkCellArray> quadHexaArray = vtkSmartPointer<vtkCellArray>::New ();
386
+ vtkSmartPointer<vtkCellArray> elemArray = vtkSmartPointer<vtkCellArray>::New ();
387
+ std::vector<int > types;
401
388
402
389
for (; aVolIter->more ();) {
403
390
const SMDS_MeshVolume* aVol = aVolIter->next ();
@@ -409,7 +396,9 @@ void exportFemMeshCells(vtkSmartPointer<vtkUnstructuredGrid> grid,
409
396
cell->GetPointIds ()->SetId (1 , aVol->GetNode (1 )->GetID () - 1 );
410
397
cell->GetPointIds ()->SetId (2 , aVol->GetNode (2 )->GetID () - 1 );
411
398
cell->GetPointIds ()->SetId (3 , aVol->GetNode (3 )->GetID () - 1 );
412
- tetraArray->InsertNextCell (cell);
399
+
400
+ elemArray->InsertNextCell (cell);
401
+ types.push_back (VTK_TETRA);
413
402
}
414
403
else if (aVol->NbNodes () == 5 ) { // pyra5
415
404
Base::Console ().Log (" Volume pyra5\n " );
@@ -419,7 +408,9 @@ void exportFemMeshCells(vtkSmartPointer<vtkUnstructuredGrid> grid,
419
408
cell->GetPointIds ()->SetId (2 , aVol->GetNode (2 )->GetID () - 1 );
420
409
cell->GetPointIds ()->SetId (3 , aVol->GetNode (3 )->GetID () - 1 );
421
410
cell->GetPointIds ()->SetId (4 , aVol->GetNode (4 )->GetID () - 1 );
422
- pyramidArray->InsertNextCell (cell);
411
+
412
+ elemArray->InsertNextCell (cell);
413
+ types.push_back (VTK_PYRAMID);
423
414
}
424
415
else if (aVol->NbNodes () == 6 ) { // penta6
425
416
Base::Console ().Log (" Volume penta6\n " );
@@ -430,7 +421,9 @@ void exportFemMeshCells(vtkSmartPointer<vtkUnstructuredGrid> grid,
430
421
cell->GetPointIds ()->SetId (3 , aVol->GetNode (3 )->GetID () - 1 );
431
422
cell->GetPointIds ()->SetId (4 , aVol->GetNode (4 )->GetID () - 1 );
432
423
cell->GetPointIds ()->SetId (5 , aVol->GetNode (5 )->GetID () - 1 );
433
- wedgeArray->InsertNextCell (cell);
424
+
425
+ elemArray->InsertNextCell (cell);
426
+ types.push_back (VTK_WEDGE);
434
427
}
435
428
else if (aVol->NbNodes () == 8 ) { // hexa8
436
429
Base::Console ().Log (" Volume hexa8\n " );
@@ -443,33 +436,40 @@ void exportFemMeshCells(vtkSmartPointer<vtkUnstructuredGrid> grid,
443
436
cell->GetPointIds ()->SetId (5 , aVol->GetNode (5 )->GetID () - 1 );
444
437
cell->GetPointIds ()->SetId (6 , aVol->GetNode (6 )->GetID () - 1 );
445
438
cell->GetPointIds ()->SetId (7 , aVol->GetNode (7 )->GetID () - 1 );
446
- hexaArray->InsertNextCell (cell);
439
+
440
+ elemArray->InsertNextCell (cell);
441
+ types.push_back (VTK_HEXAHEDRON);
447
442
}
448
443
else if (aVol->NbNodes () == 10 ) { // tetra10
449
444
Base::Console ().Log (" Volume tetra10\n " );
450
- vtkSmartPointer<vtkQuadraticTetra> tetra = vtkSmartPointer<vtkQuadraticTetra>::New ();
445
+ vtkSmartPointer<vtkQuadraticTetra> cell = vtkSmartPointer<vtkQuadraticTetra>::New ();
451
446
for (int i = 0 ; i < 10 ; i++) {
452
- tetra ->GetPointIds ()->SetId (i, aVol->GetNode (i)->GetID () - 1 );
447
+ cell ->GetPointIds ()->SetId (i, aVol->GetNode (i)->GetID () - 1 );
453
448
}
454
- quadTetraArray->InsertNextCell (tetra);
449
+
450
+ elemArray->InsertNextCell (cell);
451
+ types.push_back (VTK_QUADRATIC_TETRA);
455
452
}
456
453
457
454
else if (aVol->NbNodes () == 13 ) { // pyra13
458
455
Base::Console ().Log (" Volume pyra13\n " );
459
456
vtkSmartPointer<vtkQuadraticPyramid> cell = vtkSmartPointer<vtkQuadraticPyramid>::New ();
460
457
for (int i = 0 ; i < 13 ; i++) {
461
458
cell->GetPointIds ()->SetId (i, aVol->GetNode (i)->GetID () - 1 );
462
- // Base::Console().Log("node ids: %i\n", aVol->GetNode(i)->GetID()-1);
463
459
}
464
- quadPyramidArray->InsertNextCell (cell);
460
+
461
+ elemArray->InsertNextCell (cell);
462
+ types.push_back (VTK_QUADRATIC_PYRAMID);
465
463
}
466
464
else if (aVol->NbNodes () == 15 ) { // penta15
467
465
Base::Console ().Log (" Volume penta15\n " );
468
466
vtkSmartPointer<vtkQuadraticWedge> cell = vtkSmartPointer<vtkQuadraticWedge>::New ();
469
467
for (int i = 0 ; i < 15 ; i++) {
470
468
cell->GetPointIds ()->SetId (i, aVol->GetNode (i)->GetID () - 1 );
471
469
}
472
- quadWedgeArray->InsertNextCell (cell);
470
+
471
+ elemArray->InsertNextCell (cell);
472
+ types.push_back (VTK_QUADRATIC_WEDGE);
473
473
}
474
474
else if (aVol->NbNodes () == 20 ) { // hexa20
475
475
Base::Console ().Log (" Volume hexa20\n " );
@@ -478,43 +478,17 @@ void exportFemMeshCells(vtkSmartPointer<vtkUnstructuredGrid> grid,
478
478
for (int i = 0 ; i < 20 ; i++) {
479
479
cell->GetPointIds ()->SetId (i, aVol->GetNode (i)->GetID () - 1 );
480
480
}
481
- quadHexaArray->InsertNextCell (cell);
481
+
482
+ elemArray->InsertNextCell (cell);
483
+ types.push_back (VTK_QUADRATIC_HEXAHEDRON);
482
484
}
483
485
else {
484
- throw std::runtime_error (" Volume not yet supported by FreeCAD's VTK mesh builder\n " );
486
+ throw Base::TypeError (" Volume not yet supported by FreeCAD's VTK mesh builder\n " );
485
487
}
486
488
}
487
489
488
- if (tetraArray->GetNumberOfCells () > 0 ) {
489
- grid->SetCells (VTK_TETRA, tetraArray);
490
- }
491
-
492
- if (pyramidArray->GetNumberOfCells () > 0 ) {
493
- grid->SetCells (VTK_PYRAMID, pyramidArray);
494
- }
495
-
496
- if (wedgeArray->GetNumberOfCells () > 0 ) {
497
- grid->SetCells (VTK_WEDGE, wedgeArray);
498
- }
499
-
500
- if (hexaArray->GetNumberOfCells () > 0 ) {
501
- grid->SetCells (VTK_HEXAHEDRON, hexaArray);
502
- }
503
-
504
- if (quadTetraArray->GetNumberOfCells () > 0 ) {
505
- grid->SetCells (VTK_QUADRATIC_TETRA, quadTetraArray);
506
- }
507
-
508
- if (quadPyramidArray->GetNumberOfCells () > 0 ) {
509
- grid->SetCells (VTK_QUADRATIC_PYRAMID, quadPyramidArray);
510
- }
511
-
512
- if (quadWedgeArray->GetNumberOfCells () > 0 ) {
513
- grid->SetCells (VTK_QUADRATIC_WEDGE, quadWedgeArray);
514
- }
515
-
516
- if (quadHexaArray->GetNumberOfCells () > 0 ) {
517
- grid->SetCells (VTK_QUADRATIC_HEXAHEDRON, quadHexaArray);
490
+ if (elemArray->GetNumberOfCells () > 0 ) {
491
+ grid->SetCells (types.data (), elemArray);
518
492
}
519
493
520
494
Base::Console ().Log (" End: VTK mesh builder volumes.\n " );
0 commit comments