/** * 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; }
RS_Entity* RS_Block::clone() const { RS_Block* blk = new RS_Block(*this); blk->setOwner(isOwner()); blk->detach(); blk->initId(); return blk; }
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()); }
/** * Is this insert visible? (re-implementation from RS_Entity) * * @return true Only if the entity and the block and the layer it is on * are visible. * The Layer might also be NULL. In that case the layer visiblity * is ignored. * The Block might also be NULL. In that case the block visiblity * is ignored. */ bool RS_Insert::isVisible() { RS_Block* blk = getBlockForInsert(); if (blk!=NULL) { if (blk->isFrozen()) { return false; } } return RS_Entity::isVisible(); }
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()); } } }
QString Doc_plugin_interface::addBlockfromFromdisk(QString fullName){ if (fullName.isEmpty() || doc==NULL) return NULL; RS_BlockList* blockList = doc->getBlockList(); if (blockList==NULL) return NULL; QFileInfo fi(fullName); QString s = fi.completeBaseName(); QString name = s; if(blockList->find(name)){ for (int i=0; i<1e5; ++i) { name = QString("%1-%2").arg(s).arg(i); if (blockList->find(name)==NULL) { break; } } } if (fi.isReadable()) { RS_BlockData d(name, RS_Vector(0,0), false); RS_Block *b = new RS_Block(doc, d); RS_Graphic g; if (!g.open(fi.absoluteFilePath(), RS2::FormatUnknown)) { RS_DEBUG->print(RS_Debug::D_WARNING, "Doc_plugin_interface::addBlockfromFromdisk: Cannot open file: %s"); delete b; return NULL; } RS_LayerList* ll = g.getLayerList(); for (int i = 0; i<ll->count(); i++){ RS_Layer* nl = ll->at(i)->clone(); doc->addLayer(nl); } RS_BlockList* bl = g.getBlockList(); for (int i = 0; i<bl->count(); i++){ RS_Block* nb = (RS_Block*)bl->at(i)->clone(); doc->addBlock(nb); } for (int i = 0; i<g.count(); i++){ RS_Entity* e = g.entityAt(i)->clone(); e->reparent(b); b->addEntity(e); } doc->addBlock(b); return name; } else { return NULL; } }
/** * 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; }
/** * @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 RS_Main::blendImage() { m_nCorrentCnt = 0; // 상단 문제부분 이미지 섞기 int* pRand = new int[m_nImgCount]; GameUtil::Rand(pRand, m_nImgCount); RS_Block* pBlock = NULL; for(unsigned int i=0; i<m_arrImgQ.count(); i++) { pBlock = (RS_Block*)m_arrImgQ.objectAtIndex(i); int base = pRand[i]; pBlock->setPosition(ccp(m_ptCorrect[base].x, m_ptCorrect[base].y)); pBlock->setOpacity(255); pBlock->m_bEnd = false; } delete []pRand; // 하단 정답부분 Clear RS_Blank* pBlank = NULL; for(unsigned int k=0; k<m_arrImgA.count(); k++) { pBlank = (RS_Blank*)m_arrImgA.objectAtIndex(k); pBlank->m_bEnd = false; // 맞춘 이미지가 있다면 삭제 if (pBlank->m_pSprite) { pBlank->removeChild(pBlank->m_pSprite, true); pBlank->m_pSprite = NULL; } } // 각 스크롤뷰 위치 Reset m_scrollVQ->setContentOffset(ccp(0, 0)); m_scrollVA->setContentOffset(ccp(0, 0)); // 배경음 Stop if (CocosDenshion::SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying()) CocosDenshion::SimpleAudioEngine::sharedEngine()->stopBackgroundMusic(true); // 배경음 Play CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic(m_szBGM, true); }
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(); }
/** * Removes the given layer and undoes all entities on it. */ void RS_Graphic::removeLayer(RS_Layer* layer) { if (layer!=NULL && layer->getName()!="0") { // remove all entities on that layer: startUndoCycle(); for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone)) { if (e->getLayer()!=NULL && e->getLayer()->getName()==layer->getName()) { e->setUndoState(true); e->setLayer("0"); addUndoable(e); } } endUndoCycle(); // remove all entities in blocks that are on that layer: for (int bi=0; bi<blockList.count(); bi++) { RS_Block* blk = blockList.at(bi); if (blk!=NULL) { for (RS_Entity* e=blk->firstEntity(RS2::ResolveNone); e!=NULL; e=blk->nextEntity(RS2::ResolveNone)) { if (e->getLayer()!=NULL && e->getLayer()->getName()==layer->getName()) { e->setUndoState(true); e->setLayer("0"); //addUndoable(e); } } } } layerList.remove(layer); } }
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); } }
/** * Creates a new block from the currently selected entitiies. * * @param referencePoint Reference point for the block. * @param name Block name * @param remove true: remove existing entities, false: don't touch entities */ RS_Block* RS_Creation::createBlock(const RS_BlockData* data, const RS_Vector& referencePoint, const bool remove) { // start undo cycle for the container if we're deleting the existing entities if (remove && document) { document->startUndoCycle(); } RS_Block* block = new RS_Block(container, RS_BlockData(*data)); // copy entities into a block for(auto e: *container){ //for (unsigned i=0; i<container->count(); ++i) { //RS_Entity* e = container->entityAt(i); if (e && e->isSelected()) { // delete / redraw entity in graphic view: if (remove) { if (graphicView) { graphicView->deleteEntity(e); } e->setSelected(false); } else { if (graphicView) { graphicView->deleteEntity(e); } e->setSelected(false); if (graphicView) { graphicView->drawEntity(e); } } // add entity to block: RS_Entity* c = e->clone(); c->move(-referencePoint); block->addEntity(c); if (remove) { //container->removeEntity(e); //i=0; e->changeUndoState(); if (document) { document->addUndoable(e); } } } } if (remove && document) { document->endUndoCycle(); } if (graphic) { graphic->addBlock(block); } return block; }
/** * Updates the entity buffer of this insert entity. This method * needs to be called whenever the block this insert is based on changes. */ void RS_Insert::update() { RS_DEBUG->print("RS_Insert::update"); RS_DEBUG->print("RS_Insert::update: name: %s", data.name.toLatin1().data()); // RS_DEBUG->print("RS_Insert::update: insertionPoint: %f/%f", // data.insertionPoint.x, data.insertionPoint.y); if (updateEnabled==false) { return; } clear(); RS_Block* blk = getBlockForInsert(); if (blk==nullptr) { //return nullptr; RS_DEBUG->print("RS_Insert::update: Block is nullptr"); return; } if (isUndone()) { RS_DEBUG->print("RS_Insert::update: Insert is in undo list"); return; } if (fabs(data.scaleFactor.x)<1.0e-6 || fabs(data.scaleFactor.y)<1.0e-6) { RS_DEBUG->print("RS_Insert::update: scale factor is 0"); return; } RS_Pen tmpPen; /*QListIterator<RS_Entity> it = createIterator(); RS_Entity* e; while ( (e = it.current()) != nullptr ) { ++it;*/ RS_DEBUG->print("RS_Insert::update: cols: %d, rows: %d", data.cols, data.rows); RS_DEBUG->print("RS_Insert::update: block has %d entities", blk->count()); //int i_en_counts=0; for(auto e: *blk){ for (int c=0; c<data.cols; ++c) { // RS_DEBUG->print("RS_Insert::update: col %d", c); for (int r=0; r<data.rows; ++r) { // i_en_counts++; // RS_DEBUG->print("RS_Insert::update: row %d", r); if (e->rtti()==RS2::EntityInsert && data.updateMode!=RS2::PreviewUpdate) { // RS_DEBUG->print("RS_Insert::update: updating sub-insert"); ((RS_Insert*)e)->update(); } // RS_DEBUG->print("RS_Insert::update: cloning entity"); RS_Entity* ne; if ( (data.scaleFactor.x - data.scaleFactor.y)>1.0e-6) { if (e->rtti()== RS2::EntityArc) { RS_Arc* a= (RS_Arc*)e; ne = new RS_Ellipse(this, RS_EllipseData(a->getCenter(), RS_Vector(a->getRadius(), 0), 1, a->getAngle1(), a->getAngle2(), a->isReversed() )); ne->setLayer(e->getLayer()); ne->setPen(e->getPen(false)); } else if (e->rtti()== RS2::EntityCircle) { RS_Circle* a= (RS_Circle*)e; ne = new RS_Ellipse(this, RS_EllipseData(a->getCenter(), RS_Vector(a->getRadius(), 0), 1, 0.0,2.0*M_PI, false)); ne->setLayer(e->getLayer()); ne->setPen(e->getPen(false)); } else ne = e->clone(); } else ne = e->clone(); ne->initId(); ne->setUpdateEnabled(false); // if entity layer are 0 set to insert layer to allow "1 layer control" bug ID #3602152 RS_Layer *l= ne->getLayer();//special fontchar block don't have if (l != nullptr && ne->getLayer()->getName() == "0") ne->setLayer(this->getLayer()); ne->setParent(this); ne->setVisible(getFlag(RS2::FlagVisible)); // RS_DEBUG->print("RS_Insert::update: transforming entity"); // Move: // RS_DEBUG->print("RS_Insert::update: move 1"); if (fabs(data.scaleFactor.x)>1.0e-6 && fabs(data.scaleFactor.y)>1.0e-6) { ne->move(data.insertionPoint + RS_Vector(data.spacing.x/data.scaleFactor.x*c, data.spacing.y/data.scaleFactor.y*r)); } else { ne->move(data.insertionPoint); } // Move because of block base point: // RS_DEBUG->print("RS_Insert::update: move 2"); ne->move(blk->getBasePoint()*-1); // Scale: // RS_DEBUG->print("RS_Insert::update: scale"); ne->scale(data.insertionPoint, data.scaleFactor); // Rotate: // RS_DEBUG->print("RS_Insert::update: rotate"); ne->rotate(data.insertionPoint, data.angle); // Select: ne->setSelected(isSelected()); // individual entities can be on indiv. layers tmpPen = ne->getPen(false); // color from block (free floating): if (tmpPen.getColor()==RS_Color(RS2::FlagByBlock)) { tmpPen.setColor(getPen().getColor()); } // line width from block (free floating): if (tmpPen.getWidth()==RS2::WidthByBlock) { tmpPen.setWidth(getPen().getWidth()); } // line type from block (free floating): if (tmpPen.getLineType()==RS2::LineByBlock) { tmpPen.setLineType(getPen().getLineType()); } // now that we've evaluated all flags, let's strip them: // TODO: strip all flags (width, line type) //tmpPen.setColor(tmpPen.getColor().stripFlags()); ne->setPen(tmpPen); ne->setUpdateEnabled(true); if (data.updateMode!=RS2::PreviewUpdate) { // RS_DEBUG->print("RS_Insert::update: updating new entity"); ne->update(); } // RS_DEBUG->print("RS_Insert::update: adding new entity"); appendEntity(ne); // std::cout<<"done # of entity: "<<i_en_counts<<std::endl; } } } calculateBorders(); RS_DEBUG->print("RS_Insert::update: OK"); }
void RS_Font::readLFF(QString path) { QString line; QFile f(path); encoding = "UTF-8"; f.open(QIODevice::ReadOnly); QTextStream ts(&f); // Read line by line until we find a new letter: while (!ts.atEnd()) { line = ts.readLine(); if (line.isEmpty()) continue; // Read font settings: if (line.at(0)=='#') { QStringList lst =line.remove(0,1).split(':', QString::SkipEmptyParts); //if size is < 2 is a comentary not parameter if (lst.size()<2) continue; QString identifier = lst.at(0).trimmed(); QString value = lst.at(1).trimmed(); if (identifier.toLower()=="letterspacing") { letterSpacing = value.toDouble(); } else if (identifier.toLower()=="wordspacing") { wordSpacing = value.toDouble(); } else if (identifier.toLower()=="linespacingfactor") { lineSpacingFactor = value.toDouble(); } else if (identifier.toLower()=="author") { authors.append(value); } else if (identifier.toLower()=="name") { names.append(value); } else if (identifier.toLower()=="license") { fileLicense = value; } else if (identifier.toLower()=="encoding") { ts.setCodec(QTextCodec::codecForName(value.toLatin1())); encoding = value; } } // Add another letter to this font: else if (line.at(0)=='[') { // uniode character: QChar ch; // read unicode: QRegExp regexp("[0-9A-Fa-f]{4,4}"); regexp.indexIn(line); QString cap = regexp.cap(); if (!cap.isNull()) { int uCode = cap.toInt(NULL, 16); ch = QChar(uCode); } // only unicode allowed else { continue; } // create new letter: RS_FontChar* letter = new RS_FontChar(NULL, ch, RS_Vector(0.0, 0.0)); // Read entities of this letter: QStringList vertex; QStringList coords; do { line = ts.readLine(); if (line.isEmpty()) { continue; } // Defined char: if (line.at(0)=='C') { line.remove(0,1); int uCode = line.toInt(NULL, 16); QChar ch = QChar(uCode); RS_Block* bk = letterList.find(ch); if (bk != NULL) { RS_Entity* bk2 = bk->clone(); bk2->setPen(RS_Pen(RS2::FlagInvalid)); bk2->setLayer(NULL); letter->addEntity(bk2); } } //sequence: else { vertex = line.split(';', QString::SkipEmptyParts); //at least is required two vertex if (vertex.size()<2) continue; RS_Polyline* pline = new RS_Polyline(letter, RS_PolylineData()); pline->setPen(RS_Pen(RS2::FlagInvalid)); pline->setLayer(NULL); for (int i = 0; i < vertex.size(); ++i) { double x1, y1; double bulge = 0; coords = vertex.at(i).split(',', QString::SkipEmptyParts); //at least X,Y is required if (coords.size()<2) continue; x1 = coords.at(0).toDouble(); y1 = coords.at(1).toDouble(); //check presence of bulge if (coords.size() == 3 && coords.at(2).at(0) == QChar('A')){ QString bulgeStr = coords.at(2); bulge = bulgeStr.remove(0,1).toDouble(); pline->setNextBulge(bulge); } pline->addVertex(RS_Vector(x1, y1), bulge); } letter->addEntity(pline); } } while (!line.isEmpty()); letter->calculateBorders(); letterList.add(letter); } } f.close(); }
RS_Block* RS_Font::generateLffFont(const QString& ch){ if(rawLffFontList.contains(ch) == false ){ RS_DEBUG->print("RS_Font::generateLffFont(QChar %s ) : can not find the letter in given lff font file",qPrintable(ch)); return nullptr; } // create new letter: RS_FontChar* letter = new RS_FontChar(nullptr, ch, RS_Vector(0.0, 0.0)); // Read entities of this letter: QStringList vertex; QStringList coords; QStringList fontData=rawLffFontList[ch]; QString line; while(fontData.isEmpty() == false) { line = fontData.takeFirst(); if (line.isEmpty()) { continue; } // Defined char: if (line.at(0)=='C') { line.remove(0,1); int uCode = line.toInt(nullptr, 16); QChar ch = QChar(uCode); RS_Block* bk = letterList.find(ch); if (!bk && rawLffFontList.contains(ch)) { generateLffFont(ch); bk = letterList.find(ch); } if (bk) { RS_Entity* bk2 = bk->clone(); bk2->setPen(RS_Pen(RS2::FlagInvalid)); bk2->setLayer(nullptr); letter->addEntity(bk2); } } //sequence: else { vertex = line.split(';', QString::SkipEmptyParts); //at least is required two vertex if (vertex.size()<2) continue; RS_Polyline* pline = new RS_Polyline(letter, RS_PolylineData()); pline->setPen(RS_Pen(RS2::FlagInvalid)); pline->setLayer(nullptr); for (int i = 0; i < vertex.size(); ++i) { double x1, y1; double bulge = 0; coords = vertex.at(i).split(',', QString::SkipEmptyParts); //at least X,Y is required if (coords.size()<2) continue; x1 = coords.at(0).toDouble(); y1 = coords.at(1).toDouble(); //check presence of bulge if (coords.size() == 3 && coords.at(2).at(0) == QChar('A')){ QString bulgeStr = coords.at(2); bulge = bulgeStr.remove(0,1).toDouble(); } pline->setNextBulge(bulge); pline->addVertex(RS_Vector(x1, y1), bulge); } letter->addEntity(pline); } } if (letter->isEmpty()) { delete letter; return nullptr; } else { letter->calculateBorders(); letterList.add(letter); return letter; } }
/** * Testing function. */ void LC_SimpleTests::slotTestInsertBlock() { RS_DEBUG->print("%s\n: begin\n", __func__); auto appWin=QC_ApplicationWindow::getAppWindow(); RS_Document* d = appWin->getDocument(); if (d && d->rtti()==RS2::EntityGraphic) { RS_Graphic* graphic = (RS_Graphic*)d; if (graphic==NULL) { return; } graphic->addLayer(new RS_Layer("default")); RS_Block* block = new RS_Block(graphic, RS_BlockData("debugblock", RS_Vector(0.0,0.0), true)); RS_Line* line; RS_Arc* arc; RS_Circle* circle; // Add one red line: line = new RS_Line{block, {0.,0.}, {50.,0.}}; line->setLayerToActive(); line->setPen(RS_Pen(RS_Color(255, 0, 0), RS2::Width01, RS2::SolidLine)); block->addEntity(line); // Add one line with attributes from block: line = new RS_Line{block, {50.,0.}, {50.,50.}}; line->setPen(RS_Pen(RS_Color(RS2::FlagByBlock), RS2::WidthByBlock, RS2::LineByBlock)); block->addEntity(line); // Add one arc with attributes from block: RS_ArcData d({50.,0.}, 50.0, M_PI_2, M_PI, false); arc = new RS_Arc(block, d); arc->setPen(RS_Pen(RS_Color(RS2::FlagByBlock), RS2::WidthByBlock, RS2::LineByBlock)); block->addEntity(arc); // Add one blue circle: RS_CircleData circleData(RS_Vector(20.0,15.0), 12.5); circle = new RS_Circle(block, circleData); circle->setLayerToActive(); circle->setPen(RS_Pen(RS_Color(0, 0, 255), RS2::Width01, RS2::SolidLine)); block->addEntity(circle); graphic->addBlock(block); RS_Insert* ins; RS_InsertData insData("debugblock", RS_Vector(0.0,0.0), RS_Vector(1.0,1.0), 0.0, 1, 1, RS_Vector(0.0, 0.0), NULL, RS2::NoUpdate); // insert one magenta instance of the block (original): ins = new RS_Insert(graphic, insData); ins->setLayerToActive(); ins->setPen(RS_Pen(RS_Color(255, 0, 255), RS2::Width02, RS2::SolidLine)); ins->update(); graphic->addEntity(ins); // insert one green instance of the block (rotate): insData = RS_InsertData("debugblock", RS_Vector(-50.0,20.0), RS_Vector(1.0,1.0), M_PI/6., 1, 1, RS_Vector(0.0, 0.0), NULL, RS2::NoUpdate); ins = new RS_Insert(graphic, insData); ins->setLayerToActive(); ins->setPen(RS_Pen(RS_Color(0, 255, 0), RS2::Width02, RS2::SolidLine)); ins->update(); graphic->addEntity(ins); // insert one cyan instance of the block (move): insData = RS_InsertData("debugblock", RS_Vector(10.0,20.0), RS_Vector(1.0,1.0), 0.0, 1, 1, RS_Vector(0.0, 0.0), NULL, RS2::NoUpdate); ins = new RS_Insert(graphic, insData); ins->setLayerToActive(); ins->setPen(RS_Pen(RS_Color(0, 255, 255), RS2::Width02, RS2::SolidLine)); ins->update(); graphic->addEntity(ins); // insert one blue instance of the block: for (double a=0.0; a<360.0; a+=45.0) { insData = RS_InsertData("debugblock", RS_Vector(60.0,0.0), RS_Vector(2.0/5,2.0/5), RS_Math::deg2rad(a), 1, 1, RS_Vector(0.0, 0.0), NULL, RS2::NoUpdate); ins = new RS_Insert(graphic, insData); ins->setLayerToActive(); ins->setPen(RS_Pen(RS_Color(0, 0, 255), RS2::Width05, RS2::SolidLine)); ins->update(); graphic->addEntity(ins); } // insert an array of yellow instances of the block: insData = RS_InsertData("debugblock", RS_Vector(-100.0,-100.0), RS_Vector(0.2,0.2), M_PI/6.0, 6, 4, RS_Vector(100.0, 100.0), NULL, RS2::NoUpdate); ins = new RS_Insert(graphic, insData); ins->setLayerToActive(); ins->setPen(RS_Pen(RS_Color(255, 255, 0), RS2::Width01, RS2::SolidLine)); ins->update(); graphic->addEntity(ins); RS_GraphicView* v = appWin->getGraphicView(); if (v) { v->redraw(); } } RS_DEBUG->print("%s\n: end\n", __func__); }
/** * 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; }
/** * Updates the entity buffer of this insert entity. This method * needs to be called whenever the block this insert is based on changes. */ void RS_Insert::update() { RS_DEBUG->print("RS_Insert::update"); RS_DEBUG->print("RS_Insert::update: name: %s", data.name.latin1()); RS_DEBUG->print("RS_Insert::update: insertionPoint: %f/%f", data.insertionPoint.x, data.insertionPoint.y); if (updateEnabled==false) { return; } clear(); RS_Block* blk = getBlockForInsert(); if (blk==NULL) { //return NULL; RS_DEBUG->print("RS_Insert::update: Block is NULL"); return; } if (isUndone()) { RS_DEBUG->print("RS_Insert::update: Insert is in undo list"); return; } if (fabs(data.scaleFactor.x)<1.0e-6 || fabs(data.scaleFactor.y)<1.0e-6) { RS_DEBUG->print("RS_Insert::update: scale factor is 0"); return; } RS_Pen tmpPen; /*RS_PtrListIterator<RS_Entity> it = createIterator(); RS_Entity* e; while ( (e = it.current()) != NULL ) { ++it;*/ RS_DEBUG->print("RS_Insert::update: cols: %d, rows: %d", data.cols, data.rows); RS_DEBUG->print("RS_Insert::update: block has %d entities", blk->count()); for (RS_Entity* e=blk->firstEntity(); e!=NULL; e=blk->nextEntity()) { for (int c=0; c<data.cols; ++c) { RS_DEBUG->print("RS_Insert::update: col %d", c); for (int r=0; r<data.rows; ++r) { RS_DEBUG->print("RS_Insert::update: row %d", r); if (e->rtti()==RS2::EntityInsert && data.updateMode!=RS2::PreviewUpdate) { RS_DEBUG->print("RS_Insert::update: updating sub-insert"); ((RS_Insert*)e)->update(); } RS_DEBUG->print("RS_Insert::update: cloning entity"); RS_Entity* ne = e->clone(); ne->initId(); ne->setUpdateEnabled(false); ne->setParent(this); ne->setVisible(getFlag(RS2::FlagVisible)); RS_DEBUG->print("RS_Insert::update: transforming entity"); // Move: RS_DEBUG->print("RS_Insert::update: move 1"); if (fabs(data.scaleFactor.x)>1.0e-6 && fabs(data.scaleFactor.y)>1.0e-6) { ne->move(data.insertionPoint + RS_Vector(data.spacing.x/data.scaleFactor.x*c, data.spacing.y/data.scaleFactor.y*r)); } else { ne->move(data.insertionPoint); } // Move because of block base point: RS_DEBUG->print("RS_Insert::update: move 2"); ne->move(blk->getBasePoint()*-1); // Scale: RS_DEBUG->print("RS_Insert::update: scale"); ne->scale(data.insertionPoint, data.scaleFactor); // Rotate: RS_DEBUG->print("RS_Insert::update: rotate"); ne->rotate(data.insertionPoint, data.angle); // Select: ne->setSelected(isSelected()); // individual entities can be on indiv. layers tmpPen = ne->getPen(false); // color from block (free floating): if (tmpPen.getColor()==RS_Color(RS2::FlagByBlock)) { tmpPen.setColor(getPen().getColor()); } // line width from block (free floating): if (tmpPen.getWidth()==RS2::WidthByBlock) { tmpPen.setWidth(getPen().getWidth()); } // line type from block (free floating): if (tmpPen.getLineType()==RS2::LineByBlock) { tmpPen.setLineType(getPen().getLineType()); } // now that we've evaluated all flags, let's strip them: // TODO: strip all flags (width, line type) //tmpPen.setColor(tmpPen.getColor().stripFlags()); ne->setPen(tmpPen); ne->setUpdateEnabled(true); if (data.updateMode!=RS2::PreviewUpdate) { RS_DEBUG->print("RS_Insert::update: updating new entity"); ne->update(); } RS_DEBUG->print("RS_Insert::update: adding new entity"); addEntity(ne); } } } calculateBorders(); RS_DEBUG->print("RS_Insert::update: OK"); }
bool RS_Main::CreateQuestion() { bool bRet = false; do { // Answer영역 CCScrollView m_scrollVQ = CCScrollView::create(); // Answer영역 ScrollView에 스프라이트 생성 char szFile[260]; // xml에서 읽어온 값 사용 m_nImgCount = m_nGameImgCnt; RS_Block* pBlock = NULL; int* pRand = new int[m_nImgCount]; GameUtil::Rand(pRand, m_nImgCount); CCRect rcBB; // 블럭의 크기를 저장 float fPosX; int index; for (int i=0; i<m_nImgCount; i++) { index = pRand[i]; sprintf(szFile, "eBook/%02d/rememberStory/lv%d_%02d.png", m_nCurEBookPage, m_nGameLevel, index+1); // 블럭이미지로 쓸 이미지 로딩. CCTexture2D * pBlockTexture = CCTextureCache::sharedTextureCache()->addImage(szFile); pBlock = RS_Block::BlockWithTexture(pBlockTexture, index+1, this); rcBB = pBlock->boundingBox(); // 레이어에서의 위치 지정 (anchor point 감안, Margin 추가) fPosX = SC_MARGIN_LQ + i* (rcBB.size.width + SCROLL_ITEM_GAP_Q); pBlock->setPosition(ccp(fPosX, 0)); m_scrollVQ->addChild(pBlock, 0); m_arrImgQ.addObject(pBlock); // 생성한 블럭의 위치를 저장해둔다. 추후 섞을때 이용 m_ptCorrect[i].x = pBlock->getPositionX(); m_ptCorrect[i].y = pBlock->getPositionY(); } delete []pRand; if (m_arrImgQ.count() == 0) { bRet = false; break; } int nWidth = SC_MARGIN_LQ + m_arrImgQ.count() * (rcBB.size.width + SCROLL_ITEM_GAP_Q) - SCROLL_ITEM_GAP_Q + SC_MARGIN_RQ; int nHeight = rcBB.size.height; CCLog("CreateQuestion. block width[%f]", rcBB.size.width); CCLog("CreateQuestion. block height[%f]", rcBB.size.height); m_scrollVQ->setContentSize(CCSizeMake(nWidth, nHeight));// 스크롤뷰에 포함할 레이어 크기 m_scrollVQ->setContentOffset(CCPointZero); m_scrollVQ->setDirection(kCCScrollViewDirectionHorizontal); // 스크롤 방향 m_scrollVQ->setDelegate(this); m_scrollVQ->setPosition(ccp(0, SC_MARGIN_BA + BLANK_HEIGHT + SC_MARGIN_BQ)); // 표시할 위치 (무조건 지정좌표에 좌하단이 위치한다.) m_scrollVQ->setViewSize(CCSizeMake(s.width, nHeight)); // 보이는 영역크기 this->addChild(m_scrollVQ, 2); bRet = true; } while(0); return bRet; }