コード例 #1
0
ファイル: IfcGeomServer.cpp プロジェクト: VTREEM/IfcOpenShell
int main () {
    // Redirect stdout to this stream, so that involuntary
    // writes to stdout do not interfere with our protocol.
    std::ostringstream oss;
    stdout_redir = oss.rdbuf();
    stdout_orig = std::cout.rdbuf();
    std::cout.rdbuf(stdout_redir);

#ifdef SET_BINARY_STREAMS
    _setmode(_fileno(stdout), _O_BINARY);
    std::cout.setf(std::ios_base::binary);
    _setmode(_fileno(stdin), _O_BINARY);
    std::cin.setf(std::ios_base::binary);
#endif

    bool has_more = false;

    IfcGeom::Iterator<float>* iterator = 0;

    Hello().write(std::cout);

    int exit_code = 0;
    for (;;) {
        const int32_t msg_type = sread<int32_t>(std::cin);
        switch (msg_type) {
        case IFC_MODEL: {
            IfcModel m;
            m.read(std::cin);
            std::string::size_type len = m.string().size();
            char* data = new char[len];
            memcpy(data, m.string().c_str(), len);

            IfcGeom::IteratorSettings settings;
            settings.use_world_coords() = false;
            settings.weld_vertices() = false;
            settings.convert_back_units() = true;
            settings.include_curves() = true;

            iterator = new IfcGeom::Iterator<float>(settings, data, (int)len);
            has_more = iterator->initialize();

            More(has_more).write(std::cout);
            continue;
        }
        case GET: {
            Get g;
            g.read(std::cin);
            if (!has_more) {
                exit_code = 1;
                break;
            }
            const IfcGeom::TriangulationElement<float>* geom = static_cast<const IfcGeom::TriangulationElement<float>*>(iterator->get());
            Entity(geom).write(std::cout);
            continue;
        }
        case NEXT: {
            Next n;
            n.read(std::cin);
            has_more = iterator->next();
            if (!has_more) {
                delete iterator;
                iterator = 0;
            }
            More(has_more).write(std::cout);
            continue;
        }
        case GET_LOG: {
            GetLog gl;
            gl.read(std::cin);
            WriteLog(iterator->getLog()).write(std::cout);
            continue;
        }
        case BYE: {
            Bye().write(std::cout);
            exit_code = 0;
            break;
        }
        default:
            exit_code = 1;
            break;
        }
        break;
    }
    std::cout.rdbuf(stdout_orig);
    return exit_code;
}