int bandageImage(QStringList arguments) { QTextStream out(stdout); QTextStream err(stderr); if (checkForHelp(arguments)) { printImageUsage(&out, false); return 0; } if (checkForHelpAll(arguments)) { printImageUsage(&out, true); return 0; } if (arguments.size() < 2) { printImageUsage(&err, false); return 1; } QString graphFilename = arguments.at(0); arguments.pop_front(); if (!checkIfFileExists(graphFilename)) { err << "Bandage error: " << graphFilename << " does not exist" << endl; return 1; } QString imageSaveFilename = arguments.at(0); arguments.pop_front(); QString imageFileExtension = imageSaveFilename.right(4); bool pixelImage; if (imageFileExtension == ".png" || imageFileExtension == ".jpg") pixelImage = true; else if (imageFileExtension == ".svg") pixelImage = false; else { err << "Bandage error: the output filename must end in .png, .jpg or .svg" << endl; return 1; } QString error = checkForInvalidImageOptions(arguments); if (error.length() > 0) { err << "Bandage error: " << error << endl; return 1; } bool loadSuccess = g_assemblyGraph->loadGraphFromFile(graphFilename); if (!loadSuccess) { err << "Bandage error: could not load " << graphFilename << endl; return 1; } int width = 0; int height = 0; parseImageOptions(arguments, &width, &height); //For Bandage image, it is necessary to position node labels at the //centre of the node, not the visible centre(s). This is because there //is no viewport. g_settings->positionTextNodeCentre = true; //Since frame rate performance doesn't matter for a fixed image, set the //default node outline to a nonzero value. g_settings->outlineThickness = 0.3; bool blastUsed = isOptionPresent("--query", &arguments); if (blastUsed) { if (!createBlastTempDirectory()) { err << "Error creating temporary directory for BLAST files" << endl; return 1; } QString blastError = g_blastSearch->doAutoBlastSearch(); if (blastError != "") { err << blastError << endl; return 1; } } QString errorTitle; QString errorMessage; std::vector<DeBruijnNode *> startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "all"); if (errorMessage != "") { err << errorMessage << endl; return 1; } g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance); g_assemblyGraph->layoutGraph(); MyGraphicsScene scene; g_assemblyGraph->addGraphicsItemsToScene(&scene); scene.setSceneRectangle(); double sceneRectAspectRatio = scene.sceneRect().width() / scene.sceneRect().height(); //Determine image size //If neither height nor width set, use a default of height = 1000. if (height == 0 && width == 0) height = 1000; //If only height or width is set, scale the other to fit. if (height > 0 && width == 0) width = height * sceneRectAspectRatio; else if (height == 0 && width > 0) height = width / sceneRectAspectRatio; bool success = true; QPainter painter; if (pixelImage) { QImage image(width, height, QImage::Format_ARGB32); image.fill(Qt::white); painter.begin(&image); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::TextAntialiasing); scene.render(&painter); success = image.save(imageSaveFilename); painter.end(); } else //SVG { QSvgGenerator generator; generator.setFileName(imageSaveFilename); generator.setSize(QSize(width, height)); generator.setViewBox(QRect(0, 0, width, height)); painter.begin(&generator); painter.fillRect(0, 0, width, height, Qt::white); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::TextAntialiasing); scene.render(&painter); painter.end(); } int returnCode; if (!success) { out << "There was an error writing the image to file." << endl; returnCode = 1; } else returnCode = 0; if (blastUsed) deleteBlastTempDirectory(); return returnCode; }
int main(int argc, char *argv[]) { QApplication a(argc, argv); QApplication::setApplicationName("Bandage"); QApplication::setApplicationVersion("0.6.2"); QTextStream out(stdout); QTextStream err(stdout); //Create the important global objects. g_settings.reset(new Settings()); g_blastSearch.reset(new BlastSearch()); g_assemblyGraph.reset(new AssemblyGraph()); g_graphicsView = new MyGraphicsView(); QStringList arguments = QCoreApplication::arguments(); arguments.pop_front(); if (checkForVersion(arguments)) { out << "Version: " << QApplication::applicationVersion() << endl; return 0; } //If the first argument was a recognised command, move to that command's function. if (arguments.size() > 0) { QString first = arguments.at(0); if (first == "load") { arguments.pop_front(); g_settings->commandLineCommand = BANDAGE_LOAD; return bandageLoad(&a, arguments); } else if (first == "image") { arguments.pop_front(); g_settings->commandLineCommand = BANDAGE_IMAGE; return bandageImage(arguments); } // else if (first == "contiguous") // { // arguments.pop_front(); // return bandageContiguous(arguments); // } } //Since a recognised command was not seen, we now check to see if the user //was looking for help information. if (checkForHelp(arguments)) { out << "" << endl; out << "Program: Bandage" << endl; out << "Version: " << QApplication::applicationVersion() << endl; printUsage(&out, false); return 0; } if (checkForHelpAll(arguments)) { out << "" << endl; out << "Program: Bandage" << endl; out << "Version: " << QApplication::applicationVersion() << endl; printUsage(&out, true); return 0; } //If the code got here, we assume the user is simply launching Bandage, //with or without some options to specify settings. //Check the settings. QStringList argumentsCopy = arguments; QString error = checkForInvalidOrExcessSettings(&argumentsCopy); if (error.length() > 0) { err << "Bandage error: " + error << endl; return 1; } //If the code got here, then the settings are good. Parse them now and //run the program. parseSettings(arguments); MainWindow w; w.show(); return a.exec(); }