robocut1.0.11/0000755000175000017500000000000013156345750012571 5ustar markusmarkusrobocut1.0.11/examples/0000755000175000017500000000000013156345750014407 5ustar markusmarkusrobocut1.0.11/examples/legal_reg-marks_h310.svg0000644000175000017500000002002513156345750020716 0ustar markusmarkus image/svg+xml Markus Schulz robocut1.0.11/examples/letter_reg-marks.svg0000644000175000017500000001772513156345750020413 0ustar markusmarkus image/svg+xml Markus Schulz robocut1.0.11/examples/a4_reg-marks_h260.svg0000644000175000017500000002005213156345750020142 0ustar markusmarkus image/svg+xml Markus Schulz robocut1.0.11/Plotter.h0000755000175000017500000000542713156345750014406 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once #include #include #include "Common.h" using namespace std; #include "CuttingThread.h" // Perform the cut. Returns error state. Note that this just sends the data, it has no way of knowing whether it really // worked and there is no easy way to cancel it. // // media: The type of media. I'm not sure what this effects, see CuttingDialog.cpp/ui for values. 300 is "custom". // The value is not fully checked for sanity. // speed: Cutting speed: 1-10 inclusive. // pressure: Cutting pressure: 1-33 inclusive. // trackenhancing: Supposed to feed/unfeed the media a few times to create tracks. // regmark: Whether to use registration marks for calibration. // regsearch: ? // regwidth/height: Distance between the registration marks. // // TODO: Apparently you can change the number of registration marks? Error Cut(CutParams p); const int VENDOR_ID_GRAPHTEC = 0x0b4d; const int PRODUCT_ID_CC200_20 = 0x110a; const int PRODUCT_ID_CC300_20 = 0x111a; const int PRODUCT_ID_SILHOUETTE_SD_1 = 0x111c; const int PRODUCT_ID_SILHOUETTE_SD_2 = 0x111d; const int PRODUCT_ID_SILHOUETTE_CAMEO = 0x1121; const int PRODUCT_ID_SILHOUETTE_PORTRAIT = 0x1123; struct cutter_id { string msg; int usb_vendor_id; int usb_product_id; }; struct cutter_id *Identify(); robocut1.0.11/PathPaintEngine.h0000644000175000017500000000467013156345750015767 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once #include #include #include #include "PathPaintPage.h" // This is a simple paint engine that records all the paths painted. // It is used with QSvgPainter to record the paths in an SVG. // The only device it can draw to is PathPaintDevice class PathPaintEngine : public QPaintEngine { public: PathPaintEngine(QPaintDevice* pdev); bool begin(QPaintDevice* pdev); void drawPath(const QPainterPath& path); void drawPixmap(const QRectF& r, const QPixmap& pm, const QRectF& sr); void drawPolygon(const QPointF* points, int pointCount, PolygonDrawMode mode); bool end(); Type type() const; void updateState(const QPaintEngineState& state); private: PathPaintDevice* dev; QTransform transform; QVector dashPattern; bool isCosmetic; qreal getDistance(const QPointF &p1, const QPointF &p2); QPointF getPointAtLenght(const QPointF &p1, const QPointF &p2, qreal &l1); }; robocut1.0.11/NoCopy.h0000755000175000017500000000317413156345750014161 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once class NoCopy { public: NoCopy() { } ~NoCopy() { } private: NoCopy(const NoCopy&) = delete; const NoCopy& operator=(const NoCopy&) = delete; }; #define NOCOPY NoCopy nocopyvar robocut1.0.11/CuttingThread.cpp0000644000175000017500000000351213156345750016043 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "CuttingThread.h" #include "Plotter.h" CuttingThread::CuttingThread(QObject *parent) : QThread(parent) { } void CuttingThread::setParams(const CutParams& p) { params = p; } void CuttingThread::run() { Error e = Cut(params); if (e) emit success(); else emit error(e.message().c_str()); exec(); } robocut1.0.11/CuttingDialog.ui0000644000175000017500000000303513156345750015666 0ustar markusmarkus CuttingDialog 0 0 295 68 Cutting... Cutting Qt::Horizontal QDialogButtonBox::Cancel buttonBox accepted() CuttingDialog accept() 248 254 157 274 buttonBox rejected() CuttingDialog reject() 316 260 286 274 robocut1.0.11/Common.h0000755000175000017500000000632413156345750014202 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once /// Result Class #include #include #include #include #include using std::vector; using std::string; typedef string::size_type stringpos; /// Error Handling class Error { public: explicit Error(bool S) : s(S) { } explicit Error(const char* C) : s(false), m(C) { } Error(const string& msg) : s(false), m(msg) { } operator bool() { return s; } // TODO: Use bool hack from boost so int i = Error(); doesn't work. string message() { if (m.empty()) return "Unspecified Error"; return m; } private: bool s; string m; }; const Error Success(true); const Error Failure(false); // Integer to string. inline string ItoS(int I) { std::stringstream S; S << I; return S.str(); } // Unsigned integer to string. inline string UItoS(unsigned int I) { std::stringstream S; S << I; return S.str(); } // Unsigned long long to string. inline string ULLtoS(unsigned long long I) { char out[128]; sprintf(out, "%lld", I); return out; } // String to integer, returns Fail on fail. inline int StoI(const string& S, int Fail = 0) { char* EP; const char* P = S.c_str(); int R = strtol(P, &EP, 0); if (EP == P) return Fail; return R; } // String to unsigned integer, returns Fail on fail. inline unsigned int StoUI(const string& S, unsigned int Fail = 0) { char* EP; const char* P = S.c_str(); int R = strtoul(P, &EP, 0); if (EP == P) return Fail; return R; } // String to unsigned integer, returns Fail on fail. inline unsigned int StoULL(const string& S, unsigned long long Fail = 0) { char* EP; const char* P = S.c_str(); int R = strtoull(P, &EP, 0); if (EP == P) return Fail; return R; } // Get an environmental variable. inline string GetEnv(const string& Var) { char* V = getenv(Var.c_str()); if (!V) return ""; return V; } robocut1.0.11/changelog0000644000175000017500000000515513156345750014451 0ustar markusmarkus1.0.11 * Windows and OSX binaries released for first time * Add in-tree libusb for Windows. Not the best practice but it is only two files. * Added Transform_Silhouette_Cameo() to rotate the plot as SVG onscreen. Allow left aligned paper. Cameo has high x-coordinates to the left, although the head homes at the left side. * Added File->Reload (CTRL-L), this saves a lot of clicking and scrolling through the file dialogue while adjusting the design. * Added View->Identify to print the devices seen to stdout. This option is temporarily hidden in the menu (via the .ui file) until it does something user-visible. * Refactored UsbOpen() / UsbInit() from Plotter.cpp:Cut(). * Added to about message and tooltip. Removed debug page dump on stdout; * robocut.spec added, as used in https://build.opensuse.org/package/show?package=robocut&project=home:jnweiger * Move all information to Readme.md rather than spreading it out over multiple files. * Maybe very slightly better icon? It's still pretty rubbish! Contributions welcome! * Change links to point to http://robocut.org/ * Code style fixes * Mouse zoom is the "standard" way now. * Mouse zooms to the cursor. * QT5 support 1.0.10 * Fixed missing image files. 1.0.9 * Add USB ID 111A for CC300-20 Craft Robo Lite as another default. 1.0.8 * changes in Robocut.pro for qmake so no QT files are shipped (Debian requirement) 1.0.7 * Add USB ID 111C as another default. 1.0.6 * Tim fixed drawing bug * changed from float to int for output to plotter, fixes crash of 2nd gen plotter model * changed display pen size to 0 * Tim fixed track enhancing option was inverted. 1.0.5 * adding all the changes needed for Debian * fixed watch file * make binary lower case * removed redundant copyright form the copyright file * recreated all the images so we have the copyright * added vcs information to control file * merged mentor in to master 1.0.4 * add .desktop file for Ubuntu * default needs to be 10 for pressure * get menu working * better sample reg file 1.0.3 * manpage * command line interface * mouse wheel zoom * change the draw command to move command if the cut is on the outer edge, kind of clipping (but not in preview) * dash pattern from path * sort the different paths to cut faster * bounding box option to cut inside path first (good for letters) * registration mark support 1.0.2 * Initial Release on Ubuntu. Master * Some brief documentation * Initial registration mark support * Load page size from file * Small UI improvements Version 0.2 - a3b13ad - Oct 24th 2010 * Initial working version. robocut1.0.11/PathPaintPage.cpp0000644000175000017500000000723013156345750015764 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "PathPaintPage.h" #include "PathPaintEngine.h" #include uint qHash(const QPolygonF& key) { QByteArray repr; for (int i = 0; i < key.size(); ++i) { double x = key[i].x(); double y = key[i].y(); repr.append(reinterpret_cast(&x), sizeof(x)); repr.append(reinterpret_cast(&y), sizeof(y)); } return qHash(repr); } PathPaintDevice::PathPaintDevice(double widthInMm, double heightInMm, double pixelsPerMm) { engine = NULL; width = widthInMm; height = heightInMm; pathsClipped = false; ppm = pixelsPerMm; if (ppm == 0.0) ppm = 1.0; } PathPaintDevice::~PathPaintDevice() { if (engine) delete engine; } void PathPaintDevice::addPath(const QPolygonF& path) { if (pagePathSet.contains(path)) return; pagePathSet.insert(path); pagePaths.append(path); // Clip the path. for (int j = 0; j < pagePaths.back().size(); ++j) { // pagePaths are in mm, so convert from pixels to mm. pagePaths.back()[j] /= ppm; if (pagePaths.back()[j].x() < 0.0) { pathsClipped = true; pagePaths.back()[j].setX(0.0); } if (pagePaths.back()[j].y() < 0.0) { pathsClipped = true; pagePaths.back()[j].setY(0.0); } if (pagePaths.back()[j].x() > width) { pathsClipped = true; pagePaths.back()[j].setX(width); } if (pagePaths.back()[j].y() > height) { pathsClipped = true; pagePaths.back()[j].setY(height); } } } QPaintEngine* PathPaintDevice::paintEngine() const { if (!engine) engine = new PathPaintEngine(const_cast(this)); return engine; } QList PathPaintDevice::paths() { return pagePaths; } int PathPaintDevice::metric(PaintDeviceMetric metric) const { switch (metric) { // Width in pixels. case PdmWidth: return width * ppm; case PdmHeight: return height * ppm; case PdmWidthMM: return width; case PdmHeightMM: return height; case PdmNumColors: return 2; case PdmDepth: return 1; case PdmDpiX: return 25.4 * ppm; // Convert to inches. case PdmDpiY: return 25.4 * ppm; case PdmPhysicalDpiX: return 25.4 * ppm; case PdmPhysicalDpiY: return 25.4 * ppm; } return 0; } bool PathPaintDevice::clipped() const { return pathsClipped; } robocut1.0.11/ProgramOptions.cpp0000644000175000017500000003621413156345750016266 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "ProgramOptions.h" #include #include #include #include #include using namespace std; ProgramOptions::ProgramOptions ( ) { initAttributes(); } ProgramOptions::~ProgramOptions ( ) { } ProgramOptions& ProgramOptions::Instance() { static ProgramOptions instance; return instance; } void ProgramOptions::setSortPath ( int new_var ) { sortPath = new_var; } int ProgramOptions::getSortPath ( ) { return sortPath; } void ProgramOptions::setStartCut ( int new_var ) { startCut = new_var; } int ProgramOptions::getStartCut ( ) { return startCut; } void ProgramOptions::setFileName ( QString new_var ) { fileName = new_var; } QString ProgramOptions::getFileName ( ) { return fileName; } void ProgramOptions::setTspSortPath ( int new_var ) { tspSortPath = new_var; } int ProgramOptions::getTspSortPath ( ) { return tspSortPath; } void ProgramOptions::setMedia ( int new_var ) { if (new_var<0) new_var = 0; if (new_var>25) new_var = 25; media = new_var; } int ProgramOptions::getMedia ( ) { return media; } void ProgramOptions::setSpeed ( int new_var ) { speed = new_var; } int ProgramOptions::getSpeed ( ) { return speed; } void ProgramOptions::setPressure ( int new_var ) { pressure = new_var; } int ProgramOptions::getPressure ( ) { return pressure; } void ProgramOptions::setRegMarkAuto ( int new_var ) { regMarkAuto = new_var; } int ProgramOptions::getRegMarkAuto ( ) { return regMarkAuto; } void ProgramOptions::setRegMark ( int new_var ) { regMark = new_var; } int ProgramOptions::getRegMark ( ) { return regMark; } void ProgramOptions::setRegDimensionWidth ( int new_var ) { regDimensionWidth = new_var; } int ProgramOptions::getRegDimensionWidth ( ) { return lroundl(regDimensionWidth); } void ProgramOptions::setRegDimensionHeight ( int new_var ) { regDimensionHeight = new_var; } int ProgramOptions::getRegDimensionHeight ( ) { return lroundl(regDimensionHeight); } void ProgramOptions::setRegOriginWidth ( int new_var ) { regOriginWidth = new_var; } int ProgramOptions::getRegOriginWidth ( ) { return lroundl(regOriginWidth); } void ProgramOptions::setRegOriginHeight ( int new_var ) { regOriginHeight = new_var; } int ProgramOptions::getRegOriginHeight ( ) { return lroundl(regOriginHeight); } void ProgramOptions::setRegDimensionWidthMM ( double new_var ) { regDimensionWidth = new_var*20; } double ProgramOptions::getRegDimensionWidthMM ( ) { return regDimensionWidth/20; } void ProgramOptions::setRegDimensionHeightMM ( double new_var ) { regDimensionHeight = new_var*20; } double ProgramOptions::getRegDimensionHeightMM ( ) { return regDimensionHeight/20; } void ProgramOptions::setRegOriginWidthMM ( double new_var ) { regOriginWidth = new_var*20; } double ProgramOptions::getRegOriginWidthMM ( ) { return regOriginWidth/20; } void ProgramOptions::setRegOriginHeightMM ( double new_var ) { regOriginHeight = new_var*20; } double ProgramOptions::getRegOriginHeightMM ( ) { return regOriginHeight/20; } void ProgramOptions::setVersion ( QString new_var ) { version = new_var; } QString ProgramOptions::getVersion ( ) { return version; } void ProgramOptions::setVendorUSB_ID ( int new_var ) { vendorUSB_ID = new_var; } int ProgramOptions::getVendorUSB_ID ( ) { return vendorUSB_ID; } void ProgramOptions::setProductUSB_ID ( int new_var ) { productUSB_ID = new_var; } int ProgramOptions::getProductUSB_ID ( ) { return productUSB_ID; } void ProgramOptions::setMarginTop ( int new_var ) { marginTop = new_var; } int ProgramOptions::getMarginTop ( ) { return lroundl(marginTop); } void ProgramOptions::setMarginRight ( int new_var ) { marginRight = new_var; } int ProgramOptions::getMarginRight ( ) { return lroundl(marginRight); } void ProgramOptions::setMarginTopMM ( double new_var ) { marginTop = new_var*20; } double ProgramOptions::getMarginTopMM ( ) { return marginTop/20; } void ProgramOptions::setMarginRightMM ( double new_var ) { marginRight = new_var*20; } double ProgramOptions::getMarginRightMM ( ) { return marginRight/20; } void ProgramOptions::setTrackEnhancing ( int new_var ) { trackEnhancing = new_var; } int ProgramOptions::getTrackEnhancing ( ) { return trackEnhancing; } int ProgramOptions::GetOpt (int argc, char *argv[] ) { static int version_flag = 0, help_flag = 0, show_flag = 0; int index, option_index = 0; int c = 0; const char shortopts[] = "stg:p:ra:b:c:d:"; static struct option longopts[] = { {"help", no_argument, &help_flag, 1}, {"version", no_argument, &version_flag, 1}, {"show", no_argument, &show_flag, 1}, {"no-sort", no_argument, 0, 's'}, {"bb-sort", no_argument, 0, 't'}, {"cut", no_argument, 0, 'l'}, {"media", required_argument, 0, 'm'}, {"speed", required_argument, 0, 'g'}, {"pressure", required_argument, 0, 'p'}, {"track-enhancing", no_argument, 0, 'n'}, {"margin-top", required_argument, 0, 'o'}, {"margin-right", required_argument, 0, 'q'}, {"reg-mark-auto", no_argument, 0, 'r'}, {"reg-mark", no_argument, 0, 'h'}, {"reg-dimension-width", required_argument, 0, 'a'}, {"reg-dimension-height", required_argument, 0, 'b'}, {"reg-origin-width", required_argument, 0, 'c'}, {"reg-origin-height", required_argument, 0, 'd'}, {"usb-vendor-id", required_argument, 0, 'e'}, {"usb-product-id", required_argument, 0, 'f'}, {0, 0, 0, 0} }; opterr = 0; while ((c = getopt_long(argc, argv, shortopts, longopts, &option_index)) != -1) { switch (c) { case 0: /* If this option set a flag, do nothing else now. */ if (longopts[option_index].flag != 0) break; //cout << longopts[option_index].name << endl; break; case 's': setSortPath(true); break; case 't': setTspSortPath(true); break; case 'l': setStartCut(true); break; case 'm': setMedia(atoi(optarg)); break; case 'g': setSpeed(atoi(optarg)); break; case 'p': setPressure(atoi(optarg)); break; case 'n': setTrackEnhancing(true); break; case 'o': setMarginTopMM(atof(optarg)); break; case 'q': setMarginRightMM(atof(optarg)); break; case 'r': setRegMarkAuto(true); break; case 'h': setRegMark(true); break; case 'a': setRegDimensionWidthMM(atof(optarg)); break; case 'b': setRegDimensionHeightMM(atof(optarg)); break; case 'c': setRegOriginWidthMM(atof(optarg)); break; case 'd': setRegOriginHeightMM(atof(optarg)); break; case 'e': setVendorUSB_ID(atoi(optarg)); break; case 'f': setProductUSB_ID(atoi(optarg)); break; case '?': if (optopt == 'f') cerr << "Option -"<< optopt <<" requires an argument." << endl; else if (isprint (optopt)) cerr << "Unknown option `-"<< (char)optopt <<"'." << endl; else cerr << "Unknown option character ASCII code "<< optopt <<"." << endl; exit(0); default: abort(); } } for (index = optind; index < argc; index++) { //cout << "Non-option argument " << argv[index] <<"'." << endl; fileName = argv[optind]; // take the first non arg as file continue; } if(show_flag) { showShow(); exit(0); } if(help_flag) { showHelp(); exit(0); } if(version_flag) { showVersion(); exit(0); } return 0; } void ProgramOptions::showHelp ( ) { // "<------------------------------------------------------------------------------>" cout << "The `Robocut' program plots or cuts SVG files on a Craft Robo or Silhouette SD" << endl; cout << "or most likely any other customer grade Graphtec cutting plotter." << endl << endl; cout << "Usage:" << endl; cout << " robocut [OPTIONS...] [File]" << endl << endl; // "<------------------------------------------------------------------------------>" cout << "Help Options:" << endl; cout << " --help Show summary of options." << endl; cout << " --version Show version information and copyright details." << endl; cout << " --show Show all the parameters entered and the defaults." << endl << endl; // "<------------------------------------------------------------------------------>" cout << "Application Options:" << endl; cout << " -s, --no-sort Stop sort the objects from the SVG before plotting." << endl; cout << " -t, --bb-sort Sort the objects by bounding box, good for letters." << endl; cout << " This will cut out the inside first and than the" << endl; cout << " outside." << endl; cout << " --cut Shows the cutting dialogue after start." << endl; cout << " --media INT Select the media. See drop down box." << endl; cout << " -g, --speed INT The speed between 1 and 33." << endl; cout << " -p, --pressure INT The pressure between 1 and 10." << endl; cout << " --track-enhancing Move three times back and forward to create a" << endl; cout << " track." << endl; cout << " --margin-top DOUBLE Define the margin on top in mm." << endl; cout << " --margin-right DOUBLE Define the margin right in mm." << endl << endl; // "<------------------------------------------------------------------------------>" cout << "Registration Mark Options:" << endl; cout << " -r, --reg-mark-auto Use registration marks and find the marks" << endl; cout << " automatically." << endl; cout << " --reg-mark Use registration marks but set the knife manually" << endl; cout << " on top the round mark." << endl; cout << " -a, --reg-dimension-width DOUBLE" << endl; cout << " Specify the length in mm between the the two" << endl; cout << " horizontal marks." << endl; cout << " -b, --reg-dimension-height DOUBLE" << endl; cout << " Specify the length in mm between the the two" << endl; cout << " vertical marks." << endl; cout << " -c, --reg-origin-width DOUBLE" << endl; cout << " Specify the length in mm between the the edge of" << endl; cout << " the paper and the first horizontal mark." << endl; cout << " -d, --reg-origin-height DOUBLE" << endl; cout << " Specify the length in mm between the the edge of" << endl; cout << " the paper and the first vertical mark." << endl << endl; // "<------------------------------------------------------------------------------>" cout << "Device Options:" << endl; cout << " --usb-vendor-id INT Try this program with other usb hardware on" << endl; cout << " your own risk. You need to convert hex to dec." << endl; cout << " --usb-product-id INT May also work with other hardware, try" << endl; cout << " usb-devices program to scan your computer." << endl; cout << "Report bugs to https://bugs.launchpad.net/robocut/+filebug." << endl; // "<------------------------------------------------------------------------------>" } void ProgramOptions::showVersion ( ) { cout << (version.toStdString()); // see main.cpp cout << "\n\nCopyright (C) 2015\n"; cout << "This is free software; see the source for copying conditions. There is NO\n"; cout << "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"; cout << "Written by Tim Hutt and Markus Schulz \n"; } void ProgramOptions::showShow ( ) { cout << "Application Options:\n"; cout << " -s, --no-sort "<< getSortPath() << endl; cout << " -t, --bb-sort "<< getTspSortPath() << endl; cout << " --cut "<< getStartCut() << endl; cout << " --media "<< getMedia() << endl; cout << " -g, --speed "<< getSpeed() << endl; cout << " -p, --pressure "<< getPressure() << endl; cout << " --track-enhancing "<< getTrackEnhancing() << endl; cout << " --margin-top "<< getMarginTopMM() << " / " << getMarginTop() << endl; cout << " --margin-right "<< getMarginRightMM() << " / " << getMarginRight() << endl; cout << " -r, --reg-mark-auto "<< getRegMarkAuto() << endl; cout << " --reg-mark "<< getRegMark() << endl; cout << " -a, --reg-dimension-width "<< getRegDimensionWidthMM() << " / " << getRegDimensionWidth() << endl; cout << " -b, --reg-dimension-height "<< getRegDimensionHeightMM() << " / " << getRegDimensionHeight() << endl; cout << " -c, --reg-origin-width "<< getRegOriginWidthMM() << " / " << getRegOriginWidth() << endl; cout << " -d, --reg-origin-height "<< getRegOriginHeightMM() << " / " << getRegOriginHeight() << endl; cout << " --usb-vendor-id "<< getVendorUSB_ID() << endl; cout << " --usb-product-id "<< getProductUSB_ID() << endl; cout << "[File] "<< getFileName().toStdString() << endl; } void ProgramOptions::initAttributes ( ) { sortPath = false; tspSortPath = false; // used for BBox startCut = false; fileName = ""; media = 2; speed = 10; pressure = 10; regMarkAuto = false; regMark = false; setRegDimensionWidthMM(180.0); setRegDimensionHeightMM(240.0); setRegOriginWidthMM(15.0); setRegOriginHeightMM(10.0); vendorUSB_ID = 0x0b4d; productUSB_ID = 0x111d; setMarginTop(500); setMarginRight(320); trackEnhancing = false; } robocut1.0.11/Robocut.pro0000644000175000017500000000547613156345750014744 0ustar markusmarkus# ------------------------------------------------- # Project created by QtCreator 2010-10-03T18:21:30 # ------------------------------------------------- TARGET = robocut VERSION = 1.0.11 TEMPLATE = app INSTALLS += icon \ target target.path = /usr/bin icon.files += ./images/robocut.xpm icon.path = /usr/share/pixmaps/ SOURCES += main.cpp \ MainWindow.cpp \ Plotter.cpp \ Common.cpp \ PathPaintEngine.cpp \ CutDialog.cpp \ CuttingDialog.cpp \ CuttingThread.cpp \ PathPaintPage.cpp \ PathSorter.cpp \ ProgramOptions.cpp HEADERS += MainWindow.h \ Plotter.h \ NoCopy.h \ Common.h \ PathPaintEngine.h \ CutDialog.h \ CuttingDialog.h \ CuttingThread.h \ PathPaintPage.h \ PathSorter.h \ ProgramOptions.h FORMS += MainWindow.ui \ CutDialog.ui \ CuttingDialog.ui QMAKE_CXXFLAGS += -std=c++11 QMAKE_CPPFLAGS *= $(shell dpkg-buildflags --get CPPFLAGS) QMAKE_CFLAGS *= $(shell dpkg-buildflags --get CFLAGS) QMAKE_CXXFLAGS *= $(shell dpkg-buildflags --get CXXFLAGS) QMAKE_LFLAGS *= $(shell dpkg-buildflags --get LDFLAGS) DEFINES += ROBOCUT_VERSION=\\\"$$VERSION\\\" unix:LIBS += -lusb-1.0 win32:LIBS += $$_PRO_FILE_PWD_/libusb-windows/libusb-1.0.a win32:INCLUDEPATH += $$_PRO_FILE_PWD_/libusb-windows QT += svg RESOURCES += \ resources.qrc DISTFILES += \ readme.txt \ install.txt \ changelog \ images/cap-blue.png \ images/cap-pen.png \ images/cap-red.png \ images/cap-yellow.png \ images/icon.png \ images/robocut.xpm \ images/cap.xcf \ images/pen.xcf \ examples/a4_reg-marks_h260.svg \ examples/legal_reg-marks_h310.svg \ examples/letter_reg-marks.svg \ robocut.spec \ Readme.md # Instructions for Windows release: # In Qt Creator, go to Projects->Run # Add->Deployment configuration # Rename->"Create Windows Release" # Add Deploy Step->Custom Process Step # # Command: C:\Qt\5.4\mingw491_32\bin\windeployqt.exe # Argument: --dir Robocut --compiler-runtime robocut.exe # Working dir: %{buildDir}/%{CurrentBuild:Type} # # Add another process step: # # Command: C:\Windows\System32\xcopy.exe # Argument: /Y robocut.exe Robocut # Working dir: %{buildDir}/%{CurrentBuild:Type} # # Select that deployment method and run the program. You should be given a directory with all the required files in # it. Before you zip and upload it, exit Qt creator and rename c:\Qt to c:\Qt2. Re-run it to verify that it works # without the Qt SDK installed. # # Note that there is a minor flaw in this deployment method - if you later update your Qt SDK it will find the updated # DLLs in c:\Qt *before* it finds the local Qt DLLs and won't run properly. The solution is to add a qt.conf # file, but that makes development more of a faff. Anyway, Qt Windows deployment is a big mess. robocut1.0.11/PathPaintEngine.cpp0000644000175000017500000001327113156345750016317 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "PathPaintEngine.h" #include #include PathPaintEngine::PathPaintEngine(QPaintDevice* pdev) : QPaintEngine(AllFeatures) { dev = dynamic_cast(pdev); if (!dev) qWarning("PathPaintEngine: unsupported target device."); } bool PathPaintEngine::begin(QPaintDevice* pdev) { dev = dynamic_cast(pdev); if (!dev) qWarning("PathPaintEngine: unsupported target device."); // TODO: setActive? return true; } bool approximatelyEqual(qreal a, qreal b, qreal epsilon) { return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon); } bool essentiallyEqual(qreal a, qreal b, qreal epsilon) { return fabs(a - b) <= ( (fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon); } bool definitelyGreaterThan(qreal a, qreal b, qreal epsilon) { return (a - b) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon); } bool definitelyLessThan(qreal a, qreal b, qreal epsilon) { return (b - a) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon); } void PathPaintEngine::drawPath(const QPainterPath& path) { if (!dev) return; if(!isCosmetic) { QList polys = path.toSubpathPolygons(); for (int i = 0; i < polys.size(); ++i) { if(dashPattern.empty()) dev->addPath(transform.map(polys[i])); else { QPolygonF polytemp = transform.map(polys[i]), newpoly; int dashtoggle = 1, dashi=0, j = 0; qreal actualdashsize = dashPattern[dashi]; QPointF origin = QPointF(polytemp[j]), testp; j++; do { newpoly = QPolygonF(); newpoly.append(origin); do { testp = polytemp[j]; origin = QPointF(getPointAtLenght(QPointF(origin), polytemp[j], actualdashsize)); if (essentiallyEqual(origin.x(), polytemp[j].x(), 0.01 ) && approximatelyEqual(origin.y(), polytemp[j].y(),0.01) && j+1 < polytemp.size()) { origin = polytemp[j]; int tempz = polytemp.size(); j++; testp = polytemp[j]; } newpoly.append(origin); }while(definitelyGreaterThan(actualdashsize,0.0,0.1) && testp!=origin); if(dashtoggle == 1) { dev->addPath(newpoly); } dashtoggle = dashtoggle * -1; dashi++; if(dashi >= dashPattern.size()) dashi=0; actualdashsize = dashPattern[dashi]; }while(!essentiallyEqual(origin.x(), polytemp[j].x(), 0.001 ) || !essentiallyEqual(origin.y(), polytemp[j].y(),0.001)); } } } } void PathPaintEngine::drawPixmap(const QRectF& r, const QPixmap& pm, const QRectF& sr) { // Nop. } void PathPaintEngine::drawPolygon(const QPointF* points, int pointCount, PolygonDrawMode mode) { if (!dev) return; QPolygonF p; for (int i = 0; i < pointCount; ++i) p.append(points[i]); dev->addPath(transform.map(p)); } bool PathPaintEngine::end() { if (!dev) return false; return true; } QPaintEngine::Type PathPaintEngine::type() const { return QPaintEngine::User; } void PathPaintEngine::updateState(const QPaintEngineState& state) { if (state.state() & DirtyTransform) transform = state.transform(); dashPattern = state.pen().dashPattern(); isCosmetic = state.pen().isCosmetic(); } qreal PathPaintEngine::getDistance(const QPointF &p1, const QPointF &p2) { qreal testx1 = p1.x(); qreal testy1 = p1.y(); qreal testx2 = p2.x(); qreal testy2 = p2.y(); qreal a = 0.0; qreal b = 0.0; double c = 0.0; if(testx1 >= testx2) a = testx1 - testx2; else a = testx2 - testx1; if(testy1 >= testy2) b = testy1 - testy2; else b = testy2 - testy1; c = sqrt((double)(a*a+b*b)); return (qreal) c; } QPointF PathPaintEngine::getPointAtLenght(const QPointF &p1, const QPointF &p2, qreal &l1) { qreal testx1 = p1.x(); qreal testy1 = p1.y(); qreal testx2 = p2.x(); qreal testy2 = p2.y(); qreal lenghtp1p2 = getDistance(p1,p2); qreal lenghtdash = l1; l1 = lenghtp1p2 - lenghtdash; if (definitelyLessThan(lenghtp1p2, lenghtdash, 0.01)) { l1 = lenghtdash - lenghtp1p2; return p2; } if (definitelyGreaterThan(lenghtdash, lenghtp1p2, 0.01)) { l1 = lenghtdash - lenghtp1p2; return p1; } l1 = 0; qreal factor = lenghtp1p2/lenghtdash; qreal a = testx1-testx2; qreal b = testy1-testy2; qreal aa = a/factor; qreal bb = b/factor; QPointF ret = QPointF(testx1-aa,testy1-bb); return ret; } robocut1.0.11/CutDialog.ui0000644000175000017500000004202213156345750015003 0ustar markusmarkus CutDialog 0 0 482 340 Cut Robocut Media: Card without Craft Paper Backing :/images/cap-yellow.png:/images/cap-yellow.png Card with Craft Paper Backing :/images/cap-yellow.png:/images/cap-yellow.png Vinyl Sticker :/images/cap-blue.png:/images/cap-blue.png Film Labels :/images/cap-blue.png:/images/cap-blue.png Thick Media :/images/cap-yellow.png:/images/cap-yellow.png Thin Media :/images/cap-blue.png:/images/cap-blue.png Pen :/images/cap-pen.png:/images/cap-pen.png Bond Paper 13-28 lbs :/images/cap-blue.png:/images/cap-blue.png Bristol Paper 57-67 lbs :/images/cap-yellow.png:/images/cap-yellow.png Cardstock 40-60 lbs :/images/cap-yellow.png:/images/cap-yellow.png Cover 40-60 lbs :/images/cap-yellow.png:/images/cap-yellow.png Film, Double Matte Translucent :/images/cap-blue.png:/images/cap-blue.png Film, Vinyl With Adhesive Back :/images/cap-blue.png:/images/cap-blue.png Film, Window With Kling Adhesive :/images/cap-blue.png:/images/cap-blue.png Index 90 lbs :/images/cap-red.png:/images/cap-red.png Inkjet Photo Paper 28-44 lbs :/images/cap-yellow.png:/images/cap-yellow.png Inkjet Photo Paper 45-75 lbs :/images/cap-red.png:/images/cap-red.png Magnetic Sheet :/images/cap-red.png:/images/cap-red.png Offset 24-60 lbs :/images/cap-blue.png:/images/cap-blue.png Print Paper Light Weight :/images/cap-blue.png:/images/cap-blue.png Print Paper Medium Weight :/images/cap-yellow.png:/images/cap-yellow.png Sticker Sheet :/images/cap-blue.png:/images/cap-blue.png Tag 100 lbs :/images/cap-red.png:/images/cap-red.png Text Paper 24-70 lbs :/images/cap-blue.png:/images/cap-blue.png Vellum Bristol 57-67 lbs :/images/cap-yellow.png:/images/cap-yellow.png Writing Paper 24-70 lbs :/images/cap-blue.png:/images/cap-blue.png Speed: 1 10 2 Qt::Horizontal Pressure: 1 33 2 Qt::Horizontal Track Enhancing 1 10 1 33 Registration Marks (Experimental!) true false Search Registration Marks true Dimensions (width × height): 0 0 188 0 mm 300.000000000000000 180.000000000000000 × 0 0 188 0 mm 1000.000000000000000 240.000000000000000 Qt::Vertical 20 0 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() CutDialog accept() 257 156 157 274 buttonBox rejected() CutDialog reject() 325 156 286 274 mediaCombo currentIndexChanged(int) CutDialog onMediaChanged(int) 123 29 44 105 speedSlider valueChanged(int) speedSpinBox setValue(int) 246 81 434 81 speedSpinBox valueChanged(int) speedSlider setValue(int) 434 81 246 81 pressureSlider valueChanged(int) pressureSpinBox setValue(int) 246 116 434 116 pressureSpinBox valueChanged(int) pressureSlider setValue(int) 434 116 246 116 onMediaChanged(int) robocut1.0.11/CuttingDialog.h0000644000175000017500000000472713156345750015511 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once #include #include "CuttingThread.h" namespace Ui { class CuttingDialog; } // This is the dialog that shows while the cut is progressing. The thread that does the cutting // is also owned by the dialog, in a slightly bad design. class CuttingDialog : public QDialog { Q_OBJECT public: explicit CuttingDialog(QWidget *parent = 0); ~CuttingDialog(); // Start the cutting thread. Call this only once, before the dialog is shown. // It creates the thread, passes it the cutting details, and runs it. void startCut(const CutParams& params); protected: void changeEvent(QEvent *e); void closeEvent(QCloseEvent* e); private: Ui::CuttingDialog *ui; // The cutting thread. It is pretty basic - just one long run() routine and then it calls onSuccess() or // onError(). CuttingThread* thread; private slots: // These are called from the thread when it has finished. Only one is called. void onSuccess(); void onError(QString message); }; robocut1.0.11/CutDialog.h0000644000175000017500000000504713156345750014623 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once #include namespace Ui { class CutDialog; } // This dialog asks the user what settings to use for cutting. class CutDialog : public QDialog { Q_OBJECT public: explicit CutDialog(QWidget *parent = 0); ~CutDialog(); // The media code. See CutDialog.ui for a list. int media() const; // The speed (1-10). int speed() const; // The cutting pressure (1-33). int pressure() const; // Track enhancing. This is when the cutter rolls the media backwards and forwards // a few times before cutting in order to indent it with tracks where the rollors are. // The idea is that it will slip less after that is done. bool trackEnhancing() const; // Whether to search. bool regMark() const; bool regSearch() const; // Positions of the registration marks. double regWidth() const; double regHeight() const; protected: void changeEvent(QEvent *e); private slots: // When they change the media selection, update the default speed and pressure. void onMediaChanged(int idx); private: Ui::CutDialog *ui; }; robocut1.0.11/CutDialog.cpp0000644000175000017500000000765513156345750015165 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "CutDialog.h" #include "ui_CutDialog.h" #include "ProgramOptions.h" CutDialog::CutDialog(QWidget *parent) : QDialog(parent), ui(new Ui::CutDialog) { ui->setupUi(this); ui->mediaCombo->setCurrentIndex(ProgramOptions::Instance().getMedia()); ui->speedSlider->setValue(ProgramOptions::Instance().getSpeed()); ui->pressureSlider->setValue(ProgramOptions::Instance().getPressure()); ui->trackEnhancingCheckbox->setChecked(ProgramOptions::Instance().getTrackEnhancing()); if(ProgramOptions::Instance().getRegMark()) { ui->regMarksGroup->setChecked(true); ui->regSearchCheckbox->setChecked(false); } if(ProgramOptions::Instance().getRegMarkAuto()) { ui->regMarksGroup->setChecked(true); ui->regSearchCheckbox->setChecked(true); } ui->regWidthSpinner->setValue(ProgramOptions::Instance().getRegDimensionWidthMM()); ui->regHeightSpinner->setValue(ProgramOptions::Instance().getRegDimensionHeightMM()); } CutDialog::~CutDialog() { delete ui; } void CutDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } int CutDialog::media() const { int idx = ui->mediaCombo->currentIndex(); // Media code for each entry. int medias[] = { 100, 101, 102, 106, 111, 112, 113, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138 }; if (idx < 0 || idx >= 26) idx = 0; return medias[idx]; } int CutDialog::speed() const { return ui->speedSlider->value(); } int CutDialog::pressure() const { return ui->pressureSlider->value(); } bool CutDialog::trackEnhancing() const { return ui->trackEnhancingCheckbox->isChecked(); } bool CutDialog::regMark() const { return ui->regMarksGroup->isChecked(); } bool CutDialog::regSearch() const { return ui->regSearchCheckbox->isChecked(); } double CutDialog::regWidth() const { return ui->regWidthSpinner->value(); } double CutDialog::regHeight() const { return ui->regHeightSpinner->value(); } void CutDialog::onMediaChanged(int idx) { if (idx < 0 || idx >= 26) idx = 0; // Pressure for each entry. int pressures[] = { 27, 27, 10, 14, 27, 2, 10, 30, 30, 30, 30, 1, 1, 1, 30, 20, 27, 30, 30, 5, 25, 20, 20, 30, 30, 30 }; // Default speed is max except for magnetic sheet. int newspeed = idx == 17 ? 3 : 10; int newpressure = pressures[idx]; ui->speedSlider->setValue(newspeed); ui->pressureSlider->setValue(newpressure); } robocut1.0.11/MainWindow.h0000644000175000017500000000623513156345750015024 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once #include #include #include #include #include "CutDialog.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; // The cutting paths that were loaded from the SVG. QList paths; // For displaying the cuts. QGraphicsScene* scene; // The dialog that asks what settings to use. We keep this around and reuse it as necessary. CutDialog* cutDialog; // The directory that the last file was opened from. QString lastOpenDir; // Timer for the cutting animation. QTimer* animationTimer; // The circle that marks where the cutter blade is. QGraphicsItem* cutMarker; // Cut marker progress. int cutMarkerPath; // Current path. int cutMarkerLine; // Current line in path double cutMarkerDistance; // Current distance along edge. QSizeF mediaSize; QString filename; public: int sortFlag; int tspFlag; int cutFlag; char *fileValue; private slots: void on_actionZoom_Out_triggered(); void on_actionZoom_In_triggered(); void on_actionReset_triggered(); void on_actionAnimate_toggled(bool animate); void on_actionManual_triggered(); void on_actionCut_triggered(); void on_actionExit_triggered(); void on_actionAbout_triggered(); void on_actionOpen_triggered(); void on_actionReload_triggered(); void on_actionIdentify_triggered(); // Advance the cutting animation frame. void animate(); private: // Use empty string to indicate no file is loaded. void setFileLoaded(QString filename); bool eventFilter(QObject *o, QEvent *e); void loadFile(); }; robocut1.0.11/resources.qrc0000644000175000017500000000040213156345750015306 0ustar markusmarkus images/cap-blue.png images/cap-pen.png images/cap-red.png images/cap-yellow.png images/icon.png robocut1.0.11/MainWindow.ui0000644000175000017500000001170513156345750015210 0ustar markusmarkus MainWindow 0 0 823 753 Robocut :/images/icon.png:/images/icon.png QPainter::Antialiasing|QPainter::TextAntialiasing QGraphicsView::ScrollHandDrag QGraphicsView::AnchorUnderMouse 0 0 823 21 File Help View About Manual (Online) F1 Open Ctrl+O false Cut Ctrl+P Exit Ctrl+Q true false Animate Animate -- Simulate movement onscreen Ctrl+A false Reset Ctrl+R false Zoom In + false Zoom Out - false Reload Reload the current SVG file Ctrl+L Identify devices Identify connected Plotter Ctrl+I false robocut1.0.11/Common.cpp0000644000175000017500000000271513156345750014532 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "Common.h" robocut1.0.11/ProgramOptions.h0000644000175000017500000000754113156345750015734 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once #include class ProgramOptions { private: ProgramOptions ( ); ProgramOptions(const ProgramOptions &); ProgramOptions & operator=(const ProgramOptions &); virtual ~ProgramOptions ( ); public: // Singleton static ProgramOptions& Instance(); private: int sortPath; int startCut; QString fileName; int tspSortPath; int media; int speed; int pressure; int regMarkAuto; int regMark; double regDimensionWidth; double regDimensionHeight; double regOriginWidth; double regOriginHeight; QString version; int vendorUSB_ID; int productUSB_ID; double marginTop; double marginRight; int trackEnhancing; public: void setSortPath ( int new_var ); int getSortPath ( ); void setStartCut ( int new_var ); int getStartCut ( ); void setFileName ( QString new_var ); QString getFileName ( ); void setTspSortPath ( int new_var ); int getTspSortPath ( ); void setMedia ( int new_var ); int getMedia ( ); void setSpeed ( int new_var ); int getSpeed ( ); void setPressure ( int new_var ); int getPressure ( ); void setRegMarkAuto ( int new_var ); int getRegMarkAuto ( ); void setRegMark ( int new_var ); int getRegMark ( ); void setRegDimensionWidth ( int new_var ); int getRegDimensionWidth ( ); void setRegDimensionHeight ( int new_var ); int getRegDimensionHeight ( ); void setRegOriginWidth ( int new_var ); int getRegOriginWidth ( ); void setRegOriginHeight ( int new_var ); int getRegOriginHeight ( ); void setRegDimensionWidthMM ( double new_var ); double getRegDimensionWidthMM ( ); void setRegDimensionHeightMM ( double new_var ); double getRegDimensionHeightMM ( ); void setRegOriginWidthMM ( double new_var ); double getRegOriginWidthMM ( ); void setRegOriginHeightMM ( double new_var ); double getRegOriginHeightMM ( ); void setVersion ( QString new_var ); QString getVersion ( ); void setVendorUSB_ID ( int new_var ); int getVendorUSB_ID ( ); void setProductUSB_ID ( int new_var ); int getProductUSB_ID ( ); void setMarginTop ( int new_var ); int getMarginTop ( ); void setMarginRight ( int new_var ); int getMarginRight ( ); void setMarginTopMM ( double new_var ); double getMarginTopMM ( ); void setMarginRightMM ( double new_var ); double getMarginRightMM ( ); void setTrackEnhancing ( int new_var ); int getTrackEnhancing ( ); private: void showHelp ( ); void showVersion ( ); void showShow ( ); void initAttributes ( ) ; public: int GetOpt (int argc, char *argv[] ); }; robocut1.0.11/PathPaintPage.h0000644000175000017500000000526713156345750015441 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once // TODO: Rename this file to PathPaintDevice.h #include #include #include #include class PathPaintEngine; // Needed for QSet. Simply concatenates all the coordinates in a QByteArray and hashes that. uint qHash(const QPolygonF& key); class PathPaintDevice : public QPaintDevice { public: PathPaintDevice(double widthInMm, double heightInMm, double pixelsPerMm = 90.0/25.4); ~PathPaintDevice(); // Adds a path to the device. // Also automatically ignores duplicate paths, which QSvgPainter creates (I guess for the fill and stroke). // Paths are clipped (horribly) to the page. And if any are clipped, clipped() returns true. void addPath(const QPolygonF& path); // Get a list of paths. QList paths(); // Returns true if any paths had to be clipped. bool clipped() const; QPaintEngine* paintEngine() const; protected: int metric(PaintDeviceMetric metric) const; private: mutable PathPaintEngine* engine; // The paths added. QList pagePaths; // Set of paths, so we can detect duplicates. QSet pagePathSet; bool pathsClipped; double width; double height; double ppm; }; robocut1.0.11/install.txt0000644000175000017500000000132713156345750015003 0ustar markusmarkusINSTALLATION ^^^^^^^^^^^^ sudo apt-get install libqt4-dev libusb-1.0-0-dev git-core # Go to home directory (or wherever you want to install it) cd ~ # Get the latest source code (if you don't already have it) git clone git://gitorious.org/robocut/robocut.git # Go into the source code directory. cd robocut # Build the project. qmake make # At this point the executable is built, and you can just link to it if you like, or you can install it # system-wide like this: sudo cp Robocut /usr/local/bin # Then create a link in your menu to /usr/local/bin/Robocut (not capital R) # Finally remember to make sure you are in the lp group: adduser lp # You will probably have to log out and log in again after that. robocut1.0.11/images/0000755000175000017500000000000013156345750014036 5ustar markusmarkusrobocut1.0.11/images/icon.png0000644000175000017500000000164513156345750015502 0ustar markusmarkusPNG  IHDR@@iqgAMA a pHYs*KtEXtSoftwarePaint.NET v3.5.100r!IDATx^KTQc3SAPZئE/ZXPm[ EТ0@I "h @ ##"\iNǙn^P};(97>2 E"a0ˑ͊7ordL_'pȃYWqןW,~y40ގkfOsҸGsu)W_O_}O,k (. . . . .qqq pu\@\@\ yiaWw_4i31W;q3iC <ܷoC ,h<94H`裫h=B~d`CA >d`CA >d`CA >d`CA >d`CA >d`CA >d`CA >d`CA >d`CA >d`ZMCyE^`i`bޜk7 *RiOJ:թTS9e*V iʕ?,PTk5*1wZڿ%TN.Fw] ?oP7a{`å? 0 Z@Js|Wz{`CM,uZ{-o lF.]|CY&m>|#ֳf0/ m_~xӖ;a_d>n6^?g=P?Biaq-IENDB`robocut1.0.11/images/cap-pen.png0000644000175000017500000000135713156345750016075 0ustar markusmarkusPNG  IHDR@@iqsRGBbKGD pHYs  tIME >:tEXtCommentThis drawing is: Copyright 2010 Markus Schulz and is licensed under the GPL version 3wIDATx9,DADK\jPjB\5vN\$JGei^?V76ےWx1p \<?q/i^owrm~Ϻm<``m{;Pe:~ /Nf4|> ,`%bx0@B2Vf_*~T1͢Rio{?$qk_ߔfQh?K̆P"iI7@4x@ Hw+(1J,1VoPb<`F݈* v5ශBidK̜P' ^埮Ʋ>_W sI_/^C%jx\(EpU_Xb2aHƟ&#bXZІHa M%Ǫ#K:6`tpVLˤ n6xIENDB`robocut1.0.11/images/cap-red.png0000644000175000017500000000121013156345750016051 0ustar markusmarkusPNG  IHDR@@iqsRGBbKGD pHYs  tIME ;tEXtCommentThis drawing is: Copyright 2010 Markus Schulz and is licensed under the GPL version 3w}IDATxX10XExGAI#((yD@S(ie+"Rw1#ȓ]ݳk`G`.΃^sJr9OK8--b T)}[@TAAS Y`~nP[Y~~y 4 CP’Ò_d,60*)@m4XK,@]-,@' LV+pN'`n_ #-;bˑ,1ҍȲ@AV@4R=xO1 8RX0 O焾ﻏW@CrYje}ꍘ&Të`0 )soIENDB`robocut1.0.11/images/robocut.xpm0000644000175000017500000000426213156345750016245 0ustar markusmarkus/* XPM */ static char * robocut_xpm[] = { "32 32 68 1", " c None", ". c #3D4083", "+ c #ECEDF2", "@ c #525590", "# c #E0E1EC", "$ c #606299", "% c #CBCBDD", "& c #777AA8", "* c #444788", "= c #1B206F", "- c #121769", "; c #E7E8F0", "> c #2D327A", ", c #DADBE7", "' c #3C4083", ") c #BFC0D6", "! c #595D96", "~ c #1D2270", "{ c #14196A", "] c #E8E8F0", "^ c #2F347C", "/ c #DADBE8", "( c #3E4285", "_ c #C0C1D7", ": c #5B5E97", "< c #E9EAF1", "[ c #30347C", "} c #DCDCE8", "| c #3F4385", "1 c #C1C2D7", "2 c #5C6098", "3 c #1A1F6E", "4 c #797BAA", "5 c #1E2371", "6 c #7679A9", "7 c #252975", "8 c #686B9F", "9 c #30357C", "0 c #1C2170", "a c #000000", "b c #323232", "c c #333333", "d c #2E2C27", "e c #2E2C28", "f c #302F2D", "g c #343434", "h c #7096E0", "i c #648EDE", "j c #638EDE", "k c #5685D3", "l c #4E7FD0", "m c #FB000C", "n c #FA000C", "o c #FC010C", "p c #5282D1", "q c #FB000B", "r c #FC000B", "s c #4889DB", "t c #F8000C", "u c #F9000B", "v c #FB010C", "w c #FF0000", "x c #FA0C18", "y c #FE000B", "z c #FE010C", "A c #FC000C", "B c #F8000A", "C c #FC0611", " ", " ", " .+@#$%&******* ", " =-;>,')!======== ", " ~{]^/(_:~~~~~~~~ ", " ~{]^/(_:~~~~~~~~ ", " ~{]^/(_:~~~~~~~~ ", " ~{]^/(_:~~~~~~~~ ", " ~{]^/(_:~~~~~~~~ ", " ~{]^/(_:~~~~~~~~ ", " ~{]^/(_:~~~~~~~~ ", " ~{]^/(_:~~~~~~~~ ", " ~{<[}|12~~~~~~~~ ", " ~3456789~~~~~~~~ ", " ~~~~0~~~~~~~~~~~ ", " ", " aaaaaaaaaaa ", " aaaaaaaaaaa ", " aaaaaaaaaaa ", " aaaaaaaaaaa ", " aaaaaaaaaaa ", " aaaaaaaaaaa ", " aaaaaaaaaaa ", " aaaaaaaaaaa ", " aaaaaaaaaaa ", " bbbcdeefbg ", " hij ", " kll mno ", " pl oqmnr ", " s tuv ", " wxyzABC ", " z "}; robocut1.0.11/images/pen.xcf0000644000175000017500000000220013156345750015314 0ustar markusmarkusgimp xcf file@@BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) @@ New Layer     \@@p@@ ;:J8;5%3e1 c/< #- +)WH&$0#sJ! !Io",!$"dS!!<}"9!!Va!!!/"rF!!Ho"-!#"cT!!;~"s9#<%b'"')G**p+.,- T. /G0:{robocut1.0.11/images/cap-blue.png0000644000175000017500000000130413156345750016232 0ustar markusmarkusPNG  IHDR@@iqsRGBbKGD pHYs  tIME  ʔqtEXtCommentThis drawing is: Copyright 2010 Markus Schulz and is licensed under the GPL version 3wIDATxX1N@φPTTQPP"$~BI("Q La[NŖG3( `d~88<8?;`C/ٷj`eV `s@YUkG TbCp!h0Tt= `ۏAz LW}6ڦ+^g~p LeIPR(K˒$PX@lP( AeI={YB s.Kh,,![,٥B'l*LKa vs@c z@ߓHD#R堀a7p P_j\h|Z 瀲J\.8S wj29{QwBUU+ G" r QObn BP( yrFbIENDB`robocut1.0.11/images/cap-yellow.png0000644000175000017500000000116313156345750016621 0ustar markusmarkusPNG  IHDR@@iqsRGBbKGD pHYs  tIME *AtEXtCommentThis drawing is: Copyright 2010 Markus Schulz and is licensed under the GPL version 3whIDATxX1N0[ExGAy=G<EYDrBNnv$WQy2 to^{ٳo=-+(S?-KyYYYEU7 de t (z 6-PT-{@׼t]V {yL-sBeÒ4 `VVXR_EaImP [Z j^ L_{#S[uakg%FQcƟ HrdEPȑUjQŀԞa؜O7C.0 }FVp;@ /a{m&IENDB`robocut1.0.11/images/cap.xcf0000644000175000017500000000546013156345750015310 0ustar markusmarkusgimp xcf file@@BB gimp-commentyThis drawing is: Copyright © 2010 Markus Schulz and is licensed under the GPL version 3gimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) @@ New Layer#2      X@@@@ 2 2 2 2 2 2 2 @@ New Layer     M@@@@F Ж$ љ$ ԛ$ ՝$ ֞$ ٟ$ ١$ ۣ$ ݤ$ ߦ$ ਈ$ ᩈ$ 㪈$ 䭈$ 殈$R И И љ ԛ ՝ ֞ ٟ ١ ۣ ݤ ߦ ਈ ᩈ 㪈 䭈 殈bЌ*ҍ*Ց*֓*ٔ*ڗ*ܘ*ߛ**➈*䡈*ޕ19:;<=>F Ж$ љ$ ԛ$ ՝$ ֞$ ؟$ ڡ$ ۣ$ ܤ$ ߦ$ ৈ$ ᩈ$ 䪈$ 嬈$ 歈$R И И љ ԛ ՝ ֞ ؟ ڡ ۣ ܤ ߦ ৈ ᩈ 䪈 嬈 歈bЌ*ҍ*Ց*֓*ؔ*ۗ*ܘ*ߛ**㞈*塈*ߕ19:;<=>F і$ ҙ$ ӛ$ ՜$ ֝$ ؠ$ ١$ ܣ$ ܥ$ ަ$ ਈ$ ᩈ$ 㪈$ 䬈$ 殈$R ј ј ҙ ӛ ՜ ֝ ؠ ١ ܣ ܥ ަ ਈ ᩈ 㪈 䬈 殈bь*ҍ*Ԑ*֒*ؕ*ږ*ܙ*ޛ**➈*䠈*鰈19:;<=>F3 3 3 3 3 3 3 3 3 3 3 3 3 3 3R$$$$$$$$$$$$$$$$b***********19:;<=>robocut1.0.11/CuttingThread.h0000644000175000017500000000523213156345750015511 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once #include #include // A thread to send the cutting stuff to the plotter. // To use: // // 1. Create. // 2. Connect success() and error() to your class. Only one is called. // 3. Call setParams(...) with the parameters you want. // 4. Call start(). // 5. Wait for success() or error(). struct CutParams { QList cuts; double mediawidth = 0.0; double mediaheight = 0.0; int media = 300; int speed = 10; int pressure = 10; bool trackenhancing = false; bool regmark = false; bool regsearch = false; double regwidth = 0.0; double regheight = 0.0; }; class CuttingThread : public QThread { Q_OBJECT public: explicit CuttingThread(QObject *parent = 0); // Set the parameters to use for the cut. void setParams(const CutParams& params); signals: // Emitted if the cutting was (as far as we can tell) successful. void success(); // Emitted if the cutting failed. void error(QString message); public slots: protected: // This reads the params, then tries to send the data to the cutter. // When it is done, it runs exec() to send the success() or error() signal. void run(); private: CutParams params; }; robocut1.0.11/usr/0000755000175000017500000000000013156345750013402 5ustar markusmarkusrobocut1.0.11/usr/lib/0000755000175000017500000000000013156345750014150 5ustar markusmarkusrobocut1.0.11/usr/lib/x86_64-linux-gnu/0000755000175000017500000000000013156345750017032 5ustar markusmarkusrobocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/0000755000175000017500000000000013156345750017543 5ustar markusmarkusrobocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/0000755000175000017500000000000013156345750021210 5ustar markusmarkusrobocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/qconfig.pri0000644000175000017500000000221613156345750023353 0ustar markusmarkus#configuration CONFIG += shared qpa release qt_no_framework host_build { QT_ARCH = x86_64 QT_TARGET_ARCH = x86_64 } else { QT_ARCH = x86_64 } QT_CONFIG += minimal-config small-config medium-config large-config full-config release_tools gtk3 fontconfig libudev evdev xkbcommon-evdev libinput xlib xrender xcb-plugin xcb-render xcb-glx xcb-xlib xcb-sm accessibility-atspi-bridge gbm linuxfb kms c++11 c++14 c++1z accessibility egl egl_x11 eglfs eglfs_egldevice eglfs_gbm opengl shared qpa reduce_exports reduce_relocations clock-gettime clock-monotonic posix_fallocate mremap getaddrinfo ipv6ifname getifaddrs inotify eventfd threadsafe-cloexec poll_ppoll system-jpeg system-png png system-doubleconversion system-freetype system-harfbuzz system-zlib mtdev cups iconv glib dbus dbus-linked openssl libproxy xcb xinput2 alsa pulseaudio gstreamer-1.0 icu concurrent audio-backend release #versioning QT_VERSION = 5.7.1 QT_MAJOR_VERSION = 5 QT_MINOR_VERSION = 7 QT_PATCH_VERSION = 1 #namespaces QT_LIBINFIX = QT_NAMESPACE = QT_EDITION = OpenSource QT_COMPILER_STDCXX = 201402 QT_GCC_MAJOR_VERSION = 6 QT_GCC_MINOR_VERSION = 3 QT_GCC_PATCH_VERSION = 0 robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/0000755000175000017500000000000013156345750023026 5ustar markusmarkusrobocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt.prf0000644000175000017500000003637113156345750024175 0ustar markusmarkusCONFIG *= thread #handle defines win32 { contains(QT_CONFIG, shared) { # this variable is read by qmake in qmake/generators/win32/msvc_vcproj.cpp # function VcprojGenerator::initDeploymentTool() QMAKE_DLL_PATHS += $$[QT_INSTALL_BINS/get] } } CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG contains(QT_CONFIG, force_asserts):DEFINES += QT_FORCE_ASSERTS no_keywords:DEFINES += QT_NO_KEYWORDS plugin { #Qt plugins static:DEFINES += QT_STATICPLUGIN DEFINES += QT_PLUGIN } qtestlib { warning("CONFIG+=qtestlib is deprecated. Use QT+=testlib instead.") QT += testlib } qdbus { warning("CONFIG+=qdbus is deprecated. Use QT+=dbus instead.") QT += dbus } help { warning("CONFIG+=help is deprecated. Use QT+=help instead.") QT += help-private # sic! } designer { warning("CONFIG+=designer is deprecated. Use QT+=designer instead.") QT += designer } uitools { warning("CONFIG+=uitools is deprecated. Use QT+=uitools instead.") QT += uitools } qaxcontainer { warning("CONFIG+=qaxcontainer is deprecated. Use QT+=axcontainer instead.") QT += axcontainer } qaxserver { warning("CONFIG+=qaxserver is deprecated. Use QT+=axserver instead.") QT += axserver } # target variable, flag source variable defineTest(qtProcessModuleFlags) { for(flag, $$2) { contains(flag, ^-.*): \ $$1 -= $$replace(flag, ^-, ) else: \ $$1 += $$flag } export($$1) } unset(using_privates) var_sfx = for(ever) { # qmake variables cannot contain dashes, so normalize the names first CLEAN_QT$$var_sfx = $$replace(QT$$var_sfx, -private$, _private) # Topological resolution of modules based on their QT..depends variable FULL_QT$$var_sfx = $$resolve_depends(CLEAN_QT$$var_sfx, "QT.") # Finally actually add the modules unset(BAD_QT) for(QTLIB, FULL_QT$$var_sfx) { MODULE_NAME = $$eval(QT.$${QTLIB}.name) MODULE_MODULE = $$eval(QT.$${QTLIB}.module) MODULE_INCLUDES = $$eval(QT.$${QTLIB}.includes) MODULE_LIBS = $$eval(QT.$${QTLIB}.libs) MODULE_FRAMEWORKS = $$eval(QT.$${QTLIB}.frameworks) MODULE_CONFIG = $$eval(QT.$${QTLIB}.module_config) isEmpty(MODULE_NAME) { BAD_QT += $$QTLIB next() } contains(MODULE_CONFIG, internal_module): \ using_privates = true contains(MODULE_CONFIG, ltcg): \ CONFIG += link_ltcg qtProcessModuleFlags(CONFIG, QT.$${QTLIB}.CONFIG) qtProcessModuleFlags(DEFINES, QT.$${QTLIB}.DEFINES) MODULE_INCLUDES -= $$QMAKE_DEFAULT_INCDIRS MODULE_LIBS_ADD = $$MODULE_LIBS MODULE_LIBS_ADD -= $$QMAKE_DEFAULT_LIBDIRS !contains(MODULE_CONFIG, v2) { # Backwards compatibility with pre-5.6 module .pri files contains(MODULE_CONFIG, lib_bundle) { MODULE_FRAMEWORKS = $$MODULE_LIBS inc = $$MODULE_LIBS/$${MODULE_NAME}.framework/Headers MODULE_INCLUDES = $$inc contains(MODULE_CONFIG, internal_module): \ MODULE_INCLUDES += \ $$inc/$$eval(QT.$${QTLIB}.VERSION) \ $$inc/$$eval(QT.$${QTLIB}.VERSION)/$$MODULE_NAME } else { # Re-insert the major version in the library name (cf qt5LibraryTarget above) MODULE_NAME ~= s,^Qt,Qt$$QT_MAJOR_VERSION, } # Only link to this module if a libs directory is set, else this is just a module # to give access to sources or include files, and not for linking. !isEmpty(MODULE_LIBS):!contains(MODULE_CONFIG, no_link): \ MODULE_MODULE = $${MODULE_NAME}$${QT_LIBINFIX} } # Frameworks shouldn't need include paths, but much code does not use # module-qualified #includes, so by default we add paths which point # directly into the frameworks. Private modules have somewhat convoluted # header paths, so adding them is necessary in every case. !if(contains(MODULE_CONFIG, lib_bundle):qt_no_framework_direct_includes) \ |contains(MODULE_CONFIG, internal_module): \ INCLUDEPATH *= $$MODULE_INCLUDES QMAKE_FRAMEWORKPATH *= $$MODULE_FRAMEWORKS !isEmpty(MODULE_MODULE) { contains(MODULE_CONFIG, lib_bundle) { LIBS$$var_sfx += -framework $$MODULE_MODULE } else { !isEmpty(MODULE_LIBS_ADD): \ LIBS$$var_sfx += -L$$MODULE_LIBS_ADD lib = $$MODULE_MODULE$$qtPlatformTargetSuffix() LIBS$$var_sfx += -l$$lib contains(MODULE_CONFIG, staticlib): \ PRE_TARGETDEPS *= $$MODULE_LIBS/$${QMAKE_PREFIX_STATICLIB}$${lib}.$${QMAKE_EXTENSION_STATICLIB} !isEmpty(QMAKE_LSB) { !isEmpty(MODULE_LIBS_ADD): \ QMAKE_LFLAGS *= --lsb-libpath=$$MODULE_LIBS_ADD QMAKE_LFLAGS *= --lsb-shared-libs=$$lib QMAKE_LIBDIR *= /opt/lsb/lib } } } # Add capabilities as defined by modules used in the project winrt { MODULE_WINRT_CAPABILITIES = $$eval(QT.$${QTLIB}.winrt_capabilities) !isEmpty(MODULE_WINRT_CAPABILITIES): \ WINRT_MANIFEST.capabilities_default += $$MODULE_WINRT_CAPABILITIES MODULE_WINRT_CAPABILITIES_DEVICE = $$eval(QT.$${QTLIB}.winrt_capabilities_device) !isEmpty(MODULE_WINRT_CAPABILITIES_DEVICE): \ WINRT_MANIFEST.capabilities_device_default += $$MODULE_WINRT_CAPABILITIES_DEVICE } } !isEmpty(BAD_QT):error("Unknown module(s) in QT$$var_sfx: $$replace(BAD_QT, _private$, -private)") !isEmpty(var_sfx): break() var_sfx = _PRIVATE } !isEmpty(using_privates):!no_private_qt_headers_warning:!build_pass { message("This project is using private headers and will therefore be tied to this specific Qt module build version.") message("Running this project against other versions of the Qt modules may crash at any arbitrary point.") message("This is not a bug, but a result of using Qt internals. You have been warned!") } qt_module_deps = $$CLEAN_QT $$CLEAN_QT_PRIVATE qt_module_deps = $$resolve_depends(qt_module_deps, "QT.") !no_qt_rpath:!static:contains(QT_CONFIG, rpath):!contains(QT_CONFIG, static):\ contains(qt_module_deps, core) { relative_qt_rpath:!isEmpty(QMAKE_REL_RPATH_BASE):contains(INSTALLS, target):\ isEmpty(target.files):isEmpty(target.commands):isEmpty(target.extra) { # NOT the /dev property, as INSTALLS use host paths QMAKE_RPATHDIR += $$relative_path($$[QT_INSTALL_LIBS], $$qtRelativeRPathBase()) } else { QMAKE_RPATHDIR += $$[QT_INSTALL_LIBS/dev] } } !isEmpty(QMAKE_LFLAGS_RPATHLINK):!contains(QT_CONFIG, static) { # -rpath-link is used by the linker to find dependencies of dynamic # libraries which were NOT specified on the command line. # This means that paths of direct dependencies (QT & QT_PRIVATE) # don't need to be listed, unlike their private dependencies' paths. privdep = $$resolve_depends(qt_module_deps, "QT.", ".depends" ".run_depends") privdep -= $$qt_module_deps rpaths = for(dep, privdep): \ rpaths += $$eval(QT.$${dep}.libs) QMAKE_RPATHLINKDIR *= $$unique(rpaths) } # static builds: link qml import plugins into the app. contains(qt_module_deps, qml): \ contains(QT_CONFIG, static):contains(TEMPLATE, .*app):!host_build:!no_import_scan { !isEmpty(QTREPOS) { for (qrep, QTREPOS): \ exists($$qrep/qml): \ QMLPATHS += $$qrep/qml } else { QMLPATHS += $$[QT_INSTALL_QML/get] } # run qmlimportscanner qtPrepareTool(QMLIMPORTSCANNER, qmlimportscanner, , system) for (QMLPATH, QMLPATHS): \ IMPORTPATHS += -importPath $$system_quote($$QMLPATH) #message(run $$QMLIMPORTSCANNER $$_PRO_FILE_PWD_ $$IMPORTPATHS) JSON = $$system($$QMLIMPORTSCANNER $$system_quote($$_PRO_FILE_PWD_) $$IMPORTPATHS) parseJson(JSON, IMPORTS)| error("Failed to parse qmlimportscanner output.") !isEmpty(IMPORTS._KEYS_) { # add import plugins to LIBS line for (key, IMPORTS._KEYS_) { PATH = $$eval(IMPORTS.$${key}.path) PLUGIN = $$eval(IMPORTS.$${key}.plugin) !isEmpty(PATH):!isEmpty(PLUGIN): LIBS *= -L$$PATH -l$${PLUGIN}$$qtPlatformTargetSuffix() } # create qml_plugin_import.cpp IMPORT_FILE_CONT = \ "// This file is autogenerated by qmake. It imports static plugin classes for" \ "// static plugins used by QML imports." \ "$${LITERAL_HASH}include " for (key, IMPORTS._KEYS_) { PLUGIN = $$eval(IMPORTS.$${key}.plugin) CLASSNAME = $$eval(IMPORTS.$${key}.classname) !isEmpty(PLUGIN) { !isEmpty(CLASSNAME) { !contains(ADDED_IMPORTS, $$PLUGIN) { ADDED_IMPORTS += $$PLUGIN IMPORT_FILE_CONT += "Q_IMPORT_PLUGIN($$CLASSNAME)" } } else { error("Plugin $$PLUGIN is missing a classname entry, please add one to the qmldir file.") } } } QML_IMPORT_CPP = $$OUT_PWD/$$lower($$basename(TARGET))_qml_plugin_import.cpp write_file($$QML_IMPORT_CPP, IMPORT_FILE_CONT)|error("Aborting.") GENERATED_SOURCES += $$QML_IMPORT_CPP QMAKE_DISTCLEAN += $$QML_IMPORT_CPP # copy qml files. this part is platform spesific. mac { osx { # Note: user can override QMAKE_BUNDLE_QML from pro file to change target bundle path isEmpty(QMAKE_QML_BUNDLE_PATH):QMAKE_QML_BUNDLE_PATH = "Resources/qt_qml" qmlTargetPath = $$OUT_PWD/$${TARGET}.app/Contents/$$QMAKE_QML_BUNDLE_PATH qtconfTargetPath = $$OUT_PWD/$${TARGET}.app/Contents/Resources/qt.conf } else { # iOS: flat bundle layout (no Contents/Resources) isEmpty(QMAKE_QML_BUNDLE_PATH):QMAKE_QML_BUNDLE_PATH = "qt_qml" qmlTargetPath = $CODESIGNING_FOLDER_PATH/$$QMAKE_QML_BUNDLE_PATH qtconfTargetPath = $CODESIGNING_FOLDER_PATH/qt.conf } # set import path in qt.conf to point to the bundeled qml: QT_CONF_CONTENTS = \ "[Paths]" \ "Imports = $$QMAKE_QML_BUNDLE_PATH" \ "Qml2Imports = $$QMAKE_QML_BUNDLE_PATH" write_file("$$OUT_PWD/qt.conf", QT_CONF_CONTENTS)|error("Aborting.") # write qt.conf and copy each qml import dir into the bundle. # But strip away archives and other files that are not needed: !isEmpty(QMAKE_POST_LINK): QMAKE_POST_LINK += ";" QMAKE_POST_LINK += \ "cp $$shell_quote($$OUT_PWD/qt.conf) \"$$qtconfTargetPath\"; " \ "test -d \"$$qmlTargetPath\" && rm -r \"$$qmlTargetPath\"; " \ "mkdir -p \"$$qmlTargetPath\" && " \ "for p in $$QMLPATHS; do" \ "rsync -r --exclude='*.a' --exclude='*.prl' --exclude='*.qmltypes' " macx-xcode: QMAKE_POST_LINK += "$p/ \"$$qmlTargetPath\"; done" else: QMAKE_POST_LINK += "\$\$p/ \"$$qmlTargetPath\"; done" } } } !import_qpa_plugin { warning("CONFIG-=import_qpa_plugin is deprecated. Use QTPLUGIN.platforms=- instead.") QTPLUGIN.platforms = - } else: qpa_minimal_plugin { warning("CONFIG+=qpa_minimal_plugin is deprecated. Use QTPLUGIN.platforms=qminimal instead.") QTPLUGIN.platforms = qminimal } contains(TEMPLATE, .*app) { autoplugs = for (qtmod, qt_module_deps) { for (ptype, QT.$${qtmod}.plugin_types) { isEmpty(QTPLUGIN.$$ptype) { for (plug, QT_PLUGINS) { equals(QT_PLUGIN.$${plug}.TYPE, $$ptype) { for (dep, QT_PLUGIN.$${plug}.EXTENDS) { !contains(qt_module_deps, $$dep) { plug = break() } } autoplugs += $$plug } } } else { plug = $$eval(QTPLUGIN.$$ptype) !equals(plug, -): \ autoplugs += $$plug } } } manualplugs = $$QTPLUGIN manualplugs -= $$autoplugs QTPLUGIN -= $$manualplugs !isEmpty(QTPLUGIN): \ warning("Redundant entries in QTPLUGIN: $$QTPLUGIN") QTPLUGIN = $$manualplugs $$autoplugs } QT_PLUGIN_VERIFY = DEPLOYMENT_PLUGIN contains(QT_CONFIG, static) { QT_PLUGIN_VERIFY += QTPLUGIN force_import_plugins|contains(TEMPLATE, .*app) { import_plugins:!isEmpty(QTPLUGIN) { IMPORT_FILE_CONT = \ "// This file is autogenerated by qmake. It imports static plugin classes for" \ "// static plugins specified using QTPLUGIN and QT_PLUGIN_CLASS. variables." \ "$${LITERAL_HASH}include " for(IMPORT_PLUG, $$list($$unique(QTPLUGIN))) { PLUG_CLASS = $$eval(QT_PLUGIN.$${IMPORT_PLUG}.CLASS_NAME) !isEmpty(PLUG_CLASS): \ IMPORT_FILE_CONT += "Q_IMPORT_PLUGIN($$PLUG_CLASS)" else: \ warning("Plugin class name could not be determined for $$IMPORT_PLUG plugin.") } IMPORT_CPP = $$OUT_PWD/$$lower($$basename(TARGET))_plugin_import.cpp write_file($$IMPORT_CPP, IMPORT_FILE_CONT)|error("Aborting.") GENERATED_SOURCES += $$IMPORT_CPP QMAKE_DISTCLEAN += $$IMPORT_CPP } } } for(QT_CURRENT_VERIFY, $$list($$QT_PLUGIN_VERIFY)) { for(QTPLUG, $$list($$lower($$unique($$QT_CURRENT_VERIFY)))) { # Check if the plugin is known to Qt. We can use this to determine # the plugin path. Unknown plugins must rely on the default link path. QT_PLUGINPATH = $$eval(QT_PLUGIN.$${QTPLUG}.TYPE) # Generate the plugin linker line QT_LINKAGE = -l$${QTPLUG}$$qtPlatformTargetSuffix() # Only link against plugin in static builds isEqual(QT_CURRENT_VERIFY, QTPLUGIN) { !isEmpty(QT_PLUGINPATH) { plugpath = $$eval(QT_PLUGIN.$${QTPLUG}.PATH) isEmpty(plugpath): \ plugpath = $$[QT_INSTALL_PLUGINS/get] LIBS *= -L$$plugpath/$$QT_PLUGINPATH } LIBS += $$QT_LINKAGE # if the plugin is linked statically there is no need to deploy it DEPLOYMENT_PLUGIN -= $$QT_CURRENT_VERIFY } # The following block is currently broken, because qt_plugin_XXX.prf files # are not generated for dynamic builds. false:isEqual(QT_CURRENT_VERIFY, DEPLOYMENT_PLUGIN):shared:if(wince*|winrt) { QT_ITEM = debug: QT_ITEM = $${QTPLUG}d4.dll else: QT_ITEM = $${QTPLUG}4.dll qt_additional_plugin_$${QTPLUG}.files = $$[QT_INSTALL_PLUGINS/get]/$${QT_PLUGINPATH}/$${QT_ITEM} qt_additional_plugin_$${QTPLUG}.path = $${QT_PLUGINPATH} INSTALLS *= qt_additional_plugin_$${QTPLUG} } } } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/uic.prf0000644000175000017500000000122413156345750024316 0ustar markusmarkusqtPrepareTool(QMAKE_UIC, uic, _DEP) isEmpty(UI_DIR):UI_DIR = . isEmpty(QMAKE_MOD_UIC):QMAKE_MOD_UIC = ui_ uic.depends += $$QMAKE_UIC_EXE uic.commands = $$QMAKE_UIC ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} uic.depend_command = $$QMAKE_UIC_DEP -d ${QMAKE_FILE_IN} uic.output = $$UI_DIR/$${QMAKE_MOD_UIC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_H)} uic.input = FORMS uic.variable_out = GENERATED_FILES uic.CONFIG += no_link target_predeps uic.name = UIC ${QMAKE_FILE_IN} silent:uic.commands = @echo uic ${QMAKE_FILE_IN} && $$uic.commands QMAKE_EXTRA_COMPILERS += uic INCREDIBUILD_XGE += uic !isEmpty(FORMS) { INCLUDEPATH += $$absolute_path($$UI_DIR, $$OUT_PWD) } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/spec_pre.prf0000644000175000017500000000273613156345750025347 0ustar markusmarkus# This file is loaded by qmake right before loading the qmakespec. # At this point, the built-in variables have been set up and the project's # .qmake.super was read (if present). QMAKE_DIR_SEP = $$DIR_SEPARATOR QMAKE_DIRLIST_SEP = $$DIRLIST_SEPARATOR QMAKE_EXT_C = .c QMAKE_EXT_CPP = .cpp .cc .cxx QMAKE_EXT_OBJC = .m QMAKE_EXT_OBJCXX = .mm QMAKE_EXT_CPP_MOC = .moc QMAKE_EXT_H = .h .hpp .hh .hxx QMAKE_EXT_H_MOC = .cpp QMAKE_EXT_JS = .js QMAKE_EXT_LEX = .l QMAKE_EXT_LIBTOOL = .la QMAKE_EXT_PKGCONFIG = .pc QMAKE_EXT_PRL = .prl QMAKE_EXT_UI = .ui QMAKE_EXT_YACC = .y QMAKE_CPP_MOD_MOC = QMAKE_H_MOD_MOC = moc_ QMAKE_MOD_LEX = _lex QMAKE_MOD_YACC = _yacc defineTest(ensurePathEnv) { isEmpty(QMAKE_PATH_ENV) { QMAKE_PATH_ENV = $$(PATH) QMAKE_PATH_ENV = $$split(QMAKE_PATH_ENV, $$QMAKE_DIRLIST_SEP) export(QMAKE_PATH_ENV) } } equals(QMAKE_HOST.os, Windows) { QMAKE_EXT_OBJ = .obj QMAKE_EXT_RES = .res QMAKE_SH = ensurePathEnv() for(dir, QMAKE_PATH_ENV) { exists($$dir/sh.exe) { QMAKE_SH = $$dir/sh.exe break() } } } else { QMAKE_EXT_CPP += .C QMAKE_EXT_H += .H QMAKE_EXT_OBJ = .o QMAKE_SH = sh } CONFIG = file_copies qt warn_on release link_prl QT = core gui robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/unix/0000755000175000017500000000000013156345750024011 5ustar markusmarkusrobocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/unix/opengl.prf0000644000175000017500000000072113156345750026006 0ustar markusmarkuscontains(QT_CONFIG, opengles2) { INCLUDEPATH += $$QMAKE_INCDIR_OPENGL_ES2 !isEmpty(QMAKE_LIBDIR_OPENGL_ES2):QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL_ES2 target_qt:LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL_ES2 else:LIBS += $$QMAKE_LIBS_OPENGL_ES2 } else { INCLUDEPATH += $$QMAKE_INCDIR_OPENGL !isEmpty(QMAKE_LIBDIR_OPENGL):QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL target_qt:LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL else:LIBS += $$QMAKE_LIBS_OPENGL } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/unix/thread.prf0000644000175000017500000000106313156345750025771 0ustar markusmarkus!isEmpty(QMAKE_CFLAGS_THREAD) { QMAKE_CFLAGS += $$QMAKE_CFLAGS_THREAD QMAKE_EXPORT_CFLAGS += $$QMAKE_CFLAGS_THREAD } !isEmpty(QMAKE_CXXFLAGS_THREAD) { QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_THREAD QMAKE_EXPORT_CXXFLAGS += $$QMAKE_CXXFLAGS_THREAD } INCLUDEPATH += $$QMAKE_INCDIR_THREAD LIBS += $$QMAKE_LIBS_THREAD !isEmpty(QMAKE_LFLAGS_THREAD):QMAKE_LFLAGS += $$QMAKE_LFLAGS_THREAD !isEmpty(QMAKE_CC_THREAD):QMAKE_CC = $$QMAKE_CC_THREAD !isEmpty(QMAKE_CXX_THREAD):QMAKE_CXX = $$QMAKE_CXX_THREAD !isEmpty(QMAKE_LINK_THREAD):QMAKE_LINK = $$QMAKE_LINK_THREAD robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt_config.prf0000644000175000017500000000366313156345750025520 0ustar markusmarkus# This file is loaded as one of the last things by all qmakespecs. QMAKE_QT_CONFIG = $$[QT_HOST_DATA/get]/mkspecs/qconfig.pri !exists($$QMAKE_QT_CONFIG)|!include($$QMAKE_QT_CONFIG, "", true) { debug(1, "Cannot load qconfig.pri!") } else { debug(1, "Loaded .qconfig.pri from ($$QMAKE_QT_CONFIG)") dirs = $$(QMAKEMODULES) QMAKE_MODULE_PATH = $$split(dirs, $$DIRLIST_SEPARATOR) QMAKE_MODULE_PATH += $$QMAKEMODULES dirs = $$[QMAKEMODULES] QMAKE_MODULE_PATH += $$split(dirs, $$DIRLIST_SEPARATOR) dirs = $$[QMAKE_MKSPECS] dirs = $$split(dirs, $$DIRLIST_SEPARATOR) QMAKE_MODULE_PATH += $$replace(dirs, \$, /modules) unset(dirs) QMAKE_MODULE_PATH = $$unique(QMAKE_MODULE_PATH) QMAKE_MODULE_PATH = $$reverse(QMAKE_MODULE_PATH) for(dir, QMAKE_MODULE_PATH) { debug(1, "Loading modules from $${dir}") mods = $$files($$dir/qt_*.pri) for (mod, mods) { # For installed Qt these paths will be common for all modules. # For uninstalled prefix builds these will vary per module, via the # forwarding module pri files. Keep qt_module_pris.prf in sync with this! QT_MODULE_INCLUDE_BASE = $$[QT_INSTALL_HEADERS] QT_MODULE_LIB_BASE = $$[QT_INSTALL_LIBS] QT_MODULE_HOST_LIB_BASE = $$[QT_HOST_LIBS] QT_MODULE_PLUGIN_BASE = $$[QT_INSTALL_PLUGINS] QT_MODULE_LIBEXEC_BASE = $$[QT_INSTALL_LIBEXECS] QT_MODULE_BIN_BASE = $$[QT_INSTALL_BINS] QT_MODULE_IMPORT_BASE = $$[QT_INSTALL_IMPORTS] QT_MODULE_QML_BASE = $$[QT_INSTALL_QML] include($$mod) } unset(mods) } QT_MODULES = $$unique(QT_MODULES) # In case modules appear in multiple places unset(QT_MODULE_INCLUDE_BASE) unset(QT_MODULE_LIB_BASE) unset(QT_MODULE_HOST_LIB_BASE) unset(QT_MODULE_PLUGIN_BASE) unset(QT_MODULE_LIBEXEC_BASE) unset(QT_MODULE_BIN_BASE) unset(QT_MODULE_IMPORT_BASE) unset(QT_MODULE_QML_BASE) } load(qt_functions) robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/file_copies.prf0000644000175000017500000000372713156345750026031 0ustar markusmarkusisEmpty(COPIES): return() contains(TEMPLATE, .*subdirs): error("COPIES does not work with TEMPLATE=subdirs") build_pass:build_all:!isEqual(BUILD_PASS, $$first(BUILDS)) { # Avoid that multiple build passes race with each other. # This will fail to copy anything if the user explicitly invokes # only the non-primary build. This is unfixable, as at qmake time # we cannot possibly know how make will be invoked, yet we must # predict it here. return() } defineReplace(qtStripProPwd) { return($$relative_path($$1, $$_PRO_FILE_PWD_)) } for (cp, COPIES) { isEmpty($${cp}.files): next() pfx = copy_$${cp} notdir = false dir = false for (f, $${cp}.files) { fil = $$absolute_path($$f, $$_PRO_FILE_PWD_) tfiles = $$files($$fil/*) isEmpty(tfiles): \ notdir = true else: \ dir = true $${pfx}.files += $$fil } $$dir:$$notdir: \ error("COPIES entry $$cp lists both files and directories.") path = $$eval($${cp}.path) isEmpty(path): error("COPIES entry $$cp defines no .path") base = $$eval($${cp}.base) isEmpty(base) { $${pfx}.output = $$path/${QMAKE_FILE_IN_NAME} } else: isEqual(base, $$_PRO_FILE_PWD_) { $${pfx}.output = $$path/${QMAKE_FUNC_FILE_IN_qtStripProPwd} } else { eval(defineReplace(qtStripSrcDir_$$cp) { \ return(\$\$relative_path(\$\$1, $$val_escape(base))) \ }) $${pfx}.output = $$path/${QMAKE_FUNC_FILE_IN_qtStripSrcDir_$$cp} } $${pfx}.input = $${pfx}.files !$$dir: \ $${pfx}.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT_PATH} else: !copy_dir_files: \ $${pfx}.commands = $$QMAKE_COPY_DIR ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT_PATH} else: \ $${pfx}.commands = $$QMAKE_COPY_DIR ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} $${pfx}.name = COPY ${QMAKE_FILE_IN} $${pfx}.CONFIG = no_link no_clean target_predeps QMAKE_EXTRA_COMPILERS += $${pfx} } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/exclusive_builds.prf0000644000175000017500000000206313156345750027111 0ustar markusmarkus defineTest(addExclusiveBuildsProper) { !$$1:!fix_output_dirs: \ return(true) for(build, 2) { isEmpty($${build}.name) { $${build}.name = $$title($$build) export($${build}.name) } isEmpty($${build}.target) { $${build}.target = $$lower($$build) export($${build}.target) } isEmpty($${build}.dir_affix) { $${build}.dir_affix = $$lower($$build) export($${build}.dir_affix) } $${build}.exclusive = $$2 export($${build}.exclusive) QMAKE_EXCLUSIVE_BUILDS += $$build } CONFIG *= exclusive_builds export(CONFIG) export(QMAKE_EXCLUSIVE_BUILDS) return(true) } defineTest(addExclusiveBuilds) { lessThan(ARGC, 2): \ error("addExclusiveBuilds() requires at least two arguments") addExclusiveBuildsProper($$join(ARGS, _and_), $$ARGS) } # Default directories to process QMAKE_DIR_REPLACE = OBJECTS_DIR MOC_DIR RCC_DIR PRECOMPILED_DIR QGLTF_DIR DESTDIR QMAKE_DIR_REPLACE_SANE += QGLTF_DIR robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/yacc.prf0000644000175000017500000000430613156345750024461 0ustar markusmarkus# # Yacc extra-compiler for handling files specified in the YACCSOURCES variable # { yacc_decl.name = Yacc header yacc_decl.input = YACCSOURCES yacc_decl.variable_out = GENERATED_FILES isEmpty(QMAKE_YACCFLAGS_MANGLE) { QMAKE_YACCFLAGS_MANGLE = -p ${QMAKE_FILE_BASE} -b ${QMAKE_FILE_BASE} QMAKE_YACC_HEADER = ${QMAKE_FILE_BASE}.tab.h QMAKE_YACC_SOURCE = ${QMAKE_FILE_BASE}.tab.c } else { QMAKE_YACCFLAGS_MANGLE ~= s/\\$base/${QMAKE_FILE_BASE}/g #backwards compat QMAKE_YACC_HEADER ~= s/\\$base/${QMAKE_FILE_BASE}/g QMAKE_YACC_SOURCE ~= s/\\$base/${QMAKE_FILE_BASE}/g } QMAKE_YACCDECLFLAGS = $$QMAKE_YACCFLAGS !yacc_no_name_mangle:QMAKE_YACCDECLFLAGS += $$QMAKE_YACCFLAGS_MANGLE yacc_decl.commands = \ -$(DEL_FILE) $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) \ $$QMAKE_YACC $$QMAKE_YACCDECLFLAGS ${QMAKE_FILE_IN}$$escape_expand(\\n\\t) \ $(MOVE) $${QMAKE_YACC_HEADER} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)}$$escape_expand(\\n\\t) \ $(MOVE) $${QMAKE_YACC_SOURCE} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) yacc_decl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)} silent:yacc_decl.commands = @echo Yacc ${QMAKE_FILE_IN} && $$yacc_decl.commands QMAKE_EXTRA_COMPILERS += yacc_decl } { yacc_impl.name = source for ${QMAKE_FILE_IN} yacc_impl.input = YACCSOURCES yacc_impl.variable_out = GENERATED_SOURCES yacc_impl.commands = $$escape_expand(\\n) # We don't want any commands where, but if command is empty no rules are created yacc_impl.depends += $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)} # Make sure we depend on the step above yacc_impl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_CPP)} # Faked output from this step, output really created in step above QMAKE_EXTRA_COMPILERS += yacc_impl } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/toolchain.prf0000644000175000017500000000326013156345750025520 0ustar markusmarkus isEmpty(QMAKE_DEFAULT_INCDIRS):!host_build { # # Get default include and library paths from compiler # gcc { !equals(QMAKE_HOST.os, Windows) { cmd_prefix = "LC_ALL=C" cmd_suffix = "/dev/null" } else { cmd_prefix = "set LC_ALL=C&" cmd_suffix = "NUL" } output = $$system("$$cmd_prefix $$QMAKE_CXX $$QMAKE_CXXFLAGS -xc++ -E -v - 2>&1 $$cmd_suffix", lines) add_includes = false for (line, output) { line ~= s/^ *// # remove leading spaces contains(line, "LIBRARY_PATH=.*") { line ~= s/^LIBRARY_PATH=// # remove leading LIBRARY_PATH= paths = $$split(line, $$QMAKE_DIRLIST_SEP) for (path, paths): \ QMAKE_DEFAULT_LIBDIRS += $$clean_path($$path) } else: contains(line, "$${LITERAL_HASH}include <.*") { # #include <...> search starts here: add_includes = true } else: contains(line, "End of search.*") { add_includes = false } else: $$add_includes { !contains(line, ".* \\(framework directory\\)"): \ QMAKE_DEFAULT_INCDIRS += $$clean_path($$line) } } QMAKE_DEFAULT_LIBDIRS = $$unique(QMAKE_DEFAULT_LIBDIRS) } unix { isEmpty(QMAKE_DEFAULT_INCDIRS): QMAKE_DEFAULT_INCDIRS = /usr/include /usr/local/include isEmpty(QMAKE_DEFAULT_LIBDIRS): QMAKE_DEFAULT_LIBDIRS = /lib /usr/lib } !isEmpty(QMAKE_DEFAULT_INCDIRS): cache(QMAKE_DEFAULT_INCDIRS, set stash) !isEmpty(QMAKE_DEFAULT_LIBDIRS): cache(QMAKE_DEFAULT_LIBDIRS, set stash) } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/exceptions.prf0000644000175000017500000000030113156345750025712 0ustar markusmarkusCONFIG -= exceptions_off QMAKE_CFLAGS *= $$QMAKE_CFLAGS_EXCEPTIONS_ON QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_EXCEPTIONS_ON QMAKE_LFLAGS *= $$QMAKE_LFLAGS_EXCEPTIONS_ON DEFINES -= QT_NO_EXCEPTIONS robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/spec_post.prf0000644000175000017500000001064313156345750025542 0ustar markusmarkus# This file is loaded by qmake right after loading the qmakespec. # Afterwards, the project's .qmake.conf and .qmake.cache are loaded # (if present). # Note that up to this point, nothing specific to a particular SUBDIRS # project or build pass can be done. isEmpty(MAKEFILE_GENERATOR):error("Qmake spec does not set MAKEFILE_GENERATOR.") isEmpty(QMAKE_PLATFORM) { isEmpty(TARGET_PLATFORM) { equals(MAKEFILE_GENERATOR, UNIX) { equals(QMAKE_HOST.os, Darwin): \ TARGET_PLATFORM = macx # backwards compatibility; cannot change else: \ TARGET_PLATFORM = unix } else:if(equals(MAKEFILE_GENERATOR, MSVC.NET) \ |equals(MAKEFILE_GENERATOR, MSBUILD) \ |equals(MAKEFILE_GENERATOR, MINGW)) { TARGET_PLATFORM = win32 } else:if(equals(MAKEFILE_GENERATOR, PROJECTBUILDER) \ |equals(MAKEFILE_GENERATOR, XCODE)) { TARGET_PLATFORM = macx } else { error("Qmake spec sets an invalid MAKEFILE_GENERATOR.") } } equals(TARGET_PLATFORM, unix): \ QMAKE_PLATFORM = unix else:equals(TARGET_PLATFORM, macx): \ QMAKE_PLATFORM = macos osx macx mac darwin unix else:equals(TARGET_PLATFORM, win32): \ QMAKE_PLATFORM = win32 else: \ error("Qmake spec sets an invalid TARGET_PLATFORM.") } contains(QMAKE_PLATFORM, macx) { !contains(QMAKE_PLATFORM, osx) { warning("qmake spec specified platform macx, but not osx."); QMAKE_PLATFORM = osx $$QMAKE_PLATFORM } !contains(QMAKE_PLATFORM, macos) { warning("qmake spec specifies platform macx, but not macos.") QMAKE_PLATFORM = macos $$QMAKE_PLATFORM } } CONFIG += $$QMAKE_PLATFORM isEmpty(QMAKE_COMPILER) { *-g++*: \ QMAKE_COMPILER = gcc else:*-llvm*: \ QMAKE_COMPILER = gcc llvm else:*-clang*: \ QMAKE_COMPILER = gcc clang llvm else:*-msvc*: \ QMAKE_COMPILER = msvc else: \ error("qmake spec does not announce the compiler family, and it cannot be guessed.") warning("qmake spec does not announce the compiler family. Guessed $${QMAKE_COMPILER}.") } CONFIG += $$QMAKE_COMPILER equals(MAKEFILE_GENERATOR, MSBUILD) \ |equals(MAKEFILE_GENERATOR, MSVC.NET) \ |isEmpty(QMAKE_SH) { QMAKE_ZIP = zip -r -9 QMAKE_COPY = copy /y QMAKE_COPY_FILE = $$QMAKE_COPY QMAKE_COPY_DIR = xcopy /s /q /y /i # xcopy copies the contained files if source is a directory. Deal with it. CONFIG += copy_dir_files QMAKE_MOVE = move QMAKE_DEL_FILE = del QMAKE_DEL_DIR = rmdir QMAKE_DEL_TREE = rmdir /s /q QMAKE_CHK_EXISTS = if not exist %1 QMAKE_CHK_DIR_EXISTS = if not exist # legacy QMAKE_MKDIR = mkdir # legacy QMAKE_MKDIR_CMD = if not exist %1 mkdir %1 & if not exist %1 exit 1 QMAKE_STREAM_EDITOR = $(QMAKE) -install sed QMAKE_INSTALL_FILE = copy /y QMAKE_INSTALL_PROGRAM = copy /y } else { QMAKE_TAR = tar -cf QMAKE_GZIP = gzip -9f QMAKE_COPY = cp -f QMAKE_COPY_FILE = $$QMAKE_COPY QMAKE_COPY_DIR = $$QMAKE_COPY -R QMAKE_MOVE = mv -f QMAKE_DEL_FILE = rm -f QMAKE_DEL_DIR = rmdir QMAKE_DEL_TREE = rm -rf QMAKE_CHK_EXISTS = test -e %1 || QMAKE_CHK_DIR_EXISTS = test -d # legacy QMAKE_MKDIR = mkdir -p # legacy QMAKE_MKDIR_CMD = test -d %1 || mkdir -p %1 QMAKE_STREAM_EDITOR = sed equals(QMAKE_HOST.os, Windows) { MINGW_IN_SHELL = 1 # legacy # Override built-ins. QMAKE_DIR_SEP = / QMAKE_DIRLIST_SEP = : # Because install's ability to set permissions is not relevant on Windows, # and git's msys does not provide it to start with. QMAKE_INSTALL_FILE = cp -f QMAKE_INSTALL_PROGRAM = cp -f } else { QMAKE_INSTALL_FILE = install -m 644 -p QMAKE_INSTALL_PROGRAM = install -m 755 -p } } QMAKE_INSTALL_DIR = $$QMAKE_COPY_DIR equals(QMAKE_HOST.os, Windows) { QMAKE_SYMBOLIC_LINK = $(QMAKE) -install ln -f -s QMAKE_LN_SHLIB = $(QMAKE) -install ln -s } else { QMAKE_SYMBOLIC_LINK = ln -f -s QMAKE_LN_SHLIB = ln -s } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/testcase_targets.prf0000644000175000017500000000105413156345750027103 0ustar markusmarkus # Let every project have a standard GNU `check' target !contains(QMAKE_EXTRA_TARGETS, check) { contains(TEMPLATE, subdirs): \ prepareRecursiveTarget(check) else: \ check.depends = first # `make check' implies build QMAKE_EXTRA_TARGETS += check } # ... and the same for benchmarks, too. !contains(QMAKE_EXTRA_TARGETS, benchmark) { contains(TEMPLATE, subdirs): \ prepareRecursiveTarget(benchmark) else: \ benchmark.depends = first # `make benchmark' implies build QMAKE_EXTRA_TARGETS += benchmark } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt_functions.prf0000644000175000017500000002333213156345750026256 0ustar markusmarkus defineReplace(qtPlatformTargetSuffix) { ios:CONFIG(simulator, simulator|device): \ suffix = _$${simulator.sdk} else: \ suffix = CONFIG(debug, debug|release) { !debug_and_release|build_pass { mac: return($${suffix}_debug) win32: return($${suffix}d) } } return($$suffix) } defineReplace(qtLibraryTarget) { LIBRARY_NAME = $$1 CONFIG(shared, static|shared):contains(QT_CONFIG, qt_framework) { QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME export(QMAKE_FRAMEWORK_BUNDLE_NAME) } return($$LIBRARY_NAME$$qtPlatformTargetSuffix()) } defineReplace(qt5LibraryTarget) { LIBRARY_NAME = $$qtLibraryTarget($$1) isEmpty(QMAKE_FRAMEWORK_BUNDLE_NAME) { # Insert the major version of Qt in the library name # unless it's a framework build. LIBRARY_NAME ~= s,^Qt,Qt$$QT_MAJOR_VERSION, } return($$LIBRARY_NAME) } defineReplace(qtRelativeRPathBase) { darwin { if(equals(TEMPLATE, app):app_bundle)|\ if(equals(TEMPLATE, lib):plugin:plugin_bundle) { ios: return($$target.path/$${TARGET}.app) return($$target.path/$${TARGET}.app/Contents/MacOS) } equals(TEMPLATE, lib):!plugin:lib_bundle: \ return($$target.path/$${TARGET}.framework/Versions/Current) } return($$target.path) } defineTest(qtAddLibrary) { warning("qtAddLibrary() is deprecated. Use QT+= instead.") # Reverse-engineer the module name from the library name. for(var, QT_MODULES) { isEqual(QT.$${var}.name, $$1) { QT += $$var export(QT) return(true) } } error("No module matching library '$$1' found.") } # qt module defineTest(qtHaveModule) { !isEmpty(QT.$$replace(1, -, _).name): \ return(true) return(false) } # variable, default, [suffix for variable for system() use], [prepare primary variable for system() use] defineTest(qtPrepareTool) { cmd = $$eval(QT_TOOL.$${2}.binary) isEmpty(cmd) { cmd = $$[QT_HOST_BINS]/$$2 exists($${cmd}.pl) { $${1}_EXE = $${cmd}.pl cmd = perl -w $$system_path($${cmd}.pl) } else: contains(QMAKE_HOST.os, Windows) { $${1}_EXE = $${cmd}.exe cmd = $$system_path($${cmd}.exe) } else:contains(QMAKE_HOST.os, Darwin) { BUNDLENAME = $${cmd}.app/Contents/MacOS/$$2 exists($$BUNDLENAME) { cmd = $$BUNDLENAME } $${1}_EXE = $$cmd } else { $${1}_EXE = $$cmd } } else { $${1}_EXE = $$last(cmd) } export($${1}_EXE) QT_TOOL_ENV += $$eval(QT_TOOL.$${2}.envvars) QT_TOOL_NAME = $$2 !isEmpty(3)|!isEmpty(4) { $$1$$3 = for (arg, cmd): \ $$1$$3 += $$system_quote($$arg) qtAddTargetEnv($$1$$3, QT_TOOL.$${2}.depends, system) } isEmpty(4) { $$1 = for (arg, cmd): \ $$1 += $$shell_quote($$arg) qtAddTargetEnv($$1, QT_TOOL.$${2}.depends, ) } } # target variable, list of env var names, [non-empty: prepare for system(), not make] defineTest(qtAddToolEnv) { isEmpty(3): \ ds = $$QMAKE_DIR_SEP else: \ ds = $$DIR_SEPARATOR batch_sets = for(env, 2) { value = $$eval($${env}.value) !isEmpty(value) { name = $$eval($${env}.name) config = $$eval($${env}.CONFIG) equals(ds, /) { contains(config, prepend): infix = \${$$name:+:\$$$name} else: contains(config, always_prepend): infix = :\$$$name else: infix = # Under msys, this path is taken only in the non-system() # case, so using shell_quote() always works. batch_sets += \ "$$name=$$shell_quote($$join(value, :))$$infix" \ "export $$name" } else { value ~= s,\\^,^^^^,g value ~= s,!,^^!,g value ~= s,\\),^),g contains(config, prepend) { batch_sets += \ "if defined $$name (" \ " set $$name=$$join(value, ;);!$$name!" \ ") else (" \ " set $$name=$$join(value, ;)" \ ")" } else: contains(config, always_prepend) { batch_sets += "(set $$name=$$join(value, ;);!$$name!)" } else { batch_sets += "(set $$name=$$join(value, ;))" } } } } !isEmpty(batch_sets) { batch_name = wrapper !isEmpty(QT_TOOL_NAME): batch_name = $${QT_TOOL_NAME}_wrapper cmd = $$eval($$1) !isEmpty(cmd): cmd = "$$cmd " equals(ds, /) { batch_name = $${batch_name}.sh batch_cont = \ "$$LITERAL_HASH!/bin/sh" \ $$batch_sets \ "exec $$cmd\"$@\"" # It would be nicer to use the '.' command (without 'exec' above), # but that doesn't set the positional arguments under (d)ash. $$1 = } else { batch_name = $${batch_name}.bat batch_cont = \ "@echo off" \ "SetLocal EnableDelayedExpansion" \ $$batch_sets \ "$$cmd%*" \ "EndLocal" $$1 = call } !build_pass:!write_file($$OUT_PWD/$$batch_name, batch_cont, exe): error("Aborting.") isEmpty(3): \ $$1 += $$shell_quote($$shell_path($$OUT_PWD/$$batch_name)) else: \ $$1 += $$system_quote($$system_path($$OUT_PWD/$$batch_name)) QMAKE_DISTCLEAN += $$OUT_PWD/$$batch_name } export($$1) export(QMAKE_DISTCLEAN) } # target variable, dependency var name, [non-empty: prepare for system(), not make] defineTest(qtAddTargetEnv) { deps = $$replace($$2, -private$, _private) deps = $$resolve_depends(deps, "QT.", ".depends" ".run_depends") !isEmpty(deps) { deppath.CONFIG = prepend equals(QMAKE_HOST.os, Windows) { deppath.CONFIG = always_prepend deppath.name = PATH } else:contains(QMAKE_HOST.os, Linux|FreeBSD|OpenBSD|NetBSD|DragonFly|SunOS|HP-UX|QNX|GNU) { deppath.name = LD_LIBRARY_PATH } else:contains(QMAKE_HOST.os, ^GNU/.*) { deppath.name = LD_LIBRARY_PATH } else:contains(QMAKE_HOST.os, Haiku) { deppath.name = LIBRARY_PATH } else:equals(QMAKE_HOST.os, Darwin) { contains(QT_CONFIG, qt_framework): \ deppath.name = DYLD_FRAMEWORK_PATH else: \ deppath.name = DYLD_LIBRARY_PATH } else:equals(QMAKE_HOST.os, AIX) { deppath.name = LIBPATH } else { error("Operating system not supported.") } ptypes = for(dep, deps) { isEmpty(3): \ deppath += $$shell_path($$eval(QT.$${dep}.libs)) else: \ deppath += $$system_path($$eval(QT.$${dep}.libs)) ptypes += $$eval(QT.$${dep}.plugin_types) } deppath.value = $$unique(deppath) pluginpath.value = ppaths = $$[QT_INSTALL_PLUGINS/get] for(qplug, QT_PLUGINS): \ contains(ptypes, $$eval(QT_PLUGIN.$${qplug}.TYPE)): \ ppaths += $$eval(QT_PLUGIN.$${qplug}.PATH) ppaths = $$unique(ppaths) for(qplug, ppaths) { isEmpty(3): \ pluginpath.value += $$shell_path($$qplug) else: \ pluginpath.value += $$system_path($$qplug) } pluginpath.name = QT_PLUGIN_PATH pluginpath.CONFIG = prepend QT_TOOL_ENV += deppath pluginpath } qtAddToolEnv($$1, $$QT_TOOL_ENV, $$3) } defineReplace(pkgConfigExecutable) { isEmpty(PKG_CONFIG) { !isEmpty(QMAKE_PKG_CONFIG): \ PKG_CONFIG = $$QMAKE_PKG_CONFIG else: \ PKG_CONFIG = pkg-config sysroot.name = PKG_CONFIG_SYSROOT_DIR sysroot.value = $$PKG_CONFIG_SYSROOT_DIR libdir.name = PKG_CONFIG_LIBDIR libdir.value = $$PKG_CONFIG_LIBDIR QT_TOOL_NAME = pkg-config qtAddToolEnv(PKG_CONFIG, sysroot libdir, SYS) } equals(QMAKE_HOST.os, Windows): \ PKG_CONFIG += 2> NUL else: \ PKG_CONFIG += 2> /dev/null return($$PKG_CONFIG) } defineTest(packagesExist) { contains(QT_CONFIG, no-pkg-config) { warning("pkg-config disabled, can't check package existence") return(false) } # this can't be done in global scope here because qt_functions is loaded # before the .pro is parsed, so if the .pro set PKG_CONFIG, we wouldn't know it # yet. oops. pkg_config = $$pkgConfigExecutable() for(package, ARGS) { !system($$pkg_config --exists $$package):return(false) } return(true) } # Prepares target that will iterate through all subdirs (except those # with no_default_target or no_{name_of_target}_target. The prepared # target must still be manually added to QMAKE_EXTRA_TARGETS. defineTest(prepareRecursiveTarget) { target = $$1 no_$${target}_target: return() for(subdir, SUBDIRS) { subdir_config = $$eval($${subdir}.CONFIG) contains(subdir_config, no_default_target): next() contains(subdir_config, no_$${target}_target): next() $${target}.recurse += $$subdir } # Set up the recurse target only when there # is something to recurse into. isEmpty($${target}.recurse): return() $${target}.CONFIG = recursive $${target}.recurse_target = $${target} export($${target}.recurse) export($${target}.CONFIG) export($${target}.recurse_target) } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/default_post.prf0000644000175000017500000001000613156345750026225 0ustar markusmarkus# This file is loaded by qmake right after loading the actual project file. contains(TEMPLATE, ".*(lib|app)"):CONFIG += have_target !have_target:!force_qt: CONFIG -= qt load(resolve_config) exclusive_builds: load(exclusive_builds_post) # If the TARGET looks like a path, split it into DESTDIR and the resulting TARGET target_dir_part = $$dirname(TARGET) !isEmpty(target_dir_part) { isEmpty(DESTDIR): \ DESTDIR = $$target_dir_part else: \ DESTDIR = $$DESTDIR/$$target_dir_part TARGET = $$basename(TARGET) DESTDIR = $$clean_path($$DESTDIR) } QT_BREAKPAD_ROOT_PATH = $$(QT_BREAKPAD_ROOT_PATH) !isEmpty(QT_BREAKPAD_ROOT_PATH): \ # quick test first whether requested ... !static:release:have_target: \ # is it applicable? !contains(TARGET, .*phony_target.*): \ # monster hack, you don't really see this here, right? ;) system($$QT_BREAKPAD_ROOT_PATH/qtbreakpadsymbols --breakpad-exists) { # do we really have it? CONFIG += breakpad force_debug_info CONFIG -= no_debug_info separate_debug_info } force_debug_info|debug: \ CONFIG += debug_info force_debug_info { QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO } optimize_full { !isEmpty(QMAKE_CFLAGS_OPTIMIZE):!isEmpty(QMAKE_CFLAGS_OPTIMIZE_FULL) { QMAKE_CFLAGS_RELEASE -= $$QMAKE_CFLAGS_OPTIMIZE QMAKE_CXXFLAGS_RELEASE -= $$QMAKE_CFLAGS_OPTIMIZE QMAKE_CFLAGS_RELEASE += $$QMAKE_CFLAGS_OPTIMIZE_FULL QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_OPTIMIZE_FULL } } debug { QMAKE_CFLAGS += $$QMAKE_CFLAGS_DEBUG QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_DEBUG QMAKE_LFLAGS += $$QMAKE_LFLAGS_DEBUG QMAKE_LIBFLAGS += $$QMAKE_LIBFLAGS_DEBUG } else { QMAKE_CFLAGS += $$QMAKE_CFLAGS_RELEASE QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_RELEASE QMAKE_LFLAGS += $$QMAKE_LFLAGS_RELEASE QMAKE_LIBFLAGS += $$QMAKE_LIBFLAGS_RELEASE } # disable special linker flags for host builds (no proper test for host support yet) !host_build { use_gold_linker: QMAKE_LFLAGS += $$QMAKE_LFLAGS_USE_GOLD enable_new_dtags: QMAKE_LFLAGS += $$QMAKE_LFLAGS_NEW_DTAGS } dll:win32: QMAKE_LFLAGS += $$QMAKE_LFLAGS_DLL static:mac: QMAKE_LFLAGS += $$QMAKE_LFLAGS_STATIC_LIB staticlib:unix { QMAKE_CFLAGS += $$QMAKE_CFLAGS_STATIC_LIB QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_STATIC_LIB } incredibuild_xge { CONFIG -= incredibuild_xge CONFIG = incredibuild_xge $$CONFIG } silent { # Ensure that we process silent.prf last, as it will mangle QMAKE_CXX # and friends in a way that some of the other features (sdk.prf and # simd.prf eg) do not handle. CONFIG -= silent CONFIG = silent $$CONFIG } breakpad { load(resolve_target) DEBUGFILENAME = $$shell_quote($$system_path($$QMAKE_RESOLVED_TARGET)) PROJECTPATH = $$shell_quote($$system_path($$OUT_PWD)) !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t) QMAKE_POST_LINK = $$QMAKE_POST_LINK$$quote($${QT_BREAKPAD_ROOT_PATH}$${QMAKE_DIR_SEP}qtbreakpadsymbols $$DEBUGFILENAME $$PROJECTPATH) !isEmpty(QMAKE_STRIP):QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote($$QMAKE_STRIP $$DEBUGFILENAME) } c++11|c++14|c++1z { # Disable special compiler flags for host builds !host_build|!cross_compile { c++1z: cxxstd = CXX1Z else: c++14: cxxstd = CXX14 else: cxxstd = CXX11 } else { # Fall back to c++11, because since 5.7 c++11 is required everywhere, # including host builds cxxstd = CXX11 } # Check if we should disable the GNU extensions or not !strict_c++:!isEmpty(QMAKE_CXXFLAGS_GNU$$cxxstd): cxxstd = GNU$$cxxstd QMAKE_CXXFLAGS += $$eval(QMAKE_CXXFLAGS_$$cxxstd) QMAKE_LFLAGS += $$eval(QMAKE_LFLAGS_$$cxxstd) unset(cxxstd) } !precompile_header: SOURCES += $$NO_PCH_SOURCES QMAKE_INCDIR += $$QMAKE_INCDIR_POST QMAKE_LIBDIR += $$QMAKE_LIBDIR_POST robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/default_pre.prf0000644000175000017500000000175113156345750026035 0ustar markusmarkus# This file is loaded by qmake right before each actual project file. # Note that evaluating variable assignments from the command line # still happens in between these two steps. load(exclusive_builds) CONFIG = \ lex yacc debug exceptions depend_includepath \ testcase_targets import_plugins import_qpa_plugin \ $$CONFIG contains(QT_CONFIG, c++11):lessThan(QT_COMPILER_STDCXX, 201103): CONFIG += c++11 !build_pass:defined(QT_EDITION, var):!equals(QT_EDITION, "OpenSource"):!equals(QT_EDITION, "Preview") { # # call license checker (but cache result for one day) # today = $$section(_DATE_, " ", 0, 2) !isEqual(QMAKE_LICHECK_TIMESTAMP, $$today) { !system("$$system_quote($$system_path($$[QT_HOST_BINS/src]/$$QT_LICHECK)) check" \ "$$QT_RELEASE_DATE $$[QMAKE_SPEC] $$[QMAKE_XSPEC]"): \ error("License check failed! Giving up ...") cache(QMAKE_LICHECK_TIMESTAMP, set stash, today) } unset(today) } load(toolchain) robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/resources.prf0000644000175000017500000000675313156345750025564 0ustar markusmarkusqtPrepareTool(QMAKE_RCC, rcc, _DEP) isEmpty(RCC_DIR):RCC_DIR = . isEmpty(QMAKE_MOD_RCC):QMAKE_MOD_RCC = qrc !contains(QMAKE_RESOURCE_FLAGS, -root):!isEmpty(QMAKE_RESOURCE_ROOT):QMAKE_RESOURCE_FLAGS += -root $$QMAKE_RESOURCE_ROOT !contains(QMAKE_RESOURCE_FLAGS, -name): QMAKE_RESOURCE_FLAGS += -name ${QMAKE_FILE_BASE} # http://www.w3.org/TR/xml/#syntax defineReplace(xml_escape) { 1 ~= s,&,&, 1 ~= s,\',', 1 ~= s,\",", 1 ~= s,<,<, 1 ~= s,>,>, return($$1) } RESOURCES += qmake_immediate for(resource, RESOURCES) { # Regular case of user qrc file contains(resource, ".*\.qrc$"): \ next() # Fallback for stand-alone files/directories !defined($${resource}.files, var) { !equals(resource, qmake_immediate) { !exists($$absolute_path($$resource, $$_PRO_FILE_PWD_)): \ warning("Failure to find: $$resource") qmake_immediate.files += $$resource } RESOURCES -= $$resource next() } resource_file = $$RCC_DIR/qmake_$${resource}.qrc isEmpty(BUILDS)|build_pass { # Collection of files, generate qrc file prefix = $$eval($${resource}.prefix) isEmpty(prefix): \ prefix = "/" resource_file_content = \ "" \ "" abs_base = $$absolute_path($$eval($${resource}.base), $$_PRO_FILE_PWD_) for(file, $${resource}.files) { abs_path = $$absolute_path($$file, $$_PRO_FILE_PWD_) files = $$files($$abs_path/*, true) isEmpty(files): \ files = $$abs_path for (file, files) { exists($$file/*): next() # exclude directories alias = $$relative_path($$file, $$abs_base) resource_file_content += \ "$$xml_escape($$file)" } } resource_file_content += \ "" \ "" !write_file($$OUT_PWD/$$resource_file, resource_file_content): \ error("Aborting.") } RESOURCES -= $$resource RESOURCES += $$resource_file } rcc.input = RESOURCES rcc.name = RCC ${QMAKE_FILE_IN} rcc.depend_command = $$QMAKE_RCC_DEP -list $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} rcc.CONFIG += add_inputs_as_makefile_deps !resources_big|ltcg|macx-xcode|contains(TEMPLATE, "vc.*") { rcc.output = $$RCC_DIR/$${first(QMAKE_MOD_RCC)}_${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)} rcc.commands = $$QMAKE_RCC $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} rcc.variable_out = SOURCES } else { isEmpty(RCC_CXX):RCC_CXX = $$QMAKE_CXX $(CXXFLAGS) RCC_OUT_BASE = $$RCC_DIR/$${first(QMAKE_MOD_RCC)}_${QMAKE_FILE_BASE} RCC_CPP = $$RCC_OUT_BASE$${first(QMAKE_EXT_CPP)} RCC_TMP = $${RCC_OUT_BASE}.tmp$${first(QMAKE_EXT_OBJ)} RCC_OBJ = $$RCC_OUT_BASE$${first(QMAKE_EXT_OBJ)} msvc: RCC_CXX_O_FLAG = "-Fo" else: RCC_CXX_O_FLAG = "-o " rcc.output = $$RCC_OBJ rcc.commands = \ $$QMAKE_RCC $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} -pass 1 -o $$RCC_CPP && \ $$RCC_CXX -c $$RCC_CPP $$RCC_CXX_O_FLAG$$RCC_TMP && \ $$QMAKE_RCC $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} -pass 2 -temp $$RCC_TMP -o ${QMAKE_FILE_OUT} rcc.clean += $$RCC_CPP $$RCC_TMP } rcc.depends += $$QMAKE_RCC_EXE silent:rcc.commands = @echo rcc ${QMAKE_FILE_IN} && $$rcc.commands else:rcc.commands ~= s/&&/$$escape_expand(\\n\\t)/g QMAKE_EXTRA_COMPILERS += rcc robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/warn_on.prf0000644000175000017500000000014613156345750025203 0ustar markusmarkusCONFIG -= warn_off QMAKE_CFLAGS += $$QMAKE_CFLAGS_WARN_ON QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_WARN_ON robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/resolve_config.prf0000644000175000017500000000273313156345750026550 0ustar markusmarkus# # W A R N I N G # ------------- # # This file is not part of the Qt API. It exists purely as an # implementation detail. It may change from version to version # without notice, or even be removed. # # We mean it. # staticlib: \ CONFIG += static else: dll: \ CONFIG += shared CONFIG(static, static|shared) { CONFIG -= shared dll contains(TEMPLATE, ".*lib"): CONFIG += staticlib } else { CONFIG -= static staticlib contains(TEMPLATE, ".*lib"): CONFIG += dll } !macx-xcode: \ addExclusiveBuilds(shared, static) CONFIG(debug, debug|release) { CONFIG -= release !force_debug_plist:debug_and_release: \ CONFIG += no_plist } else { CONFIG -= debug } !macx-xcode { addExclusiveBuilds(debug, release) } else { # The Xcode generator always generates project files with # debug and release configurations, regardless of whether # or not debug_and_release is active. for(build, $$list(debug release)) { suffix = contains(QT_CONFIG, debug_and_release) { equals(build, debug): \ suffix = _debug } else { contains(QT_CONFIG, debug): \ suffix = _debug } library_suffix_$${build}.name = $$QMAKE_XCODE_LIBRARY_SUFFIX_SETTING library_suffix_$${build}.value = $$suffix library_suffix_$${build}.build = $$build QMAKE_MAC_XCODE_SETTINGS += library_suffix_$${build} CONFIG *= xcode_dynamic_library_suffix } } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/lex.prf0000644000175000017500000000261313156345750024331 0ustar markusmarkus# # Lex extra-compiler for handling files specified in the LEXSOURCES variable # { lex.name = Lex ${QMAKE_FILE_IN} lex.input = LEXSOURCES lex_included { lex.CONFIG += no_link } else { lex.variable_out = GENERATED_SOURCES } isEmpty(QMAKE_LEXFLAGS_MANGLE):QMAKE_LEXFLAGS_MANGLE = -P${QMAKE_FILE_BASE} QMAKE_LEXEXTRAFLAGS = $$QMAKE_LEXFLAGS !yacc_no_name_mangle:QMAKE_LEXEXTRAFLAGS += $$QMAKE_LEXFLAGS_MANGLE contains(QMAKE_LEX, .*flex) { # GNU flex, we can use -o outfile lex.commands = $$QMAKE_LEX $$QMAKE_LEXEXTRAFLAGS --nounistd -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN} } else { # stupid POSIX lex, it only generates a file called lex.yy.c # or lex.prefix.c if the -P option is active intermediate_file = lex.yy.c QMAKE_LEXEXTRAFLAGS = $$QMAKE_LEXFLAGS $$QMAKE_LEXFLAGS_MANGLE lex.commands = \ -$(DEL_FILE) ${QMAKE_FILE_OUT}$$escape_expand(\\n\\t) \ $$QMAKE_LEX $$QMAKE_LEXEXTRAFLAGS ${QMAKE_FILE_IN}$$escape_expand(\\n\\t) \ $(MOVE) $$intermediate_file ${QMAKE_FILE_OUT} $$escape_expand(\\n\\t) unset(intermediate_file) } lex.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_LEX}$${first(QMAKE_EXT_CPP)} silent:lex.commands = @echo Lex ${QMAKE_FILE_IN} && $$lex.commands QMAKE_EXTRA_COMPILERS += lex } robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/moc.prf0000644000175000017500000000567513156345750024332 0ustar markusmarkus #global defaults qtPrepareTool(QMAKE_MOC, moc) isEmpty(MOC_DIR):MOC_DIR = . isEmpty(QMAKE_H_MOD_MOC):QMAKE_H_MOD_MOC = moc_ isEmpty(QMAKE_EXT_CPP_MOC):QMAKE_EXT_CPP_MOC = .moc MOC_INCLUDEPATH = for (inc, INCLUDEPATH): \ MOC_INCLUDEPATH += $$absolute_path($$inc, $$_PRO_FILE_PWD_) !no_include_pwd:!isEqual(OUT_PWD, $$_PRO_FILE_PWD_): \ MOC_INCLUDEPATH += . MOC_INCLUDEPATH = $$QMAKESPEC $$_PRO_FILE_PWD_ $$MOC_INCLUDEPATH $$QMAKE_DEFAULT_INCDIRS # On Windows, put the includes into a .inc file which moc will read, if the project # has too many includes. We do this to overcome a command-line limit on Win < XP WIN_INCLUDETEMP= win32:count(MOC_INCLUDEPATH, 40, >) { WIN_INCLUDETEMP = $$MOC_DIR/mocinclude.opt WIN_INCLUDETEMP_CONT = for (inc, MOC_INCLUDEPATH): \ WIN_INCLUDETEMP_CONT += -I$$inc write_file($$absolute_path($$WIN_INCLUDETEMP, $$OUT_PWD), WIN_INCLUDETEMP_CONT)|error("Aborting.") } defineReplace(mocCmdBase) { RET = !isEmpty(WIN_INCLUDETEMP) { incvar = @$$WIN_INCLUDETEMP } else { incvar = for (inc, MOC_INCLUDEPATH): \ incvar += -I$$shell_quote($$inc) incvar += $$QMAKE_FRAMEWORKPATH_FLAGS } RET += $$QMAKE_MOC $(DEFINES) $$join(QMAKE_COMPILER_DEFINES, " -D", -D) $$incvar $$QMAKE_MOC_OPTIONS return($$RET) } #moc headers moc_header.CONFIG = moc_verify moc_header.dependency_type = TYPE_C moc_header.commands = ${QMAKE_FUNC_mocCmdBase} ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} moc_header.output = $$MOC_DIR/$${QMAKE_H_MOD_MOC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)} moc_header.input = HEADERS moc_header.variable_out = SOURCES moc_header.name = MOC ${QMAKE_FILE_IN} moc_header.depends += $$WIN_INCLUDETEMP silent:moc_header.commands = @echo moc ${QMAKE_FILE_IN} && $$moc_header.commands QMAKE_EXTRA_COMPILERS += moc_header INCREDIBUILD_XGE += moc_header #moc sources moc_source.CONFIG = no_link moc_verify moc_source.dependency_type = TYPE_C moc_source.commands = ${QMAKE_FUNC_mocCmdBase} ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} moc_source.output = $$MOC_DIR/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_EXT_CPP_MOC} moc_source.input = SOURCES OBJECTIVE_SOURCES moc_source.name = MOC ${QMAKE_FILE_IN} moc_source.depends += $$WIN_INCLUDETEMP silent:moc_source.commands = @echo moc ${QMAKE_FILE_IN} && $$moc_source.commands QMAKE_EXTRA_COMPILERS += moc_source INCREDIBUILD_XGE += moc_source #make sure we can include these files INCLUDEPATH += $$absolute_path($$MOC_DIR, $$OUT_PWD) #auto depend on moc !no_mocdepend { moc_source.depends += $$QMAKE_MOC_EXE moc_header.depends += $$QMAKE_MOC_EXE } #generate a mocclean build_pass|isEmpty(BUILDS):mocclean.depends = compiler_moc_header_clean compiler_moc_source_clean else:mocclean.CONFIG += recursive QMAKE_EXTRA_TARGETS += mocclean #generate a mocables build_pass|isEmpty(BUILDS):mocables.depends = compiler_moc_header_make_all compiler_moc_source_make_all else:mocables.CONFIG += recursive QMAKE_EXTRA_TARGETS += mocables robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/0000755000175000017500000000000013156345750022660 5ustar markusmarkusrobocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri0000644000175000017500000000166513156345750032236 0ustar markusmarkusQT.eglfs_kms_support_private.VERSION = 5.7.1 QT.eglfs_kms_support_private.MAJOR_VERSION = 5 QT.eglfs_kms_support_private.MINOR_VERSION = 7 QT.eglfs_kms_support_private.PATCH_VERSION = 1 QT.eglfs_kms_support_private.name = QtEglFsKmsSupport QT.eglfs_kms_support_private.module = Qt5EglFsKmsSupport QT.eglfs_kms_support_private.libs = $$QT_MODULE_LIB_BASE QT.eglfs_kms_support_private.includes = QT.eglfs_kms_support_private.frameworks = QT.eglfs_kms_support_private.bins = $$QT_MODULE_BIN_BASE QT.eglfs_kms_support_private.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.eglfs_kms_support_private.plugins = $$QT_MODULE_PLUGIN_BASE QT.eglfs_kms_support_private.imports = $$QT_MODULE_IMPORT_BASE QT.eglfs_kms_support_private.qml = $$QT_MODULE_QML_BASE QT.eglfs_kms_support_private.depends = core gui QT.eglfs_kms_support_private.module_config = v2 internal_module QT.eglfs_kms_support_private.DEFINES = QT_EGLFS_KMS_SUPPORT_LIB QT_MODULES += eglfs_kms_support robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_core.pri0000644000175000017500000000113613156345750025657 0ustar markusmarkusQT.core.VERSION = 5.7.1 QT.core.MAJOR_VERSION = 5 QT.core.MINOR_VERSION = 7 QT.core.PATCH_VERSION = 1 QT.core.name = QtCore QT.core.module = Qt5Core QT.core.libs = $$QT_MODULE_LIB_BASE QT.core.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtCore QT.core.frameworks = QT.core.bins = $$QT_MODULE_BIN_BASE QT.core.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.core.plugins = $$QT_MODULE_PLUGIN_BASE QT.core.imports = $$QT_MODULE_IMPORT_BASE QT.core.qml = $$QT_MODULE_QML_BASE QT.core.depends = QT.core.module_config = v2 QT.core.CONFIG = moc resources QT.core.DEFINES = QT_CORE_LIB QT_MODULES += core robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_core_private.pri0000644000175000017500000000070613156345750027413 0ustar markusmarkusQT.core_private.VERSION = 5.7.1 QT.core_private.MAJOR_VERSION = 5 QT.core_private.MINOR_VERSION = 7 QT.core_private.PATCH_VERSION = 1 QT.core_private.name = QtCore QT.core_private.module = QT.core_private.libs = $$QT_MODULE_LIB_BASE QT.core_private.includes = $$QT_MODULE_INCLUDE_BASE/QtCore/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtCore/5.7.1/QtCore QT.core_private.frameworks = QT.core_private.depends = core QT.core_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_gui_private.pri0000644000175000017500000000070313156345750027244 0ustar markusmarkusQT.gui_private.VERSION = 5.7.1 QT.gui_private.MAJOR_VERSION = 5 QT.gui_private.MINOR_VERSION = 7 QT.gui_private.PATCH_VERSION = 1 QT.gui_private.name = QtGui QT.gui_private.module = QT.gui_private.libs = $$QT_MODULE_LIB_BASE QT.gui_private.includes = $$QT_MODULE_INCLUDE_BASE/QtGui/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtGui/5.7.1/QtGui QT.gui_private.frameworks = QT.gui_private.depends = core_private gui QT.gui_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_device_lib_private.pri0000644000175000017500000000173513156345750031733 0ustar markusmarkusQT.eglfs_device_lib_private.VERSION = 5.7.1 QT.eglfs_device_lib_private.MAJOR_VERSION = 5 QT.eglfs_device_lib_private.MINOR_VERSION = 7 QT.eglfs_device_lib_private.PATCH_VERSION = 1 QT.eglfs_device_lib_private.name = QtEglDeviceIntegration QT.eglfs_device_lib_private.module = Qt5EglDeviceIntegration QT.eglfs_device_lib_private.libs = $$QT_MODULE_LIB_BASE QT.eglfs_device_lib_private.includes = QT.eglfs_device_lib_private.frameworks = QT.eglfs_device_lib_private.bins = $$QT_MODULE_BIN_BASE QT.eglfs_device_lib_private.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.eglfs_device_lib_private.plugins = $$QT_MODULE_PLUGIN_BASE QT.eglfs_device_lib_private.imports = $$QT_MODULE_IMPORT_BASE QT.eglfs_device_lib_private.qml = $$QT_MODULE_QML_BASE QT.eglfs_device_lib_private.depends = core gui core_private gui_private platformsupport_private QT.eglfs_device_lib_private.module_config = v2 internal_module QT.eglfs_device_lib_private.DEFINES = QT_EGLFS_DEVICE_LIB_LIB QT_MODULES += eglfs_device_lib robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib_private.pri0000644000175000017500000000076713156345750030140 0ustar markusmarkusQT.testlib_private.VERSION = 5.7.1 QT.testlib_private.MAJOR_VERSION = 5 QT.testlib_private.MINOR_VERSION = 7 QT.testlib_private.PATCH_VERSION = 1 QT.testlib_private.name = QtTest QT.testlib_private.module = QT.testlib_private.libs = $$QT_MODULE_LIB_BASE QT.testlib_private.includes = $$QT_MODULE_INCLUDE_BASE/QtTest/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtTest/5.7.1/QtTest QT.testlib_private.frameworks = QT.testlib_private.depends = core_private testlib QT.testlib_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_sql.pri0000644000175000017500000000111713156345750025525 0ustar markusmarkusQT.sql.VERSION = 5.7.1 QT.sql.MAJOR_VERSION = 5 QT.sql.MINOR_VERSION = 7 QT.sql.PATCH_VERSION = 1 QT.sql.name = QtSql QT.sql.module = Qt5Sql QT.sql.libs = $$QT_MODULE_LIB_BASE QT.sql.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtSql QT.sql.frameworks = QT.sql.bins = $$QT_MODULE_BIN_BASE QT.sql.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.sql.plugins = $$QT_MODULE_PLUGIN_BASE QT.sql.imports = $$QT_MODULE_IMPORT_BASE QT.sql.qml = $$QT_MODULE_QML_BASE QT.sql.plugin_types = sqldrivers QT.sql.depends = core QT.sql.module_config = v2 QT.sql.DEFINES = QT_SQL_LIB QT_MODULES += sql robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri0000644000175000017500000000174413156345750030503 0ustar markusmarkusQT.bootstrap_private.VERSION = 5.7.1 QT.bootstrap_private.MAJOR_VERSION = 5 QT.bootstrap_private.MINOR_VERSION = 7 QT.bootstrap_private.PATCH_VERSION = 1 QT.bootstrap_private.name = QtBootstrap QT.bootstrap_private.module = Qt5Bootstrap QT.bootstrap_private.libs = $$QT_MODULE_HOST_LIB_BASE QT.bootstrap_private.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtCore $$QT_MODULE_INCLUDE_BASE/QtCore/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtCore/5.7.1/QtCore $$QT_MODULE_INCLUDE_BASE/QtXml $$QT_MODULE_INCLUDE_BASE/QtXml/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtXml/5.7.1/QtXml QT.bootstrap_private.frameworks = QT.bootstrap_private.depends = QT.bootstrap_private.module_config = v2 staticlib internal_module QT.bootstrap_private.DEFINES = QT_BOOTSTRAP_LIB QT_BOOTSTRAPPED QT_LITE_UNICODE QT_NO_CAST_TO_ASCII QT_NO_CODECS QT_NO_DATASTREAM QT_NO_LIBRARY QT_NO_QOBJECT QT_NO_SYSTEMLOCALE QT_NO_THREAD QT_NO_UNICODETABLES QT_NO_USING_NAMESPACE QT_NO_DEPRECATED QT_NO_TRANSLATION QT_MODULES += bootstrap robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent.pri0000644000175000017500000000131013156345750027103 0ustar markusmarkusQT.concurrent.VERSION = 5.7.1 QT.concurrent.MAJOR_VERSION = 5 QT.concurrent.MINOR_VERSION = 7 QT.concurrent.PATCH_VERSION = 1 QT.concurrent.name = QtConcurrent QT.concurrent.module = Qt5Concurrent QT.concurrent.libs = $$QT_MODULE_LIB_BASE QT.concurrent.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtConcurrent QT.concurrent.frameworks = QT.concurrent.bins = $$QT_MODULE_BIN_BASE QT.concurrent.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.concurrent.plugins = $$QT_MODULE_PLUGIN_BASE QT.concurrent.imports = $$QT_MODULE_IMPORT_BASE QT.concurrent.qml = $$QT_MODULE_QML_BASE QT.concurrent.depends = core QT.concurrent.module_config = v2 QT.concurrent.DEFINES = QT_CONCURRENT_LIB QT_MODULES += concurrent robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri0000644000175000017500000000122013156345750032057 0ustar markusmarkusQT.openglextensions_private.VERSION = 5.7.1 QT.openglextensions_private.MAJOR_VERSION = 5 QT.openglextensions_private.MINOR_VERSION = 7 QT.openglextensions_private.PATCH_VERSION = 1 QT.openglextensions_private.name = QtOpenGLExtensions QT.openglextensions_private.module = QT.openglextensions_private.libs = $$QT_MODULE_LIB_BASE QT.openglextensions_private.includes = $$QT_MODULE_INCLUDE_BASE/QtOpenGLExtensions/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtOpenGLExtensions/5.7.1/QtOpenGLExtensions QT.openglextensions_private.frameworks = QT.openglextensions_private.depends = openglextensions QT.openglextensions_private.module_config = v2 staticlib internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets.pri0000644000175000017500000000130313156345750026371 0ustar markusmarkusQT.widgets.VERSION = 5.7.1 QT.widgets.MAJOR_VERSION = 5 QT.widgets.MINOR_VERSION = 7 QT.widgets.PATCH_VERSION = 1 QT.widgets.name = QtWidgets QT.widgets.module = Qt5Widgets QT.widgets.libs = $$QT_MODULE_LIB_BASE QT.widgets.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtWidgets QT.widgets.frameworks = QT.widgets.bins = $$QT_MODULE_BIN_BASE QT.widgets.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.widgets.plugins = $$QT_MODULE_PLUGIN_BASE QT.widgets.imports = $$QT_MODULE_IMPORT_BASE QT.widgets.qml = $$QT_MODULE_QML_BASE QT.widgets.plugin_types = styles QT.widgets.depends = core gui QT.widgets.module_config = v2 QT.widgets.CONFIG = uic QT.widgets.DEFINES = QT_WIDGETS_LIB QT_MODULES += widgets robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent_private.pri0000644000175000017500000000106313156345750030642 0ustar markusmarkusQT.concurrent_private.VERSION = 5.7.1 QT.concurrent_private.MAJOR_VERSION = 5 QT.concurrent_private.MINOR_VERSION = 7 QT.concurrent_private.PATCH_VERSION = 1 QT.concurrent_private.name = QtConcurrent QT.concurrent_private.module = QT.concurrent_private.libs = $$QT_MODULE_LIB_BASE QT.concurrent_private.includes = $$QT_MODULE_INCLUDE_BASE/QtConcurrent/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtConcurrent/5.7.1/QtConcurrent QT.concurrent_private.frameworks = QT.concurrent_private.depends = core_private concurrent QT.concurrent_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_sql_private.pri0000644000175000017500000000070313156345750027257 0ustar markusmarkusQT.sql_private.VERSION = 5.7.1 QT.sql_private.MAJOR_VERSION = 5 QT.sql_private.MINOR_VERSION = 7 QT.sql_private.PATCH_VERSION = 1 QT.sql_private.name = QtSql QT.sql_private.module = QT.sql_private.libs = $$QT_MODULE_LIB_BASE QT.sql_private.includes = $$QT_MODULE_INCLUDE_BASE/QtSql/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtSql/5.7.1/QtSql QT.sql_private.frameworks = QT.sql_private.depends = core_private sql QT.sql_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl_private.pri0000644000175000017500000000101713156345750027743 0ustar markusmarkusQT.opengl_private.VERSION = 5.7.1 QT.opengl_private.MAJOR_VERSION = 5 QT.opengl_private.MINOR_VERSION = 7 QT.opengl_private.PATCH_VERSION = 1 QT.opengl_private.name = QtOpenGL QT.opengl_private.module = QT.opengl_private.libs = $$QT_MODULE_LIB_BASE QT.opengl_private.includes = $$QT_MODULE_INCLUDE_BASE/QtOpenGL/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtOpenGL/5.7.1/QtOpenGL QT.opengl_private.frameworks = QT.opengl_private.depends = core_private gui_private widgets_private opengl QT.opengl_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets_private.pri0000644000175000017500000000101713156345750030125 0ustar markusmarkusQT.widgets_private.VERSION = 5.7.1 QT.widgets_private.MAJOR_VERSION = 5 QT.widgets_private.MINOR_VERSION = 7 QT.widgets_private.PATCH_VERSION = 1 QT.widgets_private.name = QtWidgets QT.widgets_private.module = QT.widgets_private.libs = $$QT_MODULE_LIB_BASE QT.widgets_private.includes = $$QT_MODULE_INCLUDE_BASE/QtWidgets/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtWidgets/5.7.1/QtWidgets QT.widgets_private.frameworks = QT.widgets_private.depends = core_private gui_private widgets QT.widgets_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport_private.pri0000644000175000017500000000115713156345750031255 0ustar markusmarkusQT.printsupport_private.VERSION = 5.7.1 QT.printsupport_private.MAJOR_VERSION = 5 QT.printsupport_private.MINOR_VERSION = 7 QT.printsupport_private.PATCH_VERSION = 1 QT.printsupport_private.name = QtPrintSupport QT.printsupport_private.module = QT.printsupport_private.libs = $$QT_MODULE_LIB_BASE QT.printsupport_private.includes = $$QT_MODULE_INCLUDE_BASE/QtPrintSupport/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtPrintSupport/5.7.1/QtPrintSupport QT.printsupport_private.frameworks = QT.printsupport_private.depends = core_private gui_private widgets_private printsupport QT.printsupport_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_network_private.pri0000644000175000017500000000100313156345750030143 0ustar markusmarkusQT.network_private.VERSION = 5.7.1 QT.network_private.MAJOR_VERSION = 5 QT.network_private.MINOR_VERSION = 7 QT.network_private.PATCH_VERSION = 1 QT.network_private.name = QtNetwork QT.network_private.module = QT.network_private.libs = $$QT_MODULE_LIB_BASE QT.network_private.includes = $$QT_MODULE_INCLUDE_BASE/QtNetwork/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtNetwork/5.7.1/QtNetwork QT.network_private.frameworks = QT.network_private.depends = core_private network QT.network_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib.pri0000644000175000017500000000125113156345750026373 0ustar markusmarkusQT.testlib.VERSION = 5.7.1 QT.testlib.MAJOR_VERSION = 5 QT.testlib.MINOR_VERSION = 7 QT.testlib.PATCH_VERSION = 1 QT.testlib.name = QtTest QT.testlib.module = Qt5Test QT.testlib.libs = $$QT_MODULE_LIB_BASE QT.testlib.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtTest QT.testlib.frameworks = QT.testlib.bins = $$QT_MODULE_BIN_BASE QT.testlib.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.testlib.plugins = $$QT_MODULE_PLUGIN_BASE QT.testlib.imports = $$QT_MODULE_IMPORT_BASE QT.testlib.qml = $$QT_MODULE_QML_BASE QT.testlib.depends = core QT.testlib.module_config = v2 QT.testlib.CONFIG = console testlib_defines QT.testlib.DEFINES = QT_TESTLIB_LIB QT_MODULES += testlib robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_network.pri0000644000175000017500000000124713156345750026423 0ustar markusmarkusQT.network.VERSION = 5.7.1 QT.network.MAJOR_VERSION = 5 QT.network.MINOR_VERSION = 7 QT.network.PATCH_VERSION = 1 QT.network.name = QtNetwork QT.network.module = Qt5Network QT.network.libs = $$QT_MODULE_LIB_BASE QT.network.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtNetwork QT.network.frameworks = QT.network.bins = $$QT_MODULE_BIN_BASE QT.network.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.network.plugins = $$QT_MODULE_PLUGIN_BASE QT.network.imports = $$QT_MODULE_IMPORT_BASE QT.network.qml = $$QT_MODULE_QML_BASE QT.network.plugin_types = bearer QT.network.depends = core QT.network.module_config = v2 QT.network.DEFINES = QT_NETWORK_LIB QT_MODULES += network robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri0000644000175000017500000000154713156345750030732 0ustar markusmarkusQT.xcb_qpa_lib_private.VERSION = 5.7.1 QT.xcb_qpa_lib_private.MAJOR_VERSION = 5 QT.xcb_qpa_lib_private.MINOR_VERSION = 7 QT.xcb_qpa_lib_private.PATCH_VERSION = 1 QT.xcb_qpa_lib_private.name = QtXcbQpa QT.xcb_qpa_lib_private.module = Qt5XcbQpa QT.xcb_qpa_lib_private.libs = $$QT_MODULE_LIB_BASE QT.xcb_qpa_lib_private.includes = QT.xcb_qpa_lib_private.frameworks = QT.xcb_qpa_lib_private.bins = $$QT_MODULE_BIN_BASE QT.xcb_qpa_lib_private.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.xcb_qpa_lib_private.plugins = $$QT_MODULE_PLUGIN_BASE QT.xcb_qpa_lib_private.imports = $$QT_MODULE_IMPORT_BASE QT.xcb_qpa_lib_private.qml = $$QT_MODULE_QML_BASE QT.xcb_qpa_lib_private.depends = core gui core_private gui_private platformsupport_private dbus QT.xcb_qpa_lib_private.module_config = v2 internal_module QT.xcb_qpa_lib_private.DEFINES = QT_XCB_QPA_LIB_LIB QT_MODULES += xcb_qpa_lib robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus.pri0000644000175000017500000000116113156345750025662 0ustar markusmarkusQT.dbus.VERSION = 5.7.1 QT.dbus.MAJOR_VERSION = 5 QT.dbus.MINOR_VERSION = 7 QT.dbus.PATCH_VERSION = 1 QT.dbus.name = QtDBus QT.dbus.module = Qt5DBus QT.dbus.libs = $$QT_MODULE_LIB_BASE QT.dbus.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtDBus QT.dbus.frameworks = QT.dbus.bins = $$QT_MODULE_BIN_BASE QT.dbus.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.dbus.plugins = $$QT_MODULE_PLUGIN_BASE QT.dbus.imports = $$QT_MODULE_IMPORT_BASE QT.dbus.qml = $$QT_MODULE_QML_BASE QT.dbus.depends = core QT.dbus.module_config = v2 QT.dbus.CONFIG = dbusadaptors dbusinterfaces QT.dbus.DEFINES = QT_DBUS_LIB QT_MODULES += dbus robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions.pri0000644000175000017500000000153213156345750030333 0ustar markusmarkusQT.openglextensions.VERSION = 5.7.1 QT.openglextensions.MAJOR_VERSION = 5 QT.openglextensions.MINOR_VERSION = 7 QT.openglextensions.PATCH_VERSION = 1 QT.openglextensions.name = QtOpenGLExtensions QT.openglextensions.module = Qt5OpenGLExtensions QT.openglextensions.libs = $$QT_MODULE_LIB_BASE QT.openglextensions.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtOpenGLExtensions QT.openglextensions.frameworks = QT.openglextensions.bins = $$QT_MODULE_BIN_BASE QT.openglextensions.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.openglextensions.plugins = $$QT_MODULE_PLUGIN_BASE QT.openglextensions.imports = $$QT_MODULE_IMPORT_BASE QT.openglextensions.qml = $$QT_MODULE_QML_BASE QT.openglextensions.depends = core gui QT.openglextensions.module_config = v2 staticlib QT.openglextensions.DEFINES = QT_OPENGLEXTENSIONS_LIB QT_MODULES += openglextensions robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus_private.pri0000644000175000017500000000072313156345750027417 0ustar markusmarkusQT.dbus_private.VERSION = 5.7.1 QT.dbus_private.MAJOR_VERSION = 5 QT.dbus_private.MINOR_VERSION = 7 QT.dbus_private.PATCH_VERSION = 1 QT.dbus_private.name = QtDBus QT.dbus_private.module = QT.dbus_private.libs = $$QT_MODULE_LIB_BASE QT.dbus_private.includes = $$QT_MODULE_INCLUDE_BASE/QtDBus/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtDBus/5.7.1/QtDBus QT.dbus_private.frameworks = QT.dbus_private.depends = core_private dbus QT.dbus_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_xml_private.pri0000644000175000017500000000070313156345750027260 0ustar markusmarkusQT.xml_private.VERSION = 5.7.1 QT.xml_private.MAJOR_VERSION = 5 QT.xml_private.MINOR_VERSION = 7 QT.xml_private.PATCH_VERSION = 1 QT.xml_private.name = QtXml QT.xml_private.module = QT.xml_private.libs = $$QT_MODULE_LIB_BASE QT.xml_private.includes = $$QT_MODULE_INCLUDE_BASE/QtXml/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtXml/5.7.1/QtXml QT.xml_private.frameworks = QT.xml_private.depends = core_private xml QT.xml_private.module_config = v2 internal_module robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl.pri0000644000175000017500000000117413156345750026215 0ustar markusmarkusQT.opengl.VERSION = 5.7.1 QT.opengl.MAJOR_VERSION = 5 QT.opengl.MINOR_VERSION = 7 QT.opengl.PATCH_VERSION = 1 QT.opengl.name = QtOpenGL QT.opengl.module = Qt5OpenGL QT.opengl.libs = $$QT_MODULE_LIB_BASE QT.opengl.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtOpenGL QT.opengl.frameworks = QT.opengl.bins = $$QT_MODULE_BIN_BASE QT.opengl.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.opengl.plugins = $$QT_MODULE_PLUGIN_BASE QT.opengl.imports = $$QT_MODULE_IMPORT_BASE QT.opengl.qml = $$QT_MODULE_QML_BASE QT.opengl.depends = core gui widgets QT.opengl.module_config = v2 QT.opengl.DEFINES = QT_OPENGL_LIB QT_MODULES += opengl robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_platformsupport_private.pri0000644000175000017500000000223013156345750031736 0ustar markusmarkusQT.platformsupport_private.VERSION = 5.7.1 QT.platformsupport_private.MAJOR_VERSION = 5 QT.platformsupport_private.MINOR_VERSION = 7 QT.platformsupport_private.PATCH_VERSION = 1 QT.platformsupport_private.name = QtPlatformSupport QT.platformsupport_private.module = Qt5PlatformSupport QT.platformsupport_private.libs = $$QT_MODULE_LIB_BASE QT.platformsupport_private.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtPlatformSupport $$QT_MODULE_INCLUDE_BASE/QtPlatformSupport/5.7.1 $$QT_MODULE_INCLUDE_BASE/QtPlatformSupport/5.7.1/QtPlatformSupport QT.platformsupport_private.frameworks = QT.platformsupport_private.bins = $$QT_MODULE_BIN_BASE QT.platformsupport_private.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.platformsupport_private.plugins = $$QT_MODULE_PLUGIN_BASE QT.platformsupport_private.imports = $$QT_MODULE_IMPORT_BASE QT.platformsupport_private.qml = $$QT_MODULE_QML_BASE QT.platformsupport_private.depends = core_private gui_private QT.platformsupport_private.run_depends = dbus dbus dbus QT.platformsupport_private.module_config = v2 staticlib internal_module QT.platformsupport_private.DEFINES = QT_PLATFORMSUPPORT_LIB QT_MODULES += platformsupport robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_xml.pri0000644000175000017500000000105613156345750025530 0ustar markusmarkusQT.xml.VERSION = 5.7.1 QT.xml.MAJOR_VERSION = 5 QT.xml.MINOR_VERSION = 7 QT.xml.PATCH_VERSION = 1 QT.xml.name = QtXml QT.xml.module = Qt5Xml QT.xml.libs = $$QT_MODULE_LIB_BASE QT.xml.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtXml QT.xml.frameworks = QT.xml.bins = $$QT_MODULE_BIN_BASE QT.xml.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.xml.plugins = $$QT_MODULE_PLUGIN_BASE QT.xml.imports = $$QT_MODULE_IMPORT_BASE QT.xml.qml = $$QT_MODULE_QML_BASE QT.xml.depends = core QT.xml.module_config = v2 QT.xml.DEFINES = QT_XML_LIB QT_MODULES += xml robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_gui.pri0000644000175000017500000000132313156345750025511 0ustar markusmarkusQT.gui.VERSION = 5.7.1 QT.gui.MAJOR_VERSION = 5 QT.gui.MINOR_VERSION = 7 QT.gui.PATCH_VERSION = 1 QT.gui.name = QtGui QT.gui.module = Qt5Gui QT.gui.libs = $$QT_MODULE_LIB_BASE QT.gui.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtGui QT.gui.frameworks = QT.gui.bins = $$QT_MODULE_BIN_BASE QT.gui.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.gui.plugins = $$QT_MODULE_PLUGIN_BASE QT.gui.imports = $$QT_MODULE_IMPORT_BASE QT.gui.qml = $$QT_MODULE_QML_BASE QT.gui.plugin_types = platforms xcbglintegrations platformthemes platforminputcontexts generic iconengines imageformats egldeviceintegrations QT.gui.depends = core QT.gui.module_config = v2 QT.gui.CONFIG = opengl QT.gui.DEFINES = QT_GUI_LIB QT_MODULES += gui robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport.pri0000644000175000017500000000145413156345750027523 0ustar markusmarkusQT.printsupport.VERSION = 5.7.1 QT.printsupport.MAJOR_VERSION = 5 QT.printsupport.MINOR_VERSION = 7 QT.printsupport.PATCH_VERSION = 1 QT.printsupport.name = QtPrintSupport QT.printsupport.module = Qt5PrintSupport QT.printsupport.libs = $$QT_MODULE_LIB_BASE QT.printsupport.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtPrintSupport QT.printsupport.frameworks = QT.printsupport.bins = $$QT_MODULE_BIN_BASE QT.printsupport.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.printsupport.plugins = $$QT_MODULE_PLUGIN_BASE QT.printsupport.imports = $$QT_MODULE_IMPORT_BASE QT.printsupport.qml = $$QT_MODULE_QML_BASE QT.printsupport.plugin_types = printsupport QT.printsupport.depends = core gui widgets QT.printsupport.module_config = v2 QT.printsupport.DEFINES = QT_PRINTSUPPORT_LIB QT_MODULES += printsupport robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_svg.pri0000644000175000017500000000107213156345750025525 0ustar markusmarkusQT.svg.VERSION = 5.7.1 QT.svg.MAJOR_VERSION = 5 QT.svg.MINOR_VERSION = 7 QT.svg.PATCH_VERSION = 1 QT.svg.name = QtSvg QT.svg.module = Qt5Svg QT.svg.libs = $$QT_MODULE_LIB_BASE QT.svg.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtSvg QT.svg.frameworks = QT.svg.bins = $$QT_MODULE_BIN_BASE QT.svg.libexecs = $$QT_MODULE_LIBEXEC_BASE QT.svg.plugins = $$QT_MODULE_PLUGIN_BASE QT.svg.imports = $$QT_MODULE_IMPORT_BASE QT.svg.qml = $$QT_MODULE_QML_BASE QT.svg.depends = core gui widgets QT.svg.module_config = v2 QT.svg.DEFINES = QT_SVG_LIB QT_MODULES += svg robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64/0000755000175000017500000000000013156345750023150 5ustar markusmarkusrobocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64/qmake.conf0000644000175000017500000000100413156345750025110 0ustar markusmarkus# # qmake configuration for linux-g++ # # Written for GNU/Linux platforms that have both lib and lib64 directories, # like the AMD Opteron. # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib include(../common/linux.conf) QMAKE_CFLAGS = -m64 QMAKE_LFLAGS = -m64 include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) QMAKE_LIBDIR_X11 = /usr/X11R6/lib64 QMAKE_LIBDIR_OPENGL = /usr/X11R6/lib64 load(qt_config) robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/0000755000175000017500000000000013156345750022500 5ustar markusmarkusrobocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/unix.conf0000644000175000017500000000066513156345750024341 0ustar markusmarkus# # qmake configuration for common unix # QMAKE_PLATFORM += unix posix QMAKE_LEX = flex QMAKE_LEXFLAGS += QMAKE_YACC = yacc QMAKE_YACCFLAGS += -d QMAKE_YACCFLAGS_MANGLE += -p $base -b $base QMAKE_YACC_HEADER = $base.tab.h QMAKE_YACC_SOURCE = $base.tab.c QMAKE_PREFIX_SHLIB = lib QMAKE_EXTENSION_SHLIB = so QMAKE_PREFIX_STATICLIB = lib QMAKE_EXTENSION_STATICLIB = a robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/g++-unix.conf0000644000175000017500000000067013156345750024707 0ustar markusmarkus# # Qmake configuration for the GNU C++ compiler on *nix-systems # # Before making changes to this file, please read the comment in # gcc-base.conf, to make sure the change goes in the right place. # # To verify that your change has the desired effect on the final configuration # you can use the manual test in tests/manual/mkspecs. # include(g++-base.conf) QMAKE_LFLAGS_RELEASE += -Wl,-O1 QMAKE_LFLAGS_NOUNDEF += -Wl,--no-undefined robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/sanitize.conf0000644000175000017500000000151413156345750025176 0ustar markusmarkus# # Qmake configuration for the GCC / Clang sanitize features # QMAKE_COMMON_SANITIZE_CFLAGS = -fno-omit-frame-pointer QMAKE_COMMON_SANITIZE_CXXFLAGS = -fno-omit-frame-pointer QMAKE_SANITIZE_ADDRESS_CFLAGS = -fsanitize=address QMAKE_SANITIZE_ADDRESS_CXXFLAGS = -fsanitize=address QMAKE_SANITIZE_ADDRESS_LFLAGS = -fsanitize=address QMAKE_SANITIZE_THREAD_CFLAGS = -fsanitize=thread QMAKE_SANITIZE_THREAD_CXXFLAGS = -fsanitize=thread QMAKE_SANITIZE_THREAD_LFLAGS = -fsanitize=thread QMAKE_SANITIZE_MEMORY_CFLAGS = -fsanitize=memory QMAKE_SANITIZE_MEMORY_CXXFLAGS = -fsanitize=memory QMAKE_SANITIZE_MEMORY_LFLAGS = -fsanitize=memory QMAKE_SANITIZE_UNDEFINED_CFLAGS = -fsanitize=undefined QMAKE_SANITIZE_UNDEFINED_CXXFLAGS = -fsanitize=undefined QMAKE_SANITIZE_UNDEFINED_LFLAGS = -fsanitize=undefined robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/g++-base.conf0000644000175000017500000000227513156345750024641 0ustar markusmarkus# # Qmake configuration for the GNU C++ compiler # # Before making changes to this file, please read the comment in # gcc-base.conf, to make sure the change goes in the right place. # # To verify that your change has the desired effect on the final configuration # you can use the manual test in tests/manual/mkspecs. # QMAKE_COMPILER = gcc QMAKE_CC = gcc QMAKE_LINK_C = $$QMAKE_CC QMAKE_LINK_C_SHLIB = $$QMAKE_CC QMAKE_CXX = g++ QMAKE_LINK = $$QMAKE_CXX QMAKE_LINK_SHLIB = $$QMAKE_CXX QMAKE_PCH_OUTPUT_EXT = .gch QMAKE_CFLAGS_PRECOMPILE = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} QMAKE_CFLAGS_USE_PRECOMPILE = -include ${QMAKE_PCH_OUTPUT_BASE} QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE QMAKE_CXXFLAGS_CXX11 = -std=c++11 QMAKE_CXXFLAGS_CXX14 = -std=c++1y QMAKE_CXXFLAGS_CXX1Z = -std=c++1z QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11 QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z QMAKE_LFLAGS_CXX11 = QMAKE_LFLAGS_CXX14 = QMAKE_LFLAGS_CXX1Z = robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/gcc-base-unix.conf0000644000175000017500000000153313156345750025776 0ustar markusmarkus# # Base qmake configuration for GCC on *nix-systems # # Before making changes to this file, please read the comment in # gcc-base.conf, to make sure the change goes in the right place. # # To verify that your change has the desired effect on the final configuration # you can use the manual test in tests/manual/mkspecs. # include(gcc-base.conf) QMAKE_LFLAGS_SHLIB += -shared QMAKE_LFLAGS_PLUGIN += $$QMAKE_LFLAGS_SHLIB QMAKE_LFLAGS_SONAME += -Wl,-soname, QMAKE_LFLAGS_THREAD += QMAKE_LFLAGS_RPATH = -Wl,-rpath, QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link, QMAKE_LFLAGS_NEW_DTAGS = -Wl,--enable-new-dtags QMAKE_LFLAGS_USE_GOLD = -fuse-ld=gold # -Bsymbolic-functions (ld) support QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list, QMAKE_LFLAGS_VERSION_SCRIPT = -Wl,--version-script, robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/linux.conf0000644000175000017500000000275113156345750024513 0ustar markusmarkus# # qmake configuration for common linux # QMAKE_PLATFORM += linux include(unix.conf) QMAKE_CFLAGS_THREAD += -D_REENTRANT QMAKE_CXXFLAGS_THREAD += $$QMAKE_CFLAGS_THREAD QMAKE_LFLAGS_GCSECTIONS = -Wl,--gc-sections QMAKE_LFLAGS_REL_RPATH = -Wl,-z,origin QMAKE_REL_RPATH_BASE = $ORIGIN QMAKE_INCDIR = QMAKE_LIBDIR = QMAKE_INCDIR_X11 = QMAKE_LIBDIR_X11 = QMAKE_INCDIR_OPENGL = QMAKE_LIBDIR_OPENGL = QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL QMAKE_LIBDIR_OPENGL_ES2 = $$QMAKE_LIBDIR_OPENGL QMAKE_INCDIR_EGL = QMAKE_LIBDIR_EGL = QMAKE_INCDIR_OPENVG = QMAKE_LIBDIR_OPENVG = QMAKE_LIBS = QMAKE_LIBS_DYNLOAD = -ldl QMAKE_LIBS_X11 = -lXext -lX11 -lm QMAKE_LIBS_NIS = -lnsl QMAKE_LIBS_EGL = -lEGL QMAKE_LIBS_OPENGL = -lGL QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 QMAKE_LIBS_OPENVG = -lOpenVG QMAKE_LIBS_THREAD = -lpthread QMAKE_LIBS_LIBUDEV = -ludev QMAKE_CFLAGS_WAYLAND = QMAKE_INCDIR_WAYLAND = QMAKE_LIBS_WAYLAND_CLIENT = -lwayland-client QMAKE_LIBS_WAYLAND_SERVER = -lwayland-server QMAKE_LIBDIR_WAYLAND = QMAKE_DEFINES_WAYLAND = QMAKE_WAYLAND_SCANNER = wayland-scanner QMAKE_CFLAGS_XCB = QMAKE_LIBS_XCB = QMAKE_DEFINES_XCB = QMAKE_AR = ar cqs QMAKE_OBJCOPY = objcopy QMAKE_NM = nm -P QMAKE_RANLIB = QMAKE_STRIP = strip QMAKE_STRIPFLAGS_LIB += --strip-unneeded robocut1.0.11/usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/gcc-base.conf0000644000175000017500000000754413156345750025025 0ustar markusmarkus# # This file is used as a basis for the following compilers: # # - The GNU C++ compiler (g++) # - LLVM # - Clang # # Platform-specific options shared by these compilers are put into: # # - gcc-base-mac.conf # - gcc-base-unix.conf # # These base files are then combined with configurations for each compiler: # # - g++-base.conf # - g++-macx.conf # - g++-unix.conf # - llvm.conf # - clang.conf # # The combination happens in the top level mkspec, by including a platform- # specific version of the base-file, for example gcc-base-mac.conf, and then # a (possibly platform-specific) version of the actual compiler configuration, # for example g++-macx.conf. # # If you are making changes to any of these files, please consider the # possible effect it may have due to these include-rules, and whether it # might make more sense to share the rule or make it more specific. # # To verify that your change has the desired effect on the final configuration # you can use the manual test in tests/manual/mkspecs. # QMAKE_CFLAGS_OPTIMIZE = -O2 QMAKE_CFLAGS_OPTIMIZE_FULL = -O3 QMAKE_CFLAGS += -pipe QMAKE_CFLAGS_DEPS += -M QMAKE_CFLAGS_WARN_ON += -Wall -W QMAKE_CFLAGS_WARN_OFF += -w QMAKE_CFLAGS_RELEASE += $$QMAKE_CFLAGS_OPTIMIZE QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -g QMAKE_CFLAGS_DEBUG += -g QMAKE_CFLAGS_SHLIB += -fPIC QMAKE_CFLAGS_STATIC_LIB += -fPIC QMAKE_CFLAGS_APP += -fPIC QMAKE_CFLAGS_ISYSTEM = -isystem QMAKE_CFLAGS_YACC += -Wno-unused -Wno-parentheses QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden QMAKE_CFLAGS_EXCEPTIONS_OFF += -fno-exceptions QMAKE_CFLAGS_SPLIT_SECTIONS += -ffunction-sections QMAKE_CFLAGS_LTCG = -flto -fno-fat-lto-objects QMAKE_CFLAGS_LTCG_FATOBJECTS = -ffat-lto-objects QMAKE_CFLAGS_DISABLE_LTCG = -fno-lto QMAKE_CXXFLAGS += $$QMAKE_CFLAGS QMAKE_CXXFLAGS_DEPS += $$QMAKE_CFLAGS_DEPS QMAKE_CXXFLAGS_WARN_ON += $$QMAKE_CFLAGS_WARN_ON QMAKE_CXXFLAGS_WARN_OFF += $$QMAKE_CFLAGS_WARN_OFF QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_DEBUG QMAKE_CXXFLAGS_SHLIB += $$QMAKE_CFLAGS_SHLIB QMAKE_CXXFLAGS_STATIC_LIB += $$QMAKE_CFLAGS_STATIC_LIB QMAKE_CXXFLAGS_APP += $$QMAKE_CFLAGS_APP QMAKE_CXXFLAGS_YACC += $$QMAKE_CFLAGS_YACC QMAKE_CXXFLAGS_HIDESYMS += $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden QMAKE_CXXFLAGS_EXCEPTIONS_OFF += $$QMAKE_CFLAGS_EXCEPTIONS_OFF QMAKE_CXXFLAGS_SPLIT_SECTIONS += $$QMAKE_CFLAGS_SPLIT_SECTIONS QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG QMAKE_CXXFLAGS_LTCG_FATOBJECTS = $$QMAKE_CFLAGS_LTCG_FATOBJECTS QMAKE_CXXFLAGS_DISABLE_LTCG = $$QMAKE_CFLAGS_DISABLE_LTCG QMAKE_LFLAGS += QMAKE_LFLAGS_DEBUG += QMAKE_LFLAGS_APP += QMAKE_LFLAGS_RELEASE += QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO += QMAKE_LFLAGS_EXCEPTIONS_OFF += QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG -fuse-linker-plugin QMAKE_CFLAGS_SSE2 += -msse2 QMAKE_CFLAGS_SSE3 += -msse3 QMAKE_CFLAGS_SSSE3 += -mssse3 QMAKE_CFLAGS_SSE4_1 += -msse4.1 QMAKE_CFLAGS_SSE4_2 += -msse4.2 QMAKE_CFLAGS_AVX += -mavx QMAKE_CFLAGS_AVX2 += -mavx2 QMAKE_CFLAGS_AVX512F += -mavx512f QMAKE_CFLAGS_AVX512ER += -mavx512er QMAKE_CFLAGS_AVX512CD += -mavx512cd QMAKE_CFLAGS_AVX512PF += -mavx512pf QMAKE_CFLAGS_AVX512DQ += -mavx512dq QMAKE_CFLAGS_AVX512BW += -mavx512bw QMAKE_CFLAGS_AVX512VL += -mavx512vl QMAKE_CFLAGS_AVX512IFMA += -mavx512ifma QMAKE_CFLAGS_AVX512VBMI += -mavx512vbmi QMAKE_CFLAGS_NEON += -mfpu=neon # Wrapper tools that understand .o/.a files with GIMPLE instead of machine code QMAKE_AR_LTCG = gcc-ar cqs QMAKE_NM_LTCG = gcc-nm -P QMAKE_RANLIB_LTCG = true # No need to run since gcc-ar has "s" include(sanitize.conf) robocut1.0.11/robocut.spec0000644000175000017500000000365513156345750015133 0ustar markusmarkus# norootforbuild Name: robocut Group: Productivity/Graphics/Other Version: 1.0.10 Release: 1 License: GPL-3.0+ Summary: A program to cut SVG with CC220-20 and Silhouette SD/Cameo Autoreqprov: on # http://custom.ultramini.net/robocut-compatible-with-silhouette-cameo/ URL: https://github.com/nosliwneb/robocut Source0: robocut-%{version}_1c019e7fad.zip Source1: opensuse_chameleon_silhouette_x6.svg BuildRoot:%{_tmppath}/%{name}-%{version}-build BuildRequires: libqt4-devel libusb-1_0-devel unzip # sudo apt-get install libqt4-dev libusb-1.0-0-dev git-core %description Robocut is a simple graphical program to allow you to cut graphics with a Graphtec Craft Robo 2 Vinyl Cutter model CC220-20 and Sihouette SD, among other devices. It can read SVG files produced by Inkscape, but it should also work with other SVG files. Unlike the official programs, Robocut can run on Linux and probably Mac OS X. Inside the “examples” folder there is also a registration marks template fully functional (yes, the Silhouette Cameo is able to recognize registration marks also under Robocut, just put the page with the arrow pointing toward the plotter and align the sheet with the top left corner of the cutting mat). Authors Tim Hutt, Markus Schulz %prep %setup -n %{name}-master # opensuse_chameleon_silhouette_x6.svg cp %{SOURCE1} . %build qmake make %install install -D robocut $RPM_BUILD_ROOT/usr/bin/robocut install -m 0644 -D images/robocut.xpm $RPM_BUILD_ROOT/usr/share/pixmaps/robocut.xpm install -d $RPM_BUILD_ROOT/usr/share/robocut/examples install -m 0644 *.svg examples/* $RPM_BUILD_ROOT/usr/share/robocut/examples install -m 0644 -D manfile.txt $RPM_BUILD_ROOT/usr/share/man/man1/robocut.1 # cleanup %files %defattr(-,root,root) %doc readme.txt changelog %_bindir/* %_datadir/pixmaps/* %dir %_datadir/robocut %_datadir/robocut/* %_mandir/man1/* %clean rm -rf $RPM_BUILD_ROOT %changelog robocut1.0.11/MainWindow.cpp0000644000175000017500000002705213156345750015357 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "MainWindow.h" #include "ui_MainWindow.h" #include "PathPaintPage.h" #include "Plotter.h" #include "ProgramOptions.h" #include "CuttingDialog.h" #include "PathSorter.h" #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const double InitialZoom = 2.0; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); scene = new QGraphicsScene(this); ui->graphicsView->setScene(scene); ui->graphicsView->scale(InitialZoom, InitialZoom); ui->graphicsView->viewport()->installEventFilter(this); cutDialog = NULL; animationTimer = new QTimer(this); connect(animationTimer, SIGNAL(timeout()), SLOT(animate())); cutMarker = NULL; // Alternative zoom shortcuts QShortcut* zoom_in = new QShortcut(QKeySequence("X"), this); connect(zoom_in, SIGNAL(activated()), SLOT(on_actionZoom_In_triggered())); QShortcut* zoom_out = new QShortcut(QKeySequence("Z"), this); connect(zoom_out, SIGNAL(activated()), SLOT(on_actionZoom_Out_triggered())); //default options if not specified on command line this->show(); filename = ProgramOptions::Instance().getFileName(); if(QFile::exists(filename)) loadFile(); if(ProgramOptions::Instance().getStartCut() == true) on_actionCut_triggered(); sortFlag = ProgramOptions::Instance().getSortPath(); cout << ProgramOptions::Instance().getVersion().toStdString() << endl; } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_actionOpen_triggered() { if (lastOpenDir.isEmpty()) lastOpenDir = QDir::homePath(); filename = QFileDialog::getOpenFileName(this, tr("Open File"), lastOpenDir, tr("SVG Files (*.svg)")); if (filename.isEmpty()) return; lastOpenDir = QFileInfo(filename).absoluteDir().path(); loadFile(); } void MainWindow::on_actionReload_triggered() { if(QFile::exists(filename)) loadFile(); else qDebug() << "Reload failed. File missing: " << filename; } void MainWindow::on_actionIdentify_triggered() { // CAUTION: only call this when not cutting! struct cutter_id *id = Identify(); cout << "Identify:"; if (id->usb_product_id) { cout << " usb=" << id->usb_vendor_id << "/" << id->usb_product_id; } cout << " " << id->msg << endl; } void MainWindow::loadFile() { if (filename.isEmpty()) return; qDebug() << "Reading file: " << filename; QSvgRenderer rend; if (!rend.load(filename)) { QMessageBox::critical(this, "Error loading file.", "Couldn't open the file for reading."); qDebug() << "Error loading svg."; return; } qDebug() << "SVG default size: " << rend.defaultSize() << endl; qDebug() << "SVG view box: " << rend.viewBoxF() << endl; // Geqt size from SVG. TODO: Sanity check. // Also TODO: This won't handle offset viewboxes... need to get the offset and subtract it from // all the objects. mediaSize = rend.viewBoxF().size() * 25.4 / 90.0; double ppm = 90.0/25.4; // Pixels per mm. qDebug() << "Page size (mm): " << mediaSize << endl; PathPaintDevice pg(mediaSize.width(), mediaSize.height(), ppm); QPainter p(&pg); rend.render(&p); PathSorter pathsort(pg.paths(), mediaSize.height()); paths = pathsort.UnSort(); //paths = pathsort.Sort(); //paths = pathsort.TspSort(); //paths = pathsort.GroupTSP(); if(!ProgramOptions::Instance().getSortPath() == true)paths = pathsort.BestSort(); if(ProgramOptions::Instance().getTspSortPath() == true)paths = pathsort.BbSort(paths); scene->clear(); scene->setBackgroundBrush(QBrush(Qt::lightGray)); // The page. scene->addRect(0.0, 0.0, mediaSize.width(), mediaSize.height(), QPen(), QBrush(Qt::white)); QPen pen; pen.setWidthF(0.0); for (int i = 0, ii = 50, iii=0; i < paths.size(); ++i,ii+=10) { switch (iii) { case 0: pen.setColor(QColor(ii, ii, ii)); break; case 1: pen.setColor(QColor(ii, 0, 0)); break; case 2: pen.setColor(QColor(0, ii, 0)); break; case 3: pen.setColor(QColor(0, 0, ii)); break; case 4: pen.setColor(QColor(ii, ii, 0)); break; case 5: pen.setColor(QColor(ii, 0, ii)); break; case 6: pen.setColor(QColor(0, ii, ii)); break; } QPainterPath path; path.addPolygon(paths[i]); scene->addPath(path, pen); if(ii >= 200) { ii = 50; iii++; if(iii >=7)iii=0; } } // Handle the animation. I.e. stop it. // The old one was deleted when we cleared the scene. cutMarker = scene->addEllipse(-1.0, -1.0, 2.0, 2.0, QPen(Qt::black), QBrush(Qt::red)); cutMarker->hide(); ui->actionAnimate->setChecked(false); // Reset the viewport. on_actionReset_triggered(); // Redraw. Probably not necessary. update(); if (pg.clipped()) QMessageBox::warning(this, "Paths clipped", "BIG FAT WARNING!

Some paths lay outside the 210×297 mm A4 area. These have been squeezed back onto the page in a most ugly fashion, so cutting will almost certainly not do what you want."); // Change window title and enable menu items. setFileLoaded(filename); } void MainWindow::on_actionAbout_triggered() { QString message = "" + ProgramOptions::Instance().getVersion() + "

By Tim Hutt, © 2010
" + "
Parts of the source by Markus Schulz, © 2010
" + "
This software allows you to read a vector image in SVG format, " + "and send it to a Graphtec Craft Robo 2/3 " + " or Silhouette Cameo " + " (or similar device) for cutting. It is designed to work with SVGs produced " + "by the excellent free vector graphics editor Inkscape. " + " It may work with other software but this has not been tested.
" + "
See the website for more information."; QMessageBox::information(this, "About", message); } void MainWindow::on_actionExit_triggered() { close(); } void MainWindow::on_actionCut_triggered() { if (!cutDialog) cutDialog = new CutDialog(this); if (cutDialog->exec() != QDialog::Accepted) return; // Create a new dialog and run the actual cutting in a different thread. CuttingDialog* cuttingDlg = new CuttingDialog(this); CutParams params; params.cuts = paths; params.mediawidth = mediaSize.width(); params.mediaheight = mediaSize.height(); params.media = cutDialog->media(); params.pressure = cutDialog->pressure(); params.regwidth = cutDialog->regWidth(); params.regheight = cutDialog->regHeight(); params.regmark = cutDialog->regMark(); params.regsearch = cutDialog->regSearch(); params.speed = cutDialog->speed(); params.trackenhancing = cutDialog->trackEnhancing(); cuttingDlg->startCut(params); cuttingDlg->show(); } void MainWindow::on_actionManual_triggered() { QMessageBox::information(this, "Manual", "An online manual is available at

http://robocut.org/"); } void MainWindow::on_actionAnimate_toggled(bool animate) { if (animate) { animationTimer->start(30); if (cutMarker) { cutMarker->setPos(0, 0); cutMarker->show(); } cutMarkerPath = 0; cutMarkerLine = 0; cutMarkerDistance = 0.0; } else { animationTimer->stop(); if (cutMarker) cutMarker->hide(); } } void MainWindow::on_actionReset_triggered() { ui->graphicsView->resetTransform(); ui->graphicsView->scale(InitialZoom, InitialZoom); } void MainWindow::on_actionZoom_In_triggered() { ui->graphicsView->scale(1.2, 1.2); } void MainWindow::on_actionZoom_Out_triggered() { ui->graphicsView->scale(1.0/1.2, 1.0/1.2); } void MainWindow::animate() { if (!cutMarker) return; // Make sure the current position is sane. if (cutMarkerPath >= paths.size() || cutMarkerLine >= paths[cutMarkerPath].size()) { // If not, reset it. cutMarkerPath = 0; cutMarkerLine = 0; cutMarkerDistance = 0.0; return; } // Get the ends of the segment/edge we are currently on. QPointF a = paths[cutMarkerPath][cutMarkerLine]; QPointF b; if (cutMarkerLine == paths[cutMarkerPath].size()-1) { // We are moving between paths, and not cutting. b = paths[(cutMarkerPath+1) % paths.size()][0]; cutMarker->setOpacity(0.2); } else { // We are cutting on a path. b = paths[cutMarkerPath][cutMarkerLine+1]; cutMarker->setOpacity(1.0); } QPointF r = b-a; double h = hypot(r.x(), r.y()); if (h > 0.0) r /= h; // The current position of the marker. QPointF p = a + r * cutMarkerDistance; cutMarker->setPos(p); // Advance the position of the marker for the next time this function is called. cutMarkerDistance += 2.0; if (cutMarkerDistance > h) { cutMarkerDistance = 0.0; if (++cutMarkerLine >= paths[cutMarkerPath].size()) { cutMarkerLine = 0; if (++cutMarkerPath >= paths.size()) { cutMarkerPath = 0; // Also stop the animation... ui->actionAnimate->setChecked(false); } } } } void MainWindow::setFileLoaded(QString filename) { bool e = !filename.isEmpty(); if (e) setWindowTitle("Robocut - " + filename); else setWindowTitle("Robocut"); ui->actionAnimate->setEnabled(e); ui->actionReset->setEnabled(e); ui->actionZoom_In->setEnabled(e); ui->actionZoom_Out->setEnabled(e); ui->actionCut->setEnabled(e); ui->actionReload->setEnabled(e); } bool MainWindow::eventFilter(QObject *o, QEvent *e) { if (o == ui->graphicsView->viewport()) { if (e->type() == QEvent::Wheel) { // Anchor under the mouse pointer when using the mouse wheel. // This doesn't quite work as nicely as I'd like because it clamps the scrolling // precisely to the scene boundary. It's a bit hard to zoom to corners. Oh well. ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse); QWheelEvent *w = dynamic_cast(e); if (w->delta() <= 0) on_actionZoom_Out_triggered(); else on_actionZoom_In_triggered(); // Anchor in view centre for keyboard shortcuts. ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorViewCenter); return true; } } return false; } robocut1.0.11/Plotter.cpp0000644000175000017500000004136213156345750014734 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "Plotter.h" #include "ProgramOptions.h" #include int VENDOR_ID = ProgramOptions::Instance().getVendorUSB_ID(); int PRODUCT_ID = ProgramOptions::Instance().getProductUSB_ID(); #include #include string UsbError(int e) { switch (e) { case LIBUSB_SUCCESS: return "Success (internal error)"; case LIBUSB_ERROR_IO: return "I/O error"; case LIBUSB_ERROR_INVALID_PARAM: return "Invalid parameter"; case LIBUSB_ERROR_ACCESS: return "Access denied"; case LIBUSB_ERROR_NO_DEVICE: return "No device"; case LIBUSB_ERROR_NOT_FOUND: return "Entity not found"; case LIBUSB_ERROR_BUSY: return "Resource busy"; case LIBUSB_ERROR_TIMEOUT: return "Timeout"; case LIBUSB_ERROR_OVERFLOW: return "Overflow"; case LIBUSB_ERROR_PIPE: return "Pipe error"; case LIBUSB_ERROR_INTERRUPTED: return "Syscall interrupted"; case LIBUSB_ERROR_NO_MEM: return "Insufficient memory"; case LIBUSB_ERROR_NOT_SUPPORTED: return "Operation not supported"; case LIBUSB_ERROR_OTHER: return "Other error"; } return "Unknown error"; } // Send some data to the USB device. Error UsbSend(libusb_device_handle* handle, const string& s, int timeout = 0) { // Send in 4096 byte chunks. Not sure where I got this from, I'm not sure it is actually necessary. for (unsigned int i = 0; i < s.length(); i += 4096) { string data = s.substr(i, 4096); int transferred; unsigned char endpoint = '\x01'; int ret = libusb_bulk_transfer(handle, endpoint, reinterpret_cast(const_cast(data.c_str())), data.length(), &transferred, timeout); if (ret != 0) { cerr << "Error writing to device: " << UsbError(ret) << endl; return Error("Error writing to device: " + UsbError(ret)); } if ((unsigned int)transferred != data.length()) { cerr << "Warning, some data not transferred correctly." << endl; return Error("Some data not transferred. Attempted: " + ItoS(data.length()) + " Transferred: " + ItoS(transferred)); } } return Success; } // Receive some data up to the maximum packet size of 64. Because we use the packet size // there can never be overflows, and 64 is ok because none of the craft robo responses are // anywhere near that long. Error UsbReceive(libusb_device_handle* handle, string& s, int timeout = 0) { s.clear(); // A buffer that is one packet long. const int PacketSize = 64; unsigned char buffer[PacketSize]; int transferred = 0; unsigned char endpoint = '\x82'; int ret = libusb_bulk_transfer(handle, endpoint, buffer, PacketSize, &transferred, timeout); if (ret != 0) // But it could be a timout. { cerr << "Error reading from device: " << UsbError(ret) << endl; return Error("Error reading from device: " + UsbError(ret)); } s = string(reinterpret_cast(buffer), transferred); return Success; } // Send a control message //Error UsbControl(libusb_device_handle* handle, ...) //{ // libusb_control_transfer(handle, // uint8_t request_type, uint8_t request, uint16_t value, uint16_t index, // unsigned char *data, uint16_t length, unsigned int timeout); //} libusb_device_handle *UsbOpen(struct cutter_id *id) { libusb_device** list; ssize_t cnt = libusb_get_device_list(NULL, &list); if (cnt < 1) { id->msg = Error("Couldn't get usb device list."); return NULL; } int err = 0; libusb_device* found = NULL; for (ssize_t i = 0; i < cnt; ++i) { libusb_device* device = list[i]; libusb_device_descriptor desc; libusb_get_device_descriptor(device, &desc); // I don't want to be more specific than this really. if ((desc.idVendor == VENDOR_ID || desc.idVendor == VENDOR_ID_GRAPHTEC) && (desc.idProduct == PRODUCT_ID || desc.idProduct == PRODUCT_ID_CC200_20 || desc.idProduct == PRODUCT_ID_CC300_20 || desc.idProduct == PRODUCT_ID_SILHOUETTE_SD_1 || desc.idProduct == PRODUCT_ID_SILHOUETTE_SD_2 || desc.idProduct == PRODUCT_ID_SILHOUETTE_CAMEO || desc.idProduct == PRODUCT_ID_SILHOUETTE_PORTRAIT ) ) { // Just use the first one. Who has two?! found = device; id->usb_product_id = desc.idProduct; id->usb_vendor_id = desc.idVendor; break; } } if (!found) { libusb_free_device_list(list, 1); id->msg = Error("Couldn't find Craft Robo 2 (USB device with Vendor ID with USB VendorID 0b4d and ProductID 110a). Is it connected to the system and powered on?"); return NULL; } libusb_device_handle* handle; err = libusb_open(found, &handle); if (err != 0) { libusb_free_device_list(list, 1); id->msg = Error("Error accessing Craft Robo 2: " + UsbError(err) + ". Do you have permission (on Linux make sure you are in the group 'lp')."); return NULL; } libusb_free_device_list(list, 1); id->msg = "Ready"; return handle; } // caller can use UsbSend() afterwards, and should // finally do libusb_release_interface(handle, 0); libusb_close(handle); libusb_device_handle *UsbInit(struct cutter_id *id) { // Now do stuff with the handle. int r = 0; libusb_device_handle* handle = UsbOpen(id); if (!handle) return NULL; if (libusb_kernel_driver_active(handle, 0) == 1) { r = libusb_detach_kernel_driver(handle, 0); if (r != 0) { libusb_close(handle); id->msg = Error("Error detaching kernel USB driver: " + UsbError(r)); return NULL; } } r = libusb_reset_device(handle); if (r != 0) { libusb_close(handle); id->msg = Error("Error resetting device: " + UsbError(r)); return NULL; } cout << "Selecting configuration." << endl; r = libusb_set_configuration(handle, 1); if (r < 0) { libusb_close(handle); id->msg = Error("Error setting USB configuration: " + UsbError(r)); return NULL; } cout << "Claiming main control interface." << endl; r = libusb_claim_interface(handle, 0); if (r < 0) { libusb_close(handle); id->msg = Error("Error claiming USB interface: " + UsbError(r)); return NULL; } cout << "Setting alt interface." << endl; r = libusb_set_interface_alt_setting(handle, 0, 0); // Probably not really necessary. if (r < 0) { libusb_close(handle); id->msg = Error("Error setting alternate USB interface: " + UsbError(r)); return NULL; } cout << "Initialisation successful." << endl; return handle; } struct cutter_id *Identify() { static struct cutter_id id = { "?", 0, 0 }; libusb_device_handle *handle; if (1) { handle = UsbOpen(&id); if (handle) libusb_close(handle); else id.msg = "no device found"; } else { id.msg = Error("Cannot Identify while cut thread is running"); } return &id; } QList Transform_Silhouette_Cameo(QList cuts, double *mediawidth, double *mediaheight) { const double devicewidth = 300; // cameo is 12inch aka 300mm wide double w; double h = *mediaheight; cout << "Transform_Silhouette_Cameo " << *mediawidth << "," << *mediaheight << endl; if (0) { w = *mediawidth; cout << "Paper right aligned" << endl; } else { w = devicewidth; // adjust the used media area, so that the hardware does not clip. *mediawidth = devicewidth; cout << "Paper left aligned" << endl; } // flip it around 180 deg, and go backwards through the path list. QList paths; for (int i = cuts.size()-1; i >= 0; i--) { QPolygonF poly; for (int j = 0; j < cuts[i].size(); j++) { // QPolygonF is a QList double x = cuts[i][j].x(); double y = cuts[i][j].y(); poly << QPointF(w-x, h-y); } paths << poly; } return paths; } Error Cut(CutParams p) { VENDOR_ID = ProgramOptions::Instance().getVendorUSB_ID(); PRODUCT_ID = ProgramOptions::Instance().getProductUSB_ID(); cout << "Cutting... VENDOR_ID : " << VENDOR_ID << " PRODUCT_ID: " << PRODUCT_ID << " mediawidth: " << p.mediawidth << " mediaheight: " << p.mediaheight << "media: " << p.media << " speed: " << p.speed << " pressure: " << p.pressure << " trackenhancing: " << p.trackenhancing << " regmark: " << p.regmark << " regsearch:" << p.regsearch <<" regwidth:" << p.regwidth << " reglength: " << p.regheight << endl; if (p.media < 100 || p.media > 300) p.media = 300; if (p.speed < 1) p.speed = 1; if (p.speed > 10) p.speed = 10; if (p.pressure < 1) p.pressure = 1; if (p.pressure > 33) p.pressure = 33; // how can VENDOR_ID / PRODUCT_ID report the correct values abve??? struct cutter_id id = { "?", 0, 0 }; libusb_device_handle* handle = UsbInit(&id); if (id.usb_vendor_id == VENDOR_ID_GRAPHTEC && id.usb_product_id == PRODUCT_ID_SILHOUETTE_CAMEO) { // should this also transform the regwidth regheigth or not? p.cuts = Transform_Silhouette_Cameo(p.cuts, &p.mediawidth, &p.mediaheight); } // TODO: Use exceptions. Error e = Success; string resp; // Initialise plotter. e = UsbSend(handle, "\x1b\x04"); if (!e) goto error; // Status request. e = UsbSend(handle, "\x1b\x05"); if (!e) goto error; e = UsbReceive(handle, resp, 5000); if (!e) goto error; if (resp != "0\x03") // 0 = Ready. 1 = Moving. 2 = Nothing loaded. " " = ?? { if (resp == "1\x03") e = Error("Moving, please try again."); else if (resp == "2\x03") e = Error("Empty tray, please load media."); // Silhouette Cameo else e = Error("Invalid response from plotter: " + resp); goto error; } // Home the cutter. e = UsbSend(handle, "TT\x03"); if (!e) goto error; // Query version. e = UsbSend(handle, "FG\x03"); if (!e) goto error; // Receive the firmware version. e = UsbReceive(handle, resp, 10000); // Large timeout because the plotter moves. if (!e) goto error; // Don't really care about this. // if (resp.length() != 10) // { // e = Error("Version error: " + version); // goto error; // } e = UsbSend(handle, "FW" + ItoS(p.media) + "\x03"); if (!e) goto error; e = UsbSend(handle, "!" + ItoS(p.speed) + "\x03"); if (!e) goto error; e = UsbSend(handle, "FX" + ItoS(p.pressure) + "\x03"); if (!e) goto error; // I think this sets the distance from the position of the plotter // head to the actual cutting point, maybe in 0.1 mms (todo: Measure blade). // It is 0 for the pen, 18 for cutting. // C possible stands for curvature. Not that any of the other letters make sense... e = UsbSend(handle, "FC" + ItoS(p.media == 113 ? 0 : 18) + "\x03"); if (!e) goto error; e = UsbSend(handle, "FY" + ItoS(p.trackenhancing ? 0 : 1) + "\x03"); if (!e) goto error; // Set to portrait. FN1 does landscape but it's easier just to rotate the image. e = UsbSend(handle, "FN0\x03"); if (!e) goto error; e = UsbSend(handle, "FE0\x03"); // No idea what this does. if (!e) goto error; e = UsbSend(handle, "TB71\x03"); // Again, no idea. Maybe something to do with registration marks? if (!e) goto error; e = UsbReceive(handle, resp, 10000); // Allow 10s. Seems reasonable. if (!e) goto error; if (resp != " 0, 0\x03") { e = Error("Invalid response from plotter."); goto error; } // Begin page definition. e = UsbSend(handle, "FA\x03"); if (!e) goto error; // Block for all the "jump to error crosses initialization" errors. Really need to use exceptions! { // Page size: height,width in 20ths of a mm minus a margin. This is for A4. TODO: Find maximum and use that. stringstream page; int width = lroundl(p.mediawidth * 20.0); int height = lroundl(p.mediaheight * 20.0); int margintop = ProgramOptions::Instance().getMarginTop(); int marginright = ProgramOptions::Instance().getMarginRight(); e = UsbSend(handle, "FU" + ItoS(height - margintop) + "," + ItoS(width - marginright) + "\x03"); if (!e) goto error; e = UsbSend(handle, "FM1\x03"); // ? if (!e) goto error; if (p.regmark) { stringstream regmarkstr; regmarkstr.precision(0); string searchregchar = "23,"; int regw = lroundl(p.regwidth * 20.0); int regl = lroundl(p.regheight * 20.0); e = UsbSend(handle, "TB50,381\x03"); //only with registration (it was TB50,1) ??? if (!e) goto error; if (p.regsearch) searchregchar ="123,"; regmarkstr << "TB99\x03TB55,1\x03TB" + searchregchar + ItoS(regw) + "," + ItoS(regl) + "\x03"; cout << "Registration mark string: " << regmarkstr.str() << endl; e = UsbSend(handle, regmarkstr.str()); //registration mark test /1-2: 180.0mm / 1-3: 230.0mm (origin 15mmx20mm) if (!e) goto error; e = UsbSend(handle, "FQ5\x03"); // only with registration ??? if (!e) goto error; e = UsbReceive(handle, resp, 40000); // Allow 20s for reply... if (!e) goto error; if (resp != " 0, 0\x03") { cout << resp << endl; e = Error("Couldn't find registration marks."); goto error; } // Looks like if the reg marks work it gets 3 messages back (if it fails it times out because it only gets the first message) e = UsbReceive(handle, resp, 40000); // Allow 20s for reply... if (!e) goto error; if (resp != " 0\x03") { cout << resp << endl; e = Error("Couldn't find registration marks."); goto error; } e = UsbReceive(handle, resp, 40000); // Allow 20s for reply... if (!e) goto error; if (resp != " 1\x03") { cout << resp << endl; e = Error("Couldn't find registration marks."); goto error; } } else { e = UsbSend(handle, "TB50,1\x03"); // ??? if (!e) goto error; } if (!e) goto error; // I think this is the feed command. Sometimes it is 5588 - maybe a maximum? e = UsbSend(handle, "FO" + ItoS(height - margintop) + "\x03"); if (!e) goto error; page.flags(ios::fixed); page.precision(0); page << "&100,100,100,\\0,0,Z" << ItoS(width) << "," << ItoS(height) << ",L0"; for (int i = 0; i < p.cuts.size(); ++i) { if (p.cuts[i].size() < 2) continue; double x = p.cuts[i][0].x()*20.0; double y = p.cuts[i][0].y()*20.0; double xorigin = ProgramOptions::Instance().getRegOriginWidthMM(); double yorigin = ProgramOptions::Instance().getRegOriginHeightMM(); if (p.regmark) { x = x - (xorigin*20.0); y = y + (yorigin*20.0); } // TODO: Also do this in the UI and warn the user about it. if (x < 0.0) x = 0.0; if (x > width) x = width; if (y < 0.0) y = 0.0; if (y > height) y = height; page << ",M" << x << "," << height-y; for (int j = 1; j < p.cuts[i].size(); ++j) { x = p.cuts[i][j].x()*20.0; y = p.cuts[i][j].y()*20.0; if (p.regmark) { x = x - (xorigin*20.0); y = y + (yorigin*20.0); } bool draw = true; if (x <= 0.0) { x = 0.0; draw = false; } if (x >= width) { x = width; draw = false; } if (y <= 0.0) { y = 0.0; draw = false; } if (y >= height) { y = height; draw = false; } if (draw) page << ",D" << x << "," << height-y; else page << ",M" << x << "," << height-y; // if outside the range just move } } page << "&1,1,1,TB50,0\x03"; // TB maybe .. ah I dunno. Need to experiment. No idea what &1,1,1 does either. // cout << page.str() << endl; e = UsbSend(handle, page.str()); if (!e) goto error; } // Feed the page out. e = UsbSend(handle, "FO0\x03"); if (!e) goto error; // Halt? e = UsbSend(handle, "H,"); if (!e) goto error; // Don't really care about the results of these! libusb_release_interface(handle, 0); libusb_close(handle); return Success; error: // Hey, this is basically C and I can't be bothered to properly C++-ify it. TODO: Use exceptions. cout << "Error: " << e << endl; libusb_release_interface(handle, 0); libusb_close(handle); return e; } robocut1.0.11/CuttingDialog.cpp0000644000175000017500000000652013156345750016035 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "CuttingDialog.h" #include "ui_CuttingDialog.h" #include #include #include #include CuttingDialog::CuttingDialog(QWidget *parent) : QDialog(parent), ui(new Ui::CuttingDialog) { ui->setupUi(this); thread = NULL; } CuttingDialog::~CuttingDialog() { delete ui; if (thread) { thread->exit(); thread->wait(1000); } } void CuttingDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void CuttingDialog::startCut(const CutParams& params) { if (thread) { qDebug() << "Internal error: startCut() called twice."; return; } thread = new CuttingThread(this); connect(thread, SIGNAL(success()), SLOT(onSuccess())); connect(thread, SIGNAL(error(QString)), SLOT(onError(QString))); thread->setParams(params); thread->start(); } void CuttingDialog::onSuccess() { ui->status->setText("Finished"); ui->buttonBox->button(QDialogButtonBox::Cancel)->setText("Close"); thread->exit(); thread->wait(1000); delete thread; thread = NULL; } void CuttingDialog::onError(QString message) { ui->status->setText("Error: " + message); ui->buttonBox->button(QDialogButtonBox::Cancel)->setText("Close"); thread->exit(); thread->wait(1000); delete thread; thread = NULL; } void CuttingDialog::closeEvent(QCloseEvent* e) { if (thread) { if (QMessageBox::question(this, "Kill cutting process?", "Are you sure you wish to stop the cutting process? " "This may result in bad stuff. It might be better just to turn the plotter off and on again.", QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) { e->ignore(); return; } thread->terminate(); thread->wait(5000); delete thread; thread = NULL; } return QDialog::closeEvent(e); } robocut1.0.11/readme.txt0000644000175000017500000000175313156345750014575 0ustar markusmarkusROBOCUT ^^^^^^^ Robocut is a simple graphical program to allow you to cut graphics with a Graphtec Craft Robo 2 Vinyl Cutter model CC220-20 and Sihouette SD. It can read SVG files produced by Inkscape, but it should also work with other SVG files. Unlike the official programs, Robocut can run on Linux and probably Mac OS X with a tiny bit of work. It may work with the newer CC330-20 model if the USB IDs are changed, but I don’t have one to test with. AUTHORS ^^^^^^^ Tim Hutt, Markus Schulz INSTALLATION ^^^^^^^^^^^^ See install.txt INSTRUCTIONS ^^^^^^^^^^^^ Basic instructions are: 1. Create a new A4 portrait drawing in Inkscape. (For the registration mark feature you can use the supplied public domain letter_reg-marks.svg file) 2. Make sure in the options, the default export DPI is 90.0 3. Paste your stuff into the drawing. 4. Export as Plain SVG. 5. Open the SVG with Robocut. 6. Make sure it will cut correctly with the View->Animate option. 7. File->Cut. ---------- 31/10/2010 robocut1.0.11/PathSorter.h0000644000175000017500000000521613156345750015041 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #pragma once #include class PathSorter { public: PathSorter( ); PathSorter(const QList inpaths, qreal mediaheight); virtual ~PathSorter( ); void getQList (const QList inpaths); QList Sort (const QList inpaths); QList Sort () {return Sort(pathToSort);} QList UnSort (const QList inpaths); QList UnSort () {return UnSort(pathToSort);} QList BestSort (const QList inpaths); QList BestSort () {return BestSort(pathToSort);} QList GroupTSP(const QList inpaths1, int groups = 3); QList GroupTSP(int groups = 3) {return GroupTSP(pathToSort, groups);} QList BbSort (const QList inpaths); QList BbSort () {return BbSort(pathToSort);} void setMediaHeight(qreal mediaheight); private: QList pathToSort; qreal mediaHeight; protected: private: QList MyFakeTSP(const QList inpaths); qreal getDistance(const QPolygonF &p1, const QPolygonF &p2); qreal getTotalDistance(const QList inpaths, int maxdepth = 0); static bool MyLessThan(const QPolygonF &p1, const QPolygonF &p2); }; robocut1.0.11/Readme.md0000644000175000017500000001344613156345750014320 0ustar markusmarkus# Robocut Robocut is a simple graphical program to allow you to cut graphics with a Graphtec Craft Robo 2 Vinyl Cutter model CC220-20 and Sihouette SD. It also works with several other Silhouette vinyl cutters. It can read SVG files produced by Inkscape, but it should also work with other SVG files. Unlike the official programs, Robocut can run on Linux and probably Mac OS X. ## Authors At least: Tim Hutt, Markus Schulz, Juergen Weigert. ## Installation Instructions ### Windows Download the latest Windows binary release, and also [Zadig](http://zadig.akeo.ie/), which is the easiest way to install a libusb-compatible driver for your cutter. Run Zadig, and use it to install a driver for your device. You may need to check `Options->List all devices`. Any of the three driver options *should* work, but WinUSB definitely does so I'd go with that. Once that is complete you should just be able to run `Robocut.exe`. ### OSX This is the easiest option - unzip the application and copy it to your Applications directory. Run it. If you are given a security warning about it being from an unidentified developer, go into your System Setting, then Security, then it should say something about Robocut with an `Open Anyway` button. Click it. ### Linux On Ubuntu you can simply sudo apt-get install robocut If you wish to build from source, first install the dependencies - Qt5 and libusb-1.0. Then unzip the source and run qmake make To install the binary system-wide just do sudo cp Robocut /usr/local/bin Finally *remember to make sure you are in the lp group*: adduser lp You will probably have to log out and log in again after that. ## Usage Instructions Basic instructions are: 1. Create a new A4 portrait drawing in Inkscape. (For the registration mark feature you can use the supplied public domain letter_reg-marks.svg file) 2. Make sure in the options, the default export DPI is 90.0 3. Paste your stuff into the drawing. 4. Export as Plain SVG. 5. Open the SVG with Robocut. 6. Make sure it will cut correctly with the View->Animate option. 7. File->Cut. ## Troubleshooting * It doesn't cut my fonts correctly?! Qt SVG only supports the SVG 1.2 Tiny standard and this has a limited SVG support. For example multiline text is something that is not supported by Robocut, however you can export your text to a path or just create each line separate. The best option is to change them to paths (in Inkscape it is `Object->Convert to paths`), before exporting the SVG. * The cutter stops mid-cut. I'm not sure why this is. * The whole program crashes. This is possibly because you opened and SVG containing raster data. It shouldn't happen but it hasn't been fixed yet. * It says it can't find the cutter. Make sure the WinUSB driver is installed with Zadig on Windows. On Linux make sure you are in the `lp` group. ## Changelog Master ... 1.0.11 * Windows and OSX binaries released for first time * Add in-tree libusb for Windows. Not the best practice but it is only two files. * Added Transform_Silhouette_Cameo() to rotate the plot as SVG onscreen. Allow left aligned paper. Cameo has high x-coordinates to the left, although the head homes at the left side. * Added File->Reload (CTRL-L), this saves a lot of clicking and scrolling through the file dialogue while adjusting the design. * Added View->Identify to print the devices seen to stdout. This option is temporarily hidden in the menu (via the .ui file) until it does something user-visible. * Refactored UsbOpen() / UsbInit() from Plotter.cpp:Cut(). * Added to about message and tooltip. Removed debug page dump on stdout; * robocut.spec added, as used in https://build.opensuse.org/package/show?package=robocut&project=home:jnweiger * Move all information to Readme.md rather than spreading it out over multiple files. * Maybe very slightly better icon? It's still pretty rubbish! Contributions welcome! * Change links to point to http://robocut.org/ * Code style fixes * Mouse zoom is the "standard" way now. * Mouse zooms to the cursor. 1.0.10 * Fixed missing image files. 1.0.9 * Add USB ID 111A for CC300-20 Craft Robo Lite as another default. 1.0.8 * changes in Robocut.pro for qmake so no QT files are shipped (Debian requirement) 1.0.7 * Add USB ID 111C as another default. 1.0.6 * Tim fixed drawing bug * changed from float to int for output to plotter, fixes crash of 2nd gen plotter model * changed display pen size to 0 * Tim fixed track enhancing option was inverted. 1.0.5 * adding all the changes needed for Debian * fixed watch file * make binary lower case * removed redundant copyright form the copyright file * recreated all the images so we have the copyright * added vcs information to control file * merged mentor in to master 1.0.4 * add .desktop file for Ubuntu * default needs to be 10 for pressure * get menu working * better sample reg file 1.0.3 * manpage * command line interface * mouse wheel zoom * change the draw command to move command if the cut is on the outer edge, kind of clipping (but not in preview) * dash pattern from path * sort the different paths to cut faster * bounding box option to cut inside path first (good for letters) * registration mark support 1.0.2 * Initial Release on Ubuntu. Master * Some brief documentation * Initial registration mark support * Load page size from file * Small UI improvements Version 0.2 - a3b13ad - Oct 24th 2010 * Initial working version. # Licence All code is GPL3 licensed. # TODO Silhouette Cameo - paint 24mm blocked area in the GUI at the bottom of the paper. - put the Identify() output in a GUI element (rather than stdout). - new sorting algorithm to limit backward movements to max 20mm, so that we can cut paper and cardboard without a mat in many cases. - debug this: when the paper was moved with the devices cursor keys, "cut" will just home the paper and not cut at all. robocut1.0.11/main.cpp0000644000175000017500000000452213156345750014224 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Tim Hutt * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include #include #include "MainWindow.h" #include "ProgramOptions.h" #include #include using namespace std; int main(int argc, char *argv[]) { // Version is defined in Robocut.pro ProgramOptions::Instance().setVersion(ROBOCUT_VERSION); // Initialise options from command line if specified. ProgramOptions::Instance().GetOpt(argc, argv); int err = libusb_init(nullptr); if (err != LIBUSB_SUCCESS) { QMessageBox::critical(nullptr, "Error initialising USB library.", libusb_error_name(err)); cerr << "Error initialising USB library: " << libusb_error_name(err) << endl; return 1; } int ret = 0; // Code block to ensure usb devices are closed. Maybe. { QApplication a(argc, argv); MainWindow w; ret = a.exec(); } libusb_exit(nullptr); return ret; } robocut1.0.11/PathSorter.cpp0000644000175000017500000001763013156345750015377 0ustar markusmarkus/*************************************************************************** * This file is part of Robocut. * * Copyright (C) 2010 Markus Schulz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "PathSorter.h" #include #include #include using namespace std; PathSorter::PathSorter ( ) {} PathSorter::PathSorter (const QList inpaths, qreal mediaheight ) { getQList(inpaths); mediaHeight = mediaheight; } PathSorter::~PathSorter ( ) { } void PathSorter::getQList (const QList inpaths) { pathToSort = QList(inpaths); } void PathSorter::setMediaHeight(qreal mediaheight) { mediaHeight = mediaheight; } QList PathSorter::UnSort (const QList inpaths) { QList outpaths = QList(inpaths); return outpaths; } bool PathSorter::MyLessThan(const QPolygonF &p1, const QPolygonF &p2) { qreal testx1 = p1[0].x(); qreal testx2 = p2[0].x(); qreal testy1 = p1[0].y(); qreal testy2 = p2[0].y(); if(testy1 == testy2) return testx1 > testx2; else return testy1 > testy2; } QList PathSorter::Sort (const QList inpaths) { QList outpaths = QList(inpaths); qSort(outpaths.begin(), outpaths.end(), MyLessThan); return outpaths; } QList PathSorter::BestSort (const QList inpaths) { qreal inpath = getTotalDistance(inpaths); qreal sortpath = inpath; qreal tsppath = inpath, temppath; qreal tsppath2 = inpath; cout<<"in path: "<< inpath << endl; QList outpathSort = Sort(QList(inpaths)); sortpath = getTotalDistance(outpathSort); cout<<"Sort outpath: "<< sortpath << endl; int bestpath=1; for (int i = 1; i < inpaths.size()/2; i++) { QList outpathTSP = GroupTSP(QList(inpaths),i); temppath = getTotalDistance(outpathTSP); //cout<<"xTSPSort outpaths: "<< temppath << " Groups " << i < outpathTSP = GroupTSP(QList(inpaths),bestpath); tsppath = getTotalDistance(outpathTSP); cout<<"TSPSort outpaths: "<< tsppath << " Groups " << bestpath < outpathTSP2 = GroupTSP(QList(outpathSort),i); temppath = getTotalDistance(outpathTSP2); //cout<<"xxTSPSort outpaths: "<< temppath << " Groups " << i < outpathTSP2 = GroupTSP(QList(outpathSort),bestpath2); tsppath2 = getTotalDistance(outpathTSP2); cout<<"TSPSort outpath sort: "<< tsppath2 << " Groups " << bestpath2 < PathSorter::BbSort (const QList inpaths) { QList outpaths = QList(inpaths); for (int i = 0; i < (outpaths.size()-1); i++) { for (int j = (i+1); j < outpaths.size(); j++) { if (outpaths[i].boundingRect().intersects(outpaths[j].boundingRect())) { if (outpaths[i].boundingRect().width() > outpaths[j].boundingRect().width() || outpaths[i].boundingRect().height() > outpaths[j].boundingRect().height()) { outpaths.swap(i,j); break; } } } } cout<<"BbSort outpaths: "<< getTotalDistance(outpaths) << endl; return outpaths; } QList PathSorter::GroupTSP(const QList inpaths, int groups) { if (groups > inpaths.size()) groups = (int)((double) inpaths.size()-((double)inpaths.size()*0.2)); if (groups < 1) groups = 1; QList > listlistpath; QList temppaths; int inps = inpaths.size(); int inpsparts = inps / groups; for (int i = 0; i < inps; i++) { if(i>=inpsparts) { listlistpath.append(temppaths); inpsparts += inps / groups; temppaths = QList() ; } temppaths.append(inpaths[i]); } listlistpath.append(temppaths); for (int i = 0; i < listlistpath.size(); i++) { listlistpath[i] = MyFakeTSP(listlistpath[i]); } QList outpaths; for (int i = 0; i < listlistpath.size(); i++) { for (int j = 0; j < listlistpath[i].size(); j++) { outpaths.append(listlistpath[i][j]); } } //cout<<"xTSPSort outpaths: "<< getTotalDistance(outpaths) << " Groups " << groups <= testx2) a = testx1 - testx2; else a = testx2 - testx1; if(testy1 >= testy2) b = testy1 - testy2; else b = testy2 - testy1; c = sqrt((double)(a*a+b*b)); return (qreal) c; } qreal PathSorter::getTotalDistance(const QList inpaths, int maxdepth) { if (maxdepth >= inpaths.size()-1) maxdepth = inpaths.size()-1; if (maxdepth <= 0) maxdepth = inpaths.size()-1; QPolygonF zero = QPolygonF(QRectF(0.0,mediaHeight,0.0,0.0)); // able to change the start point qreal dist = getDistance(zero,inpaths[0]); for (int i = 0; i < maxdepth; ++i) { dist = dist + getDistance(inpaths[i],inpaths[(i+1)]); } return dist; } QList PathSorter::MyFakeTSP(const QList inpaths) { QPolygonF zero = QPolygonF(QRectF(0.0,mediaHeight,0.0,0.0)); // able to change the start point QList outpaths = QList(inpaths); // find the shortest path for (int i = 0; i < (outpaths.size()-1); ++i) { if(i == 0) // find good start { qreal dist=10000.0; int bestindex=i; for (int j = (i+1); j < outpaths.size(); ++j) { if (getDistance(zero,outpaths[j]) < dist) { dist = getDistance(zero,outpaths[j]); bestindex = j; } } if (dist != 0) outpaths.swap(0,bestindex); } qreal dist=10000.0; int bestindex=i; for (int j = (i+1); j < outpaths.size(); ++j) { if (getDistance(outpaths[i],outpaths[j]) < dist) { dist = getDistance(outpaths[i],outpaths[j]); bestindex = j; } } if (dist != 0) outpaths.swap((i+1),bestindex); } return outpaths; }