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
类的回应,像下面这样:
网格是一般图形编辑系统中的常用辅 助功能,它可以帮我们定位画布上的图形元素,当被拖动的图元接近网格线时会自动吸附在网格线上,这样大大减少了图形编辑软件的易用性,在
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); }
相关文章推荐
- GEF 学习系列之三:缩放、位置和尺寸对齐
- C++11系列学习之二-----lambda表达式
- 嵌入式底层软件开发学习系列之二计算机相关课程
- .Net学习难点讨论系列5 – 线程同步问题之二
- (六)张正友标定法小结 【计算机视觉学习笔记--双目视觉几何架构系列】
- ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之二 joint 使用
- Visual Studio Application Lifecycle Management 2010 脑图学习系列 之二 Creating a Great Product Backlog
- 使用腾讯云 GPU 学习深度学习系列之二:Tensorflow 简明原理【转】
- Flex学习系列之二---RIA技术与传统的页面架构
- TensorFlow学习系列之二:深度学习框架比较
- 【J2me3D系列学习文章之二】(立即模式)构造我们3D世界中的第一个立方体!
- STL学习系列之二——序列容器(vector)
- 图像坐标:我想和世界坐标谈谈(A) 【计算机视觉学习笔记--双目视觉几何框架系列】
- 张正友标定法 【计算机视觉学习笔记--双目视觉几何框架系列】
- 走进WPF系列学习之二 如何用WPF绘制与配置2D图形界面
- (一)图像坐标:我想和世界坐标谈谈(A) 【计算机视觉学习笔记--双目视觉几何框架系列】
- Swing系列-组件对齐方式的学习
- C语言深入学习系列 - 字节对齐&内存管理
- C语言深入学习系列 - 字节对齐&内存管理
- GEOS库的学习之二:简单几何图形的创建