Graphviz 12.0.1~dev.20240715.2254
Loading...
Searching...
No Matches
selectionfuncs.c
Go to the documentation of this file.
1/*************************************************************************
2 * Copyright (c) 2011 AT&T Intellectual Property
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * https://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors: Details at https://graphviz.org
9 *************************************************************************/
10
11#include <cgraph/alloc.h>
12#include <limits.h>
13#include "selectionfuncs.h"
14#include "topviewfuncs.h"
15#include "smyrna_utils.h"
16
17static void select_node(Agraph_t* g,Agnode_t* obj,int reverse)
18{
19 Agsym_t* sel_attr = GN_selected(g);
20
21 if(!sel_attr)
22 sel_attr = GN_selected(g) = agattr(g, AGNODE,"selected","0");
23 if(!reverse)
24 {
25 agxset(obj,sel_attr,"1");
26 ND_selected(obj) = 1;
27 }
28 else
29 {
30 if(ND_selected(obj)==1)
31 {
32 agxset(obj,sel_attr,"0");
33 ND_selected(obj) = 0;
34 ND_printLabel(obj) = 0;
35 }
36 else
37 {
38 agxset(obj,sel_attr,"1");
39 ND_selected(obj) = 1;
40 }
41
42 }
43
44
45}
46static void select_edge(Agraph_t* g,Agedge_t* obj,int reverse)
47{
48 Agsym_t* sel_attr = GE_selected(g);
49
50 if (!sel_attr)
51 sel_attr = GE_selected(g) = agattr(g, AGEDGE,"selected","0");
52 if (!reverse)
53 {
54 agxset(obj,sel_attr,"1");
55 ED_selected(obj) = 1;
56 }
57 else
58 {
59 if (ED_selected(obj) == 1)
60 {
61 agxset(obj,sel_attr,"0");
62 ED_selected(obj) = 0;
63 }
64 else
65 {
66 agxset(obj,sel_attr,"1");
67 ED_selected(obj) = 1;
68 }
69 }
70
71
72}
73
74static void pick_objects_in_rect(Agraph_t *g, float x1, float y1, float x2,
75 float y2) {
76 Agnode_t *v;
77 Agedge_t *e;
78 glCompPoint posT;
79 glCompPoint posH;
80 glCompPoint posN;
81
82 for (v = agfstnode(g); v; v = agnxtnode(g, v))
83 {
85 posN = ND_A(v);
86 if(!ND_visible(v))
87 continue;
88 if(is_point_in_rectangle(posN.x,posN.y,x1,y1,x2-x1,y2-y1) )
89 select_node(g,v,0);
90 }
92 for (e = agfstout(g, v); e; e = agnxtout(g, e))
93 {
94 posT = ED_posTail(e);
95 posH = ED_posHead(e);
96 if(is_point_in_rectangle(posT.x,posT.y,x1,y1,x2-x1,y2-y1))
97 if(is_point_in_rectangle(posH.x,posH.y,x1,y1,x2-x1,y2-y1))
98 select_edge(g,e,0);
99 }
100 }
101 }
102}
103
104
105
107{
108 Agnode_t *v;
109 Agedge_t *e;
110 glCompPoint posT;
111 glCompPoint posH;
112 glCompPoint posN;
113 int defaultNodeShape;
114 float dist = FLT_MAX;
115 float nd; // node distance to point
116 float ed; // edge distance to point
117 float nodeSize=0;
118 void* rv=(void*)0;
119
120 defaultNodeShape=getAttrBool(g,g,"defaultnodeshape",0);
121
122 if(defaultNodeShape==0)
124
125 for (v = agfstnode(g); v; v = agnxtnode(g, v))
126 {
127 if(!ND_visible(v))
128 continue;
129 posN = ND_A(v);
130 if(defaultNodeShape==1)
131 {
132 nodeSize = ND_size(v);
133 }
134
135 nd=distBetweenPts(posN,p,nodeSize);
136 if( nd < dist )
137 {
138 rv=v;dist=nd;
139 }
140
141 for (e = agfstout(g, v); e; e = agnxtout(g, e))
142 {
143 posT = ED_posTail(e);
144 posH = ED_posHead(e);
145 ed=point_to_lineseg_dist(p, posT,posH);
146 if( ed < dist ) {rv=e;dist=ed;}
147 }
148 }
149 return rv;
150}
151
152void pick_object_xyz(Agraph_t *g, topview *t, float x, float y, float z) {
153 glCompPoint p;
154 void* a;
155 p.x=x;p.y=y;p.z=z;
156 a=pick_object(g,p);
157 if (!a)
158 return;
159 if(agobjkind(a)==AGNODE)
160 {
161 select_node(g,a,1);
162 ND_printLabel((Agnode_t*)a) = 1;
163
165
166 }
167 if(agobjkind(a)==AGEDGE)
168 {
169 select_edge(g,a,1);
171 }
172}
174{
175 float x1;
176 float y1;
177 float x2;
178 float y2;
180 {
181 x1=view->mouse.GLinitPos.x;
183 }
184 else
185 {
186 x2=view->mouse.GLinitPos.x;
188
189 }
191 {
192 y1=view->mouse.GLinitPos.y;
194 }
195 else
196 {
197 y2=view->mouse.GLinitPos.y;
199 }
200 pick_objects_in_rect(g,x1,y1,x2,y2);
203}
204
205
206
208{
209 Agnode_t *v;
210 Agedge_t *e;
211 Agsym_t* nsel_attr = GN_selected(g);
212 Agsym_t* esel_attr = GE_selected(g);
213 if(!nsel_attr)
214 nsel_attr = GN_selected(g) = agattr(g, AGNODE,"selected","0");
215 if(!esel_attr)
216 esel_attr = GE_selected(g) = agattr(g, AGEDGE,"selected","0");
217 for (v = agfstnode(g); v; v = agnxtnode(g, v))
218 {
219 agxset(v,nsel_attr,"0");
220 ND_selected(v) = 0;
221 ND_printLabel(v) = 0;
222
223 for (e = agfstout(g, v); e; e = agnxtout(g, e))
224 {
225 agxset(e,esel_attr,"0");
226 ED_selected(e) = 0;
227 }
228 }
231}
232
234{
235 free(sp->pts);
236 sp->pts = NULL;
237 sp->cnt=0;
238}
239static int close_poly(glCompPoly* selPoly,glCompPoint pt)
240{
241 /* int i=0; */
242 const float EPS = GetOGLDistance(3.0f);
243 if (selPoly->cnt < 2)
244 return 0;
245 if(
246 ( (selPoly->pts[0].x-pt.x) < EPS) &&
247 ( (selPoly->pts[0].y-pt.y) < EPS))
248 return 1;
249 return 0;
250}
251
252
253static void select_polygon (Agraph_t* g,glCompPoly* selPoly)
254{
255 Agnode_t *v;
256 glCompPoint posN;
257
258 for (v = agfstnode(g); v; v = agnxtnode(g, v))
259 {
260 posN = ND_A(v);
261 if(point_in_polygon(selPoly,posN))
262 select_node(g,v,0);
263 }
265}
266
267
269{
270 if(!close_poly(selPoly,pt))
271 {
272 selPoly->pts = gv_recalloc(selPoly->pts, selPoly->cnt, selPoly->cnt + 1,
273 sizeof(glCompPoint));
274 selPoly->cnt ++;
275 selPoly->pts[selPoly->cnt-1].x=pt.x;
276 selPoly->pts[selPoly->cnt-1].y=pt.y;
277 selPoly->pts[selPoly->cnt-1].z=0;
278 }
279 else
280 {
281 select_polygon (g,selPoly);
282 clear_selpoly(selPoly);
283 }
284}
285
Memory allocation wrappers that exit on failure.
static void * gv_recalloc(void *ptr, size_t old_nmemb, size_t new_nmemb, size_t size)
Definition alloc.h:73
#define EPS
Definition emit.c:442
static double dist(int dim, double *x, double *y)
float GetOGLDistance(float l)
Definition glutils.c:53
float distBetweenPts(glCompPoint A, glCompPoint B, float R)
Definition glutils.c:363
int is_point_in_rectangle(float X, float Y, float RX, float RY, float RW, float RH)
Definition glutils.c:371
double point_to_lineseg_dist(glCompPoint p, glCompPoint a, glCompPoint b)
Definition glutils.c:176
void free(void *)
node NULL
Definition grammar.y:149
Agsym_t * agattr(Agraph_t *g, int kind, char *name, const char *value)
creates or looks up attributes of a graph
Definition attr.c:341
int agxset(void *obj, Agsym_t *sym, const char *value)
Definition attr.c:481
Agedge_t * agfstout(Agraph_t *g, Agnode_t *n)
Definition edge.c:23
Agedge_t * agnxtout(Agraph_t *g, Agedge_t *e)
Definition edge.c:38
Agnode_t * agnxtnode(Agraph_t *g, Agnode_t *n)
Definition node.c:47
Agnode_t * agfstnode(Agraph_t *g)
Definition node.c:40
int agobjkind(void *obj)
Definition obj.c:253
@ AGEDGE
Definition cgraph.h:207
@ AGNODE
Definition cgraph.h:207
static int z
void deselect_all(Agraph_t *g)
static void * pick_object(Agraph_t *g, glCompPoint p)
static void pick_objects_in_rect(Agraph_t *g, float x1, float y1, float x2, float y2)
void pick_objects_rect(Agraph_t *g)
static void select_node(Agraph_t *g, Agnode_t *obj, int reverse)
void clear_selpoly(glCompPoly *sp)
static void select_edge(Agraph_t *g, Agedge_t *obj, int reverse)
static void select_polygon(Agraph_t *g, glCompPoly *selPoly)
void pick_object_xyz(Agraph_t *g, topview *t, float x, float y, float z)
static int close_poly(glCompPoly *selPoly, glCompPoint pt)
void add_selpoly(Agraph_t *g, glCompPoly *selPoly, glCompPoint pt)
int point_in_polygon(glCompPoly *selPoly, glCompPoint p)
int getAttrBool(Agraph_t *g, void *obj, char *attr_name, int def)
ViewInfo * view
Definition viewport.c:38
#define ED_posHead(e)
Definition smyrnadefs.h:194
#define GN_selected(g)
Definition smyrnadefs.h:216
#define ED_posTail(e)
Definition smyrnadefs.h:193
#define ND_size(n)
Definition smyrnadefs.h:182
#define ND_printLabel(n)
Definition smyrnadefs.h:180
#define GE_selected(g)
Definition smyrnadefs.h:222
#define ED_selected(e)
Definition smyrnadefs.h:192
#define ND_selected(n)
Definition smyrnadefs.h:179
#define ND_A(n)
Definition smyrnadefs.h:181
#define ND_visible(n)
Definition smyrnadefs.h:178
graph or subgraph
Definition cgraph.h:425
string attribute descriptor symbol in Agattr_s.dict
Definition cgraph.h:639
topview * Topview
Definition smyrnadefs.h:334
float nodeScale
Definition smyrnadefs.h:370
float zoom
Definition smyrnadefs.h:275
glCompMouse mouse
Definition smyrnadefs.h:321
bool selectEdges
Definition smyrnadefs.h:233
bool selectNodes
Definition smyrnadefs.h:232
glCompPoint GLfinalPos
Definition glcompdefs.h:282
glCompPoint GLinitPos
Definition glcompdefs.h:281
glCompPoint * pts
Definition glcompdefs.h:145
float fitin_zoom
Definition smyrnadefs.h:253
selection sel
Definition smyrnadefs.h:259
void cacheSelectedEdges(Agraph_t *g, topview *t)
void cacheSelectedNodes(Agraph_t *g, topview *t)