NEI.tex 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. % --------------------------------------------------------------------------
  2. %
  3. % Programming the NEI
  4. %
  5. % --------------------------------------------------------------------------
  6. %\documentclass[12pt,a4paper]{report}
  7. %\usepackage{epsf,amstex,epic}
  8. \documentclass[twoside,fleqn]{report}
  9. \usepackage{Graphlet,epic}
  10. %\usepackage{epsf,amstex,epic}
  11. \begin{document}
  12. \setlength{\parindent}{0pt}
  13. \sloppy
  14. % --------------------------------------------------------------------------
  15. % Begin document
  16. % --------------------------------------------------------------------------
  17. \input{Config.tex}
  18. \tableofcontents
  19. \chapter{Node Edge Interface}
  20. \Graphlet{} has a new Node Edge Interface (NEI).
  21. This section describes how a programmer can use it.
  22. % --------------------------------------------------------------------------
  23. % The idea for the edgeanchors
  24. % --------------------------------------------------------------------------
  25. \section{Basic Concept}
  26. \label{chap:ea_introduction}
  27. The basic idea for our NEI are edgeanchors.
  28. An edgeanchor is a theoretical endpoint of the edge. It is placed
  29. inside the rectangle surrounding each node.
  30. There are two edgeanchors for every edge: One for the source, the other
  31. for the target.
  32. The edge is clipped at the border of the node each time the node is
  33. redrawn.\\
  34. The edgeanchors don't have absolute coordinates. They are set
  35. relativly to the node center.
  36. The distances to the nodecenter are given as factors of the
  37. height and width of the node.
  38. Thus, one edgeanchor for source or target consists of two real values
  39. between -1 and 1. From now on we will call these two values
  40. \emph{delta$_x$} and \emph{delta$_y$}.\\
  41. An edgeanchor can either be set to an certain value by the user
  42. or to a default function, which is executed each time an edge has to be
  43. redrawn.
  44. %The advantage of this idea is the independence from
  45. %changes of the size, style and position of a node.\\
  46. %We have a set of predefined functions to manipulate the edgeanchors.
  47. %You can apply them once to an edge to change the edgeanchor.
  48. %We also allow to take some of this functions as a kind of 'hook up'.
  49. %This means, that the function is executed each time an edge has
  50. %to be redrawn. In this case the function changes the edgeanchor each time
  51. %the edge is redrawn.
  52. %The actual hook up function is called the default function.
  53. \textbf{Note:}
  54. %We have default functions for nodes and edges.
  55. It is possible to specify default functions for nodes (they influence the edgeanchors
  56. of all adjacent edges) and edges.
  57. The default function for an edge has always priority over the default
  58. function for adjacent nodes.
  59. % --------------------------------------------------------------------------
  60. % If I have the nodeposition and the edgeanchor:
  61. % How can I get the edgerouting?
  62. % --------------------------------------------------------------------------
  63. \section{The Edge Routing for a Given Edgeanchor}
  64. Suppose you have a node at (
  65. \emph{x},
  66. \emph{y}) with width
  67. \emph{w} and height
  68. \emph{h}.
  69. The edgeanchor is set to (\emph{delta$_x$}, \emph{delta$_y$}).
  70. % Picture of example (nei_example.fig)
  71. %\setlength{\unitlength}{0.00041667in}
  72. \begin{center}
  73. \setlength{\unitlength}{0.00026667in}
  74. %
  75. \begingroup\makeatletter\ifx\SetFigFont\undefined
  76. % extract first six characters in \fmtname
  77. \def\x#1#2#3#4#5#6#7\relax{\def\x{#1#2#3#4#5#6}}%
  78. \expandafter\x\fmtname xxxxxx\relax \def\y{splain}%
  79. \ifx\x\y % LaTeX or SliTeX?
  80. \gdef\SetFigFont#1#2#3{%
  81. \ifnum #1<17\tiny\else \ifnum #1<20\small\else
  82. \ifnum #1<24\normalsize\else \ifnum #1<29\large\else
  83. \ifnum #1<34\Large\else \ifnum #1<41\LARGE\else
  84. \huge\fi\fi\fi\fi\fi\fi
  85. \csname #3\endcsname}%
  86. \else
  87. \gdef\SetFigFont#1#2#3{\begingroup
  88. \count@#1\relax \ifnum 25<\count@\count@25\fi
  89. \def\x{\endgroup\@setsize\SetFigFont{#2pt}}%
  90. \expandafter\x
  91. \csname \romannumeral\the\count@ pt\expandafter\endcsname
  92. \csname @\romannumeral\the\count@ pt\endcsname
  93. \csname #3\endcsname}%
  94. \fi
  95. \fi\endgroup
  96. {\renewcommand{\dashlinestretch}{30}
  97. \begin{picture}(9723,8449)(0,-10)
  98. \drawline(1587,3847)(2037,3397)
  99. \drawline(1587,3397)(2037,3847)
  100. \dottedline{45}(612,8422)(612,1222)
  101. \drawline(1212,7222)(8412,7222)(8412,2422)
  102. (1212,2422)(1212,7222)
  103. \drawline(4587,4822)(5037,4822)
  104. \drawline(4812,5047)(4812,4597)
  105. \dottedline{45}(1812,8422)(1812,1222)
  106. \dottedline{45}(2412,8422)(2412,1222)
  107. \dottedline{45}(3012,8422)(3012,1222)
  108. \dottedline{45}(3612,8422)(3612,1222)
  109. \dottedline{45}(4212,8422)(4212,1222)
  110. \dottedline{45}(5412,8422)(5412,1222)
  111. \dottedline{45}(6012,8422)(6012,1222)
  112. \dottedline{45}(7212,8422)(7212,1222)
  113. \dottedline{45}(7812,8422)(7812,1222)
  114. \dottedline{45}(8412,8422)(8412,1222)
  115. \dottedline{45}(9012,8422)(9012,1222)
  116. \dottedline{45}(12,7822)(9612,7822)
  117. \dottedline{45}(12,6622)(9612,6622)
  118. \dottedline{45}(12,6022)(9612,6022)
  119. \dottedline{45}(12,5422)(9612,5422)
  120. \dottedline{45}(12,4822)(9612,4822)
  121. \dottedline{45}(12,4222)(9612,4222)
  122. \dottedline{45}(12,3622)(9612,3622)
  123. \dottedline{45}(12,3022)(9612,3022)
  124. \dottedline{45}(12,2422)(9612,2422)
  125. \dottedline{45}(12,1822)(9612,1822)
  126. \dottedline{45}(4812,8422)(4812,1222)
  127. \dottedline{45}(6612,8422)(6612,1222)
  128. \drawline(3687,22)(1812,3622)
  129. \drawline(1976.079,3436.857)(1812.000,3622.000)(1869.649,3381.425)
  130. \dottedline{45}(12,7222)(9612,7222)
  131. \dottedline{45}(1212,8422)(1212,1222)
  132. \drawline(4812,2197) (4925.282,2112.097)
  133. (5024.111,2040.257)
  134. (5110.245,1980.380)
  135. (5185.440,1931.369)
  136. (5310.049,1861.546)
  137. (5412.000,1822.000)
  138. \drawline(5412,1822) (5532.532,1811.874)
  139. (5674.325,1833.638)
  140. (5751.189,1851.948)
  141. (5830.960,1872.794)
  142. (5912.836,1894.363)
  143. (5996.014,1914.842)
  144. (6079.691,1932.421)
  145. (6163.066,1945.286)
  146. (6245.335,1951.625)
  147. (6325.695,1949.626)
  148. (6403.345,1937.476)
  149. (6477.481,1913.363)
  150. (6612.000,1822.000)
  151. \drawline(6612,1822) (6635.201,1686.299)
  152. (6612.000,1597.000)
  153. \drawline(6612,1597) (6588.799,1686.299)
  154. (6612.000,1822.000)
  155. \drawline(6612,1822) (6746.688,1914.001)
  156. (6821.008,1938.808)
  157. (6898.884,1951.812)
  158. (6979.495,1954.757)
  159. (7062.020,1949.386)
  160. (7145.639,1937.444)
  161. (7229.531,1920.674)
  162. (7312.875,1900.820)
  163. (7394.851,1879.627)
  164. (7474.637,1858.839)
  165. (7551.413,1840.198)
  166. (7692.651,1816.339)
  167. (7812.000,1822.000)
  168. \drawline(7812,1822) (7909.266,1853.001)
  169. (8032.312,1908.647)
  170. (8107.898,1947.910)
  171. (8195.203,1995.970)
  172. (8295.984,2053.707)
  173. (8412.000,2122.000)
  174. \drawline(8712,7222)
  175. (8782.312,7076.688)
  176. (8843.250,6940.750)
  177. (8894.812,6814.188)
  178. (8937.000,6697.000)
  179. (8969.812,6589.188)
  180. (8993.250,6490.750)
  181. (9007.312,6401.688)
  182. (9012.000,6322.000)
  183. (9021.375,6190.750)
  184. (9049.500,6097.000)
  185. (9162.000,6022.000)
  186. (9162.000,6022.000)
  187. (9049.500,5947.000)
  188. (9021.375,5853.250)
  189. (9012.000,5722.000)
  190. (9008.484,5642.312)
  191. (8997.938,5553.250)
  192. (8980.359,5454.812)
  193. (8955.750,5347.000)
  194. (8924.109,5229.812)
  195. (8885.438,5103.250)
  196. (8839.734,4967.312)
  197. (8787.000,4822.000)
  198. %\put(4962,4372){\makebox(0,0)[lb]{\smash{{{\SetFigFont{14}{16.8}{rm}(x,y)}}}}}
  199. \put(9462,5872){\makebox(0,0)[lb]{\smash{{{\emph{h}}}}}}
  200. \put(6462,1297){\makebox(0,0)[lb]{\smash{{{\emph{w}}}}}}
  201. \put(4962,4372){\makebox(0,0)[lb]{\smash{{{\emph{(x,y)}}}}}}
  202. \put(2112,3697){\makebox(0,0)[lb]{\smash{{{
  203. \emph{(delta$_x$, delta$_y$)}}}}}}
  204. \end{picture}
  205. }
  206. Example for edgeanchor
  207. \end{center}
  208. % End of picture
  209. %\epsfxsize=200pt \epsfbox{nei_example.eps}
  210. What are the values for
  211. \emph{delta$_x$} and
  212. \emph{delta$_y$} in this example?
  213. The edgeanchor is left of the center of the node. The distance is 5/6 of
  214. the nodewidth. Thus
  215. \emph{delta$_x$} is -5/6.
  216. The edgeanchor is 2/4 below the center of the node. Since \Graphlet{}
  217. (and also Tcl/Tk) starts counting coordinates in the upper left corner
  218. we have
  219. \emph{delta$_y$} = 0.5.
  220. Whenever the edge has to be redrawn (e.g. the node has moved) the edge is
  221. clipped at the border of the node.
  222. % --------------------------------------------------------------------------
  223. % --------------------------------------------------------------------------
  224. \section{Example for Changing the Edgeanchor}
  225. \label{example_NEI}
  226. Here is a first example. For the meaning of the functions have a look at
  227. the next sections.
  228. The NEI is implemented in the classes
  229. \GT{Edge\_NEI} and \GT{Node\_NEI}. It is
  230. accessed like all attributes of a node or edge.
  231. Here is a small programm to set all edgeanchors to the center of the
  232. node: (0.0, 0.0).
  233. In addition, the default function both for nodes and edges is set to leave
  234. the edgeanchors unchanged.
  235. \begin{example}{e:SampleClassDeclaration}%
  236. {A sample programm for the use of the NEI}
  237. \begin{verbatim}
  238. #include <gt_base/NEI.h>
  239. int reset_NEIs (GT_Graph &g)
  240. {
  241. GT_Node_NEI *node_nei;
  242. GT_Edge_NEI *edge_nei;
  243. edge e;
  244. node n;
  245. graph *leda_graph = g.attached();
  246. forall_edges (e, *leda_graph) {
  247. edge_nei = g.gt(e).edge_nei();
  248. edge_nei->set_EA (GT_Source, 0.0, 0.0);
  249. edge_nei->set_EA (GT_Target, 0.0, 0.0);
  250. edge_nei->set_EA_default_function (
  251. GT_Keys::empty_function, GT_Source);
  252. edge_nei->set_EA_default_function (
  253. GT_Keys::empty_function, GT_Target);
  254. }
  255. forall_nodes (n, *leda_graph) {
  256. node_nei = g.gt(n).node_nei();
  257. node_nei->set_EA_default_function (
  258. GT_Keys::empty_function);
  259. }
  260. return GT_OK;
  261. }
  262. \end{verbatim}
  263. \end{example}
  264. \textbf{Note:} This function is already implemented.
  265. \CSourceCodeLocation{}{base}{NEI}
  266. \CIncludeStatement{}{base}{NEI}
  267. %This function is already implemented.
  268. %It is defined in
  269. %$<$gt\_base/NEI.h$>$.
  270. % --------------------------------------------------------------------------
  271. % Functions to change the edgeanchors
  272. % --------------------------------------------------------------------------
  273. \section{Functions to Change the Edgeanchor Once}
  274. We devide the functions to change the edgeanchor into two subsets:
  275. One set from the point of view of an edge,
  276. the other set from the point of view of a node.
  277. \textbf{Note:}
  278. This functions are used to change the edgeanchor once.
  279. The edgeanchor won't be changed if the edge is redrawn.
  280. % ----------------------------------------
  281. % ----------------------------------------
  282. \subsection{Functions related to an edge}
  283. There are three functions to change the edgeanchor:
  284. \begin{Cdefinition}
  285. \item[int set\_EA (int \Param{where},
  286. double \Param{delta$_x$}, double \Param{delta$_y$})] \strut \\
  287. \emph{where} is either \emph{GT\_Source} or \emph{GT\_Target}.
  288. It is used to determine whether the anchor is changed at the
  289. source or target of the edge.
  290. The edgeanchor will be set to the relative point
  291. (\emph{delta$_x$}, \emph{delta$_y$}).
  292. The return value is \emph{GT\_ERROR} if \emph{delta$_x$} or
  293. \emph{delta$_y$} is not between -1 and 1.
  294. Otherwise the return value is \emph{GT\_OK}.
  295. \item[int set\_EA (int \Param{where}, GT\_Key \Param{key})] \strut \\
  296. \emph{where} is used the same way as in the function above.
  297. This function sets the edgeanchor to a special point which is given by
  298. \emph{key}. The possible values for \emph{key} are mainly given by the
  299. compass:
  300. \textbf{Note:} Tcl/Tk switches north and south.
  301. Thus north is at the bottom of the node and south is at the top of it.
  302. \begin{ttdescription}
  303. \item[GT\_Keys::anchor\_center] \strut
  304. Place to the center of the node.
  305. \item[GT\_Keys::anchor\_n] \strut
  306. Place to the bottom of the node.
  307. \item[GT\_Keys::anchor\_ne] \strut
  308. Place to the lower right of the node.
  309. \item[GT\_Keys::anchor\_e] \strut
  310. Place to the right of the node.
  311. \item[GT\_Keys::anchor\_se] \strut
  312. Place to the upper right of the node.
  313. \item[GT\_Keys::anchor\_s] \strut
  314. Place to the top of the node.
  315. \item[GT\_Keys::anchor\_sw] \strut
  316. Place to the upper left of the node.
  317. \item[GT\_Keys::anchor\_w] \strut
  318. Place to the left of the node.
  319. \item[GT\_Keys::anchor\_nw] \strut
  320. Place to the lower left of the node.
  321. \end{ttdescription}
  322. The return value is \emph{GT\_ERROR} if \emph{key} is none of the
  323. possibilities mentioned above. Otherwise the return value is \emph{GT\_OK}.
  324. \item[int set\_EA (GT\_Key \Param{source\_key},
  325. GT\_Key \Param{target\_key})] \strut\\
  326. This function allows to specify a rule for the computation of the values
  327. of the edgeanchor. \emph{source\_key} and \emph{target\_key} can be
  328. \begin{ttdescription}
  329. \item[EA\_next\_corner] \strut
  330. Connect the last bend to the nearest corner of the node.
  331. \item[EA\_next\_middle] \strut
  332. Connect the last bend to the closest middle of a side of the node.
  333. \item[EA\_orthogonal] \strut
  334. Connect the last bend by an orthogonal line to the node.
  335. \item[empty\_function] \strut
  336. Leave the edgeanchor unchanged.
  337. \end{ttdescription}
  338. \Graphlet{} then recomputes the edgeanchors with this rules for source
  339. and target. If it should connect an edge orthogonal and this is not
  340. possible, the edge is connected to the next corner.
  341. The return value is \emph{GT\_ERROR} if \emph{source\_key} or
  342. \emph{target\_key} is none of the keys mentioned above.
  343. Otherwise the return value is \emph{GT\_OK}.
  344. \end{Cdefinition}
  345. % ----------------------------------------
  346. % ----------------------------------------
  347. \subsection{Functions related to a node}
  348. Up to now we only have the same functions for a node as we have for an edge.
  349. The arguments of the functions are the same as for the functions related
  350. to an edge, except that we don't need the parameter \emph{where}.
  351. This is because each function is applied to this end of the edge which is
  352. adjacent to the node.
  353. Only the last function influences source and target of the edge.
  354. Here is a list of all functions:
  355. \begin{Cdefinition}
  356. \item[int alledges\_set\_EA (double \Param{delta$_x$},
  357. double \Param{delta$_y$})] \strut
  358. \item[int alledges\_set\_EA (GT\_Key \Param{direction})] \strut
  359. \item[int alledges\_set\_EA (GT\_Key \Param{source\_key},
  360. GT\_Key \Param{target\_key})] \strut
  361. \end{Cdefinition}
  362. % --------------------------------------------------------------------------
  363. % The default function
  364. % --------------------------------------------------------------------------
  365. \section{Changing the Default Function}
  366. The default function is a function which can change the edgeanchor every time
  367. an edge has to be redrawn.
  368. You can use this for example, if you want to connect two nodes by an edge
  369. between the closest corners of the nodes.
  370. \Graphlet{} computes the fitting corners each time the edge has to be redrawn.
  371. You change the function with
  372. \begin{Cdefinition}
  373. \item[int set\_EA\_default\_function (GT\_Key \Param{function},
  374. int \Param{where})] \strut\\
  375. Again \emph{where} is GT\_Source or GT\_Target.
  376. \emph{function} can be one of the following:
  377. \begin{ttdescription}
  378. \item[GT\_Keys::empty\_function] \strut
  379. \item[GT\_Keys::EA\_next\_corner] \strut
  380. \item[GT\_Keys::EA\_next\_middle] \strut
  381. \item[GT\_Keys::EA\_orthogonal] \strut
  382. \end{ttdescription}
  383. \end{Cdefinition}
  384. % --------------------------------------------------------------------------
  385. % --------------------------------------------------------------------------
  386. \section{Additional functions}
  387. Here are some additional functions.
  388. They can be used to get some information on the NEI.
  389. \CSourceCodeLocation{}{base}{edge\_NEI}
  390. \CIncludeStatement{}{base}{NEI}
  391. \begin{Cdefinition}
  392. \item[point get\_clip\_point (int \Param{where})] \strut\\
  393. For the given nodeposition and the given edgeanchor: Get the
  394. coordinates where the edge is clipped.
  395. \item[point get\_EA (int \Param{where})] \strut\\
  396. Get the current edgeanchor either for source or target.
  397. \item[double get\_EA\_x (int \Param{where})] \strut\\
  398. Get \emph{delta$_x$} of the edgeanchor either for source or target.
  399. \item[double get\_EA\_y (int \Param{where})] \strut\\
  400. Get \emph{delta$_y$} of the edgeanchor either for source or target.
  401. \item[GT\_Key get\_EA\_default\_function (int \Param{where})] \strut\\
  402. Get the key of the actual default function for source or target.
  403. \end{Cdefinition}
  404. Additionally we have a function to get the default function for the class
  405. GT\_Node\_NEI:
  406. \CSourceCodeLocation{}{base}{node\_NEI}
  407. \CIncludeStatement{}{base}{NEI}
  408. \begin{Cdefinition}
  409. \item[GT\_Key get\_EA\_default\_function ()] \strut\\
  410. Get the Key of the actual default function.
  411. \end{Cdefinition}
  412. % --------------------------------------------------------------------------
  413. % --------------------------------------------------------------------------
  414. \section{The Representation of Edgeanchors in gml-Files}
  415. The NEI for nodes only consists of a default function. Thus you get an
  416. entry like the following for the nodes in the gml-file:
  417. \begin{verbatim}
  418. edgeAnchor [
  419. defaultFunction "None"
  420. ]
  421. \end{verbatim}
  422. The NEI for edges consists of a default function for source and target.
  423. Additionally we store (\emph{delta$_x$}, \emph{delta$_y$}) for source and
  424. target:
  425. \begin{verbatim}
  426. edgeAnchor [
  427. sourceFunction "None"
  428. targetFunction "Orthogonal"
  429. xSource 0.800000
  430. ySource -0.500000
  431. xTarget 1.00000
  432. yTarget -1.00000
  433. ]
  434. \end{verbatim}
  435. % --------------------------------------------------------------------------
  436. % --------------------------------------------------------------------------
  437. \section{Adjusting an Algorithm to the New NEI}
  438. You have to do two things to adjust an algorithm to the new NEI:
  439. \begin{enumerate}
  440. \item Make sure, that the default functions for nodes and edges which you
  441. do not want to use are set to \emph{None}
  442. (\emph{GT\_Keys::empty\_function}).
  443. \item Set the edgeanchor to the wanted point.
  444. \end{enumerate}
  445. Example:
  446. You want to connect the nodes from node center to node center. The default
  447. functions for nodes and edges are not allowed to change the edgeanchors.
  448. In this case, use the predefined function \emph{reset\_NEIs}.
  449. \CIncludeStatement{}{base}{NEI}
  450. \emph{reset\_NEIs} is an implementation of the example in
  451. section \ref{example_NEI}.
  452. \section{Changing the NEI with \GraphScript{}}
  453. We have some additional attributes for nodes and edges with which you can
  454. access the NEI.
  455. For further information on how to program in \GraphScript{} have a look
  456. at the corresponding manual.
  457. \subsection{Attributes for an edge}
  458. \begin{TclAttributes}
  459. \Attribute{-delta\_x\_source}{number} \strut\\
  460. Real value in the interval -1.0, 1.0 .
  461. \Attribute{-delta\_x\_target}{number} \strut\\
  462. Real value in the interval -1.0, 1.0 .
  463. \Attribute{-delta\_y\_source}{number} \strut\\
  464. Real value in the interval -1.0, 1.0
  465. \Attribute{-delta\_y\_target}{number} \strut\\
  466. Real value in the interval -1.0, 1.0
  467. \Attribute{-source\_function}{TK\_Function} \strut\\
  468. Describes the function which is applied each time an edge is redrawn.
  469. \begin{ttdescription}
  470. \item[EA\_next\_corner] \strut
  471. Connect the last bend to the nearest corner of the node.
  472. \item[EA\_next\_middle] \strut
  473. Connect the last bend to the closest middle of a side of the node.
  474. \item[EA\_orthogonal] \strut
  475. Connect the last bend by an orthogonal line to the node.
  476. \item[empty\_function] \strut
  477. Leave the edgeanchor unchanged.
  478. \end{ttdescription}
  479. \Attribute{-target\_function}{TK\_Function} \strut\\
  480. Describes the function which is applied each time an edge is redrawn.
  481. \begin{ttdescription}
  482. \item[EA\_next\_corner] \strut
  483. Connect the last bend to the nearest corner of the node.
  484. \item[EA\_next\_middle] \strut
  485. Connect the last bend to the closest middle of a side of the node.
  486. \item[EA\_orthogonal] \strut
  487. Connect the last bend by an orthogonal line to the node.
  488. \item[empty\_function] \strut
  489. Leave the edgeanchor unchanged.
  490. \end{ttdescription}
  491. \end{TclAttributes}
  492. \subsection{Attributes for a node}
  493. \begin{TclAttributes}
  494. \Attribute{default\_function}{TK\_Function} \strut\\
  495. Describes the function which is applied each time an edge, which is
  496. adjecent to the node, is redrawn.
  497. \begin{ttdescription}
  498. \item[EA\_next\_corner] \strut
  499. Connect the last bend to the nearest corner of the node.
  500. \item[EA\_next\_middle] \strut
  501. Connect the last bend to the closest middle of a side of the node.
  502. \item[EA\_orthogonal] \strut
  503. Connect the last bend by an orthogonal line to the node.
  504. \item[empty\_function] \strut
  505. Leave the edgeanchor unchanged.
  506. \end{ttdescription}
  507. \end{TclAttributes}
  508. \end{document}