' Name:  View.ShapeToSPRING 
'
' Autores: Ubirajara Freitas, Gilberto Camara
' Ultima Modificacao: 06.07.2000
' 
' Title:  Exporta shapefiles para formato ASCII/INPE
'
' Topics:  GeoData
'
' Description:  Exporta os temas ativos para o formato ASCII/INPE 
' Cada tema ativo ira requerer que o usuario especifique um nome de arquivo 
' de saida.  
'
' Antes de executar este programa, faca os seguintes procedimentos:
'
' 1. Determine a categoria, no esquema conceitual do SPRING,
'    na qual os dados serao inseridos. Esta categoria pode ser dos modelos 
'    "objeto" ou "tematico" "numérico"
'    Toponimia poderá ser inserida em qualquer dos modelos acima.
'    Para gerar uma arquivo ASCII com toponimia selecione "texto". 
' 
' 2. No caso de categoria do tipo "objeto", 
'    indique o nome desta categoria quando solicitado.
'
' 3. Selecione uma coluna da tabela do ARC/VIEW que devera servir
'    de "Nome" para o dado no SPRING, no caso de objetos, 
'    ou "Classe"no caso de tematico.
'    Esta coluna sera utilizada posteriormente
'    para importar a tabela de dados do ARC/VIEW para o SPRING.
'
' 4. Selecione os campos da tabela associada ao "shapefile" que
'    deseja exportar para o SPRING
'
' 5. Serao gerados tres arquivos:
'    - <nomeshape>.lin - contem as linhas
'    - <nomeshape>.lab - contem os rotulos
'    - <nomeshape>.tab - contem a tabela com os dados dos objetos
'    
' 6. Se encontrar algum problema, envie mail para gilberto@dpi.inpe.br
' 
' Este programa e' copirraite DPI/INPE - 1998
'
' Requires:  O arquivo a ser exportado deve ser o documento ativo no ARC/VIEW
'
' Self:  
'
' Returns:  
'

' View should be the Active Document
'
theView = av.GetActiveDoc

' Recupera a projecao
datum = nil
projection= nil
     
thePrj    = theView.GetProjection
if ((nil = thePrj).Not And ((thePrj.AsString).IsNull).Not) then
'if (((thePrj.AsString).IsNull).Not) then
    MsgBox.Info("Nao e nulo","Aviso")

    projection  = "PROJECTION  " + thePrj.AsString 


    if ((nil = thePrj.GetSpheroid).Not) then
      datum  = "DATUM " +  thePrj.GetSpheroid.GetSpheroidName


      majorAxis = thePrj.GetSpheroid.ReturnRadius 
      eccent    = thePrj.GetSpheroid.ReturnEccentricity

      minorAxis = (majorAxis*majorAxis *( 1 - eccent )).Sqrt

      flat = ( majorAxis - minorAxis ) / majorAxis

      datum = datum + ", " + majorAxis.AsString +", " + flat.AsString + "0.0, 0.0, 0.0"

end

if ( thePrj.Is (EquidistantConic) ) then

     projection = projection +", 0"
     projection = projection + ", " + thePrj.ReturnReferenceLatitude.AsString 
     projection = projection + ", " + thePrj.ReturnCentralMeridian.AsString
     projection = projection + ", " + thePrj.ReturnUpperStandardParallel.AsString
     projection = projection + ", " + thePrj.ReturnLowerStandardParallel.AsString

end

if ( thePrj.Is (Albers) ) then

     projection = projection +", 0"
     projection = projection + ", " + thePrj.ReturnReferenceLatitude.AsString 
     projection = projection + ", " + thePrj.ReturnCentralMeridian.AsString
     projection = projection + ", " + thePrj.ReturnUpperStandardParallel.AsString
     projection = projection + ", " + thePrj.ReturnLowerStandardParallel.AsString
end

 
if ( thePrj.Is (Mercator) ) then

     projection = projection +", 0"
     projection = projection + ", " + thePrj.ReturnReferenceLatitude.AsString 
     projection = projection + ", " + thePrj.ReturnCentralMeridian.AsString
     projection = projection + ",0 "
     projection = projection + ",0 " 

end

if ( thePrj.Is (TransverseMercator) ) then

     projection = projection +", 0"
     projection = projection + ", " + thePrj.ReturnReferenceLatitude.AsString 
     projection = projection + ", 0 " 
     projection = projection + ", 0 " 
     projection = projection + ", 0" 

end

end


' Para cada tema selecionado,
' faz a exportacao de dados

for each t in theView.GetActiveThemes
	
'Inicializa

  	theFTab     = t.GetFTab
  
   'Recupera o tipo de shapefile
   
  	shapeField  = theFTab.FindField( "Shape" )
  	shapeType   = shapeField.GetType
  	
   'Recupera o numero de registros
   numRecs     = theFTab.GetNumRecords
   
   'Mostra o botao de interrupcao
  	av.ShowStopButton
  
   'Mostra o leioute de saida
  	av.ShowMsg( "Exporting"++t.GetName+"..." )
  
	  ' Establish output precision...
  	Script.The.SetNumberFormat( "d.dddddd" )

 	'Seleciona tipo de dado a exportar

 	 optionList = { "Objeto","Tematico","Numerico","Texto"} 
	  option = MsgBox.ChoiceAsString( optionList, 
    		      "Selecione Modelo de Dados a Gerar:","Opcao" )

	  if (option = "Objeto") then
		          myChoice = 1
	  elseif (option = "Tematico") then
		          myChoice = 2
	  elseif (option = "Numerico") then
		          myChoice = 3
	  else
		          myChoice = 4
	  end

   lineData = false
   pointData = false

  'Obtem o BOX
   
  themeExtent = t.ReturnExtent
  
  x1Coord = themeExtent.GetLeft
  y1Coord = themeExtent.GetBottom
  x2Coord = themeExtent.GetRight
  y2Coord = themeExtent.GetTop
  
  boxMessage ="BOX "+x1Coord.AsString + " " + y1Coord.AsString + " " + x2Coord.AsString + " " + y2Coord.AsString
  
  comment="//Arquivo gerado a partir de SHAPE FILES pelo script shp2spring"
  comment1="SEPARATOR ;"
  comment2="// Formato coordx ; coordy ; label ; name ; category_obj"
  comment3="// Formato coordx ; coordy ; class_name"

  
  '***********************************************************************
  'Objetos
  if ( myChoice = 1 ) then 
  
	    ' Cria um nome default no ARCVIEW
		      arcViewName    = FileName.GetCWD.MakeTmp ( t.GetName.LCase,"txt") 
        nameFileName    = ((arcViewName.AsString).Left(((arcViewName.AsString).Count)-4))+ "_L2D.spr"
		    ' Pede ao usuario que informe o nome do arquivo
		      defaultName  = FileDialog.Put ( FileName.Make(nameFileName),"*.spr","Export"++t.GetName )


		  ' Cria arquivos de LINES(L2D),LABEL(LAB),POINTS(P2D),TABLE(TAB)
       linesFileName = defaultName.AsString
       linesFile     = LineFile.Make ( defaultName, #FILE_PERM_WRITE )
		     labelFileName  = ((defaultName.AsString).Left(((defaultName.AsString).Count)-8))+ "_LAB.spr"		
		     labelFile     = LineFile.Make ( FileName.Make(labelFileName), #FILE_PERM_WRITE )
		     pointsFileName  = ((defaultName.AsString).Left(((defaultName.AsString).Count)-8))+ "_P2D.spr"		
		     pointsFile     = LineFile.Make ( FileName.Make(pointsFileName), #FILE_PERM_WRITE )
		     tableFileName  = ((defaultName.AsString).Left(((defaultName.AsString).Count)-8))+ "_TAB.spr"		
		     tableFile     = LineFile.Make ( FileName.Make(tableFileName), #FILE_PERM_WRITE )

    '
    ' Header do arquivo de label points
    '  
      labelFile.WriteElt ( "POINTS" )
      labelFile.WriteElt ( "INFO" )
      labelFile.WriteElt ( comment)
      
      if ((datum = nil).Not) then
          labelFile.WriteElt (datum)
      end
      if ((projection = nil).Not) then
          labelFile.WriteElt (projection)
      end

      labelFile.WriteElt ( boxMessage)
      
      labelFile.WriteElt ( comment1)
      labelFile.WriteElt ( comment2)

      labelFile.WriteElt ( "INFO_END" )
    
   ' Header do arquivo de linhas
  
      linesFile.WriteElt ( "LINES" )
      linesFile.WriteElt ( "INFO" )
      linesFile.WriteElt ( comment)
       if ((datum = nil).Not) then
          linesFile.WriteElt (datum)
      end
      if ((projection = nil).Not) then
          linesFile.WriteElt (projection)
      end

     linesFile.WriteElt ( boxMessage)
     linesFile.WriteElt ( "INFO_END" )
      
    ' Header do arquivo de pontos
   
      pointsFile.WriteElt ( "POINT2D" )
      pointsFile.WriteElt ( "INFO" )
      pointsFile.WriteElt ( comment)
 

      if ((datum = nil).Not) then
          pointsFile.WriteElt (datum)
      end
      if ((projection = nil).Not) then
          pointsFile.WriteElt (projection)
      end

      pointsFile.WriteElt ( boxMessage)
      pointsFile.WriteElt ( comment1)
      pointsFile.WriteElt ( comment2)
      pointsFile.WriteElt ( "INFO_END" )


     springDB = MsgBox.Input ( "Entre com o nome do Banco de Dados SPRING:", "Nome da BDados", 
             "BDadosSPRING" )

    	springCatObj = MsgBox.Input ( "Entre com o nome da categoria dos objetos:", 
             "Nome da Categoria", 
             "ClasseSPRING" )

  	'Aqui se faz a escolha do campo que servira como identificador dos objetos
  	'
  
  	  fieldList = t.GetFTab.GetFields.Clone
  	  fieldList.Insert( "<None>" )
  	  idField = MsgBox.ChoiceAsString( fieldList, 
    		"Selecione campo com ID dos objetos da saida:","Choose ID Field" )
  
  	  if ( idField = nil ) then 
    		  exit
  	  elseif ( idField = "<None>" ) then
    		  useID = false
  	  else
    		  useID = true
  	  end 
  
    '
    'Aqui se faz a escolha do campoque servira como nome dos objetos
    ' se "None" o nome sera igual ao ID (rotulo ou label)
    '
  
   	  nameField = MsgBox.ChoiceAsString( fieldList, 
    		"Selecione campo com Nome dos objetos da saida:","Choose name Field" )
  
  	  if ( nameField = nil ) then 
    		  exit
  	  elseif ( nameField = "<None>" ) then
    		  useName = false
  	  else
    		  useName = true
  	  end 
  
 

  	  'Aqui se selecionam os atributos de saida da tabela

  	  ' Insere um novo campo na lista de atributos
  	  fieldList.Insert ( "<Todos>" )
  	  ' Cria uma lista com os atributos de saida
  	  attrList = List.Make
  	  attrChoice = "<None>"
  
  	  while ( attrChoice <> nil )
        	    
        	attrChoice = MsgBox.ChoiceAsString ( fieldList,
            	"Selecione Atributos da Tabela:", "Escolha Atributos" )
 
        	if ( attrChoice = "<Todos>" ) then
            	for each f in t.GetFTab.GetFields
             	 	attrList.Add ( f )
            	end
            	break
        	end
        	if ( attrChoice = "<None>" ) then
            	break
        	end
        
        	if ( attrChoice <> nil ) then
            	attrList.Add ( attrChoice )
        	end
   	  end
      
      ' Header do Arquivo de Tabela

  	  tableFile.WriteElt ( "TABLE" )
  	  tableFile.WriteElt ( "INFO" )
  	  tableFile.WriteElt ( comment)
  	  outputLine = "DATABASE " + springDB 
  	  tableFile.WriteElt ( outputLine )
      
	    outputLine = "CATEGORY_OBJ " + springCatObj
     tableFile.WriteElt ( outputLine )  
  
  
  	  outputLine = "T_KEY" + ",TEXT,32,0"
  	  tableFile.WriteElt ( outputLine )
  	  outputLine = "T_NAME" + ",TEXT,32,0"
  	  tableFile.WriteElt ( outputLine )

	    'Escreve os demais campos
  
  	  for each f in attrList

             if (  f.IsTypeString ) then
                 outputLine = f.GetName.UCase + ",TEXT," + f.GetWidth.AsString + ",0"
                 tableFile.WriteElt ( outputLine )
             elseif (  f.IsTypeNumber ) then
                 if ( f.GetPrecision = 0 ) then
                     outputLine = f.GetName.UCase + ",INTEGER," + "10,0"
                 else
                     outputLine = f.GetName.UCase + ",REAL," + "17,8"
                 end
                 tableFile.WriteElt ( outputLine )
             end
  	  end
  	  tableFile.WriteElt ( "INFO_END" )
  
  'Para cada objeto
  
      ' Aqui vamos percorrer o "shapefile
		 ' Para cada entidade, inicialmente escrevemos 
		 ' seu centroide no arquivo de "label points"
		 ' acompanhado das informacoes pedidas pelo formato
		 ' ASCII-INPE
      
		 ' A seguir, escrevemos o conteudo geometrico da 
		 ' entidade no arquivo de linhas

		 ' Le cada registro da tabela de entidades

  		 for each recNum in theFTab
 
      		' Recupero o "shape" corrente

    	 		  currentShape = theFTab.ReturnValue( shapeField, recNum )                   
                   
    
     	   if ( useID ) then
             id = theFTab.ReturnValueString( idField, recNum )
    	    else 
      	      id = (recNum + 1).SetFormat("d").AsString
    	    end
    
         ' No formato ASCII/INPE nao podem haver virgulas nem brancos
      			 inpeValue = id.Substitute ( ","," " )
      			 inpeValue = inpeValue.Substitute ( " ", "_" )
      
     	   if ( useName ) then
             name = theFTab.ReturnValueString( nameField, recNum )
    	    else 
      	      name = id
         end
    
         ' No formato ASCII/INPE nao podem haver virgulas nem brancos
      			 nameValue = name.Substitute ( ","," " )
      			 nameValue = nameValue.Substitute ( " ", "_" )
        
         firstLine  = "LABEL " + """" + inpeValue + """"   
         secondLine = "NAME "  + """" + nameValue + """"            
         thirdLine = "CATEGORY_OBJ " + """"  + springCatObj + """" 

      
        if ( shapeType = #FIELD_SHAPEPOLY ) then
        
              lineData = true
          
      		      ' Gera as linhas com um END no final de cada linha
      		      ' 
                shapeList = currentShape.AsList
       			      for each shapePart in shapeList
               	    for each xyPoint in shapePart
                  			    outputLine = xyPoint.GetX.AsString+"  "
                      			            +xyPoint.GetY.AsString
                  			    linesFile.WriteElt( outputLine )
               	    end
               	    linesFile.WriteElt( "END" )
        		      end
        
      		      ' Gera os identificadores para cada entidade, tomando
      		      ' cuidado para gerar apenas um identificador no caso
      		      ' de um poligono com "buracos"
          
      		      ' Percorre todos os componentes do "shape"
      
      			       for each shapePart in ShapeList
          
                    ' Aqui geramos o centroide
            	  ' No caso de poligono, geramos apenas um centroide por poligono externo
           					
                      thePolygon    = Polygon.Make ( {shapePart} )
            				      shapeIsInside = 0   
            
                    ' Testa se o poligono contem "buracos"
                    ' Percorre todos os shapes da lista 
                    ' Verifica se ha algum "shape" contido em outro
            
                  				for each otherShape in ShapeList 
                  
                		       			otherPolygon = Polygon.Make ( {otherShape} )
                					       if  ( thePolygon.IsContainedIn ( otherPolygon ) ) then
                
			                            			if ( NOT ( otherPolygon.IsContainedIn ( thePolygon ) ) ) then
                                 						 shapeIsInside = 1
                      						            break
			                			            end
                					       end
            				      end         
            				
                    ' Se o poligono esta dentro de outro, nao o escevemos
                         
                      if ( shapeIsInside = 1 ) then
                 				      continue
            				      end
            
                      if ( ( thePolygon.ReturnCenter.GetX.AsString = "Number null" ) or
                           ( thePolygon.ReturnCenter.GetY.AsString = "Number null" ) ) then
                             continue
                      end

	           				      outputLine =  thePolygon.ReturnCenter.GetX.AsString + ";"
		                         		      + thePolygon.ReturnCenter.GetY.AsString + ";"
                                                      + inpeValue + ";" + nameValue + ";" + springCatObj

                      ' labelFile.WriteElt( firstLine )
                      ' labelFile.WriteElt( secondLine )
                      ' labelFile.WriteElt( thirdLine )
          		    labelFile.WriteElt( outputLine )
          
               end 'for each shapepart
           
          elseif ( shapeType = #FIELD_SHAPELINE ) then         	 
                          
      		      ' Gera as linhas com um END no final de cada linha
      		      '       		  
                lineData = true

                shapeList = currentShape.AsList
       			     
                for each shapePart in shapeList
               	    for each xyPoint in shapePart
                  			    outputLine = xyPoint.GetX.AsString+"  "
                      			            +xyPoint.GetY.AsString
                  			    linesFile.WriteElt( outputLine )
               	    end
               	    linesFile.WriteElt( "END" )
        		      end
        
      		      ' Gera os identificadores para cada entidade          
      		      ' Percorre todos os componentes do "shape"
      
      			       for each shapePart in ShapeList
			                       	
                       aLine      =   Polyline.Make( {shapePart} )
			            	       outputLine =   aLine.ReturnCenter.GetX.AsString + ";"
			       	                         + aLine.ReturnCenter.GetY.AsString + ";"
                                                      + inpeValue + ";" + nameValue + ";" + springCatObj
				
                       if ( ( aLine.ReturnCenter.GetX.AsString = "Number null" ) or
                           ( aLine.ReturnCenter.GetY.AsString = "Number null" ) ) then
                             continue
                       end

                       'labelFile.WriteElt( firstLine )
                       'labelFile.WriteElt( secondLine )
                       'labelFile.WriteElt( thirdLine )
          		      labelFile.WriteElt( outputLine )
                end
          
			        elseif ( shapeType = #FIELD_SHAPEPOINT ) then

             		' Gera Point2d para cada entidade SHAPEPOINT
      			      '
                 pointData = true
                       
                	outputLine =   currentShape.ReturnCenter.GetX.AsString + ";"
					 + currentShape.ReturnCenter.GetY.AsString + ";" 
                               + inpeValue + ";" + nameValue + ";" + springCatObj
                 
                 ' pointsFile.WriteElt( firstLine )
                 ' pointsFile.WriteElt( secondLine )
                 ' pointsFile.WriteElt( thirdLine )
          		 pointsFile.WriteElt( outputLine )

		         end  '(SHAPEPOLY OR SHAPELINE OR SHAPEPOINT )

           'Gera os elementos da tabela para o caso de Objeto

        	  outputLine = inpeValue + "," + nameValue + ","
        
        	  for each f in attrList

           		if ( ( f.IsTypeNumber ) or ( f.IsTypeString ) ) then
              
               tabValue   = theFTab.ReturnValueString (f, recnum)
               inpeValue  = tabValue.Substitute ( ",", " " )
               outputLine = outputLine + inpeValue + ","
           		end
           end
        
        	  tableFile.WriteElt ( outputLine  )
       
           progress = (recNum / numRecs) * 100
           proceed = av.SetStatus( progress )
           if ( proceed.Not ) then
             av.ClearStatus
             av.ShowMsg( "Stopped" )
             exit
           end

		     end 'for each recnum
  
	    ' Termina o arquivo e fecha
     		linesFile.WriteElt( "END" )
       linesFile.Close
     		pointsFile.WriteElt( "END" )
		     pointsFile.Close
     		labelFile.WriteElt( "END" )
		     labelFile.Close
      	tableFile.WriteElt( "END" )
		     tableFile.Close

       if (lineData.Not) then
           MsgBox.Info("Arquivo não contem linhas", "Aviso")
           File.Delete(FileName.Make(linesFileName))
           File.Delete(FileName.Make(labelFileName))
       end
       
       if (pointData.Not) then
           MsgBox.Info("Arquivo não contem pontos", "Aviso")
           File.Delete(FileName.Make(pointsFileName))
       end

 
  end 'Objetos

 '************************************************************************
 'Dados tematicos
  if ( myChoice = 2 ) then 
 
 	    ' Cria um nome default no ARCVIEW
		      arcViewName    = FileName.GetCWD.MakeTmp ( t.GetName.LCase,"txt") 
        nameFileName    = ((arcViewName.AsString).Left(((arcViewName.AsString).Count)-4))+ "_L2D.spr"
		    ' Pede ao usuario que informe o nome do arquivo
		      defaultName  = FileDialog.Put ( FileName.Make(nameFileName),"*.spr","Export"++t.GetName )

		     if (defaultName = nil) then 
			        exit 
 	     end

		  ' Cria arquivos de LINES(L2D),LABEL(LAB),POINTS(P2D)
       linesFileName = defaultName.AsString
       linesFile     = LineFile.Make ( defaultName, #FILE_PERM_WRITE )
		     labelFileName  = ((defaultName.AsString).Left(((defaultName.AsString).Count)-8))+ "_LAB.spr"		
		     labelFile     = LineFile.Make ( FileName.Make(labelFileName), #FILE_PERM_WRITE )
		     pointsFileName  = ((defaultName.AsString).Left(((defaultName.AsString).Count)-8))+ "_P2D.spr"		
		     pointsFile     = LineFile.Make ( FileName.Make(pointsFileName), #FILE_PERM_WRITE )

    '
    ' Header do arquivo de label points
    '  
      labelFile.WriteElt ( "POINTS" )
      labelFile.WriteElt ( "INFO" )
      labelFile.WriteElt ( comment)
          
      if ((datum = nil).Not) then
          labelFile.WriteElt (datum)
      end
      if ((projection = nil).Not) then
          labelFile.WriteElt (projection)
      end
      labelFile.WriteElt ( boxMessage)
      labelFile.WriteElt ( comment1)
      labelFile.WriteElt ( comment3)
      labelFile.WriteElt ( "INFO_END" )
    
   ' Header do arquivo de linhas
  
      linesFile.WriteElt ( "LINES" )
      linesFile.WriteElt ( "INFO" )
      linesFile.WriteElt ( comment)
      if ((datum = nil).Not) then
          linesFile.WriteElt (datum)
      end
      if ((projection = nil).Not) then
          linesFile.WriteElt (projection)
      end
      linesFile.WriteElt ( boxMessage)
      linesFile.WriteElt ( comment3)
      linesFile.WriteElt ( "INFO_END" )
 
   ' Header do arquivo de pontos
   
      pointsFile.WriteElt ( "POINT2D" )
      pointsFile.WriteElt ( "INFO" )
      pointsFile.WriteElt ( comment)
      if ((datum = nil).Not) then
          pointsFile.WriteElt (datum)
      end
      if ((projection = nil).Not) then
          pointsFile.WriteElt (projection)
      end
      pointsFile.WriteElt ( boxMessage)
      pointsFile.WriteElt ( comment1)
      pointsFile.WriteElt ( comment3)
      pointsFile.WriteElt ( "INFO_END" )

   ' Pede o nome do campo que contem as classe
   
	    fieldList = t.GetFTab.GetFields.Clone
	    fieldList.Insert( "<None>" )  	
	    idField = MsgBox.ChoiceAsString( fieldList, 
    		         "Selecione campo com classe tematica:","Escolha Classe" )
  
  	  if ( idField = nil ) then 
    		    exit
  	  elseif ( idField = "<None>" ) then
    		    useID = false
          id = MsgBox.Input ( "Entre com o nome da classe tematica:", 
                                       "Nome da Classe", "ClasseSPRING" )
  	  else
    		    useID = true
  	  end 

   ' Aqui vamos percorrer o "shapefile
		 ' Para cada entidade, inicialmente escrevemos 
		 ' seu centroide no arquivo de "label points"
		 ' acompanhado das informacoes pedidas pelo formato
		 ' ASCII-INPE
      
		 ' A seguir, escrevemos o conteudo geometrico da 
		 ' entidade no arquivo de linhas

		 ' Le cada registro da tabela de entidades

  		 for each recNum in theFTab
 
      		' Recupero o "shape" corrente

    	 		  currentShape = theFTab.ReturnValue( shapeField, recNum )

    	 		  if ( useID ) then
             		id = theFTab.ReturnValueString( idField, recNum )
             
          end
                   
                   
        ' No formato ASCII/INPE nao podem haver virgulas nem brancos
      			 inpeValue = id.Substitute ( ","," " )
      			 inpeValue = inpeValue.Substitute ( " ", "_" )
      
      		' Retorne o "shape" corrente com uma lista de partes
      		' pois a entidade pode estar associada a mais de um
      		' poligono
      
        if ( shapeType = #FIELD_SHAPEPOLY ) then
          
                lineData = true

      		      ' Gera as linhas com um END no final de cada linha
      		      ' 
                shapeList = currentShape.AsList
       			      for each shapePart in shapeList
               	    for each xyPoint in shapePart
                  			    outputLine = xyPoint.GetX.AsString+"  "
                      			            +xyPoint.GetY.AsString
                  			    linesFile.WriteElt( outputLine )
               	    end
               	    linesFile.WriteElt( "END" )
        		      end
        
      		      ' Gera os identificadores para cada entidade, tomando
      		      ' cuidado para gerar apenas um identificador no caso
      		      ' de um poligono com "buracos"
          
      		      ' Percorre todos os componentes do "shape"
      
      			       for each shapePart in ShapeList
          
                    ' Aqui geramos o centroide
            				    ' No caso de poligono, geramos apenas um centroide por poligono externo
           					
                      thePolygon    = Polygon.Make ( {shapePart} )
            				      shapeIsInside = 0   
            
                    ' Testa se o poligono contem "buracos"
                    ' Percorre todos os shapes da lista 
                    ' Verifica se ha algum "shape" contido em outro
            
                  				for each otherShape in ShapeList 
                  
                		       			otherPolygon = Polygon.Make ( {otherShape} )
                					       if  ( thePolygon.IsContainedIn ( otherPolygon ) ) then
                
			                            			if ( NOT ( otherPolygon.IsContainedIn ( thePolygon ) ) ) then
                                 						 shapeIsInside = 1
                      						            break
			                			            end
                					       end
            				      end         
            				
                    ' Se o poligono esta dentro de outro, nao o escevemos
                         
                      if ( shapeIsInside = 1 ) then
                 				      continue
            				      end
            
                      if ( ( thePolygon.ReturnCenter.GetX.AsString = "Number null" ) or
                           ( thePolygon.ReturnCenter.GetY.AsString = "Number null" ) ) then
                             continue
                      end

	           				      outputLine =   thePolygon.ReturnCenter.GetX.AsString + ";"
		                         		        + thePolygon.ReturnCenter.GetY.AsString + ";" + inpeValue

                      'firstLine = "CLASS_NAME " + """"  + inpeValue + """" 

                      'labelFile.WriteElt( firstLine )
          			         labelFile.WriteElt( outputLine )
          
               end 'for each shapepart
           
    
          elseif ( shapeType = #FIELD_SHAPELINE ) then
             	 
                          
                lineData = true

      		      ' Gera as linhas com um END no final de cada linha
      		      '       		  
                shapeList = currentShape.AsList
       			     
                for each shapePart in shapeList
               	    for each xyPoint in shapePart
                  			    outputLine = xyPoint.GetX.AsString+"  "
                      			            +xyPoint.GetY.AsString
                  			    linesFile.WriteElt( outputLine )
               	    end
               	    linesFile.WriteElt( "END" )
        		      end
        
      		      ' Gera os identificadores para cada entidade          
      		      ' Percorre todos os componentes do "shape"
      
      			       for each shapePart in ShapeList
			                       	
                       aLine      =   Polyline.Make( {shapePart} )
			            	       outputLine =   aLine.ReturnCenter.GetX.AsString + ";"
			       	                         + aLine.ReturnCenter.GetY.AsString + ";" + inpeValue
				
                       if ( ( aLine.ReturnCenter.GetX.AsString = "Number null" ) or
                           ( aLine.ReturnCenter.GetY.AsString = "Number null" ) ) then
                             continue
                       end

                       'firstLine = "CLASS_NAME " + """"  + inpeValue + """" 
                  	    
                       'labelFile.WriteElt( firstLine )
          			          labelFile.WriteElt( outputLine )
                end
          
			        elseif ( shapeType = #FIELD_SHAPEPOINT ) then

                pointData = true

             		' Gera Point2d para cada entidade SHAPEPOINT
      			      '      
                	outputLine = currentShape.ReturnCenter.GetX.AsString+"  "
							                      +currentShape.ReturnCenter.GetY.AsString+"  "

              			firstLine = "CLASS_NAME " + """"  + inpeValue + """" 
                 pointsFile.WriteElt( firstLine )
				             pointsFile.WriteElt( outputLine )				

			        end  '(SHAPEPOLY OR SHAPELINE OR SHAPEPOINT )

           progress = (recNum / numRecs) * 100
           proceed = av.SetStatus( progress )
           if ( proceed.Not ) then
             av.ClearStatus
             av.ShowMsg( "Stopped" )
             exit
           end


		     end 'for each recnum

	    ' Termina o arquivo e fecha
     		linesFile.WriteElt( "END" )
       linesFile.Close
     		pointsFile.WriteElt( "END" )
		     pointsFile.Close
     		labelFile.WriteElt( "END" )
		     labelFile.Close
		
       if (lineData.Not) then
           MsgBox.Info("Arquivo não contem linhas", "Aviso")
           File.Delete(FileName.Make(linesFileName))
           File.Delete(FileName.Make(labelFileName))
       end
       
       if (pointData.Not) then
           MsgBox.Info("Arquivo não contem pontos", "Aviso")
           File.Delete(FileName.Make(pointsFileName))
       end

	   end 'tematico

	'*  **********************************************************************
	' Dados numericos

	 if (myChoice = 3)then
	
 	    ' Cria um nome default no ARCVIEW
		      arcViewName    = FileName.GetCWD.MakeTmp ( t.GetName.LCase,"txt") 
        nameFileName    = ((arcViewName.AsString).Left(((arcViewName.AsString).Count)-4))+ "_L3D.spr"
		    ' Pede ao usuario que informe o nome do arquivo
		      defaultName  = FileDialog.Put ( FileName.Make(nameFileName),"*.spr","Export"++t.GetName )
 	
	       if (defaultName = nil) then 
		          exit 
 	      end

		     'Cria arquivos de SAMPLE
    		  sampleFile    = LineFile.Make ( defaultName, #FILE_PERM_WRITE )
		      nameFileName  = ((defaultName.AsString).Left(((defaultName.AsString).Count)-8))+ "_TXT.spr"		
		      nameFile      = LineFile.Make ( FileName.Make(nameFileName), #FILE_PERM_WRITE )

		     'Cria header SAMPLE File 

  		    sampleFile.WriteElt ( "SAMPLE" )
  		    sampleFile.WriteElt ( "INFO" )
  		    sampleFile.WriteElt ( comment ) 
        if ((datum = nil).Not) then
            sampleFile.WriteElt (datum)
        end
        if ((projection = nil).Not) then
            sampleFile.WriteElt (projection)
        end
  		    sampleFile.WriteElt ( boxMessage ) 
		      sampleFile.WriteElt ( "INFO_END" )

		      'Cria header TEXT File 
  		    nameFile.WriteElt ( "TEXT" )
  		    nameFile.WriteElt ( "INFO" )
  		    nameFile.WriteElt ( comment ) 
        if ((datum = nil).Not) then
            nameFile.WriteElt (datum)
        end
        if ((projection = nil).Not) then
            nameFile.WriteElt (projection)
        end
 		     nameFile.WriteElt ( boxMessage ) 
		      nameFile.WriteElt ( "INFO_END" )


		     'Selecina campo que contem a cota z

	    	  fieldList = t.GetFTab.GetFields.Clone    		
	    	  idField = MsgBox.ChoiceAsString( fieldList, 
    			           "Selecione campo com a cota Z:","Escolha Campo" )
    
  	    	if ( idField = nil ) then 
    		        exit
		      end

		     ' Le intervalo de cotas mestras
		     zinterval = (MsgBox.Input ( "Entre com o intervalo das cotas mestras (m):", 
                                   "Intervalo", "100" )).AsNumber
                                   
       ' Existe registro do tipo "Entity" ?
       ' Recupera o campo de entidade
	      
       entityField = theFTab.FindField( "Entity" )
     
 		    ' Le cada registro da tabela de entidades (shapes)

  		   for each recNum in theFTab

			         'Verifica se e Polilinha
		          if ( shapeType = #FIELD_SHAPELINE ) then 

                 if ( entityField <> nil ) then
				                     entityType = theFTab.ReturnValue( entityField, recNum )

				                   if ( entityType = "Polyline" ) then
					                            isovalue = 1
				                   else
					                            isovalue = 2 
                       end
                 else
                       isovalue = 1
				             end
			         elseif ( shapeType = #FIELD_SHAPEPOINT ) then
                     isovalue = 0
            else
				             continue
			         end

      		   ' Recupero o "shape" corrente
    	 		    currentShape = theFTab.ReturnValue( shapeField, recNum )
			
           ' Recupera a cota Z
            val = theFTab.ReturnValueString( idField, recNum )
            zvalue = val.Substitute(",",".")
            zValNum = theFTab.ReturnValue( idField, recNum )
            
           ' Define se eh cota mestre
			         master = zValNum Mod zInterval
    
           'Retira 6 casas decimais (formato padrao definido)
            zText= (zValNum.AsString).Left((zValNum.AsString).Count-7)

		
			         if (isovalue = 0) then

				               'Gera ponto cotado
               		  sampleFile.WriteElt( "POINT3D" )
               
				              'Ponto cotado 
               		  outputLine = currentShape.GetX.AsString+"  "
							                        +currentShape.GetY.AsString+"  "+zValue
				               sampleFile.WriteElt( outputLine )
               		  sampleFile.WriteElt( "END" )

				              'Gera TEXT com a cota Z do ponto cotado
               		  outputLine = currentShape.GetX.AsString+"; "
							                        +currentShape.GetY.AsString+";  "+zText

				               nameFile.WriteElt( outputline )
				

 
			         elseif (isovalue = 2) then


      		           ' Recupera uma lista de de uma lista de pontos que integra o Shape
			                 shapeList = currentShape.AsList

				               'Gera ponto cotado
               		  sampleFile.WriteElt( "POINT3D" )
               
				              'Ponto cotado como uma marca gerada por por linhas
				              'Considera o centro da linha como a coordenada

        			        shapePart = shapeList. Get(0)
				               mline = PolyLine.Make ( {shapePart} )
               		  outputLine = mline.ReturnCenter.GetX.AsString+"  "
							                        +mline.ReturnCenter.GetY.AsString+"  "+zValue
				               sampleFile.WriteElt( outputLine )
               		  sampleFile.WriteElt( "END" )

				              'Gera TEXT com a cota Z do ponto cotado
               		  outputLine = mline.ReturnCenter.GetX.AsString+"; "
							                        +mline.ReturnCenter.GetY.AsString+";  "+zText

				               nameFile.WriteElt( outputline )
				
			       else      

      		         ' Recupera uma lista de de uma lista de pontos que integra o Shape
			              shapeList = currentShape.AsList

      			        'Gera uma isolinha com um END no final de cada linha
     
               		sampleFile.WriteElt( "LINE3D" )
				             sampleFile.WriteElt( "HEIGHT "+zValue) 
  
              			for each shapePart in shapeList
                   			for each xyPoint in shapePart
                        			outputLine = xyPoint.GetX.AsString+"  "
                                   				+xyPoint.GetY.AsString
                  			
                           sampleFile.WriteElt( outputLine )
               			    end
               			    sampleFile.WriteElt( "END" )

           					      'Gera TEXT com a cota Z para isolinhas mestras
					
                      if ( master = 0 ) then
						                         mline = PolyLine.Make ( {shapePart} )
             				              outputLine = mline.ReturnCenter.GetX.AsString+"; "
									                                 +mline.ReturnCenter.GetY.AsString+";  "+zText
                               nameFile.WriteElt( outputline )
					                 end
					
			
        		     end 'shapePart
			       end	'isovalue

   		      progress = (recNum / numRecs) * 100
           proceed = av.SetStatus( progress )
           if ( proceed.Not ) then
             av.ClearStatus
             av.ShowMsg( "Stopped" )
             exit
           end


       end 'for each recNum in theFTab

		    'termina o arquivo e fecha
     		sampleFile.WriteElt( "END" )
		     sampleFile.Close
     		nameFile.WriteElt( "END" )
		     nameFile.Close
		
	end ' Numerico
	
 '***********************************************************************
	'***********************************************************************
	' Texto
	
 if (myChoice = 4) then
 	    ' Cria um nome default no ARCVIEW
		      arcViewName    = FileName.GetCWD.MakeTmp ( t.GetName.LCase,"txt") 
        nameFileName    = ((arcViewName.AsString).Left(((arcViewName.AsString).Count)-4))+ "_TXT.spr"
		    ' Pede ao usuario que informe o nome do arquivo
		      defaultName  = FileDialog.Put ( FileName.Make(nameFileName),"*.spr","Export"++t.GetName )

	    'Pede ao usuario que informe o nome do arquivo
	    'defaultName  = FileDialog.Put ( defaultName,"*.spr","Export"++t.GetName )
  	
    	if (defaultName = nil) then 
		       exit 
 	   end

		   'Cria arquivos de SAMPLE
    	nameFile       = LineFile.Make ( defaultName, #FILE_PERM_WRITE )

		  'Cria header TEXT File 
  		 nameFile.WriteElt ( "TEXT" )
  		 nameFile.WriteElt ( "INFO" )
  		 nameFile.WriteElt ( comment ) 
     if ((datum = nil).Not) then
          nameFile.WriteElt (datum)
     end
     if ((projection = nil).Not) then
          nameFile.WriteElt (projection)
     end
  		 nameFile.WriteElt ( boxMessage ) 
		   nameFile.WriteElt ( "INFO_END" )

		  'Selecina campo que contem o texto
	   fieldList = t.GetFTab.GetFields.Clone    		
	   idField = MsgBox.ChoiceAsString( fieldList, 
    			       "Selecione campo que contem o texto:","Escolha Campo" )
  	 if ( idField = nil ) then 
    		    exit
		  end

  		for each recNum in theFTab

      		' Recupero o "shape" corrente
    	 		  currentShape = theFTab.ReturnValue( shapeField, recNum )

			     'Recupera o texto
    			   val = theFTab.ReturnValueString( idField, recNum )

			     'Gera texto no centroide do shape
          outputLine = currentShape.ReturnCenter.GetX.AsString+"; "
					                 +currentShape.ReturnCenter.GetY.AsString+";  "+val
			       nameFile.WriteElt( outputline )	

           progress = (recNum / numRecs) * 100
           proceed = av.SetStatus( progress )
           if ( proceed.Not ) then
             av.ClearStatus
             av.ShowMsg( "Stopped" )
             exit
           end

 		end 'for each recNum in theFTab

	 'termina o arquivo e fecha
   nameFile.WriteElt( "END" )
		 nameFile.Close
		
	end ' Texto
	'***********************************************************************
end 'Para cada tema ativo
av.ClearStatus
av.ClearMsg