青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

OpenNURBS to OpenCASCADE

Posted on 2014-11-01 10:17 eryar 閱讀(5460) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenNURBS to OpenCASCADE

eryar@163.com

Abstract. The OpenNURBS initiative provides CAD/CAM/CAE and computer graphics software developers the tools to accurately transfer 3D geometry between applications. The OpenNURBS C++ source code is clean and fairly simple. The OpenNURBS Toolkit is intended for use by C++ and .NET programmers. The toolkit includes complete source code to create a library that will read and write 3dm files. OpenCASCADE providing services for 3D surface and solid modeling, CAD data exchange, and visulization. Most of OCCT functionality is available in the form of C++ libraries. If can convert OpenNURBS curve/surface to OpenCASCADE, then it will fill the gap of data exchange between OpenNURBS and OpenCASCADE.

Key Words. OpenCASCADE, OpenNURBS, NURBS, 3DM, DataExchange

1. Introduction

OpenNURBS 旨在為CAD、CAM、CAE與計算機(jī)圖形軟件開發(fā)人員提供一個在不同的軟件間精確轉(zhuǎn)換 3D 幾何的工具。OpenNURBS 所提供的功能包括:

v 可以讀、寫3DM文件格式的C ++原代碼庫,支持目前的 Microsoft、Apple與 Gnu for Windows、Windows X64、Mac與Linux編繹器...

v 可以讀、寫3DM文件格式的.NET 源代碼庫。

v 品質(zhì)保證與版本控制。

v 技術(shù)支持。

與其他開源產(chǎn)品的開發(fā)平臺不同之處:

v 鼓勵使用在商業(yè)用途。

v 提供免費(fèi)的開發(fā)工具與技術(shù)支持。

v 無任何約束,不受版權(quán)與公共版權(quán)(copyleft )條款約束。

v 鼓勵但不強(qiáng)迫用戶分享自己的研發(fā)成果。

NURBS是當(dāng)前流行幾何造型系統(tǒng)中通用的曲線曲面表達(dá)形式,OpenNURBS開源庫提供了NURBS曲線曲面的數(shù)據(jù)表達(dá),但缺少一些造型算法,而OpenCASCADE中提供了大量的造型算法。通過將OpenNURBS中的曲線曲面轉(zhuǎn)換到OpenCASCADE中,就可以將OpenNURBS和OpenCASCADE結(jié)合起來使用了。

OpenNURBS中的代碼簡潔,易懂;OpenCASCADE的造型功能強(qiáng)大。所以先將OpenNURBS中的曲線曲面轉(zhuǎn)換到OpenCASCADE中,為OpenCASCADE的3DM格式的數(shù)據(jù)交換打下基礎(chǔ)。

2.Convert OpenNURBS Curve 

OpenNURBS中統(tǒng)一使用NURBS方式來表達(dá)曲線和曲面。OpenCASCADE中對應(yīng)NURBS曲線的類為Geom_BSplineCurve。因此,可以將OpenNURBS的曲線轉(zhuǎn)換到OpenCASCADE中。轉(zhuǎn)換時需要注意節(jié)點(diǎn)矢量Knot Vector的方式有很大的不同。OpenNURBS中的節(jié)點(diǎn)矢量是所有的節(jié)點(diǎn)值,包括了重節(jié)點(diǎn),而且在節(jié)點(diǎn)矢量的首尾還少了兩個節(jié)點(diǎn)。OpenCASCADE中的節(jié)點(diǎn)矢量由不包含重復(fù)節(jié)點(diǎn)的節(jié)點(diǎn)矢量及其重數(shù)來構(gòu)造。其它數(shù)據(jù)基本相同,將轉(zhuǎn)換曲線的示例代碼列出如下:

 

/**
* @breif Convert OpenNURBS NURBS curve to OpenCASCADE Geom_BSplineCurve.
* @param [in] theCurve opennurbs nurbs curve;
* @param [in] theBRepFile the curve is in brep file of opencascade;
* @note pay attention to the knots of opennurbs nurbs curve/surface.
*/
void ConvertCurve(const ON_NurbsCurve& theCurve, const std::string& theBRepFile)
{
    TColgp_Array1OfPnt aPoles(
1, theCurve.CVCount());
    TColStd_Array1OfReal aWeights(
1, theCurve.CVCount());

    TColStd_Array1OfReal aKnotSequence(
1, theCurve.KnotCount() + 2);

    
bool IsRational = theCurve.IsRational();
    
bool IsPeriodic = (theCurve.IsPeriodic()) ? truefalse;

    
// Control point and its weight.
    for (int i = 0; i < theCurve.CVCount(); ++i)
    {
        
if (IsRational)
        {
            ON_4dPoint aPole;

            theCurve.GetCV(i, aPole);

            aPoles.SetValue(i 
+ 1, gp_Pnt(aPole.x / aPole.w, aPole.y / aPole.w, aPole.z / aPole.w));
            aWeights.SetValue(i 
+ 1, aPole.w);
        }
        
else
        {
            ON_3dPoint aPole;

            theCurve.GetCV(i, aPole);

            aPoles.SetValue(i 
+ 1, gp_Pnt(aPole.x, aPole.y, aPole.z));
        }
    }

    
// Knot vector and its multiplicity.
    for (int i = 0; i < theCurve.KnotCount(); ++i)
    {
        aKnotSequence.SetValue(i 
+ 2, theCurve.Knot(i));
    }

    aKnotSequence.SetValue(aKnotSequence.Lower(), theCurve.Knot(
0));
    aKnotSequence.SetValue(aKnotSequence.Upper(), theCurve.Knot(theCurve.KnotCount() 
- 1));

    TColStd_Array1OfReal aKnots(
1, BSplCLib::KnotsLength(aKnotSequence, IsPeriodic));
    TColStd_Array1OfInteger aMultiplicities(
1, aKnots.Upper());

    BSplCLib::Knots(aKnotSequence, aKnots, aMultiplicities);

    Handle_Geom_BSplineCurve aBSplineCurve 
= new Geom_BSplineCurve(
        aPoles, aWeights, aKnots, aMultiplicities,
        theCurve.Degree(), theCurve.IsPeriodic());

    GeomTools_CurveSet::PrintCurve(aBSplineCurve, std::cout);

    TopoDS_Edge anEdge 
= BRepBuilderAPI_MakeEdge(aBSplineCurve);
    
    BRepTools::Write(anEdge, theBRepFile.c_str());
}

程序先轉(zhuǎn)換控制頂點(diǎn),若是有理曲線,還要設(shè)置控制頂點(diǎn)的權(quán)值w。在轉(zhuǎn)換節(jié)點(diǎn)矢量時,使用了BSplCLib::Knots()函數(shù)將OpenNURBS的節(jié)點(diǎn)矢量轉(zhuǎn)換為OpenCASCADE的形式,并補(bǔ)齊了缺少的端部的兩個節(jié)點(diǎn)。最后為了在OpenCASCADE中顯示轉(zhuǎn)換結(jié)果,將曲線生成TopoDS_Edge并保存為BRep格式,方便在Draw Test Harness中查看結(jié)果如下圖所示:

wps_clip_image-11344

Figure 2.1 OpenNURBS nurbs circle in OpenCASCADE Draw Test Harness

3.Convert OpenNURBS Surface

OpenNURBS曲面的轉(zhuǎn)換同樣也需要注意u, v方向上的節(jié)點(diǎn)矢量的問題,和曲線的轉(zhuǎn)換類似。除此之外就是把相同的屬性分別賦值即可,列出代碼如下所示:

 

/**
* @breif Convert OpenNURBS NURBS surface to OpenCASCADE Geom_BSplineSurface.
* @param [in] theSurface opennurbs nurbs surface;
* @param [in] theBRepFile the surface is in the brep file of opencascade;
* @note pay attention to the knots of opennurbs nurbs curve/surface.
*/
void ConvertSurface(const ON_NurbsSurface& theSurface, const std::string& theBRepFile)
{
    TColgp_Array2OfPnt aPoles(
1, theSurface.CVCount(0), 1, theSurface.CVCount(1));
    TColStd_Array2OfReal aWeights(
1, theSurface.CVCount(0), 1, theSurface.CVCount(1));

    TColStd_Array1OfReal aUKnotSequence(
1, theSurface.KnotCount(0+ 2);
    TColStd_Array1OfReal aVKnotSequence(
1, theSurface.KnotCount(1+ 2);

    
bool IsRational = theSurface.IsRational();
    
bool IsUPeriodic = (theSurface.IsPeriodic(0)) ? truefalse;
    
bool IsVPeriodic = (theSurface.IsPeriodic(1)) ? truefalse;

    
// control point and its weight.
    for (int i = 0; i < theSurface.CVCount(0); ++i)
    {
        
for (int j = 0; j < theSurface.CVCount(1); ++j)
        {
            
if (IsRational)
            {
                ON_4dPoint aPole;

                theSurface.GetCV(i, j, aPole);

                aPoles.SetValue(i 
+ 1, j + 1, gp_Pnt(aPole.x / aPole.w, aPole.y / aPole.w, aPole.z / aPole.w));
                aWeights.SetValue(i 
+ 1, j + 1, aPole.w);
            }
            
else
            {
                ON_3dPoint aPole;

                theSurface.GetCV(i, j, aPole);

                aPoles.SetValue(i 
+ 1, j + 1, gp_Pnt(aPole.x, aPole.y, aPole.z));
            }
            
        }
    }

    
// Knot vector and its multiplicity.
    for (int i = 0; i < theSurface.KnotCount(0); ++i)
    {
        aUKnotSequence.SetValue(i 
+ 2, theSurface.Knot(0, i));
    }

    aUKnotSequence.SetValue(aUKnotSequence.Lower(), theSurface.Knot(
00));
    aUKnotSequence.SetValue(aUKnotSequence.Upper(), theSurface.Knot(
0, theSurface.KnotCount(0- 1));

    TColStd_Array1OfReal aUKnots(
1, BSplCLib::KnotsLength(aUKnotSequence, IsUPeriodic));
    TColStd_Array1OfInteger aUMults(
1, aUKnots.Upper());

    BSplCLib::Knots(aUKnotSequence, aUKnots, aUMults);

    
for (int j = 0; j < theSurface.KnotCount(1); ++j)
    {
        aVKnotSequence.SetValue(j 
+ 2, theSurface.Knot(1, j));
    }

    aVKnotSequence.SetValue(aVKnotSequence.Lower(), theSurface.Knot(
10));
    aVKnotSequence.SetValue(aVKnotSequence.Upper(), theSurface.Knot(
1, theSurface.KnotCount(1- 1));

    TColStd_Array1OfReal aVKnots(
1, BSplCLib::KnotsLength(aVKnotSequence, IsVPeriodic));
    TColStd_Array1OfInteger aVMults(
1, aVKnots.Upper());

    BSplCLib::Knots(aVKnotSequence, aVKnots, aVMults);

    Handle_Geom_BSplineSurface aBSplineSurface 
= new Geom_BSplineSurface(aPoles,
        aWeights, aUKnots, aVKnots, aUMults, aVMults,
        theSurface.Degree(
0), theSurface.Degree(1),
        IsUPeriodic, IsVPeriodic);

    GeomTools_SurfaceSet::PrintSurface(aBSplineSurface, std::cout);

  TopoDS_Face aFace 
= BRepBuilderAPI_MakeFace(aBSplineSurface, Precision::Confusion());
  
    BRepTools::Write(aFace, theBRepFile.c_str());
}

轉(zhuǎn)換過程與曲線的類似,只是多了v方向上的處理。以上兩個函數(shù)分別實現(xiàn)曲線曲面的轉(zhuǎn)換,完整程序可以在本文后面的鏈接中下載。以圓柱面和球面為例,測試了一下轉(zhuǎn)換效果,在Draw Test Harness中顯示結(jié)果如下圖所示:

wps_clip_image-7205

Figure 3.1 OpenNURBS nurbs sphere in OpenCASCADE Draw Test Harness

wps_clip_image-6073

Figure 3.2 OpenNURBS nurbs cylinder in OpenCASCADE Draw Test Harness

由上圖可知,OpenCASCADE中的Geom_BSplineCurve/Geom_BSplineSurface可以完美表示OpenNURBS中的曲線曲面,不過有最高次數(shù)為25次的限制。

4.Conclusion

現(xiàn)可看出,OpenNURBS中的曲線曲面可以轉(zhuǎn)換成OpenCASCADE中。不過在轉(zhuǎn)換時需要注意OpenNURBS的節(jié)點(diǎn)矢量數(shù)據(jù)與教科書中及OpenCASCADE中不同,需要做些處理。還有需要注意的事項就是OpenNURBS中數(shù)組是從0開始的,而在OpenCASCADE中可以指定為從1開始。

將OpenNURBS的曲線曲面轉(zhuǎn)換成OpenCASCADE的曲線曲面后,下一步準(zhǔn)備將OpenNURBS中的BRep體也轉(zhuǎn)換到OpenCASCADE中,從而對BRep表示形式做進(jìn)一步的學(xué)習(xí)。

5. References

1. OpenNURBS Web: http://www.rhino3d.com/opennurbs

2. Les Piegl, Wayne Tiller. The NURBS Book. Springer-Verlag. 1997

3. 趙罡,穆國旺,王拉柱譯. 非均勻有理B樣條. 清華大學(xué)出版社. 2010

 

PDF Version and Code: OpenNURBS to OpenCASCADE

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产主播一区| 一本大道久久精品懂色aⅴ| 在线中文字幕不卡| 一区二区高清视频| 国产精品欧美激情| 欧美大色视频| 国产精品久久久一区二区三区| 久久久精品国产99久久精品芒果| 亚洲国产成人av在线| 亚洲天堂成人在线视频| 亚洲第一在线视频| 亚洲线精品一区二区三区八戒| 尤物在线精品| 亚洲欧美电影在线观看| 日韩网站在线| 久久精品一区蜜桃臀影院| 亚洲视频自拍偷拍| 蜜乳av另类精品一区二区| 一区二区三区精品在线| 久久精品国产免费看久久精品| 宅男噜噜噜66一区二区| 久久综合色影院| 欧美伊久线香蕉线新在线| 欧美啪啪一区| 欧美黑人国产人伦爽爽爽| 国产日本欧美视频| 在线中文字幕一区| 亚洲一区二区三区午夜| 欧美国产日韩一区二区三区| 欧美jizz19hd性欧美| 99精品欧美一区| 欧美三级午夜理伦三级中文幕| 亚洲综合色丁香婷婷六月图片| 久久青草欧美一区二区三区| 亚洲在线网站| 亚洲精品欧洲| 午夜精品免费视频| 欧美1级日本1级| 久久久久久色| 国产午夜精品视频| 亚洲在线观看免费视频| 亚洲视频一区| 欧美日韩精品不卡| 亚洲国产欧美一区| 国产人成一区二区三区影院| 亚洲午夜精品久久久久久app| 99精品免费| 欧美日韩国产黄| 亚洲精品日韩在线| 日韩手机在线导航| 欧美激情bt| 99精品热6080yy久久| 在线综合欧美| 国产精品日韩电影| 亚洲一区二区在线看| 欧美一区永久视频免费观看| 国产欧美亚洲日本| 久久av免费一区| 免费在线观看成人av| 亚洲国产美女| 欧美区日韩区| 一区二区免费在线播放| 午夜精品久久久久久久99樱桃 | 在线精品国产成人综合| 开心色5月久久精品| 亚洲国产一区二区三区高清| 欧美日韩极品在线观看一区| av成人激情| 性欧美在线看片a免费观看| 国产精品试看| 久久动漫亚洲| 亚洲电影免费| 国产精品99久久久久久宅男 | 欧美大成色www永久网站婷| 亚洲国产精品一区二区尤物区| 欧美mv日韩mv亚洲| 99这里有精品| 久久久久久网址| 亚洲日本aⅴ片在线观看香蕉| 欧美久久久久免费| 欧美亚洲一区三区| 亚洲第一区在线观看| 亚洲婷婷综合久久一本伊一区| 国产精品久久久久9999| 久久激情视频| 亚洲毛片av| 久久国产精品黑丝| 亚洲精品韩国| 在线精品亚洲| 亚洲欧美日韩国产成人| 久久综合国产精品| 一区二区三区四区国产| 国产日韩专区在线| 欧美精品久久一区| 欧美一区1区三区3区公司| 亚洲国产高清视频| 久久精品国语| 中文在线资源观看视频网站免费不卡| 国产一区美女| 国产精品v日韩精品| 久久综合色婷婷| 亚洲专区一区| 亚洲精品国产欧美| 欧美韩日精品| 亚洲精品网址在线观看| 国产精品日韩欧美一区| 欧美a级片网站| 午夜久久美女| 日韩亚洲欧美在线观看| 米奇777超碰欧美日韩亚洲| 亚洲免费在线视频一区 二区| 亚洲国产精品福利| 国产亚洲福利社区一区| 欧美日韩a区| 欧美69视频| 欧美影院久久久| 欧美一区二区三区免费在线看 | 亚洲国产成人av| 国产视频久久| 国产精品久久久久久久午夜| 美女黄毛**国产精品啪啪| 亚洲性夜色噜噜噜7777| 亚洲欧洲在线视频| 欧美大香线蕉线伊人久久国产精品| 欧美一区二区三区日韩视频| 亚洲精品在线电影| 亚洲国产91| 在线观看福利一区| 狠狠狠色丁香婷婷综合激情| 国产乱人伦精品一区二区| 国产精品豆花视频| 久久久99国产精品免费| 99re这里只有精品6| 亚洲精选久久| 亚洲人久久久| 国产精品久久久久久久久动漫| 欧美一级片一区| 亚洲二区在线视频| 香蕉久久夜色精品国产使用方法| 影音先锋国产精品| 国产精品一区二区三区久久久| 鲁大师成人一区二区三区| 亚洲一级一区| 亚洲免费人成在线视频观看| 亚洲伊人网站| 亚洲欧美日韩系列| 亚洲一区二区免费视频| 宅男噜噜噜66一区二区| 亚洲一卡久久| 午夜精品久久久久久久99樱桃 | 亚洲无线视频| 亚洲在线中文字幕| 亚洲欧美日韩在线一区| 欧美一区二区视频在线| 久久精品二区三区| 噜噜噜91成人网| 欧美成人午夜激情在线| 亚洲国产欧美日韩精品| 久久久久国产精品一区| 欧美视频你懂的| 欧美手机在线| 国产精品影片在线观看| 国产综合欧美| 亚洲国产成人不卡| av成人免费在线| 亚洲欧美精品一区| 久久成人羞羞网站| 欧美电影美腿模特1979在线看| 亚洲精品久久久久久久久久久久 | 国内精品一区二区| 亚洲第一福利社区| 一区二区日韩精品| 久久精品人人| 欧美激情一区二区三区| 一区二区欧美在线观看| 欧美一站二站| 欧美精品在线看| 国产欧美精品一区| 亚洲国产精品久久久久| 亚洲午夜一区二区三区| 久久久www| 亚洲欧洲免费视频| 午夜精品久久久99热福利| 欧美1区2区视频| 国产欧美成人| 一本色道久久综合狠狠躁的推荐| 久久aⅴ国产欧美74aaa| 亚洲国产福利在线| 午夜久久美女| 欧美日韩一区二区在线视频| 国产在线拍揄自揄视频不卡99 | 久久久一本精品99久久精品66| 欧美精品福利| 红桃视频国产精品| 亚洲一区免费看| 亚洲国产视频a| 久久精品99久久香蕉国产色戒| 欧美日本韩国一区| 在线看成人片| 久久国产精品久久w女人spa|