Klnx.tcl



# PROGRAMA PRINCIPAL DE KAREL
###############################################################################
###############################################################################
#		PROGRAMA PRINCIPAL DE KAREL
#
#		Autor: Ing. CUAUHTEMOC RIVERA LOAIZA
#
#		Universidad Michoacana de San Nicolas de Hidalgo
#
#		Seccion de Graduados de la Facultad de Ingenieria 
#		Electrica
#
#		Maestria en Sistemas Computacionales
#
#		Noviembre 1997 	crivera@scfie.eie.umich.mx
###############################################################################
#
#		NOTA: Es necesario contar con los archivos klnx_acerca.tcl,  klnx_ambiente.tcl, 
##			 klnx_ensa.tcl, klnx_pila.tcl y foto.gif en el mismo directorio en que se encuentra
#			 el programa principal (klnx.tcl).
#
###############################################################################
catch {destroy .karel}
catch {destroy .programadual }

global memoria obstaculo num_obstaculo num_monedas 
global frente karel_x karel_y bolsa pila nva_ins num_nva_ins boton alto
global destacar programa_karel destacar_fuente

set destacar 1
set destacar_fuente 1
set alto 0
set obstaculo(0) "x 0 0 0 0"
set obstaculo(1) "y 0 0 0 0"
set obstaculo(2) "x 0 25 0 0"
set obstaculo(3) "y 25 0 0 0"
set num_nva_ins 0
set num_monedas 0
set bolsa 0
set pila 0
set num_obstaculo 4
global velocidad 
set velocidad 800
set boton Avance

source klnx_pila.tcl
source klnx_ensa.tcl
source klnx_ventanas.tcl

	#######################################################
	##										##
	##	        P * R * O * C * E * D * I * M * I * E * N * T * O * S 		##
	##										##
	#######################################################


#######################################################
## 	Nombre: 	BORRADO DE KAREL
##
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	convierte_x, convierte_y,  contorno_karel
#######################################################
proc borra_karel { x1 y1 } {
	set x [ convierte_x $x1 ]
	set y [ convierte_y $y1 ]
	contorno_karel $x $y white
	.karel.ambiente create line [expr $x - 15] $y \
		[expr $x + 15] $y -fill gray
	.karel.ambiente create line $x [expr $y - 15] \
		$x [expr $y + 15] -fill gray
}

#######################################################
## 	Nombre: 	CREACION DE KAREL
##
##		           	modo apagado o activo.
##	Regresa: 	Nada.
##	Procedimientos 
##	externos: 	convierte_x, convierte_y, contorno_karel
#######################################################
proc crea_karel { x1 y1 orientacion color activo} {
	set x [ convierte_x $x1 ]
	set y [ convierte_y $y1 ]
	if {$activo =="on"} { set modo red } {set modo blue }
	contorno_karel $x $y $modo
	.karel.ambiente create oval [expr $x -4 ] [expr $y -4] \
		[expr $x +5 ] [expr $y + 5] -width 2 -fill $color
	switch $orientacion {
		SUR   { .karel.ambiente create line $x [expr $y +5] \
			 $x [expr $y + 7] -width 3 
		}
		NORTE { .karel.ambiente create line $x [expr $y -5] \
			 $x [expr $y - 7] -width 3 
		}
		ESTE  { .karel.ambiente create line [expr $x +5] $y\
			 [expr $x + 7] $y -width 3 -fill black
		}
		OESTE { .karel.ambiente create line [expr $x -5] $y\
			 [expr $x - 7] $y -width 3 
		}
	}
}

#######################################################
## 	Nombre: 	CREACION DEL CIRCULO 
##			EXTERIOR DE KAREL
##
##		    	activo o apagado.
##	Regresa: 	Nada.
##	Procedimientos 
##	externos: 	Ninguno.
#######################################################
proc contorno_karel  { x y color } {
	.karel.ambiente create oval [expr $x -8 ] [expr $y -8] \
		[expr $x +9 ] [expr $y +9] -fill $color -outline $color
}

#######################################################
## 	Nombres: 	CONVIERTE_X y CONVIERTE_Y
##
##		    	a posiciones reales a utilizar en el canvas
##	Procedimientos 
##	externos: 	Ninguno.
#######################################################
proc convierte_x { a1 } {
	set a 40
	for { set i 1 } { $i < $a1} { incr i } {
		set a [expr $a +20 ]
	}
	return $a
}

proc convierte_y  { a1 } {
	set a 520
	for { set i 1 } { $i < $a1} { incr i } {
		set a [expr $a -20 ]
	}
	return $a
}

#######################################################
## 	Nombre: 	CREA_PARED
##
##			avenida>" punto_a "DE_<calle o avenida>" 
##			punto_b1 "A" punto_b2
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	convierte_X, convierte_y.
#######################################################
proc crea_pared { calle_o_avenida punto_a punto_b1 punto_b2 } {
	switch $calle_o_avenida {
		avenida { .karel.ambiente create line [expr [convierte_x $punto_a] +10] \
			[expr [convierte_y $punto_b1] +10]\
			[expr [convierte_x $punto_a] +10] \
			[expr [convierte_y $punto_b2] -10] -fill black -width 3 }	
		calle { .karel.ambiente create line [expr [convierte_x $punto_b1] -10]\
			[expr [convierte_y $punto_a] -10] \
			[expr [convierte_x $punto_b2] +10] \
			[expr [convierte_y $punto_a] -10] -fill black -width 3 }  
		
		default { puts "Error!" }
	}
}

#######################################################
## 	Nombre: 	CREA_MONEDA
##
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	convierte_X, convierte_y.
#######################################################
proc crea_moneda {  y x } {
	set x [convierte_x $x]
	set y [convierte_y $y]
	.karel.ambiente create oval [expr $x - 3] [expr $y - 3] [expr $x + 3] [expr $y + 3] -fill black
}

#######################################################
## 	Nombre: 	CARGA_ARCHIVO
##
##			archivo elegido, nombre del archivo, opcion
##			con los tipos de archivos a cargar
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	tk_getOpenFile, 
#######################################################
proc carga_archivo { w archivo opcion} {
	global memoria 
	set tipos {
		{"Archivos de ejecutables Karel"	{.ok}	}		
		{"Archivos de Texto"	{.txt}		TEXT}
		{"Todos los Archivos"		*}
    	}
	if {$opcion == 1 } {
		set archivo [tk_getOpenFile -filetypes $tipos -parent $w]}
	set avance 0
	set f [open $archivo]
    	$w delete 1.0 end
    	while {![eof $f]} {
		$w insert end [read $f 10000]
    	}
    	close $f
	if { [array exists memoria] } {
		unset memoria }
	if { [file readable $archivo] } {
	 	set fileid [open $archivo "r"] }
	set cont 0		
	set i 1
	while { $i == 1 } {
		gets $fileid data
		set memoria($cont) $data
		if {[eof $fileid]} {set i 0 }
		incr cont
	}
	muestra_fuente [string trimright $archivo ".ok"]
}



#######################################################
## 	Nombre: 	AVANZA_INSTRUCCION
##
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	destaca, clasifica 
#######################################################
proc avanza_instruccion { renglon avance } {
	global destacar destacar_fuente

	destaca $avance
	if {$renglon != ""} { clasifica $renglon }
	set destacar [expr $avance +1]
	#set destacar_fuente [expr $avance -1]
}

#######################################################
## 	Nombre: 	DESTACA
##
##			este sea siempre visible 
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	Ninguno 
#######################################################
proc destaca { numero_linea } {
	global destacar

	set ventana .programadual.cpd19.03
	incr numero_linea 
	if { $destacar == 1} { 
		set x "$ventana tag add destaca$destacar \
			{$destacar.0 linestart} {$destacar.0 lineend}"
		eval $x
		$ventana tag configure destaca$destacar -background blue \
			-foreground white } { \
		$ventana tag configure destaca$destacar -background white \
			-foreground black
		   set x "$ventana tag add destaca$numero_linea \
			{$numero_linea.0 linestart} {$numero_linea.0 lineend}"
		eval $x
		$ventana tag configure destaca$numero_linea -background blue \
			-foreground white }
	$ventana see $numero_linea.0
}

#######################################################
## 	Nombre: 	INSERTA_EN_PILA
##
##			uso.
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	Ninguno 
#######################################################
proc inserta_en_pila { localidad } {
	global pila

	.pila.frame.text insert end $localidad
	.pila.frame.text insert end \n
	incr pila
}

#######################################################
## 	Nombre: 	QUITA_DE_PILA
##
##			"Pila".
##	Procedimientos 
##	externos: 	Ninguno 
#######################################################
proc quita_de_pila {  } {
	global pila

	set a [.pila.frame.text get $pila.0 [expr $pila +1].0 ]
	.pila.frame.text delete $pila.0 [expr $pila +1].0
	incr pila -1
	return $a
}

#######################################################
## 	Nombre: 	AVANZA_AUTO
##
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	avanza_instruccion 
#######################################################
proc avanza_auto { } {
	global avance memoria velocidad continua alto

	set alto 0
	set fin_programa [ array size memoria ]
	while { $avance < $fin_programa } {
		avanza_instruccion $memoria($avance) $avance
		incr avance
		after $velocidad { set continua "" }
  		tkwait variable continua
  		unset continua
		if {$alto == 1 } {break}
	}


}

#######################################################
## 	Nombre: 	CLASIFICA
##
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	crea_ambiente_ensa 
#######################################################
proc clasifica { renglon} {
	global boton

	puts $renglon
	set instruccion [split $renglon]
	crea_ambiente_ensa $instruccion
	 set boton Detener 
	.programadual.but17 configure -bg red -fg white
}

#######################################################
## 	Nombre: 	MUESTRA_FUENTE
##
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	Ninguno
#######################################################
proc muestra_fuente { archivo } {
	global programa_karel

	
	set f [open $archivo.kar ]

    	while {![eof $f]} {
		.programadual.cpd18.03 insert end [read $f 10000]
    	}
    	close $f
	if { [array exists programa_karel] } {
		unset programa_karel }
	if { [file readable $archivo.kar] } {
	 	set fileid [open $archivo.kar "r"] }
	set cont 0		
	set i 1
	while { $i == 1 } {
		gets $fileid data
		set programa_karel($cont) $data
		if {[eof $fileid]} {set i 0 }
		incr cont
	}


}

#######################################################
## 	Nombre: 	DESTACA ARCHIVO FUENTE
##
##			este sea siempre visible 
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	Ninguno 
#######################################################
proc destaca_fuente { numero_renglon } {
	global destacar_fuente

	set ventanas .programadual.cpd18.03
	if { $destacar_fuente == 1} { \
		set x "$ventanas tag add neon$destacar_fuente {$destacar_fuente.0 linestart} {$destacar_fuente.0 lineend}"
		eval $x
		$ventanas tag configure neon$destacar_fuente -background blue -foreground white } { \
		$ventanas tag configure neon[expr $destacar_fuente +1] -background white -foreground black
		   set x "$ventanas tag add neon$numero_renglon {$numero_renglon.0 linestart} {$numero_renglon.0 lineend}"
		eval $x
		$ventanas tag configure neon$numero_renglon -background blue -foreground white }
	$ventanas see $numero_renglon.0
	puts $destacar_fuente
	set destacar_fuente [expr $numero_renglon - 1]
}

#######################################################
## 	Nombres: 	COPIAR_AL_PORTAPAPELES
##			CORTAR_AL_PORTAPAPELES
##			PEGAR_DEL_PORTAPAPELES
##
##			recibe el nombre de la ventana en donde se
##	Regresa: 	Nada
##	Procedimientos 
##	externos: 	Ninguno 
#######################################################
proc COPIAR_AL_PORTAPAPELES { } {
	if { [ selection own ] != "" } {
		clipboard clear
		clipboard append [selection get]
	}
}

proc CORTAR_AL_PORTAPAPELES { } {
	set owner [ selection own ]
	if { $owner != "" } {
		clipboard clear
		clipboard append [selection get]
		$owner delete sel.first sel.last
	}
}

proc PEGAR_DEL_PORTAPAPELES { widgetname } {
	set clip [selection get -selection CLIPBOARD ]
	set owner [ selection own ]
	if { $owner != $widgetname } {
		set idx [$owner index sel.first ]
		$owner delete sel.first sel.last
	}  { $widgetname insert insert $clip }	
}