Blender - Como pasar variables de un archivo python a otro

 
Vista:
sin imagen de perfil

Como pasar variables de un archivo python a otro

Publicado por Hiroshi (6 intervenciones) el 15/01/2016 00:24:32
Hola que tal, bueno ante nada si hay alguien por aquí blendereño para responderme con esa generosidad que tienen se lo agradeceré y dios lo bendiga.

Bueno antes que nada aclaro que no soy ningún experto en programación python.
El problema que tengo es el siguiente:
Estoy dando clases de desarrollo de videojuegos RTS en blender, ya lo llevo muy bien. Me he encontrado con el siguiente obstáculo:
¿Como puedo pasar el valor de una variable objeto de un módulo a otro?
Estoy usando Windows 7 64bit| Blender 2.76b |

Mis módulos son los siguientes -> squadron.py | grid.py

El squadron.py es el siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
from bge import logic
from math import *
import grid
 
######################################################
#
# Demo Script by: Diego Hiroshi | VindictuS HD@2016
#
######################################################
# Este script es un sistema de generación de Guerreros
# Los guerreros se crean en un limite de 6 a 8 unidades
# a lo largo de una matriz de 8x2 | Objeto: Estandarte
# Los NPC pasan a ser fieles seguidores a su Capitán 
# durante toda la partida o se los abandone/elmine
# Juegos Moba y RTS | DEV | Aplicado en Ingenieria
######################################################
 
######################################################
# No divulgues este script sin el consentimiento de
# preservar derechos de firma e información del Author
# Assets DEV-MOBA|RTS Update v0.6 Beta
######################################################
 
escena = logic.getCurrentScene()
 
 
 
class Banner:
 
 
    def __init__(self, controlador):
 
        self.own = controlador.owner
        self.target = escena.objects["Squadron"]
        self.C02 = escena.objects["C02"]
 
 
    def getPosition_Hero (self):
 
        targetX = self.target.worldPosition[0]
        targetY = self.target.worldPosition[1]
 
        C02X = self.C02.worldPosition[0]
        C02Y = self.C02.worldPosition[1]
 
 
        self.own["targetX"] = targetX
        self.own["targetY"] = targetY
 
        self.own["C02X"] = C02X
        self.own["C02Y"] = C02Y
 
        return self.own["C02X"], self.own["C02Y"]
 
 
    def main(self):
 
        # Obtiene el valor X,Y Hero Position y se lo aplica al Estandarte "Squadron"
        self.target.worldPosition.x, self.target.worldPosition.y = self.getPosition_Hero()
 
 
alliedBannerRuntime = Banner(logic.getCurrentController())
 
 
class Warriors:
 
    # La matriz 4x2 añade 4 objetos de frente (f) y 2 de soporte (s) secuencialmente
    def __init__ (self,controlador):
 
        self.own = controlador.owner
        self.banner = escena.objects["Squadron"]
        self.hero = escena.objects["C02"] # |Obtiene el objecto actual en escena|
        self.warriors = [[],[]]
        self.increment = 4
        self.RADAR = 5 # |Campo de detección de lejanía| Master Key
 
 
 
 
    def getList_Unit(self):
 
        self.unit = escena.objectsInactive["Unit"]
        return self.unit
 
    def getDistance_Hero(self):
 
        self.heroPosition_x = self.hero.worldPosition[0]
        self.heroPosition_y = self.hero.worldPosition[1]
 
        return int(self.heroPosition_x),int(self.heroPosition_y)
 
 
    def getCalculate_Distance(self):
 
        self.w01Position_x = self.s04.worldPosition[0]
        self.w01Position_y = self.s04.worldPosition[1]
        self.w02Position_x = self.s03.worldPosition[0]
        self.w02Position_y = self.s03.worldPosition[1]
        self.w03Position_x = self.s02.worldPosition[0]
        self.w03Position_y = self.s02.worldPosition[1]
        self.w04Position_x = self.s01.worldPosition[0]
        self.w04Position_y = self.s01.worldPosition[1]
 
        return int(self.w01Position_x),int(self.w01Position_y),int(self.w02Position_x),int(self.w02Position_y),int(self.w03Position_x),int(self.w03Position_y),int(self.w04Position_x),int(self.w04Position_y)
 
 
    def getRadar_System(self):
 
        x1,y1 = self.getDistance_Hero()
        w01x,w01y,w02x,w02y,w03x,w03y,w04x,w04y = self.getCalculate_Distance()
 
        #d = sqrt((x2-x1)**2 + (y2-y1)**2)
        d01 = sqrt((w01x-x1)**2 + (w01y-y1)**2)
        d02 = sqrt((w02x-x1)**2 + (w02y-y1)**2)
        d03 = sqrt((w03x-x1)**2 + (w03y-y1)**2)
        d04 = sqrt((w04x-x1)**2 + (w04y-y1)**2)
 
 
        return d01,d02,d03,d04
 
 
    def main(self):
 
        if self.own["cont"] < 1:
            self.s04 = escena.addObject(self.getList_Unit(),self.banner,0)
            self.s03 = escena.addObject(self.getList_Unit(),self.banner,0)
            self.s02 = escena.addObject(self.getList_Unit(),self.banner,0)
            self.s01 = escena.addObject(self.getList_Unit(),self.banner,0)
            self.own["cont"] +=1
 
 
        hx,hy = self.getDistance_Hero()
        w01x,w01y,w02x,w02y,w03x,w03y,w04x,w04y = self.getCalculate_Distance()
        d01,d02,d03,d04 = self.getRadar_System()
 
        # DEBUG PROPERTYS DISTANCE RADAR|HERO|UNIT
        #self.own["hx"] = hx
        #self.own["ux"] = ux
        #self.own["hy"] = hy
        #self.own["uy"] = uy     
        #print (d)
 
            # Radar coontrolará que si tanto la posición X e Y de ambos son iguales pero superan el límite establecido, no se aplicará la orden: Detenerse
 
        try:
 
 
            grid = escena.objects["Grid"]
 
            if d01 <= self.RADAR and not int(self.s04.worldPosition[0]) == int(grid.worldPosition[0]) or int(self.s04.worldPosition[1]) == int(grid.worldPosition[1]):
                self.s04.applyMovement([0.0, -0.04, 0.0], True)
            if d02 <= self.RADAR and not int(self.s03.worldPosition[0]) == int(grid.worldPosition[0]) or int(self.s03.worldPosition[1]) == int(grid.worldPosition[1]):
                self.s03.applyMovement([0.0, 0.04, 0.0], True)
            if d03 <= self.RADAR and not int(self.s02.worldPosition[0]) == int(grid.worldPosition[0]) or int(self.s02.worldPosition[1]) == int(grid.worldPosition[1]):
                self.s02.applyMovement([0.0, -0.04, 0.0], True)
            if d04 <= self.RADAR and not int(self.s01.worldPosition[0]) == int(grid.worldPosition[0]) or int(self.s01.worldPosition[1]) == int(grid.worldPosition[1]):
                self.s01.applyMovement([0.0, 0.04, 0.0], True)
 
 
 
 
            # Radar siempre va a querer que ambos no superen su límite establecido es por eso que Radar genera una segunda clausula indicando que la distancia entre ambos no superen su perímetro de control.
 
            if d01 > self.RADAR:
                self.s04.applyMovement([0.07, 0.0, 0.0], True)
            if d02 > self.RADAR:
                self.s03.applyMovement([0.07, 0.0, 0.0], True)
            if d03 > self.RADAR:
                self.s02.applyMovement([0.07, 0.0, 0.0], True)
            if d04 > self.RADAR:
                self.s01.applyMovement([0.07, 0.0, 0.0], True)
 
 
        except:
 
            controlador = logic.getCurrentController()
            #quit = controlador.actuators["Game"]
            #print ("Error Inesperado: RADAR", self.RADAR) 
            #controlador.activate(quit)
 
warriorsRuntime = Warriors(logic.getCurrentController())
 
# --------------------------------------------------------------------
# End Class 
 
 
######################################################
# Executer Program Runtime 
######################################################
 
def main():
 
    alliedBannerRuntime.main()
    warriorsRuntime.main()
 
# --------------------------------------------------------------------
# End Executer  
 
 
######################################################
# Acciones del Objeto padre: Unit
# Unit se encarga de generar unidades militares, magos
# arqueros y jinetes en base a una Matriz de 4x2
# Si la clase Banner existe generará un tipo de estandarte
# Si el estandarte no carga durante el Runtime
# los guerreros e instacia (Atributos) no se generarán
######################################################
 
 
 
def inteligentCollisionSytem():
 
    controlador = logic.getCurrentController()
    escena = logic.getCurrentScene()
    own = controlador.owner
 
    trackTo = controlador.actuators["trackTo"]
    colision = controlador.sensors["Collision"]
    SCI = controlador.sensors["SCI"]
 
    if SCI.positive:
        controlador.deactivate(trackTo)
 
    else:
        controlador.activate(trackTo)
 
 
# --------------------------------------------------------------------
# End Script: squadron
#
# Author(s): DEV-Hiroshi <hiroshidaigh@gmail.com>  

Por otro lado el módulo grid.py es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from bge import logic
import squadron
 
escena = logic.getCurrentScene()
 
class systemFormation:
 
    def __init__(self,controlador):
 
        self.own = controlador.owner
        self.squadron = escena.objects["Squadron"]
        self.grid = escena.objectsInactive["Grid"]
        self.banner = escena.objects["Squadron"]
        self.c = escena.objects["C02"]
        self.distance = 3 # Distancia de formación
        self.rotation = [[1.0, 0.0, 0.0], [ 0.0, 1.0, 0.0], [0.0, 0.0, 1.0]] # Orientación de baldosas
 
 
    def getPosition_Owner(self):
 
        s_position_x = self.squadron.worldPosition[0]
        s_position_y = self.squadron.worldPosition[1]
        return s_position_x, s_position_y
 
    def createGrid(self):
 
        if self.own["grid_count"] < 1:
 
            self.grid01 = escena.addObject(self.grid,self.banner,0)
            self.grid02 = escena.addObject(self.grid,self.banner,0)
            self.grid03 = escena.addObject(self.grid,self.banner,0)
            self.grid04 = escena.addObject(self.grid,self.banner,0)
 
            s_position_x, s_position_y = self.getPosition_Owner()
            self.grid01.worldPosition.x,self.grid01.worldPosition.y,self.grid01.worldPosition.z= s_position_x+self.distance, s_position_y+self.distance,0.1
            self.grid01.worldOrientation = self.rotation
            self.grid02.worldPosition.x,self.grid02.worldPosition.y,self.grid02.worldPosition.z= s_position_x+self.distance-2, s_position_y+self.distance,0.1
            self.grid02.worldOrientation = self.rotation
            self.grid03.worldPosition.x,self.grid03.worldPosition.y,self.grid03.worldPosition.z= s_position_x+self.distance-4, s_position_y+self.distance,0.1
            self.grid03.worldOrientation = self.rotation
            self.grid04.worldPosition.x,self.grid04.worldPosition.y,self.grid04.worldPosition.z= s_position_x+self.distance-6, s_position_y+self.distance,0.1
            self.grid04.worldOrientation = self.rotation
 
            self.own["grid_count"] += 1
 
            self.grid01.setParent(self.c, 1, 1)
            self.grid02.setParent(self.c, 1, 1)
            self.grid03.setParent(self.c, 1, 1)
            self.grid04.setParent(self.c, 1, 1)
 
 
    def functionTiles(self):
 
        tile01,tile02,tile03,tile04 = self.grid01,self.grid02,self.grid03,self.grid04
        print (tile01)
 
 
    def main(self):
 
 
        self.createGrid()
        self.functionTiles()
 
systemFormation_Runtime = systemFormation(logic.getCurrentController())
 
 
def main ():
 
    systemFormation_Runtime.main()

Bueno chicos o chicas blendereñas, ustedes saben más que yo. ¿Como hago para pasar la variable self.grid01, self.grid02, self.grid03 y self.grid04 del módulo: grid.py al otro módulo de: squadron.py para usarlo dentro? :) saludos y espero respuestas gente.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Como pasar variables de un archivo python a otro

Publicado por xve (4 intervenciones) el 15/01/2016 08:22:42
Hola Hiroshi, puedes pasar tus variables como parámetros después del nombre... algo así:

1
archivo.py varlo1 valor2 valor3

y capturar los valores con la variable os.sys.argv que te devuelve una lista con todos los parámetros recibidos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Como pasar variables de un archivo python a otro

Publicado por Hiroshi (6 intervenciones) el 15/01/2016 15:24:02
Gracias xve por su respuesta. Si no es mucho pedir podría escribir un ejemplo de código como demostración de su uso. (Soy muy novato). Se lo agradecería :) espero su respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Como pasar variables de un archivo python a otro

Publicado por xve (4 intervenciones) el 15/01/2016 16:22:57
Hola Hiroshi, es muy sencillo...

llamas al archivo:
1
python archivo.py varlo1 valor2 valor3

en archivo.py, puedes tener algo como:
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import os
 
print "parametros recibidos : %s" % len(os.sys.argv)
 
print "los parametros recibidos son :"
for i in range(len(os.sys.argv)):
	print "valor %s : %s" % (i,os.sys.argv[i])

Espero que te sirva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Como pasar variables de un archivo python a otro

Publicado por Hiroshi (6 intervenciones) el 15/01/2016 23:59:55
Hola xve gracias por responder, el problema es como lo implemento en Blender BGE. Alguna idea?. Saludos :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Como pasar variables de un archivo python a otro

Publicado por Hiroshi (6 intervenciones) el 16/01/2016 19:31:50
ME RESPONDO A MI MISMO A LA SOLUCIÓN!

Hola XVE gracias por tu tiempo te lo agredezco de corazón y al Foro del la Web del Programador. Antes que nada quiero deciros a los demás que estén en la misma situación que para pasar valores en Python/Blender de un archivo.py a otro desde Blender durante la ejecución BGE es muy sencillo, a veces cosas sencillas son difíciles de saber hasta que practicas buscas en los foros y encuentras la solución. Se que Muchos dirán que ya lo sabían, que es pan comido por que me ha sucedido en foros pero después de haber encntrado la solución por mi cuenta, pero que sepa que aca estuve esperando esa respuesta que XVE del foro la Web del Programador tuvo la gentileza de ayudarme. Como dije anteriormente no soy ningún experto en programación pero vamos al asunto:

Supongamos que nosotros queremos pasar un valor objeto del archivo PythonManda.py hacia el otro archivo llamado PythonRecibe.py

En el archivo PythonManda.py como ejemplo tenemos:

1
2
3
4
5
6
7
8
9
10
11
12
from bge import logic
import  PythonRecibe
 
def functionText():
        f01 = text01
        f02 = text02
        f03 = text03
        f04 = text04
 
        PythonManda.test(  f01,  f02,  f03,  f04)
 
functionText()

Importante: Siempre tenemos que importar el modulo al cual queremos pasar el valor.



Por otro lado tenemos el archivo PythonRecibe.py que va a recibir los valores:

1
2
def test(f01,f02,f03,f04):
        print (f01,f02,f03,f04)


Conclusión: Siempre que uno quiera pasar parámetros de un archivo python dentro de BGE tienes que llamar al módulo seguido de la Clase si la hay y seguido de la función, dentro de los paréntesis los valores.

La otra solución es del usuario XVE de la Web del Programador:

archivo.py varlo1 valor2 valor3

y capturar los valores con la variable os.sys.argv que te devuelve una lista con todos los parámetros recibidos.



Saludos Tema Cerrrado :) y gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve

Como pasar variables de un archivo python a otro

Publicado por xve (4 intervenciones) el 16/01/2016 20:30:01
Gracias por compartirlo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como pasar variables de un archivo python a otro

Publicado por Jonny Andrés (1 intervención) el 16/01/2021 21:32:18
Estimado Hiroshi tienes un error en la línea 10 el valor correcto es:
PythonRecibe.test( f01, f02, f03, f04)
Exitos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar