qfrontend.cpp
来自「算断裂的」· C++ 代码 · 共 775 行 · 第 1/2 页
CPP
775 行
// ------------------------------------------------------------------// qfrontend.cpp//// This file contains functions associated with the interface to// the front-end language. For this version of qfrontend, the// front-end language is tcl/tk. See qfrontend.h// ------------------------------------------------------------------// Author: Stephen A. Vavasis// Copyright (c) 1999 by Cornell University. All rights reserved.// // See the accompanying file 'Copyright' for authorship information,// the terms of the license governing this software, and disclaimers// concerning this software.// ------------------------------------------------------------------// This file is part of the QMG software. // Version 2.0 of QMG, release date September 3, 1999.// ------------------------------------------------------------------#ifdef _MSC_VER#if _MSC_VER == 1200#include "qmatvec.h"#endif#endif#include "qfrontend.h"#include "qbrep_constr.h"#include "qsimpcomp.h"#include "qmatvec.h"namespace QMG { namespace FrontEnd { using namespace QMG; extern Brep_From_FrontEnd get_brep_from_obj(Tcl_Interp* interp, Tcl_Obj* obj, int& returncode); extern SimpComplex_From_FrontEnd get_simpcomp_from_obj(Tcl_Interp* interp, Tcl_Obj* obj, int& returncode); extern Tcl_Obj* new_simpcomp_obj(Cptc_MshDesc* mesh); extern Tcl_Obj* new_brep_obj(Cptc_GeomDesc* geo); extern Object_Type_Code get_obj_type(Tcl_Interp* interp, Tcl_Obj* obj); }}QMG::FrontEnd::ArgValType::ArgValType(int objc, Tcl_Obj* const objv[], Tcl_Interp* interp) { objc_ = objc - 1; objv_ = &objv[1]; interp_ = interp;}QMG::FrontEnd::ArgValType::~ArgValType() {}void QMG::FrontEnd::ArgValType::verify_nargin(int narginmin, int narginmax, const char* routine_name) const { if (objc_ < narginmin || objc_ > narginmax) { ostringstream ostr; if (narginmin == narginmax) { ostr << "Routine expected " << narginmin << " argument"; if (narginmin != 1) ostr << "s"; } else { ostr << "Routine expected " << narginmin << " to " << narginmax << " arguments"; } ostr << " but " << objc_ << " were given"; throw_error(ostr.str()); }}int QMG::FrontEnd::ArgValType::nargin() const { return objc_;}QMG::string QMG::FrontEnd::ArgValType::get_string(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error 1");#endif return string(Tcl_GetStringFromObj(objv_[argidx],0));}int QMG::FrontEnd::ArgValType::get_int(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error 2");#endif int returnval; int returncode = Tcl_GetIntFromObj(interp_, objv_[argidx], &returnval); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to integer failed"; throw_error(ostr.str()); } return returnval;}double QMG::FrontEnd::ArgValType::get_double(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error 3");#endif double returnval; int returncode = Tcl_GetDoubleFromObj(interp_, objv_[argidx], &returnval); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to double failed"; throw_error(ostr.str()); } return returnval;}QMG::Brep_From_FrontEndQMG::FrontEnd::ArgValType::get_brep(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error 4");#endif int returncode; Brep_From_FrontEnd b = get_brep_from_obj(interp_, objv_[argidx], returncode); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to brep failed"; throw_error(ostr.str()); } return b;}Tcl_Obj*QMG::FrontEnd::ArgValType::get_tcl_obj(int argidx) const { return objv_[argidx];}QMG::SimpComplex_From_FrontEndQMG::FrontEnd::ArgValType::get_simpcomp(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error 4a");#endif int returncode; SimpComplex_From_FrontEnd s = get_simpcomp_from_obj(interp_, objv_[argidx], returncode); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to simpcomplex failed"; throw_error(ostr.str()); } return s;}QMG::Object_Type_Code QMG::FrontEnd::ArgValType::determine_argument_type(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error 4b");#endif Object_Type_Code code = get_obj_type(interp_, objv_[argidx]); if (code != BREP && code != SIMPCOMPLEX) { ostringstream ostr; ostr << "Argument #" << argidx << " is neither simpcomplex nor brep"; throw_error(ostr.str()); } return code;}boolQMG::FrontEnd::ArgValType::get_bool(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error 5");#endif int returnval; int returncode = Tcl_GetIntFromObj(interp_, objv_[argidx], &returnval); if (returncode != TCL_OK || (returnval != 0 && returnval != 1)) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to bool failed"; throw_error(ostr.str()); } return returnval == 1;}#ifndef BUG_IN_USINGusing QMG::vector;#endifvector<double>QMG::FrontEnd::ArgValType::get_vector_double(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error 6");#endif int doublec; Tcl_Obj** doublev; int returncode = Tcl_ListObjGetElements(interp_, objv_[argidx], &doublec, &doublev); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to list failed"; throw_error(ostr.str()); } vector<double> returnval(doublec, 0.0); for (int j = 0; j < doublec; ++j) { returncode = Tcl_GetDoubleFromObj(interp_, doublev[j], &returnval[j]); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " (entry " << j << ") to double failed"; throw_error(ostr.str()); } } return returnval;}vector<QMG::string>QMG::FrontEnd::ArgValType::get_vector_string(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error vs");#endif int stringc; Tcl_Obj** stringv; int returncode = Tcl_ListObjGetElements(interp_, objv_[argidx], &stringc, &stringv); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to list failed"; throw_error(ostr.str()); } vector<string> returnval(stringc, ""); for (int j = 0; j < stringc; ++j) { int strlen1; char* str1 = Tcl_GetStringFromObj(stringv[j], &strlen1); returnval[j] = string(str1, strlen1); } return returnval;}QMG::MatrixQMG::FrontEnd::ArgValType::get_matrix(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error 6a");#endif int numrows; Tcl_Obj** rows; int returncode = Tcl_ListObjGetElements(interp_, objv_[argidx], &numrows, &rows); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to matrix failed -- arg not a list"; throw_error(ostr.str()); } if (numrows == 0) return Matrix(0,0); int numcols; Tcl_Obj** onerow; returncode = Tcl_ListObjGetElements(interp_, rows[0], &numcols, &onerow); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to matrix failed -- first list entry not a list"; throw_error(ostr.str()); } Matrix m(numrows, numcols); int numcols1; double val; for (int j = 0; j < numrows; ++j) { if (j > 0) { returncode = Tcl_ListObjGetElements(interp_, rows[j], &numcols1, &onerow); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to matrix failed -- outer list entry not a list"; throw_error(ostr.str()); } if (numcols1 != numcols) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to matrix failed -- all rows must have same number of entries"; throw_error(ostr.str()); } } for (int k = 0; k < numcols; ++k) { returncode = Tcl_GetDoubleFromObj(interp_, onerow[k], &val); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to matrix failed -- couldn't convert entry to number"; throw_error(ostr.str()); } m(j,k) = val; } } return m;}QMG::MatrixQMG::FrontEnd::ArgValType::get_zbamatrix(int argidx) const {return get_matrix(argidx);}QMG::IntMatrixQMG::FrontEnd::ArgValType::get_intmatrix(int argidx) const {#ifdef RANGECHECK if (argidx < 0 || argidx >= objc_) throw_error("Argidx range error 6a1");#endif int numrows; Tcl_Obj** rows; int returncode = Tcl_ListObjGetElements(interp_, objv_[argidx], &numrows, &rows); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to intmatrix failed -- arg not a list"; throw_error(ostr.str()); } if (numrows == 0) return IntMatrix(0,0); int numcols; Tcl_Obj** onerow; returncode = Tcl_ListObjGetElements(interp_, rows[0], &numcols, &onerow); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to intmatrix failed -- first list entry not a list"; throw_error(ostr.str()); } IntMatrix m(numrows, numcols); int numcols1; int val; for (int j = 0; j < numrows; ++j) { if (j > 0) { returncode = Tcl_ListObjGetElements(interp_, rows[j], &numcols1, &onerow); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to intmatrix failed -- outer list entry not a list"; throw_error(ostr.str()); } if (numcols1 != numcols) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to intmatrix failed -- all rows must have same number of entries"; throw_error(ostr.str()); } } for (int k = 0; k < numcols; ++k) { returncode = Tcl_GetIntFromObj(interp_, onerow[k], &val); if (returncode != TCL_OK) { ostringstream ostr; ostr << "Conversion of argument #" << argidx << " to matrix failed -- couldn't convert entry to number"; throw_error(ostr.str()); } m(j,k) = val; } } return m;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?