6 * $Date: 2012-07-11 08:08:37 +0200 (Mi, 11. Jul 2012) $
7 ***************************************************************/
10 * \brief Declaration of class PlanRepUML.
12 * \author Carsten Gutwenger
15 * This file is part of the Open Graph Drawing Framework (OGDF).
19 * See README.txt in the root directory of the OGDF installation for details.
22 * This program is free software; you can redistribute it and/or
23 * modify it under the terms of the GNU General Public License
24 * Version 2 or 3 as published by the Free Software Foundation;
25 * see the file LICENSE.txt included in the packaging of this file
29 * This program is distributed in the hope that it will be useful,
30 * but WITHOUT ANY WARRANTY; without even the implied warranty of
31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 * GNU General Public License for more details.
35 * You should have received a copy of the GNU General Public
36 * License along with this program; if not, write to the Free
37 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
38 * Boston, MA 02110-1301, USA.
40 * \see http://www.gnu.org/copyleft/gpl.html
41 ***************************************************************/
48 #ifndef OGDF_PLAN_REP_UML_H
49 #define OGDF_PLAN_REP_UML_H
53 #include <ogdf/planarity/PlanRep.h>
54 #include <ogdf/basic/UMLGraph.h>
56 #include <ogdf/planarity/EdgeTypePatterns.h>
57 #include <ogdf/planarity/NodeTypePatterns.h>
64 class GridLayoutMapped
;
68 //---------------------------------------------------------
70 // Planarized representation (of a connected component)
71 // of a UMLGraph; allows special handling of hierarchies
73 //---------------------------------------------------------
74 class OGDF_EXPORT PlanRepUML
: public PlanRep
{
78 PlanRepUML(const UMLGraph
¨Graph
);
79 PlanRepUML(const GraphAttributes
&GA
);
86 // Returns true if an edge splits a face into two subfaces to
87 // guarantee generalizations to be on opposite sides of a node.
88 bool faceSplitter(edge e
) const{
89 return m_faceSplitter
[e
];
92 // Removes all face splitting edges.
93 void removeFaceSplitter(){
95 forall_edges(e
,(*this))
96 if (m_faceSplitter
[e
])
100 //-------------------
101 //incremental drawing
102 //-------------------
103 //initialize incremental stuff, e.g. insert incremental mergers
104 void setupIncremental(int indexCC
, CombinatorialEmbedding
&E
);
105 //Return the list of inserted incremental mergers
106 const SList
<node
>& incrementalMergers(int indexCC
) const { return m_incMergers
[indexCC
]; }
109 //**********************************************************
112 //the edges that are embedded next to outgoing generalizations if alignment set
113 //attention: this information is NOT updated during graph changes and only
114 //to be used during the embedding phase
115 bool alignUpward(adjEntry ae
) {return m_alignUpward
[ae
];}
116 void alignUpward(adjEntry ae
, bool b
) {m_alignUpward
[ae
] = b
;}
119 //*************************************************************************
122 const UMLGraph
&getUMLGraph() const {
126 //*************************************************************************
127 //structural alterations
129 // inserts a generalization merge node for all incoming
130 // generalizations of v and returns it
131 //conserving embedding
132 node
insertGenMerger(node v
, const SList
<edge
> &inGens
,
133 CombinatorialEmbedding
&E
);
135 // Expands nodes with degree > 4 and merge nodes for generalizations
136 void expand(bool lowDegreeExpand
= false);
138 //expands nodes with degree <= 4 and aligns opposite edges at degree 2 nodes
139 void expandLowDegreeVertices(OrthoRep
&OR
, bool alignSmallDegree
= false);
141 void collapseVertices(const OrthoRep
&OR
, Layout
&drawing
);
143 //*************************************************************************
147 // extension of methods defined by GraphCopy/PlanRep
151 virtual edge
split(edge e
) {
153 edge eNew
= PlanRep::split(e
);
156 if (m_alignUpward
[e
->adjSource()]) m_alignUpward
[eNew
->adjSource()] = true;
157 if (m_alignUpward
[e
->adjTarget()]) m_alignUpward
[eNew
->adjTarget()] = true;
163 // writes attributed graph in GML format to file fileName
164 // For Debugging only
165 void writeGML(const char *fileName
, const Layout
&drawing
);
166 void writeGML(const char *fileName
);
167 void writeGML(const char *fileName
, GraphAttributes
&AG
);
169 // writes attributed graph in GML format to output stream os
170 // For Debugging only
171 void writeGML(ostream
&os
, const Layout
&drawing
);
172 void writeGML(const char *fileName
, const OrthoRep
&OR
, const Layout
&drawing
);
173 void writeGML(ostream
&os
, const OrthoRep
&OR
, const Layout
&drawing
);
174 void writeGML(const char *fileName
, const OrthoRep
&OR
, const GridLayoutMapped
&drawing
);
175 void writeGML(ostream
&os
, const OrthoRep
&OR
, const GridLayoutMapped
&drawing
);
179 //insert mergers of generalizations in copy
180 void prepareIncrementalMergers(int indexCC
, CombinatorialEmbedding
&E
);
184 //still some AdjEntry type: used by alignment procedures
185 //attention: this information is NOT updated during graph changes and only
186 //to be used during the embedding phase
187 AdjEntryArray
<bool> m_alignUpward
;
190 const UMLGraph
*m_pUmlGraph
;
192 EdgeArray
<bool> m_faceSplitter
;
194 SListPure
<edge
> m_mergeEdges
;
195 Array
< SList
<node
> > m_incMergers
; //stores all incremental mergers in CC
199 } // end namespace ogdf