Se os algoritmos de layout fornecidos com o produto não atenderem
às suas necessidades, será possível desenvolver seus próprios algoritmos de layout definindo ibm_ilog.graphlayout.GraphLayout como subclasse.
Quando uma subclasse de ibm_ilog.graphlayout.GraphLayout é
criada, ela se ajusta automaticamente à estrutura de layout genético do IBM® ILOG® Dojo Diagrammer e se beneficia
de sua infraestrutura, por exemplo:
- Parâmetros genéricos: consulte Parâmetros e Recursos da Classe Base
- Notificação de progresso: consulte Usando Listeners de Eventos
- Recurso para aplicar o layout separadamente para os componentes conectados de um gráfico desconectado: consulte Organizando Componentes Conectados de um Gráfico Desconectado
- Recurso para organizar gráficos aninhados: consulte Layouts Aninhados
Exemplo
Para ilustrar as ideias básicas para definir um novo layout,
o seguinte exemplo simples mostra uma possível implementação
do algoritmo de layout mais simples, o Layout Aleatório. A nova classe de layout
é chamada
MyRandomLayout
. O código a seguir mostra o esqueleto da classe:
dojo.declare("MyRandomLayout", ibm_ilog.graphlayout.GraphLayout, { copy: function(){ return new MyRandomLayout(this); }, copyParameters: function(source){ this.inherited(arguments); // Now copy any specific parameters from this class... }, layout: function(){ // ... } });
O método
copy
é implementado,
porque ele é usado ao organizar um gráfico aninhado (consulte Layouts Aninhados). Em seguida, o método layout() da
classe base é implementado da seguinte forma:
layout: function(){ var model = this.getGraphModel(); var report = this.getLayoutReport(); var rect = this.getCalcLayoutRegion(); var xMin = rect.x; var yMin = rect.y; var xMax = rect.x + rect.width; var yMax = rect.y + rect.height; var nds = model.getNodes(); var count = nds.length; for (var i = 0; i < count; i++) { var node = nds[i]; if (this.isPreserveFixedNodes() && this.isFixed(node)) return; var x = xMin + (xMax - xMin) * Math.random(); var y = yMin + (yMax - yMin) * Math.random(); model.moveNode(node, x, y); this.callLayoutStepPerformedIfNeeded(); } report.code = ibm_ilog.graphlayout.GraphLayoutReport.LAYOUT_DONE; }