Abstract.InOpenCASCADEawirecanbebuiltfromanynumberofedgesinsequence.Ifedgesarenotinsequence,youmustsorttheminorder.
KeyWords.Edge,Wire,Wireorder
1.Introduction
在OpenCASCADE中生成WIRE时要求添加到WIRE中的边EDGE是有顺序要求的。当给定的边没有按顺序添加到WIRE之前,需要自己将EDGE按顺序处理。OpenCASCADE中也提供了对EDGE按顺序进行排序的功能,方便WIRE的生成。
本文给出将散乱的EDGE排序后生成WIRE的实现代码,这个功能用处还是很大的。
2.Code
在模型检查模块TKShHealing中,OpenCASCADE提供了类ShapeAnalysis_WireOrder用来将用于生成WIRE的一系列EDGE进行排序。这个类的实现原理是根据EDGE的起点、终点坐标来进行连接,生成顺序。
如下图所示为一个封闭的WIRE,根据这些尺寸标注,生成WIRE的EDGE。
实现上述Wire的程序代码如下所示:
/*
TheMITLicense(MIT)
---------------------
Permissionisherebygranted,freeofcharge,toanypersonobtainingacopy
ofthissoftwareandassociateddocumentationfiles(the"Software"),todeal
intheSoftwarewithoutrestriction,includingwithoutlimitationtherights
touse,copy,modify,merge,publish,distribute,sublicense,and/orsell
copiesoftheSoftware,andtopermitpersonstowhomtheSoftwareis
furnishedtodoso,subjecttothefollowingconditions:
Theabovecopyrightnoticeandthispermissionnoticeshallbeincludedinall
copiesorsubstantialportionsoftheSoftware.
THESOFTWAREISPROVIDED"ASIS",WITHOUTWARRANTYOFANYKIND,EXPRESSOR
IMPLIED,INCLUDINGBUTNOTLIMITEDTOTHEWARRANTIESOFMERCHANTABILITY,
FITNESSFORAPARTICULARPURPOSEANDNONINFRINGEMENT.INNOEVENTSHALLTHE
AUTHORSORCOPYRIGHTHOLDERSBELIABLEFORANYCLAIM,DAMAGESOROTHER
LIABILITY,WHETHERINANACTIONOFCONTRACT,TORTOROTHERWISE,ARISINGFROM,
OUTOFORINCONNECTIONWITHTHESOFTWAREORTHEUSEOROTHERDEALINGSINTHE
SOFTWARE.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragmacomment(lib,"TKernel.lib")
#pragmacomment(lib,"TKMath.lib")
#pragmacomment(lib,"TKG2d.lib")
#pragmacomment(lib,"TKG3d.lib")
#pragmacomment(lib,"TKGeomBase.lib")
#pragmacomment(lib,"TKGeomAlgo.lib")
#pragmacomment(lib,"TKBRep.lib")
#pragmacomment(lib,"TKTopAlgo.lib")
#pragmacomment(lib,"TKShHealing.lib")
voidtest(void)
{
std::vector
//5Segmentedges.
BRepBuilderAPI_MakeEdgeanEdgeMaker1(
gp_Pnt(-1650.0,2857.88383249,0.0),
gp_Pnt(-750.0,1299.03810568,0.0));
BRepBuilderAPI_MakeEdgeanEdgeMaker2(
gp_Pnt(1299.03810568,750.0,0.0),
gp_Pnt(2857.88383249,1650.0,0.0));
BRepBuilderAPI_MakeEdgeanEdgeMaker3(
gp_Pnt(2857.88383249,1650.0,0.0),
gp_Pnt(8000.0,1650.0,0.0));
BRepBuilderAPI_MakeEdgeanEdgeMaker4(
gp_Pnt(8000.0,1650.0,0.0),
gp_Pnt(8000.0,-3300.0,0.0));
BRepBuilderAPI_MakeEdgeanEdgeMaker5(
gp_Pnt(8000.0,-3300.0,0.0),
gp_Pnt(0.0,-3300.0,0.0));
anEdges.push_back(anEdgeMaker1.Edge());
anEdges.push_back(anEdgeMaker2.Edge());
anEdges.push_back(anEdgeMaker3.Edge());
anEdges.push_back(anEdgeMaker4.Edge());
anEdges.push_back(anEdgeMaker5.Edge());
//2Arcedges.
gp_CircaCircle1(gp::XOY(),1500.0);
gp_CircaCircle2(gp::XOY(),3300.0);
BRepBuilderAPI_MakeEdgeanEdgeMaker6(aCircle1,
gp_Pnt(-750.0,1299.03810568,0.0),
gp_Pnt(1299.03810568,750.0,0.0));
BRepBuilderAPI_MakeEdgeanEdgeMaker7(aCircle2,
anEdges.push_back(anEdgeMaker6.Edge());
anEdges.push_back(anEdgeMaker7.Edge());
//Getedgesorderforthewire.
ShapeAnalysis_EdgeanEdgeAnalyser;
ShapeAnalysis_WireOrderaWireOrder;
for(std::vector
i!=anEdges.end();++i)
TopoDS_VertexaVf=anEdgeAnalyser.FirstVertex(*i);
TopoDS_VertexaVl=anEdgeAnalyser.LastVertex(*i);
gp_PntaPf=BRep_Tool::Pnt(aVf);
gp_PntaPl=BRep_Tool::Pnt(aVl);
aWireOrder.Add(aPf.XYZ(),aPl.XYZ());
}
//
TopTools_ListOfShapeaOrderedEdges;
for(Standard_Integere=1;e<=aWireOrder.NbEdges();++e)
constTopoDS_Edge&anEdge=anEdges.at(e-1);
aOrderedEdges.Append(anEdge);
BRepBuilderAPI_MakeWireaWireMaker;
aWireMaker.Add(aOrderedEdges);
if(aWireMaker.IsDone())
BRepTools::Write(aWireMaker.Shape(),"d:/wire.brep");
intmain(intargc,char*argv[])
test();
return0;
程序先添加5条线段到EDGE数组,再添加两个圆弧到EDGE数组。再使用类ShapeAnalysis_WireOrder来对EDGE数组进行排序,将排序后的EDGE数组去生成WIRE。如果生成WIRE成功,会在D盘得到一个wire.brep文件。在Draw中加载后显示如下图所示:
生成WIRE后,继而可以生成FACE,对FACE进行拉伸可以得到拉伸体,如下图所示:
3.Conclusion
OpenCASCADE中生成WIRE时对添加的EDGE是有顺序的要求。如何对散乱的EDGE进行排序以达到生成WIRE的要求呢OpenCASCADE在TKShHealing模块中提供了对EDGE排序的功能。
对EDGE排序的功能原理很简单,就是将所有的EDGE首尾相连,感兴趣的读者可以结合源码学习下。
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费!怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
//用VC6.0或者VS的学员,请选择WIN32APPLICATION#include#includeLRESULTCALLBACKWndProc(HWNDhwnd,UINTmsg,WPARAMwParam,LPARAMlParam)
回调函数是可执行代码作为参数传入其他的可执行代码,并由其他的可执行代码执行这段可执行代码的过程。
std::shared_ptr智能指针是c++11一个相当重要的特性,可以极大地将开发者从资源申请/释放的繁重劳动中解放出来,然而直到c++17前std::shared_ptr都有一个严重的限制,那就是它并不支持动态数组
目前而言(2017年5月18日)C语言中有32+5+7=44个关键字.具体如下