11from dataclasses import dataclass
22from typing import Optional
33import numpy as np
4+ import io
45
56
67@dataclass
78class Surface :
89 vertices : np .ndarray
910 triangles : np .ndarray
10- normals : np .ndarray
11- name : str
11+ normals : Optional [ np .ndarray ] = None
12+ name : str = 'surface'
1213 values : Optional [np .ndarray ] = None
1314 properties : Optional [dict ] = None
15+ cell_properties : Optional [dict ] = None
1416
1517 @property
1618 def triangle_area (self ):
@@ -75,26 +77,77 @@ def vtk(self):
7577 surface = pv .PolyData .from_regular_faces (self .vertices , self .triangles )
7678 if self .values is not None :
7779 surface ["values" ] = self .values
80+ if self .properties is not None :
81+ for k , v in self .properties .items ():
82+ surface .point_data [k ] = np .array (v )
83+ if self .cell_properties is not None :
84+ for k , v in self .cell_properties .items ():
85+ surface .cell_data [k ] = np .array (v )
7886 return surface
7987
80- def to_dict (self ):
88+ def to_dict (self , flatten = False ):
89+ triangles = self .triangles
90+ vertices = self .vertices
91+ if flatten :
92+ vertices = self .vertices .flatten ()
93+ triangles = (
94+ np .hstack ([np .ones ((self .triangles .shape [0 ], 1 )) * 3 , self .triangles ])
95+ .astype (int )
96+ .flatten ()
97+ )
8198 return {
82- "vertices" : self .vertices ,
83- "triangles" : self .triangles ,
84- "normals" : self .normals ,
99+ "vertices" : vertices .tolist (),
100+ "triangles" : triangles .tolist (),
101+ "normals" : self .normals .tolist () if self .normals is not None else None ,
102+ "properties" : (
103+ {k : p .tolist () for k , p in self .properties .items ()} if self .properties else None
104+ ),
105+ "cell_properties" : (
106+ {k : p .tolist () for k , p in self .cell_properties .items ()}
107+ if self .cell_properties
108+ else None
109+ ),
85110 "name" : self .name ,
86- "values" : self .values ,
111+ "values" : self .values . tolist () if self . values is not None else None ,
87112 }
88113
89- def save (self , filename ):
90- filename = str (filename )
91- ext = filename .split ('.' )[- 1 ]
114+ @classmethod
115+ def from_dict (cls , d , flatten = False ):
116+ vertices = np .array (d ['vertices' ])
117+ triangles = np .array (d ['triangles' ])
118+ if flatten :
119+ vertices = vertices .reshape ((- 1 , 3 ))
120+ triangles = triangles .reshape ((- 1 , 4 ))[:, 1 :]
121+ return cls (
122+ vertices ,
123+ triangles ,
124+ np .array (d ['normals' ]),
125+ d ['name' ],
126+ np .array (d ['values' ]),
127+ d .get ('properties' , None ),
128+ d .get ('cell_properties' , None ),
129+ )
130+
131+ def save (self , filename , ext = None ):
132+ import pyvista as pv
133+
134+ print (filename , ext )
135+ if isinstance (filename , (io .StringIO , io .BytesIO )):
136+ if ext is None :
137+ raise ValueError ('Please provide an extension for StringIO' )
138+ ext = ext .lower ()
139+ else :
140+ filename = str (filename )
141+ if ext is None :
142+ ext = filename .split ('.' )[- 1 ].lower ()
143+
92144 if ext == 'json' :
93145 import json
94146
95147 with open (filename , 'w' ) as f :
96148 json .dump (self .to_dict (), f )
97149 elif ext == 'vtk' :
150+ print (filename )
98151 self .vtk ().save (filename )
99152 elif ext == 'obj' :
100153 import meshio
@@ -105,7 +158,7 @@ def save(self, filename):
105158 [("triangle" , self .triangles )],
106159 point_data = {"normals" : self .normals },
107160 )
108- elif ext == 'ts' :
161+ elif ext == 'ts' or ext == 'gocad' :
109162 from LoopStructural .export .exporters import _write_feat_surfs_gocad
110163
111164 _write_feat_surfs_gocad (self , filename )
@@ -119,5 +172,13 @@ def save(self, filename):
119172
120173 with open (filename , 'wb' ) as f :
121174 pickle .dump (self , f )
175+ elif ext == 'csv' :
176+ import pandas as pd
177+
178+ df = pd .DataFrame (self .vertices , columns = ['x' , 'y' , 'z' ])
179+ if self .properties :
180+ for k , v in self .properties .items ():
181+ df [k ] = v
182+ df .to_csv (filename , index = False )
122183 else :
123184 raise ValueError (f"Extension { ext } not supported" )
0 commit comments