2016-01-27 9 views
1

Я пытаюсь создать сегмент линии, которая имеет впадину и корочки, как показано ниже: enter image description hereСоздайте фигуру с помощью Rectangle класса

enter image description here

EDIT: Теперь я получаю цифру сегмента линии в окне контура но не в редакторе диаграмм

Однако я не получаю именно то, что хотел. Я должен создать этот сегмент линии только с помощью 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);   
    } 


} 

EDIT ЧАСТЬ КЛАСС:

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 Мне нужно создать строку в редакторе диаграмм. Для этого я использую gmf edit part package class. –

ответ

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); 
  • Mine

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