예제 #1
0
/**
 * Text mode STL reader.
 *
 * The reader should be ablet to read some information even when the fil is
 * truncated or otherwise broken without crashing.
 *
 * \returns no error code, it fails silently, but creates an intact (possibly incomplete) dataset
 */
int ETModelTextSTL::Load()
{
    NTri = 2048;
    tri = (ETTriangle*)calloc(NTri, sizeof(ETTriangle));
    
    char buf[1024];
    
    // read "solid name" (we already verified that);
    for (;;) {
        if (FEof()) break;
        FGetS(buf, 1023);
        char *src = buf;
        if (Find(src, "solid")) break;
    }
    
    for (;;) {
        char *src = buf;
        for (;;) {
            if (FEof()) break;
            buf[0] = 0;
            FGetS(buf, 1023); src = buf;
            // read "facet normal ni nj nk"
            if (Find(src, "facet normal")) break;
        }
        if (NTri==nTri) {
            NTri += 2048;
            tri = (ETTriangle*)realloc(tri, NTri*sizeof(ETTriangle));
        }
        ETTriangle &t = tri[nTri];
        if (sscanf(src, "%f %f %f", &t.n.x, &t.n.y, &t.n.z)!=3) break;
        if (!t.n.isFinite()) continue;
        // read "outer loop"
        FGetS(buf, 1023); src = buf;
        if (!Find(src, "outer loop")) break;
        // read "vertex x y z"
        FGetS(buf, 1023); src = buf;
        if (!Find(src, "vertex")) break;
        if (sscanf(src, "%f %f %f", &t.p0.x, &t.p0.y, &t.p0.z)!=3) break;
        if (!t.p0.isFinite()) continue;
        // read "vertex x y z"
        FGetS(buf, 1023); src = buf;
        if (!Find(src, "vertex")) break;
        if (sscanf(src, "%f %f %f", &t.p1.x, &t.p1.y, &t.p1.z)!=3) break;
        if (!t.p1.isFinite()) continue;
        // read "vertex x y z"
        FGetS(buf, 1023); src = buf;
        if (!Find(src, "vertex")) break;
        if (sscanf(src, "%f %f %f", &t.p2.x, &t.p2.y, &t.p2.z)!=3) break;
        if (!t.p2.isFinite()) continue;
        // read "outer loop"
        FGetS(buf, 1023); src = buf;
        if (!Find(src, "endloop")) break;
        // read "outer loop"
        FGetS(buf, 1023); src = buf;
        if (!Find(src, "endfacet")) break;
        // don't increment the counter until we are sure that the triangle is read.
        nTri++;
    }
    return 1;
}
예제 #2
0
int ConfigFile::_ReadEntry(const char *entry, char *buf, int bufSize,bool strip )
{
/*
  功能:读取entry的值
  参数:
  entry[IN]:entry名称
  buf[IN]:存放entry的值的缓冲区
  bufSize[IN]:缓冲区长度
  strip[IN]:去除空格标志
  返回值:
  成功返回读取的长度
  失败返回-1
*/
    char lineBuf[1024];
    //memset(lineBuf,0,1024);
    char *p, *cur;
    int  len;

    cur  = buf;
    *cur = '\0';
    len  = -1;
    while(FGetS(lineBuf,1023,fin))
    {
        if( isTitleLine( lineBuf ) )       // section fis ended
            break;

        p = textPos( lineBuf, entry );     // not equal this entry
        if( p == 0 )
            continue;

        if( strip )
            stripQuotationChar( p );

        len = strlen(p);
        if( bufSize-1 < len )
            len = bufSize-1;

        strncpy( cur, p, len );
        cur[len] = 0;
        break;
    }

    return len;
}
예제 #3
0
bool ConfigFile::gotoSection(const char *section )
{
/*
	功能:移动文件指针到指定section的开始处
	参数:
		section[IN]:要查找的section
	返回值:
		找到并定位返回true
		否则返回false
*/
	char line[1024];
   fseek(fin,0,SEEK_SET);

	while( FGetS(line,1024,fin)!=NULL)
   {
	   if( containTitle( line, section ) )
		   return true;
   }
	return false;
}