Apéndice B Diseño de la aplicación y Codigo fuente de SW.

Anuncio
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
Apéndice B
Diseño de la aplicación y Codigo fuente de SW.
79
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
Diseño de la aplicación
Las clases en Avenue están organizadas de general a específico (de superclases a
subclases). La jerarquía de clases empieza con el objeto más genera, Obj. Todos los otros
objetos son subclase de Obj. Para este trabajo de tesis se implementaron 6 botones y una
tool.
Obj
Control
Menu
Button
Tool
Choices
ControlSet
Snap
Banner
Copy
P/L
L/P
Union
Editting
Atributos de la clase Botón [ESRI 98]
- Click.- Un botón recibe un click event cuando el usuario da click en el botón.
El atributo click especifica el script de Avenue que será ejecutado cuando el
evento ocurre.
80
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
-
Icon.- El ícono es dibujado en la cara del botón.
Visibility.- Nos dice si el botón es visible o no.
Atributos de la clase Tool
- Apply.- Hace que se ejecute el script cada vez que se da click al botón sin que
se desactive dicho botón.
- Click.- Nombra el script para ser usado en el click event.
- Cursor.- Identifica el cursor para ser usado en un click event.
- Icon.- El ícono es dibujado en la cara del tool.
- Selected.- La herramienta seleccionada esta activa. Su Apply event es
llamado cuando sea que un click del mouse ocurre en el documento activo.
La herramienta seleccionada se queda presionada en la interfaz. Una vez
seleccionada, una tool permanece activa hasta que sea seleccionado otro tool
diferente.
Snap
Copy
Snap.ave
Cursor
Snapboton.tif
Selected
CopyAtributos.ave
Copyboton.tif
Visiblity: True
Make : Tool
Make : Button
P/L
L/P
ConvaLineas.ave
Poligonalineasboton.tif
Visiblity: True
ConvaPoligonos.ave
Lineapoligon.tif
Visiblity: True
Make : Button
Make : Button
81
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
Banner
Union
Banner.ave
Info.tif
Visiblity: True
Unirlineasopol.ave
Unionboton.tif
Visiblity: True
Make : Button
Make : Button
Editting
StartStopEditting.ave
Editboton.tif
Visiblity: True
Make : Button
82
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
Codigo Fuete del la aplicación.
' Nombre:
Make (Crea el objeto Extension)
'-----------------------------'El nombre del archivo de la extension
'
theExtensionFile = "$HOME/tesis.avx"
'-----------------------------'El nombre de la extension que sera desplegada en
'el dialogo de extensiones
theExtensionName = "Edicion de Cartografia"
'-----------------------------'La descripcions de la extension que aparecera
' en el dialogo de extensiones
theDescription = "Herramienta de Edicion y Correccion de Cartografia UDLA"
'-----------------------------'La version de la extension extension
theVersion = 1.0
'-----------------------------'Install Script
' El script que usaremos para instalar la extension
InScriptName="Install"
'-----------------------------'Uninstall Script
' El script que usaremos para desinstalar la extension
UnScriptName="Uninstall"
'-----------------------------'Load Script
' Scrip no se usa
LoadScriptName=nil
'-----------------------------'UnLoad Script
' No se usa
UnLoadScriptName=nil
'------------------------------
83
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
'Nombres de documentos a incluir (que no sean scripts)
' Se hace una lista de documentos a incluir como vistas, tablas, layouts,
etc.
' no se usa
theDocs={}
'-----------------------------'Controles (Botones tools normales) que estaran incluidas
'Controles {GUI name,ControlType,ScriptName}
TheControllist={{"View","ButtonBar","Space"},
{"View","ButtonBar","Space"}, {"View","ButtonBar","tesis.unirlineasopol"},
{"View","ButtonBar","tesis.StartStopEditting"},
{"View","ButtonBar","tesis.ConvaLineasotroTema"},{"View","ButtonBar","tesi
s.ConvierteaPloligonos"},
{"View","ButtonBar","tesis.CopyBueno"},
{"View","ButtonBar","tesis.banner"}, {"View","ToolBar","Space"},
{"View","ToolBar","Space"}, {"View","ToolBar","Space"},
{"View","ToolBar","tesis.SuperSnap"}}
'-----------------------------'Tool menus a incluir
' Esta es una lista de cuales Tool menus incluir. Los Tool menus son
especificados
' dandoles un nombre de GUI y un nombre de script name de una de las
herramientas en el tool menu
' de esta manera los scripts seran extraidos para tomar parte de la
extension
'
' no se utilizo
TheToolMenuList={}
'-----------------------------'The Menus to include (a list of menu items listing the doc, the top
menu, and the script for the menu item)
'For a spacer, substitute the name of the script of rhte word "Space"
'The MenuList {Doc name, Main Menu name , menu item Scriptname}
' e.g. The MenuList={}
TheMenuList={}
'-----------------------------'Lista de Popups a incluir (que incluya el nombre del documento , nombre
del popup, y el nombre del script del popup)
ThePopupList={}
'------------------------------
84
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
'****Establecer el prefijo de la extension. Por convencion de
programacion en avenue,
' todos los scripts que conforman la extension deben de tener como
prefijo
' el nombre de la extension****
ScriptPrefix="tesis"
'-----------------------------'los dialogos a incluir.
' no se utilizaron
theDialogs={}
'-----------------------------'Las dependencias a incluir (no se
theDependencies={}
utilizaron)
'-----------------------------' ' No editar de aqui en adelante
'_______________________________________________________________
'_______________________________________________________________
'_______________________________________________________________
'_______________________________________________________________
'_______________________________________________________________
'_______________________________________________________________
'_______________________________________________________________
'_______________________________________________________________
'_______________________________________________________________
'Crear una lista total de los scripts necesitados
TheNeeded={}
'Obtiene una lista completa de scripts, remueve duplicados
ScriptPrefixFull=ScriptPrefix+"."
for each d in av.GetProject.GetDocs
if (d.Is(SEd) AND (d.GetName.Left(ScriptPrefix.count+1) =
ScriptPrefixFull)) then
theNeeded.Add(d.GetName)
end
end
for each ControlScript in thecontrolList
'test for spacers
if(ControlScript.get(2) <> "Space") then
TheNeeded.add(ConTrolScript.get(2))
end
end
For each MenuScript in theMenuList
85
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
'test for spacers
if(MenuScript.get(2) <> "Space") then
theNeeded.add(MenuScript.get(2))
end
end
For each PopUpScript in thePopupList
'test for spacers
if(PopupScript.get(2) <> "Space") then
theNeeded.add(PopupScript.get(2))
end
end
'Hace una lista unica de los scripts referenciados.
'totalscripts=thescripts.merge(theNeeded)
TotalScripts=theNeeded
TotalScripts.removeduplicates
'msgbox.listAsString(TotalScripts,"","")
theInstall=av.GetProject.FindScript(InscriptName)
if (theInstall=NIL) then
Msgbox.Error("El Script install "+InScriptName+" no se
encontro","Script no encontrado")
return(nil)
end
theUninstall=av.GetProject.FindScript(unscriptName)
if (theUninstall=NIL) then
Msgbox.Error("El install Script "+UnScriptName+" no fue
encontrado","Script no encontrado")
return(nil)
end
'Crear la extension
' Extension.Make(ExtensionFile, theExtensionName, InstallScript,
UninstallScript, Dependancies_
myExt = Extension.Make(theExtensionFile.asFilename,
theExtensionName,
theInstall,
theUninstall,
theDependencies)
TheDocList={}
TheTotalControls={}
ThetotalMenus={}
86
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
theTotalToolMenus={}
TheTotalPopups={}
' Procesa la lista de documentos
for each aDoc in TheDocs
if ((av.getproject.findDoc(aDoc)="Null").NOT) then
TheDocList.Add(av.GetProject.FindDoc(aDoc))
else
MsgBox.Warning("El Doc "+adoc.asstring+" no puede ser encontrado en
el proyecto actual.","Error")
return(nil)
end
end
'Agrega la lista de documentos
MyExt.add(TheDocList)
' Procesa la lista de controles
'__________________________________________
'Controls {GUI,ControlType,Scriptname}
'__________________________________________
'__________________________________________
'__________________________________________
for each aControl in TheControlList
'msgbox.info(acontrol.get(0).asstring,"")
if (acontrol.get(2)="Space") then
theDocGui=acontrol.get(0)
theControl=acontrol.get(1)
TheTotalControls.add({theDocGui,theControl,"Space"})
else
theControlDoc=av.getproject.findGUI(aControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("La GUI "+aControl.get(0)+" no se encontro en el
proyecto actual.","Error")
return(nil)
end
theControlType=acontrol.get(1)
thecommand="av.getproject.findGUI("""+aControl.get(0)+""").Get"+acontrol.g
et(1)
'msgbox.info(thecommand,"")
thescript1=Script.Make(thecommand)
thecontrolset=thescript1.doit("")
theFoundControl=TheControlSet.FindbyScript(aControl.get(2))
if (theFoundControl=NIL) then
MsgBox.Warning("No se encontraron controles con el script
"+aControl.get(2)+" in "+acontrol.get(1),"Advertencia")
87
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
return(nil)
end
if (theFoundControl.is(ToolMenu)) then
MsgBox.Warning("El script "+aControl.get(2)+" en
"+acontrol.get(1)+" es para un tool menu.","No compatible")
return(nil)
end
TheTotalControls.Add({aControl,thefoundControl,theControlSet.getcontrols.f
ind(thefoundcontrol)})
end
end
'Agregar a Ext
MyExt.add(TheTotalControls)
'__________________________________________
'theMenuList {Doc, Menu, MenuScript}
'__________________________________________
'__________________________________________
'__________________________________________
For each aMenu in themenulist
if (aMenu.get(2) = "Space") then
theDocGui=amenu.get(0)
theControl=amenu.get(1)
theTotalMenus.add({theDocGui,theControl,"Space"})
else
mDoc=aMenu.get(0)
mMenu=aMenu.get(1)
mScript=aMenu.get(2)
themDoc=av.getproject.findGUI(mDoc)
if (themDoc=NIL) then
MsgBox.Warning("La GUI "+mDoc+" no puede ser encontrada en el
proyecto actual.","Error")
return(nil)
end
theMbar=av.getproject.findGUI(mDoc).GetMenuBar
themenu=theMbar.findbylabel(mMenu)
if (themenu=NiL) then
MsgBox.Warning("El menu llamado "+mMenu+" no esta aqui.","Error")
return(nil)
end
themenucontrol=themenu.findbyScript(mScript)
if (themenucontrol=NiL) then
MsgBox.Warning("El script "+mScript+" no
encontrado.","Advertencia")
return(nil)
88
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
end
themenuitemidx=themenu.getcontrols.find(themenucontrol)
thetotalmenus.add({amenu,theMenuControl,theMenuItemIdx})
end
end
myext.add(thetotalmenus)
'__________________________________________
'
'la lista de popups {Doc, menu, PopupScript}
'__________________________________________
For each apopup in thepopuplist
if (apopup.get(2) = "Space") then
theDocGui=apopup.get(0)
theControl=apopup.get(1)
theTotalPopups.add({theDocGui,theControl,"Space"})
else
pDoc=apopup.get(0)
popMenu=apopup.get(1)
pScript=apopup.get(2)
thepDoc=av.getproject.findGUI(pDoc)
if (thepDoc=NIL) then
MsgBox.Warning("La GUI "+pDoc+" no puede ser encontrada en el
proyecto actual.","Error")
return(nil)
end
thepopups=av.getproject.findGUI(pDoc).GetPopUps
thepopup=thepopups.findbylabel(popMenu)
if (thepopup=NiL) then
MsgBox.Warning("El popup llamado "+popMenu+" no esta
aqui.","Error")
return(nil)
end
thepopupcontrol=thepopup.findbyScript(pScript)
if (thepopupcontrol=NiL) then
MsgBox.Warning("El script "+pScript+" no
encontrado.","Advertencia")
return(nil)
end
thepopitemidx=thepopup.getcontrols.find(thepopupcontrol)
thetotalpopups.add({apopup,thepopupControl,thepopItemIdx})
end
end
myext.add(thetotalpopups)
89
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
'__________________________________________
'Procesa la lista de Tool Menu
'__________________________________________
'__________________________________________
'__________________________________________
for each aControl in TheToolMenuList
theControlDoc=av.getproject.findGUI(aControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("La GUI "+aControl.get(0)+" no pudo ser encontrada en
el proyecto actual.","Error")
return(nil)
end
thecontrolset=theControlDoc.getToolbar
theFoundControl=TheControlSet.FindbyScript(aControl.get(1))
if (theFoundControl=NIL) then
MsgBox.Warning("No se encontro Control con el script
"+aControl.get(1)+" in "+acontrol.get(1),"Advertencia")
return(nil)
end
if (theFoundControl.is(ToolMenu).not) then
MsgBox.Warning("El script "+aControl.get(1)+" no es para un tool
menu.","Error")
return(nil)
end
TheTotalToolMenus.Add({aControl,thefoundControl,theControlSet.getcontrols.
find(thefoundcontrol)})
end
myext.add(thetotalToolmenus)
'__________________________________________
' Procesa la lista de scripts
'__________________________________________
'__________________________________________
'__________________________________________
for each ascript in TotalScripts
if ((av.getproject.findscript(ascript)="Null").NOT) then
myExt.Add(av.GetProject.FindScript(ascript))
else
MsgBox.Warning("El script "+ascript+" no puede ser encontrado en el
proyecto actual.","Error")
return(nil)
end
end
90
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
'__________________________________________
' Procesa la lista de dialogos
'__________________________________________
'__________________________________________
'__________________________________________
for each adialog in theDialogs
if ((av.getproject.finddialog(adialog)="Null").NOT) then
myExt.Add(av.GetProject.FindDialog(adialog))
else
MsgBox.Warning("El dialogo "+adialog+" no pudo ser encontrado en el
proyecto actual.","Error")
return(nil)
end
end
if (LoadScriptName <> Nil) then
if ((av.getproject.findscript(LoadScriptName)="Null").NOT) then
myExt.SetLoadScript( av.FindScript(LoadScriptName))
else
MsgBox.Warning("El Script Load "+LoadScriptName+" no pudo ser
encontrado en el proyecto actual.","Error")
return(nil)
end
end
if (UnLoadScriptName <> Nil) then
if ((av.getproject.findscript(UnLoadScriptName)="Null").NOT) then
myExt.SetUnLoadScript(av.FindScript(UnLoadScriptName))
else
MsgBox.Warning("El Script UnLoad "+UnLoadScriptName+" no pudo ser
encontrado en el proyecto actual.","Error")
return(nil)
end
end
myExt.SetAbout(theDescription)
myExt.SetExtVersion(theVersion)
myExt.Commit
==========================================================================
===
==========================================================================
===
==========================================================================
===
==========================================================================
91
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
===
' Nombre:
'
Install
'No Editar!!!
if (av.getproject=nil) then return(nil) end
'msgbox.info ("instalando la extension","")
theDocs = SELF.get(0)
theControlList = SELF.get(1)
theMenuList = SELF.get(2)
thePopupList= SELF.get(3)
theToolMenuList=SELF.Get(4)
theProject=Av.getproject
theOldCindex=0
ButtonStartIndex=23
TootlStartIndex=14
NumControlSpaces=0
NumToolSpaces=0
'Agrega los Docs
'
for each adoc in theDocs
theProject.addDoc(adoc)
end
'Agregar los Controles
'
for each totalControl in theControlList
'The Control list
acontrol=totalControl.get(0)
aspacer=totalControl.get(2)
if (aspacer="Space") then
if (NumControlSpaces=0) then
theCindex=ButtonStartIndex
theOldCindex=theCindex
NumControlSpaces=NumControlSpaces+1
else
theCindex=theOldCindex+1
end
thecommand="av.getproject.findGUI("""+totalControl.get(0)+""").Get"+totalc
ontrol.get(1)
thescript1=Script.Make(thecommand)
92
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
thecontrolset=thescript1.doit("")
theControl=space.make
theControl.setName("Spacer")
else
'El Control Fisico
theControl = totalControl.get(1)
'El Indice de Controles
theCindex=totalControl.get(2)
'Encuentra el DocGUI
theControlDoc=av.getproject.findGUI(aControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("The GUI "+aControl.get(0)+" cannot be found in
the current project.","Script Eror")
return(nil)
end
'Esto encuentra el set de controles
thecommand="av.getproject.findGUI("""+aControl.get(0)+""").Get"+acontrol.g
et(1)
thescript1=Script.Make(thecommand)
thecontrolset=thescript1.doit("")
theOldCindex=theCindex
end
'Agrega el control al set de controles
theControlSet.Add(theControl,theCindex)
end
'Agrega los menus
for each totalcontrol in theMenuList
'La Lista de Controles
acontrol=totalControl.get(0)
if (totalControl.get(2)="Space") then
theCindex=theOldCindex+1
theControl=space.make
theControl.SetName("Spacer")
else
mDoc=acontrol.get(0)
mMenu=acontrol.get(1)
mMenuItem=acontrol.get(2)
'El Control Fisico
theControl = totalControl.get(1)
'El Indice de Controles
93
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
theCindex=totalControl.get(2)
theOldCindex=theCindex
'Encuentra el DocGUI
theControlDoc=av.getproject.findGUI(aControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("La GUI "+aControl.get(0)+" no puedo ser
encontrada en el proyecto actual.","Script Eror")
return(nil)
end
theMbar=av.getproject.findGUI(mDoc).GetMenuBar
themenu=theMbar.findbylabel(mMenu)
if (themenu=NiL) then
themenu=menu.make
themenu.setlabel(mMenu)
theMbar.add(themenu,999)
end
end
themenu.add(thecontrol, theCindex)
end
'________________________________________________________________
'Codigo estandar para agregar popups (No se usan en esta extension)
'________________________________________________________________
'Agrega los popups
for each totalcontrol in thePopupList
'The Control list
acontrol=totalControl.get(0)
if (totalControl.get(2)="Space") then
theCindex=theOldCindex+1
theControl=space.make
theControl.SetName("Spacer")
else
pDoc=acontrol.get(0)
popMenu=acontrol.get(1)
pMenuItem=acontrol.get(2)
'El control fisico
theControl = totalControl.get(1)
'El indice de control
theCindex=totalControl.get(2)
theOldCindex=theCindex
'Encuentra el DocGUI
theControlDoc=av.getproject.findGUI(aControl.get(0))
if (theControlDoc=NIL) then
94
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
MsgBox.Warning("La GUI "+aControl.get(0)+" no pudo ser encontrada
en el proyecto actual.","Error")
return(nil)
end
thepopups=av.getproject.findGUI(pDoc).Getpopups
thepopup=thepopups.findbylabel(popMenu)
if (thepopup=NiL) then
thepopup=popup.make
thepopup.setlabel(popMenu)
thepopups.add(thepopup,999)
end
end
thepopup.add(thecontrol, theCindex)
end
'______________________________________________________________________
'Agrega los Tool Menus
for each totalControl in theToolMenuList
'The Control list
acontrol=totalControl.get(0)
if (aControl="Space") then
theCindex=theOldCindex+1
theControl=space.make
else
'El Control Fisico
theControl = totalControl.get(1)
'El indice de control
theCindex=totalControl.get(2)
'Encuentra el DocGUI
theControlDoc=av.getproject.findGUI(aControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("La GUI "+aControl.get(0)+" no puede ser
encontrada en el proyecto.","Error")
return(nil)
end
'Esto encuentra el Control Set
thecommand="av.getproject.findGUI("""+aControl.get(0)+""").Get"+acontrol.g
et(1)
thescript1=Script.Make(thecommand)
thecontrolset=av.getproject.findGUI(aControl.get(0)).GetToolBar
theOldCindex=theCindex
end
'Agrega el control al Control Set
95
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
theControlSet.Add(theControl,theCindex)
end
av.getproject.setmodified(true)
====================================================================
====================================================================
====================================================================
' Nombre:
'
Uninstall
' NO EDITAR!!!
'SELF es la Extension
theDocs = SELF.get(0)
theControlList = SELF.get(1)
theMenuList = SELF.get(2)
thePopupList = SELF.get(3)
theToolMenuList=SELF.get(4)
theProject=Av.getproject
'remueve los Docs
'
for each adoc in theDocs
If (theProject.finddoc(adoc.getname)<>NIL) then
'theAnswer=msgbox.yesno("Remove the Document "+adoc.getname+"?","Remove
Document?",TRUE)
'if (theAnswer=TRUE) then theProject.RemoveDoc(adoc) end
theProject.RemoveDoc(adoc)
end
end
'Remueve los Controles
'
for each totalControl in theControlList
if (totalcontrol.get(2) <> "Space") then
'Obtener la lista de controles de la
acontrol=totalControl.get(0)
Ext
'Obtener el contro fisico
theControl = totalControl.get(1)
'Obtener el indice de controles
theCindex=totalControl.get(2)
96
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
'Encontrar el DocGUI para el Control
theControlDoc=av.getproject.findGUI(aControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("The GUI "+aControl.get(0)+" No puede ser
encontrado el proyecto actual.","Error")
return(nil)
end
'Esta secuencia encuentra el apropiado set de controles
thecommand="av.getproject.findGUI("""+aControl.get(0)+""").Get"+acontrol.g
et(1)
thescript1=Script.Make(thecommand)
thecontrolset=thescript1.doit("")
'Ver si el control esta en el set , si esta, removerlo
if (theControlSet.GetControls.find(theControl)<>NIL) then
theControlSet.remove(theControl)
if (thecontrol = "ToolBar") then
theControlSet.selectdefault
end
end
else
thecommand="av.getproject.findGUI("""+totalControl.get(0)+""").Get"+totalc
ontrol.get(1)
thescript1=Script.Make(thecommand)
thecontrolset=thescript1.doit("")
spacerControl=theControlSet.FindByName("Spacer")
if (spacerControl <> nil) then
theControlSet.remove(spacerControl)
end
end
end
'msgbox.info("Controles removidos","")
'Remover los menus
'
for each totalcontrol in theMenuList
'The Control list
acontrol=totalControl.get(0)
if (totalControl.get(2) <> "Space") then
mDoc=acontrol.get(0)
mMenu=acontrol.get(1)
mMenuItem=acontrol.get(2)
97
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
'El control fisico
theControl = totalControl.get(1)
'El indice de control
theCindex=totalControl.get(2)
'Encuentra el DocGUI
theControlDoc=av.getproject.findGUI(aControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("La GUI "+aControl.get(0)+" no puede ser
encontrada en el protecto actual.","Error")
return(nil)
end
theMbar=av.getproject.findGUI(mDoc).GetMenuBar
themenu=theMbar.findbylabel(mMenu)
if (themenu=NiL) then
MsgBox.Warning(" menu llamado "+mMenu+" no se encuentra
aqui.","Error")
'return(nil)
else
thething=themenu.getcontrols.find(thecontrol)
if (thething<>NIL) then
themenu.remove(thecontrol)
end
'msgbox.info(themenu.GetControls.count.asstring,"")
if (themenu.GetControls.count<1) then
theMbar.remove(themenu)
end
end
else
'Encuentra el DocGUI
theControlDoc=av.getproject.findGUI(totalControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("La GUI "+totalControl.get(0)+" no puede ser
encontrada en el proyecto actual."," Error")
return(nil)
end
theMbar=av.getproject.findGUI(mDoc).GetMenuBar
themenu=theMbar.findbylabel(mMenu)
if (themenu=NiL) then
MsgBox.Warning("El menu llamado "+mMenu+" no esta
aqui.","Script Eror")
'return(nil)
else
theSpacer=themenu.findbyname("Spacer")
if (thespacer <> nil) then
themenu.remove(theSpacer)
end
end
end
98
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
end
'msgbox.info("Menus Removidos OK","")
'_________________________________________________________________________
_
'Remueve los Popups
'_________________________________________________________________________
_
for each totalcontrol in thePopupList
'La lista de controles
acontrol=totalControl.get(0)
if (totalControl.get(2) <> "Space") then
pDoc=acontrol.get(0)
popMenu=acontrol.get(1)
pMenuItem=acontrol.get(2)
'El control fisico
theControl = totalControl.get(1)
'El indice de control
theCindex=totalControl.get(2)
'Encuentra el DocGUI
theControlDoc=av.getproject.findGUI(aControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("The GUI "+aControl.get(0)+" no se puede
encontrar en el proyecto actual.","Error")
return(nil)
end
thepopups=av.getproject.findGUI(pDoc).Getpopups
thepopup=thepopups.findbylabel(popMenu)
if (thepopup=NiL) then
MsgBox.Warning("El popup llamado "+popMenu+" no esta aqui.","
Error")
'return(nil)
else
thething=thepopup.getcontrols.find(thecontrol)
if (thething<>NIL) then
thepopup.remove(thecontrol)
end
'msgbox.info(themenu.GetControls.count.asstring,"")
if (thepopup.GetControls.count<1) then
thepopups.remove(thepopup)
end
end
else
'Encuentra el DocGUI
99
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
theControlDoc=av.getproject.findGUI(totalControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("La GUI "+totalControl.get(0)+" no puede ser
encontrada en el proyecto actual."," Error")
return(nil)
end
thepopups=av.getproject.findGUI(mDoc).Getpopups
thepopup=thepopups.findbylabel(popMenu)
if (thepopup=NiL) then
MsgBox.Warning("El popup llamado "+thepopup+" no se encuentra
aqui.","Error")
'return(nil)
else
theSpacer=thepopup.findbyname("Spacer")
if (thespacer <> nil) then
thepopup.remove(theSpacer)
end
end
end
end
for each totalControl in theToolMenuList
'Get the control list from the Ext
acontrol=totalControl.get(0)
'Obtiene el control fisico
theControl = totalControl.get(1)
'Obtiene el indice de controles
theCindex=totalControl.get(2)
'Encuentra el DocGUI para el Control
theControlDoc=av.getproject.findGUI(aControl.get(0))
if (theControlDoc=NIL) then
MsgBox.Warning("La GUI "+aControl.get(0)+" no puede ser encontrada
en el proyecto actual.","Script Eror")
return(nil)
end
'Esta secuencia encuentra el apropiado control set
thecontrolset=av.getproject.findGUI(aControl.get(0)).GetToolBar
'Ver si el control esta en el set , si esta, removerlo
if (theControlSet.GetControls.find(theControl)<>NIL) then
theControlSet.remove(theControl)
theControlSet.selectdefault
end
end
100
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
'msgbox.info("ToolMenus Removidos OK","")
'los scripts se borran.
'**** quitar comentarios si la extension contiene dialogos *****
'Dialog.DetachFromExtension(self)
av.purgeObjects
av.getproject.setmodified(true)
===================================================================
===================================================================
===================================================================
'Tesis. Banner
' banner en pantalla de presentacion de proyecto
av.SetName("EDICION DE CARTOGRAFIA")
'thePword = MsgBox.Password
'if (thePWord = "xalapa") then
imagen = "$HOME/banner.tif".AsFileName
duracion = 05
MsgBox.Banner(imagen,duracion,"Información")
'
'
'
'
av.GetProject.FindDoc("planta1").GetWin.Open
else
MsgBox.Info("incorrecto fuera de aqui","password")
av.GetProject.Close
'end
System.Beep
===================================================================
===================================================================
===================================================================
' Copy Paste con atributos
' Copia graficas (features) de un theme a otro del mismo tipo.
' Si los nombres y tipos de campo son los mismos, los atributos tambien
seran copiados.
' Copia graficas seleccionadas o todas si ninguna es seleccionada.
' Es necesario que haya al menos dos themes en la vista.
101
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
' Buscar una vista con themes
theView = av.GetActiveDoc
theThemes = theView.GetThemes
' revisa que se encuentren al menos dos temas en la vista
if(theThemes.Count < 2)then
MsgBox.Error("Es necesario tener al menos dos themes en la vista","")
return nil
end
' seleccionar el theme origen (se trabajara con el theme activo)
ThemeOrigen = theView.GetActiveThemes.Get(0)
'''''MsgBox.ListAsString(theThemes, "Selecciona el theme de donde copiar
las graficas:","Theme Origen")
if(ThemeOrigen = NIL)then
return nil
end
if(ThemeOrigen.Is(FTheme).Not)then
MsgBox.Error(ThemeOrigen.GetName.Quote+" No es un Theme
Valido.","Error")
return nil
end
'
Genera una lista de themes con el mismo tipo de graficas
(Features)
ThemeDestino = {}
for each aTheme in theThemes
if(aTheme <> ThemeOrigen)then
if(aTheme.Is(FTheme))then
if(ThemeOrigen.GetFTab.FindField("Shape").GetType =
aTheme.GetFTab.FindField("Shape").GetType)then
ThemeDestino.Add(aTheme)
end
end
end
end
' Se asegura de que hay al menos un theme de destino valido
if(ThemeDestino.IsEmpty)then
MsgBox.Error("No hay Themes de destino validos en la vista. Los
Themes validos deben ser del mismo tipo (point, line, polygon) que el
Theme origen . . .","No hay Theme destino valido")
return nil
end
' Si existe mas de un Theme destino del mismo tipo, se tendra que
seleccionar uno
' de otra manera, usar el theme uno como el Theme destino.
if(ThemeDestino.Count > 1)then
ThmDest = MsgBox.ListAsString(ThemeDestino,"Seleccione el Theme
destino:","")
102
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
if(ThmDest = NIL)then
return nil
end
else
if(MsgBox.YesNo(ThemeDestino.Get(0).GetName.Quote+" Es el
unico Theme destino valido en esta vista."+NL+NL+"Usarlo como Theme
destino ?","CopyPaste",TRUE))then
ThmDest = ThemeDestino.Get(0)
else
return nil
end
end
'
Obtener las FTabs
FTabOrigen = ThemeOrigen.GetFTab
FTabDestino = ThmDest.GetFTab
' Poner la Ftab destino en modo de edicion si todavia no lo esta
' El Theme origen no necesita estar en modo de edicion
' tampoco importa tener otro Theme en modo de edicion en la vista
if(FTabDestino.IsEditable.Not)then
FTabDestino.SetEditable(TRUE)
end
' Si se hizo una seleccion en el Theme origen, utilizarla,
' de otra manera, utilizar todo el Theme origen
if(FTabOrigen.GetSelection.Count = 0)then
theRecstoAdd = FTabOrigen
else
theRecstoAdd = FTabOrigen.GetSelection
end
'
Obtener una lista de los campos del Theme origen
theFromFields = FTabOrigen.GetFields
' Pegar la graficas (features)
' Aqui checamos si existen campos iguales en las tablas de los dos temas
'Origen' y 'Destino'
' y copia los atributos donde los nombres de los campos y los tipos de
los campos son iguales
for each rec in theRecstoAdd
newRec = FTabDestino.AddRecord
for each aFld in theFromFields
theToFld = FTabDestino.FindField(aFld.GetName)
if(theToFld <> NIL)then
if(theToFld.GetType = aFld.GetType)then
FromValue = FTabOrigen.ReturnValue(aFld, rec)
FTabDestino.SetValue(theToFld, newRec, FromValue)
end
end
103
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
end
end
' Desactivar el modo de edicion de la Ftab destino
FTabDestino.SetEditable(FALSE)
=======================================================
=======================================================
=======================================================
' Nombre: Tesis.ConvierteaPoligonos
'
' Funcion: Convierte polilineas cerradas de un tema a poligonos en otro
tema
'
Vista
= av.GetActiveDoc
ThemeOrigen = Vista.GetActiveThemes.Get(0)
' Especificar el shapefile de salida...
'
fnDefault = FileName.Make("$HOME").MakeTmp("shape","shp")
shpSalida = FileDialog.Put( fnDefault,"*.shp","Shapefile de Salida" )
if (shpSalida = nil) then exit end
shpSalida.SetExtension("shp")
ftbSalida = FTab.MakeNew( shpSalida, POLYGON )
ftbSalida.AddFields({Field.Make("ID", #FIELD_LONG, 8, 0)})
' Las polilineas deben formar figuras cerradas, de otra manera no se
'podran crear poligonos
LineasCerradas = TRUE
' Usar figuras seleccionadas si es que hay, de otra manera trabajar con la
' Ftab entera
'
if (ThemeOrigen.GetFTab.GetSelection.Count > 0) then
Seleccion = ThemeOrigen.GetFTab.GetSelection
nRecs = Seleccion.Count
else
Seleccion = ThemeOrigen.GetFTab
nRecs = Seleccion.GetNumRecords
end
nCount = 0
nRecAgregado = 0
fldShapeIn = ThemeOrigen.GetFTab.FindField("shape")
fldShapeOut = ftbSalida.FindField("shape")
fldIDOut
= ftbSalida.FindField("id")
104
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
for each r in Seleccion
nCount = nCount + 1
av.SetStatus((nCount / nRecs) * 100)
shpIn = ThemeOrigen.GetFTab.ReturnValue(fldShapeIn,r)
if (shpIn.AsList.Count > 1) then
MsgBox.Warning("No se puede convertir figuras con multipartes en el
record"++
nCount.AsString,"Convertir Polilineas a Poligonos")
continue
end
lstPoints = shpIn.AsList.Get(0)
PuntoInicio = lstPoints.Get(0)
PuntoFinal
= lstPoints.Get((lstPoints.Count - 1))
if (PuntoInicio <> PuntoFinal) then
if (LineasCerradas) then
PuntoFinal.SetX(PuntoInicio.GetX.Clone)
PuntoFinal.SetY(PuntoInicio.GetY.Clone)
else
continue
end
end
shpNew = Polygon.Make({lstPoints})
shpNew.Clean
nRecNew = ftbSalida.AddRecord
ftbSalida.SetValue(fldShapeOut,nRecNew,shpNew)
ftbSalida.SetValue(fldIDOut,nRecNew,nCount)
nRecAgregado = nRecAgregado + 1
end
av.SetStatus(100)
if (nRecAgregado = 0) then
MsgBox.Info("No se encontraron polilineas cerradas. No se puede hacer
conversion"++
"polilineas a poligonos.", "Convertir Polilineas a Poligonos")
exit
end
if (MsgBox.YesNo("Agregar shapefile como theme a una vista?",
"Convertir Polilineas a Poligonos", true).Not) then
exit
end
' Crear una lista de vistas y permitir al asuario seleccionar en cual
vista
' agregar el nuevo theme.
lstViews = {}
for each d in av.GetProject.GetDocs
105
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
if (d.Is(View)) then
lstViews.Add( d )
end
end
lstViews.Add("<New View>")
vweAddTo = MsgBox.ListAsString( lstViews,"Agragar Theme a:",
"Convertir Polilineas a Poligonos" )
' En la vista seleccionada, crear el theme, y agregarlo
if (vweAddTo <> nil) then
if (vweAddTo = "<New View>") then
vweAddTo = View.Make
vweAddTo.GetWin.Open
end
thmNuevo = FTheme.Make( ftbSalida )
vweAddTo.AddTheme( thmNuevo )
vweAddTo.GetWin.Activate
end
============================================================
============================================================
============================================================
'---------------------------------------------------' Name: tesis.ConvaLineasotroTema
' Description: Convierte un tema de poligonos o polilineas a un tema de
'lineas Se creara un tema nuevo que contenga solo lineas con solo dos
vertices.
' Todos los atributos seran copiados al nuevo tema.
'
'
'---------------------------------------------------theView = av.GetActiveDoc
themeList = theView.GetThemes
wkdir = av.GetProject.GetWorkDir
'------------------------' Selecciona tema a convertir
'------------------------rep = 0
stupid = 0
while (rep = 0)
primerTheme = MsgBox.ChoiceAsString(themeList,"Selecciona un tema
(poligono or polilinea)","Poligono/Polilinea a Linea...")
if (primerTheme = NIL) then
exit
end
if (primerTheme.Is(Ftheme).Not) then
106
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
stupid = stupid+1
if (stupid = 4) then
msgBox.Info("Usuario de ArcView GIS. Seleccione un tema
velido","Problema?")
end
msgBox.Error("Tema no valido","Error")
else
rep = 1
primeraFtab = primerTheme.GetFtab
end
end
'------------------------'Crea nuevo tema
'------------------------rep = 0
fName = FileName.Make(wkdir.AsString).MakeTmp("line","shp")
while (rep = 0)
outFileName = FileDialog.Put(fName,"*.shp","Nuevo tema que contendra las
lineas.")
if (outFileName = NIL) then
exit
elseif (outFileName.GetBaseName.AsTokens(".").Get(0).Contains(" ")) then
MsgBox.Warning("Tema nuevo no especificado, Crea uno","Advertencia")
else
rep = 1
end
end
'------------------------' Copia los campos al nuevo tema
'
'------------------------firstfieldlist = List.Make
CamposSalida = List.Make
FtabSalida=Ftab.MakeNew(outFileName,Polyline)
for each ffield in primeraFtab.GetFields
if (ffield.GetName <> "shape") then
CamposSalida.Add(ffield.Clone)
firstfieldlist.Add(ffield.AsString)
end
end
FtabSalida.AddFields(CamposSalida)
ThemeSalida = FTheme.Make(FtabSalida)
107
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
'------------------------' Convertir a lineas
'------------------------shapefield = FtabSalida.FindField("shape")
av.ShowMsg("Convirtiendo a Lineas..")
av.SetStatus(0)
av.ShowStopButton
sstatus = primeraFtab.GetNumRecords
for each frec in primeraFtab.Clone
thelinelist =
primeraFtab.ReturnValue(shapefield,frec).AsMultipoint.AsList
numOfPoint = thelinelist.Count
for each theIndex in 0..(thelinelist.Count-2)
newrec = FtabSalida.AddRecord
FtabSalida.SetValue(shapefield,newrec,polyline.Make({{thelinelist.Get(theI
ndex),thelinelist.Get(theIndex+1)}}))
for each f in firstfieldlist
outfield = FtabSalida.FindField(f)
infield = primeraFtab.FindField(f)
FtabSalida.SetValueString(outfield,newrec,primeraFtab.ReturnValueString(in
field,frec))
end
end
if ((av.SetStatus(frec/sstatus*100))=false) then
break
end
end
'------------------------' Finalizar
'------------------------ThemeSalida.StopEditing (true)
FtabSalida.Flush
FtabSalida.Refresh
av.purgeobjects
av.ClearStatus
av.ClearMsg
'------------------------'Agrega tema a arcview
'------------------------theView.AddTheme(ThemeSalida)
============================================================
108
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
============================================================
============================================================
'TESIS START STOP EDITTING
theView = av.GetActiveDoc
active = theView.GetActiveThemes.Get(0)
editThm = theView.GetEditableTheme
if (editThm <> nil) then
' we need to stop editing this theme
doSave = MsgBox.YesNoCancel("Save Edits to "+editThm.GetName+
"?", "Stop Editing", true)
if (doSave = nil) then
return nil
end
if (editThm.StopEditing(doSave).Not) then
' save failed, remain editing this theme
MsgBox.Info ("Unable to Save Edits to "
+ editThm.GetName +
", please use the Save Edits As option", "")
return nil
end
' save succeeded
theView.SetEditableTheme(NIL)
if (editThm = active) then
' user wanted to stop editing the active theme, were done
return nil
end
end
if (active.GetFTab.IsBeingEditedWithRecovery) then
' user wants to edit the active theme in the view, but its
' table doc is already being edited - force the
' user to stop editing the table
doSave = MsgBox.YesNoCancel("Save Edits to the table for "+
active.GetName+"?", "Stop Editing", True)
if (doSave = nil) then
return nil
end
if (active.GetFTab.StopEditingWithRecovery(doSave).Not) then
MsgBox.Info ("Unable to Save Edits, please use the Save Edits As
option", "")
return nil 'unable to save, remain editing
end
end
' start editing the
active theme
109
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
theView.SetEditableTheme(active)
=================================================================
===================================================================
=================================================================
'TESIS UNION DE GRAFICAS
theView = av.GetActiveDoc
theTheme = theView.GetEditableTheme
if (theTheme <> nil) then
theTheme.GetFTab.BeginTransaction
theTheme.UnionSelected
theTheme.GetFTab.EndTransaction
theTheme.Invalidate(TRUE)
else
theGraphics = theView.GetGraphics
selGraphics = theGraphics.GetSelected
numSel = selGraphics.Count
x = numSel - 1
gra1 = selGraphics.Get(0)
shpUnionAll = gra1.GetShape
theSym = gra1.GetSymbol
theGraphics.RemoveGraphic(gra1)
for each i in 1..x
gra = selGraphics.Get(i)
shp = gra.GetShape
shpUnion = shp.ReturnUnion(shpUnionAll)
shpUnionAll = shpUnion
theGraphics.RemoveGraphic(gra)
end
if (shpUnionAll.IsEmpty.Not) then
graUnionAll = graphicShape.Make(shpUnionAll)
graUnionAll.SetSymbol(theSym)
theGraphics.Add(graUnionAll)
end
end
'========================================================
'========================================================
'========================================================
' Nombre:
'
Snap
' Descripcion: Este script debe de ser asignado a un nuevo boton en la
'barra de herramientas (Tool Bar). Presionando el boton izquierdo del
'mouse se desplegara un circulo en el tema (theme), donde las lineas a
110
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
'ser unidas deberan quedar dentro del circulo y al soltar el boton de
'mouse los extremos de las lineas quedaran unidas al extremo de la linea
'que se encuentre mas cerca al centro del circulo. Si el circulo encierra
'una line entera, los extremos (endpoits) mas cercanos a otros extremos
'de otras lineas son los que seran unidos, de otra manera, seria una
'contradiccion a los estatutos de arcview de que una linea o polilinea
'de arcview tengan el mismo punto de inicio y de final. Esta es una manera
'rapida y precisa de unir (snap) muchas lineas en sus extremos. Cabe
'mencionar que, aunque las lineas ya se encuentren unidas, en la tabla
'de atributos seguiran apareciendo como objetos separados de tipo linea.
'Si se desea unir los atributos de las lineas en uno solo debera usarse
'otro boton de esta extension. Este script requiere obligatoriamente que
'el tema (theme) a trabajar se encuentre en modo de edicion (start
editing).
v = av.GetActiveDoc
if (v.Is(View).Not) then System.Beep return nil end
d = v.GetDisplay
' debe de haber una vista activa en el proyecto
c = d.ReturnUserCircle
if (c = nil) then System.Beep return nil end
if (c.GetRadius <= 0) then System.Beep return nil end
cc = c.ReturnCenter
r = c.GetRadius
'Valida que se genere el cirulo o el radio de este no sea menor o igual
que cero.
t = v.GetEditableTheme
if (t = nil) then System.Beep return nil end
if (t.Is(FTheme).Not) then System.Beep return nil end
f = t.GetFTab
fs = f.FindField("shape")
if (fs.GetType <> #FIELD_SHAPELINE) then System.Beep return nil end
'El theme debara estar en modo de edicion (start editing)
t.SelectByShapes({c},#VTAB_SELTYPE_NEW)
if (f.GetSelection.Count <= 1) then System.Beep return nil end
'Valida que haya mas de una linea dentro del circulo.
minDist = nil
p0 = nil 'el punto donde sera aplicado el snap
recList = List.Make 'una lista de listas, donde cada una de las cuales
'contiene un FTab rec#
'y un booleano, el cual si es verdadero significara
'hacer un snap al
'primer nodo y si es falso, hara un snap al ultimo
nodo.
for each rec in f.GetSelection
111
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
if (minDist = nil) then
minDist = cc.Distance(f.ReturnValue(fs,rec).AsList.Get(0).Get(0)) + 1
end
aList = f.ReturnValue(fs,rec).AsList.Get(0)
thisDist1 = cc.Distance(aList.Get(0))
thisDist2 = cc.Distance(aList.Get(aList.Count - 1))
if (thisDist1 < minDist) then
minDist = thisDist1
p0 = aList.Get(0)
end
if (thisDist2 < minDist) then
minDist = thisDist2
p0 = aList.Get(aList.Count - 1)
end
'---snapPrimero = nil
aAgregar = nil
if (thisDist1 <= r) then
snapPrimero = true
aAgregar = {rec.Clone,snapPrimero}
end
if (thisDist2 <= r) then
if (snapPrimero = true) then
if (thisDist2 < thisDist1) then
aAgregar = {rec.Clone,false}
end
else
aAgregar = {rec.Clone,false}
end
end
if (aAgregar <> nil) then
recList.Add(aAgregar)
end
end
if (p0.Is(Point).Not) then System.Beep return nil end
LineasMalas = 0
'LineasBuenas = 0
'recsString = ""
f.BeginTransaction
for each l in recList
theRec = l.Get(0)
oldLine = f.ReturnValue(fs,theRec)
v.getgraphics.add(graphicshape.make(oldLine)) 'Enlazar un endpoint a el
'endpoint contrario del
seleccionado
oldLineList = oldLine.AsList
'
112
Apéndice B: Diseño de la aplicación y Codigo fuente de SW
if (l.Get(1) = true) then
oldLineList.Get(0).Set(0,p0)
else
oldLineList.Get(0).Set(oldLineList.Get(0).Count - 1,p0)
end
nuevaLinea = Polyline.Make(oldLineList)
if (nuevaLinea.Is(Polyline)) then
f.SetValue(fs,theRec,nuevaLinea)
'
LineasBuenas = LineasBuenas + 1
else
LineasMalas = LineasMalas + 1
end
end
f.EndTransaction
if (LineasMalas > 0) then
MsgBox.Warning(LineasMalas.AsString ++ "Lineas con errores, snappin
invalido.","Error de Snapping")
end
'
Las Siguientes Lineas son opcionales - pueden ser omitidas
'
colocando una marca de comentario (') al inicio de ellas.
'
f.GetSelection.ClearAll 'Estas dos lineas de codigo hacen que despues de
ser unidos
f.UpdateSelection
'los extremos de las lineas, estas no queden
seleccionadas,
'lo cual hace posible observar de manera mas
clara la union.
v.Invalidate
estan unidas.
'Actualiza la vista redibujando las lineas que ahora
============================================================
============================================================
============================================================
113
Descargar