/** * \brief Charge un espace de travail * \details Charge un espace de travail. Si le dossier spécifié n'était pas un espace de travail, ce dernier est transformé en espace de travail * \param path chemin vers le dosier de l'espace de travail */ void Workspace::load(const QString& path){ clear(); wspath = path; QFile xml_doc(path + "\\.workspace"); if(xml_doc.exists()){ if(!xml_doc.open(QIODevice::ReadOnly)){ xml_doc.close(); NoteException ne("Le fichier .workspace n'a pas pu être ouvert."); throw ne; } if (!dom->setContent(&xml_doc)){ xml_doc.close(); NoteException ne("Le fichier .workspace est corrompu."); throw ne; } loadMaps(); check(); xml_doc.close(); } else { // create the .workspace file xml_doc.open(QIODevice::ReadWrite); QTextStream out(&xml_doc); out.setCodec("UTF-8"); out << "<?xml version='1.0' encoding='UTF-8'?>\n<workspace>\n <notes></notes>\n <trash_notes></trash_notes>\n <tags></tags>\n</workspace>"; xml_doc.close(); dom->setContent(&xml_doc); } }
/////////////////////////////////////////////////////////////////////// //! \author BONNIER David //! //! \brief Fonction appeler par tout les contructeurs héritant de la classe (Regle, Equerre, Compas, Crayon). //! //! Fonction qui initialise toutes les données membres d'Instrument avec le XML. //! Nom des fichiers XML données dans les constructeurs spécifiques des classes filles. //! Les 3 paramètres avant de l'appeler sont : m_nomFichierXML, m_nomDocument, m_nomElement. //! //! \date 01/02/2014 /////////////////////////////////////////////////////////////////////// void Instrument::Initialisation() { QFile xml_doc(*m_nomFichierXML);// On choisit le fichier contenant les informations XML. if(!xml_doc.open(QIODevice::ReadOnly))// Si l'on n'arrive pas à ouvrir le fichier XML. { QMessageBox::warning(this,"Erreur a l'ouverture du document XML","Le document XML n'a pas pu etre ouvert. Verifiez que le nom est le bon et que le document est bien place"); return; } QDomDocument dom(*m_nomDocument); // Création de l'objet DOM if (!dom.setContent(&xml_doc)) // Si l'on n'arrive pas à associer le fichier XML à l'objet DOM. { xml_doc.close(); QMessageBox::warning(this,"Erreur a l'ouverture du document XML","Le document XML n'a pas pu etre attribue a l'objet QDomDocument."); return; } QDomElement dom_element = dom.documentElement(); QDomNode noeud = dom_element.firstChild(); while(!noeud.isNull()) //Parours du fichier { QDomElement element = noeud.toElement(); // On utilise cette propriété afin de transformer le nœud en éléments. //Cela nous permet aussi de récupérer l'élément ou nœud courant. if(!element.isNull()) //S'il y a un élément dans le noeud { //Boolean if (element.tagName() == "transparence") m_transparence = element.text().toInt(); if (element.tagName() == "moveSelected") m_moveSelected = element.text().toInt(); if (element.tagName() == "rotateSelected") m_rotateSelected = element.text().toInt(); //Variable if (element.tagName() == "positionX") m_position.setX(element.text().toInt()); if (element.tagName() == "positionY") m_position.setY(element.text().toInt()); if (element.tagName() == "angle") m_angle = element.text().toDouble(); if (element.tagName() == "offsetX") m_offset.setX(element.text().toInt()); if (element.tagName() == "offsetY") m_offset.setY(element.text().toInt()); if (element.tagName() == "posClicX") m_posClic.setX(element.text().toInt()); if (element.tagName() == "posClicY") m_posClic.setY(element.text().toInt()); //Constantes if (element.tagName() == "longueur") m_longueur = element.text().toInt(); if (element.tagName() == "largeur") m_largeur = element.text().toInt(); } noeud = noeud.nextSibling(); //Ce code permet d'aller à l'élément suivant. } xml_doc.close(); m_ecartSelected = false; m_traceSelected = false; }
/** * \brief Fill the QDomDocument with the data of a XML file. * \author Jules Gorny - ALCoV team, ISIT, UMR 6284 UdA – CNRS * \param doc : QDomDocument to fill * \param xmlPath : path of the file of data */ void fillDomDocFromXmlFile(QDomDocument &doc, QString xmlPath, Ui::MainWindow *ui) { doc = QDomDocument(); QFile xml_doc(xmlPath); if( xml_doc.open(QIODevice::ReadOnly) ) { if ( !doc.setContent(&xml_doc) ) addProgressMessage(ui,"QDomDocument can't manage to read the XML file.\n", Qt::red, "", true); } else addProgressMessage(ui,"XML file can't be open.\n", Qt::red, "", true); xml_doc.close(); }
void xml::ouvrir_xml(QString fichier_xml, QString path_xml, QDomDocument *xml) { QFile xml_doc(path_xml + fichier_xml + ".xml");// On choisit le fichier contenant les informations XML. if(!xml_doc.open(QIODevice::ReadOnly))// Si l'on n'arrive pas à ouvrir le fichier XML. { QMessageBox::warning(this,"Erreur à l'ouverture du document XML","Le document XML n'a pas pu être ouvert. Vérifiez que le nom est le bon et que le document est bien placé :\n Chemin du fichier :" + path_xml + fichier_xml + ".xml"); return; } if (!xml->setContent(&xml_doc)) // Si l'on n'arrive pas à associer le fichier XML à l'objet DOM. { xml_doc.close(); QMessageBox::warning(this,"Erreur à l'ouverture du document XML","Le document XML n'a pas pu être attribué à l'objet QDomDocument."); return; } xml_doc.close(); // Dans tous les cas, on doit fermer le document XML : on n'en a plus besoin, tout est compris dans l'objet DOM. }
void Scene::read(const char *filename) { QString path; if(!filename) path = QString("./data/scenes/open/"); else path = "./data/scenes/"+QString(filename)+"/"; //Parsing XML document. QDomDocument dom("config"); QFile xml_doc(path+"config.xml"); if(!xml_doc.open(QIODevice::ReadOnly)) { QMessageBox::warning(NULL, QString("Read ")+filename+QString(" config"), QString("Can't open the file config.xml of ")+filename); return; } if (!dom.setContent(xml_doc.readAll())) { xml_doc.close(); QMessageBox::warning(NULL, QString("Read ")+filename+QString(" config"), "Le document XML n'a pas pu être attribué à l'objet QDomDocument."); return; } xml_doc.close(); //Count layers QDomNode node = dom.documentElement().firstChild(); while(!node.isNull()) { QDomElement element = node.toElement(); if(element.tagName() == "layer") m_nbLayer++; if(element.tagName() == "copy") m_nbCopy++; node = node.nextSibling(); } //Init new layers & copyers m_layer = new Layer[m_nbLayer]; for(int i=0; i<m_nbLayer; i++) { m_layer[i].shader = NULL; m_layer[i].buffer = NULL; m_layer[i].backBuffer = NULL; m_layer[i].tmpBuffer = NULL; m_layer[i].mode = DEFAULT; for(int j=0; j<4; j++) { m_layer[i].channel[j] = NULL; } } m_copy = new Copy[m_nbCopy]; for(int i=0; i<m_nbCopy; i++) { m_copy[i].src = NULL; m_copy[i].dest = NULL; } //Read the xml file node = dom.documentElement().firstChild(); int textureID=0; while(!node.isNull()) { QDomElement element = node.toElement(); if(element.tagName() == "copy") { int id = element.attribute("id", "0").toInt(); int src = element.attribute("src", "0").toInt(); int dest = element.attribute("dest", "0").toInt(); m_copy[id].src = m_layer[src].buffer; m_copy[id].dest = m_layer[dest].backBuffer; } else if(element.tagName() == "layer") { //Get infos .. int id = element.attribute("id", "0").toInt(); QString format = element.attribute("format", "rgba"); QString blend = element.attribute("mode", "default"); m_layer[id].width = element.attribute("width", "-1").toInt(); m_layer[id].height = element.attribute("height", "-1").toInt(); QString type = element.attribute("type", "pixel"); if(type == "pixel") m_layer[id].type = PIXEL; else if(type == "particle") { m_layer[id].type = PARTICLE; m_nbParticles = element.attribute("count", "0").toInt(); generateParticles(); } m_layer[id].iterate = element.attribute("iterate", "0").toInt(); if(m_layer[id].width == -1) m_layer[id].width = Core::instance()->getResX(); if(m_layer[id].height == -1) m_layer[id].height = Core::instance()->getResY(); if(blend != "default") { m_layer[id].tmpBuffer = new FBO(); m_layer[id].tmpBuffer->setSize(m_layer[id].width, m_layer[id].height); } //Select format GLint bufferFormat = GL_RGBA; if(format == "rgb") bufferFormat = GL_RGB; else if(format == "rgba") bufferFormat = GL_RGBA; else if(format == "rgba32") bufferFormat = GL_RGBA32F_ARB; //work ? else if(format == "rgba32") bufferFormat = GL_RGBA32F_ARB; //work ? else if(format == "rgba32half") bufferFormat = GL_RGBA16F_ARB; //work ? else if(format == "luminance") bufferFormat = GL_LUMINANCE; else QMessageBox::warning(NULL, QString("Scene ")+filename, QString("This layer format doesn't exist : ")+format); //Select mode if(blend == "default") m_layer[id].mode = DEFAULT; else if(blend == "alpha") m_layer[id].mode = BLEND_ALPHA; else if(blend == "add") m_layer[id].mode = BLEND_ADD; else if(blend == "none") m_layer[id].mode = NONE; else QMessageBox::warning(NULL, QString("Scene ")+filename, QString("This layer mode doesn't exist : ")+blend); //Compute shader QString filePath = element.attribute("value", "none"); m_layer[id].name = filePath; int ok; if(filePath != "none") { QFile file(path+filePath); QString strings; if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); while (!in.atEnd()) { strings += in.readLine()+"\n"; } } Core::instance()->writeInfo( QString("Compiling ") + m_layer[id].name + QString(".. ") ); m_layer[id].shader = new Shader(); if( m_layer[id].type == PIXEL) ok = m_layer[id].shader->compil(Core::instance()->getVertexShader(),strings.toStdString().c_str()); else if( m_layer[id].type == PARTICLE) ok = m_layer[id].shader->compil(Core::instance()->getVertexShaderParticle(),strings.toStdString().c_str()); if(ok == SHADER_SUCCESS) Core::instance()->writeInfo( QString("[Done]\n"), false ); file.close(); } //Generate buffers ! if(ok == SHADER_SUCCESS) { m_layer[id].buffer = new FBO(); m_layer[id].buffer->setSize(m_layer[id].width, m_layer[id].height); m_layer[id].buffer->setFormat(bufferFormat); if(element.attribute("backbuffer", "false") == "true" || m_layer[id].iterate > 0) { m_layer[id].backBuffer = new FBO(); m_layer[id].backBuffer->setSize(m_layer[id].width, m_layer[id].height); m_layer[id].backBuffer->setFormat(bufferFormat); } } else { return; } //Load channel textureID=0; QDomNode n = element.firstChild(); while(!n.isNull()) { QDomElement e = n.toElement(); if(e.tagName() == "channel") { if(textureID<4) { m_layer[id].channelName[textureID] = e.attribute("id", "tex"); if( e.attribute("type", "") == "image" ) { m_layer[id].channel[textureID] = new Texture(); m_layer[id].channel[textureID]->load("./data/textures/"+e.attribute("value", "none").toStdString()); } else if( e.attribute("type", "") == "layer" ) { m_layer[id].channel[textureID] = m_layer[e.attribute("value", "0").toInt()].buffer; m_layer[e.attribute("value", "0").toInt()].buffer->bind(); } textureID++; } else QMessageBox::warning(NULL, QString("Read ")+filename+QString(" config"), QString("Too many textures (max is 4)")); } n = n.nextSibling(); } } else if(element.tagName() == "param") { m_param[element.attribute("id", "0").toInt()] = element.attribute("value","none"); } node = node.nextSibling(); } }