/////////////////////////////////////////////////////////////////////////////////////////////// // Ermittlung des Startindex lStartInd entsprechend dem vorgegebenen RefLine-Modus HRESULT CGeoEditExtension::GetStartIndex (long lONr, RefLine rfLine, IEnumLONG* pEnumIn, long& lStartInd) { WObjektGeometrie wObj; // ObjektGeometrie des lONr-Objektes try { WInitObjektGeometrie wIObj (CLSID_ObjektGeometrie); // throws_com_error THROW_FAILED_HRESULT (wIObj->InitObjGeometry (lONr)); wObj = wIObj; } catch (_com_error& e) { return _COM_ERROR (e); } KoOrd* plXK; KoOrd* plYK; long* plCnt; // Anzahl der Stützpunkte in den Konturen wObj->GetX ((void**)&plXK); wObj->GetY ((void**)&plYK); wObj->GetLPCnt (&plCnt); switch (rfLine) { case EDIT_RECTANGULAR: // gemeinsame Strecke zu Objekten der lONr-Objektklasse, die // schon rechtwinklig gemacht wurden if (S_OK != CommonLineWithRectObject (lONr, plXK, plYK, plCnt[0], lStartInd)) LongestLine (plXK, plYK, plCnt[0], lStartInd); break; case EDIT_COMMON: // gemeinsame Strecke zu Objekten vorgebbarer Objektklassen if (pEnumIn && // besagte Objektklassen sind tatsächlich vorgegeben S_OK == CommonLine (lONr, plXK, plYK, plCnt[0], pEnumIn, lStartInd)) break; case EDIT_LONGEST: // die längste Strecke LongestLine (plXK, plYK, plCnt[0], lStartInd); break; case EDIT_SOUTHERN: // die südlichste Strecke SouthernmostLine (plXK, plYK, plCnt[0], lStartInd); break; } return S_OK; } // GetStartIndex
/* CopyResults: copy results from one file to another up to lastGen*/ int CopyResults (FILE *toFile, char *fromFileName, int lastGen) { int longestLine; char *strBuf, *strCpy, *word; FILE *fromFile; if ((fromFile = OpenBinaryFileR(fromFileName)) == NULL) return ERROR; longestLine = LongestLine(fromFile)+10; SafeFclose(&fromFile); strBuf = (char *) SafeCalloc (2*(longestLine+2),sizeof(char)); strCpy = strBuf + longestLine + 2; if ((fromFile = OpenTextFileR(fromFileName)) == NULL) return ERROR; while (fgets(strBuf,longestLine,fromFile)!=NULL) { strncpy(strCpy,strBuf,longestLine); word = strtok(strCpy," "); /* atoi returns 0 when word is not integer number */ if (atoi(word)>lastGen) break; fprintf (toFile,"%s",strBuf); fflush (toFile); } SafeFclose(&fromFile); free(strBuf); return (NO_ERROR); }
/* CopyTreeResults: copy tree results upto lastGen from one file to another. numTrees is return containing number of trees that were copied. */ int CopyTreeResults (FILE *toFile, char *fromFileName, int lastGen, int *numTrees) { int longestLine; char *strBuf, *strCpy, *word; FILE *fromFile; (*numTrees) = 0; if ((fromFile = OpenBinaryFileR(fromFileName)) == NULL) return ERROR; longestLine = LongestLine(fromFile)+10; SafeFclose(&fromFile); strBuf = (char *) SafeCalloc (2*(longestLine+2),sizeof(char)); strCpy = strBuf + longestLine + 2; if ((fromFile = OpenTextFileR(fromFileName)) == NULL) return ERROR; while (fgets(strBuf,longestLine,fromFile)!=NULL) { strncpy(strCpy,strBuf,longestLine); word = strtok(strCpy," "); if (strcmp(word,"tree")==0) { word = strtok(NULL," "); /* atoi returns 0 when word is not integer number, 4 is offset to get rid of "rep." in tree name */ if (atoi(word+4)>lastGen) break; (*numTrees)++; fprintf (toFile,"%s",strBuf); } else if (*numTrees == 0) /* do not print the end statement */ fprintf (toFile,"%s",strBuf); fflush (toFile); } SafeFclose(&fromFile); free(strBuf); return (NO_ERROR); }
/* CopyProcessSsFile: copy results from one file to another up to lastStep. Also marginalLnLSS is collected for processed steps*/ int CopyProcessSsFile (FILE *toFile, char *fromFileName, int lastStep, MrBFlt *marginalLnLSS, MrBFlt * splitfreqSS) { int longestLine, run, curStep, i; double tmp; char *strBuf, *strCpy, *word, *tmpcp; FILE *fromFile; if ((fromFile = OpenBinaryFileR(fromFileName)) == NULL) return ERROR; longestLine = LongestLine(fromFile)+10; SafeFclose(&fromFile); strBuf = (char *) SafeCalloc (2*(longestLine+2),sizeof(char)); strCpy = strBuf + longestLine + 2; if ((fromFile = OpenTextFileR(fromFileName)) == NULL) return ERROR; while (fgets(strBuf,longestLine,fromFile)!=NULL) { strncpy(strCpy,strBuf,longestLine); word = strtok(strCpy," \t\n"); /* atoi returns 0 when word is not integer number */ if (atoi(word)>lastStep) break; fprintf (toFile,"%s",strBuf); fflush (toFile); curStep = atoi(word); if ( curStep > 0 ) { strtok(NULL,"\t\n"); /*skip power*/ for (run=0; run<chainParams.numRuns; run++) { tmpcp = strtok(NULL,"\t\n"); if(tmpcp == NULL ) { MrBayesPrint ("%s Error: In .ss file not enough ellements on the string :%s \n", spacer, strBuf); return ERROR; } tmp = atof(tmpcp); if(tmp == 0.0 ) { MrBayesPrint ("%s Error: Value of some step contribution is 0.0 or not a number in .ss file. Sting:%s \n", spacer, strBuf); return ERROR; } marginalLnLSS[run]+=tmp; } for (i=0; i<numTopologies; i++) { tmpcp = strtok(NULL,"\t\n"); if(tmpcp == NULL ) { MrBayesPrint ("%s Error: In .ss file not enough ellements on the string :%s \n", spacer, strBuf); return ERROR; } tmp = atof(tmpcp); splitfreqSS[i*chainParams.numStepsSS + curStep-1] = tmp; } } } SafeFclose(&fromFile); free(strBuf); return (NO_ERROR); }