diff options
author | bubnikv <bubnikv@gmail.com> | 2018-09-19 12:02:24 +0300 |
---|---|---|
committer | bubnikv <bubnikv@gmail.com> | 2018-09-19 12:02:24 +0300 |
commit | 0558b53493a77bae44831cf87bb0f59359828ef5 (patch) | |
tree | c3e8dbdf7d91a051c12d9ebbf7606d41047fea96 /src/qhull/src/libqhullcpp/RboxPoints.cpp | |
parent | 3ddaccb6410478ad02d8c0e02d6d8e6eb1785b9f (diff) |
WIP: Moved sources int src/, separated most of the source code from Perl.
The XS was left only for the unit / integration tests, and it links
libslic3r only. No wxWidgets are allowed to be used from Perl starting
from now.
Diffstat (limited to 'src/qhull/src/libqhullcpp/RboxPoints.cpp')
-rw-r--r-- | src/qhull/src/libqhullcpp/RboxPoints.cpp | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/src/qhull/src/libqhullcpp/RboxPoints.cpp b/src/qhull/src/libqhullcpp/RboxPoints.cpp new file mode 100644 index 000000000..d7acd9fce --- /dev/null +++ b/src/qhull/src/libqhullcpp/RboxPoints.cpp @@ -0,0 +1,224 @@ +/**************************************************************************** +** +** Copyright (c) 2008-2015 C.B. Barber. All rights reserved. +** $Id: //main/2015/qhull/src/libqhullcpp/RboxPoints.cpp#3 $$Change: 2066 $ +** $DateTime: 2016/01/18 19:29:17 $$Author: bbarber $ +** +****************************************************************************/ + +#include "libqhullcpp/RboxPoints.h" + +#include "libqhullcpp/QhullError.h" + +#include <iostream> + +using std::cerr; +using std::endl; +using std::istream; +using std::ostream; +using std::ostringstream; +using std::string; +using std::vector; +using std::ws; + +#ifdef _MSC_VER // Microsoft Visual C++ -- warning level 4 +#pragma warning( disable : 4996) // function was declared deprecated(strcpy, localtime, etc.) +#endif + +namespace orgQhull { + +#//! RboxPoints -- generate random PointCoordinates for qhull (rbox) + + +#//!\name Constructors +RboxPoints:: +RboxPoints() +: PointCoordinates("rbox") +, rbox_new_count(0) +, rbox_status(qh_ERRnone) +, rbox_message() +{ + allocateQhullQh(); +} + +//! Allocate and generate points according to rboxCommand +//! For rbox commands, see http://www.qhull.org/html/rbox.htm or html/rbox.htm +//! Same as appendPoints() +RboxPoints:: +RboxPoints(const char *rboxCommand) +: PointCoordinates("rbox") +, rbox_new_count(0) +, rbox_status(qh_ERRnone) +, rbox_message() +{ + allocateQhullQh(); + // rbox arguments added to comment() via qh_rboxpoints > qh_fprintf_rbox + appendPoints(rboxCommand); +} + +RboxPoints:: +~RboxPoints() +{ + delete qh(); + resetQhullQh(0); +} + +// RboxPoints and qh_rboxpoints has several fields in qhT (rbox_errexit..cpp_object) +// It shares last_random with qh_rand and qh_srand +// The other fields are unused +void RboxPoints:: +allocateQhullQh() +{ + QHULL_LIB_CHECK /* Check for compatible library */ + resetQhullQh(new QhullQh); +}//allocateQhullQh + +#//!\name Messaging + +void RboxPoints:: +clearRboxMessage() +{ + rbox_status= qh_ERRnone; + rbox_message.clear(); +}//clearRboxMessage + +std::string RboxPoints:: +rboxMessage() const +{ + if(rbox_status!=qh_ERRnone){ + return rbox_message; + } + if(isEmpty()){ + return "rbox warning: no points generated\n"; + } + return "rbox: OK\n"; +}//rboxMessage + +int RboxPoints:: +rboxStatus() const +{ + return rbox_status; +} + +bool RboxPoints:: +hasRboxMessage() const +{ + return (rbox_status!=qh_ERRnone); +} + +#//!\name Methods + +//! Appends points as defined by rboxCommand +//! Appends rboxCommand to comment +//! For rbox commands, see http://www.qhull.org/html/rbox.htm or html/rbox.htm +void RboxPoints:: +appendPoints(const char *rboxCommand) +{ + string s("rbox "); + s += rboxCommand; + char *command= const_cast<char*>(s.c_str()); + if(qh()->cpp_object){ + throw QhullError(10001, "Qhull error: conflicting user of cpp_object for RboxPoints::appendPoints() or corrupted qh_qh"); + } + if(extraCoordinatesCount()!=0){ + throw QhullError(10067, "Qhull error: Extra coordinates (%d) prior to calling RboxPoints::appendPoints. Was %s", extraCoordinatesCount(), 0, 0.0, comment().c_str()); + } + countT previousCount= count(); + qh()->cpp_object= this; // for qh_fprintf_rbox() + int status= qh_rboxpoints(qh(), command); + qh()->cpp_object= 0; + if(rbox_status==qh_ERRnone){ + rbox_status= status; + } + if(rbox_status!=qh_ERRnone){ + throw QhullError(rbox_status, rbox_message); + } + if(extraCoordinatesCount()!=0){ + throw QhullError(10002, "Qhull error: extra coordinates (%d) for PointCoordinates (%x)", extraCoordinatesCount(), 0, 0.0, coordinates()); + } + if(previousCount+newCount()!=count()){ + throw QhullError(10068, "Qhull error: rbox specified %d points but got %d points for command '%s'", newCount(), count()-previousCount, 0.0, comment().c_str()); + } +}//appendPoints + +}//namespace orgQhull + +#//!\name Global functions + +/*-<a href="qh-user.htm#TOC" +>-------------------------------</a><a name="qh_fprintf_rbox">-</a> + + qh_fprintf_rbox(qh, fp, msgcode, format, list of args ) + fp is ignored (replaces qh_fprintf_rbox() in userprintf_rbox.c) + cpp_object == RboxPoints + +notes: + only called from qh_rboxpoints() + same as fprintf() and Qhull.qh_fprintf() + fgets() is not trapped like fprintf() + Do not throw errors from here. Use qh_errexit_rbox; + A similar technique can be used for qh_fprintf to capture all of its output +*/ +extern "C" +void qh_fprintf_rbox(qhT *qh, FILE*, int msgcode, const char *fmt, ... ) { + va_list args; + + using namespace orgQhull; + + if(!qh->cpp_object){ + qh_errexit_rbox(qh, 10072); + } + RboxPoints *out= reinterpret_cast<RboxPoints *>(qh->cpp_object); + va_start(args, fmt); + if(msgcode<MSG_OUTPUT){ + char newMessage[MSG_MAXLEN]; + // RoadError provides the message tag + vsnprintf(newMessage, sizeof(newMessage), fmt, args); + out->rbox_message += newMessage; + if(out->rbox_status<MSG_ERROR || out->rbox_status>=MSG_STDERR){ + out->rbox_status= msgcode; + } + va_end(args); + return; + } + switch(msgcode){ + case 9391: + case 9392: + out->rbox_message += "RboxPoints error: options 'h', 'n' not supported.\n"; + qh_errexit_rbox(qh, 10010); + /* never returns */ + case 9393: // FIXUP QH11026 countT vs. int + { + int dimension= va_arg(args, int); + string command(va_arg(args, char*)); + countT count= va_arg(args, countT); + out->setDimension(dimension); + out->appendComment(" \""); + out->appendComment(command.substr(command.find(' ')+1)); + out->appendComment("\""); + out->setNewCount(count); + out->reservePoints(); + } + break; + case 9407: + *out << va_arg(args, int); + // fall through + case 9405: + *out << va_arg(args, int); + // fall through + case 9403: + *out << va_arg(args, int); + break; + case 9408: + *out << va_arg(args, double); + // fall through + case 9406: + *out << va_arg(args, double); + // fall through + case 9404: + *out << va_arg(args, double); + break; + } + va_end(args); +} /* qh_fprintf_rbox */ + |