Hallo again,
I've been interested in the flowchart problem a bit more,
so I improved my demo a bit in respect of the sizes of sub-elements,
I used replace to avoid the list formatting chars,
and I implemented draw_while.
Have fun!
;________________________________________________________________________
to testflowchart
size=0.7
show draw_proc "testProcedure2
end
to testProcedure x
print 5
if lessP x 1 [stop]
ifelse greaterP x 10
[ print "x>10
][ print "x<=10
]
testProcedure x-1
end
to testProcedure2 x
if lessP x 1 [stop]
y=1
while [lessP y 20]
[ ifelse greaterP y 10
[ ifelse greaterP y 15
[ print "y>15
][ print "10<y<=15
]
][ print "y<=10
]
y=y+1
]
testProcedure2 x-1
end
to draw_proc procname [shouldDraw true]
local [r tree startPos]
tree=butFirst makeTreeFromBody Text procname
clearText
show :tree
clearScreen
WindowMode
hideTurtle
enableTextureFont
setLabelSize [20 20]*size
PenUp
setXY 0 300
r=draw_start
startPos=r.1
startPos.2=startPos.2+(r.(2).2-r.(1).2)/2
r=addrr r draw_arrowxy Pos (list xCor yCor-30*size)
r=addrr r draw_flowChart :tree
; draw_end
output r
end
to draw_flowChart x [shouldDraw true]
local [p0 r]
p0=pos
r=(List Pos Pos)
foreach x
[ case ?.1
[ [[if] [r=addrr r draw_if ?]]
[[ifelse] [r=addrr r draw_ifelse ?]]
[[while] [r=addrr r draw_while ?]]
[procname [ r=addrr r draw_arrowxy Pos (list r.(1).1-20*size r.(1).2)
r=addrr r draw_arrowyx Pos startPos output r]]
[[stop output] [r=addrr r draw_text ? setY yCor-20 output r]]
[else [r=addrr r draw_text ?]]
]
r=addrr r draw_arrowxy Pos (list xCor yCor-20*size)
]
if not shouldDraw [setPos p0]
output r
end
to draw_start
output draw_text "Start
end
to draw_end
output draw_text "End
end
to draw_if x
local [r ryes s p1 p2]
r=draw_diamond_text first butFirst x
p1=Pos
p1.1=r.(2).1
p1.2=r.(1).2+(r.(2).2-r.(1).2)/2
r=addrr r draw_yes
ryes=(draw_flowChart butFirst butFirst x shouldDraw)
r=addrr r ryes
p2=Pos
PenUp
setPos p1
r=addrr r draw_no ryes
r=addrr r draw_arrowyx Pos p2
output r
end
to draw_ifelse x
local [r ryes s p1 p2]
r=draw_diamond_text first butFirst x
p1=Pos
p1.1=r.(2).1
p1.2=r.(1).2+(r.(2).2-r.(1).2)/2
r=addrr r draw_yes
ryes=(draw_flowChart butLast butFirst butFirst x shouldDraw)
r=addrr r ryes
p2=Pos
PenUp
setPos p1
ryes=dontoverlap ryes
(draw_flowChart butFirst butFirst butFirst x false)
r=addrr r draw_no ryes
r=addrr r draw_flowChart butFirst butFirst butFirst x
r=addrr r draw_arrowyx Pos p2
output r
end
to draw_yes
local [r p s]
s=butLast (LabelSize "Yes)/4
p=Pos
r=(list p p+s+s/2)
relXY s.1 -s.2/2
Label "Yes
setPos p
r=addrr r draw_arrowxy Pos (List xCor yCor-20*size)
output r
end
to draw_no ryes
local [r x p s]
s=butLast (LabelSize "No)/4
p=Pos
r=(list p p+s+s/2)
relXY s.1/3 s.2/2
Label "No
setPos p
x=(max ryes.(2).1+20*size p.1)
r=addrr r draw_arrowxy Pos (List x yCor-20*size)
output r
end
to draw_while x
local [r ryes s p1 p2 p3]
r=draw_diamond_text first butFirst x
p1=Pos
p1.1=r.(2).1
p1.2=r.(1).2+(r.(2).2-r.(1).2)/2
p3=(list r.(1).1 p1.2)
r=addrr r draw_yes
ryes=(draw_flowChart butFirst butFirst x shouldDraw)
r=addrr r ryes
p2=Pos
r=addrr r draw_arrowxy Pos (list r.(1).1-20*size Pos.2+20*size)
r=addrr r draw_arrowyx Pos p3
p2.2=p2.2-20*size
PenUp
setPos p1
r=addrr r draw_no ryes
r=addrr r draw_arrowyx Pos p2
output r
end
to noformat txt
output replace "| | " replace "|
| " txt
end
to draw_text txt
local [r s w h]
s=(LabelSize txt)/3
w=s.1
h=s.2
setY yCor-h/2-5*size
r=draw_rect w h
setHeading 90
if shouldDraw
[ Label noformat txt
]
setY yCor-h/2
output r
end
to draw_diamond_text txt
local [r s w h]
s=(LabelSize txt)/2.5
w=s.1
h=s.2
setY yCor-h/2-5*size
r=draw_diamond w h
setHeading 90
if shouldDraw
[ Label noformat txt
]
setY yCor-h/2
output r
end
to draw_rect width height
local [r]
PenUp
setXY xCor-width/2 yCor-height/2
myPenDown
setX xCor+width
setY yCor+height
setX xCor-width
setY yCor-height
PenUp
setXY xCor+width/2 yCor+height/2
r=(list Pos-(list width/2 height/2) Pos+(list width/2 height/2))
output r
end
to draw_diamond width height
local [r]
PenUp
setY yCor+height/2
myPenDown
setXY xCor-width/2 yCor-height/2
setXY xCor+width/2 yCor-height/2
setXY xCor+width/2 yCor+height/2
setXY xCor-width/2 yCor+height/2
PenUp
setY yCor-height/2
r=(list Pos-(list width/2 height/2) Pos+(list width/2 height/2))
output r
end
to draw_arrowxy s d
local [x y]
y=(signum d.2-s.2)*10*size
x=5*size
PenUp
setPos s
myPenDown
setX d.1
setY d.2
relXY -x -y
relXY x y
relXY x -y
relXY -x y
PenUp
output (list s d)
end
to draw_arrowyx s d
local [x y]
x=(signum d.2-s.2)*10*size
y=5*size
PenUp
setPos s
myPenDown
setY d.2
setX d.1
relXY -x y
relXY x -y
relXY -x -y
relXY x y
PenUp
output (list s d)
end
to relXY x y
setXY xCor+x yCor+y
end
to myPenDown
if shouldDraw [PenDown]
end
to addrp r p
for [i 1 2]
[ if p.i < r.(1).i [r.(1).i=p.i]
if p.i > r.(2).i [r.(2).i=p.i]
]
output r
end
to addrr r r2
for [i 1 2]
[ if r2.(1).i < r.(1).i [r.(1).i=r2.(1).i]
if r2.(2).i > r.(2).i [r.(2).i=r2.(2).i]
]
output r
end
to dontoverlap r1 r2
local [r]
r=(list r1 r1)
if r2.(1).1 < r1.(2).1 [r.(2).1=r1.(2).1+(r2.(2).1-r2.(1).1)/2]
output r
end
;________________________________________________________________________
Cheers,
Andreas


|