Skip to content
Snippets Groups Projects
Commit 1b063ef2 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

Added support (both read and write) for the Nastran Bulk Data File
format (BDF).

This might need some adjustments depending on what the actual spec
is: I just reverse engineered some BDF files I found on the web :-)
parent 8b0ab1f5
Branches
Tags
No related merge requests found
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#define FORMAT_P3D 28 #define FORMAT_P3D 28
#define FORMAT_SVG 29 #define FORMAT_SVG 29
#define FORMAT_MESH 30 #define FORMAT_MESH 30
#define FORMAT_BDF 31
// Element types in .msh file format // Element types in .msh file format
#define LGN1 1 #define LGN1 1
......
// $Id: Callbacks.cpp,v 1.457 2006-08-31 14:15:29 geuzaine Exp $ // $Id: Callbacks.cpp,v 1.458 2006-08-31 21:29:18 geuzaine Exp $
// //
// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
// //
...@@ -608,8 +608,9 @@ static char *file_types = ...@@ -608,8 +608,9 @@ static char *file_types =
"\tGmsh geometry (*.geo)" "\tGmsh geometry (*.geo)"
"\tGmsh mesh (*.msh)" "\tGmsh mesh (*.msh)"
"\tGmsh post-processing (*.pos)" "\tGmsh post-processing (*.pos)"
"\tMedit mesh (*.mesh)"
"\tNastran bulk data file (*.bdf)"
"\tSTL surface mesh (*.stl)" "\tSTL surface mesh (*.stl)"
"\tMEDIT mesh (*.mesh)"
"\tJPEG (*.jpg)" "\tJPEG (*.jpg)"
"\tPNG (*.png)" "\tPNG (*.png)"
"\tBMP (*.bmp)" "\tBMP (*.bmp)"
...@@ -676,6 +677,12 @@ int _save_mesh(char *name) ...@@ -676,6 +677,12 @@ int _save_mesh(char *name)
return 1; return 1;
} }
int _save_bdf(char *name)
{
CreateOutputFile(name, FORMAT_BDF);
return 1;
}
int _save_vrml(char *name) int _save_vrml(char *name)
{ {
CreateOutputFile(name, FORMAT_VRML); CreateOutputFile(name, FORMAT_VRML);
...@@ -776,8 +783,9 @@ void file_save_as_cb(CALLBACK_ARGS) ...@@ -776,8 +783,9 @@ void file_save_as_cb(CALLBACK_ARGS)
{"Gmsh options (*.opt)", _save_options}, {"Gmsh options (*.opt)", _save_options},
{"Gmsh unrolled geometry (*.geo)", _save_geo}, {"Gmsh unrolled geometry (*.geo)", _save_geo},
{" ", _save_auto}, {" ", _save_auto},
{"I-DEAS universal mesh (*.unv)", _save_unv}, {"I-deas universal mesh (*.unv)", _save_unv},
{"MEDIT mesh (*.mesh)", _save_mesh}, {"Medit mesh (*.mesh)", _save_mesh},
{"Nastran bulk data file (*.bdf)", _save_bdf},
{"STL surface mesh (*.stl)", _save_stl}, {"STL surface mesh (*.stl)", _save_stl},
{"VRML surface mesh (*.wrl)", _save_vrml}, {"VRML surface mesh (*.wrl)", _save_vrml},
{" ", _save_auto}, {" ", _save_auto},
......
...@@ -116,19 +116,33 @@ class GModel ...@@ -116,19 +116,33 @@ class GModel
// deletes all the partitions // deletes all the partitions
virtual void deleteMeshPartitions(); virtual void deleteMeshPartitions();
// IO routines // IO for native Gmsh mesh file format
int readMSH(const std::string &name); int readMSH(const std::string &name);
int writeMSH(const std::string &name, double version=1.0, bool binary=false, int writeMSH(const std::string &name, double version=1.0, bool binary=false,
bool saveAll=false, double scalingFactor=1.0); bool saveAll=false, double scalingFactor=1.0);
// IO for mesh statistics (as Gmsh post-processing views)
int writePOS(const std::string &name, double scalingFactor=1.0); int writePOS(const std::string &name, double scalingFactor=1.0);
// IO for stereo lithography format
int readSTL(const std::string &name, double tolerance=1.e-3); int readSTL(const std::string &name, double tolerance=1.e-3);
int writeSTL(const std::string &name, bool binary=false, double scalingFactor=1.0); int writeSTL(const std::string &name, bool binary=false, double scalingFactor=1.0);
// IO for Inventor/VRML format
int readVRML(const std::string &name); int readVRML(const std::string &name);
int writeVRML(const std::string &name, double scalingFactor=1.0); int writeVRML(const std::string &name, double scalingFactor=1.0);
// IO for I-deas universal mesh format
int writeUNV(const std::string &name, double scalingFactor=1.0); int writeUNV(const std::string &name, double scalingFactor=1.0);
// IO for Medit (INRIA) mesh format
int readMESH(const std::string &name); int readMESH(const std::string &name);
int writeMESH(const std::string &name, double scalingFactor=1.0); int writeMESH(const std::string &name, double scalingFactor=1.0);
// IO for Nastran Bulk Data File format
int readBDF(const std::string &name);
int writeBDF(const std::string &name, double scalingFactor=1.0);
// FIXME: this will be removed (and rewritten) // FIXME: this will be removed (and rewritten)
smooth_normals *normals; smooth_normals *normals;
}; };
......
// $Id: GModelIO.cpp,v 1.31 2006-08-31 14:15:29 geuzaine Exp $ // $Id: GModelIO.cpp,v 1.32 2006-08-31 21:29:18 geuzaine Exp $
// //
// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
// //
...@@ -1136,7 +1136,7 @@ int GModel::writeUNV(const std::string &name, double scalingFactor) ...@@ -1136,7 +1136,7 @@ int GModel::writeUNV(const std::string &name, double scalingFactor)
renumberMeshVertices(); renumberMeshVertices();
// IDEAS NODES record // Nodes
fprintf(fp, "%6d\n", -1); fprintf(fp, "%6d\n", -1);
fprintf(fp, "%6d\n", 2411); fprintf(fp, "%6d\n", 2411);
for(viter it = firstVertex(); it != lastVertex(); ++it) for(viter it = firstVertex(); it != lastVertex(); ++it)
...@@ -1153,7 +1153,7 @@ int GModel::writeUNV(const std::string &name, double scalingFactor) ...@@ -1153,7 +1153,7 @@ int GModel::writeUNV(const std::string &name, double scalingFactor)
(*it)->mesh_vertices[i]->writeUNV(fp, scalingFactor); (*it)->mesh_vertices[i]->writeUNV(fp, scalingFactor);
fprintf(fp, "%6d\n", -1); fprintf(fp, "%6d\n", -1);
// IDEAS ELEMENTS record // Elements
fprintf(fp, "%6d\n", -1); fprintf(fp, "%6d\n", -1);
fprintf(fp, "%6d\n", 2412); fprintf(fp, "%6d\n", 2412);
for(eiter it = firstEdge(); it != lastEdge(); ++it){ for(eiter it = firstEdge(); it != lastEdge(); ++it){
...@@ -1182,7 +1182,7 @@ int GModel::writeUNV(const std::string &name, double scalingFactor) ...@@ -1182,7 +1182,7 @@ int GModel::writeUNV(const std::string &name, double scalingFactor)
for(int dim = 0; dim < 4; dim++){ for(int dim = 0; dim < 4; dim++){
std::map<int, std::vector<GEntity*> >::const_iterator it = physicals[dim].begin(); std::map<int, std::vector<GEntity*> >::const_iterator it = physicals[dim].begin();
for(; it != physicals[dim].end(); ++it){ for(; it != physicals[dim].end(); ++it){
// IDEAS GROUPOFNODES record // Group of nodes
fprintf(fp, "%6d\n", -1); fprintf(fp, "%6d\n", -1);
fprintf(fp, "%6d\n", 790); fprintf(fp, "%6d\n", 790);
fprintf(fp, "%10d%10d\n", it->first, 1); fprintf(fp, "%10d%10d\n", it->first, 1);
...@@ -1237,12 +1237,12 @@ int GModel::readMESH(const std::string &name) ...@@ -1237,12 +1237,12 @@ int GModel::readMESH(const std::string &name)
sscanf(buffer, "%s %d", str, &format); sscanf(buffer, "%s %d", str, &format);
if(format != 1){ if(format != 1){
Msg(GERROR, "Non-ASCII MEDIT mesh import is not yet available"); Msg(GERROR, "Medit mesh import only available for ASCII files");
return 0; return 0;
} }
std::map<int, MVertex*> vertices; std::map<int, MVertex*> vertices;
std::map<int, std::vector<MElement*> > elements[2]; std::map<int, std::vector<MElement*> > elements[3];
while(!feof(fp)) { while(!feof(fp)) {
if(!fgets(buffer, sizeof(buffer), fp)) break; if(!fgets(buffer, sizeof(buffer), fp)) break;
...@@ -1290,6 +1290,19 @@ int GModel::readMESH(const std::string &name) ...@@ -1290,6 +1290,19 @@ int GModel::readMESH(const std::string &name)
(new MQuadrangle(vertices[n1], vertices[n2], vertices[n3], vertices[n4])); (new MQuadrangle(vertices[n1], vertices[n2], vertices[n3], vertices[n4]));
} }
} }
else if(!strcmp(str, "Tetrahedra")) {
if(!fgets(buffer, sizeof(buffer), fp)) break;
int nbt;
sscanf(buffer, "%d", &nbt);
Msg(INFO, "%d tetrahedra", nbt);
for(int i = 0; i < nbt; i++) {
if(!fgets(buffer, sizeof(buffer), fp)) break;
int n1, n2, n3, n4, cl;
sscanf(buffer, "%d %d %d %d %d", &n1, &n2, &n3, &n4, &cl);
elements[2][cl].push_back
(new MTetrahedron(vertices[n1], vertices[n2], vertices[n3], vertices[n4]));
}
}
} }
} }
...@@ -1335,11 +1348,14 @@ int GModel::writeMESH(const std::string &name, double scalingFactor) ...@@ -1335,11 +1348,14 @@ int GModel::writeMESH(const std::string &name, double scalingFactor)
for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++) for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++)
(*it)->mesh_vertices[i]->writeMESH(fp, scalingFactor); (*it)->mesh_vertices[i]->writeMESH(fp, scalingFactor);
int numTriangles = 0, numQuadrangles = 0; int numTriangles = 0, numQuadrangles = 0, numTetrahedra = 0;
for(fiter it = firstFace(); it != lastFace(); ++it){ for(fiter it = firstFace(); it != lastFace(); ++it){
numTriangles += (*it)->triangles.size(); numTriangles += (*it)->triangles.size();
numQuadrangles += (*it)->quadrangles.size(); numQuadrangles += (*it)->quadrangles.size();
} }
for(riter it = firstRegion(); it != lastRegion(); ++it){
numTetrahedra += (*it)->tetrahedra.size();
}
if(numTriangles){ if(numTriangles){
fprintf(fp, " Triangles\n"); fprintf(fp, " Triangles\n");
fprintf(fp, " %d\n", numTriangles); fprintf(fp, " %d\n", numTriangles);
...@@ -1354,9 +1370,173 @@ int GModel::writeMESH(const std::string &name, double scalingFactor) ...@@ -1354,9 +1370,173 @@ int GModel::writeMESH(const std::string &name, double scalingFactor)
for(unsigned int i = 0; i < (*it)->triangles.size(); i++) for(unsigned int i = 0; i < (*it)->triangles.size(); i++)
(*it)->quadrangles[i]->writeMESH(fp, (*it)->tag()); (*it)->quadrangles[i]->writeMESH(fp, (*it)->tag());
} }
if(numTetrahedra){
fprintf(fp, " Tetrahedra\n");
fprintf(fp, " %d\n", numTetrahedra);
for(riter it = firstRegion(); it != lastRegion(); ++it)
for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++)
(*it)->tetrahedra[i]->writeMESH(fp, (*it)->tag());
}
fprintf(fp, " End\n"); fprintf(fp, " End\n");
fclose(fp); fclose(fp);
return 1; return 1;
} }
static int readElementBDF(FILE *fp, char *buffer, unsigned int numNodes,
int *num, int *region, int *nodes)
{
int newline = 0;
std::vector<char*> vals;
for(unsigned int i = 0; i < strlen(buffer); i++){
if(buffer[i] == ',') vals.push_back(&buffer[i + 1]);
else if(buffer[i] == '+'){ // the data continues on the next line
vals.pop_back();
newline = 1;
break;
}
}
if(newline){
char buffer2[256];
if(!fgets(buffer2, sizeof(buffer2), fp)) return 0;
for(unsigned int i = 0; i < strlen(buffer2); i++){
if(buffer2[i] == ',') vals.push_back(&buffer2[i + 1]);
}
}
if(vals.size() != numNodes + 2){
Msg(GERROR, "Wrong number of nodes %d for element", vals.size() - 2);
return 0;
}
sscanf(vals[0], "%d", num);
sscanf(vals[1], "%d", region);
for(unsigned int i = 0; i < numNodes; i++)
if(!sscanf(vals[i + 2], "%d", &nodes[i])) return 0;
return 1;
}
int GModel::readBDF(const std::string &name)
{
FILE *fp = fopen(name.c_str(), "r");
if(!fp){
Msg(GERROR, "Unable to open file '%s'", name.c_str());
return 0;
}
char buffer[256];
int num, dummy, region, n[30];
double x, y, z;
std::map<int, MVertex*> vertices;
std::map<int, std::vector<MElement*> > elements[5];
while(!feof(fp)) {
if(!fgets(buffer, sizeof(buffer), fp)) break;
if(!strncmp(buffer, "GRID", 4)){
sscanf(&buffer[5], "%d , %d , %lf, %lf , %lf", &num, &dummy, &x, &y, &z);
vertices[num] = new MVertex(x, y, z);
}
else if(!strncmp(buffer, "CTRIA3", 6)){
if(readElementBDF(fp, &buffer[6], 3, &num, &region, n))
elements[0][region].push_back
(new MTriangle(vertices[n[0]], vertices[n[1]], vertices[n[2]], num));
}
else if(!strncmp(buffer, "CTRIA6", 6)){
if(readElementBDF(fp, &buffer[6], 6, &num, &region, n))
elements[0][region].push_back
(new MTriangle2(vertices[n[0]], vertices[n[1]], vertices[n[2]],
vertices[n[3]], vertices[n[4]], vertices[n[5]], num));
}
else if(!strncmp(buffer, "CQUAD4", 6)){
if(readElementBDF(fp, &buffer[6], 4, &num, &region, n))
elements[1][region].push_back
(new MQuadrangle(vertices[n[0]], vertices[n[1]], vertices[n[2]],
vertices[n[3]], num));
}
else if(!strncmp(buffer, "CTETRA", 6)){
if(readElementBDF(fp, &buffer[6], 4, &num, &region, n))
elements[2][region].push_back
(new MTetrahedron(vertices[n[0]], vertices[n[1]], vertices[n[2]],
vertices[n[3]], num));
}
else if(!strncmp(buffer, "CHEXA", 5)){
if(readElementBDF(fp, &buffer[5], 8, &num, &region, n))
elements[3][region].push_back
(new MHexahedron(vertices[n[0]], vertices[n[1]], vertices[n[2]],
vertices[n[3]], vertices[n[4]], vertices[n[5]],
vertices[n[6]], vertices[n[7]], num));
}
else if(!strncmp(buffer, "CPENTA", 6)){
if(readElementBDF(fp, &buffer[6], 6, &num, &region, n))
elements[4][region].push_back
(new MPrism(vertices[n[0]], vertices[n[1]], vertices[n[2]],
vertices[n[3]], vertices[n[4]], vertices[n[5]], num));
}
}
// store the elements in their associated elementary entity. If the
// entity does not exist, create a new one.
for(int i = 0; i < 5; i++) storeElementsInEntities(this, elements[i]);
// associate the correct geometrical entity with each mesh vertex
associateEntityWithVertices(this);
// store the vertices in their associated geometrical entity
storeVerticesInEntities(vertices);
fclose(fp);
return 1;
}
int GModel::writeBDF(const std::string &name, double scalingFactor)
{
FILE *fp = fopen(name.c_str(), "w");
if(!fp){
Msg(GERROR, "Unable to open file '%s'", name.c_str());
return 0;
}
renumberMeshVertices();
// no idea if this header is necessary (or even what it means :-)
fprintf(fp, "$\n");
fprintf(fp, "MAT4,1,0.00000\n");
fprintf(fp, "PSOLID,1,1\n");
for(viter it = firstVertex(); it != lastVertex(); ++it)
for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++)
(*it)->mesh_vertices[i]->writeBDF(fp, scalingFactor);
for(eiter it = firstEdge(); it != lastEdge(); ++it)
for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++)
(*it)->mesh_vertices[i]->writeBDF(fp, scalingFactor);
for(fiter it = firstFace(); it != lastFace(); ++it)
for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++)
(*it)->mesh_vertices[i]->writeBDF(fp, scalingFactor);
for(riter it = firstRegion(); it != lastRegion(); ++it)
for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++)
(*it)->mesh_vertices[i]->writeBDF(fp, scalingFactor);
for(fiter it = firstFace(); it != lastFace(); ++it){
for(unsigned int i = 0; i < (*it)->triangles.size(); i++)
(*it)->triangles[i]->writeBDF(fp, (*it)->tag());
for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++)
(*it)->quadrangles[i]->writeBDF(fp, (*it)->tag());
}
for(riter it = firstRegion(); it != lastRegion(); ++it){
for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++)
(*it)->tetrahedra[i]->writeBDF(fp, (*it)->tag());
for(unsigned int i = 0; i < (*it)->hexahedra.size(); i++)
(*it)->hexahedra[i]->writeBDF(fp, (*it)->tag());
for(unsigned int i = 0; i < (*it)->prisms.size(); i++)
(*it)->prisms[i]->writeBDF(fp, (*it)->tag());
}
fprintf(fp, "ENDDATA\n");
fclose(fp);
return 1;
}
// $Id: MElement.cpp,v 1.11 2006-08-29 21:19:34 geuzaine Exp $ // $Id: MElement.cpp,v 1.12 2006-08-31 21:29:18 geuzaine Exp $
// //
// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
// //
...@@ -278,3 +278,14 @@ void MElement::writeMESH(FILE *fp, int elementary) ...@@ -278,3 +278,14 @@ void MElement::writeMESH(FILE *fp, int elementary)
fprintf(fp, " %d", getVertex(i)->getNum()); fprintf(fp, " %d", getVertex(i)->getNum());
fprintf(fp, " %d\n", elementary); fprintf(fp, " %d\n", elementary);
} }
void MElement::writeBDF(FILE *fp, int elementary)
{
char *str = getStringForBDF();
if(str){
fprintf(fp, "%s,%d,%d", str, _num, elementary);
for(int i = 0; i < getNumVertices(); i++)
fprintf(fp, ",%d", getVertex(i)->getNum());
fprintf(fp, "\n");
}
}
...@@ -138,9 +138,11 @@ class MElement ...@@ -138,9 +138,11 @@ class MElement
virtual void writeVRML(FILE *fp); virtual void writeVRML(FILE *fp);
virtual void writeUNV(FILE *fp, int elementary); virtual void writeUNV(FILE *fp, int elementary);
virtual void writeMESH(FILE *fp, int elementary); virtual void writeMESH(FILE *fp, int elementary);
virtual char *getStringForPOS() = 0; virtual void writeBDF(FILE *fp, int elementary);
virtual int getTypeForMSH() = 0; virtual int getTypeForMSH() = 0;
virtual int getTypeForUNV() = 0; virtual int getTypeForUNV() = 0;
virtual char *getStringForPOS() = 0;
virtual char *getStringForBDF() = 0;
}; };
class MLine : public MElement { class MLine : public MElement {
...@@ -168,6 +170,7 @@ class MLine : public MElement { ...@@ -168,6 +170,7 @@ class MLine : public MElement {
int getTypeForMSH(){ return LGN1; } int getTypeForMSH(){ return LGN1; }
int getTypeForUNV(){ return 21; } // BEAM int getTypeForUNV(){ return 21; } // BEAM
char *getStringForPOS(){ return "SL"; } char *getStringForPOS(){ return "SL"; }
char *getStringForBDF(){ return 0; }
}; };
class MLine2 : public MLine { class MLine2 : public MLine {
...@@ -202,6 +205,7 @@ class MLine2 : public MLine { ...@@ -202,6 +205,7 @@ class MLine2 : public MLine {
int getTypeForMSH(){ return LGN2; } int getTypeForMSH(){ return LGN2; }
int getTypeForUNV(){ return 24; } // BEAM2 int getTypeForUNV(){ return 24; } // BEAM2
char *getStringForPOS(){ return "SL2"; } char *getStringForPOS(){ return "SL2"; }
char *getStringForBDF(){ return 0; }
}; };
class MTriangle : public MElement { class MTriangle : public MElement {
...@@ -235,6 +239,7 @@ class MTriangle : public MElement { ...@@ -235,6 +239,7 @@ class MTriangle : public MElement {
int getTypeForMSH(){ return TRI1; } int getTypeForMSH(){ return TRI1; }
int getTypeForUNV(){ return 91; } // THINSHLL int getTypeForUNV(){ return 91; } // THINSHLL
char *getStringForPOS(){ return "ST"; } char *getStringForPOS(){ return "ST"; }
char *getStringForBDF(){ return "CTRIA3"; }
}; };
class MTriangle2 : public MTriangle { class MTriangle2 : public MTriangle {
...@@ -288,6 +293,7 @@ class MTriangle2 : public MTriangle { ...@@ -288,6 +293,7 @@ class MTriangle2 : public MTriangle {
int getTypeForMSH(){ return TRI2; } int getTypeForMSH(){ return TRI2; }
int getTypeForUNV(){ return 92; } // THINSHLL2 int getTypeForUNV(){ return 92; } // THINSHLL2
char *getStringForPOS(){ return "ST2"; } char *getStringForPOS(){ return "ST2"; }
char *getStringForBDF(){ return "CTRIA6"; }
}; };
class MQuadrangle : public MElement { class MQuadrangle : public MElement {
...@@ -318,6 +324,7 @@ class MQuadrangle : public MElement { ...@@ -318,6 +324,7 @@ class MQuadrangle : public MElement {
int getTypeForMSH(){ return QUA1; } int getTypeForMSH(){ return QUA1; }
int getTypeForUNV(){ return 94; } // QUAD int getTypeForUNV(){ return 94; } // QUAD
char *getStringForPOS(){ return "SQ"; } char *getStringForPOS(){ return "SQ"; }
char *getStringForBDF(){ return "CQUAD4"; }
}; };
class MQuadrangle2 : public MQuadrangle { class MQuadrangle2 : public MQuadrangle {
...@@ -345,6 +352,7 @@ class MQuadrangle2 : public MQuadrangle { ...@@ -345,6 +352,7 @@ class MQuadrangle2 : public MQuadrangle {
int getTypeForMSH(){ return QUA2; } int getTypeForMSH(){ return QUA2; }
int getTypeForUNV(){ return 95; } // ???? QUAD2 int getTypeForUNV(){ return 95; } // ???? QUAD2
char *getStringForPOS(){ return "SQ2"; } char *getStringForPOS(){ return "SQ2"; }
char *getStringForBDF(){ return 0; }
}; };
class MTetrahedron : public MElement { class MTetrahedron : public MElement {
...@@ -380,6 +388,7 @@ class MTetrahedron : public MElement { ...@@ -380,6 +388,7 @@ class MTetrahedron : public MElement {
int getTypeForMSH(){ return TET1; } int getTypeForMSH(){ return TET1; }
int getTypeForUNV(){ return 111; } // SOLIDFEM int getTypeForUNV(){ return 111; } // SOLIDFEM
char *getStringForPOS(){ return "SS"; } char *getStringForPOS(){ return "SS"; }
char *getStringForBDF(){ return "CTETRA"; }
virtual double getVolume() virtual double getVolume()
{ {
double mat[3][3]; double mat[3][3];
...@@ -431,6 +440,7 @@ class MTetrahedron2 : public MTetrahedron { ...@@ -431,6 +440,7 @@ class MTetrahedron2 : public MTetrahedron {
int getTypeForMSH(){ return TET2; } int getTypeForMSH(){ return TET2; }
int getTypeForUNV(){ return 118; } // SOLIDFEM2 int getTypeForUNV(){ return 118; } // SOLIDFEM2
char *getStringForPOS(){ return "SS2"; } char *getStringForPOS(){ return "SS2"; }
char *getStringForBDF(){ return 0; }
void setVolumePositive() void setVolumePositive()
{ {
if(getVolumeSign() < 0){ if(getVolumeSign() < 0){
...@@ -478,6 +488,7 @@ class MHexahedron : public MElement { ...@@ -478,6 +488,7 @@ class MHexahedron : public MElement {
int getTypeForMSH(){ return HEX1; } int getTypeForMSH(){ return HEX1; }
int getTypeForUNV(){ return 115; } // BRICK int getTypeForUNV(){ return 115; } // BRICK
char *getStringForPOS(){ return "SH"; } char *getStringForPOS(){ return "SH"; }
char *getStringForBDF(){ return "CHEXA"; }
virtual int getVolumeSign() virtual int getVolumeSign()
{ {
double mat[3][3]; double mat[3][3];
...@@ -535,6 +546,7 @@ class MHexahedron2 : public MHexahedron { ...@@ -535,6 +546,7 @@ class MHexahedron2 : public MHexahedron {
int getTypeForMSH(){ return HEX2; } int getTypeForMSH(){ return HEX2; }
int getTypeForUNV(){ return 116; } // ???? BRICK2 int getTypeForUNV(){ return 116; } // ???? BRICK2
char *getStringForPOS(){ return "SH2"; } char *getStringForPOS(){ return "SH2"; }
char *getStringForBDF(){ return 0; }
void setVolumePositive() void setVolumePositive()
{ {
if(getVolumeSign() < 0){ if(getVolumeSign() < 0){
...@@ -592,6 +604,7 @@ class MPrism : public MElement { ...@@ -592,6 +604,7 @@ class MPrism : public MElement {
int getTypeForMSH(){ return PRI1; } int getTypeForMSH(){ return PRI1; }
int getTypeForUNV(){ return 112; } // WEDGE int getTypeForUNV(){ return 112; } // WEDGE
char *getStringForPOS(){ return "SI"; } char *getStringForPOS(){ return "SI"; }
char *getStringForBDF(){ return "CPENTA"; }
virtual int getVolumeSign() virtual int getVolumeSign()
{ {
double mat[3][3]; double mat[3][3];
...@@ -645,6 +658,7 @@ class MPrism2 : public MPrism { ...@@ -645,6 +658,7 @@ class MPrism2 : public MPrism {
int getTypeForMSH(){ return PRI2; } int getTypeForMSH(){ return PRI2; }
int getTypeForUNV(){ return 113; } // ???? WEDGE2 int getTypeForUNV(){ return 113; } // ???? WEDGE2
char *getStringForPOS(){ return "SI2"; } char *getStringForPOS(){ return "SI2"; }
char *getStringForBDF(){ return 0; }
void setVolumePositive() void setVolumePositive()
{ {
if(getVolumeSign() < 0){ if(getVolumeSign() < 0){
...@@ -698,6 +712,7 @@ class MPyramid : public MElement { ...@@ -698,6 +712,7 @@ class MPyramid : public MElement {
int getTypeForMSH(){ return PYR1; } int getTypeForMSH(){ return PYR1; }
int getTypeForUNV(){ throw; } int getTypeForUNV(){ throw; }
char *getStringForPOS(){ return "SY"; } char *getStringForPOS(){ return "SY"; }
char *getStringForBDF(){ return 0; }
virtual int getVolumeSign() virtual int getVolumeSign()
{ {
double mat[3][3]; double mat[3][3];
...@@ -749,6 +764,7 @@ class MPyramid2 : public MPyramid { ...@@ -749,6 +764,7 @@ class MPyramid2 : public MPyramid {
int getTypeForMSH(){ return PYR2; } int getTypeForMSH(){ return PYR2; }
int getTypeForUNV(){ throw; } int getTypeForUNV(){ throw; }
char *getStringForPOS(){ return "SY2"; } char *getStringForPOS(){ return "SY2"; }
char *getStringForBDF(){ return 0; }
void setVolumePositive() void setVolumePositive()
{ {
if(getVolumeSign() < 0){ if(getVolumeSign() < 0){
......
// $Id: MVertex.cpp,v 1.6 2006-08-19 18:48:06 geuzaine Exp $ // $Id: MVertex.cpp,v 1.7 2006-08-31 21:29:18 geuzaine Exp $
// //
// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
// //
...@@ -83,3 +83,9 @@ void MVertex::writeMESH(FILE *fp, double scalingFactor) ...@@ -83,3 +83,9 @@ void MVertex::writeMESH(FILE *fp, double scalingFactor)
fprintf(fp, " %20.14E %20.14E %20.14E %d\n", fprintf(fp, " %20.14E %20.14E %20.14E %d\n",
x() * scalingFactor, y() * scalingFactor, z() * scalingFactor, 0); x() * scalingFactor, y() * scalingFactor, z() * scalingFactor, 0);
} }
void MVertex::writeBDF(FILE *fp, double scalingFactor)
{
fprintf(fp, "GRID,%d,%d,%f,%f,%f\n", _num, 0,
x() * scalingFactor, y() * scalingFactor, z() * scalingFactor);
}
...@@ -83,6 +83,7 @@ class MVertex{ ...@@ -83,6 +83,7 @@ class MVertex{
void writeVRML(FILE *fp, double scalingFactor=1.0); void writeVRML(FILE *fp, double scalingFactor=1.0);
void writeUNV(FILE *fp, double scalingFactor=1.0); void writeUNV(FILE *fp, double scalingFactor=1.0);
void writeMESH(FILE *fp, double scalingFactor=1.0); void writeMESH(FILE *fp, double scalingFactor=1.0);
void writeBDF(FILE *fp, double scalingFactor=1.0);
}; };
class MEdgeVertex : public MVertex{ class MEdgeVertex : public MVertex{
......
// $Id: CreateFile.cpp,v 1.5 2006-08-31 14:15:29 geuzaine Exp $ // $Id: CreateFile.cpp,v 1.6 2006-08-31 21:29:18 geuzaine Exp $
// //
// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
// //
...@@ -60,6 +60,7 @@ int GuessFileFormatFromFileName(char *name) ...@@ -60,6 +60,7 @@ int GuessFileFormatFromFileName(char *name)
else if(!strcmp(ext, ".unv")) return FORMAT_UNV; else if(!strcmp(ext, ".unv")) return FORMAT_UNV;
else if(!strcmp(ext, ".stl")) return FORMAT_STL; else if(!strcmp(ext, ".stl")) return FORMAT_STL;
else if(!strcmp(ext, ".mesh")) return FORMAT_MESH; else if(!strcmp(ext, ".mesh")) return FORMAT_MESH;
else if(!strcmp(ext, ".bdf")) return FORMAT_BDF;
else if(!strcmp(ext, ".wrl")) return FORMAT_VRML; else if(!strcmp(ext, ".wrl")) return FORMAT_VRML;
else if(!strcmp(ext, ".vrml")) return FORMAT_VRML; else if(!strcmp(ext, ".vrml")) return FORMAT_VRML;
else if(!strcmp(ext, ".gif")) return FORMAT_GIF; else if(!strcmp(ext, ".gif")) return FORMAT_GIF;
...@@ -88,6 +89,7 @@ void GetDefaultFileName(int format, char *name) ...@@ -88,6 +89,7 @@ void GetDefaultFileName(int format, char *name)
case FORMAT_UNV: strcpy(ext, ".unv"); break; case FORMAT_UNV: strcpy(ext, ".unv"); break;
case FORMAT_STL: strcpy(ext, ".stl"); break; case FORMAT_STL: strcpy(ext, ".stl"); break;
case FORMAT_MESH: strcpy(ext, ".mesh"); break; case FORMAT_MESH: strcpy(ext, ".mesh"); break;
case FORMAT_BDF: strcpy(ext, ".bdf"); break;
case FORMAT_VRML: strcpy(ext, ".wrl"); break; case FORMAT_VRML: strcpy(ext, ".wrl"); break;
case FORMAT_GIF: strcpy(ext, ".gif"); break; case FORMAT_GIF: strcpy(ext, ".gif"); break;
case FORMAT_JPEG: strcpy(ext, ".jpg"); break; case FORMAT_JPEG: strcpy(ext, ".jpg"); break;
...@@ -163,6 +165,10 @@ void CreateOutputFile(char *filename, int format) ...@@ -163,6 +165,10 @@ void CreateOutputFile(char *filename, int format)
GMODEL->writeMESH(name, CTX.mesh.scaling_factor); GMODEL->writeMESH(name, CTX.mesh.scaling_factor);
break; break;
case FORMAT_BDF:
GMODEL->writeBDF(name, CTX.mesh.scaling_factor);
break;
case FORMAT_POS: case FORMAT_POS:
GMODEL->writePOS(name); GMODEL->writePOS(name);
break; break;
......
// $Id: OpenFile.cpp,v 1.118 2006-08-26 15:13:22 remacle Exp $ // $Id: OpenFile.cpp,v 1.119 2006-08-31 21:29:18 geuzaine Exp $
// //
// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
// //
...@@ -293,6 +293,9 @@ int MergeProblem(char *name, int warn_if_missing) ...@@ -293,6 +293,9 @@ int MergeProblem(char *name, int warn_if_missing)
else if(!strcmp(ext, ".mesh") || !strcmp(ext, ".MESH")){ else if(!strcmp(ext, ".mesh") || !strcmp(ext, ".MESH")){
status = GMODEL->readMESH(name); status = GMODEL->readMESH(name);
} }
else if(!strcmp(ext, ".bdf") || !strcmp(ext, ".BDF")){
status = GMODEL->readBDF(name);
}
#if defined(HAVE_FLTK) #if defined(HAVE_FLTK)
else if(!strcmp(ext, ".pnm") || !strcmp(ext, ".PNM") || else if(!strcmp(ext, ".pnm") || !strcmp(ext, ".PNM") ||
!strcmp(ext, ".pbm") || !strcmp(ext, ".PBM") || !strcmp(ext, ".pbm") || !strcmp(ext, ".PBM") ||
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment