Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Programming > Logo > Re: tree
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 3 of 4 Topic 1577 of 1596
Post > Topic >>

Re: tree

by Andreas Micheler <Andreas.Micheler@[EMAIL PROTECTED] > Apr 4, 2008 at 07:52 PM

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
 




 4 Posts in Topic:
tree
a11 <ashabsurya@[EMAIL  2008-04-03 19:29:59 
Re: tree
Andreas Micheler <Andr  2008-04-04 18:07:16 
Re: tree
Andreas Micheler <Andr  2008-04-04 19:52:44 
Re: tree
bh@[EMAIL PROTECTED] (Br  2008-04-05 06:38:13 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Fri Jul 25 17:55:45 CDT 2008.