您的位置:首页 > 其它

GEF学习系列之二:网格吸附与几何对齐

2010-04-23 16:29 218 查看
网格辅助


网格是一般图形编辑系统中的常用辅 助功能,它可以帮我们定位画布上的图形元素,当被拖动的图元接近网格线时会自动吸附在网格线上,这样大大减少了图形编辑软件的易用性,在

GEF

中也提供了这样的功能。效 果如图所示:



是否显示网格以及是否打开吸附功能是由
GraphicalViewer
的两个布尔类型的属性(
property
)值决定的,它们分别是
SnapToGrid.PROPERTY_GRID_VISIBLE

SnapToGrid.PROPERTY_GRID_ENABLED
,这些属性是通过
GriaphicalViewer.getProperty()

setProperty()
方法来操作的。 GEF
为我们提供了一个 T

oggleGridAction

用来同时切换它们的值(保 持这两个值同步确实符合一般使用习惯),但没有像缩放功能那样提供对应的

RetargetAction

,不知道 GEF
是出于什么考虑。另外因为
这个 Action
没有预先设置的图标,所以 把它直接添加到工具条上会很不好看,所以要么把它只放在菜单中,要么为它设置一个图标,至于添加到菜单的方法这里不赘述了。

要想在保存模型时同时记录当前网格线是否显示,必须在画布模型里增加一个布尔类型变量,并在打开模型和保存模型的方法中增加处理它的代码。

几何对齐


这个功能也是为了方便用户 排列图形元素的,如果打开了此功能,当用户拖动的图形有某个边靠近另一图形的某个平行边延长线时,会自动吸附到这条延长线上;若两个图形的中心线(通过图
形中心点的水平或垂直线)平行靠近时也会产生吸附效果。

几何对齐也是通过
GraphicalViewer
的属性来控制是否打开的, 属性的名称是 SnapToGeometry.PROPERTY_SNAP_ENABLED

,值为布尔类型。在程序里 增加吸附对齐切换的功能和前面说的增加网格切换功能基本是一样的,记住 GEF
为它提供的
Action

ToggleSnapToGeometryAction


要实现对齐功能,还有一个重要的步骤,那就是在画布所对应的 EditPart
的 getAdapter()
方法里增加对 SnapToHelper
类的回应,像下面这样:

public Object getAdapter(Class adapter) {
if (adapter == SnapToHelper.class) {
List snapStrategies = new ArrayList();
Boolean val = (Boolean)getViewer().getProperty(RulerProvider.PROPERTY_RULER_VISIBILITY);
if (val != null && val.booleanValue())
snapStrategies.add(new SnapToGuides(this));
val = (Boolean)getViewer().getProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED);
if (val != null && val.booleanValue())
snapStrategies.add(new SnapToGeometry(this));
val = (Boolean)getViewer().getProperty(SnapToGrid.PROPERTY_GRID_ENABLED);
if (val != null && val.booleanValue())
snapStrategies.add(new SnapToGrid(this));

if (snapStrategies.size() == 0)
return null;
if (snapStrategies.size() == 1)
return snapStrategies.get(0);
SnapToHelper ss[] = new SnapToHelper[snapStrategies.size()];
for (int i = 0; i < snapStrategies.size(); i++)
ss[i] = (SnapToHelper)snapStrategies.get(i);
return new CompoundSnapToHelper(ss);
}
return super.getAdapter(adapter);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: