Topology and Geometry in OpenCascade-Adapters

eryar@163.com

摘要Abstract:本文简要介绍了适配器模式(adapter pattern),并结合程序实例对OpenCascade中的拓朴与几何的适配器的使用进行说明。

关键字Key Words:OpenCascade、BRep、Topology、Geometry、Adapter

一、适配器模式简介 Introduction of Adapter pattern

类对象结构型模式适配器模式(Adapter):

意图(Intent):将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

别名(Also Known As):包装器Wrapper

动机(Motivation):有时,为复用而设计的工具箱类不能够被复用的原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配。

适用性(Applicability),以下情况使用Adapter模式:

l 你想使用一个已经存在的类,而它的接口不符合你的需求;

l 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作;

l (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口;

结构(Structure):

类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图所示:

Figure 1.1 Class adapter structure

对象适配器依赖于对象组合,如下图所示:

Figure 1.2 Object adapter structure

协作(Collaborations):Client在Adapter实例上调用一些操作,接着适配器调用Adaptee的操作实现这个请求。

关于适配器模式(Adapter pattern)更多信息,请参考GoF的经典之作《Design Patterns-Elements of Reuseable Object-Oriented Software》。

二、适配器模式在OpenCascade中的应用

一些OpenCascade的算法可以操作表示曲线的对象,然而他们提供的API接受Adaptor3d_Curve而不接受Geom_Curve。例如,包Extrema(用来计算点、线、面之间的距离)可用来计算几何曲线(Geom_Curve)和拓朴边(TopoDS_Edge)的求交、投影和其他一些算法。其他的例子有计算长度,面积等。这种方法称为适配器模式(Adapter pattern)。

Figure 1.3 Adaptor3d_Curve class diagram

从上面的类图可以看出,GeomAdaptor3d_Curve是Adaptor3d_Curve的子类,该类用来适配Geom_Curve类型,BRepAdaptor_Curve用于适配TopoDS_Edge类型。BRepAdaptor_CompCurve用于适配TopoDS_Wire。对于二维曲线和曲面也有类似功能的类。通过适配器使不同的曲线(几何曲线和拓朴边)在一起工作,如下代码所示,计算几何曲线和拓朴边长度的方式统一了:

/*
* Copyright (c) 2013 eryar All Rights Reserved.
*
* File : Main.cpp
* Author : eryar@163.com
* Date : 2013-09-27
* Version : 1.0v
*
* Description : GeomAdaptor: provides an interface between the services provided by any curve.
* BRepAdaptor: provides classes to access the geometry of the BRep models.
*/
#define WNT
#include <gp_Circ.hxx>
#include <Geom_Circle.hxx>
#include <GeomAdaptor_Curve.hxx>
#include <TopoDS_Edge.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <GCPnts_AbscissaPoint.hxx> #pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKGeomBase.lib")
#pragma comment(lib, "TKTopAlgo.lib") int main(void)
{
Handle_Geom_Curve aCurve = new Geom_Circle(gp::XOY(), 1.0);
Standard_Real dCurveLength = GCPnts_AbscissaPoint::Length(GeomAdaptor_Curve(aCurve)); TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(gp_Circ(gp::XOY(), 1.0));
Standard_Real dEdgeLength = GCPnts_AbscissaPoint::Length(BRepAdaptor_Curve(anEdge)); std::cout << "Circle curve length: " << dCurveLength << std::endl;
std::cout << "Circle edge length: " << dEdgeLength << std::endl; return ;
}

程序结果如下所示:

Circle curve length: 6.28319
Circle edge length: 6.28319
Press any key to continue . . .

三、结论 Conclusion

应用适配器模式使OpenCascade中接口不兼容的类如几何曲线(Geom_Curve)与拓朴边(TopoDS_Edge)可以在一起工作了,如求交计算、投影计算、长度计算等等。

四、参考资料 Bibliography

1. GoF, Design Patterns-Elements of Reuseable Object-Oriented Software

2. Roman Lygin, OpenCascade notes, opencascade.blogspot.com

Topology and Geometry in OpenCascade-Adapters的更多相关文章

  1. Topology and Geometry in OpenCascade-Edge

    Topology and Geometry in OpenCascade-Edge eryar@163.com 摘要Abstract:本文简要介绍了几何造型中的边界表示法(BRep),并结合程序说明O ...

  2. Topology and Geometry in OpenCascade-Face

    Topology and Geometry in OpenCascade-Face eryar@163.com 摘要Abstract:本文简要介绍了几何造型中的边界表示法(BRep),并结合程序说明O ...

  3. Topology and Geometry in OpenCascade-Topology

    Topology and Geometry in OpenCascade-Topology eryar@163.com 摘要Abstract:本文简要介绍了几何造型中的边界表示法(BRep),并结合程 ...

  4. Topology and Geometry in OpenCascade-Vertex

    Topology and Geometry in OpenCascade-Vertex eryar@163.com 摘要Abstract:本文简要介绍了几何造型中的边界表示法(BRep),并结合程序说 ...

  5. Topology Shapes of OpenCascade BRep

    Topology Shapes of OpenCascade BRep eryar@163.com 摘要Abstract:通过对OpenCascade中的BRep数据的读写,理解边界表示法的概念及实现 ...

  6. Geometry Surface of OpenCascade BRep

    Geometry Surface of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲面是参数表示的曲面 ,在边界表示中其数据存在于BRep_TFace中, ...

  7. Geometry Curve of OpenCascade BRep

    Geometry Curve of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲线是参数表示的曲线 ,在边界表示中其数据存在于BRep_TEdge中,BR ...

  8. OpenCASCADE PCurve of Topological Face

    OpenCASCADE PCurve of Topological Face eryar@163.com Abstract. OpenCASCADE provides a class BRepBuil ...

  9. OpenCASCADE BRepTools

    OpenCASCADE BRepTools eryar@163.com Abstract. OpenCASCADE BRepTools provides utilities for BRep data ...

随机推荐

  1. Python框架之Tornado(三)请求

    概述 本篇就来详细介绍tornado服务器(socket服务端)是如何接收用户请求数据以及如果根据用户请求的URL处理并返回数据,也就是上图的3 系列所有步骤,如上图[start]是一个死循环,其中利 ...

  2. Avoiding InvokeRequired

    Just read a good article to do cross-thread calling in an easy and elegant way. It is amazing for it ...

  3. spring静态代理

    一.代理概念 为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代.代理类负责请求的预处理.过滤.将请求分派给委托类 ...

  4. php清理服务器无效软链接(源码)

    <?php /** * @desc 递归删除当前目录下的无效软连接 * @author mengdj<mengdj@outlook.com> 2014.10.03 1118 */ / ...

  5. 输入/输出系统的四种不同工作方式对CPU利用率比较

    程序控制工作方式:输入/输出完全由CPU控制,整个I/O过程中CPU必须等待其完成,因此对CPU的能力限制很大,利用率较低 程序中断工作方式:CPU不再定期查询I/O系统状态,而是当需要I/O处理时再 ...

  6. 简单的jquery选项卡效果

    html部分 <ul class="tab"> <li>最新</li> <li class="cur">热门&l ...

  7. Unity3D上可以发布到IOS使用的SQLite数据库

    地址:https://github.com/codecoding/SQLite4Unity3d Unity5.1.1f 发布,在IOS 8.3上亲测可用,Android好像有点问题. 也可用参考下这个 ...

  8. unity3D学习—坦克大战(一)

    背景介绍 本人一名C#程序员,从事C#开发已经有四年有余了,目前在一家大型公司上班.鉴于公司的业务需要,现在需要学习unity3D游戏开发,好在unity支持C#脚本开发,无形中省下了许多重新学习新语 ...

  9. css确定元素水平居中和垂直居中

    ---恢复内容开始--- 首先,我们在了解如何通过css了解元素水平和垂直居中之前,先要了解下html都有哪些元素,这些元素与偶有哪些分类,因为不同类别的元素的水平垂直居中方法是完全不同的,究其根本当 ...

  10. 通过html和css做出下拉导航栏的效果

    通过观察了百度的首页,对于更多产品一栏,觉得可以不涉及JS便可写出下拉导航栏的效果 1.先设计出大体的框架 <div class="nav"> <ul> & ...