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