void OpenRouteServiceRunner::retrieveRoute( const RouteRequest *route ) { if ( route->size() < 2 ) { return; } GeoDataCoordinates source = route->source(); GeoDataCoordinates destination = route->destination(); QHash<QString, QVariant> settings = route->routingProfile().pluginSettings()["openrouteservice"]; QUrlQuery queries; queries.addQueryItem("api_key", "ee0b8233adff52ce9fd6afc2a2859a28"); QString unit = "KM"; QString preference = "Fastest"; if (settings.contains(QStringLiteral("preference"))) { preference = settings[QStringLiteral("preference")].toString(); } if (preference == QLatin1String("Pedestrian")) { unit = QStringLiteral("M"); } queries.addQueryItem("start", formatCoordinates(source)); QStringList via; for (int i = 1; i < route->size()-1; ++i) { via << formatCoordinates(route->at(i)); } queries.addQueryItem("via", via.join(' ')); queries.addQueryItem("end", formatCoordinates(destination)); queries.addQueryItem("distunit", unit); if (preference == "Fastest" || preference == "Shortest" || preference == "Recommended") { queries.addQueryItem("routepref", "Car"); queries.addQueryItem("weighting", preference); } else { queries.addQueryItem("routepref", preference); queries.addQueryItem("weighting", "Recommended"); } QString const motorways = settings.value("noMotorways").toInt() == 0 ? "false" : "true"; queries.addQueryItem("noMotorways", motorways); QString const tollways = settings.value("noTollways").toInt() == 0 ? "false" : "true"; queries.addQueryItem("noTollways", tollways); queries.addQueryItem("noUnpavedroads", "false"); queries.addQueryItem("noSteps", "false"); QString const ferries = settings.value("noFerries").toInt() == 0 ? "false" : "true"; queries.addQueryItem("noFerries", ferries); queries.addQueryItem("instructions", "true"); queries.addQueryItem("lang", "en"); QUrl url = QUrl( "http://openls.geog.uni-heidelberg.de/route" ); // QUrlQuery strips empty value pairs, but OpenRouteService does not work without QString const trailer = route->size() == 2 ? "&via=" : QString(); url.setQuery(queries.toString() + trailer); m_request = QNetworkRequest( url ); QEventLoop eventLoop; QTimer timer; timer.setSingleShot( true ); timer.setInterval( 15000 ); connect( &timer, SIGNAL(timeout()), &eventLoop, SLOT(quit())); connect( this, SIGNAL(routeCalculated(GeoDataDocument*)), &eventLoop, SLOT(quit())); // @todo FIXME Must currently be done in the main thread, see bug 257376 QTimer::singleShot( 0, this, SLOT(get())); timer.start(); eventLoop.exec(); }
bool Cube::save(QString const& filePath, Data::Bank& bank) { // Make sure we have the required data QList<Data::Geometry*> geometries(bank.findData<Data::Geometry>()); if (geometries.isEmpty()) { m_errors.append("No geometry information found"); return false; }else if (geometries.size() > 1) { QLOG_WARN() << "Ambiguous geometry information found in Cube parser"; } Data::Geometry* geometry(geometries.first()); QList<Data::GridData*> grids(bank.findData<Data::GridData>()); if (grids.isEmpty()) { m_errors.append("No grid data found"); return false; }else if (grids.size() > 1) { QLOG_WARN() << "More than one grid specified in Cube parser"; } Data::GridData* grid(grids.first()); QFile file(filePath); if (file.exists() || !file.open(QIODevice::WriteOnly)) { m_errors.append("Failed to open file for write"); return false; } QStringList header; header << "Cube file for " + grid->surfaceType().toString(); header << "Generated using IQmol"; QStringList coords(formatCoordinates(*geometry)); unsigned nx, ny, nz; grid->getNumberOfPoints(nx, ny, nz); qglviewer::Vec delta(grid->delta()); qglviewer::Vec origin(grid->origin()); origin *= Constants::AngstromToBohr; header << QString("%1 %2 %3 %4").arg(coords.size(), 5) .arg(origin.x, 13, 'f', 6) .arg(origin.y, 13, 'f', 6) .arg(origin.z, 13, 'f', 6); header << QString("%1 %2 %3 %4").arg(nx, 5).arg(delta.x, 13, 'f', 6) .arg(0.0, 13, 'f', 6) .arg(0.0, 13, 'f', 6); header << QString("%1 %2 %3 %4").arg(ny, 5).arg(0.0, 13, 'f', 6) .arg(delta.y, 13, 'f', 6) .arg(0.0, 13, 'f', 6); header << QString("%1 %2 %3 %4").arg(nz, 5).arg(0.0, 13, 'f', 6) .arg(0.0, 13, 'f', 6) .arg(delta.z, 13, 'f', 6); header << coords; QByteArray buffer; buffer.append(header.join("\n")); buffer.append("\n"); file.write(buffer); buffer.clear(); double w; unsigned col(0); for (unsigned i = 0; i < nx; ++i) { for (unsigned j = 0; j < ny; ++j) { for (unsigned k = 0; k < nz; ++k, ++col) { w = (*grid)(i, j, k); if (w >= 0.0) buffer += " "; buffer += QString::number(w, 'E', 5); if (col == 5) { col = -1; buffer += "\n"; }else { buffer += " "; } } file.write(buffer); buffer.clear(); } } buffer += "\n"; file.write(buffer); file.flush(); file.close(); return true; }