Ver Mensaje Individual
  #6  
Antiguo 23-03-2009
astwin astwin is offline
Miembro
 
Registrado: feb 2009
Posts: 21
Reputación: 0
astwin Va por buen camino
Hola, ya me he puesto a fondo con TsimpleGraph. Voy poco a poco comprendiendo como funciona.

El problema que tengo es que el linkado entre objetos se realiza mediante lineas que parten desde el centro del objeto, no pudiendose definir un punto fijo del objeto para linkarlo a otros.

Mi solucion ha sido crear cada bloque como un rectangulo, y las entradas y salidas tambien como rectangulos mas pequeños. El problema ahora lo tngo a la hora de mover el bloque grande, que no se como hacer que se puedan mover a la vez los pequeños (ademas el bloque grande esta alineado a la cuadricula y los pequeños no). Haber si alguien puede echarme un cable.

Código Delphi [-]
type
  // Rectangulo que servirá como entrada
  TGraphIn=class(TRectangularNode)
    public
      procedure init();
  end;
  // Rectangulo que servirá como salida
  TGraphOut=class(TRectangularNode)
      procedure init();
  end;
  // Rectangulo que será el cuerpo del bloque
  TGraphBlock=class(TRectangularNode)
    public
      nIn,nOut: integer ; //numero de entradas y de salidas
      vIn: array of TGraphNode;
      vOut: array of TGraphNode;
      IOHeigth: Integer;
      //GraphIORadious: integer; // Altura de las entradas y salidas
      InSelected:integer;
      OutSelected:integer;
      procedure init();
      //function QueryHitTest(const Pt: TPoint): DWORD; override;
      //procedure Draw(Canvas: TCanvas); override;
      //procedure MouseDown(Button: TMouseButton; Shift: TShiftState; const Pt: TPoint);override;
   end;

Type
  TGraphLine=class(TGraphLink)

  end;

const
  // ForEachObject Actions
  FEO_DesactiveIO             = 00;


implementation
uses
  unit1,unit2;





procedure TGraphBlock.init();
var
  I: Integer;
  inc: Integer;
  bound:Trect;
  pt: Tpoint;
begin
  // Opciones del nodo;
  self.NodeOptions:=[gnoMovable,gnoShowBackGround];
  // Imagen del nodo;
  self.Background.LoadFromFile('./images/sos.jpg');
  // Numero de entradas / salidas
    self.Nin:=3;   self.NOut:=4;
  // Creamos las entradas / salidas graficas
  self.IOHeigth:=8;
  setlength(vIn,nIn);
  setlength(vOut,nOut);
    // Entradas
    inc:=trunc((self.height-NIn*IOHeigth)/(Nin+1)); // Espacio entre entradas
    for I := 0 to nIn - 1 do
    begin
      pt.X:=left; pt.y:= Top+(i+1)*inc+i*IOHeigth;
      bound:= Rect(pt, Point(pt.X+IOHeigth, pt.Y+IOHeigth));
      form2.simpleGraph1.SnapToGrid:=False;
      vIn[i]:=form2.simpleGraph1.InsertNode(bound,TGraphIn);
      form2.simpleGraph1.SnapToGrid:=True;
      TGraphIn(vIn[i]).init;
    end;
    // Entradas
    inc:=trunc((self.height-NOut*IOHeigth)/(NOut+1)); // Espacio entre entradas
    for I := 0 to nOut - 1 do
    begin
      pt.X:=left+width-IOHeigth; pt.y:= Top+(i+1)*inc+i*IOHeigth;
      bound:= Rect(pt, Point(pt.X+IOHeigth, pt.Y+IOHeigth));
      form2.simpleGraph1.SnapToGrid:=False;
      vOut[i]:=form2.simpleGraph1.InsertNode(bound,TGraphIn);
      form2.simpleGraph1.SnapToGrid:=True;
      TGraphIn(vOut[i]).init;
    end;

  self.InSelected:=-1;
  self.OutSelected:=-1;
end;

procedure TGraphIn.init;
begin
  NodeOptions:=[gnoShowBackGround];
end;

procedure TGraphOut.init;
begin
  NodeOptions:=[gnoShowBackGround];
end;
Responder Con Cita