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

eryar

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

BRep Builder

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

BRep Builder

eryar@163.com

 

1 Introduction

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

 

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

 2 Add Shape

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

 

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函數通過一個靜態的檢查列表,來檢查添加的Shape是不是合法的,即FACE只能添加到SHELLCOMPOUND中,EDGE只能添加到WIRESOLIDCOMPOUND中等。添加之后還檢查了ShapeORIENTATION及位置信息并作相應調整。不滿足條件的情況都會拋出異常,所以對于Add函數需要增加異常處理邏輯。

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

3 Remove Shape

Add對應的有Remove函數,可以從一個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實現的邏輯也是很簡單的:

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

計算要刪除ComponentORIENTATIONLOCATION

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

 

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

 

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

 4 Conclusion

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


為了方便大家在移動端也能看到我的博文和討論交流,現已注冊微信公眾號,歡迎大家掃描下方二維碼關注。
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>
            国产午夜精品一区二区三区视频| 在线观看91精品国产入口| 亚洲精选成人| 亚洲高清三级视频| 欧美激情一区二区三区在线| 亚洲人www| 99riav国产精品| 国产精品久久久久天堂| 欧美一区三区三区高中清蜜桃| 亚洲性图久久| 国内久久精品视频| 欧美成人69| 欧美日韩a区| 午夜精品一区二区三区四区| 久久av资源网| 亚洲精品美女91| 亚洲视频免费观看| 国色天香一区二区| 亚洲国产精品激情在线观看 | 亚洲午夜精品国产| 亚洲一区bb| 在线观看成人网| 亚洲激情国产| 国产久一道中文一区| 免费观看成人| 国产精品久久久久久妇女6080 | 一区免费观看| 亚洲日本欧美| 国产自产在线视频一区| 91久久黄色| 国内精品一区二区三区| 亚洲经典视频在线观看| 国产精品自拍小视频| 欧美成人影音| 国产欧美韩日| 日韩视频在线你懂得| 国产一区二区三区四区老人| 91久久久在线| 影音先锋久久资源网| 中文久久精品| 亚洲精品女人| 久久亚洲一区二区三区四区| 亚洲欧美欧美一区二区三区| 免费在线视频一区| 久久久久.com| 国产精品中文在线| 亚洲最新合集| 亚洲人成网站在线观看播放| 欧美一区二区三区在线看| 亚洲午夜激情网站| 欧美激情91| 欧美高清视频www夜色资源网| 国产日韩综合一区二区性色av| 最近看过的日韩成人| **网站欧美大片在线观看| 亚洲欧美日韩精品久久亚洲区 | 国产伦精品一区二区三区视频黑人 | 亚洲图片你懂的| 猛男gaygay欧美视频| 美女在线一区二区| 国产欧美日韩精品a在线观看| 99国产精品视频免费观看| 91久久精品久久国产性色也91| 欧美中文在线观看国产| 欧美一区在线看| 国产精品日韩在线一区| 一区二区三区欧美在线观看| 在线视频一区二区| 欧美日韩国产一区| 亚洲精品免费一二三区| 在线午夜精品自拍| 欧美日韩精品系列| 一区二区欧美在线| 亚洲专区免费| 国产精品一页| 欧美在线高清视频| 美女爽到呻吟久久久久| 亚洲二区在线视频| 欧美成人xxx| 亚洲精品日本| 午夜精品国产更新| 国内精品久久久| 久久全球大尺度高清视频| 欧美成人资源| 一区二区三区福利| 国产精品你懂的在线欣赏| 欧美一级夜夜爽| 嫩草国产精品入口| 夜夜嗨网站十八久久| 欧美色另类天堂2015| 亚洲女女女同性video| 久久久中精品2020中文| 亚洲精品1234| 欧美日韩精品一区二区天天拍小说 | 91久久久久久国产精品| 亚洲深爱激情| 国产亚洲精品久久久久婷婷瑜伽 | 亚洲人精品午夜| 亚洲男人影院| 精品69视频一区二区三区| 欧美成人在线免费视频| 一区二区三区 在线观看视| 欧美一区二区三区四区在线| 亚洲电影视频在线| 欧美三级第一页| 久久久噜噜噜久久| 中文在线一区| 玖玖玖国产精品| 亚洲自拍偷拍色片视频| 国语自产在线不卡| 国产精品高潮呻吟久久av无限| 久久国产一区| 一区二区三区导航| 欧美成人a∨高清免费观看| 亚洲一区在线观看免费观看电影高清| 国产一区二区三区精品久久久| 欧美欧美在线| 巨胸喷奶水www久久久免费动漫| 一区二区三区日韩精品| 欧美激情亚洲精品| 欧美在线视频免费| 亚洲制服av| 99视频超级精品| 亚洲第一精品电影| 国产麻豆精品theporn| 欧美日韩国语| 欧美高清视频一区二区| 久久久久一区| 欧美一区免费视频| 亚洲永久免费观看| 一区二区久久久久| 亚洲欧洲三级| 亚洲黄页一区| 欧美高清视频在线观看| 久久综合久久综合这里只有精品 | 在线观看日韩精品| 国产亚洲aⅴaaaaaa毛片| 欧美性色aⅴ视频一区日韩精品| 久久综合99re88久久爱| 久久久久国内| 久久国产精彩视频| 欧美一区二区三区四区在线 | 亚洲自拍偷拍视频| 一区二区三区欧美成人| 99精品免费| 夜夜爽av福利精品导航 | 欧美在线综合视频| 先锋亚洲精品| 欧美在线综合| 久久亚洲春色中文字幕| 久久久久久久久久码影片| 久久精品一区| 久热精品视频| 牛夜精品久久久久久久99黑人 | 久久国产精品一区二区三区| 欧美一区二区日韩| 久久高清福利视频| 久久裸体视频| 欧美大片一区二区| 亚洲国产专区| 在线综合亚洲| 亚洲女女做受ⅹxx高潮| 欧美在线1区| 免费看亚洲片| 欧美色综合网| 国产日韩欧美在线观看| 在线免费一区三区| 亚洲乱码国产乱码精品精98午夜| 一区二区三区精品视频| 亚洲欧美成人综合| 久久婷婷蜜乳一本欲蜜臀| 欧美高清在线一区| 亚洲毛片av在线| 欧美在线|欧美| 免费看亚洲片| 国产精品女人毛片| 亚洲国产美国国产综合一区二区| 日韩视频在线免费观看| 午夜精品久久久久久久久久久久久 | 亚洲盗摄视频| 亚洲一品av免费观看| 久久久久久香蕉网| 最新中文字幕亚洲| 欧美亚洲视频| 欧美日韩国产不卡| 国产性天天综合网| 99riav1国产精品视频| 久久久福利视频| 亚洲精品中文字幕在线| 午夜精品视频在线观看| 欧美粗暴jizz性欧美20| 国产精品资源| 亚洲三级毛片| 久久综合九色综合欧美狠狠| 日韩亚洲在线观看| 美女福利精品视频| 国产午夜精品美女毛片视频| 99国产精品久久久久老师 | 一区二区三区福利| 久热精品视频在线观看|