`

Bendpoint随着图元位置的变化而变化

阅读更多
我这里以gef.tutorial.step为例,在此工程基础修改代码实现该功能

首先将ContentsEditPart的布局做如下调整
	protected IFigure createFigure() {
		Layer figure = new Layer() {
			public void paint(Graphics graphics) {
					graphics.setAntialias(SWT.ON);
					graphics.setTextAntialias(SWT.ON);
				super.paint(graphics);
			}
		};
		figure.setLayoutManager(new XYLayout());
		ConnectionLayer layer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
		layer.setConnectionRouter(ConnectionRouter.NULL);
		return figure;
	}


然后实现连线转折点模型:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) All rights reserved. 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 *  http://www.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/

package gef.tutorial.step.parts;

import java.io.Serializable;

import org.eclipse.draw2d.Bendpoint;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class ConnectionBendpoint implements Serializable, Bendpoint {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private float weight = 0.5f;

    private Dimension d1 = null;

    private Dimension d2 = null;

    public ConnectionBendpoint() {
    	// ignore
    }

    public ConnectionBendpoint(Dimension dim1, Dimension dim2) {
    	d1 = dim1;
        d2 = dim2;
    }

    public Dimension getFirstRelativeDimension() {
        return d1;
    }

    public Point getLocation() {
        return null;
    }

    public Dimension getSecondRelativeDimension() {
        return d2;
    }

    public float getWeight() {
        return weight;
    }

    public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
        d1 = dim1;
        d2 = dim2;
    }

    public void setWeight(float w) {
        weight = w;
    }
}


在来实现Command:
关于转折点的命令这里做了个基类以便添加删除移动实现的方便BendpointCommand:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) All rights reserved. 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 *  http://www.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/
package gef.tutorial.step.commands;

import gef.tutorial.step.model.AbstractConnectionModel;

import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.commands.Command;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class BendpointCommand extends Command {
	protected int index = 0;
	protected Point location = null;
	protected AbstractConnectionModel connectionModel = null;
	private Dimension d1 = null;
	private Dimension d2 = null;

	protected Dimension getFirstRelativeDimension() {
		return d1;
	}

	protected Dimension getSecondRelativeDimension() {
		return d2;
	}

	protected int getIndex() {
		return index;
	}

	@SuppressWarnings("unused")
	protected Point getLocation() {
		return location;
	}

	protected AbstractConnectionModel getConnectionModel() {
		return connectionModel;
	}

	public void redo() {
		execute();
	}

	public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
		d1 = dim1;
		d2 = dim2;
	}

	public void setIndex(int i) {
		index = i;
	}

	public void setLocation(Point p) {
		location = p;
	}

	public void setConnectionModel(AbstractConnectionModel connection) {
		connectionModel = connection;
	}
}


CreateBendpointCommand:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) All rights reserved. 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 *  http://www.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/

package gef.tutorial.step.commands;

import gef.tutorial.step.parts.ConnectionBendpoint;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class CreateBendpointCommand extends BendpointCommand {
	public void execute() {
		ConnectionBendpoint rbp = new ConnectionBendpoint(getFirstRelativeDimension(), getSecondRelativeDimension());
		getConnectionModel().addBendpoint(getIndex(), rbp);
		super.execute();
	}

	public void undo() {
		super.undo();
		getConnectionModel().removeBendpoint(getIndex());
	}
}

MoveBendpointCommand:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) All rights reserved. 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 *  http://www.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/

package gef.tutorial.step.commands;

import gef.tutorial.step.parts.ConnectionBendpoint;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class MoveBendpointCommand extends BendpointCommand {
	private ConnectionBendpoint bendpoint = null;

	public void execute() {
		bendpoint = (ConnectionBendpoint) getConnectionModel().getBendpoints().get(getIndex());
		getConnectionModel().removeBendpoint(getIndex());
		super.execute();
	}

	public void undo() {
		super.undo();
		getConnectionModel().addBendpoint(getIndex(), bendpoint);
	}
}

DeleteBendpointCommand:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) All rights reserved. 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 *  http://www.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/

package gef.tutorial.step.commands;

import gef.tutorial.step.parts.ConnectionBendpoint;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class DeleteBendpointCommand extends BendpointCommand {
	private ConnectionBendpoint bendpoint = null;

	public void execute() {
		bendpoint = (ConnectionBendpoint) getConnectionModel().getBendpoints().get(getIndex());
		getConnectionModel().removeBendpoint(getIndex());
		super.execute();
	}

	public void undo() {
		super.undo();
		getConnectionModel().addBendpoint(getIndex(), bendpoint);
	}

}


对应的Plicy做如下修改:
/*******************************************************************************
 * Copyright (c) 2005-2011, Chinese Eclipse Community(CEC) All rights reserved. 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 *  http://www.ceclipse.org
 *
 * Contributors:
 *   Ming.He <heming@ceclipse.com> - initial API and implementation 
 *******************************************************************************/

package gef.tutorial.step.policies;

import gef.tutorial.step.commands.BendpointCommand;
import gef.tutorial.step.commands.CreateBendpointCommand;
import gef.tutorial.step.commands.DeleteBendpointCommand;
import gef.tutorial.step.commands.MoveBendpointCommand;
import gef.tutorial.step.model.AbstractConnectionModel;

import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.BendpointEditPolicy;
import org.eclipse.gef.requests.BendpointRequest;

/**
 * TODO 此处填写 class 信息
 * 
 * @author Ming.He
 * @date 2011-4-15
 */
public class CustomBendpointEditPolicy extends BendpointEditPolicy {

	
	protected Command getCreateBendpointCommand(BendpointRequest request) {
		 CreateBendpointCommand command = new CreateBendpointCommand();
         Point p = request.getLocation();
         Connection conn = getConnection();

         conn.translateToRelative(p);

         command.setLocation(p);
         Point ref1 = getConnection().getSourceAnchor().getReferencePoint();
         Point ref2 = getConnection().getTargetAnchor().getReferencePoint();

         conn.translateToRelative(ref1);
         conn.translateToRelative(ref2);

         command.setRelativeDimensions(p.getDifference(ref1), p.getDifference(ref2));
         command.setConnectionModel((AbstractConnectionModel) request.getSource().getModel());
         command.setIndex(request.getIndex());
         return command;
	}

	
	protected Command getDeleteBendpointCommand(BendpointRequest request) {
		 BendpointCommand command = new DeleteBendpointCommand();
         Point p = request.getLocation();
         command.setLocation(p);
         command.setConnectionModel((AbstractConnectionModel) request.getSource().getModel());
         command.setIndex(request.getIndex());
         return command;
	}

	
	protected Command getMoveBendpointCommand(BendpointRequest request) {
		// ������bend����
		  MoveBendpointCommand command = new MoveBendpointCommand();
          Point p = request.getLocation();
          Connection conn = getConnection();

          conn.translateToRelative(p);

          command.setLocation(p);

          Point ref1 = getConnection().getSourceAnchor().getReferencePoint();
          Point ref2 = getConnection().getTargetAnchor().getReferencePoint();

          conn.translateToRelative(ref1);
          conn.translateToRelative(ref2);

          command.setRelativeDimensions(p.getDifference(ref1), p.getDifference(ref2));
          command.setConnectionModel((AbstractConnectionModel) request.getSource().getModel());
          command.setIndex(request.getIndex());
          return command;
	}

}
  • 大小: 2.3 KB
  • 大小: 2.2 KB
3
1
分享到:
评论

相关推荐

    通过改变图元大小来实现闪烁

    实现图元闪烁的技术不仅限于改变尺寸,还可以通过改变颜色、透明度、位置等多种方式。在实际应用中,需要注意闪烁频率的控制,过高可能会引起视觉疲劳,过低则可能无法达到预期的视觉效果。此外,考虑到不同用户的...

    在MapX中实现点图元的位置移动和大小调整功能

    首先,我们要理解MapX中的点图元(Point Element)是地图上表示特定地理位置的基本元素。MapX提供了一套API,允许开发者创建、修改和管理这些图元。然而,原始的API可能并不完全满足所有用户需求,例如,移动和缩放...

    基于Qt实现支持图元拖曳、定点滚轮旋转和缩放【100012334】

    应用设计上,我完成了满足文件接口要求的命令行程序,完成了基于鼠标点击的图元绘制、基于鼠标拖曳的图元移动,和基于可视化锚点及鼠标滚轮的图元旋转、图元缩放,并将控制逻辑集成到 GUI 应用中。最终使用静态编译...

    mapx mapinfo移动图元

    3. 获取图元位置:通过MapObject的属性,如Left、Top、Right、Bottom等,可以获取图元的当前坐标。 4. 更新图元位置:当需要移动图元时,改变MapObject的坐标属性,然后调用Refresh方法更新地图视图。 5. 处理鼠标...

    Mapx搜索图元解决方法

    本文介绍了一种新的方法,通过该方法可以直接对图元进行删、改、查操作而无需事先搜索定位。 #### 方法概述 本方法的核心在于使用MapX提供的API直接创建、修改和删除图元,而不需要经过复杂的搜索过程。这种方法...

    地图图元修改工具

    随着科技的发展,地理信息系统(GIS)已经成为一个不可或缺的工具,在城市规划、环境研究、资源管理等多个领域发挥着重要作用。...随着GIS应用的日益广泛,地图图元修改工具必将在更多的领域中发挥出更大的作用。

    SVG电力图元定义.rar

    2. **几何形状**:每个图元都是由基本的几何形状组合而成,如直线、曲线、圆弧等,这些形状在SVG中通过坐标和路径数据来定义。 3. **填充和描边**:图元的填充颜色和边框颜色可以通过SVG的fill和stroke属性进行设置...

    AutoCAD二次开发在图元位置智能化分析中的应用

    在本篇文章中,作者利用AutoLISP语言进行了这种二次开发,以实现对图元(如直线段、圆弧)之间位置关系的智能化分析。 AutoLISP是AutoCAD内置的一种解释型编程语言,它允许开发者直接访问和操作AutoCAD的数据结构,...

    基于GDI+的 图元绘制拾取 C#实现

    在本文中,我们将深入探讨如何使用C#语言和GDI+库来实现图元绘制及拾取功能。GDI+(Graphics Device Interface Plus)是Windows应用程序中用于图形绘制的一个强大工具,它允许开发者创建丰富的2D图形、图像处理以及...

    MFC图元的组合,拆分,移动源代码

    在实际应用中,可能需要结合窗口消息处理,如WM_PAINT消息,以响应用户的交互,更新图元的位置。 5. **代码规范与清晰性**: 提到的代码规范清楚,意味着良好的编程实践,包括但不限于适当的命名、注释、模块化和...

    QGraphicsItem自定义图元,拖动绘制,拖动拉伸缩放图元

    `QGraphicsScene`管理所有`QGraphicsItem`,而`QGraphicsView`则提供了用户与这些图元交互的窗口。 以上就是关于“QGraphicsItem自定义图元,拖动绘制,拖动拉伸缩放图元”的核心知识点。通过深入理解并实践这些...

    图元组件设计原理详解,wpf的图元

    它使得图元能够根据外部数据的变化而变化,实现动态显示。 2. **ITagReader**:这是一个可视化的控件基类,它定义了读取数据源的方法。通过继承ITagReader,图元可以读取数据并更新其显示状态。 3. **ITagWriter**:...

    这个图形编辑器带有保存图元的功能

    在这个编辑器中,Access数据库可能用于存储图元的属性,如形状类型、颜色、大小、位置等,以及与图元相关的元数据,比如创建日期、作者信息等。 使用数据库的好处包括数据的一致性、安全性和可扩展性。一致性确保...

    SVG格式定义的电力图元/电力图符

    在电力行业中,SVG格式被广泛用于定义电力图元,即电力系统中的符号和设备图标,因为它们可以被缩放而不损失清晰度,非常适合在各种尺寸的屏幕和打印材料上使用。 在电力接线图的绘制中,SVG格式的电力图元定义提供...

    相连图元转边框_相连图元转换成边框图层_

    4. **方便编辑**:作为一个整体的边框,可以进行整体移动、缩放和修改,而不会影响到单个元素。 5. **增强可视化**:统一的边框可以提供更清晰的视觉效果,尤其是在打印或导出时。 在使用"相连图元转边框 修改版....

    VC + MapX 实现图元信息查询

    这些图元可能携带丰富的属性信息,如点的位置坐标、线的长度、面的面积,以及附加的人工信息如名称、类型等。查询图元信息是GIS应用中的常见需求,有助于分析和理解地图数据。 描述中提到的“控制,点击选择,矩形...

    基于c#的mapx 图元的添加与删除

    设置图元的位置、形状、颜色等属性。 4. 添加图元到图层:将创建的图元对象添加到对应的图层中。 5. 更新地图视图:最后,调用Map的Redraw方法更新地图显示,使得新添加的图元可见。 示例代码(简略): ```csharp ...

    Javascript图元绘制库ternlight.zip

    目前已支持简单的矩形图元和图元间的连线(直线、直角连线两种),拖拽图元等能力。 该javascript library的实现借鉴了NetronLight的不少思路,相应地将之命名为ternlight。 目前,支持的主要能力如下:  1...

    易语言源码易语言取图元文件源码.rar

    而用户交互方面,易语言有丰富的控件库,可以创建各种界面元素,如按钮、菜单等,以提供良好的用户体验。 总的来说,"易语言源码易语言取图元文件源码.rar"这个压缩包中的内容,为我们展示了如何在易语言环境中处理...

    Star引擎之基本图元

    在3D图形绘制中,每个顶点定义了一个几何位置,多个顶点通过连接线形成图元,如点、线段或三角形。VertexBuffer允许一次性将大量顶点数据上传到显卡,提高了渲染效率。在"Star引擎"的初步实现中,利用VertexBuffer...

Global site tag (gtag.js) - Google Analytics