/** * Loads the given pattern file into this pattern. * Entities other than lines are ignored. * * @param filename File name of the pattern file (without path and * extension or full path. */ bool RS_Pattern::loadPattern() { if (loaded) { return true; } RS_DEBUG->print("RS_Pattern::loadPattern"); QString path; // Search for the appropriate pattern if we have only the name of the pattern: if (!fileName.toLower().contains(".dxf")) { QStringList patterns = RS_SYSTEM->getPatternList(); QFileInfo file; for (QStringList::Iterator it = patterns.begin(); it!=patterns.end(); it++) { if (QFileInfo(*it).baseName().toLower()==fileName.toLower()) { path = *it; RS_DEBUG->print("Pattern found: %s", path.toLatin1().data()); break; } } } // We have the full path of the pattern: else { path = fileName; } // No pattern paths found: if (path.isEmpty()) { RS_DEBUG->print("No pattern \"%s\"available.", fileName.toLatin1().data()); return false; } RS_Graphic* gr = new RS_Graphic(); // TODO: Find out why the new dxf filter doesn't work for patterns: RS_FILEIO->fileImport(*gr, path, RS2::FormatDXF1); for (RS_Entity* e=gr->firstEntity(); e!=NULL; e=gr->nextEntity()) { if (e->rtti()==RS2::EntityLine || e->rtti()==RS2::EntityArc) { RS_Layer* l = e->getLayer(); RS_Entity* cl = e->clone(); cl->reparent(this); if (l!=NULL) { cl->setLayer(l->getName()); } addEntity(cl); } } delete gr; loaded = true; RS_DEBUG->print("RS_Pattern::loadPattern: OK"); return true; }
/** * @return Path to the thumbnail of the given DXF file. If no thumbnail exists, one is * created in the user's home. If no thumbnail can be created, an empty string is returned. */ QString QG_LibraryWidget::getPathToPixmap(const QString& dir, const QString& dxfFile, const QString& dxfPath) { // the thumbnail must be created in the user's home. #if QT_VERSION < 0x040400 QString iconCacheLocation = emu_qt44_storageLocationData() + QDir::separator() + "iconCache" + QDir::separator(); #elif QT_VERSION >= 0x050000 QString iconCacheLocation=QStandardPaths::writableLocation(QStandardPaths::DataLocation) + QDir::separator() + "iconCache" + QDir::separator(); #else QString iconCacheLocation=QDesktopServices::storageLocation(QDesktopServices::DataLocation) + QDir::separator() + "iconCache" + QDir::separator(); #endif RS_DEBUG->print("QG_LibraryWidget::getPathToPixmap: " "dir: '%s' dxfFile: '%s' dxfPath: '%s'", dir.toLatin1().data(), dxfFile.toLatin1().data(), dxfPath.toLatin1().data()); // List of all directories that contain part libraries: QStringList directoryList = RS_SYSTEM->getDirectoryList("library"); directoryList.prepend(iconCacheLocation); QStringList::Iterator it; QFileInfo fiDxf(dxfPath); QString itemDir; QString pngPath; // look in all possible system directories for PNG files // in the current library path: for (it=directoryList.begin(); it!=directoryList.end(); ++it) { itemDir = (*it)+dir; pngPath = itemDir + QDir::separator() + fiDxf.baseName() + ".png"; RS_DEBUG->print("QG_LibraryWidget::getPathToPixmap: checking: '%s'", pngPath.toLatin1().data()); QFileInfo fiPng(pngPath); // the thumbnail exists: if (fiPng.isFile()) { RS_DEBUG->print("QG_LibraryWidget::getPathToPixmap: dxf date: %s, png date: %s", fiDxf.lastModified().toString().toLatin1().data(), fiPng.lastModified().toString().toLatin1().data()); if (fiPng.lastModified() > fiDxf.lastModified()) { RS_DEBUG->print("QG_LibraryWidget::getPathToPixmap: thumbnail found: '%s'", pngPath.toLatin1().data()); return pngPath; } else { RS_DEBUG->print("QG_LibraryWidget::getPathToPixmap: thumbnail needs to be updated: '%s'", pngPath.toLatin1().data()); } } } // create all directories needed: RS_SYSTEM->createPaths(iconCacheLocation + dir); // QString foo=iconCacheLocation + dir + QDir::separator() + fiDxf.baseName() + ".png"; pngPath = iconCacheLocation + dir + QDir::separator() + fiDxf.baseName() + ".png"; QPixmap* buffer = new QPixmap(128,128); RS_PainterQt painter(buffer); painter.setBackground(RS_Color(255,255,255)); painter.eraseRect(0,0, 128,128); RS_StaticGraphicView gv(128,128, &painter); RS_Graphic graphic; if (graphic.open(dxfPath, RS2::FormatUnknown)) { gv.setContainer(&graphic); gv.zoomAuto(false); // gv.drawEntity(&graphic, true); for (RS_Entity* e=graphic.firstEntity(RS2::ResolveAll); e; e=graphic.nextEntity(RS2::ResolveAll)) { if (e->rtti() != RS2::EntityHatch){ RS_Pen pen = e->getPen(); pen.setColor(Qt::black); e->setPen(pen); } gv.drawEntity(&painter, e); } QImageWriter iio; QImage img; img = buffer->toImage(); img = img.scaled(64,64, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); // iio.setImage(img); iio.setFileName(pngPath); iio.setFormat("PNG"); if (!iio.write(img)) { pngPath = ""; RS_DEBUG->print(RS_Debug::D_ERROR, "QG_LibraryWidget::getPathToPixmap: Cannot write thumbnail: '%s'", pngPath.toLatin1().data()); } } else { RS_DEBUG->print(RS_Debug::D_ERROR, "QG_LibraryWidget::getPathToPixmap: Cannot open file: '%s'", dxfPath.toLatin1().data()); } // GraphicView deletes painter painter.end(); delete buffer; return pngPath; }