?? avc_e00parse.c
字號(hào):
*--------------------------------------------------------*/ psInfo->iCurItem = 0; psInfo->numItems = numFixedLines + ((psTxt->numChars-1)/80 + 1); } } else if (psInfo->iCurItem < psInfo->numItems && psInfo->iCurItem < numFixedLines-1 && nLen >=63) { /*------------------------------------------------------------- * Then we have a set of 15 coordinate values... unused ones * are present but are set to 0.00E+00 * * Vals 1 to 4 are X coords of line along which text is drawn * Vals 5 to 8 are the corresponding Y coords * Vals 9 to 11 are the X coords of the text arrow * Vals 12 to 14 are the corresponding Y coords * The 15th value is the height * * Note that the first vertex (values 1 and 5) is duplicated * in the TXT structure... go wonder why??? *------------------------------------------------------------*/ int iCurCoord=0, numCoordPerLine, nItemSize, iVertex; if (psInfo->nPrecision == AVC_SINGLE_PREC) { numCoordPerLine = 5; nItemSize = 14; /* Num of chars for single precision float*/ } else { numCoordPerLine = 3; nItemSize = 21; /* Num of chars for double precision float*/ } iCurCoord = psInfo->iCurItem * numCoordPerLine; for(i=0; i<numCoordPerLine; i++, iCurCoord++) { if (iCurCoord < 4 && (iVertex = iCurCoord % 4) < psTxt->numVerticesLine-1) { psTxt->pasVertices[iVertex+1].x = atof(pszLine+i*nItemSize); /* The first vertex is always duplicated */ if (iVertex == 0) psTxt->pasVertices[0].x = psTxt->pasVertices[1].x; } else if (iCurCoord >= 4 && iCurCoord < 8 && (iVertex = iCurCoord % 4) < psTxt->numVerticesLine-1) { psTxt->pasVertices[iVertex+1].y = atof(pszLine+i*nItemSize); /* The first vertex is always duplicated */ if (iVertex == 0) psTxt->pasVertices[0].y = psTxt->pasVertices[1].y; } else if (iCurCoord >= 8 && iCurCoord < 11 && (iVertex = (iCurCoord-8) % 3) < psTxt->numVerticesArrow) { psTxt->pasVertices[iVertex+psTxt->numVerticesLine].x = atof(pszLine+i*nItemSize); } else if (iCurCoord >= 11 && iCurCoord < 14 && (iVertex = (iCurCoord-8) % 3) < psTxt->numVerticesArrow) { psTxt->pasVertices[iVertex+psTxt->numVerticesLine].y = atof(pszLine+i*nItemSize); } else if (iCurCoord == 14) { psTxt->dHeight = atof(pszLine+i*nItemSize); } } psInfo->iCurItem++; } else if (psInfo->iCurItem < psInfo->numItems && psInfo->iCurItem == numFixedLines-1 && nLen >=14) { /*------------------------------------------------------------- * Line with a -1.000E+02 value, ALWAYS SINGLE PRECISION !!! *------------------------------------------------------------*/ psTxt->f_1e2 = (float)atof(pszLine); psInfo->iCurItem++; } else if (psInfo->iCurItem < psInfo->numItems && psInfo->iCurItem >= numFixedLines) { /*------------------------------------------------------------- * Last line, contains the text string * Note that text can be split in 80 chars chunk and that buffer * has been previously initialized with spaces and '\0'-terminated *------------------------------------------------------------*/ int numLines, iLine; numLines = (psTxt->numChars-1)/80 + 1; iLine = numLines - (psInfo->numItems - psInfo->iCurItem); if (iLine == numLines-1) { strncpy(psTxt->pszText+(iLine*80), pszLine, MIN( nLen, (psTxt->numChars - (iLine*80)) ) ); } else { strncpy(psTxt->pszText+(iLine*80), pszLine, MIN(nLen, 80)); } psInfo->iCurItem++; } else { CPLError(CE_Failure, CPLE_AppDefined, "Error parsing E00 TXT line: \"%s\"", pszLine); psInfo->numItems = psInfo->iCurItem = 0; return NULL; } /*----------------------------------------------------------------- * If we're done parsing this TXT, then reset the ParseInfo, * and return a reference to the TXT structure * Otherwise return NULL, which means that we are expecting more * more lines of input. *----------------------------------------------------------------*/ if (psInfo->iCurItem >= psInfo->numItems) { psInfo->numItems = psInfo->iCurItem = 0; return psTxt; } return NULL;}/********************************************************************** * AVCE00ParseNextTx6Line() * * Take the next line of E00 input for an TX6/TX7 object and parse it. * * Returns NULL if the current object is not complete yet (expecting * more lines of input) or a reference to a complete object if it * is complete. * * The returned object is a reference to an internal data structure. * It should not be modified or freed by the caller. * * If the input is invalid or other problems happen, then a CPLError() * will be generated. CPLGetLastErrorNo() should be called to check * that the line was parsed succesfully. **********************************************************************/AVCTxt *AVCE00ParseNextTx6Line(AVCE00ParseInfo *psInfo, const char *pszLine){ AVCTxt *psTxt; int i, nLen; CPLAssert(psInfo->eFileType == AVCFileTX6); psTxt = psInfo->cur.psTxt; nLen = strlen(pszLine); if (psInfo->numItems == 0) { /*------------------------------------------------------------- * Begin processing a new object, read header line: *------------------------------------------------------------*/ if (nLen < 70) { CPLError(CE_Failure, CPLE_AppDefined, "Error parsing E00 TX6/TX7 line: \"%s\"", pszLine); return NULL; } else { int numVertices; /*--------------------------------------------------------- * System Id is not stored in the E00 file. Annotations are * stored in increasing order of System Id, starting at 1... * so we just increment the previous value. *--------------------------------------------------------*/ psTxt->nTxtId = ++psInfo->nCurObjectId; psTxt->nUserId = AVCE00Str2Int(pszLine, 10); psTxt->nLevel = AVCE00Str2Int(pszLine+10, 10); psTxt->numVerticesLine = AVCE00Str2Int(pszLine+20, 10); psTxt->numVerticesArrow= AVCE00Str2Int(pszLine+30, 10); psTxt->nSymbol = AVCE00Str2Int(pszLine+40, 10); psTxt->n28 = AVCE00Str2Int(pszLine+50, 10); psTxt->numChars = AVCE00Str2Int(pszLine+60, 10); /*--------------------------------------------------------- * Realloc the string buffer and array of vertices *--------------------------------------------------------*/ psTxt->pszText = (char *)CPLRealloc(psTxt->pszText, (psTxt->numChars+1)* sizeof(char)); numVertices = ABS(psTxt->numVerticesLine) + ABS(psTxt->numVerticesArrow); if (numVertices > 0) psTxt->pasVertices = (AVCVertex*)CPLRealloc(psTxt->pasVertices, numVertices*sizeof(AVCVertex)); /*--------------------------------------------------------- * Fill the whole string buffer with spaces we'll just * paste lines in it using strncpy() *--------------------------------------------------------*/ memset(psTxt->pszText, ' ', psTxt->numChars); psTxt->pszText[psTxt->numChars] = '\0'; /*--------------------------------------------------------- * psInfo->iCurItem is the index of the last line that was read. * psInfo->numItems is the number of lines to read. *--------------------------------------------------------*/ psInfo->iCurItem = 0; psInfo->numItems = 8 + numVertices + ((psTxt->numChars-1)/80 + 1); } } else if (psInfo->iCurItem < psInfo->numItems && psInfo->iCurItem < 6 && nLen >=60) { /*------------------------------------------------------------- * Text Justification stuff... 2 sets of 20 int16 values. *------------------------------------------------------------*/ GInt16 *pValue; int numValPerLine=7; if (psInfo->iCurItem < 3) pValue = psTxt->anJust2 + psInfo->iCurItem * 7; else pValue = psTxt->anJust1 + (psInfo->iCurItem-3) * 7; /* Last line of each set contains only 6 values instead of 7 */ if (psInfo->iCurItem == 2 || psInfo->iCurItem == 5) numValPerLine = 6; for(i=0; i<numValPerLine; i++) pValue[i] = AVCE00Str2Int(pszLine + i*10, 10); psInfo->iCurItem++; } else if (psInfo->iCurItem < psInfo->numItems && psInfo->iCurItem == 6 && nLen >=14) { /*------------------------------------------------------------- * Line with a -1.000E+02 value, ALWAYS SINGLE PRECISION !!! *------------------------------------------------------------*/ psTxt->f_1e2 = (float)atof(pszLine); psInfo->iCurItem++; } else if (psInfo->iCurItem < psInfo->numItems && psInfo->iCurItem == 7 && nLen >=42) { /*------------------------------------------------------------- * Line with 3 values, 1st value is text height. *------------------------------------------------------------*/ psTxt->dHeight = atof(pszLine); if (psInfo->nPrecision == AVC_SINGLE_PREC) { psTxt->dV2 = atof(pszLine+14); psTxt->dV3 = atof(pszLine+28); } else { psTxt->dV2 = atof(pszLine+21); psTxt->dV3 = atof(pszLine+42); } psInfo->iCurItem++; } else if (psInfo->iCurItem < (8 + ABS(psTxt->numVerticesLine) + ABS(psTxt->numVerticesArrow)) && nLen >= 28) { /*------------------------------------------------------------- * One line for each pair of X,Y coordinates * (Lines 8 to 8+numVertices-1) *------------------------------------------------------------*/ psTxt->pasVertices[ psInfo->iCurItem-8 ].x = atof(pszLine); if (psInfo->nPrecision == AVC_SINGLE_PREC) psTxt->pasVertices[ psInfo->iCurItem-8 ].y = atof(pszLine+14); else psTxt->pasVertices[ psInfo->iCurItem-8 ].y = atof(pszLine+21); psInfo->iCurItem++; } else if (psInfo->iCurItem < psInfo->numItems) { /*------------------------------------------------------------- * Last line, contains the text string * Note that text can be split in 80 chars chunk and that buffer * has been previously initialized with spaces and '\0'-terminated *------------------------------------------------------------*/ int numLines, iLine; numLines = (psTxt->numChars-1)/80 + 1; iLine = numLines - (psInfo->numItems - psInfo->iCurItem); if (iLine == numLines-1) { strncpy(psTxt->pszText+(iLine*80), pszLine, MIN( nLen, (psTxt->numChars - (iLine*80)) ) ); } else { strncpy(psTxt->pszText+(iLine*80), pszLine, MIN(nLen, 80)); } psInfo->iCurItem++; } else { CPLError(CE_Failure, CPLE_AppDefined, "Error parsing E00 TX6/TX7 line: \"%s\"", pszLine); psInfo->numItems = psInfo->iCurItem = 0; return NULL; } /*----------------------------------------------------------------- * If we're done parsing this TX6/TX7, then reset the ParseInfo, * and return a reference to the TXT structure * Otherwise return NULL, which means that we are expecting more * more lines of input. *----------------------------------------------------------------*/ if (psInfo->iCurItem >= psInfo->numItems) { psInfo->numItems = psInfo->iCurItem = 0; return psTxt; } return NULL;}/********************************************************************** * AVCE00ParseNextRxpLine() * * Take the next line of E00 input for an RXP object and parse it. * * Returns NULL if the current object is not complete yet (expecting * more lines of input) or a reference to a complete object if it * is complete. * * The returned object is a reference to an internal data structure. * It should not be modified or freed by the caller. * * If the input is invalid or other problems happen, then a CPLError() * will be generated. CPLGetLastErrorNo() should be called to check * that the line
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -