mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-06-13 07:23:03 +00:00
Refactor folder (#10475)
Move many third-party components' source codes from the src folder to a new folder called deps_src. The goal is to make the code structure clearer and easier to navigate.
This commit is contained in:
224
deps_src/qhull/src/libqhullcpp/RboxPoints.cpp
Normal file
224
deps_src/qhull/src/libqhullcpp/RboxPoints.cpp
Normal file
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user