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

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

BRep Builder

Posted on 2020-06-16 11:04 eryar 閱讀(2899) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

BRep Builder

eryar@163.com

 

1 Introduction

BRep_Builder提供了創(chuàng)建、修改BRep模型的方法。使用這個類,你可以從底層自己構(gòu)建BRep體,前提條件是你要對BRep模型的數(shù)據(jù)結(jié)構(gòu)有一定理解。邊界表示法BRep的重點在邊界的定義,打開BRep_Builder的類圖:

 

可以看到其中重載了很多UpdateEdge函數(shù),每個UpdateEdge函數(shù)都修改了Edge中的幾何數(shù)據(jù),包括邊界的定義數(shù)據(jù)。若能理解每個UpdateEdge函數(shù),則對OpenCASCADEBREP數(shù)據(jù)結(jié)構(gòu)就能理解了。本文主要介紹其中兩個函數(shù)的用法:AddRemove

 2 Add Shape

BRep_BuilderAdd函數(shù)的字面意思是將一個Shape添加到另外一個Shape中。因這個函數(shù)的實現(xiàn)比較簡單,把源碼列出如下:

 

void TopoDS_Builder::Add (TopoDS_Shape& aShape, 
                          const TopoDS_Shape& aComponent) const
{
  // From now the Component cannot be edited
  aComponent.TShape()->Free(Standard_False);
  // Note that freezing aComponent before testing if aShape is free
  // prevents from self-insertion
  // but aShape will be frozen when the Exception is raised
  if (aShape.Free())
  {
    static const unsigned int aTb[9]=
    {
      //COMPOUND to:
      (1<<((unsigned int)TopAbs_COMPOUND)),
      //COMPSOLID to:
      (1<<((unsigned int)TopAbs_COMPOUND)),
      //SOLID to:
      (1<<((unsigned int)TopAbs_COMPOUND)) |
      (1<<((unsigned int)TopAbs_COMPSOLID)),
      //SHELL to:
      (1<<((unsigned int)TopAbs_COMPOUND)) |
      (1<<((unsigned int)TopAbs_SOLID)),
      //FACE to:
      (1<<((unsigned int)TopAbs_COMPOUND)) |
      (1<<((unsigned int)TopAbs_SHELL)),
      //WIRE to:
      (1<<((unsigned int)TopAbs_COMPOUND)) |
      (1<<((unsigned int)TopAbs_FACE)),
      //EDGE to:
      (1<<((unsigned int)TopAbs_COMPOUND)) |
      (1<<((unsigned int)TopAbs_SOLID)) |
      (1<<((unsigned int)TopAbs_WIRE)),
      //VERTEX to:
      (1<<((unsigned int)TopAbs_COMPOUND)) |
      (1<<((unsigned int)TopAbs_SOLID)) |
      (1<<((unsigned int)TopAbs_FACE)) |
      (1<<((unsigned int)TopAbs_EDGE)),
      //SHAPE to:
      0
    };
    //
    const unsigned int iC=(unsigned int)aComponent.ShapeType();
    const unsigned int iS=(unsigned int)aShape.ShapeType();
    //
    if ((aTb[iC] & (1<<iS)) != 0) {
      TopoDS_ListOfShape& L = aShape.TShape()->myShapes;
      L.Append(aComponent);
      TopoDS_Shape& S = L.Last();
      //
      // compute the relative Orientation
      if (aShape.Orientation() == TopAbs_REVERSED)
        S.Reverse();
      //
      // and the Relative Location
      const TopLoc_Location& aLoc=aShape.Location();
      if (!aLoc.IsIdentity())
        S.Move(aLoc.Inverted());
      //
      // Set the TShape as modified.
      aShape.TShape()->Modified(Standard_True);
    }
    else {
      throw TopoDS_UnCompatibleShapes("TopoDS_Builder::Add");
    }
  }
  else {
    throw TopoDS_FrozenShape("TopoDS_Buider::Add");
  }
}

 

Add函數(shù)通過一個靜態(tài)的檢查列表,來檢查添加的Shape是不是合法的,即FACE只能添加到SHELLCOMPOUND中,EDGE只能添加到WIRESOLIDCOMPOUND中等。添加之后還檢查了ShapeORIENTATION及位置信息并作相應(yīng)調(diào)整。不滿足條件的情況都會拋出異常,所以對于Add函數(shù)需要增加異常處理邏輯。

使用這個函數(shù)需要注意的是這個Add只是簡單的將Shape添加到TShapeShape表中,并沒有維護BREP的邊界信息。

3 Remove Shape

Add對應(yīng)的有Remove函數(shù),可以從一個Shape中刪除一個子Shape。還是打開源碼,有源碼有真相:

//=======================================================================
//function : Remove
//purpose  : Remove a Shape from an other one
//=======================================================================
void TopoDS_Builder::Remove (TopoDS_Shape& aShape, 
                             const TopoDS_Shape& aComponent) const
{
  // check  if aShape  is  not Frozen
  TopoDS_FrozenShape_Raise_if (!aShape.Free(),"TopoDS_Builder::Remove");
  // compute the relative Orientation and Location of aComponent
  TopoDS_Shape S = aComponent;
  if (aShape.Orientation() == TopAbs_REVERSED)
    S.Reverse();
  S.Location(S.Location().Predivided(aShape.Location()));
  TopoDS_ListOfShape& L = aShape.TShape()->myShapes;
  TopoDS_ListIteratorOfListOfShape It(L);
  while (It.More()) {
    if (It.Value() == S) {
      L.Remove(It);
      aShape.TShape()->Modified(Standard_True);
      break;
    }
    It.Next();
  }
}

 

從源碼中可知,Remove實現(xiàn)的邏輯也是很簡單的:

檢查Shape是不是Free的,若不是則拋出異常;

計算要刪除ComponentORIENTATIONLOCATION

Shape列中查找Component,若找到將其從列表中刪除;

 

刪除操作比添加操作要簡單,一個是把已有的數(shù)據(jù)刪除,一個是從無到有的構(gòu)建數(shù)據(jù)。從函數(shù)實現(xiàn)代碼來看,刪除操作也是簡單的從Shape列表中刪除指定的Shape。刪除之后多余的邊界信息還會存在原來的Shape中,要確保刪除的Shape之后沒有多余信息,還需要刪除沒有使用的PCurves

 

上圖所示為刪除一個底面的圓柱體。

 4 Conclusion

BRep_Builder的操作需要以充分理解OpenCASCADEBREP數(shù)據(jù)結(jié)構(gòu)為前提,因為其AddRemove函數(shù)并沒有提供維護邊界的功能,只是將指定的Shape添加到列表中或從列表中刪除。


為了方便大家在移動端也能看到我的博文和討論交流,現(xiàn)已注冊微信公眾號,歡迎大家掃描下方二維碼關(guān)注。
Shing Liu(eryar@163.com)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一本不卡影院| 欧美精品一区二区精品网 | 日韩视频二区| 1204国产成人精品视频| 亚洲国产精品成人综合色在线婷婷 | 亚洲人成在线播放| 99re热精品| 亚洲免费一在线| 欧美专区在线播放| 欧美黄在线观看| 99re热这里只有精品视频| 亚洲天天影视| 久久精品国产v日韩v亚洲| 欧美成人免费观看| 国产精品久久久久9999吃药| 国内免费精品永久在线视频| 亚洲理论在线观看| 久久精品免费播放| 亚洲人成绝费网站色www| 亚洲久久一区| 欧美一区亚洲| 欧美日韩免费一区二区三区视频 | 久久精品一区二区国产| 欧美激情精品久久久六区热门| 欧美日韩中文字幕| 黄色成人在线| 午夜久久久久久| 欧美激情一区二区三区四区| 亚洲综合精品一区二区| 欧美成人第一页| 国产一区91精品张津瑜| 亚洲在线观看视频| 欧美高清视频| 亚洲美女视频网| 久久国内精品自在自线400部| 欧美激情麻豆| 精品999成人| 欧美一级播放| 9l国产精品久久久久麻豆| 久久亚洲图片| 国产日韩专区在线| 午夜精品亚洲一区二区三区嫩草| 欧美成人影音| 久久久99久久精品女同性| 国产精品久久久久77777| 亚洲美女视频在线观看| 开心色5月久久精品| 午夜精品网站| 国产日本欧美一区二区| 亚洲综合色视频| 亚洲作爱视频| 欧美视频一区二区在线观看| 一本不卡影院| 99成人在线| 欧美特黄一级| 午夜精品视频在线| 午夜精品在线观看| 国产香蕉久久精品综合网| 亚洲欧美三级伦理| 亚洲欧美久久久| 国产一区91精品张津瑜| 久久久久九九九| 久久国产精品久久久久久| 国产在线精品二区| 久久午夜影视| 久久这里有精品视频| 玉米视频成人免费看| 免费日韩精品中文字幕视频在线| 久久久蜜桃精品| 亚洲日本精品国产第一区| 亚洲国产日韩在线| 欧美日韩久久久久久| 校园春色综合网| 久久福利毛片| 亚洲精品看片| 亚洲一区成人| 狠狠综合久久av一区二区小说| 久久夜色精品| 欧美精品亚洲精品| 亚洲欧美日韩在线观看a三区| 亚洲欧美日韩国产中文| 精品99一区二区三区| 亚洲国产成人不卡| 国产精品豆花视频| 老司机午夜精品视频| 欧美精品国产精品日韩精品| 亚洲一区在线直播| 久久精选视频| 一区二区三区高清| 欧美在线三区| 一本久久青青| 久久噜噜噜精品国产亚洲综合| 99re成人精品视频| 久久激情综合| 国产精品麻豆va在线播放| 伊人久久av导航| 亚洲人成人一区二区在线观看| 国产精品黄色| 欧美福利视频在线观看| 欧美日韩一区二区三区在线视频 | 久久久激情视频| 一区二区三区高清不卡| 欧美专区18| 亚洲午夜精品久久| 久久亚洲影院| 欧美尤物一区| 欧美精品精品一区| 美日韩精品视频| 国产精品一区视频网站| 亚洲欧洲一区二区三区久久| 黄色小说综合网站| 亚洲欧美日韩精品久久亚洲区| 亚洲国产小视频在线观看| 午夜精品久久久久| 亚洲在线成人精品| 欧美日韩99| 欧美黑人多人双交| 伊大人香蕉综合8在线视| 午夜精品视频在线观看一区二区 | 国产一区二区三区在线观看网站 | 久久天天躁夜夜躁狠狠躁2022 | 久久久久久网站| 性伦欧美刺激片在线观看| 欧美日韩播放| 亚洲国产精品国自产拍av秋霞| 国产视频在线观看一区二区三区| 夜久久久久久| 一道本一区二区| 欧美另类videos死尸| 亚洲黄页视频免费观看| 亚洲激情网址| 欧美r片在线| 亚洲国产另类久久久精品极度| 永久免费毛片在线播放不卡| 亚洲欧美视频在线观看视频| 亚洲欧美电影院| 国产精品久久国产三级国电话系列| 亚洲茄子视频| 9国产精品视频| 欧美三级不卡| 亚洲视频一起| 久久精品视频导航| 韩日视频一区| 蜜桃av噜噜一区| 亚洲日本va在线观看| 一本色道久久99精品综合 | 国产精品99免费看 | 午夜免费电影一区在线观看| 久久不见久久见免费视频1| 久久久久久久久久久成人| 久久青草欧美一区二区三区| 国内揄拍国内精品少妇国语| 久久―日本道色综合久久| 亚洲电影在线播放| 夜夜嗨av一区二区三区四季av| 欧美另类99xxxxx| 亚洲综合清纯丝袜自拍| 久久综合伊人77777尤物| 怡红院精品视频| 欧美日韩成人| 亚洲字幕在线观看| 欧美激情一区在线| 午夜欧美理论片| 亚洲高清毛片| 国产精品免费看片| 久久夜色精品| 亚洲另类视频| 久久久久久国产精品一区| 亚洲欧洲一区二区三区| 国产精品不卡在线| 久久精品人人爽| 亚洲精品中文在线| 久久免费精品日本久久中文字幕| 亚洲人午夜精品| 国产午夜精品在线| 欧美日韩精品免费| 久久精品国产一区二区三| 亚洲久久在线| 另类成人小视频在线| 亚洲天堂免费观看| 亚洲国产高清在线| 国产日韩精品久久久| 欧美另类视频在线| 久久精品人人做人人综合| 日韩一级精品视频在线观看| 免费观看成人www动漫视频| 亚洲在线成人精品| 亚洲人成网站在线观看播放| 国产一二精品视频| 国产精品成人一区二区网站软件| 久久这里有精品15一区二区三区| 亚洲一卡久久| 亚洲精品美女在线| 欧美大片在线观看| 久久久精品一品道一区| 午夜精品福利一区二区三区av | 午夜精品久久久久久99热| 亚洲激情专区| 一区二区视频免费完整版观看| 国产精品久久久久久久免费软件 |