/**************************************************************************** ** ** Copyright (C) 2019 Minnesota Department of Transportation ** Office of Materials & Road Research ** 1400 Gervais Avenue ** Saint Paul, Minnesota 55109-2044 ** USA ** http://www.dot.state.mn.us/materials/pvmtdesign/software.html ** ** ** $QT_BEGIN_LICENSE:GPL$ ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** If you did not receive a copy of the GNU General Public License ** see http://www.gnu.org/licenses ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MNPAVE_H #define MNPAVE_H #include #include #include #include #include #include #include #include #include #include #include #include #include const double GROWTH = 1.0; // Traffic Growth Rate const QString APP = "mnpave"; const QString APPTITLE = "MnPAVE"; const QString APPEXT = "mp7"; const QString COPYRIGHT = "©"; const QString DEFHELP = "./help/mprhelp_en.htm"; //"./help/mphelp_en.htm"; const QString PAVETXT[] = {"Flexible", "Rigid", ""}; const QString DISTRICT[] = {"D1", "D2", "D3", "D4", "Metro", "D6", "D7", "D8"}; const QString SPECTXT[] = {"MnDOT Average", "MnDOT Heavy", "MEPDG Default"}; const QString RBASE[] = {"Class 5", "Class 5Q", "Open Graded"}; const int PAVEMENT = 1; // 0 = Flexible, 1 = Rigid, 2 = either const int MONTH = 4; const int YEAR = 2019; const int VERSION = 7000; //7.000 const int RIGADJ = 4000; // temporary adjustment for display version const bool RESTRICTED = false; // Turn off features for special restricted contractor versions. // Search all files for RESTRICTED to find all modifications. const QString RESTEXT = "TH 610 DESIGN"; // Title for the special restricted version const bool BETA = false; const int FLEXIBLE = 0; const int RIGID = 1; const int BOTH = 2; const int LANDW = 640; // main window landscape width const int LANDH = 480; // main window landscape height const int PORTW = 430; // main window portrait width const int PORTH = 690; // main window portrait height const int MAPW = 777; // map width in pixels const int MAPH = 855; // map height in pixels const int DEC_MIN = 2; // places to round coordinate minutes const int DISTCO[] = {68,3,17,2,61,54,6,33}; // default county for each district // Default structures const int HMA2 = 0x2BCCC; //HMA, Soil, Undist Soil const int HMA3 = 0x28BCC; //HMA, Agg Base, Soil, Undist Soil const int HMA4 = 0x289BC; //HMA, Agg Base, Subbase, Soil, Undist Soil const int HMAOL = 0x238BC; //HMA, Old HMA, Agg Base, Soil, Undist Soil namespace Ui { class mnpave; } class mnpave : public QMainWindow { Q_OBJECT public: explicit mnpave(QWidget *parent = 0); ~mnpave(); bool Read(const QString &fileName); // main.cpp needs to access this double val[4]; // holds user-entered doubles bool *bsi; // SI units or English; points to bList[0] to make code more clear double *H[4][3]; // Sublayers thickness (0 if nDet = -1) private: bool bmodified; // document was edited (warn on close or new) bool bdefault; // defaults have been restored bool bspin; // spinner was used bool bopen; // file was opened bool bxml; // xml file was imported bool bedit[8]; // Indicates data was edited int nPavement; // Program Mode: FLEXIBLE, RIGID or BOTH int nVersion; // Converted from QApplication::GetApplicationVersion() int nDistrict, nCounty; // district, county & soil indexes int nCount; int nHlab; // Thickness button label long trucks; // Calcuated lifetime trucks for rigid double reliability; // Reliability level for rigid double cracked; // Allowable cracked slabs double HCADTadj; // Adjustment factor for very heavy loads // double val[4]; // holds user-entered doubles QString tDisclaimer; QString tval[5]; // holds user-entered strings QString tVersion; // current version derived from const int VERSION QString tName; // Main Window name QString tPath; // current path QString tFile; // current filename QString bss[10]; // QPushButton style sheets QRect wRect[99]; // Holds original geometries for widgets QMenu *fileMenu; QMenu *recentFilesMenu; enum { MaxRecentFiles = 6}; QAction *pAction[MaxRecentFiles]; QPushButton *pButton[5]; QDoubleSpinBox *pSpin[4]; // pointers to all widgets QWidget *pW[99]; // pointers to array members bool *bHWarn; // Warn if HMA is too thin for critical stress bool *bBWarn; // Warn if -34 binder is required bool *bMohrAlways; // Always show Mohr window bool *bMohrFail; // only show Mohr window if critical stress test fails bool *bResearch; // research mode bool *bSpectrum; // load spectrum traffic bool *bCompound; // traffic growth mode bool *bPerpetual; // ignore strains below perpetual pavement threshold bool *bUserClimate; // user climate data instead of weather station bool *bPaveT; // user Pavement temperatures (false = Air) bool *bzTSame; // Use the same depth for all HMA lifts bool *bMNTABLE; // include load spectra from MNTABLE for comparison bool *bFirstYearESAL; // First year ESALS (false = design life ESALs) bool *bInterpSpec; // Interpolate spectrum strains to speed calc bool *bFHWA; // Use FHWA vehicle types bool *bHCADT; // Use HCADT in Spectrum estimate (false = ADT) bool *bSeasSpec; // Seasonal Spectra bool *bWIM2Spec; // Use WIM data to calculate Spectrum bool *bUserStruc; // User changed Structure (don't set default layers) bool *bMeanHE; // Use mean H & E values (instead of reduced for confidence) bool *bOverlayRut; // Show rutting for overlay design bool *bOverlayMill; // Enter milled thickness bool *bSIFWD; // SI units in FWD SIM bool *bSILWD; // SI units in LWD SIM bool *bBELLS; // use BELLS3 calculation for FWD pavement temperature bool *bOverBurden; // use overburden values in simulations bool *bOutDamage; // show damage factor (true = Life) bool *bOutZPct; // specify depth percent for layer simulation results bool *bBatchLimits; // eliminate extreme damage values from batch results bool *bAggtest[5]; // soil test used to estimate modulus, layer bool *bSoiltest[5]; // soil test used to estimate modulus, layer bool *bSeason[5]; // is season selected? bool *bAxle[7]; // is axle selected? bool *bSpecEst[5][7]; // Axle type has > 3 load categories [season][axtype] for interpolation bool *bWidened; // PCC widened lane bool *bTied; // PCC tied shoulders int *nFlexLife; int *nFlexLayer; int *nStrucMode; int *nAggTest; int *nSoilTest; int *nCycles; int *nLifts[3]; int *nMat[5]; int *nDet[3][5][12]; // added 3 sublayers int *nSpec[3]; // binder spec for each HMA lift int *nNomMax[3]; // nominal maximum agg size for each HMA lift int *nSpecMode; int *nWitczak; int *nCustWheel; // number of wheels per half axle int *nCustAxle; // number of axles per group int *nSpecRoad; int *nEvalZ[4]; int *nResponse[4]; int *nDirection[4]; int *nLocation[4]; int *nLoads[6]; // number of load categories for each season int *nLoadRange[8][45]; // all load classes [axle type][load class] int *nSeasRange[6][8][45]; // seasonal life reps (Fall, Winter..., All) int *nWIMRange[6][8][45]; // seasonal weigh-in-motion data (Fall, Winter..., All) int *nzT[3]; // temperature depth selections for 3 lifts (0 = 1/3, 1 = 1/2, 2 = constant depth) int *nFWDSIM[3]; // season, layer, sensors int *nLWDLayer; // selected layer int *nLWDMoist[5]; // index for moisture column int *nGeogrid; // aggregate layer containing geogrid (-1: no geogrid) int *nOtherBit; // Other Bituminous material in 2nd layer (0 = Old HMA, 1 = CIR, 2 = SFDR) int *nFatSel; // selected fatigue model (mnpave is the only default model) int *nRutSel; // selected rutting model (mnpave is the only default model) int *nRigidLife; int *nLanes; int *nRigidSpec; int *nJoint; int *nRigidBase; int *nRigidHBase; int *nRigidLayer; int *nSoil; int *nConstType; double *esal; // ESALs/1,000,000 double *HCOV[4]; // Layer thickness COV double *aggTest[4][5]; // aggregate test values [test][layer] double *soilTest[4][5]; // soil test values [test][layer] double *otherTest[5]; // other test values [layer] double *userE[5][5]; // user moduli [season][layer] double *userU[5][5]; // user Poisson's ratios [season][layer] double *userECOV[5][5]; // user modulus COVs [season][layer] double *Wit[3][14]; // Witczak values [lift][pp34,pp38,pp4,pp200,Va,Pb,Pba,Gb,Gsb,Vbeff,f,A,VTS, KV] double *ipct; // traffic growth rate double *Va; // air voids at bottom of HMA double *mph; // traffic speed double *thawDepth; // early spring thaw depth double *userDur[5]; // user season durations double *userAirT[5]; // user seasonal air temperature double *userPaveT[5]; // user seasonal HMA temperature double *AADT; double *simConf; // % used to adjust simulation data according to COV double *aWit[3][14]; // Witczak a values for 3 HMA lifts double *bWit[3][2]; // Witczak b values (Poisson) for 3 HMA lifts double *pTire[10]; // Tire pressure for each axle type (8 is for ESAL, 9 is for custom) double *xSpace[10]; // lateral tire spacing [8] = ESAL, [9] = Custom (others are spectra) double *ySpace[10]; // longitudinal tire spacing [8] = ESAL, [9] = Custom double *vMnDOT[10]; // percentage of MnDOT vehicle types double *vFHWA[10]; // percentage of FHWA vehicle types double *WIMdays[6]; // time that WIM data was collected (by season) [Fall, Winter..., All] double *MohrWtS[6][8]; // for all axles in spectrum (by season) [Fall, Winter..., All][axle] double *CPhiAggBase[6][2]; // c, phi; each array member now contains two C or Phi values (111222) double *CPhiSubbase[6][2]; // c, phi; each array member now contains two C or Phi values (111222) double *MohrWt[2], *MohrP[2], *MohrX[2]; // ESAL critical stress entries double *UInter[5]; // Intermediate Poisson's Ratios double *COVInter[5]; // Intermediate COV double *RFInter[5]; // Intermediate Resistance Factors double *UOther[5]; // Other Poisson's Ratios double *Gamma[4]; // overburden data for first 4 layers double *Ko[4]; double *FWDSIM[6]; // dia, kips, TLo, THi, hour, temp F double *FWDOffset[10]; // max number of sensors (some may be unused) double *LWDSIM[3]; // dia, load, resistance factor double *LWDmils[5]; double *HMAThreshold; double *SoilThreshold; double *Pt; // terminal serviceability value for AASHTO LEF double *EGeogrid; // effective geogrid modulus double *FatMCRel; // mnpave Monte Carlo reliability double *RutMCRel; double *custWt; // custom axle wt (kips) // end of imported MnPAVE doubles double *HCADT; // PCC design traffic double *HPCC; // PCC thickness // convert next 4 into variable custom binder arrays double *userA[3]; // User viscosity factor (3 HMA lifts) double *userVTS[3]; // User viscosity factor (3 HMA lifts) double *userKV[3]; // User kinematic viscosity value (3 HMA lifts) QString *tDistrict; QString *tCounty; QString *tCity; QString *tSP; QString *tHwy; QString *tRP1; QString *tRP2; QString *tConstType; QString *tDesigner; QString *tSoilsEngineer; QString *tNotes; QString *tSpec[3]; // custom HMA spec names // QString tBinderName; // // Serialized variables QList bList; // serialized bool QList iList; // serialized int QList dList; // serialized double QList sList; // serialized QString QList vList; // serialized Other types QList fbList; // user fatigue models QList fdList; QList fsList; QList rbList; // user rutting models QList rdList; QList rsList; void resizeEvent(QResizeEvent *e); void paintEvent(QPaintEvent *); void closeEvent(QCloseEvent *event); void ctrlkey(int nkey); void updateView(); void updateMenu(); void updateInfo(); void updateClimate(); void updateTraffic(); void updateStruc(); void updateOutput(); void loadW(); // sets pointers (pW) to all widgets void assignPointers(); void mpSettings(const QString &file, const int &nmode); void openRecent(); void launchTraffic(int nmode); // launch traffic dialog or just get the rigid spectrum void calcRigid(bool bmsg = false); // choose if insufficient information generates a message box bool Open(); bool askSave(); bool Save(const QString &fileName); bool SaveAs(const QString &fileName); bool Write(const QString &fileName); int loadCoCombo(int ndist, int nco); double desLane(int nLanes); QString newWinTitle(const QString &tTitle); QString checkRigidData(); // make sure all necessary data to calculate is entered private slots: void on_actionCreate_PDF_Report_triggered(); void on_constCombo_activated(int index); void on_lifeEdit_textEdited(const QString &arg1); void on_lifeEdit_editingFinished(); void on_projEdit_textEdited(const QString &arg1); void on_dateEdit_userDateChanged(const QDate &date); void on_routeEdit_textEdited(const QString &arg1); void on_rp1Edit_textEdited(const QString &arg1); void on_rp2Edit_textEdited(const QString &arg1); void on_distCombo_activated(int index); void on_coCombo_activated(int index); void on_mapButton_clicked(); void on_climateButton_clicked(); void on_desEdit_textEdited(const QString &arg1); void on_senEdit_textEdited(const QString &arg1); void on_trafEdit1_textEdited(const QString &arg1); void on_trafEdit1_editingFinished(); void on_trafEdit2_textEdited(const QString &arg1); void on_trafEdit2_editingFinished(); void on_trafCombo1_activated(int index); void on_trafCombo2_activated(int index); void on_trafCombo3_activated(int index); void on_axleButton_clicked(); void on_trafCheck1_clicked(bool checked); void on_trafCheck2_clicked(bool checked); void on_trafButton1_clicked(); void on_calcButton_clicked(); void on_strucCombo1_currentIndexChanged(int index); void on_actionHelp_Topics_triggered(); void on_strucButton1_clicked(); void on_layerButton1_clicked(); void on_layerButton2_clicked(); void on_layerCombo2_activated(int index); void on_layerButton3_clicked(); void on_layerButton4_clicked(); void on_layerButton5_clicked(); void on_layerSpin1_valueChanged(double arg1); void on_layerSpin2_valueChanged(double arg1); void on_layerSpin3_valueChanged(double arg1); void on_layerSpin4_valueChanged(double arg1); void on_actionNew_triggered(); void on_actionOpen_triggered(); void on_actionClose_triggered(); void on_actionSave_triggered(); void on_actionSave_As_triggered(); void on_action1_triggered(); void on_action2_triggered(); void on_action3_triggered(); void on_action4_triggered(); void on_action5_triggered(); void on_action6_triggered(); void on_actionExit_triggered(); void on_actionCut_triggered(); void on_actionCopy_triggered(); void on_actionPaste_triggered(); void on_actionEnglish_triggered(); void on_actionSI_triggered(); void on_actionShow_Binder_Warnings_triggered(); void on_actionShow_Thickness_Warnings_triggered(); void on_actionAlways_Show_Allowable_Stress_triggered(); void on_actionShow_Allowable_Stress_if_Failed_triggered(); void on_actionDesign_triggered(); void on_actionResearch_triggered(); void on_notesButton_clicked(); void on_actionAbout_mnpave_triggered(); private: Ui::mnpave *ui; }; #endif // MNPAVE_H