DPsim
Loading...
Searching...
No Matches
Graph.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2017-2021 Institute for Automation of Complex Power Systems,
3 * EONERC, RWTH Aachen University
4 * SPDX-License-Identifier: MPL-2.0
5 */
6
7#include <cstddef>
8
9#include <graphviz/gvc.h>
10
11#include <dpsim-models/Config.h>
12#include <dpsim-models/Graph.h>
13
14using namespace CPS;
15using namespace CPS::Graph;
16
17CPS::Graph::Graph::Graph(const CPS::String &name, Type type, bool strict) {
18 Agdesc_t desc;
19
20 switch (type) {
21 case Type::directed:
22 desc = strict ? Agstrictdirected : Agdirected;
23 break;
24
26 desc = strict ? Agstrictundirected : Agundirected;
27 break;
28 }
29
30 mGraph = agopen((char *)name.c_str(), desc, NULL);
31 mPtr = mGraph;
32 mKind = AGRAPH;
33}
34
36
37void CPS::Graph::Graph::render(std::ostream &os, const CPS::String &layout,
38 const CPS::String &format) {
39 GVC_t *gvc;
40 char *data;
41
42#ifdef GRAPHVIZ_RENDERDATA_USES_SIZE_T
43 std::size_t len;
44#else
45 unsigned int len;
46#endif
47
48 gvc = gvContext();
49
50 gvLayout(gvc, mGraph, layout.c_str());
51 gvRenderData(gvc, mGraph, format.c_str(), &data, &len);
52
53 os.write(data, static_cast<std::streamsize>(len));
54
55 gvFreeRenderData(data);
56 gvFreeLayout(gvc, mGraph);
57
58 gvFreeContext(gvc);
59}
60
62 auto n = new Node(this, name);
63
64 mNodes[name] = n;
65
66 return n;
67}
68
70 Node *tail) {
71 auto e = new Edge(this, name, head, tail);
72
73 mEdges[name] = e;
74
75 return e;
76}
77
78Node *CPS::Graph::Graph::node(const CPS::String &name) { return mNodes[name]; }
79
80Edge *CPS::Graph::Graph::edge(const CPS::String &name) { return mEdges[name]; }
81
82void CPS::Graph::Element::set(const CPS::String &key, const CPS::String &value,
83 bool html) {
84 Agraph_t *g = agraphof(mPtr);
85
86 char *d = (char *)"";
87 char *k = (char *)key.c_str();
88 char *v = (char *)value.c_str();
89 char *vd = html ? agstrdup_html(g, v) : agstrdup(g, v);
90
91 agsafeset(mPtr, k, vd, d);
92}
93
95 mNode = agnode(g->mGraph, (char *)name.c_str(), 1);
96
97 mPtr = mNode;
98 mKind = AGNODE;
99}
100
102 Node *tail) {
103 mEdge = agedge(g->mGraph, head->mNode, tail->mNode, (char *)name.c_str(), 1);
104
105 mPtr = mEdge;
106 mKind = AGEDGE;
107}
Edge(Graph *g, const String &name, Node *head, Node *tail)
Definition Graph.cpp:101
Agedge_t * mEdge
Definition Graph.h:43
void set(const String &key, const String &value, bool html=false)
Definition Graph.cpp:82
Edge * addEdge(const String &name, Node *head, Node *tail)
Definition Graph.cpp:69
Edge * edge(const String &name)
Definition Graph.cpp:80
std::map< String, Edge * > mEdges
Definition Graph.h:53
Agraph_t * mGraph
Definition Graph.h:56
Node * node(const String &name)
Definition Graph.cpp:78
std::map< String, Node * > mNodes
Definition Graph.h:52
Node * addNode(const String &name)
Definition Graph.cpp:61
Graph(const String &name, Type type, bool strict=false)
Definition Graph.cpp:17
void render(std::ostream &os, const String &layout="dot", const String &format="svg")
Definition Graph.cpp:37
Agnode_t * mNode
Definition Graph.h:36
Node(Graph *g, const String &name)
Definition Graph.cpp:94
struct dps_magma_data data
std::string String
Definition Definitions.h:63