@@ -15,14 +15,70 @@ MeshDS_DataSource::MeshDS_DataSource(std::vector<gp_Pnt>& CoordData, std::vector
1515 InitializeFromData (CoordData, Ele2NodeData);
1616}
1717
18+
19+ MeshDS_DataSource::MeshDS_DataSource (double * Vertices, const int nVerts1, const int nVerts2, int * Faces, const int nFaces1, const int nFaces2)
20+ {
21+ /*
22+ if (nVerts2 != 3 || nFaces2 != 3) {
23+ throw std::invalid_argument("Nx3 array must be provided");
24+ }
25+
26+ std::vector<gp_Pnt> CoordData;
27+ CoordData.resize(nVerts1);
28+ size_t vertIDX = 0;
29+
30+ for (size_t vertID = 0; vertID < nVerts1; vertID++)
31+ {
32+ CoordData[vertID] = gp_Pnt(Vertices[vertIDX], Vertices[vertIDX + 1], Vertices[vertIDX + 2]);
33+ vertIDX += 3;
34+ }
35+
36+ std::vector<std::vector<int>> FVec;
37+ FVec.resize(nFaces1);
38+ size_t faceIDX = 0;
39+
40+ for (size_t faceID = 0; faceID < nFaces1; faceID++)
41+ {
42+ FVec[faceID] = std::vector<int>{ Faces[faceIDX], Faces[faceIDX + 1] ,Faces[faceIDX + 2] };
43+ faceIDX += 3;
44+ }
45+
46+ InitializeFromData(CoordData, FVec);
47+ */
48+
49+ InitializeFromData (Vertices, nVerts1, nVerts2, Faces, nFaces1, nFaces2);
50+ }
51+
52+
53+ MeshDS_DataSource::MeshDS_DataSource (double Vertices[][3 ], int Faces[][3 ])
54+ {
55+ // size_t nVerts = Vertices.size();
56+ const size_t nVerts = sizeof Vertices / 3 ;
57+ std::vector<gp_Pnt> CoordData;
58+ CoordData.resize (nVerts);
59+
60+ for (size_t vertID = 0 ; vertID < nVerts; vertID++)
61+ {
62+ CoordData[vertID] = gp_Pnt (Vertices[vertID][0 ], Vertices[vertID][1 ], Vertices[vertID][2 ]);
63+ }
64+
65+ std::vector<std::vector<int >> FVec =
66+ {
67+ std::vector<int >(std::begin (Faces[0 ]), std::end (Faces[0 ])),
68+ std::vector<int >(std::begin (Faces[1 ]), std::end (Faces[1 ])),
69+ std::vector<int >(std::begin (Faces[2 ]), std::end (Faces[2 ])),
70+ };
71+
72+ InitializeFromData (CoordData, FVec);
73+ }
74+
1875MeshDS_DataSource::MeshDS_DataSource (const Handle (Poly_Triangulation)& polyTri)
1976{
2077 // initialize arrays
2178 std::vector<gp_Pnt> CoordData;
2279 std::vector<std::vector<int >> Ele2NodeData;
2380 CoordData.resize (polyTri->NbNodes ());
2481 Ele2NodeData.resize (polyTri->NbTriangles ());
25- // convert node data
2682 const TColgp_Array1OfPnt& nodes = polyTri->Nodes ();
2783 for (Standard_Integer nodeId = nodes.Lower (); nodeId <= nodes.Upper (); nodeId++) {
2884 const gp_Pnt& node = nodes.Value (nodeId);
@@ -229,7 +285,7 @@ void MeshDS_DataSource::InitializeFromData
229285 myElemNodes = new TColStd_HArray2OfInteger (1 , Ele2NodeData.size (), 1 , 4 );
230286 myElemNumberNodes = new TColStd_HArray1OfInteger (1 , Ele2NodeData.size ());
231287 myElemNormals = new TColStd_HArray2OfReal (1 , Ele2NodeData.size (), 1 , 3 );
232- myNodeNormals = new TColStd_HArray2OfReal (1 , Ele2NodeData.size (), 1 , 12 );
288+ myNodeNormals = new TColStd_HArray2OfReal (1 , Ele2NodeData.size (), 1 , 12 );
233289 // fill node ids and coordinates
234290 for (size_t nodeId = 1 ; nodeId <= CoordData.size (); nodeId++)
235291 {
@@ -297,4 +353,94 @@ void MeshDS_DataSource::InitializeFromData
297353 myNodeNormals->SetValue (ElementId + 1 , 3 * rankNode + 3 , aN.Z ());
298354 }
299355 }
356+ }
357+
358+ // ================================================================
359+ // Function : InitializeFromData
360+ // Purpose : Initialize from 2D Pointer Arrays, for numpy compatibility
361+ // ================================================================
362+ void MeshDS_DataSource::InitializeFromData
363+ (double * Vertices, const int nVerts1, const int nVerts2, int * Faces, const int nFaces1, const int nFaces2)
364+ {
365+ // initialize arrays
366+ myNodeCoords = new TColStd_HArray2OfReal (1 , nVerts1, 1 , 3 );
367+ myElemNodes = new TColStd_HArray2OfInteger (1 , nFaces1, 1 , 4 );
368+ myElemNumberNodes = new TColStd_HArray1OfInteger (1 , nFaces1);
369+ myElemNormals = new TColStd_HArray2OfReal (1 , nFaces1, 1 , 3 );
370+ myNodeNormals = new TColStd_HArray2OfReal (1 , nFaces1, 1 , 12 );
371+
372+ // fill node ids and coordinates
373+ for (size_t nodeId = 1 ; nodeId <= nVerts1; nodeId++)
374+ {
375+ size_t vertIdx = (nodeId-1 ) * 3 ;
376+ myNodes.Add (nodeId);
377+ myNodeCoords->SetValue (nodeId, 1 , Vertices[vertIdx + 0 ]);
378+ myNodeCoords->SetValue (nodeId, 2 , Vertices[vertIdx + 1 ]);
379+ myNodeCoords->SetValue (nodeId, 3 , Vertices[vertIdx + 2 ]);
380+ }
381+
382+ // fill element ids, number of nodes, associated node ids and normals
383+ for (size_t ElementId = 1 ; ElementId <= nFaces1; ElementId++)
384+ {
385+ size_t faceIdx = (ElementId-1 ) * 3 ;
386+ int nNodes = std::min (4 , nFaces2);
387+ myElements.Add (ElementId);
388+ myElemNumberNodes->SetValue (ElementId, nNodes);
389+ for (Standard_Integer rankNode = 1 ; rankNode <= nNodes; rankNode++)
390+ {
391+ Standard_Integer nodeId = Faces[faceIdx + rankNode - 1 ] + 1 ;
392+ myElemNodes->SetValue (ElementId, rankNode, nodeId);
393+ }
394+ // compute face normal
395+ size_t p1Idx = Faces[faceIdx + 0 ] * 3 ;
396+ size_t p2Idx = Faces[faceIdx + 1 ] * 3 ;
397+ size_t p3Idx = Faces[faceIdx + 2 ] * 3 ;
398+ const gp_Pnt aP1 = gp_Pnt (Vertices[p1Idx], Vertices[p1Idx + 1 ], Vertices[p1Idx + 2 ]);
399+ const gp_Pnt aP2 = gp_Pnt (Vertices[p2Idx], Vertices[p2Idx + 1 ], Vertices[p2Idx + 2 ]);
400+ const gp_Pnt aP3 = gp_Pnt (Vertices[p3Idx], Vertices[p3Idx + 1 ], Vertices[p3Idx + 2 ]);
401+ gp_Vec aV1 (aP1, aP2);
402+ gp_Vec aV2 (aP2, aP3);
403+ gp_Vec aN = aV1.Crossed (aV2);
404+ if (aN.SquareMagnitude () > Precision::SquareConfusion ())
405+ aN.Normalize ();
406+ else
407+ aN.SetCoord (0.0 , 0.0 , 0.0 );
408+ myElemNormals->SetValue (ElementId, 1 , aN.X ());
409+ myElemNormals->SetValue (ElementId, 2 , aN.Y ());
410+ myElemNormals->SetValue (ElementId, 3 , aN.Z ());
411+ }
412+ // compute node normal
413+ std::vector<std::vector<int >> Node2EleData;
414+ Node2EleData.resize (nVerts1);
415+ for (size_t ElementId = 0 ; ElementId < nFaces1; ElementId++) {
416+ for (size_t rankNode = 0 ; rankNode < nFaces2; rankNode++) {
417+ int nodeId = Faces[ElementId * 3 + rankNode];
418+ Node2EleData[nodeId].push_back (ElementId);
419+ }
420+ }
421+ std::vector<gp_Vec> nodeNormals;
422+ nodeNormals.resize (nVerts1);
423+ for (size_t nodeId = 0 ; nodeId < Node2EleData.size (); nodeId++) {
424+ gp_Vec aN = gp_Vec (0 , 0 , 0 );
425+ for (size_t rankEle = 0 ; rankEle < Node2EleData[nodeId].size (); rankEle++) {
426+ int ElementId = Node2EleData[nodeId][rankEle] + 1 ;
427+ aN += gp_Vec (myElemNormals->Value (ElementId, 1 ), myElemNormals->Value (ElementId, 2 ), myElemNormals->Value (ElementId, 3 ));
428+ }
429+ if (aN.SquareMagnitude () > Precision::SquareConfusion ())
430+ aN.Normalize ();
431+ else
432+ aN.SetCoord (0.0 , 0.0 , 0.0 );
433+ nodeNormals[nodeId] = aN;
434+ }
435+ for (size_t ElementId = 0 ; ElementId < nFaces1; ElementId++)
436+ {
437+ for (size_t rankNode = 0 ; rankNode < nFaces2; rankNode++)
438+ {
439+ int nodeId = Faces[ElementId * 3 + rankNode];
440+ gp_Vec aN = nodeNormals[nodeId];
441+ myNodeNormals->SetValue (ElementId + 1 , 3 * rankNode + 1 , aN.X ());
442+ myNodeNormals->SetValue (ElementId + 1 , 3 * rankNode + 2 , aN.Y ());
443+ myNodeNormals->SetValue (ElementId + 1 , 3 * rankNode + 3 , aN.Z ());
444+ }
445+ }
300446}
0 commit comments