xml version="1.0" encoding="utf-8" standalone="yes"12bet++博客-eryarhttp://www.fometaux.com/eryar/zh-cnSat, 22 Jun 2019 21:15:41 GMTSat, 22 Jun 2019 21:15:41 GMT6012bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/06/15/RvmTranslator7_1.htmleryareryarSat, 15 Jun 2019 02:04:00 GMThttp://www.fometaux.com/eryar/archive/2019/06/15/RvmTranslator7_1.htmlhttp://www.fometaux.com/eryar/comments/216404.htmlhttp://www.fometaux.com/eryar/archive/2019/06/15/RvmTranslator7_1.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216404.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216404.html

RvmTranslator7.1

eryar@163.com

 

RvmTranslator can translate the RVM file exported by AVEVA Plant(PDMS)/AVEVA Marine to STEP, IGES, STL, DXF, 3D PDF, OBJ, 3DXML, IFC,.etc. So it can be used for exchanging model data between other CAD software, such as Autodesk AutoCAD, Plant3d, 3ds Max, CATIA, Solidworks, Pro/E, Unity3d, .etc.

RvmTranslator可以将AVEVA PDMS/Plant/Marine中导出的RVM文件进行可视化,以及将RVM转换成常见的三维文件格式。如STEPIGESSTLDXF, OBJ, 3DPDF, 3DXML, IFC等,便于与其他CAD系统进行数据交换,如Autodesk AutoCAD, Plant3d, 3ds Max, CATIA, Solidworks, Pro/E, Unity3d, Bentley等。

RvmTranslator7.1修复了设计树上中文显示问题:

下载RvmTranslator7.1: https://share.weiyun.com/5I8biQw

 


为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。
Shing Liu(eryar@163.com)


www.188bet.com 2019-06-15 10:04 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/06/03/LinePlaneInt.htmleryareryarMon, 03 Jun 2019 08:40:00 GMThttp://www.fometaux.com/eryar/archive/2019/06/03/LinePlaneInt.htmlhttp://www.fometaux.com/eryar/comments/216393.htmlhttp://www.fometaux.com/eryar/archive/2019/06/03/LinePlaneInt.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216393.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216393.htmlOpenCASCADE直线与平面求交

在《解析几何》相关的书中都给出了直线和平面的一般方程和参数方程。其中直线的一般方程有点向式形式的。

由于过空间一点可作且只能作一条直线平行于已知直线,所以当直线上一点(x0, y0, z0)和它的一方向向量(m,n,p)为已知时,直线就完全确定了。所以在OpenCASCADE中直线类gp_Lin有一个构造函数:

gp_Lin (const gp_Pnt &P, const gp_Dir &V) 即通过点和方向来构造直线。由直线的点向式方程容易导出直线的参数方程:

其中OpenCASCADE的直线是用参数方程来表示的。

同理对于平面而言,过空间一点可以作而且只能作一平面垂直于一已知直线,所以平面的一点(x0,y0,z0)和它的一个法线方向(A, B, C)为已知时,平面就完全确定了。所以平面方程也有点向式的:

从一个点和两个不共线的向量确定一个平面作为讨论的出发点,可以得出平面的参数方程:

 

如上图所示,已知一个点M0(x0,y0,z0),向量v1(x1,y1,z1)和向量v2(x2,y2,z2),我们来求点M0和向量V1V2确定的平面方程。点M(x,y,z)在平面上的充要条件是向量M0MV1, V2共面。因为向量V1, V2不平行,所以共面的充要条件是存在唯一的一对实数u, v使:

向量M0MV1V2共面的充要条件是:

根据平面的参数方程可知,要确定一个平面从参数方程的角度来看需要一个点和两个方向。从参数方程推导出一般方程的过程也是计算平面一般方程系数的方法。

根据直线的参数方程及平面的一般方程可以推导出直线与平面交点的计算公式,推导过程如下:

从上面的推导过程可以看出,计算直线与平面的交点主要就是计算参数t,当t求出后代入直线参数方程即可得到交点坐标。从参数t的计算公式可知,有个特殊情况就是分母为零的情况,此时是直线与平面平行共面需要特别处理。

OpenCASCADE中提供了直线与平面求交的计算类IntAna_IntConicQuad,其实现源码如下:

 

188bet www.188bet.com bwin 平博 unibet 明升 188bet uk Ladbrokes 德赢vwin 188bet m88.com w88 平博88 uedbet体育 188bet 188bet 威廉希尔 明升体育app 平博88 M88 Games vwin德赢 uedbet官网 bodog fun88 188bet
void IntAna_IntConicQuad::Perform (const gp_Lin& L, const gp_Pln& P,
                                   const Standard_Real Tolang,
                                   const Standard_Real Tol,
                                   const Standard_Real Len) {
  // Tolang represente la tolerance angulaire a partir de laquelle on considere
  // que l angle entre 2 vecteurs est nul. On raisonnera sur le cosinus de cet
  // angle, (on a Cos(t) equivalent a t au voisinage de Pi/2).
  
  done=Standard_False;
  Standard_Real A,B,C,D;
  Standard_Real Al,Bl,Cl;
  Standard_Real Dis,Direc;
  P.Coefficients(A,B,C,D);
  gp_Pnt Orig(L.Location());
  L.Direction().Coord(Al,Bl,Cl);
  Direc=A*Al+B*Bl+C*Cl;
  Dis = A*Orig.X() + B*Orig.Y() + C*Orig.Z() + D;
  //
  parallel=Standard_False;
  if (Abs(Direc) < Tolang) {
    parallel=Standard_True;
    if (Len!=0 && Direc!=0) {
      //check the distance from bounding point of the line to the plane
      gp_Pnt aP1, aP2;
      //
      aP1.SetCoord(Orig.X()-Dis*A, Orig.Y()-Dis*B, Orig.Z()-Dis*C);
      aP2.SetCoord(aP1.X()+Len*Al, aP1.Y()+Len*Bl, aP1.Z()+Len*Cl);
      if (P.Distance(aP2) > Tol) {
        parallel=Standard_False;
      } 
    }
  }
  if (parallel) {
    if (Abs(Dis) < Tolang) {
      inquadric=Standard_True;
    }
    else {
      inquadric=Standard_False;
    }
  }
  else {
    parallel=Standard_False;
    inquadric=Standard_False;
    nbpts = 1;
    paramonc [0] = - Dis/Direc;
    pnts[0].SetCoord(Orig.X()+paramonc[0]*Al,
                     Orig.Y()+paramonc[0]*Bl,
                     Orig.Z()+paramonc[0]*Cl);
  }
  done=Standard_True;
}

 

从上述代码中可以看出其计算思路也是先计算参数t,还加了一个特殊用法,即当参数Len!=0且参数t的分母!=0时重新判断直线与平面的平行状态。这个用法虽然有平行状态的重新判断,但是如果不平行没有计算交点的处理。所以使用这个函数时,参数Len可以用默认值0,即不用这段处理逻辑。还有个不严谨的地方是这里的实数判断没有用区间判断法。



www.188bet.com 2019-06-03 16:40 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/05/29/RvmTranslator_OBJ.htmleryareryarWed, 29 May 2019 13:04:00 GMThttp://www.fometaux.com/eryar/archive/2019/05/29/RvmTranslator_OBJ.htmlhttp://www.fometaux.com/eryar/comments/216387.htmlhttp://www.fometaux.com/eryar/archive/2019/05/29/RvmTranslator_OBJ.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216387.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216387.htmlRvmTranslator7.0-OBJ

eryar@163.com

 

RvmTranslator can translate the RVM file exported by AVEVA Plant(PDMS)/AVEVA Marine to STEP, IGES, STL, DXF, 3D PDF, OBJ, 3DXML, IFC,.etc. So it can be used for exchanging model data between other CAD software, such as Autodesk AutoCAD, Plant3d, 3ds Max, CATIA, Solidworks, Pro/E, Unity3d, .etc.

 

RvmTranslator可以将AVEVA PDMS/Plant/Marine中导出的RVM文件进行可视化,以及将RVM转换成常见的三维文件格式。如STEPIGESSTLDXF, OBJ, 3DPDF, 3DXML, IFC等,便于与其他CAD系统进行数据交换,如Autodesk AutoCAD, Plant3d, 3ds Max, CATIA, Solidworks, Pro/E, Unity3d, Bentley等。

OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的互导,也可以通过Maya读写。比如你在3dsMaxLightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过其中很多需要通过插件才能实现。RvmTranslator可以将PDMS模型转换成OBJ格式。

 

上图为RvmTranslator转换的工厂模型。

上图为RvmTranslator转换的船体模型。

 

Download RvmTranslator

 https://share.weiyun.com/5fcHSBC



www.188bet.com 2019-05-29 21:04 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/05/29/occ_license_faq.htmleryareryarWed, 29 May 2019 13:03:00 GMThttp://www.fometaux.com/eryar/archive/2019/05/29/occ_license_faq.htmlhttp://www.fometaux.com/eryar/comments/216386.htmlhttp://www.fometaux.com/eryar/archive/2019/05/29/occ_license_faq.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216386.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216386.htmlOpenCASCADE License FAQs

 

经常用人问我使用OpenCASCADE开发商业软件是否需要付费,下面从OpenCASCADE的官方网站上截取其回答翻译成中文,官方网址:https://www.opencascade.com/content/faqs 

 

翻译统一将Open CASCADE Technology简称为 OCCT

 

OCCT许可与GPL兼容吗?

是的,从版本6.7.0开始,OCCT是根据GNU LGPL版本2.1的条款(以及一些小的附加权限)发布的,因此它与GNU GPL版本2及更高版本完全兼容。

但是,OCCT版本6.6.0及更早版本是根据自定义许可证(OCCT Public License)发布的。 该许可在目的和意图方面类似于GNU LGPL,但与GNU GPL不兼容。

 

我可以使用OCCT根据GPLLGPL或其他许可(包括专有)分发我的软件产品吗?

是的你可以。 但是,您应始终确保最终产品许可证符合产品中使用的库的许可证要求。 从版本6.7.0开始,OCCT根据GNU LGPL版本2.1的条款(以及一些小的附加权限)发布,使用该库的软件产品的要求在LGPL文本的第6部分中描述。 如果您的最终产品的许可与其中使用的库的许可有任何冲突,您需要采取措施(例如,对此类最终产品许可进行适当的修改)以解决任何矛盾。

如果有疑问并避免可能的误解,请联系我们获取建议,我们很乐意回答您对此事可能有的任何疑问。

 

我可以使用Open CASCADE技术制作商业产品并进行销售吗? 如果是,是否有任何限制?

是的,您可以在商业应用程序中使用Open CASCADE技术(OCCT)库,而无需支付任何开发许可费或运行时费或版税。您的义务是要明确注意您的软件使用Open CASCADE技术(OPEN CASCADE公司的商标),在您的产品中提供OCCT许可证的副本,并遵循许可证本身的其他要求。 从版本6.7.0开始,此许可证是GNU LGPL版本2.1(具有一些小的附加权限)。另请注意,OCCT使用“系统要求”页面上列出的第三方组件。 第三方组件的使用受其相应许可证的约束。

 

 

如果我想发布自己使用OCCT的软件,我是否有义务重新分发整个安装包,或者我只能分发我需要的部分代码?

这样是允许的并期望您仅分发你的程序使用到的库和资源。

 

 

我对OCCT的使用是否会侵犯任何其他许可或专利?

您不需要任何特定的安排来使用OCCT开源分发中包含的任何算法。多年来,我们一直没有听说过客户或用户使用Open CASCADE技术的任何专利问题。

 

 

我是否有义务使用OCCT的时候开源应用程序的完整源代码?

不,你不是。 披露您的应用程序源代码的决定取决于您。



www.188bet.com 2019-05-29 21:03 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/05/29/ProjLib.htmleryareryarWed, 29 May 2019 13:02:00 GMThttp://www.fometaux.com/eryar/archive/2019/05/29/ProjLib.htmlhttp://www.fometaux.com/eryar/comments/216385.htmlhttp://www.fometaux.com/eryar/archive/2019/05/29/ProjLib.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216385.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216385.htmlOpenCASCADE点向平面投影

 

OpenCASCADEProjLib类提供了解析曲线(直线、圆、椭圆、抛物线、双曲线)向解析曲面(平面、圆柱面、圆锥面、球面、圆环面)投影的功能,主要用来计算三维曲线在二维参数空间的参数。

 

其中点向平面投影是最简单的情况,本文主要介绍点向平面投影的注意事项。ProjLib类是个工具类,因为其函数都是静态函数。点向平面投影很简单,直接用ProjLib::Project(aPlane, aPoint)即可。

 

其实现代码如下:

gp_Pnt2d  ProjLib::Project(const gp_Pln& Pl, const gp_Pnt& P)
{
  Standard_Real U, V;
  ElSLib::Parameters(Pl, P, U, V);
  return gp_Pnt2d(U,V);
}
inline void ElSLib::Parameters(const gp_Pln& Pl,
          const gp_Pnt& P,
          Standard_Real& U,
          Standard_Real& V) {
  ElSLib::PlaneParameters(Pl.Position(),P,U,V);
}
void ElSLib::PlaneParameters (const gp_Ax3& Pos,
         const gp_Pnt& P,
         Standard_Real& U,
         Standard_Real& V)
{
  gp_Trsf T;
  T.SetTransformation (Pos);
  gp_Pnt Ploc = P.Transformed (T);
  U = Ploc.X();
  V = Ploc.Y();
}

从上面的代码可以看出,点向平面投影实现就是将点变换到平面所在的坐标系中。使用这个类向平面投影要注意的事项是平面的构造。平面gp_Pln有如下构造函数:

 

默认构造函数:构造了一个XOY平面

基于一个坐标系gp_Ax3构造平面

基于一个点和一个方向构造平面

基于平面的系数方程,即AX+BY+CZ+D=0

前两个构造函数很清晰,而第三个构造函数即基于一个点和一个方向构造平面的方式没有明确,注释不清晰。这里的方向指定了平面的法向,但是还缺少一个方向来确定一个坐标系,所以使用这个构造函数来生成平面的时候,需要理解其生成另外一个方向的算法是不是自己需要的。

gp_Pln::gp_Pln (const gp_Pnt& P,
  const gp_Dir& V)
{
  Standard_Real A = V.X();
  Standard_Real B = V.Y();
  Standard_Real C = V.Z();
  Standard_Real Aabs = A;
  if (Aabs < 0) Aabs = - Aabs;
  Standard_Real Babs = B;
  if (Babs < 0) Babs = - Babs;
  Standard_Real Cabs = C;
  if (Cabs < 0) Cabs = - Cabs;
  //  pour determiner l'axe X :
  //  on dit que le produit scalaire Vx.V = 0. 
  //  et on recherche le max(A,B,C) pour faire la division.
  //  l'une des coordonnees du vecteur est nulle. 
  if( Babs <= Aabs && Babs <= Cabs) {
    if (Aabs > Cabs)  pos = gp_Ax3 (P, V, gp_Dir (-C,0., A));
    else              pos = gp_Ax3 (P, V, gp_Dir ( C,0.,-A));
  }
  else if( Aabs <= Babs && Aabs <= Cabs) {
    if (Babs > Cabs)  pos = gp_Ax3 (P, V, gp_Dir (0.,-C, B));
    else              pos = gp_Ax3 (P, V, gp_Dir (0., C,-B));
  }
  else {
    if (Aabs > Babs)  pos = gp_Ax3 (P, V, gp_Dir (-B, A,0.));
    else              pos = gp_Ax3 (P, V, gp_Dir ( B,-A,0.));
  }
}

当这里确定平面坐标系的方式与需要的不一致时,在使用投影算法的时候就会产生问题。



www.188bet.com 2019-05-29 21:02 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/04/18/compile_occ730_vs2008.htmleryareryarWed, 17 Apr 2019 23:17:00 GMThttp://www.fometaux.com/eryar/archive/2019/04/18/compile_occ730_vs2008.htmlhttp://www.fometaux.com/eryar/comments/216353.htmlhttp://www.fometaux.com/eryar/archive/2019/04/18/compile_occ730_vs2008.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216353.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216353.html

Compile OpenCASCADE7.3 with VS2008

eryar@163.com

 

1. 概述

OpenCASCADE的源码文件夹中有个adm文件夹,里面提供了各个平台中编译源码的项目文件。其中在Windows操作系统中使用微软的Visual Studiomsvc文件夹中提供了VS相应版本的项目文件。所以在使用批处理对OpenCASCADE源码进行编译的时候,会根据vc的版本来启动相应版本的visual studio。如果文件夹中没有对应的VS版本,就打不开相应的VS

 

在最新版本的OpenCASCADE7.3.0中,没有提供VS2008的项目文件。所以对于想将OpenCASCADE用于老的系统,如XP系统中时,或者主程序是用VS2008编译的,这时就需要将OpenCASCADEVS2008来编译了。

2. 生成VS项目

其实OpenCASCADEVS项目都是采用Tcl脚本生成的,而且生成的脚本里面还保留了对VS2008的支持。下面就介绍一下如何生成VS项目。在OpenCASCADE源码文件夹中有个批处理文件genproj.bat

 

由于这个批处理会调用Tcl文件中的命令,所以需要将Tcl加入到环境变量PATH中以便于运行Tcl脚本文件中的命令。如上图中

SET "PATH=%PATH%;D:\OpenCASCADE-7.3.0\tcltk-86-64\bin;"

就是将Tcl加入到PATH的一种方法,配置好这个就可以直接双击genproj.bat,运行截图如下:

 

根据genproj.bat中的注释可知genproj还可以带上参数,第一个参数是VS编译器的版本,第二个参数是操作系统。我们要生成Windows操作系统中VS2008的项目,所以输入参数:

genproj vc9 wnt

这样就生成了VS2008的项目了!

 


为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。
Shing Liu(eryar@163.com)


www.188bet.com 2019-04-18 07:17 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/04/08/wuhan_ocade_intro.htmleryareryarMon, 08 Apr 2019 03:34:00 GMThttp://www.fometaux.com/eryar/archive/2019/04/08/wuhan_ocade_intro.htmlhttp://www.fometaux.com/eryar/comments/216344.htmlhttp://www.fometaux.com/eryar/archive/2019/04/08/wuhan_ocade_intro.html#Feedback4http://www.fometaux.com/eryar/comments/commentRss/216344.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216344.html武汉欧凯德信息科技有限公司

武汉欧凯德信息科技有限公司取名来源于OpenCASCADE的音译,主要提供开源几何造型库OpenCASCADE相关的咨询、培训和定制开发服务。Open意为开放分享,正是因为分享,为他人创造价值才会有更多的回报。将会继续分享OpenCASCADE的一些技巧和实现原理,共同进步。

 

目前公司的产品有:

l RvmTranslator

RvmTranslator可以将AVEVA PDMS/Plant/Marine中导出的RVM文件进行可视化,以及将RVM转换成常见的三维文件格式。如STEPIGESSTLDXF, OBJ, 3DPDF, 3DXML, IFC等,便于与其他CAD系统进行数据交换,如Autodesk AutoCAD, Plant3d, 3ds Max, CATIA, Solidworks, Pro/E, Unity3d, Bentley等。

1 RvmTranslator程序界面

 

2 RvmTranslator转换的3DXML到达索系统

3 RvmTranslator转换的STEPCATIA

4 RvmTranslator 转换的IFC

 

l IsoAlgo

IsoAlgopiping Isometric drawing generation Algorithm的简称,意为管道轴测图出图算法。国际主流的管道轴测图出图程序ISOGEN是英国一家公司开发的,现被Intergraph收购,而Intergraph也在2010年被美国公司Hexagon收购。ISOGEN作为相对成熟的软件,也存在一些问题,如环管出图成折线,以及客户的一些定制化要求不能及时反馈等。IsoAlgo具有自主知识产权,全面兼容ISOGEN的输入,如管道数据文件PCFIDF,以及SKEY定义文件。IsoAlgo生成管道轴测图如下:






通过程序IsoAlgo3d方便地将PCF/IDF可视化,更便捷的显示出管道信息。以及基于IsoAlgo3d定制开发相关的焊点管理程序。

定制开发

随着国内版权意识的提高以及本地化的一些标准规范要求,考虑成本和效率,有越来越多的定制化开发服务。成功案例有:

v GIM建模

随着国家电网数字化三维设计的推广,提出了GIM三维设计标准,为了满足国网GIM工程数字化移交,为某公司定制开发了GIM建模功能:

v FORAN定制

FORAN是一款3D造船软件,FORAN软件由西班牙SENER集团开发,该公司以船舶设计起家,已有50年的历史,具有40多年的造船CAD软件开发和应用经验。目前在进行软件开发和应用的同时,仍然承接船舶设计项目。FORAN软件是世界上应用最为广泛的大型造船专业软件之一,全球用户包括了120家以上的设计公司和造船厂,近年来更以较快的速度在全球推广。

定制开发了全面支持FORAN几何宏及NORM参数化模型,方便直接访问FORAN的数据库,脱离FORAN环境进行三维可视化。

 

船舶管子零件图

船舶管子零件图也称小票图,零件图上除了图形及其标注外,还应包括管材规格、弯管数据、校管数据、表面处理、安装位置等信息。

 



www.188bet.com 2019-04-08 11:34 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/04/02/Pdms2Dialux.htmleryareryarTue, 02 Apr 2019 08:19:00 GMThttp://www.fometaux.com/eryar/archive/2019/04/02/Pdms2Dialux.htmlhttp://www.fometaux.com/eryar/comments/216327.htmlhttp://www.fometaux.com/eryar/archive/2019/04/02/Pdms2Dialux.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216327.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216327.htmlAVEVA PDMS to DIALux

eryar@163.com

  Abstract. DIAL develops DIALux - the world's leading software for planning, calculation and visualisation of indoor and outdoor lighting. With a community of over 700,000 users, the light planning tool is available in 25 languages and is free of charge for users. All renowned luminaire manufacturers offer digital product data for planning in DIALux. The software makes professional lighting design easier and accessible to everyone. As a platform and tool, it connects planners and manufacturers all over the world. DIALux is available as a desktop version and as a basic mobile app.

DIALux can import model by IFC, so use RvmTranslator to convert PDMS model to IFC format and imported by DIALux for lighting calculation.

Key Words. DIAlux, IFC, RvmTranslator

1. Introduction

首席灯光环境模拟与计算软件DIALux德国DIAL研发,能满足照明设计的所有需求:从标准化的室内、户外或街道的照明规划与计算,到专业的灯光设计、视觉立体化、能量评估,模拟效果接近真实,方便设计师验证各种特殊用法,导出报告,全方位协助设计师高效完成创作。

DIALux完全免费开放下载,有含中文在内的26种语言版本,在全球有100多万用户,在中国大陆有10万多名用户,用户主要包含照明设计师、建筑师、工程公司等,是全球领先的照明规划与计算软件。

 

PDMS主要用于工厂辅助设计,其中也会涉及到仪表、电气专业。通过使用RvmTranslator可以快速地将PDMS模型导入DIALux软件进行灯光照明设计。

2. PDMS to IFC

RvmTranslator7.0可以将PDMS模型转换成IFC格式,IFC主要用于BIM的数据交换,所以灯光设计软件DIALux为了方便导入其他软件创建的建筑模型,增加了IFC导入的功能。使用IFC导入功能,就可以导入PDMS的模型了。

上图为RvmTranslator转换的示例模型成IFC文件。

 

上图所示为导入RvmTranslator转换的IFC文件到DIALux.

3. Showcase

DIALux软件生成的光照效果很逼真,下面给出几个实际工厂的光照效果的例子:

 

 

4. Download

直接在搜索引擎中输入RvmTranslator7.0,即可以找到下载地址。



www.188bet.com 2019-04-02 16:19 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/03/30/gltf.htmleryareryarSat, 30 Mar 2019 13:47:00 GMThttp://www.fometaux.com/eryar/archive/2019/03/30/gltf.htmlhttp://www.fometaux.com/eryar/comments/216324.htmlhttp://www.fometaux.com/eryar/archive/2019/03/30/gltf.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216324.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216324.htmlGLTF简介

1.glTF(GL TransmissionFormat),即图形语言交换格式,它是一种3D内容的格式标准,由Khronos Group管理(Khronos Group还管理着OpenGL系列、OpenCL等重要的行业标准);

2.glTF的设计是面向实时渲染应用的,尽量提供可以直接传输给图形API的数据形式,不再需要二次转换;

3.glTF对OpenGL ES、WebGL非常友好;

4.glTF的目标是:3D领域的JPEG;

5.作为一个标准,自2015年10月发布(glTF 1.0)以来,已经得到了业界广泛的认可,你可以相信它的水平;

6.glTF目前最新版本为2.0已于2017年6月正式发布。

GLTF具体的数据存储格式可以去官方网站上看:https://www.khronos.org/gltf/,大概就是相对于XML的JSON存储方式。

 

文章关注的是GLTF给我们带来的便利——节约存储空间,减少带宽压力。

那么如何获得GLTF格式文件?

目前已经有了很多的转换工具:

 

其中Input代表输入模型的格式,输出为gltf格式。由于之前使用过Dae格式的文件(https://www.khronos.org/collada/),因此文章选取COLLADA2GLTF工具转换文件:

 

千万别纠结于工具源代码的编译,因为KhronosGroup已经给出了Release版本。这里说一些使用方法:

1.解压zip文件,在根目录新建dae文件夹——用于存放原始的dae文件

2.在根目录新建gltf文件夹——用于存放转换后的gltf文件

3.在根目录按住Ctrl+Shift+Alt+鼠标右键,打开PowerShell窗口

4.在命令行中输入:./collada2gltf-bin.exe input.dae output.gltf –i dae/input.dae –o gltf/output.gltf

其中input为dae文件的名称,output为输出gltf文件的名称。

5.Enter开始转换。

PS C:\Users\Ruby\Desktop\COLLADA2GLTF-v2.1.2-windows-Release-x64>./COLLADA2GLTF-bin.exe elf.dae elf.gltf -i dae/elf/elf.

dae -o gltf/elf.gltf

Convertingdae\elf\elf.dae -> gltf\elf.gltf

Time: 320 ms

原始dae文件包含4个jpg贴图一共2.46M,转换后为一个单独的gltf文件约1.38M(含贴图)。其实我很好奇那些贴图文件去哪儿了,于是打开了gltf文件查看,发现在image数组下已经把这些贴图文件用base 64编码,变成一堆机器码直接插在gltf文件中。

完成模型转换以后,利用ThreeJS的LoadGLTF API导入网页中浏览效果如下: 

如何在GLTF格式中捕获动画?

上述过程展示了从Collada到gltf的转换以及让gltf模型展示在网页上。下面将继续研究如何获取gltf模型的动画("Talk is cheap,show me the code"——哈哈哈) 

效果如图所示:

至此,gltf从模型到动画都run了一遍。

 

总结

GLTF格式号称3D图形界的JPEG,能够实现快速的模型数据交换。在2017年中旬更新的2.0版本克服了一些低版本的功能缺陷,使得自身功能得到发展;同时,gltf解析及转换Tool的快速发展,为GLTF的进一步推广做出了很多的贡献。文中也应证了,作为GLTF格式的用户,能够利用现有的工具对模型处理,减少模型的数据量,在WebGL的应用中在成倍地节省带宽的同时能够获取同质量的模型以及动画。

 

原文:https://cloud.tencent.com/developer/news/204942

 



www.188bet.com 2019-03-30 21:47 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/02/21/IntAna_Circle.htmleryareryarThu, 21 Feb 2019 14:05:00 GMThttp://www.fometaux.com/eryar/archive/2019/02/21/IntAna_Circle.htmlhttp://www.fometaux.com/eryar/comments/216252.htmlhttp://www.fometaux.com/eryar/archive/2019/02/21/IntAna_Circle.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216252.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216252.html解析几何求交之圆与二次曲面

eryar@163.com

 

Abstract. OpenCASCADE provides the analytic intersection between a conic and a quadric in the package IntAna.

Key Words. Analytic geometry, intersection, coninc, quadric

1. Introduction

OpenCASCADE中的包IntAna提供了解析几何曲线(二次曲线)与解析曲面(二次曲面)求交、解析曲面与解析曲面求交的功能。其中IntAna分别是Intersection Analytic的前三个字母缩写,表示解析几何求交。

我们学过了《线性代数》中的二次型,其中二次型在解析几何中的一个应用就是二次曲线和二次曲面方程的化简及其性质的分析。

本文主要结合源码分析圆与二次曲面求交的实现,其他二次曲线与二次曲面求交的可以依此类推。

2. Quadratic form

在解析几何中,为了便于研究二次曲线

的几何性质,我们可以选择适当的坐标旋转变换

把方程化成标准形式:

根据标准形式中的系数来分析这个二次曲线是什么曲线,即圆、椭圆、抛物线、双曲线。

OpenCASCADE中解析几何的二次曲面有以下几种类型:

l gp_Pln:平面可看作二次曲面的特例

l gp_Sphere:解析球面

l gp_Cylinder:解析柱面

l gp_Cone:解析锥面

这些解析曲面都可以统一使用二次多项式来表示,即这个二次多项式的系数确定了一个二次曲面。OpenCASCADE中相应的类是IntAna_Quaric

3. Math Trigonometric Function Roots

OpenCASCADE中类IntAna_IntConicQuad中提供了二次曲线与二次曲面求交功能,其中计算圆与二次曲面相交的函数是:

  //! Creates the intersection between a circle and a quadric.

  Standard_EXPORT IntAna_IntConicQuad(const gp_Circ& C, const IntAna_Quadric& Q);

其实现原码中注释如下:

 

根据其注释,可知其计算过程如下:将圆的方程在其局部坐标系中用参数形式表示,

将二次曲面方程的系数也变换到圆的坐标系中,因为圆的参数方程中为0,所以将圆的参数方程代入二次曲面的方程后,和z相关的项的系数都可以简化了。

得到一个三角函数的方程后,这时就要引入基础模块中的数学工具集来解决问题了。

math_TrigonometricFunctionRoots主要用于对如下形式的三角函数方程进行求解:

4. Conclusion

对于圆与二次曲面求交的实现来看,也可以不用变换二次曲面的坐标系,直接将圆的参数方程代入曲面的二次方程中:

最终化简也可得到一个三角函数方程,但是计算量与变换曲面坐标系对比来看会更大。

从上面的源码分析可知,在OpenCASCADE中对于解析曲线与曲面求交使用二次多项式系数来表示的。通过将二次曲线用参数形式的方程来表示,并代入二次曲面的方程,化简后直接使用math包中的工具(多项式方程求解和三角函数求解工具)对方程进行求解。

5. References

1. 同济大学应用数学系. 线性代数(第四版). 高等教育出版社

2. 丘维声. 解析几何. 北京大学出版社

 


为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。
Shing Liu(eryar@163.com)




www.188bet.com 2019-02-21 22:05 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/01/29/IntAna_IntConicQuad.htmleryareryarTue, 29 Jan 2019 14:06:00 GMThttp://www.fometaux.com/eryar/archive/2019/01/29/IntAna_IntConicQuad.htmlhttp://www.fometaux.com/eryar/comments/216225.htmlhttp://www.fometaux.com/eryar/archive/2019/01/29/IntAna_IntConicQuad.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216225.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216225.html解析几何求交之直线与二次曲面

eryar@163.com

 

Abstract. OpenCASCADE provides the analytic intersection between a conic and a quadric in the package IntAna.

Key Words. Analytic geometry, intersection, coninc, quadric 

1. Introduction

OpenCASCADE中的包IntAna提供了解析几何曲线(二次曲线)与解析曲面(二次曲面)求交、解析曲面与解析曲面求交的功能。其中IntAna分别是Intersection Analytic的前三个字母缩写,表示解析几何求交。

我们学过了《线性代数》中的二次型,其中二次型在解析几何中的一个应用就是二次曲线和二次曲面方程的化简及其性质的分析。

本文主要结合源码分析直线与二次曲面求解的实现来抛砖引玉,后期将二次曲线与二次曲面求交的各种情况做全面分析。

2. Quadratic form

在解析几何中,为了便于研究二次曲线

的几何性质,我们可以选择适当的坐标旋转变换

把方程化成标准形式:

根据标准形式中的系数来分析这个二次曲线是什么曲线,即圆、椭圆、抛物线、双曲线。

OpenCASCADE中解析几何的二次曲面有以下几种类型:

l gp_Pln:平面可看作二次曲面的特例

l gp_Sphere:解析球面

l gp_Cylinder:解析柱面

l gp_Cone:解析锥面

这些解析曲面都可以统一使用二次多项式来表示,即这个二次多项式的系数确定了一个二次曲面。OpenCASCADE中相应的类是IntAna_Quaric

 

 3. Math Direct Polynomial Roots

OpenCASCADE中类IntAna_IntConicQuad中提供了二次曲线与二次曲面求交功能,其中计算直线与二次曲面相交的函数是:

  //! Creates the intersection between a line and a quadric.

  Standard_EXPORT IntAna_IntConicQuad(const gp_Lin& L, const IntAna_Quadric& Q);

其实现原码中注释如下:

 

根据其注释,可知其计算过程如下:将直线方程用参数形式表示,

将参数表示的直线方程代入二次曲面方程,化简可得一个二次多项式,对二次多项式进行求解即得直线与二次曲面的交点。

得到一个二次多项式的方程后,这时就要引入基础模块中的数据工具集来解决问题了。

 

math_DirectPolynomialRoots可以用来对4次及以下的多项式方程进行求解。对于化简后的直线与二次曲面方程是一个二次多项式方程,则使用这个类直接进行求解。

4. Conclusion

从上面的源码分析可知,在OpenCASCADE中对于解析曲线与曲面求交使用二次多项式系数来表示的。通过将方程化简后直接使用math包中的工具对方程进行求解。

使用OpenCASCADE熟练会发现他们的编码风格也是有一定的套路的,即一个类会提供几个构造函数,将不同参数进行输入。有的在构造函数中调用初始化函数Init()来对算法需要的其他输入数据进行初始化,有的则直接在构造函数中调用的计算函数Perform()。如果构造函数中没有调用计算函数Perform(),则需要手动调用Perform()。算法的成功通过函数IsDone()来检测。根据检测判断是否取出计算值。

春节就要到了,祝大家在新的一年里心想事成,万事如意!

5. References

1. 同济大学应用数学系. 线性代数(第四版). 高等教育出版社

2. 丘维声. 解析几何. 北京大学出版社



www.188bet.com 2019-01-29 22:06 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/01/19/RvmTranslator70_IFC.htmleryareryarSat, 19 Jan 2019 06:11:00 GMThttp://www.fometaux.com/eryar/archive/2019/01/19/RvmTranslator70_IFC.htmlhttp://www.fometaux.com/eryar/comments/216214.htmlhttp://www.fometaux.com/eryar/archive/2019/01/19/RvmTranslator70_IFC.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216214.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216214.htmlRvmTranslator7.0-IFC

eryar@163.com

 

RvmTranslator can translate the RVM file exported by AVEVA Plant(PDMS)/AVEVA Marine to STEP, IGES, STL, DXF, 3D PDF, OBJ, 3DXML, IFC,.etc. So it can be used for exchanging model data between other CAD software, such as Autodesk AutoCAD, Plant3d, 3ds Max, CATIA, Solidworks, Pro/E, Unity3d, .etc.

I am pleased to announce a new release of RvmTranslator7.0.

RvmTranslatoer7.0 is a major release, which includes the following new features: translate PDMS rvm to IFC file.

RvmTranslator可以将AVEVA PDMS/Plant/Marine中导出的RVM文件进行可视化,以及将RVM转换成常见的三维文件格式。如STEPIGESSTLDXF, OBJ, 3DPDF, 3DXML, IFC等,便于与其他CAD系统进行数据交换,如Autodesk AutoCAD, Plant3d, 3ds Max, CATIA, Solidworks, Pro/E, Unity3d, Bentley等。

RvmTranslator7.0增加了一个新的文件转换IFCIFC目前是国际通用的BIM标准,现在很多BIM软件都采用其作为数据交换的标准。为了使PDMS中的模型可以导入BIM软件,开发了此功能。程序转换了PDMS中几何模型及树形结构。 

 

 

IFC(IndustryFoundationClasses)

 IFC是由国际协同工作联盟IAI(InternationalAllianceForInteroperability)应用面向对象技术所建立的信息标准。IAI的发展起源于19948月,由美国12家公司以AutoCAD13ARX系统为基础,研究不同应用软件在协同工作的可能性,结果发觉不但可行更有可观的经济效益。于1995年克服了核心的问题后,发表了简称IFC的信息交换格式,199510月,他们在北美成立IAI组织。并发现这已是全球工业的问题,随后他们将此思想推广到其他国家,很快的其他国家也相继成立了IAI分部。并在1996年于伦敦召开了第一次的IAI国际会议。目前成员涵盖24个国家及8个附属或注册的团体,如澳洲、法国、德国、日本、韩国、北欧、新加坡及英国等,其组成单位共计131个,包含建筑业主、承包商、政府官员、学术单位、资产管理、软件厂商、建设公司等。

IAI主要目标为提供AECFM厂商,获得相同单一建筑信息的沟通模型(SingleBuildingInformationModel,BIM)IAI认为BIM能有效减少成本及提高效率,故称为buildingSMART(以聪明的方式建筑)IAI希望把所有的建筑信息透过一套标准将其整合在一起,像是把门、墙等实际对象以及一些空间、结构过程等抽象概念以电子信息方式有系统的呈现出来。这些信息让各种不同软件的间可以互相传递与分享,例如美语是国际间的共同语言一般,IFC便是一种由共同语言,在建筑生命周期中扮演共享智能对象的角色。

IFC是一种开放性质信息格式,作为信息的交换以及共享使用,在技术上采用BIM概念及面向对象等来进行信息内容的处理,目的在于让在此领域内BIM系统的各种不同应用软件,因IFC信息格式的标准化及一致性,而有一个信息交换的标准格式可以遵循,使不同软体间的信息可相互交换,毋须再各自建立信息,避免信息传递时发生错漏造成财务和时间上的损失,国际间各大软件公司(例AutodeskBentleyGraphisoftTEKLANECFujitsu等),都已陆续开发以BIM概念结合IFC标准的软件。 

Download RvmTrnaslator

https://yun.baidu.com/pcloud/album/info?uk=3808749571&album_id=3634993082542187183



www.188bet.com 2019-01-19 14:11 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/01/17/std_string_crash.htmleryareryarThu, 17 Jan 2019 13:50:00 GMThttp://www.fometaux.com/eryar/archive/2019/01/17/std_string_crash.htmlhttp://www.fometaux.com/eryar/comments/216209.htmlhttp://www.fometaux.com/eryar/archive/2019/01/17/std_string_crash.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216209.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216209.html今天在Qt中开发程序时,遇到一个QString::toStdString()的内存问题,用法如下:

void test(const QString& theFileName)
{
    std::string aFileName = theFileName.toStdString();
    std::ofstream aFile(aFileName);
    aFile << aFileName;
}

在函数还没执行完就崩溃了,跟踪发现是std::string的问题。最后发现是因为引用的库的Runtime Library不同导致的,一个是MDd,一个是MTd,后来改成一致即可。



www.188bet.com 2019-01-17 21:50 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/01/15/Consolas.htmleryareryarTue, 15 Jan 2019 08:53:00 GMThttp://www.fometaux.com/eryar/archive/2019/01/15/Consolas.htmlhttp://www.fometaux.com/eryar/comments/216204.htmlhttp://www.fometaux.com/eryar/archive/2019/01/15/Consolas.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216204.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216204.html

概述

这套字型使用了微软的ClearType 字型平滑技术,并随同Windows Vista、Office 2007及Microsoft Visual Studio中发行,或可在微软的网站下载。在Windows Vista的6套新字型中,Consolas近似于前版Windows中 的2款内建字型:Lucida Console与Courier New,主要为程序代码的显示字型而设计的,特别之处是它的“0”字加入了一斜撇,以方便与字母“O”分辨。 在Consolas之前,程序代码的显示字型大多为Courier New或其他等宽字型,字型的柔边(反锯齿)效果则依个人喜好选择开启或关闭,然而Consolas是专为柔边效果而设计的字型,特别是为了搭配微软的ClearType技术,如果不开启ClearType,Consolas的显示效果会打大折扣。另外,ClearType技术还需要搭配液晶显示器才会有最佳表现。

应用

传统上,程式编写员在Windows环境底下,一般都会使用Courier New或其他近似的等宽字体来显示程序代码。通常用来编写程序代码的程序都会让编程员选择用来显示程序代码的字体。由于Courier New的字型比较肥大,使每个画面或页面所能显示的程序代码大为减少。Consolas除了能够在较少的空间显示更多的内容,它的清晰字型亦使编程员能够更快捷的分辨每一个文字。

这个字体用来编码很清晰,舒服,主要是数字0和字母0可以容易的区别出来,这里做个备忘,方便在编码环境中设置这个字体。

www.188bet.com 2019-01-15 16:53 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2019/01/06/BRepMesh.htmleryareryarSun, 06 Jan 2019 02:49:00 GMThttp://www.fometaux.com/eryar/archive/2019/01/06/BRepMesh.htmlhttp://www.fometaux.com/eryar/comments/216169.htmlhttp://www.fometaux.com/eryar/archive/2019/01/06/BRepMesh.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216169.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216169.html

Mesh BRep Shapes

eryar@163.com

Abstract. 当对OpenCASCADEBRep表示法的数据结构有了一定的理解后,建议可以自己实现一个显示数据生成的功能,即网格剖分功能。

Key Words. BRep, Mesh, Triangulation

1. Introduction

OpenCASCADE中网格剖分功能是很重要的一个模块,他可用于生成模型的可视化数据,还可用于HLR消隐,对于离散求交算法也是基于网格数据。OpenCASCADE开源版本中的模块TKMesh可以用来生成网格的显示数据,主要的类为BRepMesh_IncrementalMesh

在使用BRepMesh_IncrementalMesh的过程中发现其剖分精度高,且精度不便于控制。如对一个球进行网格剖分,想得到一个粗糙的效果,即一个多边形,使用BRepMesh_IncrementalMesh是不容易得到的。

如上图所示为同一个球的不同的剖分精度得到的模型。为了能精确控制网格剖分精度,以便后期使用LOD等优化算法,自己实现一个网格剖分功能。

网格剖分的主要思路就是遍历每个TopoDS_FaceTopoDS_Wire,根据Wire找到边界或面上的孔洞。将Wire对应到二维参数空间,并对二维参数空间中的边界先进行一次三角网格剖分。对于平面来说,只需要这一步就可以满足可视化的要求。对于其他曲面来说,就需要在二维参数空间中额外插入一些点,以使最终生成的网格满足剖分精度要求。最后将二维参数空间的三角剖分映射到三维空间。

2. Mesh Boundary Region

因为使用BRepBuilderAPI_MakeFace可以通过Add(TopoDS_Wire)来添加面上的开孔,所以一个TopoDS_Face会有大于1个的TopoDS_Wire。找出外边界和内孔Wire后可进行一次三角剖分,如下图所示:

 

如上图所示,对于平面而言,直接对边界及内孔进行一次三角剖分即可以得到满意的网格数据。对于曲面而言,这显然是不满足精度要求的。

 

如上图所示为球面的第一次对边界进行三角剖分得到的效果。因为在一个参数上的边是退化Degenerated边,所以退化边的参数空间上没有均分。将参数空间的三角剖分映射到三维空间后,得到的是一条线,其实是两个非退化边。

 

3. Deflection Control

对于曲面来说,如果直对边界进行一次三角剖分,是达不到精度要求。为了使曲面网格剖分效果更好,就需要对按边界剖分后的网格进行插入点继续剖分。对于上面球面的参数空间区域,根据精度要求插入点剖分后的结果如下图所示:

 

得到的三维效果如下图所示:

 

4. Demo

下面给出几个自己实现网格剖分的结果与OpenCASCADETKMesh作个对比:

 

上图为自己实现网格剖分算法对椭球面的网格剖分结果

 

上图为TKMesh网格剖分算法对椭球面的网格剖分结果

 

上图为自己实现网格剖分算法对椭圆环面的网格剖分结果

 

上图为TKMesh网格剖分算法对椭圆环面的网格剖分结果

通过上面的对比可以发现,在大致相同的显示效果情况下,OpenCASCADE产生了更多的顶点和三角形数据。自己实现的网格剖分产生的网格质量相对可控且性能高。 

5. Conclusion

OpenCASCADE中开源的网格剖分库TKMesh可以实现模型的可视化数据生成功能,但是对于网格剖分的精度可控性差。为了对模型的网格精度进行更好地控制,自己实现一套网格剖分功能,且性能要优于TKMesh。在程序的编写过程中,可以加深BREP数据结构中一些概念的理解。有兴趣的读者在熟悉BREP数据结构后,也可以尝试下网格剖分功能的实现。


为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。
Shing Liu(eryar@163.com)


www.188bet.com 2019-01-06 10:49 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2018/12/31/IncementalMesh.htmleryareryarMon, 31 Dec 2018 14:45:00 GMThttp://www.fometaux.com/eryar/archive/2018/12/31/IncementalMesh.htmlhttp://www.fometaux.com/eryar/comments/216159.htmlhttp://www.fometaux.com/eryar/archive/2018/12/31/IncementalMesh.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216159.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216159.htmlOpenCASCADE Incremental Mesh

eryar@163.com

 

Abstract. OpenCASCADE IncrementalMesh is used to build the mesh of a shape with respect of their correctly triangulated parts. The blog focus on the deflection control of the algorithm.

 

Key Words. Mesh, Visualization

 

1. Introduction

Mesh是生成三维模型显示数据的关键算法。OpenCASCADETKMesh提供了网格剖分算法,用于生成BREP体的显示数据。原来的一些文章对网格剖分的算法及其用法进行过说明,本文主要对网格剖分的核心部分进行深入挖掘,理解其剖分精度控制原理。感兴趣的读者可以结合源码,学习其实现方法。当理解其算法原理后,也可以自己实现一套结合实际需求的高性能网格剖分库。

网格剖分的主要流程如下:

 

遍历TopoDS_ShapeTopoDS_Face,对于每个TopoDS_Face,遍历其TopoDS_Wire,对于每个TopoDS_Wire遍历其TopoDS_Edge,在根据EdgeFace得到PCurve。因为TopoDS_Wire是闭合的,所以WirePCurve是在参数空间闭合区域。对PCurve围成的参数区域进行三角剖分,将三角剖分的结果映射到三维空间,最终生成每个Face的网格剖分。这个流程很好理解,但是如何对网格剖分的质量进行控制呢?即用相对少的三角网格来更好地表示三维模型呢?

 

2. Mesh Deflection Control

OpenCASCADEBRep体进行三角剖分网格化的类是BRepMesh_IncrementalMesh,此类有两个主要的选项来控制三角网格化:线性偏差Linear deflection和角度偏差Angular deflection

三角网格剖分第一步是将所有的边Edge进行离散,即根据一定的精度生成多段线;

 

线性偏差限制离散的多段线与曲线之间的距离;角度偏差限制每段线段端部切线的夹角。

第二步是对面进行三角剖分。线性偏差也限制离散的三角形中点到曲线的距离。

 

应用程序应该提供适当的偏差参数以达到生成满意的三角网格。角度偏差Angular deflection比较简单且允许使用一个默认值(12~20度)。线性偏差Linear deflection有绝对的含义,需要由程序来给定正确的值。给一个很小的线性偏差值会导致网格剖分过密,消耗大量内存及影响显示效率;但是值太大得到的网格效果就是显示失真。所以对于LOD的网格来说,需要根据模型尺寸来设置相应的线性偏差值。

上面对网格剖分的参数设置进行了介绍,下面对网格剖分的实现原理进行说明。因为曲线曲面是三维的,而对曲面进行剖分的底层三角剖功能是个二维三角剖分库,所以网格剖分总的思路是对曲线在二维参数空间进行剖分,将参数空间剖分的结果通过曲面参数方程映射回到三维空间。通过对pcurve围成的参数空间闭合区域进行二维三角剖分,即可对三维曲面进行剖分。类BRepMesh_FastDiscretFace是对每个TopoDS_Face进行离散,其中函数control()是用来控制生成网格的质量的。

 

最多迭代次数是11次。在每一次迭代过程中,检查生成的所有三角形在参数空间中心点处与曲面的距离是否满足线性偏差,如果不满足,则插入新的点以便下次迭代。

 

从上面的代码可以看出其实现思路与其类名Incremental还是很贴切的,即增量法。

 

 

3. Conclusion

OpenCASCADE的网格剖分中网格质量控制是相对重要的核心功能。在理解其原理后,可以自己实现一个更清晰的网格剖分库。

 

2018年就过结束了,这一年收获颇丰,其中最大的收获就是有了自己的小宝宝。

 

分享创建价值。虽然OpenCASCADE不是完美的,但是她是目前世界上唯一一款功能相对完善的开放的几何造型库。OpenCASCADE的开放分享,给她带来生机。当他人因为我的blog的分享的文章或代码联系我时,他们的一声感谢,我都会觉得很高兴。

 

2019年马上就要到来,希望大家在新的一年里,创造、创新,突破自我,更上一层楼!


为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。
Shing Liu(eryar@163.com)


www.188bet.com 2018-12-31 22:45 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2018/12/09/RVM2CATIA.htmleryareryarSun, 09 Dec 2018 08:35:00 GMThttp://www.fometaux.com/eryar/archive/2018/12/09/RVM2CATIA.htmlhttp://www.fometaux.com/eryar/comments/216114.htmlhttp://www.fometaux.com/eryar/archive/2018/12/09/RVM2CATIA.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216114.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216114.htmlRvmTranslator6.6 - RVM to CATIA

eryar@163.com

 

RvmTranslator can translate the RVM file exported by AVEVA Plant(PDMS)/AVEVA Marine to STEP, IGES, STL, DXF, 3D PDF, OBJ, 3DXML, .etc. So it can be used for exchanging model data between other CAD software, such as Autodesk AutoCAD, Plant3d, 3ds Max, CATIA, Solidworks, Pro/E, Unity3d, .etc.

I am pleased to announce a new release of RvmTranslator6.6.

 

RvmTranslatoer6.6 is a minor release, which includes the following new features:

 

RvmTranslator可以将AVEVA PDMS/Plant/Marine中导出的RVM文件进行可视化,以及将RVM转换成常见的三维文件格式。如STEPIGESSTLDXF, OBJ, 3DPDF, 3DXML等,便于与其他CAD系统进行数据交换,如Autodesk AutoCAD, Plant3d, 3ds Max, CATIA, Solidworks, Pro/E, Unity3d, Bentley等。

 

RvmTranslator6.6主要增加导出带设计结构的STEP文件,此文件在导入CATIA后的结构与模型与PDMS中一致,如下图所示:

 

Download RvmTranslator

https://yun.baidu.com/pcloud/album/info?uk=3808749571&album_id=3634993082542187183

  



www.188bet.com 2018-12-09 16:35 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2018/11/26/PipeCAD_PipeStd2.htmleryareryarMon, 26 Nov 2018 14:08:00 GMThttp://www.fometaux.com/eryar/archive/2018/11/26/PipeCAD_PipeStd2.htmlhttp://www.fometaux.com/eryar/comments/216082.htmlhttp://www.fometaux.com/eryar/archive/2018/11/26/PipeCAD_PipeStd2.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216082.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216082.htmlPipeCAD之管道标准库PipeStd(2)

eryar@163.com

 

Key Words. PipeCAD, PipeStd, 管道设计软件,管件库

 

1. Introduction

管道标准部件库程序PipeStd的主要用法与PDMSParagon模块类似,主要也是采用参数化的方式来表示管件。每种类型的管件Category包含三个集合:参数集Parameter Set、点集Point Set和形集Geometry Set。本文主要来介绍如何创建一个参数化的标准管件。如下图所示为一带颈对焊法兰Weld Neck Flange的参数化管件:

1 法兰参数化模型

 

2. Category

类型Category是一类管件数据的集合,如90度弯头、闸阀等。创建类型的时候会自动创建其三个必须的集合:参数集、点集和形集,如下图所示:

2 创建Category

 

3. Parameter Set

参数集合Parameter Set用来定义该种类型的管件需要输入哪些参数,即管件标准中定义的数据。

3 带颈对焊法兰尺寸数据表格

上图来于:http://www.wermac.org/flanges/dimensions_welding-neck-flanges_asme-b16-5.html

ASME B16.5标准中定义的尺寸数据。其中每个尺寸,如AD等都可以看作为这里参数集中的一个参数。

4 参数集定义

每一个参数可以对应一个尺寸,在上图4所示的左边定义好参数集后,在右边的列表中可以为每个管径的管件输入相应的尺寸数据。

 

4. Point Set

点集Point Set主要用来定义管件的连接点或一些辅助定义位点。如下图所示:

5 点集定义

每个点需要定义一个编号,对于点的编号也有约定。如对于普通的管件,编号12表示管件的两端。对于三通其支管要用编号3等。这些约定是为了后面生成轴测图的要求。点的位置PXPYPZ及方向DXDYDZ都是可以用前面定义的参数表示。如某个值要用参数1,就写成$PA1。或者还可以用数学表达式,如:$PA1 + 2 * cos($PA2)等。

 

5. Geometry Set

形集Geometry Set主要来定义管件的几何形状。使用一些基本形状,如长方体,圆柱体、圆台体等来构造管件外形。每种基本体都是用参数表示,如下图所示为圆柱体的参数:

6 参数化基本体

对于圆柱体,需要确定其轴向PAXI,高度PHEI及直径(PDIA)等。对于数据值型的参数都是可以使用数学表达式来表示。这样可以使不同的管径对应不同的形状。

7 DN10DN80的法兰

 

6. Conclusion

综上所述,通过定义参数集、点集和形集来实现标准管件的参数化。通过统一的方式,对任意标准管件进行参数化处理。这样程序操作方式统一,使用简单。对于一些特殊管件,也可以通过这种方式来建模,灵活自由。不像有的软件是将管件类型通过硬编码的方式写在程序中,如果要增加程序中没有的管件类型,只有改程序的不便。

管件标准库程序PipeStd的管件定义基本成型,下一步实现管道等级Piping Specification功能。管道等级的作用主要用于筛选过滤,方便材料控制。考虑到后面生成ISO轴测图的功能,因为每种管件都会有SKEY,而这些SKEY已经分好类型了。所以管道等级的处理也尽量简化,直接根据SKEY来分大的类型及小类,如法兰的大类为Flange,小类里面根据SKEY来筛选,FLWNFLSO等。



www.188bet.com 2018-11-26 22:08 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2018/11/25/PipeCAD_PipeStd.htmleryareryarSun, 25 Nov 2018 14:27:00 GMThttp://www.fometaux.com/eryar/archive/2018/11/25/PipeCAD_PipeStd.htmlhttp://www.fometaux.com/eryar/comments/216080.htmlhttp://www.fometaux.com/eryar/archive/2018/11/25/PipeCAD_PipeStd.html#Feedback2http://www.fometaux.com/eryar/comments/commentRss/216080.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216080.htmlPipeCAD之管道标准库PipeStd

eryar@163.com

 

Key Words. PipeCAD, PipeStd, 管道设计软件,管件库

 

1. Introduction

前不久,两位老友徐总和毛总在上海浦东金桥的一茶一坐小聚,回想到几年前我们仨在那里聚会的情景。他们分别在A公司和I公司,我当时在做SPD的开发。在一起聊的话题也是关于设计软件的,当时也有一些思想碰撞的火花,想着做出一个什么软件,成为CEO,迎娶白富美,走上人生顶峰。结果几年过去,当年吹过的牛B,没有实现。其中有一个就是做一个管道标准库程序,方便管件的定义。定义好之后,可以导入AVEVA PDMSIntergraph SmartPlant

看着国内工厂/船舶设计软件如PDSOFTUESOFTPDMAX还有船舶设计软件SPD都不温不火,而且国外的AVEVA PDMS/Marine, Intergraph SmartPlant已经占据了国内市场,有时我也在想开发一个原来梦想的管道设计软件的意义和价值。

AVEVA PDMS/Marine我觉得是简单易用的软件,一致的操作方式,基于CSG的造型算法,还提供了二次开发语言PMLC#来对程序进行灵活扩展。基于文件的层次数据库,并提供了数据库的增、删、改及数据回退功能,可以用于大中型项目设计。由于很容易得到和谐版,所以用户很多。

Intergraph SmartPlant是美国的一款软件,由于其价格昂贵,在国内的用户都是不差钱的单位。由于没有使用过,所以对其不便于评价。但是由于国内外有业主会指定这款软件,所以国际上用户也很多。

再看国内的工厂/船舶设计系统PDSOFTUESOFTPDMAXSPD等,都是基于AutoCAD开发的。早期基于AutoCAD,因为AutoCAD比较普及,所以会吸引一些会AutoCAD的用户。但是基于AutoCAD开发程序弊端之一是AutoCAD版本升级,程序要想适应AutoCAD,也必须跟着升级。弊端二是AutoCAD的提供的开发库ObjectARX, .NET等都不是开源的,如果是那些库出现BUG或是不支持的功能,要么去和Autodesk公司沟通,要么只有绕道了。有的使用ObjectARX12bet库开发,虽然程序性能好,还在使用MFCGUI,但是开发效率低。弊端之三是有些功能与AutoCAD的功能纠缠不清,用户体验不太友好。

为了实现几年前的梦想,我决定开发一个管道设计软件PipeCAD

 

2. PipeCAD

PipeCAD的一个定位就是适用于中小型项目的管道设计软件。因为大型项目的用户一般都是用PDMSSmartPlant

使用开源库OpenCASCADE来进行三维图形开发,使用开源库Qt来进行GUI开发,提高程序开发效率。因为使用开源技术,出现BUG可以从根据上解决。不依赖其他闭源的软件,不会有其他软件升级带来的影响。

业务核心功能都自己实现,程序自主可控,方便增加新功能。

 

PipeCAD的初步开发以下功能模块:

管件库等级库管理程序PipeStd

三维设计模块PipeCAD

管道轴测图出图模块IsoAlgo

 

3. PipeStd

PipeStd主要用来对管件标准数据、管道等级等数据进行管理。有了管件数据,就可以对管件进行三维显示。有了管道等级,就可以在三维设计模块来使用管件来对管道进行建模。PipeStd的使用方式与PDMSParagon模块类似,通过参数化的方式来定义管件。目前程序的主要功能已经实现,程序界面如下图所示:

其中还设想的功能有:

导入、导出PDMS中的管件及管道等级Piping Specification数据;

导入、导出SmartPlant中的管件及管道等级Piping Specification数据;

 

4. Conclusion

两位友人的提醒,决定开发一个三维管道设计软件PipeCAD。为中小型项目的管道设计提供了一个选择。核心功能都自己实现,程序自主可控。不依赖其他软件,如AutoCAD,提供良好的用户体验。

 



www.188bet.com 2018-11-25 22:27 发表评论
]]>
12bet++博客-eryarhttp://www.fometaux.com/eryar/archive/2018/11/22/BerkeleyDb.htmleryareryarThu, 22 Nov 2018 01:57:00 GMThttp://www.fometaux.com/eryar/archive/2018/11/22/BerkeleyDb.htmlhttp://www.fometaux.com/eryar/comments/216074.htmlhttp://www.fometaux.com/eryar/archive/2018/11/22/BerkeleyDb.html#Feedback0http://www.fometaux.com/eryar/comments/commentRss/216074.htmlhttp://www.fometaux.com/eryar/services/trackbacks/216074.html

原文地址:https://www.ibm.com/developerworks/cn/linux/l-embdb/index.html

前言

UNIX/LINUX平台下的数据库种类非常多,参考资料1中列举了其中的大部分。通常,我们在设计UNIX/LINUX平台下的应用软件时,如果数据种类繁多,数据与数据之间关系比较复杂,就会选用一些大型的企业级数据库系统,如DB2,ORACLE、SYBASE等,如果软件规模不大,就倾向选用如MYSQL、POSTGRESQL等中小型数据库。例如使用PHP/PERL + MYSQL/POSTGRESQL设计网站基本上是一个很常规的做法。但是,当应用软件管理的数据类型较少(特别注意:这并不是说需要管理的数据量小),数据管理本身不复杂,且对数据操作要求高效率,则由大名鼎鼎的Berkeley(美国加州大学伯克利分校)开发的 Berkeley DB可能是一个很明智的选择。

DB综述

DB最初开发的目的是以新的HASH访问算法来代替旧的hsearch函数和大量的dbm实现(如AT&T的dbm,Berkeley的ndbm,GNU项目的gdbm),DB的第一个发行版在1991年出现,当时还包含了B+树数据访问算法。在1992年,BSD UNIX第4.4发行版中包含了DB1.85版。基本上认为这是DB的第一个正式版。在1996年中期,Sleepycat软件公司成立,提供对DB的商业支持。在这以后,DB得到了广泛的应用,当前最新版本是4.3.27。

DB支持几乎所有的现代操作系统,如LINUX、UNIX、WINDOWS等,也提供了丰富的应用程序接口,支持C、12bet、JAVA、PERL、TCL、PYTHON、PHP等。DB的应用十分广泛,在很多知名的软件中都能看到其身影。例如参考资料2中作者谈到利用DB在LINUX下实现内核级文件系统;参考资料3中通过实际测试数据说明DB提高了OPENLDAP的效率。LINUX下的软件包管理器RPM也使用DB管理软件包相关数据,可以使用命令file查看RPM数据目录/var/lib/rpm下的文件,则有形式如下的输出:

Dirnames: Berkeley DB (Btree, version 9, native byte-order)
Filemd5s: Berkeley DB (Hash, version 8, native byte-order)

值得注意的是DB是嵌入式数据库系统,而不是常见的关系/对象型数据库,对SQL语言不支持,也不提供数据库常见的高级功能,如存储过程,触发器等。

DB的设计思想

DB的设计思想是简单、小巧、可靠、高性能。如果说一些主流数据库系统是大而全的话,那么DB就可称为小而精。DB提供了一系列应用程序接口(API),调用本身很简单,应用程序和DB所提供的库在一起编译成为可执行程序。这种方式从两方面极大提高了DB的效率。第一:DB库和应用程序运行在同一个地址空间,没有客户端程序和数据库服务器之间昂贵的网络通讯开销,也没有本地主机进程之间的通讯;第二:不需要对SQL代码解码,对数据的访问直截了当。

DB对需要管理的数据看法很简单,DB数据库包含若干条记录,每一个记录由关键字和数据(KEY/VALUE)构成。数据可以是简单的数据类型,也可以是复杂的数据类型,例如C语言中结构。DB对数据类型不做任何解释, 完全由程序员自行处理,典型的C语言指针的"自由"风格。如果把记录看成一个有n个字段的表,那么第1个字段为表的主键,第2--n个字段对应了其它数据。DB应用程序通常使用多个DB数据库,从某种意义上看,也就是关系数据库中的多个表。DB库非常紧凑,不超过500K,但可以管理大至256T的数据量。

DB的设计充分体现了UNIX的基于工具的哲学,即若干简单工具的组合可以实现强大的功能。DB的每一个基础功能模块都被设计为独立的,也即意味着其使用领域并不局限于DB本身。例如加锁子系统可以用于非DB应用程序的通用操作,内存共享缓冲池子系统可以用于在内存中基于页面的文件缓冲。

DB核心数据结构

数据库句柄结构DB:包含了若干描述数据库属性的参数,如数据库访问方法类型、逻辑页面大小、数据库名称等;同时,DB结构中包含了大量的数据库处理函数指针,大多数形式为 (*dosomething)(DB *, arg1, arg2, …)。其中最重要的有open,close,put,get等函数。

数据库记录结构DBT:DB中的记录由关键字和数据构成,关键字和数据都用结构DBT表示。实际上完全可以把关键字看成特殊的数据。结构中最重要的两个字段是 void * data和u_int32_t size,分别对应数据本身和数据的长度。

数据库游标结构DBC:游标(cursor)是数据库应用中常见概念,其本质上就是一个关于特定记录的遍历器。注意到DB支持多重记录(duplicate records),即多条记录有相同关键字,在对多重记录的处理中,使用游标是最容易的方式。

数据库环境句柄结构DB_ENV:环境在DB中属于高级特性,本质上看,环境是多个数据库的包装器。当一个或多个数据库在环境中打开后,环境可以为这些数据库提供多种子系统服务,例如多线/进程处理支持、事务处理支持、高性能支持、日志恢复支持等。

DB中核心数据结构在使用前都要初始化,随后可以调用结构中的函数(指针)完成各种操作,最后必须关闭数据结构。从设计思想的层面上看,这种设计方法是利用面向过程语言实现面对对象编程的一个典范。

DB数据访问算法

在数据库领域中,数据访问算法对应了数据在硬盘上的存储格式和操作方法。在编写应用程序时,选择合适的算法可能会在运算速度上提高1个甚至多个数量级。大多数数据库都选用B+树算法,DB也不例外,同时还支持HASH算法、Recno算法和Queue算法。接下来,我们将讨论这些算法的特点以及如何根据需要存储数据的特点进行选择。

B+树算法:B+树是一个平衡树,关键字有序存储,并且其结构能随数据的插入和删除进行动态调整。为了代码的简单,DB没有实现对关键字的前缀码压缩。B+树支持对数据查询、插入、删除的常数级速度。关键字可以为任意的数据结构。

HASH算法:DB中实际使用的是扩展线性HASH算法(extended linear hashing),可以根据HASH表的增长进行适当的调整。关键字可以为任意的数据结构。

Recno算法: 要求每一个记录都有一个逻辑纪录号,逻辑纪录号由算法本身生成。实际上,这和关系型数据库中逻辑主键通常定义为int AUTO型是同一个概念。Recho建立在B+树算法之上,提供了一个存储有序数据的接口。记录的长度可以为定长或不定长。

Queue算法:和Recno方式接近, 只不过记录的长度为定长。数据以定长记录方式存储在队列中,插入操作把记录插入到队列的尾部,相比之下插入速度是最快的。

对算法的选择首先要看关键字的类型,如果为复杂类型,则只能选择B+树或HASH算法,如果关键字为逻辑记录号,则应该选择Recno或Queue算法。当工作集关键字有序时,B+树算法比较合适;如果工作集比较大且基本上关键字为随机分布时,选择HASH算法。Queue算法只能存储定长的记录,在高的并发处理情况下,Queue算法效率较高;如果是其它情况,则选择Recno算法,Recno算法把数据存储为平面文件格式。

DB常用函数使用范例

#include <db.h> 
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
/* DB的函数执行完成后,返回0代表成功,否则失败 */
void print_error(int ret)
{
    if(ret != 0)
        printf("ERROR: %s\n",db_strerror(ret));
}
/* 数据结构DBT在使用前,应首先初始化,否则编译可通过但运行时报参数错误  */
void init_DBT(DBT * key, DBT * data)
{
    memset(key, 0, sizeof(DBT));
    memset(data, 0, sizeof(DBT));
}
void main(void)
{
    DB *dbp;           
    DBT key, data;
    u_int32_t flags;  
    int ret;
    char *fruit = "apple";
    int number = 15;
     
    typedef struct customer
    {
        int  c_id;
        char name[10];
        char address[20];
        int  age;
    } CUSTOMER;
    CUSTOMER cust; 
    int key_cust_c_id = 1;
    cust.c_id = 1;
    strncpy(cust.name, "javer", 9);
    strncpy(cust.address, "chengdu", 19);
    cust.age = 32;
    /* 首先创建数据库句柄 */
    ret = db_create(&dbp, NULL, 0);
    print_error(ret);
     
    /* 创建数据库标志 */
    flags = DB_CREATE;    
    /* 创建一个名为single.db的数据库,使用B+树访问算法,本段代码演示对简单数据类型的处理 */
    ret = dbp->open(dbp, NULL, "single.db", NULL, DB_BTREE, flags, 0); 
    print_error(ret);
    init_DBT(&key, &data);
     
    /* 分别对关键字和数据赋值和规定长度 */
    key.data = fruit;
    key.size = strlen(fruit) + 1;
    data.data = &number;
    data.size = sizeof(int);
    /* 把记录写入数据库中,不允许覆盖关键字相同的记录 */
    ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE); 
    print_error(ret);
     
/* 手动把缓存中的数据刷新到硬盘文件中,实际上在关闭数据库时,数据会被自动刷新 */
dbp->sync();
     
init_DBT(&key, &data);
    key.data = fruit;
    key.size = strlen(fruit) + 1;
     
    /* 从数据库中查询关键字为apple的记录 */
    ret = dbp->get(dbp, NULL, &key, &data, 0);
    print_error(ret);
    /* 特别要注意数据结构DBT的字段data为void *型,所以在对data赋值和取值时,要做必要的类型转换。 */
    printf("The number = %d\n", *(int*)(data.data));
     
    if(dbp != NULL)
            dbp->close(dbp, 0); 
    ret = db_create(&dbp, NULL, 0);
    print_error(ret);
    flags = DB_CREATE;    
    /* 创建一个名为complex.db的数据库,使用HASH访问算法,本段代码演示对复杂数据结构的处理 */
    ret = dbp->open(dbp, NULL, "complex.db", NULL, DB_HASH, flags, 0); 
    print_error(ret);
    init_DBT(&key, &data);
    key.size = sizeof(int);
    key.data = &(cust.c_id);
    data.size = sizeof(CUSTOMER);
    data.data = &cust;
    ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE);
    print_error(ret);
     
    memset(&cust, 0, sizeof(CUSTOMER));
     
    key.size = sizeof(int);
    key.data = &key_cust_c_id;
    data.data = &cust;
    data.ulen = sizeof(CUSTOMER); 
    data.flags = DB_DBT_USERMEM;
    dbp->get(dbp, NULL, &key, &data, 0);
    print_error(ret);
     
    printf("c_id = %d name = %s address = %s age = %d\n", 
        cust.c_id, cust.name, cust.address, cust.age);
     
    if(dbp != NULL)
            dbp->close(dbp, 0); 
}

DB游标使用范例

游标是依赖于数据库句柄的,应用程序代码框架如下:

1
2
3
4
5
6
7
8
9
10
/* 定义一个游标变量 */
DBC * cur;
/* 首先打开数据库,再打开游标 */
dbp->open(dbp, ……);
dbp->cursor(dbp, NULL, &cur, 0);
 
/* do something with cursor */
/* 首先关闭,在关闭数据库 */
cur->c_close(cur);
dbp->close(dbp, 0);

在游标打开后,可以以多种方式遍历特定记录。

1
2
3
4
5
6
7
    Memset(&key, 0, sizeof(DBT));
Memset(&data, 0, sizeof(DBT));
/* 因为KEY和DATA为空,则游标遍历整个数据库记录 */
While((ret = cur->c_get(cur, &key, &data, DB_NEXT)) == 0)
{
    /* do something with key and data */
}

当想查询特定关键字对应的记录,则应对关键字赋值,并把cur->c_get()函数中标志位设置为DB_SET。例如:

1
2
3
4
5
6
    key.data = "xxxxx";
key.size =  XXX;
While((ret = cur->c_get(cur, &key, &data, DB_SET)) == 0)
{
    /* do something with key and data */
}

游标的作用还有很多,如查询多重记录,插入/修改/删除记录等。

DB环境使用范例

本文前面已说明环境是DB数据库的包装器,提供多种高级功能。应用程序代码框架如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* 定义一个环境变量,并创建 */
  DB_ENV *dbenv;
  db_env_create(&dbenv, 0);
   
/* 在环境打开之前,可调用形式为dbenv->set_XXX()的若干函数设置环境 */
  /* 通知DB使用Rijndael加密算法(参考资料>)对数据进行处理 */
dbenv->set_encrypt(dbenv, "encrypt_string", DB_ENCRYPT_AES);
  /* 设置DB的缓存为5M */
dbenv->set_cachesize(dbenv, 0, 5 * 1024 * 1024, 0);
/* 设置DB查找数据库文件的目录 */
  dbenv->set_data_dir(dbenv, "/usr/javer/work_db");
  /* 打开数据库环境,注意后四个标志分别指示DB启动日志、加锁、缓存、事务处理子系统 */
  dbenv->open(dbenv,home,DB_CREATE|DB_INIT_LOG|DB_INIT_LOCK| DB_INIT_MPOOL
                |DB_INIT_TXN, 0);
   
  /* 在环境打开后,则可以打开若干个数据库,所有数据库的处理都在环境的控制和保护中。
注意db_create函数的第二个参数是环境变量 */
db_create(&dbp1, dbenv, 0);
dbp1->open(dbp1, ……);
db_create(&dbp2, dbenv, 0);
dbp1->open(dbp2, ……);
  /* do something with the database */
  /* 最后首先关闭打开的数据库,再关闭环境 */
  dbp2->close(dbp2, 0);
  dbp1->close(dbp1, 0);
  dbenv->close(dbenv, 0);

DB软件的安装和编译

从DB的官方站点http://www.sleepycat.com/下载最新的软件包db-4.3.27.tar.gz,解压到工作目录,进入该目录,依次执行下列三条命令即可。

1
2
3
../dist/configure
make
make install

执行make uninstall,则可卸载已安装的DB软件。

DB缺省把库和头文件安装在目录/usr/local/BerkeleyDB.4.3/下,使用gcc test.c -ggdb -I/usr/local/BerkeleyDB.4.3/include/ -L/usr/local/BerkeleyDB.4.3/lib/ -ldb -lpthread就可正确编译程序。如果读者的测试主机操作系统为RED HAT9,则安装的DB版本可能是4.0。特别要注意到这两个版本的库是不兼容的。例如打开数据库函数DB->open(),在4.0版本中入参为6个,而在4.3版中则为7个(可自行比较两个库的头文件db.h中DB->open函数的定义)。因为在DB相关的应用程序中,open函数基本上都是要执行的,所以如果函数和版本不匹配,编译肯定会出错。当然,编译完成后,可以使用命令ldd查看库的依赖关系。

总结

DB是一个具有工业强度的嵌入式数据库系统,数据处理的效率很高。DB功能的稳定性历经时间的考验,在大量应用程序中使用便是明证。可以想见,在同等代码质量的条件下,软件的BUG数和代码的长度是成正比的,相对几十兆、几百兆大型数据库软件,DB的只有不到500K的大小!

从实现功能上看,DB是轻量级数据库系统,或可称为"极" 轻量级数据库系统。但是,我认为不能因此而心存轻视之意,所谓"尺有所短,寸有所长",以绝对角度比较工具之间的好坏是没有什么意义的,关键在于对工具的选择和运用(似乎可以参考一下极限编程的思想)。也许,正确的"表达范式"应该是:在当前应用背景下,选择这种工具是最合适的。



www.188bet.com 2018-11-22 09:57 发表评论
]]>