mirror of
https://github.com/mcneel/opennurbs.git
synced 2026-03-02 20:47:00 +08:00
204 lines
5.0 KiB
C++
204 lines
5.0 KiB
C++
#include "../opennurbs_public_examples.h"
|
|
|
|
static void Usage(const char* exe_name)
|
|
{
|
|
if (nullptr == exe_name)
|
|
exe_name = "example_convert";
|
|
|
|
printf(
|
|
"Usage: %s input.3dm output.3dm [--version=0] [--log=logfile_path]\n"
|
|
" version is one of 1, 2, 3, 4, 5, 50, 60.\n"
|
|
" Default version is %d.\n"
|
|
" logfile_path is the path to the text log representing the file that was read.\n"
|
|
"\n",
|
|
exe_name,
|
|
ON_BinaryArchive::CurrentArchiveVersion()
|
|
);
|
|
|
|
printf(
|
|
"%s reads a 3dm file and writes a new 3dm file using the specified file version.\n"
|
|
"If the optional --version argument is not specified, a version %d file is written.\n"
|
|
"If an error or warning occurs during conversion, this program ends with exit code 1.\n"
|
|
"Successful conversion ends with exit code 0.\n\n",
|
|
exe_name,
|
|
ON_BinaryArchive::CurrentArchiveVersion()
|
|
);
|
|
}
|
|
|
|
static bool HasErrorsOrWarnings(ON_TextLog* log, const char* operation)
|
|
{
|
|
ON_String msg;
|
|
if (ON_GetErrorCount() > 0)
|
|
{
|
|
msg.Format("%d errors: %s\n", ON_GetErrorCount(), operation);
|
|
log->Print(msg);
|
|
return true;
|
|
}
|
|
if (ON_GetWarningCount() > 0)
|
|
{
|
|
msg.Format("%d warnings: %s\n", ON_GetErrorCount(), operation);
|
|
log->Print(msg);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int main(int argc, const char *argv[])
|
|
{
|
|
// If you are using OpenNURBS as a Windows DLL, then you MUST use
|
|
// ON::OpenFile() to open the file. If you are not using OpenNURBS
|
|
// as a Windows DLL, then you may use either ON::OpenFile() or fopen()
|
|
// to open the file.
|
|
|
|
int argi;
|
|
if (argc < 2)
|
|
{
|
|
Usage(argv[0]);
|
|
return 0;
|
|
}
|
|
|
|
// Call once in your application to initialze opennurbs library
|
|
ON::Begin();
|
|
|
|
int version = 0; // write current Rhino file
|
|
|
|
// default dump is to stdout
|
|
ON_TextLog dump_to_stdout;
|
|
ON_TextLog* dump = &dump_to_stdout;
|
|
|
|
ON_String input;
|
|
ON_String output;
|
|
ON_String logfile;
|
|
|
|
for (argi = 1; argi < argc; argi++)
|
|
{
|
|
ON_String arg(argv[argi]);
|
|
|
|
if (arg.Left(10).CompareOrdinal("--version=", true) == 0)
|
|
{
|
|
arg = arg.Mid(10);
|
|
version = atoi(arg);
|
|
continue;
|
|
}
|
|
|
|
if (arg.Left(2).CompareOrdinal("/v", true) == 0 || arg.Left(2).CompareOrdinal("-v", true) == 0)
|
|
{
|
|
argi++;
|
|
const char* sversion = argv[argi];
|
|
version = atoi(sversion);
|
|
continue;
|
|
}
|
|
|
|
if (arg.Left(6).CompareOrdinal("--log=", true) == 0)
|
|
{
|
|
arg = arg.Mid(6);
|
|
logfile = arg;
|
|
continue;
|
|
}
|
|
|
|
if (input.IsEmpty())
|
|
{
|
|
input = arg;
|
|
if (false == ON_FileStream::Is3dmFile(input, true))
|
|
{
|
|
input = ON_String::EmptyString;
|
|
break;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if (output.IsEmpty())
|
|
{
|
|
output = arg;
|
|
continue;
|
|
}
|
|
|
|
// Invalid command line parameter
|
|
input = ON_String::EmptyString;
|
|
output = ON_String::EmptyString;
|
|
break;
|
|
}
|
|
|
|
if (input.IsEmpty() || output.IsEmpty())
|
|
{
|
|
Usage(argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
|
|
dump->Print("\nOpenNURBS Archive File: %s\n", static_cast<const char*>(input) );
|
|
|
|
// open file containing opennurbs archive
|
|
FILE* archive_fp = ON_FileStream::Open3dmToRead(input);
|
|
if (nullptr == archive_fp)
|
|
{
|
|
dump->Print(" Unable to open file.\n");
|
|
return 1;
|
|
}
|
|
|
|
dump->PushIndent();
|
|
|
|
// create achive object from file pointer
|
|
ON_BinaryFile archive(ON::archive_mode::read3dm, archive_fp);
|
|
|
|
// read the contents of the file into "model"
|
|
ONX_Model model;
|
|
bool rc = model.Read(archive, dump);
|
|
// close the file
|
|
ON::CloseFile(archive_fp);
|
|
|
|
if (false == rc)
|
|
{
|
|
dump->Print("Errors during reading.\n");
|
|
return 1;
|
|
}
|
|
|
|
if (HasErrorsOrWarnings(dump, "reading input file"))
|
|
return 1;
|
|
|
|
// print diagnostic
|
|
dump->Print("Successfully read.\n");
|
|
|
|
// Write file
|
|
model.m_sStartSectionComments = "Converted by example_convert.exe";
|
|
bool outrc = model.Write(output, version, dump);
|
|
if (HasErrorsOrWarnings(dump, "writing output file\n"))
|
|
return 1;
|
|
|
|
if (outrc)
|
|
{
|
|
dump->Print("model.Write(%s) succeeded.\n", static_cast<const char*>(output));
|
|
ONX_Model model2;
|
|
if (model2.Read(output, dump))
|
|
{
|
|
dump->Print("model2.Read(%s) succeeded.\n", static_cast<const char*>(output));
|
|
if (HasErrorsOrWarnings(dump, "verifying output file"))
|
|
return 1;
|
|
|
|
if (!logfile.IsEmpty())
|
|
{
|
|
FILE* fp = ON::OpenFile(logfile, "w");
|
|
ON_TextLog log(fp);
|
|
model2.Dump(log);
|
|
ON::CloseFile(fp);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
dump->Print("model2.Read(%s) failed.\n", static_cast<const char*>(output));
|
|
}
|
|
|
|
dump->PopIndent();
|
|
}
|
|
|
|
// OPTIONAL: Call just before your application exits to clean
|
|
// up opennurbs class definition information.
|
|
// Opennurbs will not work correctly after ON::End()
|
|
// is called.
|
|
ON::End();
|
|
|
|
return 0;
|
|
}
|
|
|