Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00045 #ifdef _MSC_VER
00046 #pragma once
00047 #endif
00048
00049
00050 #ifndef OGDF_ORTHO_FORMER_GENERIC_H
00051 #define OGDF_ORTHO_FORMER_GENERIC_H
00052
00053
00054 #include <ogdf/orthogonal/OrthoRep.h>
00055 #include <ogdf/planarity/PlanRepUML.h>
00056
00057
00058 namespace ogdf {
00059
00060 const bool angleMaxBound = true;
00061 const bool angleMinBound = false;
00062
00063 class OGDF_EXPORT OrthoShaper
00064 {
00065 public:
00066
00067 enum n_type {low, high, inner, outer};
00068
00069
00070 OrthoShaper() {
00071 setDefaultSettings();
00072 };
00073
00074 ~OrthoShaper() {};
00075
00076
00077
00078
00079
00080
00081
00082 void call(PlanRepUML &PG,
00083 CombinatorialEmbedding &E,
00084 OrthoRep &OR,
00085 bool fourPlanar = true) throw(AlgorithmFailureException);
00086
00087
00088 void setDefaultSettings()
00089 {
00090 m_distributeEdges = true;
00091 m_fourPlanar = true;
00092 m_allowLowZero = false;
00093 m_multiAlign = true;
00094 m_traditional = true;
00095 m_deg4free = false;
00096 m_align = false;
00097 m_startBoundBendsPerEdge = 0;
00098 }
00099
00100
00101 bool distributeEdges() { return m_distributeEdges; }
00102
00103 void distributeEdges(bool b) { m_distributeEdges = b; }
00104
00105
00106 bool multiAlign() { return m_multiAlign; }
00107
00108 void multiAlign(bool b) { m_multiAlign = b; }
00109
00110
00111 bool traditional() { return m_traditional; }
00112
00113 void traditional(bool b) { m_traditional = b; }
00114
00115
00116 bool fixDegreeFourAngles() { return m_deg4free; }
00117
00118 void fixDegreeFourAngles(bool b) { m_deg4free = b; }
00119
00120
00121 void align(bool al) {m_align = al;}
00122 bool align() {return m_align;}
00123
00126 void setBendBound(int i){ OGDF_ASSERT(i >= 0); m_startBoundBendsPerEdge = i;}
00127 int getBendBound(){return m_startBoundBendsPerEdge;}
00128
00129 private:
00130 bool m_distributeEdges;
00131 bool m_fourPlanar;
00132
00133 bool m_allowLowZero;
00134
00135 bool m_multiAlign;
00136 bool m_deg4free;
00137 bool m_traditional;
00138
00139
00140
00141
00142 bool m_align;
00143
00144
00145
00146
00147
00148
00149
00150
00151 int m_startBoundBendsPerEdge;
00152
00153
00154
00155
00156 void setAngleBound(edge netArc, int angle, EdgeArray<int>& lowB,
00157 EdgeArray<int>& upB, EdgeArray<edge>& aTwin, bool maxBound = true)
00158 {
00159
00160 OGDF_ASSERT(!m_traditional);
00161 if (m_traditional)
00162 {
00163 switch (angle)
00164 {
00165 case 0:
00166 case 90:
00167 case 180:
00168 break;
00169 OGDF_NODEFAULT
00170 }
00171 }
00172 else
00173 {
00174 switch (angle)
00175 {
00176 case 0: if (maxBound)
00177 {
00178 upB[netArc] = lowB[netArc] = 2;
00179 edge e2 = aTwin[netArc];
00180 if (e2)
00181 {
00182 upB[e2] = lowB[e2] = 0;
00183 }
00184 }
00185 else
00186 {
00187 upB[netArc] = 2; lowB[netArc] = 0;
00188 edge e2 = aTwin[netArc];
00189 if (e2)
00190 {
00191 upB[e2] = 2;
00192 lowB[e2] = 0;
00193 }
00194
00195 }
00196 break;
00197 case 90:
00198 if (maxBound)
00199 {
00200 lowB[netArc] = 1;
00201 upB[netArc] = 2;
00202 edge e2 = aTwin[netArc];
00203 if (e2)
00204 {
00205 upB[e2] = lowB[e2] = 0;
00206 }
00207 }
00208 else
00209 {
00210 upB[netArc] = 1;
00211 lowB[netArc] = 0;
00212 edge e2 = aTwin[netArc];
00213 if (e2)
00214 {
00215 upB[e2] = 2;
00216 lowB[e2] = 0;
00217 }
00218
00219 }
00220 break;
00221 case 180:
00222 if (maxBound)
00223 {
00224 lowB[netArc] = 0;
00225 upB[netArc] = 2;
00226 edge e2 = aTwin[netArc];
00227 if (e2)
00228 {
00229 upB[e2] = lowB[e2] = 0;
00230 }
00231 }
00232 else
00233 {
00234 upB[netArc] = 0;
00235 lowB[netArc] = 0;
00236 edge e2 = aTwin[netArc];
00237 if (e2)
00238 {
00239 upB[e2] = 2;
00240 lowB[e2] = 0;
00241 }
00242
00243 }
00244 break;
00245 OGDF_NODEFAULT
00246 }
00247 }
00248
00249 }
00250 };
00251
00252
00253 }
00254
00255
00256 #endif