static inline void writeAttributes( std::ostream &out, const int &depth, const ClusterGraphAttributes &CA, const cluster &c) { GraphIO::indent(out, depth) << "color=\"" << CA.strokeColor(c) << "\"\n"; GraphIO::indent(out, depth) << "bgcolor=\"" << CA.fillColor(c) << "\"\n"; GraphIO::indent(out, depth) << "label=\"" << CA.label(c) << "\"\n"; // There is no point in exporting rest of the cluster attributes, so to // maintain high readability they are omitted. }
bool GraphMLParser::readData( ClusterGraphAttributes &CA, const cluster &c, const pugi::xml_node clusterData) { auto keyId = clusterData.attribute("key"); if (!keyId) { GraphIO::logger.lout() << "Cluster data does not have a key." << endl; return false; } pugi::xml_text text = clusterData.text(); using namespace graphml; switch (toAttribute(m_attrName[keyId.value()])) { case a_nodeLabel: CA.label(c) = text.get(); break; case a_x: CA.x(c) = text.as_double(); break; case a_y: CA.y(c) = text.as_double(); break; case a_width: CA.width(c) = text.as_double(); break; case a_height: CA.height(c) = text.as_double(); break; case a_size: // We want to set a new size only if width and height was not set. if (CA.width(c) == CA.height(c)) { CA.width(c) = CA.height(c) = text.as_double(); } case a_r: if (!GraphIO::setColorValue(text.as_int(), [&](uint8_t val) { CA.fillColor(c).red(val); })) { return false; } break; case a_g: if (!GraphIO::setColorValue(text.as_int(), [&](uint8_t val) { CA.fillColor(c).green(val); })) { return false; } break; case a_b: if (!GraphIO::setColorValue(text.as_int(), [&](uint8_t val) { CA.fillColor(c).blue(val); })) { return false; } break; case a_clusterStroke: CA.strokeColor(c) = text.get(); break; default: GraphIO::logger.lout(Logger::LL_MINOR) << "Unknown cluster attribute with \"" << keyId.value() << "--enum: " << m_attrName[keyId.value()] << "--" << "\"." << endl; } return true; }
// write cluster layout with attributes static void write_ogml_layout(const ClusterGraphAttributes &A, ostream &os) { const ClusterGraph &C = A.constClusterGraph(); GraphIO::indent(os,2) << "<layout>\n"; GraphIO::indent(os,3) << "<styles>\n"; for(cluster c : C.clusters) { if(c != C.rootCluster()) { GraphIO::indent(os,4) << "<nodeStyle idRef=\"c" << c->index() << "\">\n"; GraphIO::indent(os,5) << "<location x=\"" << A.x(c) << "\" y=\"" << A.y(c) << "\" />\n"; GraphIO::indent(os,5) << "<shape type=\"rect\" width=\"" << A.width(c) << "\" height=\"" << A.height(c) << "\" />\n"; GraphIO::indent(os,5) << "<fill color=\"" << A.fillColor(c) << "\"" << " pattern=\"" << fillPatternToOGML(A.fillPattern(c)) << "\" patternColor=\"" << A.fillBgColor(c) << "\" />\n"; GraphIO::indent(os,5) << "<line type=\"" << edgeStyleToOGML(A.strokeType(c)) << "\" width=\"" << A.strokeWidth(c) << "\" color=\"" << A.strokeColor(c) << "\" />\n"; GraphIO::indent(os,4) << "</nodeStyle>\n"; } } write_ogml_layout_nodes_edges(A,os); GraphIO::indent(os,3) << "</styles>\n"; GraphIO::indent(os,2) << "</layout>\n"; }
bool GmlParser::readClusterAttributes( GmlObject* cGraphics, cluster c, ClusterGraphAttributes& ACG) { string label; string fill; // the fill color attribute string line; // the line color attribute float lineWidth = 1.0f; //node line width int pattern = 1; //node brush pattern int stipple = 1; //line style pattern // read all relevant attributes GmlObject *graphicsObject = cGraphics->m_pFirstSon; for(; graphicsObject; graphicsObject = graphicsObject->m_pBrother) { switch(id(graphicsObject)) { case xPredefKey: if(graphicsObject->m_valueType != gmlDoubleValue) return false; ACG.x(c) = graphicsObject->m_doubleValue; break; case yPredefKey: if(graphicsObject->m_valueType != gmlDoubleValue) return false; ACG.y(c) = graphicsObject->m_doubleValue; break; case widthPredefKey: if(graphicsObject->m_valueType != gmlDoubleValue) return false; ACG.width(c) = graphicsObject->m_doubleValue; break; case heightPredefKey: if(graphicsObject->m_valueType != gmlDoubleValue) return false; ACG.height(c) = graphicsObject->m_doubleValue; break; case fillPredefKey: if(graphicsObject->m_valueType != gmlStringValue) return false; ACG.fillColor(c) = graphicsObject->m_stringValue; break; case patternPredefKey: if(graphicsObject->m_valueType != gmlIntValue) return false; pattern = graphicsObject->m_intValue; break; //line style case colorPredefKey: // line color if(graphicsObject->m_valueType != gmlStringValue) return false; ACG.strokeColor(c) = graphicsObject->m_stringValue; break; case stipplePredefKey: if(graphicsObject->m_valueType != gmlIntValue) return false; stipple = graphicsObject->m_intValue; break; case lineWidthPredefKey: if(graphicsObject->m_valueType != gmlDoubleValue) return false; lineWidth = (float)graphicsObject->m_doubleValue; break; //TODO: backgroundcolor //case stylePredefKey: //case boderwidthPredefKey: }//switch }//for //Hier eigentlich erst abfragen, ob clusterattributes setzbar in ACG, //dann setzen ACG.setStrokeType(c, intToStrokeType(stipple)); //defaulting 1 ACG.strokeWidth(c) = lineWidth; ACG.setFillPattern(c, intToFillPattern(pattern)); return true; }//readclusterattributes