Preparação Geral Começando com o seu ambiente de desenvolvimento


Panda3D Manual: Acessando Vars Config de um Programa de



Baixar 2.38 Mb.
Página20/20
Encontro30.10.2016
Tamanho2.38 Mb.
1   ...   12   13   14   15   16   17   18   19   20
Panda3D Manual: Acessando Vars Config de um Programa de

Parte superior do formulário

   Prev

Topo

Próximo   

Pitão/C + +

  

Parte inferior do formulário

Panda3D usa um arquivo de configuração nomeado Config.prc . Panda3D fornece funções para facilmente ler os valores de Config.prc , e para alterar seus valores em memória ( os valores modificados não são escritos de volta para o disco). A capacidade de ler um alter configurações processual tem dois usos principais:



  1. Armazenar os dados de configuração própria .

  2. Ajustando o comportamento do Panda3D .

" Armazenar os dados de configuração própria "significa que o jogo poderia ter suas próprias configurações que precisam ser armazenados. Ao invés de escrever seu próprio analisador de arquivo de configuração, você pode considerar adicionar os seus dados de configuração para o arquivo de configuração do panda vez .

Suponha hipoteticamente que você está escrevendo um jogo online, e seu jogo online se conecta a um servidor. Você precisa de um arquivo de configuração para dizer o nome do servidor. Abra o " Config.prc " arquivo e adicione a seguinte linha no final do arquivo.

meu- servidor -game panda3dgame.com

Note que eu inventei o nome da variável "meu- servidor - jogo "fora do ar. Esta variável não é reconhecida pelo Panda3D de qualquer forma. Portanto , esta linha não tem efeito sobre o motor qualquer.

Para manipular essa variável processual, não utilize o código ao contrário do que se segue, que cria um objeto da classe ConfigVariableString e então manipula -lo usando os métodos setValue () e getValue ().

from panda3d.core import ConfigVariableString
 
myGameServer = ConfigVariableString('my-game-server', '127.0.0.1')
print('Server specified in config file: ', mygameserver.getValue())
 
# Allow the user to change servers on the command-line.
if (sys.argv[1] == '--server'):
myGameServer.setValue(sys.argv[2])
print('Server that we will use: ', mygameserver.getValue())

O segundo parâmetro para o construtor ConfigVariableString é o valor padrão que deverá ser devolvido , no caso da linha "meu- servidor - jogo "não aparece em qualquer arquivo Config.prc . Há também um terceiro parâmetro opcional , que é uma descrição da finalidade da variável. Essa seqüência será exibido quando o usuário executa o comando cvMgr print ().

Os tipos de variáveis de configuração são:

ConfigVariableString


ConfigVariableInt
ConfigVariableBool
ConfigVariableDouble
ConfigVariableFilename
ConfigVariableList
ConfigVariableSearchPath

A maioria destes seguem a mesma forma ConfigVariableString , acima, exceto que o valor padrão ( eo parâmetro de setValue () e getValue ()) É do tipo indicado , ao invés de uma seqüência. As duas excepções são ConfigVariableList e ConfigVariableSearchPath . Estes tipos de variáveis não aceitam um valor padrão para o construtor uma vez que o valor padrão em ambos os casos é sempre a lista vazia ou um caminho de pesquisa.

Para exibir o valor atual de uma determinada variável interativa ( para uma variável do tipo string , neste exemplo) , digite o seguinte :

print(ConfigVariableString("my-game-server"))

Panda3D automaticamente carregar qualquer RPC arquivos encontrados no seu diretório de configuração padrão no arranque . Você pode ver uma lista dos arquivos que tenha realmente carregado com o seguinte comando:



print(cpMgr)

É bom fazer isso para garantir que você está editando o arquivo Config.prc correta.

Às vezes , é desejável para carregar um arquivo de configuração adicional a partir do disco , dando um nome explícito. Para fazer isso , use loadPrcFile (). Note-se que Panda Sintaxe Filename usa uma barra , mesmo sob Windows.

from panda3d.core import loadPrcFile
 
loadPrcFile("config/Config.prc")

O nome do arquivo que você especificar é procurado ao longo do modelo de caminho , da mesma forma que um ovo ou Bam arquivo é procurado quando você usa loader.loadModel ().

Você deve carregar o arquivo PRC próprio antes de instanciar ShowBase . Alterando os dados de configuração mais tarde, não afetará a janela / ambiente que já foi criado .

Você também pode usar loadPrcFileData () para carregar uma seqüência de caracteres que você definir em seu código, como se fosse o conteúdo lido a partir de um arquivo em disco. O loadPrcFileData () chamada requer dois parâmetros. O primeiro parâmetro é um nome de seqüência arbitrária para atribuir a este arquivo " (e ela pode ser a string vazia se você não se importa ), enquanto o segundo parâmetro é o conteúdo do arquivo em si. Este segundo parâmetro deve conter novas linhas entre as definições de variável, se você deseja definir o valor de mais de uma variável .

Por exemplo, digamos que Panda3D arquivo de configuração contém esta linha:

fullscreen # f

Por padrão, o Panda3D programas serão executados em uma janela , não em tela cheia . No entanto, se você fizer isso, então pelo tempo que você instanciar ShowBase , você terá mudado o fullscreen bandeira para true, e seu programa será executado em tela cheia .

from panda3d.core import loadPrcFileData
 
loadPrcFileData('', 'fullscreen 1')

Há outras maneiras de ir para tela cheia. Isso não é necessariamente a abordagem mais simples , mas ilustra o ponto.

Você pode obter uma lista mais completa das variáveis de configuração disponível em tempo de execução ( uma vez que você ShowBase instanciado ), com o listVariables () comando:

cvMgr.listVariables()



Noções básicas de Geometria

Existem duas classes de Panda3D para geometria 3D : o 'modelo' , que é de geometria não- animado, e "ator" , que está animado para a geometria .

Note-se que uma geometria só é considerado animado se ele muda de forma. Assim, por exemplo , uma bola de beisebol , não seria considerado animado : ele pode voar por todo o lugar , mas permanece uma esfera. A baseball seria um modelo, não um ator.

Panda não faz distinção entre coisas grandes e pequenas coisas. Por exemplo, se um mundo virtual contém um copo de café sobre a mesa , ea mesa está no meio de uma pequena ilha , em seguida, a xícara de café , a mesa, e da ilha são todos os modelos: cada um é um pedaço de não- estático geometria animado.

Muitos motores fornecem ferramentas para criar um terreno , e armazenar esse terreno em imagens heightmap . Panda3D pode gerar a geometria para o tipo de terrenos heightmap , consulte a Terreno seção para maiores informações. Para muitos terrenos simples , porém, muitas pessoas preferem usar um modelo estático , em vez de uma imagem heightmap .

As seções seguintes do manual assumem que você tem um arquivo válido ovo que tem um modelo animáveis , ovos e alguns arquivos adicionais que contenham animações. Para aprender a converter um modelo em um ovo de ver o arquivo Modelo Exportação seção.

Formato do arquivo primário Panda

No Panda3D , a geometria é geralmente armazenados em arquivos de EGG . Um arquivo de ovo pode conter:



  • Um modelo (geometria estática)

  • Um ator ( geometria dinâmica )

  • Uma animação (para ser aplicado a um actor)

  • Um ator e uma animação .

EGG arquivos são criados através da exportação de modelos de programas de modelagem 3D, como Maya , Max ou Blender. Atualmente, o apoio para o Maya é muito forte , uma vez que os desenvolvedores do Panda3D principalmente usar Maya. O exportador que Max não é muito confiável agora. Não é um exportador de terceiros para o Blender, que se diz ser muito bom .

Não é recomendado para embalar um ator e uma animação em um arquivo de ovos: isso tende a resultar em confusão desenvolvedor.

File Format Panda Outros

O arquivo EGG está optimizado para a depuração, não a velocidade . A primeira vez que você carregar um arquivo EGG , ele carrega lentamente. No entanto, a segunda vez que você usar esse arquivo mesmo ovo , ele carrega rápido.

Isso é possível porque Panda3D é tranquilo e traduzir o arquivo de ovo em uma forma performance otimizada : o arquivo BAM. Ele armazena esses arquivos BAM em um diretório chamado cache de modelo. Ao desenvolver um jogo , isso funciona muito bem : a única vez que você notar um atraso é que se você acabou de criar o arquivo EGG pela primeira vez . Caso contrário , corre-se com grande velocidade.

No entanto, existe uma situação em que isso não funciona tão bem : se você está enviando seu jogo para um cliente. Você não quer que a primeira experiência do seu cliente com o seu jogo para que os atrasos causados por carga de arquivo de ovo. Nesse caso, pode fazer sentido para enviar arquivos BAM , em vez de EGG arquivos para o usuário . Para fazer isso, você poderia usar uma ferramenta como o egg2bam ou packpanda para converter seus arquivos de ovo em BAM arquivos manualmente.



ATENÇÃO: A BAM arquivo só funciona com a versão de um dos Panda3D que o criou ! Em contrapartida , os arquivos de ovo vai trabalhar com qualquer versão do Panda3D . Devido a isto, é não é recomendável que você use arquivos BAM para o seu desenvolvimento dia-a- dia. Eles devem ser usados somente quando o transporte para os clientes.

O Básico

Carregando geometria estática é feita usando loader.loadModel:

m = loader.loadModel("mymodel.egg")

O nome do caminho especificado na loadModel pode ser um caminho absoluto ou um caminho relativo. Relativa é recomendado. Se um caminho relativo for utilizado, Panda3D vai procurar a sua caminho modelo para localizar o arquivo de ovo. O caminho modelo é controlada por panda arquivo de configuração.

Inserindo o modelo para a Scene Graph

Não se esqueça que o carregamento o modelo não é , por si só , fazer com que o modelo a ser visível. Para fazer com que Panda3D para tornar o modelo , você deve inserir -lo no grafo de cena :

m.reparentTo(render)

Você pode ler mais sobre O Scene Graph.

Panda Sintaxe Filename

O caminho utilizado na chamada loadModel deve respeitar as convenções do Panda3D nome. Para facilitar a portabilidade, Panda3D usa caminhos Unix -style , mesmo em Microsoft Windows. Isso significa que o caractere separador de diretório é sempre uma barra , e não o caractere de barra invertida Windows, e não há nenhum prefixo carta principal da unidade. (Em vez de uma letra de unidade principal , Panda usa um nome do diretório inicial de uma letra para representar a unidade ).

Há uma conversão bastante simples de nomes de arquivos Windows para arquivos panda. Sempre certifique-se de usar a sintaxe nome Panda quando se utiliza um função de biblioteca Panda3D , ou um dos programas utilitários panda :

# WRONG:
loader.loadModel("c:\\Program Files\\My Game\\Models\\Model1.egg")
 
# RIGHT:
loader.loadModel("/c/Program Files/My Game/Models/Model1.egg")

Panda utiliza a Nome do arquivo classe para armazenar nomes Panda estilo ; funções Panda muitos esperam um objeto Nome do arquivo como um parâmetro. A classe Filename também contém vários métodos úteis para manipulação de arquivo e caminho de acesso, bem como para a conversão entre nomes de arquivos no estilo do Windows e ficheiros Panda estilo , veja a referência da API para obter uma lista mais completa.

Para converter um arquivo do Windows para um caminho Panda, use código semelhante ao seguinte:

from pandac.PandaModules import Filename
winfile = "c:\\MyGame\\Model1.egg"
pandafile = Filename.fromOsSpecific(winfile)
print pandafile

usar o código para converter um arquivo Panda em um nome de arquivo do Windows , e não ao contrário deste :



from pandac.PandaModules import Filename
pandafile = Filename("/c/MyGame/Model1.egg")
winfile = pandafile.toOsSpecific()
print winfile

A classe Filename também pode ser usado em combinação com Python 's built-in mecanismos de manipulação do caminho. Digamos , por exemplo, que você deseja carregar um modelo , eo modelo está no diretório " modelo que está no mesmo diretório que o programa principal do arquivo " py . Aqui está como você deve carregar o modelo:



import sys,os
from pandac.PandaModules import Filename
 
# Get the location of the 'py' file I'm running:
mydir = os.path.abspath(sys.path[0])
 
# Convert that to panda's unix-style notation.
mydir = Filename.fromOsSpecific(mydir).getFullpath()
 
# Now load the model:
model = loader.loadModel(mydir + "/models/mymodel.egg")

Você precisa manter em mente que o python funções padrão (como os.remove trabalho ( )) com OS caminhos específicos. Então não se esqueça de converter os seus caminhos OS genérico de volta para OS caminhos específicos ao usar funções embutidas . Nos casos em que o Panda oferece funções equivalentes através da classe Filename, recomenda-se a utilizá-lo.



Ator Basics

A classe python Ator é projetado para manter um modelo animáveis e um conjunto de animações. Uma vez que a classe herda da classe Actor NodePath , todas as funções NodePath são aplicáveis aos agentes .

Note, no entanto, que o ator é uma classe Python que estende a classe C + + NodePath . Para a maior parte dos casos , você não tem que pensar sobre isto: O ator herda sensatez de NodePath e geralmente faz o que você espera. Existem algumas extravagâncias sutil , porém. Quando você anexar um ator em um grafo de cena , o baixo nível C + + Panda constrói apenas registra a parte NodePath do ator no grafo de cena , que é muito bem contanto que você também manter um ponteiro para a instância do ator em seus objetos Python. Se deixar o ator destruição , no entanto , a sua geometria visível permanecerá , mas deixará de animação (porque já não é um ator ). Além disso, mesmo se você mantiver o objeto em torno do ator , se você recuperar um ponteiro para o novo ator a partir do grafo de cena (por exemplo, como retornado pelo sistema de colisão ), você recebe de volta apenas NodePath ordinário , e não um ator.

A interface do ator fornece uma interface de alto nível sobre o Panda construções de baixo nível . No Panda , o nó de baixo nível que executa a animação é chamada de caracteres. Você pode ver os caracteres no nó do grafo de cena quando você chamar actor.ls ().

Não confundir a classe com o ator ActorNode classe , que é usado para a física. Eles são completamente independentes classes com nomes semelhantes .

Usando Atores



A classe Actor deve ser importado , antes de qualquer manipulação de carga ou de atores.

a partir de direta.ator.Ator importação Ator

Uma vez que o módulo é carregado , o objeto deve ser construído o ator e modelo e animações deve ser carregado :



Carregando cada animação requer uma tupla : o nome é que dá a animação eo caminho para a animação. Todo esse processo pode ser reduzido a um único comando :

nodePath = Actor('Caminho Model ', {


'Nome de Animação 1 ':'Caminho Animação 1 ',
'Nome de Animação 2 ':'Caminho Animação 2 ',
})

As animações também podem ser descarregados utilizando o tupla utilizada em sua criação.

nodePath .unloadAnims({'Nome Animation ':'Caminho Animation '}#portugues

Note que também é possível armazenar as animações e modelos no mesmo arquivo . Nesse caso , basta criar o ator apenas com o modelo como parâmetro.

Embora esta seja uma técnica raramente usada, é possível montar um modelo de personagem de diversas peças separadas (modelos diferentes). Isto é explicado na seção Atores Multi -Part.

Panda3D suporta animação esquelética e animações morph.

Também é possível carregar animações de forma assíncrona, de se construir o seu Panda Threading habilitado ( como é o caso na versão 1.6.1 e acima).



Panda Sintaxe Filename

Os nomes de arquivos usado no construtor ator deve seguir as convenções de nome Panda . Ver Carregando Models Para obter mais informações . Carregando atores e animações utiliza o panda caminho modelo, A mesma para os modelos estáticos.



Panda3D Manual: Atores da peça de Multi-

Parte superior do formulário

   Prev

Topo

Próximo   

Pitão/C + +

  

Parte inferior do formulário

É possível montar um modelo de personagem de diversas peças separadas (modelos diferentes). Se este for o caso, então, os pedaços devem conter ossos que podem ser ligados uns aos outros . Por exemplo, se você tiver um robô consiste de um conjunto de pernas e um tronco swappable , e se você deseja colá-las na cintura, pernas , em seguida, o modelo deve conter um osso da cintura ", eo modelo do tronco também deve conter um osso da cintura ". Você pode, então, anexá-los em conjunto:

nodePath = Actor.Actor({

'legs':'RobotLegs.egg',

'torso':'RobotTorso1.egg',

},{'legs':{'dance':'RobotLegs-Dance.egg'},

'torso':{'dance':'RobotTorso1-Dance.egg'}})

nodePath.attach('torso','legs','waist')

Multi- agentes são bastante complicadas. Cada peça é carregada de um arquivo de ovo separado , e cada parte tem seu próprio conjunto de animações que são aplicadas a ele. Para cada animação que você quer jogar , você precisa ter um arquivo de ovo correspondente para cada parte.

No construtor do ator , você especificar a lista de arquivos de modelo com um dicionário do nome da parte no arquivo de ovo, como mostrado acima. A lista de ficheiros de animação é mais complicado , é um dicionário de dicionários. O exterior dicionário mapas nomes de parte de dicionários de animação. Cada animação animação dicionário mapas nome para o arquivo de ovos de animação para a parte correspondente .

Aqui está outro exemplo :

myactor = Actor(

# part dictionary

{"head":"char/dogMM/dogMM_Shorts-head-mod",

"torso":"char/dogMM/dogMM_Shorts-torso-mod",

"legs":"char/dogMM/dogMM_Shorts-legs-mod"},

# dictionary of anim dictionaries

{"head":{"walk":"char/dogMM/dogMM_Shorts-head-walk",

"run":"char/dogMM/dogMM_Shorts-head-run"},

"torso":{"walk":"char/dogMM/dogMM_Shorts-torso-walk",

"run":"char/dogMM/dogMM_Shorts-torso-run"},

"legs":{"walk":"char/dogMM/dogMM_Shorts-legs-walk",

"run":"char/dogMM/dogMM_Shorts-legs-run"}

})

Além do ator com várias peças precisam ser ligados entre si de forma significativa:



myactor.attach("head", "torso", "joint-head")

myactor.attach("torso", "legs", "joint-hips")

O attach ( ) chamar nomes duas partes, e reparents a parte nomeada pelo primeiro parâmetro para a parte nomeada pelo segundo parâmetro, no nó nomeado pelo terceiro parâmetro , que deve ser uma exposição comum (ou seja, uma articulação no parte nomeada pelo segundo parâmetro ). Você já deve ter exposto o conjunto antes desta chamada, ou com a ferramenta de ovo optchar linha de comando, ou ligando para actor.exposeJoint () durante a execução.

Depois de chamar attach ( ), a parte guardada herdarão a animação da penhora comum, por virtude da relação grafo de cena.

Animação

Você pode animar as peças como animações normal , mas você precisa fornecer o PartName , como este:

myactor.play('Animation Name', 'Part Name')

Se você quiser usar AnimControl , como explicado no Nesta secção, você deve fornecer o PartName como parâmetro segundo getAnimControl ():

#you can see you just need to call

# actor.getAnimControl('Animation Name','Part Name')

#to get access to the AnimControl of that part.

ac=actor.getAnimControl('Animation Name','Part Name')

ac.isPlaying() #returns a boolean whether the animation is playing or not

ac.getFrame() #returns the current frame number

ac.getFrameRate() #returns the speed of the animation, in frames per second

ac.getFullFframe() #returns a floating-point frame number. Note: This number keeps counting and may exceed the total number of frames.

ac.getFullFrame() #returns an integer frame number. Note: This number keeps counting and may exceed the total number of frames.

ac.getNextFrame() #returns the number of the next frame on the queue.

ac.getNumFrames() #returns the total number of frames

ac.getPlayRate() #returns the playrate. explained further below

ac.loop() #starts playing the animation in a loop

ac.play() #starts playing the animation

ac.pose(frame) #poses at frame frame

ac.setPlayRate(rate) #sets the playrate. explained further below

ac.stop() #stops the animation

Panda3D Manual: Colocar um objeto para um Conjunto

Parte superior do formulário

   Prev

Topo

Próximo   

Pitão/C + +

  

Parte inferior do formulário

Se um ator tem um esqueleto , então é possível localizar uma das articulações, e anexar um objeto a esta articulação :

myNodePath = actorNodePath.exposeJoint(None,"modelRoot","Joint Name")

Esta função retorna uma nodepath que é anexado ao conjunto. Por reparenting qualquer objeto do presente nodepath , você pode fazer com que ele siga o movimento da articulação.

A seqüência modelRoot " representa o nome do nó de modelo - a string " modelRoot "é geralmente o valor correto.

A seqüência de " denominação comum "representa o nome do conjunto. Normalmente, seria algo como " ou " colo do fêmur ", ou" L Finger1 ". Isso geralmente é colocado dentro do pacote de modelagem. Por exemplo, no MAX, cada objeto na cena tem um nome, incluindo os ossos . Se necessário, pode determinar os nomes comuns de digitalização do arquivo de ovos de cordas como Fêmur.



Panda3D Manual: Controlando um misto Processualmente

Parte superior do formulário

   Prev

Topo

Próximo   

Pitão/C + +

  

Parte inferior do formulário

Às vezes a pessoa deseja tomar o controle processual da articulação de um modelo. Por exemplo, se você desejar forçar os olhos de um personagem modelo para seguir o mouse, você terá que assumir o controle processual do pescoço e da cabeça. Para isso, use controlJoint.

myNodePath = actor.controlJoint(None,"modelRoot","Joint Name")

Isso cria um nó dummy. Cada quadro, a transformação é copiado a partir do nó dummy para o conjunto. Ao definir a transformação do nó dummy, você pode controlar o conjunto. Normalmente, uma pessoa poderia querer usar setHpr para girar o conjunto , sem movê-lo. O nó dummy é inicializado de modo a que a junta está em seu local padrão, o que foi especificado no arquivo do modelo de ovo.

Você deve armazenar uma transformação local ( não global) no nó dummy. Em outras palavras, a transformação é relativo ao osso da articulação de pai . Se você estiver controlando o antebraço de um modelo , por exemplo, a transformação será em relação ao Braços .

A seqüência modelRoot " representa o nome do nó de modelo - a string " modelRoot "é geralmente o valor correto.

A seqüência de " denominação comum "representa o nome do conjunto. Normalmente, seria algo como " ou " colo do fêmur ", ou" L Finger1 ". Isso geralmente é colocado dentro do pacote de modelagem. Por exemplo, no MAX, cada objeto na cena tem um nome, incluindo os ossos . Se necessário, pode determinar os nomes comuns de digitalização do arquivo de ovos de cordas como Fêmur. Você também pode usar a chamada actor.listJoints () para mostrar a hierarquia completa das articulações.

Cuidados e limitações



Antes Panda3D versão 1.5, houve várias limitações importantes para controlJoint (). Estes têm sido levantadas a partir de Panda3D versão 1.5.

  • Nas versões anteriores do Panda controlJoint , só funcionou quando uma animação é jogar na articulação . Isto já não é verdade; controlJoint agora tem efeito se uma animação está jogando ou não.

  • Usou-se ser importante fazer todos os seus controlJoint () chama para um determinado modelo antes de fazer o primeiro convite para jogar ( ) loop (), ou pose ( ). Isso não é mais necessário , você pode chamar controlJoint () a qualquer momento.

  • Nas versões anteriores do Panda, controlJoint não poderia ser desfeita. Começando no Panda3D versão 1.5 , você pode chamar releaseJoint (" modelRoot "," Nome Comum "), para desfazer uma chamada anterior para controlJoint ().

Catálogo: 2010
2010 -> Informativo eletrônico 2010 maio 1ª ediçÃo com mais novidades
2010 -> Informativo eletrônico 2010 marçO 1ª ediçÃo com mais novidades
2010 -> Campus curitiba
2010 -> Universidade fumec faculdade de engenharia e arquitetura fea
2010 -> Cd e dvd sorriso maroto – sorriso 15 anos – ao vivo
2010 -> Sbpjor – Associação Brasileira de Pesquisadores em Jornalismo VIII encontro Nacional de Pesquisadores em Jornalismo
2010 -> Pibic/cnpq/ufcg-2010 características da variabilidade do vento no aeroporto internacional de joão pessoa: período 2003-2009
2010 -> Decreto 1171 fcc 2010 al-sp agente Legislativo de Serviços Técnicos e Administrativos Ética é o conjunto de regras e preceitos de ordem valorativa e moral de um indivíduo, de um grupo social ou de uma sociedade
2010 -> Gabinete Coordenador de Educação Artística/ dea pratica coral

Baixar 2.38 Mb.

Compartilhe com seus amigos:
1   ...   12   13   14   15   16   17   18   19   20




©bemvin.org 2020
enviar mensagem

    Página principal
Prefeitura municipal
santa catarina
Universidade federal
prefeitura municipal
pregão presencial
universidade federal
outras providências
processo seletivo
catarina prefeitura
minas gerais
secretaria municipal
CÂmara municipal
ensino fundamental
ensino médio
concurso público
catarina município
Dispõe sobre
reunião ordinária
Serviço público
câmara municipal
público federal
Processo seletivo
processo licitatório
educaçÃo universidade
seletivo simplificado
Secretaria municipal
sessão ordinária
ensino superior
Relatório técnico
Universidade estadual
Conselho municipal
técnico científico
direitos humanos
científico período
espírito santo
pregão eletrônico
Curriculum vitae
Sequência didática
Quarta feira
prefeito municipal
distrito federal
conselho municipal
língua portuguesa
nossa senhora
educaçÃo secretaria
segunda feira
Pregão presencial
recursos humanos
Terça feira
educaçÃO ciência
agricultura familiar