/** * Implementation of the method used for RS_Import to communicate * with this filter. * * @param g The graphic in which the entities from the file * will be created or the graphics from which the entities are * taken to be stored in a file. */ bool RS_FilterLFF::fileImport(RS_Graphic& g, const QString& file, RS2::FormatType /*type*/) { RS_DEBUG->print("LFF Filter: importing file '%s'...", file.toLatin1().data()); //this->graphic = &g; bool success = false; // Load font file as we normally do, but the font doesn't own the // letters (we'll add them to the graphic instead. Hence 'false'). RS_Font font(file, false); success = font.loadFont(); if (success==false) { RS_DEBUG->print(RS_Debug::D_WARNING, "Cannot open LFF file '%s'.", file.toLatin1().data()); return false; } g.addVariable("Names", font.getNames().join(","), 0); g.addVariable("LetterSpacing", font.getLetterSpacing(), 0); g.addVariable("WordSpacing", font.getWordSpacing(), 0); g.addVariable("LineSpacingFactor", font.getLineSpacingFactor(), 0); g.addVariable("Authors", font.getAuthors().join(","), 0); g.addVariable("License", font.getFileLicense(), 0); g.addVariable("Created", font.getFileCreate(), 0); if (!font.getEncoding().isEmpty()) { g.addVariable("Encoding", font.getEncoding(), 0); } font.generateAllFonts(); RS_BlockList* letterList = font.getLetterList(); for (uint i=0; i<font.countLetters(); ++i) { RS_Block* ch = font.letterAt(i); QString uCode; uCode.setNum(ch->getName().at(0).unicode(), 16); while (uCode.length()<4) { // uCode.rightJustified(4, '0'); uCode="0"+uCode; } //ch->setName("[" + uCode + "] " + ch->getName()); //letterList->rename(ch, QString("[%1]").arg(ch->getName())); letterList->rename(ch, QString("[%1] %2").arg(uCode).arg(ch->getName().at(0))); g.addBlock(ch, false); ch->reparent(&g); } g.addBlockNotification(); return true; }
/** * Shows a dialog that asks the user if the selected block * can be removed. Doesn't remove the block. This is up to the caller. * * @return a pointer to the block that should be removed. */ RS_Block* QG_DialogFactory::requestBlockRemovalDialog(RS_BlockList* blockList) { RS_Block* block = nullptr; if (!blockList) { RS_DEBUG->print(RS_Debug::D_WARNING, "QG_DialogFactory::requestBlockRemovalDialog(): " "blockList is nullptr"); return nullptr; } // Block for parameter livery block = blockList->getActive(); if (block) { int remove = QMessageBox::warning(parent, QMessageBox::tr("Remove Block"), QMessageBox::tr("Block \"%1\" and all " "its entities will be removed.") .arg(block->getName()), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if (remove==QMessageBox::Ok) {} else { block = nullptr; } } return block; }
void LC_MakerCamSVG::writeInsert(RS_Insert* insert) { RS_Block* block = insert->getBlockForInsert(); RS_Vector insertionpoint = convertToSvg(insert->getInsertionPoint()); if (writeBlocksInline) { RS_DEBUG->print("RS_MakerCamSVG::writeInsert: Writing insert inline ..."); offset.set(insertionpoint.x, insertionpoint.y - (max.y - min.y)); xmlWriter->addElement("g", NAMESPACE_URI_SVG); xmlWriter->addAttribute("blockname", qPrintable(block->getName()), NAMESPACE_URI_LC); writeLayers(block); xmlWriter->closeElement(); offset.set(0, 0); } else { RS_DEBUG->print("RS_MakerCamSVG::writeInsert: Writing insert as reference to block ..."); xmlWriter->addElement("use", NAMESPACE_URI_SVG); xmlWriter->addAttribute("x", numXml(insertionpoint.x)); xmlWriter->addAttribute("y", numXml(insertionpoint.y - (max.y - min.y))); xmlWriter->addAttribute("href", "#" + std::to_string(block->getId()), NAMESPACE_URI_XLINK); xmlWriter->closeElement(); } }
void RS_ActionBlocksAttributes::trigger() { RS_DEBUG->print("editing block attributes"); if (graphic!=NULL && RS_DIALOGFACTORY!=NULL) { RS_Block* block = graphic->getActiveBlock(); RS_BlockList* blockList = graphic->getBlockList(); if (blockList!=NULL && block!=NULL) { QString oldName = block->getName(); RS_BlockData d; d = RS_DIALOGFACTORY->requestBlockAttributesDialog( blockList); if (d.isValid()) { QString newName = d.name; blockList->rename(block, newName); // update the name of all inserts: graphic->renameInserts(oldName, newName); graphic->addBlockNotification(); } } } finish(); }
void RS_ActionBlocksRemove::trigger() { RS_DEBUG->print("RS_ActionBlocksRemove::trigger"); if (graphic!=NULL) { RS_Block* block = RS_DIALOGFACTORY->requestBlockRemovalDialog(graphic->getBlockList()); // list of containers that might refer to the block via inserts: RS_PtrList<RS_EntityContainer> containerList; containerList.append(graphic); RS_BlockList* blkLst = graphic->getBlockList(); for (uint bi=0; bi<blkLst->count(); bi++) { containerList.append(blkLst->at(bi)); } if (block!=NULL) { for (RS_EntityContainer* cont = containerList.first(); cont!=NULL; cont=containerList.next()) { // remove all inserts from the graphic: bool done; do { done = true; for (RS_Entity* e=cont->firstEntity(RS2::ResolveNone); e!=NULL; e=cont->nextEntity(RS2::ResolveNone)) { if (e->rtti()==RS2::EntityInsert) { RS_Insert* ins = (RS_Insert*)e; if (ins->getName()==block->getName()) { cont->removeEntity(ins); done = false; break; } } } } while (!done); } // close all windows that are editing this block: if (RS_DIALOGFACTORY!=NULL) { RS_DIALOGFACTORY->closeEditBlockWindow(block); } // Now remove the block from the block list: graphic->removeBlock(block); graphic->updateInserts(); graphicView->redraw(); } } finish(); RS_DIALOGFACTORY->updateSelectionWidget(container->countSelected()); }
void QG_BlockDialog::setBlockList(RS_BlockList* l) { RS_DEBUG->print("QG_BlockDialog::setBlockList"); blockList = l; if (blockList) { RS_Block* block = blockList->getActive(); if (block) { leName->setText(block->getName()); } } }
/** * @return Pointer to the block with the given name or * \p NULL if no such block was found. */ RS_Block* RS_BlockList::find(const QString& name) { //RS_DEBUG->print("RS_BlockList::find"); RS_Block* ret = NULL; // Todo : reduce this from O(N) to O(log(N)) complexity based on sorted list or hash for (int i=0; i<count(); ++i) { RS_Block* b = at(i); if (b->getName()==name) { ret=b; break; } } return ret; }
/** * @return Pointer to the block with the given name or * \p NULL if no such block was found. */ RS_Block* RS_BlockList::find(const QString& name) { //RS_DEBUG->print("RS_BlockList::find"); RS_Block* ret = NULL; for (int i=0; i<count(); ++i) { RS_Block* b = at(i); if (b->getName()==name) { ret=b; break; } } return ret; }
void QC_MDIWindow::drawChars() { RS_BlockList* bl = document->getBlockList(); double sep = document->getGraphic()->getVariableDouble("LetterSpacing", 3.0); double h = sep/3; sep = sep*3; for (int i=0; i<bl->count(); ++i) { RS_Block* ch = bl->at(i); RS_InsertData data(ch->getName(), RS_Vector(i*sep,0), RS_Vector(1,1), 0, 1, 1, RS_Vector(0,0)); RS_Insert* in = new RS_Insert(document, data); document->addEntity(in); QFileInfo info(document->getFilename() ); QString uCode = (ch->getName()).mid(1,4); RS_MTextData datatx(RS_Vector(i*sep,-h), h, 4*h, RS_MTextData::VATop, RS_MTextData::HALeft, RS_MTextData::ByStyle, RS_MTextData::AtLeast, 1, uCode, "standard", 0); /* RS_MTextData datatx(RS_Vector(i*sep,-h), h, 4*h, RS2::VAlignTop, RS2::HAlignLeft, RS2::ByStyle, RS2::AtLeast, 1, uCode, info.baseName(), 0);*/ RS_MText *tx = new RS_MText(document, datatx); document->addEntity(tx); } }
QVariant QG_BlockModel::data ( const QModelIndex & index, int role ) const { if (!index.isValid() || index.row() >= listBlock.size()) return QVariant(); RS_Block* blk = listBlock.at(index.row()); if (role ==Qt::DecorationRole && index.column() == VISIBLE) { if (!blk->isFrozen()) { return blockVisible; } else { return blockHidden; } } if (role ==Qt::DisplayRole && index.column() == NAME) { return blk->getName(); } //Other roles: return QVariant(); }
/** * Implementation of the method used for RS_Export to communicate * with this filter. * * @param file Full path to the LFF file that will be written. */ bool RS_FilterLFF::fileExport(RS_Graphic& g, const QString& file, RS2::FormatType /*type*/) { RS_DEBUG->print("LFF Filter: exporting file '%s'...", file.toLatin1().data()); RS_DEBUG->print("RS_FilterLFF::fileExport: open"); QFile f(file); QTextStream ts(&f); ts.setCodec("UTF-8"); if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { RS_DEBUG->print("RS_FilterLFF::fileExport: open: OK"); RS_DEBUG->print("RS_FilterLFF::fileExport: header"); // header: ts << "# Format: LibreCAD Font 1\n"; ts << QString("# Creator: %1\n").arg(RS_SYSTEM->getAppName()); ts << QString("# Version: %1\n").arg(RS_SYSTEM->getAppVersion()); QString ns = g.getVariableString("Names", ""); if (!ns.isEmpty()) { QStringList names = ns.split(','); RS_DEBUG->print("002"); for (int i = 0; i < names.size(); ++i) { ts << QString("# Name: %1\n").arg(names.at(i)); } } QString es = g.getVariableString("Encoding", ""); ts << QString("# Encoding: UTF-8\n"); ts << QString("# LetterSpacing: %1\n").arg( g.getVariableDouble("LetterSpacing", 3.0)); ts << QString("# WordSpacing: %1\n").arg( g.getVariableDouble("WordSpacing", 6.75)); ts << QString("# LineSpacingFactor: %1\n").arg( g.getVariableDouble("LineSpacingFactor", 1.0)); QString dateline = QDate::currentDate().toString ("yyyy-MM-dd"); ts << QString("# Created: %1\n").arg( g.getVariableString("Created", dateline)); ts << QString("# Last modified: %1\n").arg(dateline); QString sa = g.getVariableString("Authors", ""); RS_DEBUG->print("authors: %s", sa.toLocal8Bit().data()); if (!sa.isEmpty()) { QStringList authors = sa.split(','); RS_DEBUG->print("count: %d", authors.count()); QString a; for (int i = 0; i < authors.size(); ++i) { ts << QString("# Author: %1\n").arg(authors.at(i)); } } es = g.getVariableString("License", ""); if (!es.isEmpty()) { ts << QString("# License: %1\n").arg(es); } else ts << "# License: unknown\n"; RS_DEBUG->print("RS_FilterLFF::fileExport: header: OK"); // iterate through blocks (=letters of font) for (uint i=0; i<g.countBlocks(); ++i) { RS_Block* blk = g.blockAt(i); RS_DEBUG->print("block: %d", i); if (blk!=NULL) { RS_DEBUG->print("002a: %s", (blk->getName().toLocal8Bit().data())); ts << QString("\n%1\n").arg(blk->getName()); // iterate through entities of this letter: for (RS_Entity* e=blk->firstEntity(RS2::ResolveNone); e!=NULL; e=blk->nextEntity(RS2::ResolveNone)) { if (!e->isUndone()) { // lines: if (e->rtti()==RS2::EntityLine) { RS_Line* l = (RS_Line*)e; ts << clearZeros(l->getStartpoint().x, 5) << ','; ts << clearZeros(l->getStartpoint().y, 5) << ';'; ts << clearZeros(l->getEndpoint().x, 5) << ','; ts << clearZeros(l->getEndpoint().y, 5) << '\n'; } // arcs: else if (e->rtti()==RS2::EntityArc) { RS_Arc* a = (RS_Arc*)e; ts << clearZeros(a->getStartpoint().x, 5) << ','; ts << clearZeros(a->getStartpoint().y, 5) << ';'; ts << clearZeros(a->getEndpoint().x, 5) << ','; ts << clearZeros(a->getEndpoint().y, 5) << ",A"; ts << clearZeros(a->getBulge(), 5) << '\n'; } else if (e->rtti()==RS2::EntityBlock) { RS_Block* b = (RS_Block*)e; QString uCode; uCode.setNum(b->getName().at(0).unicode(), 16); if (uCode.length()<4) { uCode = uCode.rightJustified(4, '0'); } ts << QString("C%1\n").arg(uCode); } else if (e->rtti()==RS2::EntityPolyline) { RS_Polyline* p = (RS_Polyline*)e; ts << clearZeros(p->getStartpoint().x, 5) << ','; ts << clearZeros(p->getStartpoint().y, 5); for (RS_Entity* e2=p->firstEntity(RS2::ResolveNone); e2!=NULL; e2=p->nextEntity(RS2::ResolveNone)) { if (e2->rtti()==RS2::EntityLine){ RS_Line* l = (RS_Line*)e2; ts << ';' << clearZeros(l->getEndpoint().x, 5) << ','; ts << clearZeros(l->getEndpoint().y, 5); } else if (e2->rtti()==RS2::EntityArc){ RS_Arc* a = (RS_Arc*)e2; ts << ';' << clearZeros(a->getEndpoint().x, 5) << ','; ts << clearZeros(a->getEndpoint().y, 5) <<",A"; ts << clearZeros(a->getBulge(), 5); } } ts<<'\n'; } // Ignore entities other than arcs / lines else {} } } } } f.close(); RS_DEBUG->print("LFF Filter: exporting file: OK"); return true; } else { RS_DEBUG->print("LFF Filter: exporting file failed"); } return false; }