Opencascad(C++)-导出整个模型到stl文件

2023-12-13 10:16:34

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


1、前言

最近研究下Opencascad,还不是很深入,对于Opencascad的理论还不扎实,这里仅仅是个人做项目的一些开发经验,如果有不足之处或者有疑问之处可以在评论区留言或者私信博主。今天介绍一下将模型中的文件导出到stl文件中,这里可以是单个TopoDS_Shape,也可以是多个TopoDS_Shape,通过修改小面片的deflection和angle可以改变导出的效率。


`

2、首先创建几个简单的模型

在这里插入图片描述
这里有多个直管、两个弯头和一个三通构成。

3、导出stl的代码为


bool PDObjectModel::WriteStl(const QString& fileName,double deflection,double angle)
{
    StlAPI_Writer stlWrite;

	//创建TopoDS_Compound对象
    BRep_Builder builder  = BRep_Builder();
    TopoDS_Compound comp = TopoDS_Compound();
    builder.MakeCompound(comp);

    QList< Handle(Feature)>featureHandleList = this->GetObjModel()->FeatureCollection(); //获取模型中的所有特征
    //遍历特征获取每个特征的TopoShape
    for (Handle(Feature)featureHandle:featureHandleList)
    {
        TopoDS_Shape shape = featureHandle->GetShape();
        //将TopoDS_Shape添加上网格,这里delection默认值是0.001,angle默认是0.5,详见源代码
        BRepMesh_IncrementalMesh mesh(shape,deflection,false,angle);
        mesh.Perform();
        //将每个shape添加到compound中
        builder.Add(comp,shape);
    }

	//转换文件
    QByteArray arry = fileName.toUtf8().data();
    Standard_CString cstring(arry.constData());
	//导出stl文件
    return stlWrite.Write(comp,cstring);
}

我将delfection的值修改为0.1,angle值为0.5,然后调用的代码为:

	QString partName = workPart->GetName(); //工作部件的名称
	//选择保存stl的文件地址
	QString filename = QFileDialog::getSaveFileName(this, u8"另存为...", workDirPathString + "/" + partName + ".stl", tr("*.stl"));
	if (filename.isEmpty())
	{
		return;
	}

	//导出stl文件,myoccmodel是基于OCAF创建的
	myOccModel->WriteStl(filename,0.1,0.5);

导出后的文件为cest.stl,其大型为4663kb。
在这里插入图片描述

4、查看导出的结果

采用导入stl文件的方法,导入到工作部件中,其显示如下,导入的时间偏长些,目前还不知道咋解决导入时间长的问题。
在这里插入图片描述

5、结论

我只是能实现,但是还不知道是不是最好的方法,先用着再说吧, 后面再细致的研究。

文章来源:https://blog.csdn.net/yang19861007/article/details/134939682
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。