📄 orthogonallinelayout.java
字号:
new Double( frombounds.getCenterX()).floatValue(),
new Double( frombounds.getCenterY()).floatValue() );
Point2D.Float tocenter = new Point2D.Float(
new Double( tobounds.getCenterX()).floatValue(),
new Double( tobounds.getCenterY()).floatValue() );
Point fromgridpoint = this.grid.findVisualVertex( vedge.getVisualVertexA());
Point togridpoint = this.grid.findVisualVertex( vedge.getVisualVertexB());
double fromwidth = frombounds.getWidth();
double fromheight = frombounds.getHeight();
double towidth = tobounds.getWidth();
double toheight = tobounds.getHeight();
int fromindex = this.vgraph.getVisualVertices().indexOf( vedge.getVisualVertexA() );
int toindex = this.vgraph.getVisualVertices().indexOf( vedge.getVisualVertexB() );
GeneralPath gPath = vedge.getGeneralPath();
// Route straight edges first....
if( fromgridpoint.x == togridpoint.x ) {
// route upwards
if( togridpoint.y < fromgridpoint.y ) {
vedge.setFromPortAssignment( new Point2DDouble( (fromwidth / 2), 0 ));
vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), toheight ));
((List) this.topedges.get( fromindex )).add( vedge );
((List) this.bottomedges.get( toindex )).add( vedge );
}
// route downwards
else if( togridpoint.y > fromgridpoint.y ) {
vedge.setFromPortAssignment( new Point2DDouble( (fromwidth / 2), fromheight) );
vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), 0) );
((List) this.bottomedges.get( fromindex )).add( vedge );
((List) this.topedges.get( toindex )).add( vedge );
}
gPath.reset();
gPath.moveTo( fromcenter.x , fromcenter.y );
gPath.lineTo( fromcenter.x, tocenter.y );
}
else if( togridpoint.y == fromgridpoint.y ) {
// route to the left
if( togridpoint.x < fromgridpoint.x ) {
vedge.setFromPortAssignment( new Point2DDouble( 0, (fromheight / 2) ));
vedge.setToPortAssignment( new Point2DDouble( towidth, (toheight / 2) ));
((List) this.leftedges.get( fromindex )).add( vedge );
((List) this.rightedges.get( toindex )).add( vedge );
}
// route to the right
else if( togridpoint.x > fromgridpoint.x ) {
vedge.setFromPortAssignment( new Point2DDouble( fromwidth, (fromheight / 2) ));
vedge.setToPortAssignment( new Point2DDouble( 0, (toheight / 2) ));
((List) this.rightedges.get( fromindex )).add( vedge );
((List) this.leftedges.get( toindex )).add( vedge );
}
gPath.reset();
gPath.moveTo( fromcenter.x , fromcenter.y );
gPath.lineTo( tocenter.x, fromcenter.y );
}
// Now route free edges
// tocenter is at the upper-right of fromcenter
if( togridpoint.x > fromgridpoint.x && togridpoint.y < fromgridpoint.y ) {
gPath.reset();
gPath.moveTo( fromcenter.x, fromcenter.y );
if(
(fromwidth - ((List) this.topedges.get( fromindex )).size() +
toheight - ((List) this.leftedges.get( toindex )).size()) >=
(fromheight - ((List) this.rightedges.get( fromindex )).size() +
towidth - ((List) this.bottomedges.get( toindex )).size()) ){
// route vertically (up) then horizontally (right)
vedge.setFromPortAssignment( new Point2DDouble( (fromwidth / 2), 0 ));
vedge.setToPortAssignment( new Point2DDouble( 0, (toheight / 2) ));
((List) this.topedges.get( fromindex )).add( vedge );
((List) this.leftedges.get( toindex )).add( vedge );
gPath.lineTo( fromcenter.x, tocenter.y );
}
else {
// route horizontally (right) then vertically (up)
vedge.setFromPortAssignment( new Point2DDouble( fromwidth, (fromheight / 2) ));
vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), toheight ));
((List) this.rightedges.get( fromindex )).add( vedge );
((List) this.bottomedges.get( toindex )).add( vedge );
gPath.lineTo( tocenter.x, fromcenter.y );
}
gPath.lineTo( tocenter.x, tocenter.y );
}
// tocenter is at the lower-right of fromcenter
else if( togridpoint.x > fromgridpoint.x && togridpoint.y > fromgridpoint.y ) {
gPath.reset();
gPath.moveTo( fromcenter.x, fromcenter.y );
if(
(fromwidth - ((List) this.bottomedges.get( fromindex )).size() +
toheight - ((List) this.leftedges.get( toindex )).size()) >=
(fromheight - ((List) this.rightedges.get( fromindex )).size() +
towidth - ((List) this.topedges.get( toindex )).size()) ){
// route vertically (down) then horizontally (right)
vedge.setFromPortAssignment( new Point2DDouble( (fromwidth / 2), fromheight ));
vedge.setToPortAssignment( new Point2DDouble( 0, (toheight / 2) ));
((List) this.bottomedges.get( fromindex )).add( vedge );
((List) this.leftedges.get( toindex )).add( vedge );
gPath.lineTo( fromcenter.x, tocenter.y );
}
else {
// route horizontally (right) then vertically (down)
vedge.setFromPortAssignment( new Point2DDouble( fromwidth, (fromheight / 2) ));
vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), 0 ));
((List) this.rightedges.get( fromindex )).add( vedge );
((List) this.topedges.get( toindex )).add( vedge );
gPath.lineTo( tocenter.x, fromcenter.y );
}
gPath.lineTo( tocenter.x, tocenter.y );
}
// tocenter is at the lower-left of fromcenter
else if( togridpoint.x < fromgridpoint.x && togridpoint.y > fromgridpoint.y ) {
gPath.reset();
gPath.moveTo( fromcenter.x, fromcenter.y );
if(
(fromwidth - ((List) this.bottomedges.get( fromindex )).size() +
toheight - ((List) this.rightedges.get( toindex )).size()) >=
(fromheight - ((List) this.leftedges.get( fromindex )).size() +
towidth - ((List) this.topedges.get( toindex )).size()) ){
// route vertically (down) then horizontally (left)
vedge.setFromPortAssignment( new Point2DDouble( (fromwidth / 2), fromheight ));
vedge.setToPortAssignment( new Point2DDouble( towidth, (toheight / 2) ));
((List) this.bottomedges.get( fromindex )).add( vedge );
((List) this.rightedges.get( toindex )).add( vedge );
gPath.lineTo( fromcenter.x, tocenter.y );
}
else {
// route horizontally (left) then vertically (down)
vedge.setFromPortAssignment( new Point2DDouble( 0, (fromheight / 2) ));
vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), 0 ) );
((List) this.leftedges.get( fromindex )).add( vedge );
((List) this.topedges.get( toindex )).add( vedge );
gPath.lineTo( tocenter.x, fromcenter.y );
}
gPath.lineTo( tocenter.x, tocenter.y );
}
// tocenter is at the upper-left of fromcenter
else if( togridpoint.x < fromgridpoint.x && togridpoint.y < fromgridpoint.y ) {
gPath.reset();
gPath.moveTo( fromcenter.x, fromcenter.y );
if(
(fromwidth - ((List) this.topedges.get( fromindex )).size() +
toheight - ((List) this.rightedges.get( toindex )).size()) >=
(fromheight - ((List) this.leftedges.get( fromindex )).size() +
towidth - ((List) this.bottomedges.get( toindex )).size()) ){
// route vertically (up) then horizontally (left)
vedge.setFromPortAssignment( new Point2DDouble( ( fromwidth / 2), 0 ));
vedge.setToPortAssignment( new Point2DDouble( towidth, (toheight / 2) ));
((List) this.topedges.get( fromindex )).add( vedge );
((List) this.rightedges.get( toindex )).add( vedge );
gPath.lineTo( fromcenter.x, tocenter.y );
}
else {
// route horizontally (left) then vertically (up)
vedge.setFromPortAssignment( new Point2DDouble( 0, (fromheight / 2) ));
vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), toheight ) );
((List) this.leftedges.get( fromindex )).add( vedge );
((List) this.bottomedges.get( toindex )).add( vedge );
gPath.lineTo( tocenter.x, fromcenter.y );
}
gPath.lineTo( tocenter.x, tocenter.y );
}
}
/**
* Assigns ports to all edges. A port being a point along the outside perimeter
* of a vertex.
*/
private void portassignment() {
int i, size = this.vgraph.getVisualVertices().size();
for( i = 0; i < size; i++ )
this.portassignment( (VisualVertex) this.vgraph.getVisualVertices().get( i )) ;
}
/**
* Assigns ports to all edge of a vertex.
*
* @param vvertx VisualVertex object whose edges will be assigned ports
*/
private void portassignment( VisualVertex vvertex ) {
Point2D center = new Point2D.Double (vvertex.getBounds2D().getCenterX(), vvertex.getBounds2D().getCenterY());
int index = this.vgraph.getVisualVertices().indexOf( vvertex );
VisualEdge vedge;
AffineTransform transform = new AffineTransform();
Point2DDouble portpoint = new Point2DDouble();
Point2DDouble translatedportpoint = new Point2DDouble();
double segment[] = new double[6];
double width, height;
int i, size;
// Now give the port assignments
transform.setToTranslation(
vvertex.getBounds2D().getMinX() - vvertex.getBounds2D().getCenterX(),
vvertex.getBounds2D().getMinY() - vvertex.getBounds2D().getCenterY() );
width = vvertex.getBounds2D().getWidth();
height = vvertex.getBounds2D().getHeight();
// Give port assignment for top edges, sorted in clockwise order
size = ((List) this.topedges.get( index )).size();
for( i = 0 ; i < size; i++ ) {
vedge = (VisualEdge) ((List) topedges.get( index )).get( i );
portpoint.x = ((i+1) * width / (size + 1));
portpoint.y = 0;
transform.transform( portpoint, translatedportpoint );
if( vedge.getVisualVertexA() == vvertex )
vedge.setFromPortAssignment( translatedportpoint );
else
vedge.setToPortAssignment( translatedportpoint );
}
// Give port assignment for left edges, sorted on clockwise order
size = ((List) this.leftedges.get( index )).size();
for( i = 0 ; i < size; i++ ) {
vedge = (VisualEdge) ((List) leftedges.get( index )).get( i );
portpoint.x = 0;
portpoint.y = ((size - i) * height / (size + 1));
transform.transform( portpoint, translatedportpoint );
if( vedge.getVisualVertexA() == vvertex )
vedge.setFromPortAssignment( translatedportpoint );
else
vedge.setToPortAssignment( translatedportpoint );
}
// Give port assignment for right edges, sorted on clockwise order
size = ((List) this.rightedges.get( index )).size();
for( i = 0 ; i < size; i++ ) {
vedge = (VisualEdge) ((List) rightedges.get( index )).get( i );
portpoint.x = width;
portpoint.y = ((i+1) * height / (size + 1));
transform.transform( portpoint, translatedportpoint );
if( vedge.getVisualVertexA() == vvertex )
vedge.setFromPortAssignment( translatedportpoint );
else
vedge.setToPortAssignment( translatedportpoint );
}
// Give port assignment for bottom edges, sorted on clockwise order
size = ((List) this.bottomedges.get( index )).size();
for( i = 0 ; i < size; i++ ) {
vedge = (VisualEdge) ((List) bottomedges.get( index )).get( i );
portpoint.x = ((size - i) * width / (size + 1));
portpoint.y = height;
transform.transform( portpoint, translatedportpoint );
if( vedge.getVisualVertexA() == vvertex )
vedge.setFromPortAssignment( translatedportpoint );
else
vedge.setToPortAssignment( translatedportpoint );
}
}
/**
* Lays out the graph. The layout is performed in the following steps:
* generalPosition() and the medianPlacement().
*
* @see #drawLayout()
*/
public void layout(){
super.layout();
this.initialized = true;
this.initGraphLayout();
this.generalPosition( this.vgraph.getVisualVertices(), this.grid );
this.medianPlacement();
this.routeEdges();
this.portassignment();
this.drawLayout();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -