Ir al contenido


Foto

Diagrama de vinculacion de personas (Eficientar mi codigo GLScene)


  • Por favor identifícate para responder
8 respuestas en este tema

#1 erikmx

erikmx

    Member

  • Miembros
  • PipPip
  • 48 mensajes

Escrito 26 junio 2014 - 05:20

Buenas tardes a todos, en un post anterior mencione sobre mi interes de poder general alguna especie de grafica para ejemplificar las conexiones entre personas (Analisis de Redes Sociales, no tiene nada que ver con redes sociales como facebook  :D), explico lo basico

- Tengo una base de datos, una especie de agenda en donde cada persona almacena a sus conocidos en 4 categorias: FAMILIA, AMIGOS, TRABAJO Y OTROS. Asi que Juan puede tener en su agenda a su esposa a sus amigos y conocidos del trabajo, tambien a algunos vecinos. Con esos datos yo debo generar una representacion partiendo del SUJETO PRINCIPAL a sus conocidos.

Busque algun componente de graficos de este tipo y resulta que solo los hay para HTML5 y otras yerbas.... pero para Delphi no existen de ese tipo, asi que decidi probar GLScene, y construyendo de forma manual pude ver que eso es posible, incluso puedo identificar cada elemento por su nombre.

El detalle surge cuando lo hago de forma manual es decir, cuando inserto un cubo y otros 4 a su alrededor para poder ubicar sus coordenadas, para ello tengo 4 Listview (FAMILIA, AMIGOS, TRABAJO Y OTROS) para que fuera mas facil de entender mi idea utilizo a los personajes de los SIMPSON que pues la mayoria aunque sea poco pero los conocemos. Estos Listview representan la base de datos MySQL (no lo puse con conexion para que sea mas facil compartir mi idea y codigo).

En mi ejemplo (Que adjunto) como pude, logro cargar el cubo del personaje principal, y los cuatro de referencia, hice un pequeño procedimiento para cada categoria, que toma las corrdenadas de su cubo categoria y modifica su ubicacion de forma descendente es decir le resto Y cantidad a la cordenada del original y recolecto los datos del listview como es el nombre, asi en la carpeta IMAGENES esta una imagen con el nombre del personaje para cargarlos en las caras del cubo.

Hasta aqui todo ya lo implemente... pero el problema es que necesito poder crear los objetos de una manera mas adecuada o poder darle un nombre a cada cubo que me permita identificarlo, es decir cuando le de doble click a cualquier cubo pueda saber cual es su identificador, ese dato me ayudaria a saber sus cordenadas de posicion XYZ y podria abrir una pantalla llamando a la base filtrando por su ID y ver su informacion.

Encontre un ejemplo en las demos de GLScene donde cargan un par de objetos pero lo hacen de forma manual con el administrador de elemntos de GLScene y al tocarlo te dice su nombre, pero si lo cargo de forma manual ese codigo solo me muestra el nombre en blanco, por lo que asumo que no estoy asignando un nombre real a cada objeto solo le digo al programa que me lo muestre y nada mas.

Mi idea es que si logro agregar los cubos con un nombre o ID que yo le asigne y pueda acceder con ello a su informacion como su posicion, podria avanzar mas y poder cargar de cada uno de los PERSONAJES, su lista de conocidos, inventar algo sencillo como recorrer la tabla y ver si hay alguna coincidencia con algun IDentificador ya creado (cubo del personaje) si existe solo crear una linea de su posicion a la del cubo encontrado y si no existe que cree el cubo y le envie la linea.

Como es en 3D pues lo importante es que los cubos no esten pegados si no que se alejen o acerquen lo suficiente para no estar amontonados o no tanto por eso lo hice en vertical hacia abajo pero me gustaria colocarlos de manera aleatoria como si fueran satelites alrededor del personaje central y lanzar las lineas entre si.

Ojala me puedan orientar, adjunto mi codigo para que lo puedan ver en "vivo" y se puedan dar una idea de mas o menos como lo estoy haciendo y si puedo hacer lo que les comente, saludos

Archivos adjuntos


  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 27 junio 2014 - 09:51

Que interesante proyecto mi amigo.

1) Gracias por compartir el código

2) Sería geníal pasarlo a proyectos e invitar a colaborar a más compañeros.

¿Te parece bien si lo posteo en face invitando a mas colegas a revisar el código y aportar contenido?

Saludos.
  • 0

#3 erikmx

erikmx

    Member

  • Miembros
  • PipPip
  • 48 mensajes

Escrito 27 junio 2014 - 03:51

Que interesante proyecto mi amigo.

1) Gracias por compartir el código

2) Sería geníal pasarlo a proyectos e invitar a colaborar a más compañeros.

¿Te parece bien si lo posteo en face invitando a mas colegas a revisar el código y aportar contenido?

Saludos.


Saludos Poliburro

1) De nada para eso estamos

2) Por mi no hay problema tal ves a mas gente le pueda servir, en este caso yo le veo potencial para muchas cosas, desde agendas 3D personales, hasta cuestiones bancarias para referencias personales etc.

De postearlo en face por mi no hay problema, lo importante es madurarlo mas, ya le avance otro poco en algunos detalles ya que mi idea es implementarlo en base de datos y crear algún pequeño procedimiento recursivo que analice uno por uno de los registros y vea que si existe pues lo conecte con una linea a quien corresponde, o si no que lo cree y lo enlace; tambien pensando mas a futuro y sabiendo donde se ubican crear todos los cuvos alrrededor de uno pero de forma aleatoria algo asi como satelites, y de ahi cada uno de los satelites crearle los suyos, y tocandolos sabiendo el identificador del cubo poder darle sus cordenadas a la camara, etc. Aprobechando que vi que hay una forma de detectar colisiones de objetos, y que al crearlos si la posicion este ocupada la envie a otra posicion

Lo que mas falta me hace es poder crear los cubos de una forma parecida a como se crean desde la IDE de Delphi y el componente, que cuando los creas desde ahi te crea un nombre del objeto como por ejemplo TGLCube1, TGLCube2, TGLCube3... y poder saber sus coordenadas, y/o su ID que le asigne mas personalizado que TGLCubeX.

Asi que cualquier ayuda es bienvenida, y lo que vaya encontrando lo ire compartiendo por si alguien le sirve  (b)
  • 0

#4 erikmx

erikmx

    Member

  • Miembros
  • PipPip
  • 48 mensajes

Escrito 03 julio 2014 - 06:38

Pues para darle una actualizada al tema y mientras alguien mas se anima a participar :), les dejo una pequeña actualizacion al codigo, les comentaba que uno de los temas que me interesaba era poder asignarle un nombre al cubo creado para identificarlo... pues despues de ensayos y errores pude ver que me faltaba justamente agregar el nombre a la propiedad .Name

[Delphi]
Procedure TForm1.CargarFAMILIA;
var
  I: Integer;
begin
  CuboFamiliaX:= 0;
  CuboFamiliaY:= 0; //Cubo Principal Y:= 0;
  CuboFamiliaZ:= 6;
for I:=0 to ListView1.Items.Count -1 do
  begin
    CuboFamiliaY:= CuboFamiliaY-2;
    CuboFamilia:=TGLCube(GLScene1.Objects.AddNewChild(TGLCube));
    CuboFamilia.Position.SetPoint(CuboFamiliaX,CuboFamiliaY,CuboFamiliaZ);
    CuboFamilia.Material.Texture.Disabled:= False;
    CuboFamilia.Material.Texture.Image.LoadFromFile(ExtractFilePath(Application.ExeName)+'Imagenes\'+ListView1.Items[I].SubItems[0]+'.jpg');
    CuboFamilia.Name:= ListView1.Items[I].SubItems[0]; // Esta era la parte que me faltaba, aqui ya se le asigna un nombre al objeto

    ///// Creacion de Camaras por codigo ////////////////
    CamaraObjetivos:= TGLCamera(GLScene1.Objects.AddNewChild(TGLCamera));
    CamaraObjetivos.Position.SetPoint(CuboFamiliaX,CuboFamiliaY,CuboFamiliaZ);
    CamaraObjetivos.Name:= 'Camara'+ListView1.Items[I].SubItems[0];
    Camaras.Items.Add('Camara'+ListView1.Items[I].SubItems[0]);
    ////////// Aparentemente las crea, el detalle es que no se como acceder a ellas aAtraves del combobox con los nombres de las     
  //////camaras para cambiar de una a otra cuando se seleccione una camara de la lista :(

    LineaDeEnlace:= TGLLines(GLScene1.Objects.AddNewChild(TGLLines));
    LineaDeEnlace.AddNode(CuboFamiliaX,CuboFamiliaY,CuboFamiliaZ); // Posicion Inicial Linea del personaje secundario cargado (ESTA UTILIZA LA POSICION DEL CUBO CARGADO)
    LineaDeEnlace.AddNode(0,0,0); // Posicion Final Linea del personaje principal (ESTA NO VARIA)
    LineaDeEnlace.LineColor.SetColor(0,1,0,1);
    LineaDeEnlace.LineWidth:= 1;


    ////////// Colocamos la posicion del cubo creado en el listview;
    ///  para que modifique las coordenadas debe de tener valores el subitem
    ListView1.Items[I].SubItems[2]:= IntToStr(CuboFamiliaX);
    ListView1.Items[I].SubItems[3]:= IntToStr(CuboFamiliaY);
    ListView1.Items[I].SubItems[4]:= IntToStr(CuboFamiliaZ);
  end;
end;
[/code]

Resumiendo este procedimiento crea los cubos de las personas de la categoria FAMILIA, tomando como referencia el cubo asignado a esta categoria con sus coordenadas ya conocidas, de ahi lo que hacemos es asignarle las cordenadas pero decrementando su posicion (numeros negativos) para que lo haga de forma descendente, y cada que crea uno como ya sabemos sus coordenadas se las escribimos en el Listview al cual le agregamos previamente las columnas X,Y,Z asignando un valor de CERO por defecto, si esta en blanco marca error.

Aun me faltan muchas cosas mas por hacer, porque aun sabiendo como se llama el objeto que cree, no puedo por ejemplo cambiar sus coordenadas por codigo porque me marca error.

Asi como tampoco puedo seleccionar camaras que haya creado por codigo, si las creo desde el Scene Viewer si las puedo manipular pero si las creo yo me manda error.

Algo que he notado es que no se puede acceder a los objetos creados solo por su nombre de objeto, supongo se accede a ellos por un indice de objetos creados y su valor sea numerico, auque ya he leido la ayuda que viene con GLScene aun no logro saber como funciona esa parte.

Se aceptan sugerencias, saludos  (b)
  • 0

#5 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 04 julio 2014 - 09:16

Hola amigo, gracias por la retroalimentación. Quiero participar en el proyecto pues me interesa de forma enorme el tema pero estos días he andado ocupado. El domingo haré pruebas y veremos que más podemos hacer con esto tan interesante.

Por el momento voy a comentarlo en los grupos de delphi de face y twitter esperando que más compañeros se unan.


Un abrazo
  • 0

#6 erikmx

erikmx

    Member

  • Miembros
  • PipPip
  • 48 mensajes

Escrito 04 julio 2014 - 12:59

Hola amigo, gracias por la retroalimentación. Quiero participar en el proyecto pues me interesa de forma enorme el tema pero estos días he andado ocupado. El domingo haré pruebas y veremos que más podemos hacer con esto tan interesante.

Por el momento voy a comentarlo en los grupos de delphi de face y twitter esperando que más compañeros se unan.


Un abrazo


Saludos Poliburro, sigo encontrando cosas y haciendo pruebas ya que haga otro poco de avance subire el nuevo codigo fuente, estoy probando hacer la distribucion de cubos por categoria.. es decir en forma vertical y la otra de forma desordenada utilizando la funcion Random... mi intencion es colocar los cubos alrededor del principal y por el color de la linea de union saber a que categoria pertenece. Pero la distribucion aleatoria pues aun esta verde porque en algunos casos pone cubos muy cerca uno de otros, voy a ver como hacer que la funcion random no utilice las cordenadas 0 a 5 o 0 a -5 para que no queden tan pegados al cubo principal.

De cualquier forma pues ya como esta me sirve relativamente solo que quiero pulirlo lo mas posible para poder elevar la calidad de la presentacion y la logica de enlace.  (b)
  • 0

#7 erikmx

erikmx

    Member

  • Miembros
  • PipPip
  • 48 mensajes

Escrito 14 agosto 2014 - 06:55

Ahora que he tenido un poco de tiempo estoy tratando de continuar mi diagramacion, he tenido algunos avances, pero ahora se me presenta uno muy grande y no se me ocurre la forma de subsanarlo:

El detalle esta en que si creo los nodos del personaje principal, cuando busco de cada nodo sus contactos o sub nodos, como los creo en funcion de una ID unica para cada persona, cuando intento crearlos me dice que ese objeto (con el nombre del ID) ya existe, mi idea es que si el objeto ya existe silo se le cree una linea entre el objeto existente y el contacto que lo incluye, pero no se como buscar dentro de los objetos creados para ver si existe ese objeto y que no lo intente crear si esta ya creado.

Cada cubo lo creo con su nombre que es una ID, si lo toco y muestro en un mensaje su Nombre y cordenadas, lo hace correctamente, pero el problema es que quiero verificar si ese objeto esta creado en funcion del nombre o ID

Espero alguien pueda ayudarme o darme una idea de como buscar los objetos de alguna forma, saludos  (b)
  • 0

#8 erikmx

erikmx

    Member

  • Miembros
  • PipPip
  • 48 mensajes

Escrito 15 agosto 2014 - 07:27

Bueno me respondo yo mismo ya pude buscar una forma de saber si alguno de los cubos ya existe;



delphi
  1. var
  2.   Form1: TForm1;
  3.   Cubo3D: TGLCube;
  4.  
  5. procedure TForm1.BuscarRepetido;
  6. var
  7. IDCubo: String;
  8. begin
  9. IDCubo:= StringReplace(Query1.FieldByName('ID').AsString, '-', '', [rfReplaceAll]);
  10. if Cubo3D.Name = IDCubo then
  11. ShowMessage('NODO EXISTENTE: ' +IDCubo) else
  12. ShowMessage('NODO NO EXISTENTE: ' +IDCubo);
  13. end;



Tuve que eliminar los guiones de mi ID porque no los acepta para crear los objetos era del tipo ABC-12345-6789

Ahora lo que quiero hacer es extraer la ubicacion de cualquier cubo por codigo, es decir si el cubo lo creo desde el administrador de objetos de GLScene y le pongo Cubo1 puedo acceder a sus coordenadas de esta forma:

[Delphi]
ShowMessage(FloatToStr(Cubo1.Position.X));
ShowMessage(FloatToStr(Cubo1.Position.Y));
ShowMessage(FloatToStr(Cubo1.Position.Z));
[/Delphi]

Pero si creo el cubo de forma dinamica no se me ocurre como llamar a ese objeto por ejemplo Cubo24 que lo cree de forma automatica por codigo, si alguien se le ocurre algo se aceptan sugerencias, voya ver que chapuza se me ocurre para solventarlo  (b)
  • 0

#9 erikmx

erikmx

    Member

  • Miembros
  • PipPip
  • 48 mensajes

Escrito 26 agosto 2014 - 05:49

Pues aqui pasando a saludar, al final no pude o no supe como obtener los valores de un objeto creado en ejecucion, solo de aquellos que se cargan desde el inspector de objetos de GLScene, algo que no me servia, asi que lo resolvi creando una base de datos que almacena los datos como son el nombre del objeto creado (ID), su posicion en XYZ, lo que me permite crear todos los objetos, despues procesar las relaciones en funcion no de los objetos creados, si no de los registros correspondientes almacenados en la tabla temporal; al cerrar el programa vacio la trabla y listo, aunque podria guardarse como un archivo delimitado y ponerle la opcion de cargar desde archivo y crear los objetos para manipular sus posiciones ya que las genera de forma aleatoria.

Saludos  (b)
  • 0