2016-01-27 44 views
1

我想創造出具有槽和地殼線段創建,如下圖所示:enter image description here使用矩形

enter image description here

編輯:現在我越來越輪廓窗口中的線段圖但不是在圖編輯器

但是,我沒有得到正是我想要的。我必須使用x , y value and width/height from Rectangle class創建此線段。

下面是代碼:看外形輪廓的方法:

package pipenet.diagram.edit.parts; 

import org.eclipse.draw2d.Graphics; 
import org.eclipse.draw2d.Shape; 
import org.eclipse.draw2d.geometry.Rectangle; 
import org.eclipse.swt.SWT; 


public class Line3 extends Shape { 
    public Line3() { 
     this.setAntialias(SWT.ON);  
    } 
    @Override 
    protected void fillShape(Graphics graphics) { 
     graphics.pushState();  
     graphics.setFillRule(SWT.FILL_WINDING); 
     graphics.popState(); 
    } 

    @Override 
    protected void outlineShape(Graphics graphics) {   
     Rectangle r = getBounds().getCopy(); 
     // v 1 

     graphics.drawLine(r.x, r.y+r.height, r.x, r.y); 
    graphics.drawLine(r.x, r.y, r.x+r.width/2, r.y); 
    graphics.drawLine(r.x+r.width/2, r.y, r.x+r.width/2, r.y+r.height); 
    graphics.drawLine(r.x+r.width/2, r.y+r.height, r.x+r.width, r.y+r.height); 
    graphics.drawLine(r.x+r.width, r.y+r.height, r.x+r.width, r.y); 
    } 

    @Override 
    public void paintFigure(Graphics graphics) { 
     // TODO Auto-generated method stub 
     super.paintFigure(graphics);   
    } 


} 

編輯部件類:

package pipenet.diagram.edit.parts; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.LinkedList; 
import java.util.List; 

import org.eclipse.draw2d.FlowLayout; 
import org.eclipse.draw2d.Graphics; 
import org.eclipse.draw2d.IFigure; 
import org.eclipse.draw2d.PositionConstants; 
import org.eclipse.draw2d.RectangleFigure; 
import org.eclipse.draw2d.Shape; 
import org.eclipse.draw2d.StackLayout; 
import org.eclipse.draw2d.geometry.Dimension; 
import org.eclipse.gef.EditPart; 
import org.eclipse.gef.EditPolicy; 
import org.eclipse.gef.GraphicalEditPart; 
import org.eclipse.gef.commands.Command; 
import org.eclipse.gef.editpolicies.LayoutEditPolicy; 
import org.eclipse.gef.editpolicies.NonResizableEditPolicy; 
import org.eclipse.gef.handles.MoveHandle; 
import org.eclipse.gef.requests.CreateRequest; 
import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderedShapeEditPart; 
import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart; 
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; 
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.BorderItemSelectionEditPolicy; 
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles; 
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.FlowLayoutEditPolicy; 
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableShapeEditPolicy; 
import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemLocator; 
import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx; 
import org.eclipse.gmf.runtime.emf.type.core.IElementType; 
import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure; 
import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure; 
import org.eclipse.gmf.runtime.notation.View; 
import org.eclipse.swt.graphics.Color; 

import pipenet.diagram.edit.policies.TransitionItemSemanticEditPolicy; 
import pipenet.diagram.part.PipenetVisualIDRegistry; 
import pipenet.diagram.providers.PipenetElementTypes; 

/** 
* @generated 
*/ 
public class TransitionEditPart extends AbstractBorderedShapeEditPart { 

    /** 
    * @generated 
    */ 
    public static final int VISUAL_ID = 2001; 

    /** 
    * @generated 
    */ 
    protected IFigure contentPane; 

    /** 
    * @generated 
    */ 
    protected IFigure primaryShape; 

    /** 
    * @generated 
    */ 
    public TransitionEditPart(View view) { 
     super(view); 
    } 

    /** 
    * @generated 
    */ 
    protected void createDefaultEditPolicies() { 
     super.createDefaultEditPolicies(); 
     installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE, 
       new TransitionItemSemanticEditPolicy()); 
     installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy()); 
     // XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies 
     // removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE); 
    } 

    /** 
    * @generated 
    */ 
    protected LayoutEditPolicy createLayoutEditPolicy() { 

     FlowLayoutEditPolicy lep = new FlowLayoutEditPolicy() { 

      protected EditPolicy createChildEditPolicy(EditPart child) { 
       View childView = (View) child.getModel(); 
       switch (PipenetVisualIDRegistry.getVisualID(childView)) { 
       case TransitionNameEditPart.VISUAL_ID: 
        return new BorderItemSelectionEditPolicy() { 

         protected List createSelectionHandles() { 
          MoveHandle mh = new MoveHandle(
            (GraphicalEditPart) getHost()); 
          mh.setBackgroundColor(new Color(null, 20 ,80 , 90)); 
          mh.getBackgroundColor(); 
          System.out.print(mh.getBackgroundColor()); 
          mh.setBorder(null); 
          return Collections.singletonList(mh); 
         } 
        }; 
       } 

       EditPolicy result = child 
         .getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE); 
       if (result == null) { 
        result = new NonResizableEditPolicy(); 
       } 
       return result; 
       //return super.createChildEditPolicy(child); 
      } 

      protected Command createAddCommand(EditPart child, EditPart after) { 
       return null; 
      } 

      protected Command createMoveChildCommand(EditPart child, 
        EditPart after) { 
       return null; 
      } 

      protected Command getCreateCommand(CreateRequest request) { 
       return null; 
      } 
     }; 
     return lep; 
    } 

    /** 
    * @generated 
    */ 
    protected IFigure createNodeShape() { 
     return primaryShape = new Line3(); 
    } 

    /** 
    * @generated 
    * 
    * 
    */ 

// public TransitionFigure getPrimaryShape() { 
//  return (TransitionFigure) primaryShape; 
// } 

    /** 
    * @generated 
    */ 
    protected void addBorderItem(NodeFigure borderItemContainer, 
      IBorderItemEditPart borderItemEditPart) { 
     if (borderItemEditPart instanceof TransitionNameEditPart) { 
      BorderItemLocator locator = new BorderItemLocator(getMainFigure(), 
        PositionConstants.BOTTOM); 
      locator.setBorderItemOffset(new Dimension(-2, -2)); 
      borderItemContainer.add(borderItemEditPart.getFigure(), locator); 
     } else { 
      super.addBorderItem(borderItemContainer, borderItemEditPart); 
     } 
    } 

    /** 
    * @generated 
// */ 
    protected NodeFigure createNodePlate() { 
     DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(240, 240); 
     result.setBackgroundColor(new Color(null , 90 , 90 , 90)); 
     return result; 
    } 

    /** 
    * Creates figure for this edit part. 
    * 
    * Body of this method does not depend on settings in generation model 
    * so you may safely remove <i>generated</i> tag and modify it. 
    * 
    * @generated 
    */ 
    protected NodeFigure createMainFigure() { 
     NodeFigure figure= createNodePlate(); 
     figure.setLayoutManager(new StackLayout()); 
     IFigure shape = createNodeShape(); 
     figure.add(shape); 
     contentPane = setupContentPane(shape); 
     return figure; 
    } 

    /** 
    * Default implementation treats passed figure as content pane. 
    * Respects layout one may have set for generated figure. 
    * @param nodeShape instance of generated figure class 
    * @generated 
    */ 
    protected IFigure setupContentPane(IFigure nodeShape) { 
     return nodeShape; // use nodeShape itself as contentPane 
    } 

    /** 
    * @generated 
    */ 
    public IFigure getContentPane() { 
     if (contentPane != null) { 
      return contentPane; 
     } 
     return super.getContentPane(); 
    } 

    /** 
    * @generated 
    */ 
    protected void setForegroundColor(Color color) { 
     if (primaryShape != null) { 
      primaryShape.setForegroundColor(color); 
     } 
    } 

    /** 
    * @generated 
    */ 
    protected void setBackgroundColor(Color color) { 
     if (primaryShape != null) { 
      primaryShape.setBackgroundColor(color); 
     } 
    } 

    /** 
    * @generated 
    */ 
    protected void setLineWidth(int width) { 
     if (primaryShape instanceof Shape) { 
      ((Shape) primaryShape).setLineWidth(width); 
     } 
    } 

    /** 
    * @generated 
    */ 
    protected void setLineType(int style) { 
     if (primaryShape instanceof Shape) { 
      ((Shape) primaryShape).setLineStyle(style); 
     } 
    } 

    /** 
    * @generated 
    */ 
    public EditPart getPrimaryChildEditPart() { 
     return getChildBySemanticHint(PipenetVisualIDRegistry 
       .getType(TransitionNameEditPart.VISUAL_ID)); 
    } 

    /** 
    * @generated 
    */ 
    public List/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/getMARelTypesOnSource() { 
     ArrayList/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/types = new ArrayList/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/(
       1); 
     types.add(PipenetElementTypes.Arch_4001); 
     return types; 
    } 

    /** 
    * @generated 
    */ 
    public List/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/getMARelTypesOnSourceAndTarget(
      IGraphicalEditPart targetEditPart) { 
     LinkedList/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/types = new LinkedList/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/(); 
     if (targetEditPart instanceof pipenet.diagram.edit.parts.TransitionEditPart) { 
      types.add(PipenetElementTypes.Arch_4001); 
     } 
     if (targetEditPart instanceof PlaceEditPart) { 
      types.add(PipenetElementTypes.Arch_4001); 
     } 
     return types; 
    } 

    /** 
    * @generated 
    */ 
    public List/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/getMATypesForTarget(
      IElementType relationshipType) { 
     LinkedList/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/types = new LinkedList/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/(); 
     if (relationshipType == PipenetElementTypes.Arch_4001) { 
      types.add(PipenetElementTypes.Transition_2001); 
      types.add(PipenetElementTypes.Place_2002); 
     } 
     return types; 
    } 

    /** 
    * @generated 
    */ 
    public List/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/getMARelTypesOnTarget() { 
     ArrayList/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/types = new ArrayList/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/(
       1); 
     types.add(PipenetElementTypes.Arch_4001); 
     return types; 
    } 

    /** 
    * @generated 
    */ 
    public List/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/getMATypesForSource(
      IElementType relationshipType) { 
     LinkedList/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/types = new LinkedList/*[org.eclipse.gmf.runtime.emf.type.core.IElementType]*/(); 
     if (relationshipType == PipenetElementTypes.Arch_4001) { 
      types.add(PipenetElementTypes.Transition_2001); 
      types.add(PipenetElementTypes.Place_2002); 
     } 
     return types; 
    } 

// @Override 
// public EditPolicy getPrimaryDragEditPolicy() { 
//  ResizableShapeEditPolicy editPolicy = new ResizableShapeEditPolicy(); 
//  editPolicy.setResizeDirections(PositionConstants.SOUTH); 
//  editPolicy.setResizeDirections(PositionConstants.NORTH); 
//  //editPolicy.setDragAllowed(false); 
//  
//  return editPolicy; 
// } 

    /** 
    * @generated 
    */ 
    public class TransitionFigure extends Line3{ 

     /** 
     * @generated 
     */ 


     public TransitionFigure() { 

      FlowLayout layoutThis = new FlowLayout(); 
      layoutThis.setStretchMinorAxis(true); 
      layoutThis.setMinorAlignment(FlowLayout.ALIGN_LEFTTOP); 

      layoutThis.setMajorAlignment(FlowLayout.ALIGN_LEFTTOP); 
      layoutThis.setMajorSpacing(15); 
      layoutThis.setMinorSpacing(15); 
      layoutThis.setHorizontal(true); 

      this.setLayoutManager(layoutThis); 

     } 


    } 

} 
+1

什麼是你的問題? – SeniorJD

+0

您只繪製了4行。圖中有5行顯示。另外,檢查你的座標,h1對我來說看起來不對,你需要給兩個Y座標增加高度。檢查他們全部。 – Wossname

+0

@SeniorJd我必須在圖編輯器中創建一個linesegment。我正在使用gmf編輯零件包類來這樣做。 –

回答

1

有5條線在這個數字,但是你只畫四強。此外,您將寬度添加到y值,這會使線條太高。您應該使用一半寬度到達矩形的中間部分

由於每條線都與前一條線連接,因此您可以從前一條線完成的位置開始一條一條地繪製線條。

如何:

graphics.drawLine(r.x, r.y+r.height, r.x, r.y); 
graphics.drawLine(r.x, r.y, r.x+r.width/2, r.y); 
graphics.drawLine(r.x+r.width/2, r.y, r.x+r.width/2, r.y+r.height); 
graphics.drawLine(r.x+r.width/2, r.y+r.height, r.x+r.width, r.y+r.height); 
graphics.drawLine(r.x+r.width, r.y+r.height, r.x+r.width, r.y); 
+0

謝謝。我更新了我的問題。請參閱編輯。 –

+0

我不知道你用什麼應用程序來繪製它,但邏輯是合理的 – mikeyq6

+0

好的沒問題。我會弄清楚。以防萬一,如果你想知道,我使用emf和gmf來創建圖形對象。 –

0

這是完整的解決方案。

@ mikeyq6的解決方案:

graphics.drawLine(r.x, r.y+r.height, r.x, r.y); 
graphics.drawLine(r.x, r.y, r.x+r.width/2, r.y); 
graphics.drawLine(r.x+r.width/2, r.y, r.x+r.width/2, r.y+r.height); 
graphics.drawLine(r.x+r.width/2, r.y+r.height, r.x+r.width, r.y+r.height); 
graphics.drawLine(r.x+r.width, r.y+r.height, r.x+r.width, r.y); 

Rectangle r = getBounds().getShrinked(100, 80);