00001 #include <QtGui>
00002 #include "rivfile.h"
00003
00004 #include <iomanip>
00005
00006 #include <fstream>
00007 using namespace std;
00008
00009 #include "../../pihmLIBS/extractRiver4mTIN.h"
00010 #include "../../pihmLIBS/addFID.h"
00011 #include "../../pihmLIBS/addToFromNode.h"
00012 #include "../../pihmLIBS/addSOrder.h"
00013 #include "../../pihmLIBS/calDownSegment.h"
00014
00015 #include "../../pihmLIBS/helpDialog/helpdialog.h"
00016 #include "../../pihmLIBS/shapefil.h"
00017
00018 rivFileDlg::rivFileDlg(QWidget *parent)
00019 {
00020 setupUi(this);
00021 connect(riverFileButton, SIGNAL(clicked()), this, SLOT(riverBrowse()));
00022 connect(eleFileButton, SIGNAL(clicked()), this, SLOT(eleBrowse()));
00023 connect(nodeFileButton, SIGNAL(clicked()), this, SLOT(nodeBrowse()));
00024 connect(neighFileButton, SIGNAL(clicked()), this, SLOT(neighBrowse()));
00025 connect(rivFileButton, SIGNAL(clicked()), this, SLOT(rivBrowse()));
00026 connect(runButton, SIGNAL(clicked()), this, SLOT(run()));
00027 connect(helpButton, SIGNAL(clicked()), this, SLOT(help()));
00028 connect(cancelButton, SIGNAL(clicked()), this, SLOT(close()));
00029 }
00030
00031 void rivFileDlg::riverBrowse()
00032 {
00033 QString str = QFileDialog::getOpenFileName(this, "Choose File", "~/","shp File(*.shp *.SHP)");
00034 riverLineEdit->setText(str);
00035 }
00036
00037
00038 void rivFileDlg::eleBrowse()
00039 {
00040 QString str = QFileDialog::getOpenFileName(this, "Choose File", "~/","ele File(*.ele *.ELE)");
00041 eleLineEdit->setText(str);
00042 }
00043
00044 void rivFileDlg::nodeBrowse()
00045 {
00046 QString str = QFileDialog::getOpenFileName(this, "Choose File", "~/","node File(*.node *.NODE)");
00047 nodeLineEdit->setText(str);
00048 }
00049
00050 void rivFileDlg::neighBrowse()
00051 {
00052 QString str = QFileDialog::getOpenFileName(this, "Choose File", "~/","neigh File(*.neigh *.NEIGH)");
00053 neighLineEdit->setText(str);
00054 }
00055
00056
00057 void rivFileDlg::rivBrowse()
00058 {
00059 QString temp = QFileDialog::getSaveFileName(this, "Choose File", "~/", "riv File(*.riv *RIV)");
00060 QString tmp = temp;
00061 if(!(tmp.lower()).endsWith(".riv")){
00062 tmp.append(".riv");
00063 temp = tmp;
00064 }
00065 rivLineEdit->setText(temp);
00066 }
00067
00068 void rivFileDlg::run()
00069 {
00070
00071 QString logFileName("c:\log.html");
00072 ofstream log;
00073 log.open(logFileName.ascii());
00074 log<<"<html><body><font size=3 color=black><p> Verifying Files...</p></font></body></html>";
00075 log.close();
00076 messageLog->setSource(logFileName);
00077 messageLog->setFocus();
00078 messageLog->setModified(TRUE);
00079
00080 ifstream ele, node, neigh, river;
00081 ofstream riv;
00082
00083 ele.open((eleLineEdit->text()).ascii());
00084 node.open((nodeLineEdit->text()).ascii());
00085 neigh.open((neighLineEdit->text()).ascii());
00086 river.open((riverLineEdit->text()).ascii());
00087
00088 riv.open((rivLineEdit->text()).ascii(), ios::out);
00089
00090 int runFlag = 1;
00091
00092 log.open(logFileName.ascii(), ios::app);
00093 if((eleLineEdit->text()).length()==0){
00094 log<<"<p><font size=3 color=red> Error! Please input .ele Input File</p>";
00095 runFlag = 0;
00096 }
00097 else{
00098 log<<"<p>Checking... "<<(eleLineEdit->text()).ascii()<<"... ";
00099 if(ele == NULL){
00100 log<<"<font size=3 color=red> Error!</p>";
00101
00102 runFlag = 0;
00103 }
00104 else
00105 log<<"Done!</p>";
00106 }
00107 log.close();
00108 messageLog->reload();
00109 QApplication::processEvents();
00110
00111
00112 log.open(logFileName.ascii(), ios::app);
00113 if((nodeLineEdit->text()).length()==0){
00114 log<<"<p><font size=3 color=red> Error! Please input .node Input File</p>";
00115 runFlag = 0;
00116 }
00117 else{
00118 log<<"<p>Checking... "<<(nodeLineEdit->text()).ascii()<<"... ";
00119 if(node == NULL){
00120 log<<"<font size=3 color=red> Error!</p>";
00121
00122 runFlag = 0;
00123 }
00124 else
00125 log<<"Done!</p>";
00126 }
00127 log.close();
00128 messageLog->reload();
00129 QApplication::processEvents();
00130
00131
00132 log.open(logFileName.ascii(), ios::app);
00133 if((neighLineEdit->text()).length()==0){
00134 log<<"<p><font size=3 color=red> Error! Please input .neigh Input File</p>";
00135 runFlag = 0;
00136 }
00137 else{
00138 log<<"<p>Checking... "<<(neighLineEdit->text()).ascii()<<"... ";
00139 if(neigh == NULL){
00140 log<<"<font size=3 color=red> Error!</p>";
00141
00142 runFlag = 0;
00143 }
00144 else
00145 log<<"Done!</p>";
00146 }
00147 log.close();
00148 messageLog->reload();
00149 QApplication::processEvents();
00150
00151
00152 log.open(logFileName.ascii(), ios::app);
00153 if((riverLineEdit->text()).length()==0){
00154 log<<"<p><font size=3 color=red> Error! Please input Split River File File</p>";
00155 runFlag = 0;
00156 }
00157 else{
00158 log<<"<p>Checking... "<<(riverLineEdit->text()).ascii()<<"... ";
00159 if(river == NULL){
00160 log<<"<font size=3 color=red> Error!</p>";
00161
00162 runFlag = 0;
00163 }
00164 else
00165 log<<"Done!</p>";
00166 }
00167 log.close();
00168 messageLog->reload();
00169 QApplication::processEvents();
00170
00171
00172 log.open(logFileName.ascii(), ios::app);
00173 if((rivLineEdit->text()).length()==0){
00174 log<<"<p><font size=3 color=red> Error! Please input Output River File</p>";
00175 runFlag = 0;
00176 }
00177 else{
00178 log<<"<p>Checking... "<<(rivLineEdit->text()).ascii()<<"... ";
00179 if(riv == NULL){
00180 log<<"<font size=3 color=red> Error!</p>";
00181
00182 runFlag = 0;
00183 }
00184 else
00185 log<<"Done!</p>";
00186 }
00187 log.close();
00188 messageLog->reload();
00189 QApplication::processEvents();
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213 if(runFlag == 1){
00214
00215
00216
00217
00218 QString shpFileName((riverLineEdit->text()).ascii());
00219 QString dbfFileName(shpFileName);
00220 dbfFileName.truncate(dbfFileName.length()-3);
00221 dbfFileName.append("dbf");
00222
00223 QString newshp(shpFileName);
00224 QString newdbf(shpFileName);
00225
00226 int slashPos = newshp.findRev("/");
00227 newshp.truncate(slashPos);
00228 newdbf.truncate(slashPos);
00229
00230 newshp.append("/temp.shp");
00231 newdbf.append("/temp.dbf");
00232
00233 qWarning("\n%s", newshp.ascii());
00234 qWarning("\n%s", newdbf.ascii());
00235
00236 QString eleFileName((eleLineEdit->text()).ascii());
00237 QString nodeFileName((nodeLineEdit->text()).ascii());
00238 QString neighFileName((neighLineEdit->text()).ascii());
00239
00240 log.open(logFileName.ascii(), ios::app);
00241 log<<"<p>Extracting River from TIN (MESH)...";
00242 log.close();
00243 messageLog->reload();
00244 QApplication::processEvents();
00245
00246 extractRiver4mTIN(shpFileName.ascii(),dbfFileName.ascii(),eleFileName.ascii(),nodeFileName.ascii(),neighFileName.ascii(), newshp.ascii(), newdbf.ascii());
00247
00248 log.open(logFileName.ascii(), ios::app);
00249 log<<" Done!</p>";
00250 log.close();
00251 messageLog->reload();
00252 QApplication::processEvents();
00253
00254
00255 log.open(logFileName.ascii(), ios::app);
00256 log<<"<p>Adding FID...";
00257 log.close();
00258 messageLog->reload();
00259 QApplication::processEvents();
00260
00261 addFID(newdbf.ascii());
00262
00263 log.open(logFileName.ascii(), ios::app);
00264 log<<" Done!</p>";
00265 log.close();
00266 messageLog->reload();
00267 QApplication::processEvents();
00268
00269
00270
00271 log.open(logFileName.ascii(), ios::app);
00272 log<<"<p>Computing To and From Node information...";
00273 log.close();
00274 messageLog->reload();
00275 QApplication::processEvents();
00276
00277 addToFromNode(newdbf.ascii(), newshp.ascii());
00278
00279 log.open(logFileName.ascii(), ios::app);
00280 log<<" Done!</p>";
00281 log.close();
00282 messageLog->reload();
00283 QApplication::processEvents();
00284
00285
00286
00287 log.open(logFileName.ascii(), ios::app);
00288 log<<"<p>Computing Stream Order...";
00289 log.close();
00290 messageLog->reload();
00291 QApplication::processEvents();
00292
00293 addSOrder(newdbf.ascii(), newshp.ascii());
00294
00295 log.open(logFileName.ascii(), ios::app);
00296 log<<" Done!</p>";
00297 log.close();
00298 messageLog->reload();
00299 QApplication::processEvents();
00300
00301
00302
00303 log.open(logFileName.ascii(), ios::app);
00304 log<<"<p>Calculating Down Segments...";
00305 log.close();
00306 messageLog->reload();
00307 QApplication::processEvents();
00308
00309 calDownSegment(newdbf.ascii());
00310
00311 log.open(logFileName.ascii(), ios::app);
00312 log<<" Done!</p>";
00313 log.close();
00314 messageLog->reload();
00315 QApplication::processEvents();
00316
00317
00318
00319 log.open(logFileName.ascii(), ios::app);
00320 log<<"<p>Writing .riv file...";
00321 log.close();
00322 messageLog->reload();
00323 QApplication::processEvents();
00324
00325
00326 DBFHandle dbf = DBFOpen(newdbf.ascii(), "rb");
00327
00328 int fid = DBFGetFieldIndex(dbf, "FID");
00329 int fromTriNode = DBFGetFieldIndex(dbf, "FromTriNode");
00330 int toTriNode = DBFGetFieldIndex(dbf, "ToTriNode");
00331 int downSeg = DBFGetFieldIndex(dbf, "DownSegmt");
00332 int leftEle = DBFGetFieldIndex(dbf, "LeftEle");
00333 int rightEle = DBFGetFieldIndex(dbf, "RightEle");
00334 int order = DBFGetFieldIndex(dbf, "S_Order");
00335
00336 int totCount = DBFGetRecordCount(dbf);
00337 riv<<totCount<<"\n";
00338 int orderVal;
00339 int maxOrder = -1;
00340 for (int c=0; c<totCount; c++){
00341 riv<<DBFReadIntegerAttribute(dbf, c, fid) <<"\t";
00342 riv<<DBFReadIntegerAttribute(dbf, c, fromTriNode)<<"\t";
00343 riv<<DBFReadIntegerAttribute(dbf, c, toTriNode) <<"\t";
00344 riv<<DBFReadIntegerAttribute(dbf, c, downSeg) <<"\t";
00345 riv<<DBFReadIntegerAttribute(dbf, c, leftEle) <<"\t";
00346 riv<<DBFReadIntegerAttribute(dbf, c, rightEle) <<"\t";
00347 orderVal = DBFReadIntegerAttribute(dbf, c, order);
00348 riv<<orderVal <<"\t";
00349 riv<<orderVal <<"\t";
00350 riv<<orderVal <<"\t";
00351 riv<<"0" <<"\t";
00352 riv<<"0" <<"\n";
00353
00354 if(maxOrder < orderVal)
00355 maxOrder = orderVal;
00356 }
00357 riv<<"Shape\t" <<maxOrder<<"\n";
00358 riv<<"Material\t"<<maxOrder<<"\n";
00359 riv<<"IC\t" <<maxOrder<<"\n";
00360 riv<<"BC\t" <<"0" <<"\n";
00361 riv<<"RES\t" <<"0" <<"\n";
00362
00363
00364 log.open(logFileName.ascii(), ios::app);
00365 log<<" Done!</p>";
00366 log.close();
00367 messageLog->reload();
00368 QApplication::processEvents();
00369
00370 }
00371 riv.close();
00372
00373 log.open(logFileName.ascii(), ios::app);
00374 log<<"<p><font size=3 color=red>Note: Please add SHAPE, MATERIAL, INITIAL AND BOUNDARY CONDITION at the end of the .riv file MANUALLY</p>";
00375 log.close();
00376 messageLog->reload();
00377 QApplication::processEvents();
00378
00379 }
00380
00381 void rivFileDlg::help()
00382 {
00383 helpDialog* hlpDlg = new helpDialog(this, "Riv File", 1, "helpFiles/rivfile.html", "Help :: Riv File");
00384 hlpDlg->show();
00385 }