1
1
using System ;
2
+ using System . Linq ;
2
3
using System . Runtime . InteropServices ;
3
4
using MeshKernelNET . Api ;
4
5
using NUnit . Framework ;
@@ -2543,6 +2544,123 @@ public void Mesh2dUndoTwoDeleteNodesThroughApi()
2543
2544
}
2544
2545
}
2545
2546
2546
-
2547
+ [ Test ]
2548
+ public void Mesh2dAddTriangleAndUndoEachStepThroughApi ( )
2549
+ {
2550
+ // --- Setup ---
2551
+ const int nx = 3 ;
2552
+ const int ny = 3 ;
2553
+ const double dx = 10.0 ;
2554
+ const double dy = 10.0 ;
2555
+ // insert a vertex left of the grid between the two first rows, i.e. between node #0 and node #nx
2556
+ const double vx = - 0.5 * dx ;
2557
+ const double vy = 0.5 * dy ;
2558
+ using ( DisposableMesh2D mesh = CreateMesh2D ( nx , ny , dx , dy ) )
2559
+ using ( var api = new MeshKernelApi ( ) )
2560
+ {
2561
+ var mesh2D = new DisposableMesh2D ( ) ;
2562
+ var id = 0 ;
2563
+
2564
+ try
2565
+ {
2566
+ int initialNumNodes = mesh . NumNodes ;
2567
+ int initialNumEdges = mesh . NumEdges ;
2568
+ var initialNodeX = mesh . NodeX . ToArray ( ) ;
2569
+ var initialNodeY = mesh . NodeY . ToArray ( ) ;
2570
+ var initialEdgeNodes = mesh . EdgeNodes . ToArray ( ) ;
2571
+
2572
+ int result = - 1 ;
2573
+ id = api . AllocateState ( 0 ) ;
2574
+
2575
+ api . Mesh2dSet ( id , mesh ) ;
2576
+
2577
+ int insertedVertex = 0 ;
2578
+ api . Mesh2dInsertNode ( id , vx , vy , ref insertedVertex ) ;
2579
+ Assert . That ( insertedVertex , Is . EqualTo ( initialNumNodes ) ) ; // appended at end
2580
+
2581
+ var insertedEdge = 0 ;
2582
+ api . Mesh2dInsertEdge ( id , 0 , insertedVertex , ref insertedEdge ) ;
2583
+ Assert . That ( insertedEdge , Is . EqualTo ( initialNumEdges ) ) ; // appended at end
2584
+
2585
+ api . Mesh2dInsertEdge ( id , insertedVertex , nx , ref insertedEdge ) ;
2586
+ Assert . That ( insertedEdge , Is . EqualTo ( initialNumEdges + 1 ) ) ; // appended at end
2587
+
2588
+ // Check mesh topology and geometry with added vertex and edges
2589
+ api . Mesh2dGetData ( id , out mesh2D ) ;
2590
+ Assert . That ( mesh2D . NumEdges , Is . EqualTo ( initialNumEdges + 2 ) ) ;
2591
+ Assert . That ( mesh2D . EdgeNodes , Is . EquivalentTo ( initialEdgeNodes . Concat ( new [ ] { 0 , insertedVertex , insertedVertex , nx } ) ) ) ;
2592
+ Assert . That ( mesh2D . NumNodes , Is . EqualTo ( initialNumNodes + 1 ) ) ;
2593
+ Assert . That ( mesh2D . NodeX , Is . EquivalentTo ( initialNodeX . Concat ( new [ ] { vx } ) ) ) ;
2594
+ Assert . That ( mesh2D . NodeY , Is . EquivalentTo ( initialNodeY . Concat ( new [ ] { vy } ) ) ) ;
2595
+
2596
+ // --- Execute & Assert ---
2597
+
2598
+ // Undo edge (4,3) insertion
2599
+ bool undone = false ;
2600
+ result = api . UndoState ( id , ref undone ) ;
2601
+
2602
+ // Check mesh topology and geometry after undo - expect one extra valid vertex and one extra valid edge
2603
+ api . Mesh2dGetData ( id , out mesh2D ) ;
2604
+ Assert . Multiple ( ( ) =>
2605
+ {
2606
+ Assert . That ( result , Is . EqualTo ( 0 ) ) ;
2607
+ Assert . That ( undone , Is . True ) ;
2608
+ Assert . That ( mesh2D . NumValidEdges , Is . EqualTo ( initialNumEdges + 1 ) ) ;
2609
+ Assert . That ( mesh2D . EdgeNodes . Count ( n => n >= 0 ) , Is . EqualTo ( 2 * mesh2D . NumValidEdges ) ) ;
2610
+ // the inserted vertex should still be valid
2611
+ Assert . That ( mesh2D . NumValidNodes , Is . EqualTo ( initialNumNodes + 1 ) ) ;
2612
+ Assert . That ( mesh2D . NumNodes , Is . EqualTo ( mesh2D . NumNodes ) ) ;
2613
+ Assert . That ( mesh2D . NodeX . Count ( x => x == - 999.0 ) , Is . EqualTo ( 0 ) ) ;
2614
+ Assert . That ( mesh2D . NodeY . Count ( y => y == - 999.0 ) , Is . EqualTo ( 0 ) ) ;
2615
+ }
2616
+ ) ;
2617
+
2618
+ // Undo edge (1,3) insertion
2619
+ undone = false ;
2620
+ result = api . UndoState ( id , ref undone ) ;
2621
+
2622
+ // Topology and geometry checks are disabled temporarily because Mesh2dGetData will mark unconnected vertices
2623
+ // as invalid, changing the topology of the mesh (GRIDEDIT-988) and causing the unconnected vertex expected
2624
+ // after the undo to be marked invalid.
2625
+ /*
2626
+ // Check mesh topology and geometry after undo - expect one extra valid vertex
2627
+ api.Mesh2dGetData(id, out mesh2D);
2628
+ Assert.Multiple(() =>
2629
+ {
2630
+ Assert.That(result, Is.EqualTo(0));
2631
+ Assert.That(undone, Is.True);
2632
+ Assert.That(mesh2D.NumValidEdges, Is.EqualTo(initialNumEdges));
2633
+ Assert.That(mesh2D.EdgeNodes.Count(n => n >= 0), Is.EqualTo(2 * mesh2D.NumValidEdges));
2634
+ // the inserted vertex should still be valid
2635
+ Assert.That(mesh2D.NumValidNodes, Is.EqualTo(initialNumNodes + 1));
2636
+ Assert.That(mesh2D.NumNodes, Is.EqualTo(mesh2D.NumNodes));
2637
+ Assert.That(mesh2D.NodeX.Count(x => x == -999.0), Is.EqualTo(0));
2638
+ Assert.That(mesh2D.NodeY.Count(y => y == -999.0), Is.EqualTo(0));
2639
+ });
2640
+ */
2641
+
2642
+ // Undo vertex insertion
2643
+ undone = false ;
2644
+ result = api . UndoState ( id , ref undone ) ;
2645
+ api . Mesh2dGetData ( id , out mesh2D ) ;
2646
+ Assert . Multiple ( ( ) =>
2647
+ {
2648
+ Assert . That ( result , Is . EqualTo ( 0 ) ) ;
2649
+ Assert . That ( undone , Is . True ) ;
2650
+ Assert . That ( mesh2D . NumValidEdges , Is . EqualTo ( initialNumEdges ) ) ;
2651
+ Assert . That ( mesh2D . NumValidNodes , Is . EqualTo ( initialNumNodes ) ) ;
2652
+ Assert . That ( mesh2D . EdgeNodes . Count ( n => n >= 0 ) , Is . EqualTo ( 2 * mesh2D . NumValidEdges ) ) ;
2653
+ Assert . That ( mesh2D . EdgeNodes . Where ( n => n >= 0 ) , Is . EquivalentTo ( initialEdgeNodes ) ) ;
2654
+ Assert . That ( mesh2D . NodeX . Where ( x => x != - 999.0 ) , Is . EquivalentTo ( initialNodeX ) ) ;
2655
+ Assert . That ( mesh2D . NodeY . Where ( x => x != - 999.0 ) , Is . EquivalentTo ( initialNodeY ) ) ;
2656
+ } ) ;
2657
+ }
2658
+ finally
2659
+ {
2660
+ api . DeallocateState ( id ) ;
2661
+ mesh2D . Dispose ( ) ;
2662
+ }
2663
+ }
2664
+ }
2547
2665
}
2548
2666
}
0 commit comments