⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs_filtercxf.cpp

📁 qcad2.05可用于windows和linux的源码
💻 CPP
字号:
/****************************************************************************** $Id: rs_filtercxf.cpp 1938 2004-12-09 23:09:53Z andrew $**** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.**** This file is part of the qcadlib Library project.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** Licensees holding valid qcadlib Professional Edition licenses may use ** this file in accordance with the qcadlib Commercial License** Agreement provided with the Software.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.ribbonsoft.com for further details.**** Contact info@ribbonsoft.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "rs_filtercxf.h"#include <iostream>#include <fstream>#include "rs_regexp.h"#include "rs_font.h"#include "rs_utility.h"#include "rs_system.h"/** * Default constructor. */RS_FilterCXF::RS_FilterCXF() : RS_FilterInterface() {    RS_DEBUG->print("Setting up CXF filter...");    addImportFormat(RS2::FormatCXF);    addExportFormat(RS2::FormatCXF);}/** * 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_FilterCXF::fileImport(RS_Graphic& g, const RS_String& file, RS2::FormatType /*type*/) {    RS_DEBUG->print("CXF Filter: importing file '%s'...", file.latin1());    //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 CXF file '%s'.", file.latin1());		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);    if (!font.getEncoding().isEmpty()) {        g.addVariable("Encoding", font.getEncoding(), 0);    }    RS_BlockList* letterList = font.getLetterList();    for (uint i=0; i<font.countLetters(); ++i) {        RS_Block* ch = font.letterAt(i);        RS_String uCode;        uCode.setNum(ch->getName().at(0).unicode(), 16);        while (uCode.length()<4) {            uCode="0"+uCode;        }        //ch->setName("[" + uCode + "] " + ch->getName());        //letterList->rename(ch, RS_String("[%1]").arg(ch->getName()));        letterList->rename(ch,                           RS_String("[%1] %2").arg(uCode).arg(ch->getName().at(0)));        g.addBlock(ch, false);        ch->reparent(&g);    }    g.addBlockNotification();	return true;}/** * Implementation of the method used for RS_Export to communicate * with this filter. * * @param file Full path to the CXF file that will be written. */bool RS_FilterCXF::fileExport(RS_Graphic& g, const RS_String& file, RS2::FormatType /*type*/) {    RS_DEBUG->print("CXF Filter: exporting file '%s'...", file.latin1());    // crashes under windoze xp:    //std::ofstream fout;    RS_DEBUG->print("RS_FilterCXF::fileExport: open");    //fout.open((const char*)file.local8Bit());    FILE* fp;    if ((fp = fopen((const char*)file.local8Bit(), "wt")) != NULL) {        RS_DEBUG->print("RS_FilterCXF::fileExport: open: OK");        RS_DEBUG->print("RS_FilterCXF::fileExport: header");        // header:        fprintf(fp, "# Format:            QCad II Font\n");        fprintf(fp, "# Creator:           %s\n",                (const char*)RS_SYSTEM->getAppName().local8Bit());        fprintf(fp, "# Version:           %s\n",                (const char*)RS_SYSTEM->getAppVersion().local8Bit());        RS_DEBUG->print("001");        RS_String ns = g.getVariableString("Names", "");        if (!ns.isEmpty()) {            RS_StringList names = RS_StringList::split(',', ns);            RS_DEBUG->print("002");            for (RS_StringList::Iterator it = names.begin(); it!=names.end(); ++it) {                fprintf(fp, "# Name:              %s\n",                        (const char*)((*it).local8Bit()));            }        }        RS_DEBUG->print("003");        RS_String es = g.getVariableString("Encoding", "");        if (!es.isEmpty()) {            fprintf(fp, "# Encoding:          %s\n",                    (const char*)es.local8Bit());        }        RS_DEBUG->print("004a");        fprintf(fp, "# LetterSpacing:     %f\n",                g.getVariableDouble("LetterSpacing", 3.0));        fprintf(fp, "# WordSpacing:       %f\n",                g.getVariableDouble("WordSpacing", 6.75));        fprintf(fp, "# LineSpacingFactor: %f\n",                g.getVariableDouble("LineSpacingFactor", 1.0));        RS_String sa = g.getVariableString("Authors", "");        RS_DEBUG->print("authors: %s", (const char*)sa.local8Bit());        if (!sa.isEmpty()) {            RS_StringList authors = RS_StringList::split(',', sa);            RS_DEBUG->print("006");            RS_DEBUG->print("count: %d", authors.count());            RS_String a;            for (RS_StringList::Iterator it2 = authors.begin();                    it2!=authors.end(); ++it2) {                RS_DEBUG->print("006a");                a = RS_String(*it2);                RS_DEBUG->print("006b");                RS_DEBUG->print("string is: %s", a.ascii());                RS_DEBUG->print("006b0");                fprintf(fp, "# Author:            ");                RS_DEBUG->print("006b1");                fprintf(fp, "%s\n", a.ascii());                //fout << "# Author:            " << a.ascii() << "\n";            }            RS_DEBUG->print("007");        }        RS_DEBUG->print("RS_FilterCXF::fileExport: header: OK");        RS_DEBUG->print("008");        // 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);            RS_DEBUG->print("001");            if (blk!=NULL) {                RS_DEBUG->print("002");                RS_DEBUG->print("002a: %s",                                (const char*)(blk->getName().local8Bit()));                fprintf(fp, "\n%s\n",                        (const char*)(blk->getName().local8Bit()));                // iterate through entities of this letter:                for (RS_Entity* e=blk->firstEntity(RS2::ResolveAll);                        e!=NULL;                        e=blk->nextEntity(RS2::ResolveAll)) {                    if (!e->isUndone()) {                        RS_DEBUG->print("004");                        // lines:                        if (e->rtti()==RS2::EntityLine) {                            RS_Line* l = (RS_Line*)e;                            fprintf(fp, "L %f,%f,%f,%f\n",                                    l->getStartpoint().x,                                    l->getStartpoint().y,                                    l->getEndpoint().x,                                    l->getEndpoint().y);                        }                        // arcs:                        else if (e->rtti()==RS2::EntityArc) {                            RS_Arc* a = (RS_Arc*)e;                            if (!a->isReversed()) {                                fprintf(fp, "A ");                            } else {                                fprintf(fp, "AR ");                            }                            fprintf(fp, "%f,%f,%f,%f,%f\n",                                    a->getCenter().x,                                    a->getCenter().y,                                    a->getRadius(),                                    a->getAngle1()*ARAD,                                    a->getAngle2()*ARAD);                        }                        // Ignore entities other than arcs / lines                        else {}                    }                    RS_DEBUG->print("005");                }                RS_DEBUG->print("006");            }            RS_DEBUG->print("007");        }        //fout.close();        fclose(fp);    	RS_DEBUG->print("CXF Filter: exporting file: OK");		return true;    }	else {    	RS_DEBUG->print("CXF Filter: exporting file failed");	}	return false;}/** * Streams a double value to the gien stream cutting away trailing 0's. * * @param value A double value. e.g. 2.700000 */void RS_FilterCXF::stream(std::ofstream& fs, double value) {    fs << (const char*)RS_Utility::doubleToString(value);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -