/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.toolkit.demos; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; import org.gephi.graph.api.DirectedGraph; import org.gephi.graph.api.GraphController; import org.gephi.graph.api.GraphModel; import org.gephi.io.exporter.api.ExportController; import org.gephi.io.importer.api.Container; import org.gephi.io.importer.api.EdgeDefault; import org.gephi.io.importer.api.ImportController; import org.gephi.io.processor.plugin.DefaultProcessor; import org.gephi.layout.plugin.AutoLayout; import org.gephi.layout.plugin.force.StepDisplacement; import org.gephi.layout.plugin.force.yifanHu.YifanHuLayout; import org.gephi.layout.plugin.forceAtlas.ForceAtlasLayout; import org.gephi.project.api.ProjectController; import org.gephi.project.api.Workspace; import org.openide.util.Lookup; /** * This demo shows how to use the <code>AutoLayout</code> class to run layout * programmatically. * <p> * You can set a layout duration, and an execution ratio for several layout. For * instance you set 0.8 for a Yifan Hu algorithm and 0.2 for Label Adjust. If * execution time is 100 seconds, the first algorithm run for 80 seconds and the * second for 20 seconds. It also allows to change property values dynamically * (at a certain ratio or interpolated if values are numerical). * * @author Mathieu Bastian */ public class WithAutoLayout { public void script() { //Init a project - and therefore a workspace //��ʼ��һ����Ŀ - ��һ�������� ProjectController pc = Lookup.getDefault().lookup(ProjectController.class); pc.newProject(); Workspace workspace = pc.getCurrentWorkspace(); //Append container to graph structure //��������ͼ�νṹ ImportController importController = Lookup.getDefault().lookup(ImportController.class); //Import file //�����ļ� Container container; try { File file = new File(getClass().getResource("/org/gephi/toolkit/demos/resources/lesmiserables3582908092477373.gml").toURI()); container = importController.importFile(file); container.getLoader().setEdgeDefault(EdgeDefault.DIRECTED); //Force DIRECTED container.setAllowAutoNode(false); //Don't create missing nodes } catch (Exception ex) { ex.printStackTrace(); return; } importController.process(container, new DefaultProcessor(), workspace); //See if graph is well imported //���ͼ��� GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); DirectedGraph graph = graphModel.getDirectedGraph(); for (int i = 1;i <= graph.getNodeCount();i++) { // System.out.println("Nodes: " + graph.getNode(i).getNodeData()); } System.out.println("Edges: " + graph.getEdgeCount()); //Layout for 1 minute //����1���� //^^ long time = 0; if (graph.getEdgeCount() > 20000) { time = (long) (((double) graph.getEdgeCount() / 80)); // System.out.println("log:huangzheng:"+DateUtil.time2str((int)System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")+"当前生成图像所花费的时间:"+time); }else if (graph.getEdgeCount() > 12000) { time = (long) (((double) graph.getEdgeCount() / 85)); // System.out.println("log:huangzheng:"+DateUtil.time2str((int)System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")+"当前生成图像所花费的时间:"+time); } else if (graph.getEdgeCount() > 8000) { time = (long) (((double) graph.getEdgeCount() / 90)); // System.out.println("log:huangzheng:"+DateUtil.time2str((int)System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")+"当前生成图像所花费的时间:"+time); } else if (graph.getEdgeCount() > 5000) { time = (long) (((double) graph.getEdgeCount() / 95)); // System.out.println("log:huangzheng:"+DateUtil.time2str((int)System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")+"当前生成图像所花费的时间:"+time); } else if (graph.getEdgeCount() > 100) { time = (long) (((double) graph.getEdgeCount() / 100)); // System.out.println("log:huangzheng:"+DateUtil.time2str((int)System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")+"当前生成图像所花费的时间:"+time); } else { time = 1; } AutoLayout autoLayout = new AutoLayout(time, TimeUnit.SECONDS); autoLayout.setGraphModel(graphModel); YifanHuLayout secondLayout = new YifanHuLayout(null, new StepDisplacement(1f)); ForceAtlasLayout firstLayout = new ForceAtlasLayout(null); AutoLayout.DynamicProperty adjustBySizeProperty = AutoLayout.createDynamicProperty("forceAtlas.adjustSizes.name", Boolean.TRUE, 0.1f);//True after 10% of layout time AutoLayout.DynamicProperty repulsionProperty = AutoLayout.createDynamicProperty("forceAtlas.repulsionStrength.name", new Double(500.), 0f);//500 for the complete period autoLayout.addLayout(firstLayout , 0.5f, new AutoLayout.DynamicProperty[]{adjustBySizeProperty, repulsionProperty}); autoLayout.addLayout(secondLayout, 0.5f); autoLayout.execute(); //^^ //Export ExportController ec = Lookup.getDefault().lookup(ExportController.class); try { ec.exportFile(new File("WebRoot/WEB-INF/weiboGexf/io_gexf2.gexf")); } catch (IOException ex) { ex.printStackTrace(); } } public static void main(String[] args) { WithAutoLayout autoLayout = new WithAutoLayout(); autoLayout.script(); // System.out.println(); } }