1
function [%pt,scs_m]=do_stupidmove(%pt,scs_m)
4
// get a scicos object to move, and move it with connected objects
12
[btn,xc,yc,win,Cmenu]=cosclick()
17
Cmenu=%tableau(min(100,btn-31));%pt=[xc;yc];
18
if Cmenu==emptystr() then Cmenu=[];%pt=[];end
19
[%win,Cmenu]=resume(win,Cmenu)
22
xc=%pt(1);yc=%pt(2);win=%win;%pt=[]
25
[k,wh,scs_m]=stupid_getobj(scs_m,[xc;yc])
26
if k<>[] then break,end
30
if scs_m(k)(1)=='Block'|scs_m(k)(1)=='Text' then
31
needreplay=replayifnecessary()
32
scs_m=stupid_moveblock(scs_m,k,xc,yc)
33
elseif scs_m(k)(1)=='Link' then
34
scs_m=stupid_movecorner(scs_m,k,xc,yc,wh)
36
[scs_m_save,enable_undo,edited,nc_save,needreplay]=resume(scs_m_save,%t,%t,needcompile,needreplay)
38
function scs_m=stupid_moveblock(scs_m,k,xc,yc)
39
// Move block k and modify connected links if any
41
//look at connected links
43
connectedi=[get_connected(scs_m,k,'in'),get_connected(scs_m,k,'clkin')];
44
connectedo=[get_connected(scs_m,k,'out'),get_connected(scs_m,k,'clkout')];
46
xx=[];yy=[];ii=[];clr=[];mx=[];my=[]
48
// build movable segments for all connected links
49
//===============================================
55
draw_link_seg(oi,$-1:$) //erase link
56
if pixmap then xset('wshow'),end
57
[xl,yl,ct,from,to]=oi([2,3,7:9])
61
if dr=='Rec' then driver('X11'),end
62
// xpolys(xl($-1:$),yl($-1:$),ct(1))// redraw thin link
64
xm=[xm,xl($-1:$)];ym=[ym,yl($-1:$)];
70
draw_link_seg(oi,1:2) //erase link
71
if pixmap then xset('wshow'),end
72
[xl,yl,ct,from,to]=oi([2,3,7:9])
76
if dr=='Rec' then driver('X11'),end
77
// xpolys(xl,yl,default_color(0))// redraw thin link
79
xm=[xm,[xl(2);xl(1)]];ym=[ym,[yl(2);yl(1)]];
83
// move a block and connected links
84
//=================================
85
[ff,nii]=size(connectedi)
86
[ff,noo]=size(connectedo)
87
//clr=ones(mxx,nxx)*default_color(0)
88
if nii+noo>0 then // move a block and connected links
89
[xmin,ymin]=getorigin(o)
96
if dr=='Rec' then driver('X11'),end
97
dx=xc-xmin;dy=yc-ymin;
98
// xpolys(xmt,ymt,clr)// erase moving part of links
99
while rep(3)==-1 , // move loop
100
xmt(2,:)=xm(2,:)-xco+xc; ymt(2,:)=ym(2,:)-yco+yc;
102
xrect(xc-dx,yc+sz(2)-dy,sz(1),sz(2))
104
xpolys(xmt,ymt,clr)// draw moving part of links
106
if pixmap then xset('wshow'),end
109
xrect(xc-dx,yc+sz(2)-dy,sz(1),sz(2))
110
// clear moving part of links
111
xpolys(xmt,ymt,clr)// erase moving part of links
117
// update and draw block
118
if rep(3)<>2 then o(2)(1)=xy; scs_m(k)=o;end
121
if pixmap then xset('wshow'),end
128
oi(2)($-1:$)=xmt(:,j)
129
oi(3)($-1:$)=ymt(:,j)
132
draw_link_seg(oi,$-1:$) //draw link
133
if pixmap then xset('wshow'),end
140
oi(2)(1:2)=xmt([2,1],j)
141
oi(3)(1:2)=ymt([2,1],j)
144
draw_link_seg(oi,1:2) //draw link
145
if pixmap then xset('wshow'),end
148
else // move an unconnected block
154
if dr=='Rec' then driver('X11'),end
155
while rep(3)==-1 , //move loop
157
xrect(xc,yc+sz(2),sz(1),sz(2))
158
if pixmap then xset('wshow'),end
162
xrect(xc,yc+sz(2),sz(1),sz(2))
167
// update and draw block
168
if rep(3)<>2 then o(2)(1)=xy,scs_m(k)=o,end
171
if pixmap then xset('wshow'),end
174
function scs_m=stupid_movecorner(scs_m,k,xc,yc,wh)
176
[xx,yy,ct]=o([2 3 7])
183
if dr=='Rec' then driver('X11'),end
185
//draw_link_seg(o,seg)
187
xpolys(xx(seg),yy(seg),ct(1)) //draw thin link
188
if pixmap then xset('wshow'),end
193
xpolys(x1,y1,ct(1)) //erase moving part of the link
197
xpolys(x1,y1,ct(1))//draw moving part of the link
199
if pixmap then xset('wshow'),end
200
xpolys(x1,y1,ct(1))//erase moving part of the link
201
xc1=rep(1);yc1=rep(2)
206
//[frect1,frect]=xgetech();
207
//eps=0.04*min(abs(frect(3)-frect(1)),abs(frect(4)-frect(2)))
208
if abs(x1(1)-x1(2))<rela*abs(y1(1)-y1(2)) then
210
elseif abs(x1(2)-x1(3))<rela*abs(y1(2)-y1(3))then
213
if abs(y1(1)-y1(2))<rela*abs(x1(1)-x1(2)) then
215
elseif abs(y1(2)-y1(3))<rela*abs(x1(2)-x1(3)) then
218
d=projaff([x1(1);x1(3)],[y1(1);y1(3)],[x1(2);y1(2)])
219
if norm(d(:)-[x1(2);y1(2)])<..
220
rela*max(norm(d(:)-[x1(3);y1(3)]),norm(d(:)-[x1(1);y1(1)])) then
225
x1(2)=[];y1(2)=[];seg(3)=[]
231
//xpolys(x1,y1,ct(1))//draw moving part of the link
232
//xpolys(xx,yy,ct(1)) //erase thin link
239
if pixmap then xset('wshow'),end
241
function [k,wh,objs]=stupid_getobj(objs,pt)
247
for i=2:n //loop on objects
249
if o(1)=='Block' then
251
[orig,sz]=graphics(1:2)
252
data=[(orig(1)-x)*(orig(1)+sz(1)-x),(orig(2)-y)*(orig(2)+sz(2)-y)]
253
if data(1)<0&data(2)<0 then k=i,break,end
254
elseif o(1)=='Link' then
255
[frect1,frect]=xgetech();
256
eps=4 //0.01*min(abs(frect(3)-frect(1)),abs(frect(4)-frect(2)))
258
[d,ptp,ind]=stupid_dist2polyline(xx,yy,pt,.85)
260
if ind==-1 then k=o(8)(1),break,
261
elseif ind==-size(xx,1) then k=o(9)(1),break,
264
draw_link_seg(o,[ind,ind+1])
265
o(2)=[xx(1:ind);ptp(1);xx(ind+1:$)];o(3)=[yy(1:ind);ptp(2);yy(ind+1:$)];
266
// draw_link_seg(o,[ind,ind+2])
269
else k=i,wh=ind,draw_link_seg(o,[-ind-1:-ind+1]);break,end
271
elseif o(1)=='Text' then
273
[orig,sz]=graphics(1:2)
274
data=[(orig(1)-x)*(orig(1)+sz(1)-x),(orig(2)-y)*(orig(2)+sz(2)-y)]
275
if data(1)<0&data(2)<0 then k=i,break,end
279
function [d,pt,ind]=stupid_dist2polyline(xp,yp,pt,pereps)
280
// computes minimum distance from a point to a polyline
281
//d minimum distance to polyline
282
//pt coordinate of the polyline closest point
284
// if negative polyline closest point is a polyline corner:pt=[xp(-ind) yp(-ind)]
285
// if positive pt lies on segment [ind ind+1]
290
cr=4*sign((xp(1:$-1)-x).*(xp(1:$-1)-xp(2:$))+..
291
(yp(1:$-1)-y).*(yp(1:$-1)-yp(2:$)))+..
292
sign((xp(2:$)-x).*(xp(2:$)-xp(1:$-1))+..
293
(yp(2:$)-y).*(yp(2:$)-yp(1:$-1)))
295
ki=find(cr==5) // index of segments for which projection fall inside
298
//projection on segments
304
d_x=( dy.*(-x(:,2).*y(:,1)+x(:,1).*y(:,2))+dx.*(dx*pt(1)+dy*pt(2)))./d_d
305
d_y=(-dx.*(-x(:,2).*y(:,1)+x(:,1).*y(:,2))+dy.*(dx*pt(1)+dy*pt(2)))./d_d
310
zzz=[ones(np,1);zeros(size(ki,'*'),1)]*eps
311
zz=[ones(np,1)*pereps;ones(size(ki,'*'),1)]
312
[d,k]=min(sqrt((xp-pt(1)).^2+(yp-pt(2)).^2).*zz-zzz)
315
if k>np then ind=ki(k-np),else ind=-k,end
320
function draw_link_seg(o,seg)
321
ct=o(7);c=ct(1),pos=o(6)
324
thick=xget('thickness')
325
t=maxi(pos(1),1)*maxi(pos(2),1)
328
xpoly(o(2)(seg),o(3)(seg),'lines')
330
xset('thickness',thick)