Move some examples from Polyhedron to Stream_support

(as they don't make use of CGAL::Polyhedron_3)
This commit is contained in:
Mael Rouxel-Labbé 2020-01-17 14:02:24 +01:00
parent d620198049
commit 5ca88dedc3
27 changed files with 1086 additions and 1076 deletions

View File

@ -1,100 +0,0 @@
// Convert from OFF format to OpenInventor (.iv) format.
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/Inventor_ostream.h>
#include <CGAL/IO/File_writer_inventor.h>
#include <CGAL/IO/generic_copy_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
bool dummy_switch = false;
bool verbose = false;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " convert a CGAL object (OFF) to Open Inventor .iv "
"format." << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* iname = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
iname = filename[0];
}
if ( !*p_in) {
cerr << argv[0] << ": error: cannot open file '"<< iname
<< "' for reading." <<endl;
exit( 1);
}
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "CGAL::generic_copy_OFF( " << iname << ", " << oname
<< ") ...." << endl;
CGAL::Inventor_ostream os( *p_out);
CGAL::File_writer_inventor writer;
CGAL::generic_copy_OFF( *p_in, *p_out, writer);
if(!os) return EXIT_FAILURE;
os.close();
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"
<< iname << "'." << endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] << " write error: while writing file '"
<< oname << "'." << endl;
exit( 1);
}
return 0;
}
// EOF //

View File

@ -1,107 +0,0 @@
// Copies a file in OFF format.
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/File_writer_OFF.h>
#include <CGAL/IO/generic_copy_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
bool verbose = false;
bool binary = false;
bool skel = false;
bool noc = false;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-b", argv[i]) == 0)
binary = true;
else if ( strcmp( "-skel", argv[i]) == 0)
skel = true;
else if ( strcmp( "-noc", argv[i]) == 0)
noc = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " copy an object in OFF." << endl;
cerr << " -b binary (default is ASCII)." << endl;
cerr << " -skel Geomview SKEL format." << endl;
cerr << " -noc no comments in file." << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* iname = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
iname = filename[0];
}
if ( !*p_in) {
cerr << argv[0] << ": error: cannot open file '"<< iname
<< "' for reading." << endl;
exit( 1);
}
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "CGAL::generic_copy_OFF( " << iname << ", " << oname
<< (binary ? ", binary" : ", ASCII") << ") ...." << endl;
CGAL::File_header_OFF header( binary, noc, skel, verbose);
CGAL::File_writer_OFF writer( header);
CGAL::generic_copy_OFF( *p_in, *p_out, writer);
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"
<< iname << "'." << endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] << " write error: while writing file '"
<< oname << "'." << endl;
exit( 1);
}
return 0;
}
// EOF //

View File

@ -1,163 +0,0 @@
// Convert from OFF format to StereoLithography StL format.
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Verbose_ostream.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
bool verbose = false;
bool binary = false;
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point;
typedef Kernel::Vector_3 Vector;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
typedef Polyhedron::Vertex_iterator Vertex_iterator;
typedef Polyhedron::Facet_iterator Facet_iterator;
typedef Polyhedron::Halfedge_handle Halfedge_handle;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-b", argv[i]) == 0)
binary = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " convert a CGAL object (OFF) to StereoLithography StL "
"format." << endl;
cerr << " -v verbose." << endl;
cerr << " -b binary." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* iname = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
iname = filename[0];
}
if ( !*p_in) {
cerr << argv[0] << ": error: cannot open file '"<< iname
<< "' for reading." <<endl;
exit( 1);
}
vout << "Reading polyhedron ..." << endl;
Polyhedron P;
(*p_in) >> P;
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"<< iname << "'."
<< endl;
exit( 1);
}
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "Write file ...." << endl;
*p_out << "solid " << oname << endl;
// find "bottom/left/front" corner to translate into positive octant
Vertex_iterator vi = P.vertices_begin();
Point p = vi->point();
double minx = p.x();
double miny = p.y();
double minz = p.z();
for ( ; vi != P.vertices_end(); ++vi) {
p = vi->point();
if ( p.x() < minx)
minx = p.x();
if ( p.y() < miny)
miny = p.y();
if ( p.z() < minz)
minz = p.z();
}
// translate into positive octant
Vector trans( -minx, -miny, -minz);
for ( Vertex_iterator i = P.vertices_begin(); i != P.vertices_end(); ++i) {
i->point() = i->point() + trans;
}
// write triangles
for ( Facet_iterator i = P.facets_begin(); i != P.facets_end(); ++i) {
Halfedge_handle h = i->halfedge();
if ( h->next()->next()->next() != h) {
cerr << argv[0] << " format error: polyhedron in file '"<<
iname << "' is not triangulated." << endl;
exit( 1);
}
Point p = h->vertex()->point();
Point q = h->next()->vertex()->point();
Point r = h->next()->next()->vertex()->point();
// compute normal
Vector n = CGAL::cross_product( q-p, r-p);
Vector norm = n / std::sqrt( n * n);
*p_out << " facet normal " << norm << endl;
*p_out << " outer loop " << endl;
*p_out << " vertex " << p << endl;
*p_out << " vertex " << q << endl;
*p_out << " vertex " << r << endl;
*p_out << " endloop " << endl;
*p_out << " endfacet " << endl;
}
*p_out << "endsolid " << oname << endl;
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"<< iname << "'."
<< endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] <<" write error: while writing file '"<< oname << "'."
<< endl;
exit( 1);
}
return 0;
}
// EOF //

View File

@ -1,113 +0,0 @@
// Convert from OFF format to VRML (.wrl) 1.0 or 2.0 format.
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/VRML_1_ostream.h>
#include <CGAL/IO/VRML_2_ostream.h>
#include <CGAL/IO/File_writer_inventor.h>
#include <CGAL/IO/File_writer_VRML_2.h>
#include <CGAL/IO/generic_copy_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
bool verbose = false;
int version = 1;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-2", argv[i]) == 0)
version = 2;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " convert a CGAL object (OFF) to VRML .wrl format."
<< endl;
cerr << " -2 VRML 2.0 (default is VRML 1.0)." << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* iname = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
iname = filename[0];
}
if ( !*p_in) {
cerr << argv[0] << ": error: cannot open file '"<< iname
<< "' for reading." <<endl;
exit( 1);
}
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "CGAL::generic_copy_OFF( " << iname << ", " << oname
<< ", V" << version << " ) ...." << endl;
if ( version == 1) {
CGAL::VRML_1_ostream os( *p_out);
CGAL::File_writer_inventor writer;
CGAL::generic_copy_OFF( *p_in, *p_out, writer);
if(!os) return EXIT_FAILURE;
os.close();
} else {
CGAL::VRML_2_ostream os( *p_out);
CGAL::File_writer_VRML_2 writer;
CGAL::generic_copy_OFF( *p_in, *p_out, writer);
if(!os) return EXIT_FAILURE;
os.close();
}
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"<< iname << "'."
<< endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] <<" write error: while writing file '"<< oname << "'."
<< endl;
exit( 1);
}
return 0;
}
// EOF //

View File

@ -1,96 +0,0 @@
// Convert from OFF format to Wavefront (.obj) format.
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/File_writer_wavefront.h>
#include <CGAL/IO/generic_copy_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
bool verbose = false;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " convert a CGAL object (OFF) to Wavefront obj format."
<< endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* iname = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
iname = filename[0];
}
if ( !*p_in) {
cerr << argv[0] << ": error: cannot open file '"<< iname
<< "' for reading." <<endl;
exit( 1);
}
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "CGAL::generic_copy_OFF( " << iname << ", " << oname
<< ") ...." << endl;
CGAL::File_writer_wavefront writer;
CGAL::generic_copy_OFF( *p_in, *p_out, writer);
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"<< iname << "'."
<< endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] <<" write error: while writing file '"<< oname << "'."
<< endl;
exit( 1);
}
return 0;
}
// EOF //

View File

@ -1,127 +0,0 @@
// computes bbox of an OFF object.
#include <CGAL/Bbox_3.h>
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/File_scanner_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
#include <cfloat>
using namespace std;
bool verbose = false;
bool unitcube = false;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[1] = { NULL }; // stop compiler warning (too hard to rewrite the code to avoid it)
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-unit", argv[i]) == 0)
unitcube = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 1 ) {
filename[ n++] = argv[i];
} else {
n++;
break;
}
}
if ((n > 1) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile>]" << endl;
cerr << " computes the bbox of the coordinates of an OFF object."
<< endl;
cerr << " -unit prints transformation to unit cube." << endl;
cerr << " (can be used with 'off_transform')" << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream verr( verbose);
verr << argv[0] << ": verbosity on." << endl;
const char* name = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
name = filename[0];
}
if ( ! * p_in) {
cerr << argv[0] << ": error: cannot open file '"<< name
<< "' for reading." <<endl;
exit( 1);
}
verr << "CGAL::File_scanner_OFF( " << name << ") ...." << endl;
CGAL::File_scanner_OFF scanner( * p_in);
if ( ! * p_in) {
cerr << argv[0] << ": error: file '"<< name
<< "' is not in OFF format." << endl;
std::abort();
}
if ( scanner.size_of_vertices() <= 0) {
cerr << argv[0] << ": error: file '"<< name
<< "' has no vertices." << endl;
std::abort();
}
size_t v = scanner.size_of_vertices();
CGAL::Bbox_3 bbox;
double x, y, z;
scanner.scan_vertex( x, y, z);
bbox = CGAL::Bbox_3( x,y,z, x,y,z);
v--;
while (v--) {
scanner.scan_vertex( x, y, z);
bbox = bbox + CGAL::Bbox_3( x,y,z, x,y,z);
scanner.skip_to_next_vertex( scanner.size_of_vertices() - v - 1);
}
verr << ".... done." << scanner.size_of_vertices() << " points read."
<< endl;
if ( !in) {
cerr << argv[0] << " read error: while reading file '"<< name << "'."
<< endl;
exit( 1);
}
if ( ! unitcube) {
cout << bbox.xmin() << " " << bbox.ymin() << " " << bbox.zmin()
<< '\n';
cout << bbox.xmax() << " " << bbox.ymax() << " " << bbox.zmax()
<< endl;
} else {
double s = DBL_MAX;
double d = bbox.xmax() - bbox.xmin();
if ( d > 0 && 2/d < s)
s = 2/d;
d = bbox.ymax() - bbox.ymin();
if ( d > 0 && 2/d < s)
s = 2/d;
d = bbox.zmax() - bbox.zmin();
if ( d > 0 && 2/d < s)
s = 2/d;
if ( s == DBL_MAX)
s = 1;
cout << "-trans " << (-(bbox.xmin() + bbox.xmax())/2)
<< " " << (-(bbox.ymin() + bbox.ymax())/2)
<< " " << (-(bbox.zmin() + bbox.zmax())/2)
<< " -scale " << s << endl;
}
return 0;
}
// EOF //

View File

@ -1,206 +0,0 @@
// Glue vertices of a polyhedron together that have equal coordinate values.
#include <CGAL/Simple_cartesian.h>
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/File_scanner_OFF.h>
#include <CGAL/IO/File_writer_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point;
typedef Kernel::Vector_3 Vector;
struct Vertex {
Point point;
Vector normal;
int index;
};
typedef vector<Vertex> Vertex_vector;
typedef Vertex_vector::iterator VIterator;
struct VertexComp {
bool operator()( const Vertex* v, const Vertex* w) const {
return ( v->point.x() < w->point.x() ||
(v->point.x() == w->point.x() && v->point.y() < w->point.y()) ||
(v->point.x() == w->point.x() && (v->point.y() == w->point.y()
&& v->point.z() < w->point.z())));
}
};
bool verbose = false;
bool binary = false;
bool skel = false;
bool noc = false;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i=1 ; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-b", argv[i]) == 0)
binary = true;
else if ( strcmp( "-skel", argv[i]) == 0)
skel = true;
else if ( strcmp( "-noc", argv[i]) == 0)
noc = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " glues vertices of equal coordinates together." << endl;
cerr << " -b binary output (default is ASCII)." << endl;
cerr << " -skel Geomview SKEL format." << endl;
cerr << " -noc no comments in file." << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* name = "<cin>";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
name = filename[0];
}
if ( !in) {
cerr << argv[0] << ": error: cannot open file '"<< name
<< "' for reading." <<endl;
exit( 1);
}
CGAL::File_scanner_OFF scanner( * p_in);
if ( ! (*p_in)) {
cerr << " " << endl;
cerr << argv[0] << ": input error: file format is not in OFF." << endl;
std::abort();
}
Vertex_vector vertices;
vector<Vertex*> sorted_vertices;
// Avoid any reallocation
vertices.reserve( scanner.size_of_vertices());
sorted_vertices.reserve( scanner.size_of_vertices());
float x, y, z;
for (std::size_t i = 0; i < scanner.size_of_vertices(); i++) {
Vertex vertex;
scanner.scan_vertex( x, y, z);
vertex.point = Point( x, y, z);
//scanner.scan_normal( x, y, z);
vertex.normal = Vector( x, y, z);
scanner.skip_to_next_vertex( i);
vertex.index = -1;
vertices.push_back( vertex);
sorted_vertices.push_back( & vertices.back());
}
vout << scanner.size_of_vertices() << " vertices read." << endl;
sort( sorted_vertices.begin(), sorted_vertices.end(), VertexComp());
int current_index = 0;
sorted_vertices[0]->index = 0;
for (std::size_t i = 1; i < scanner.size_of_vertices(); i++) {
if ( sorted_vertices[i]->point != sorted_vertices[i-1]->point)
current_index++;
sorted_vertices[i]->index = current_index;
}
current_index++;
vout << "Merged to " << current_index << " vertices." << endl;
const char* oname = "<cout>";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "CGAL::File_writer_OFF( " << (binary ? ", binary" : ", ASCII")
<< ") ...." << endl;
CGAL::File_header_OFF header( binary, noc, skel, verbose);
CGAL::File_writer_OFF writer( header);
writer.write_header(*p_out,
current_index,
0,
scanner.size_of_facets(),
scanner.has_normals());
vector<Vertex*>::iterator v = sorted_vertices.begin();
writer.write_vertex((*v)->point.x(), (*v)->point.y(), (*v)->point.z());
if ( scanner.has_normals()) {
writer.write_normal((*v)->normal.x(),
(*v)->normal.y(),
(*v)->normal.z());
}
++v;
for ( ; v != sorted_vertices.end(); ++v) {
if ( (*v)->index != (*(v-1))->index) {
writer.write_vertex( (*v)->point.x(),
(*v)->point.y(),
(*v)->point.z());
if ( scanner.has_normals()) {
writer.write_normal( (*v)->normal.x(),
(*v)->normal.y(),
(*v)->normal.z());
}
}
}
// Copy facets and translate vertex indices.
writer.write_facet_header();
for (std::size_t i = 0; i < scanner.size_of_facets(); i++) {
std::size_t no; // number of vertices of a facet.
scanner.scan_facet( no, i);
writer.write_facet_begin( no);
for ( std::size_t j = 0; j < no; j++) {
std::size_t index;
scanner.scan_facet_vertex_index( index, i);
writer.write_facet_vertex_index( vertices[index].index);
}
scanner.skip_to_next_facet( i);
writer.write_facet_end();
}
writer.write_footer();
vout << " .... done." << endl;
if ( ! * p_in) {
cerr << argv[0] << " read error: while reading file '"<< name << "'."
<< endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] << " write error: while writing file '"<< oname
<< "'." << endl;
exit( 1);
}
return 0;
}

View File

@ -1,164 +0,0 @@
// Applies translation and scaling to an OFF object.
#include <CGAL/Simple_cartesian.h>
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/File_scanner_OFF.h>
#include <CGAL/IO/File_writer_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point;
typedef Kernel::Vector_3 Vector;
bool verbose = false;
bool binary = false;
bool skel = false;
bool noc = false;
double transx = 0.0;
double transy = 0.0;
double transz = 0.0;
double scale = 1.0;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-b", argv[i]) == 0)
binary = true;
else if ( strcmp( "-skel", argv[i]) == 0)
skel = true;
else if ( strcmp( "-noc", argv[i]) == 0)
noc = true;
else if ( strcmp( "-scale", argv[i]) == 0) {
i++;
if ( i < argc) {
scale = atof( argv[i]);
} else {
cerr << argv[0] << ": error: -scale needs a double parameter."
<< endl;
help = true;
}
} else if ( strcmp( "-trans", argv[i]) == 0) {
i++;
if ( i+2 < argc) {
transx = atof( argv[i]);
i++;
transy = atof( argv[i]);
i++;
transz = atof( argv[i]);
} else {
cerr << argv[0] << ": error: -trans needs three double "
"parameters." << endl;
help = true;
}
} else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " transforms coordinate values of an OFF object."
<< endl;
cerr << " -trans <x> <y> <y> translation." << endl;
cerr << " -scale <s> uniform scaling." << endl;
cerr << " -b binary (default is ASCII)."
<< endl;
cerr << " -skel Geomview SKEL format." << endl;
cerr << " -noc no comments in file." << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream verr( verbose);
verr << argv[0] << ": verbosity on." << endl;
const char* name = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
name = filename[0];
}
if ( ! * p_in) {
cerr << argv[0] << ": error: cannot open file '"<< name
<< "' for reading." <<endl;
exit( 1);
}
verr << "CGAL::File_scanner_OFF( " << name << ") ...." << endl;
CGAL::File_scanner_OFF scanner( * p_in);
if ( ! * p_in) {
cerr << argv[0] << ": error: file '"<< name
<< "' is not in OFF format." << endl;
std::abort();
}
verr << "CGAL::File_writer_OFF( ..." << endl;
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
CGAL::File_header_OFF header( binary, noc, skel, verbose);
CGAL::File_writer_OFF writer( header);
writer.write_header( * p_out,
scanner.size_of_vertices(),
scanner.size_of_halfedges(),
scanner.size_of_facets());
Vector v( transx, transy, transz);
for ( std::size_t k = 0; k < scanner.size_of_vertices(); ++k) {
double x, y, z;
scanner.scan_vertex( x, y, z);
Point q( x, y, z);
q = q + v;
q = CGAL::ORIGIN + ( (q - CGAL::ORIGIN) * scale );
scanner.skip_to_next_vertex( k);
writer.write_vertex( q.x(), q.y(), q.z());
}
verr << " .... done." << scanner.size_of_vertices() << " points read."
<< endl;
if ( ! *p_in) {
cerr << argv[0] << " read error: while reading file '"<< name << "'."
<< endl;
exit( 1);
}
writer.write_facet_header();
* p_out << endl;
char c;
while ( (*p_in).get(c))
* p_out << c;
return 0;
}
// EOF //

View File

@ -28,6 +28,16 @@ if ( CGAL_FOUND )
create_single_source_cgal_program( "read_xml.cpp" ) create_single_source_cgal_program( "read_xml.cpp" )
create_single_source_cgal_program( "iv2off.cpp" )
create_single_source_cgal_program( "off2iv.cpp" )
create_single_source_cgal_program( "off2off.cpp" )
create_single_source_cgal_program( "off2stl.cpp" )
create_single_source_cgal_program( "off2vrml.cpp" )
create_single_source_cgal_program( "off2wav.cpp" )
create_single_source_cgal_program( "off_bbox.cpp" )
create_single_source_cgal_program( "off_glue.cpp" )
create_single_source_cgal_program( "off_transform.cpp" )
else () else ()
message(STATUS "This project requires the CGAL library, and will not be compiled.") message(STATUS "This project requires the CGAL library, and will not be compiled.")
return() return()

View File

@ -0,0 +1,100 @@
// Convert from OFF format to OpenInventor (.iv) format.
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/Inventor_ostream.h>
#include <CGAL/IO/File_writer_inventor.h>
#include <CGAL/IO/generic_copy_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
bool dummy_switch = false;
bool verbose = false;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " convert a CGAL object (OFF) to Open Inventor .iv "
"format." << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* iname = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
iname = filename[0];
}
if ( !*p_in) {
cerr << argv[0] << ": error: cannot open file '"<< iname
<< "' for reading." <<endl;
exit( 1);
}
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "CGAL::generic_copy_OFF( " << iname << ", " << oname
<< ") ...." << endl;
CGAL::Inventor_ostream os( *p_out);
CGAL::File_writer_inventor writer;
CGAL::generic_copy_OFF( *p_in, *p_out, writer);
if(!os) return EXIT_FAILURE;
os.close();
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"
<< iname << "'." << endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] << " write error: while writing file '"
<< oname << "'." << endl;
exit( 1);
}
return 0;
}
// EOF //

View File

@ -0,0 +1,107 @@
// Copies a file in OFF format.
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/File_writer_OFF.h>
#include <CGAL/IO/generic_copy_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
bool verbose = false;
bool binary = false;
bool skel = false;
bool noc = false;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-b", argv[i]) == 0)
binary = true;
else if ( strcmp( "-skel", argv[i]) == 0)
skel = true;
else if ( strcmp( "-noc", argv[i]) == 0)
noc = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " copy an object in OFF." << endl;
cerr << " -b binary (default is ASCII)." << endl;
cerr << " -skel Geomview SKEL format." << endl;
cerr << " -noc no comments in file." << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* iname = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
iname = filename[0];
}
if ( !*p_in) {
cerr << argv[0] << ": error: cannot open file '"<< iname
<< "' for reading." << endl;
exit( 1);
}
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "CGAL::generic_copy_OFF( " << iname << ", " << oname
<< (binary ? ", binary" : ", ASCII") << ") ...." << endl;
CGAL::File_header_OFF header( binary, noc, skel, verbose);
CGAL::File_writer_OFF writer( header);
CGAL::generic_copy_OFF( *p_in, *p_out, writer);
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"
<< iname << "'." << endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] << " write error: while writing file '"
<< oname << "'." << endl;
exit( 1);
}
return 0;
}
// EOF //

View File

@ -0,0 +1,163 @@
// Convert from OFF format to StereoLithography StL format.
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Verbose_ostream.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
bool verbose = false;
bool binary = false;
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point;
typedef Kernel::Vector_3 Vector;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
typedef Polyhedron::Vertex_iterator Vertex_iterator;
typedef Polyhedron::Facet_iterator Facet_iterator;
typedef Polyhedron::Halfedge_handle Halfedge_handle;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-b", argv[i]) == 0)
binary = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " convert a CGAL object (OFF) to StereoLithography StL "
"format." << endl;
cerr << " -v verbose." << endl;
cerr << " -b binary." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* iname = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
iname = filename[0];
}
if ( !*p_in) {
cerr << argv[0] << ": error: cannot open file '"<< iname
<< "' for reading." <<endl;
exit( 1);
}
vout << "Reading polyhedron ..." << endl;
Polyhedron P;
(*p_in) >> P;
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"<< iname << "'."
<< endl;
exit( 1);
}
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "Write file ...." << endl;
*p_out << "solid " << oname << endl;
// find "bottom/left/front" corner to translate into positive octant
Vertex_iterator vi = P.vertices_begin();
Point p = vi->point();
double minx = p.x();
double miny = p.y();
double minz = p.z();
for ( ; vi != P.vertices_end(); ++vi) {
p = vi->point();
if ( p.x() < minx)
minx = p.x();
if ( p.y() < miny)
miny = p.y();
if ( p.z() < minz)
minz = p.z();
}
// translate into positive octant
Vector trans( -minx, -miny, -minz);
for ( Vertex_iterator i = P.vertices_begin(); i != P.vertices_end(); ++i) {
i->point() = i->point() + trans;
}
// write triangles
for ( Facet_iterator i = P.facets_begin(); i != P.facets_end(); ++i) {
Halfedge_handle h = i->halfedge();
if ( h->next()->next()->next() != h) {
cerr << argv[0] << " format error: polyhedron in file '"<<
iname << "' is not triangulated." << endl;
exit( 1);
}
Point p = h->vertex()->point();
Point q = h->next()->vertex()->point();
Point r = h->next()->next()->vertex()->point();
// compute normal
Vector n = CGAL::cross_product( q-p, r-p);
Vector norm = n / std::sqrt( n * n);
*p_out << " facet normal " << norm << endl;
*p_out << " outer loop " << endl;
*p_out << " vertex " << p << endl;
*p_out << " vertex " << q << endl;
*p_out << " vertex " << r << endl;
*p_out << " endloop " << endl;
*p_out << " endfacet " << endl;
}
*p_out << "endsolid " << oname << endl;
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"<< iname << "'."
<< endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] <<" write error: while writing file '"<< oname << "'."
<< endl;
exit( 1);
}
return 0;
}
// EOF //

View File

@ -0,0 +1,113 @@
// Convert from OFF format to VRML (.wrl) 1.0 or 2.0 format.
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/VRML_1_ostream.h>
#include <CGAL/IO/VRML_2_ostream.h>
#include <CGAL/IO/File_writer_inventor.h>
#include <CGAL/IO/File_writer_VRML_2.h>
#include <CGAL/IO/generic_copy_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
bool verbose = false;
int version = 1;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-2", argv[i]) == 0)
version = 2;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " convert a CGAL object (OFF) to VRML .wrl format."
<< endl;
cerr << " -2 VRML 2.0 (default is VRML 1.0)." << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* iname = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
iname = filename[0];
}
if ( !*p_in) {
cerr << argv[0] << ": error: cannot open file '"<< iname
<< "' for reading." <<endl;
exit( 1);
}
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "CGAL::generic_copy_OFF( " << iname << ", " << oname
<< ", V" << version << " ) ...." << endl;
if ( version == 1) {
CGAL::VRML_1_ostream os( *p_out);
CGAL::File_writer_inventor writer;
CGAL::generic_copy_OFF( *p_in, *p_out, writer);
if(!os) return EXIT_FAILURE;
os.close();
} else {
CGAL::VRML_2_ostream os( *p_out);
CGAL::File_writer_VRML_2 writer;
CGAL::generic_copy_OFF( *p_in, *p_out, writer);
if(!os) return EXIT_FAILURE;
os.close();
}
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"<< iname << "'."
<< endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] <<" write error: while writing file '"<< oname << "'."
<< endl;
exit( 1);
}
return 0;
}
// EOF //

View File

@ -0,0 +1,96 @@
// Convert from OFF format to Wavefront (.obj) format.
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/File_writer_wavefront.h>
#include <CGAL/IO/generic_copy_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
bool verbose = false;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " convert a CGAL object (OFF) to Wavefront obj format."
<< endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* iname = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
iname = filename[0];
}
if ( !*p_in) {
cerr << argv[0] << ": error: cannot open file '"<< iname
<< "' for reading." <<endl;
exit( 1);
}
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "CGAL::generic_copy_OFF( " << iname << ", " << oname
<< ") ...." << endl;
CGAL::File_writer_wavefront writer;
CGAL::generic_copy_OFF( *p_in, *p_out, writer);
vout << " .... done." << endl;
if ( !*p_in) {
cerr << argv[0] << " read error: while reading file '"<< iname << "'."
<< endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] <<" write error: while writing file '"<< oname << "'."
<< endl;
exit( 1);
}
return 0;
}
// EOF //

View File

@ -0,0 +1,127 @@
// computes bbox of an OFF object.
#include <CGAL/Bbox_3.h>
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/File_scanner_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
#include <cfloat>
using namespace std;
bool verbose = false;
bool unitcube = false;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[1] = { NULL }; // stop compiler warning (too hard to rewrite the code to avoid it)
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-unit", argv[i]) == 0)
unitcube = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 1 ) {
filename[ n++] = argv[i];
} else {
n++;
break;
}
}
if ((n > 1) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile>]" << endl;
cerr << " computes the bbox of the coordinates of an OFF object."
<< endl;
cerr << " -unit prints transformation to unit cube." << endl;
cerr << " (can be used with 'off_transform')" << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream verr( verbose);
verr << argv[0] << ": verbosity on." << endl;
const char* name = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
name = filename[0];
}
if ( ! * p_in) {
cerr << argv[0] << ": error: cannot open file '"<< name
<< "' for reading." <<endl;
exit( 1);
}
verr << "CGAL::File_scanner_OFF( " << name << ") ...." << endl;
CGAL::File_scanner_OFF scanner( * p_in);
if ( ! * p_in) {
cerr << argv[0] << ": error: file '"<< name
<< "' is not in OFF format." << endl;
std::abort();
}
if ( scanner.size_of_vertices() <= 0) {
cerr << argv[0] << ": error: file '"<< name
<< "' has no vertices." << endl;
std::abort();
}
size_t v = scanner.size_of_vertices();
CGAL::Bbox_3 bbox;
double x, y, z;
scanner.scan_vertex( x, y, z);
bbox = CGAL::Bbox_3( x,y,z, x,y,z);
v--;
while (v--) {
scanner.scan_vertex( x, y, z);
bbox = bbox + CGAL::Bbox_3( x,y,z, x,y,z);
scanner.skip_to_next_vertex( scanner.size_of_vertices() - v - 1);
}
verr << ".... done." << scanner.size_of_vertices() << " points read."
<< endl;
if ( !in) {
cerr << argv[0] << " read error: while reading file '"<< name << "'."
<< endl;
exit( 1);
}
if ( ! unitcube) {
cout << bbox.xmin() << " " << bbox.ymin() << " " << bbox.zmin()
<< '\n';
cout << bbox.xmax() << " " << bbox.ymax() << " " << bbox.zmax()
<< endl;
} else {
double s = DBL_MAX;
double d = bbox.xmax() - bbox.xmin();
if ( d > 0 && 2/d < s)
s = 2/d;
d = bbox.ymax() - bbox.ymin();
if ( d > 0 && 2/d < s)
s = 2/d;
d = bbox.zmax() - bbox.zmin();
if ( d > 0 && 2/d < s)
s = 2/d;
if ( s == DBL_MAX)
s = 1;
cout << "-trans " << (-(bbox.xmin() + bbox.xmax())/2)
<< " " << (-(bbox.ymin() + bbox.ymax())/2)
<< " " << (-(bbox.zmin() + bbox.zmax())/2)
<< " -scale " << s << endl;
}
return 0;
}
// EOF //

View File

@ -0,0 +1,206 @@
// Glue vertices of a polyhedron together that have equal coordinate values.
#include <CGAL/Simple_cartesian.h>
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/File_scanner_OFF.h>
#include <CGAL/IO/File_writer_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point;
typedef Kernel::Vector_3 Vector;
struct Vertex {
Point point;
Vector normal;
int index;
};
typedef vector<Vertex> Vertex_vector;
typedef Vertex_vector::iterator VIterator;
struct VertexComp {
bool operator()( const Vertex* v, const Vertex* w) const {
return ( v->point.x() < w->point.x() ||
(v->point.x() == w->point.x() && v->point.y() < w->point.y()) ||
(v->point.x() == w->point.x() && (v->point.y() == w->point.y()
&& v->point.z() < w->point.z())));
}
};
bool verbose = false;
bool binary = false;
bool skel = false;
bool noc = false;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i=1 ; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-b", argv[i]) == 0)
binary = true;
else if ( strcmp( "-skel", argv[i]) == 0)
skel = true;
else if ( strcmp( "-noc", argv[i]) == 0)
noc = true;
else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " glues vertices of equal coordinates together." << endl;
cerr << " -b binary output (default is ASCII)." << endl;
cerr << " -skel Geomview SKEL format." << endl;
cerr << " -noc no comments in file." << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream vout( verbose);
vout << argv[0] << ": verbosity on." << endl;
const char* name = "<cin>";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
name = filename[0];
}
if ( !in) {
cerr << argv[0] << ": error: cannot open file '"<< name
<< "' for reading." <<endl;
exit( 1);
}
CGAL::File_scanner_OFF scanner( * p_in);
if ( ! (*p_in)) {
cerr << " " << endl;
cerr << argv[0] << ": input error: file format is not in OFF." << endl;
std::abort();
}
Vertex_vector vertices;
vector<Vertex*> sorted_vertices;
// Avoid any reallocation
vertices.reserve( scanner.size_of_vertices());
sorted_vertices.reserve( scanner.size_of_vertices());
float x, y, z;
for (std::size_t i = 0; i < scanner.size_of_vertices(); i++) {
Vertex vertex;
scanner.scan_vertex( x, y, z);
vertex.point = Point( x, y, z);
//scanner.scan_normal( x, y, z);
vertex.normal = Vector( x, y, z);
scanner.skip_to_next_vertex( i);
vertex.index = -1;
vertices.push_back( vertex);
sorted_vertices.push_back( & vertices.back());
}
vout << scanner.size_of_vertices() << " vertices read." << endl;
sort( sorted_vertices.begin(), sorted_vertices.end(), VertexComp());
int current_index = 0;
sorted_vertices[0]->index = 0;
for (std::size_t i = 1; i < scanner.size_of_vertices(); i++) {
if ( sorted_vertices[i]->point != sorted_vertices[i-1]->point)
current_index++;
sorted_vertices[i]->index = current_index;
}
current_index++;
vout << "Merged to " << current_index << " vertices." << endl;
const char* oname = "<cout>";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
vout << "CGAL::File_writer_OFF( " << (binary ? ", binary" : ", ASCII")
<< ") ...." << endl;
CGAL::File_header_OFF header( binary, noc, skel, verbose);
CGAL::File_writer_OFF writer( header);
writer.write_header(*p_out,
current_index,
0,
scanner.size_of_facets(),
scanner.has_normals());
vector<Vertex*>::iterator v = sorted_vertices.begin();
writer.write_vertex((*v)->point.x(), (*v)->point.y(), (*v)->point.z());
if ( scanner.has_normals()) {
writer.write_normal((*v)->normal.x(),
(*v)->normal.y(),
(*v)->normal.z());
}
++v;
for ( ; v != sorted_vertices.end(); ++v) {
if ( (*v)->index != (*(v-1))->index) {
writer.write_vertex( (*v)->point.x(),
(*v)->point.y(),
(*v)->point.z());
if ( scanner.has_normals()) {
writer.write_normal( (*v)->normal.x(),
(*v)->normal.y(),
(*v)->normal.z());
}
}
}
// Copy facets and translate vertex indices.
writer.write_facet_header();
for (std::size_t i = 0; i < scanner.size_of_facets(); i++) {
std::size_t no; // number of vertices of a facet.
scanner.scan_facet( no, i);
writer.write_facet_begin( no);
for ( std::size_t j = 0; j < no; j++) {
std::size_t index;
scanner.scan_facet_vertex_index( index, i);
writer.write_facet_vertex_index( vertices[index].index);
}
scanner.skip_to_next_facet( i);
writer.write_facet_end();
}
writer.write_footer();
vout << " .... done." << endl;
if ( ! * p_in) {
cerr << argv[0] << " read error: while reading file '"<< name << "'."
<< endl;
exit( 1);
}
if ( !*p_out) {
cerr << argv[0] << " write error: while writing file '"<< oname
<< "'." << endl;
exit( 1);
}
return 0;
}

View File

@ -0,0 +1,164 @@
// Applies translation and scaling to an OFF object.
#include <CGAL/Simple_cartesian.h>
#include <CGAL/IO/Verbose_ostream.h>
#include <CGAL/IO/File_scanner_OFF.h>
#include <CGAL/IO/File_writer_OFF.h>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point;
typedef Kernel::Vector_3 Vector;
bool verbose = false;
bool binary = false;
bool skel = false;
bool noc = false;
double transx = 0.0;
double transy = 0.0;
double transz = 0.0;
double scale = 1.0;
// main function with standard unix commandline arguments
// ------------------------------------------------------
int main( int argc, char **argv) {
int n = 0; // number of filenames
char *filename[2];
bool help = false;
for (int i = 1; i < argc; i++) { // check commandline options
if ( strcmp( "-v", argv[i]) == 0)
verbose = true;
else if ( strcmp( "-b", argv[i]) == 0)
binary = true;
else if ( strcmp( "-skel", argv[i]) == 0)
skel = true;
else if ( strcmp( "-noc", argv[i]) == 0)
noc = true;
else if ( strcmp( "-scale", argv[i]) == 0) {
i++;
if ( i < argc) {
scale = atof( argv[i]);
} else {
cerr << argv[0] << ": error: -scale needs a double parameter."
<< endl;
help = true;
}
} else if ( strcmp( "-trans", argv[i]) == 0) {
i++;
if ( i+2 < argc) {
transx = atof( argv[i]);
i++;
transy = atof( argv[i]);
i++;
transz = atof( argv[i]);
} else {
cerr << argv[0] << ": error: -trans needs three double "
"parameters." << endl;
help = true;
}
} else if ( (strcmp( "-h", argv[i]) == 0) ||
(strcmp( "-help", argv[i]) == 0))
help = true;
else if ( n < 2 ) {
filename[ n++] = argv[i];
} else {
++n;
break;
}
}
if ((n > 2) || help) {
if ( ! help)
cerr << "Error: in parameter list" << endl;
cerr << "Usage: " << argv[0] << " [<options>] [<infile> [<outfile>]]"
<< endl;
cerr << " transforms coordinate values of an OFF object."
<< endl;
cerr << " -trans <x> <y> <y> translation." << endl;
cerr << " -scale <s> uniform scaling." << endl;
cerr << " -b binary (default is ASCII)."
<< endl;
cerr << " -skel Geomview SKEL format." << endl;
cerr << " -noc no comments in file." << endl;
cerr << " -v verbose." << endl;
exit( ! help);
}
CGAL::Verbose_ostream verr( verbose);
verr << argv[0] << ": verbosity on." << endl;
const char* name = "cin";
istream* p_in = &cin;
ifstream in;
if ( n > 0) {
in.open( filename[0]);
p_in = &in;
name = filename[0];
}
if ( ! * p_in) {
cerr << argv[0] << ": error: cannot open file '"<< name
<< "' for reading." <<endl;
exit( 1);
}
verr << "CGAL::File_scanner_OFF( " << name << ") ...." << endl;
CGAL::File_scanner_OFF scanner( * p_in);
if ( ! * p_in) {
cerr << argv[0] << ": error: file '"<< name
<< "' is not in OFF format." << endl;
std::abort();
}
verr << "CGAL::File_writer_OFF( ..." << endl;
const char* oname = "cout";
ostream* p_out = &cout;
ofstream out;
if ( n > 1) {
out.open( filename[1]);
p_out = &out;
oname = filename[1];
}
if ( !*p_out) {
cerr << argv[0] << ": error: cannot open file '"<< oname
<< "' for writing." <<endl;
exit( 1);
}
CGAL::File_header_OFF header( binary, noc, skel, verbose);
CGAL::File_writer_OFF writer( header);
writer.write_header( * p_out,
scanner.size_of_vertices(),
scanner.size_of_halfedges(),
scanner.size_of_facets());
Vector v( transx, transy, transz);
for ( std::size_t k = 0; k < scanner.size_of_vertices(); ++k) {
double x, y, z;
scanner.scan_vertex( x, y, z);
Point q( x, y, z);
q = q + v;
q = CGAL::ORIGIN + ( (q - CGAL::ORIGIN) * scale );
scanner.skip_to_next_vertex( k);
writer.write_vertex( q.x(), q.y(), q.z());
}
verr << " .... done." << scanner.size_of_vertices() << " points read."
<< endl;
if ( ! *p_in) {
cerr << argv[0] << " read error: while reading file '"<< name << "'."
<< endl;
exit( 1);
}
writer.write_facet_header();
* p_out << endl;
char c;
while ( (*p_in).get(c))
* p_out << c;
return 0;
}
// EOF //