CADデータの入力、出力

OpenCascadeで入出力可能なファイル形式を紹介します。

1.仕様

  • STEP(入力、出力)
  • BRep(入力、出力)
  • IGES(入力、出力)
  • STL(入力、出力)
  • VRML(出力)

2.STEP入力

//aISContext AIS_InteractiveContextクラスのインスタンスハンドル
//fileName 読み込むするファイル名
//ColorStep 色付きSTEPデータかどうか
//update 描写の更新をするかどうか
bool ImportStep(Handle(AIS_InteractiveContext) aISContext, std::string fileName,
  bool colorStep, bool update)
{
	std::filesystem::path path = fileName;
	STEPControl_Reader aReader;
	IFSelect_ReturnStatus aStatus = aReader.ReadFile(fileName.c_str());

	if (aStatus == IFSelect_RetDone)
	{
		if (!std::filesystem::is_regular_file(fileName))
			return false;
		
		aISContext->SetDisplayMode(AIS_Shaded, Standard_False);
		bool isFailsonly = false;
		aReader.PrintCheckLoad(isFailsonly, IFSelect_ItemsByEntity);

		int aNbRoot = aReader.NbRootsForTransfer();
		aReader.PrintCheckTransfer(isFailsonly, IFSelect_ItemsByEntity);

		for (Standard_Integer n = 1; n <= aNbRoot; n++)
		{
			Standard_Boolean ok = aReader.TransferRoot(n);
			int aNbShape = aReader.NbShapes();
			if (aNbShape > 0)
			{
				for (int i = 1; i <= aNbShape; i++)
				{
					TopoDS_Shape aShape = aReader.Shape(i);

					if (!colorStep)
						newObj = new AIS_Shape(aShape);
					else
						newObj = new AIS_ColoredShape(aShape);

          aISContext->Display(newObj, update);
				}
			}
		}
		aISContext->UpdateCurrentViewer();
    return true;
	}
	else
	{
		return false;
	}
	
}
3.STEP出力
//aISObject AIS_InteractiveObjectクラスのインスタンスハンドル
//fileName 出力するファイル名
bool ExportStep(Handle(AIS_InteractiveObject) aISObject, std::string fileName)
{
	Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast(aISObject);

	STEPControl_StepModelType aType = STEPControl_AsIs;
	IFSelect_ReturnStatus aStatus;
	STEPControl_Writer aWriter;

	aStatus = aWriter.Transfer(anIS->Shape(), mode);
	if (aStatus != IFSelect_RetDone)
		return false;

	aStatus = aWriter.Write(fileName.c_str());
	if (aStatus != IFSelect_RetDone)
		return false;

	return true;
}
4.BRep入力
//aISContext AIS_InteractiveContextクラスのインスタンスハンドル
//fileName 読み込むするファイル名
//update 描写の更新をするかどうか
bool ImportBrep(Handle(AIS_InteractiveContext) aISContext, std::string fileName,
 bool update)
{
	TopoDS_Shape aShape;
	BRep_Builder aBuilder;
	Standard_Boolean isResult = ;
	
  if (BRepTools::Read(aShape, fileName.c_str(), aBuilder)){
     aISContext->Display(new AIS_Shape(aShape), update);
     return true;
	}
  else{
     return false;
  }
}
5.BRep出力
//aISObject AIS_InteractiveObjectクラスのインスタンスハンドル
//fileName 出力するファイル名
bool ExportBRep(Handle(AIS_InteractiveObject) aISObject, std::string fileName)
{
	Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast(aISObject);
	return BRepTools::Write(anIS->Shape(), fileName.c_str()) != Standard_False;
}
6.IGES入力
//aISContext AIS_InteractiveContextクラスのインスタンスハンドル
//fileName 読み込むするファイル名
//update 描写の更新をするかどうか
bool ImportIges(Handle(AIS_InteractiveContext) aISContext, std::string fileName,
 bool update)
{
	IGESControl_Reader aReader;
	int aStatus = aReader.ReadFile(fileName.c_str());

	if (aStatus == IFSelect_RetDone)
	{
		aReader.TransferRoots();
		TopoDS_Shape aShape = aReader.OneShape();
		aISContext->Display(new AIS_Shape(aShape), Standard_True);
	  return true;
	}
	else
	{
		return false;
	}
}
7.IGES出力
//aISObject AIS_InteractiveObjectクラスのインスタンスハンドル
//fileName 出力するファイル名
bool ExportIges(Handle(AIS_InteractiveObject) aISObject, std::string fileName)
{
	IGESControl_Controller::Init();
	IGESControl_Writer aWriter(Interface_Static::CVal("XSTEP.iges.unit"),
		Interface_Static::IVal("XSTEP.iges.writebrep.mode"));

	Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast(aISObject);
	TopoDS_Shape aShape = anIS->Shape();
	if (!aWriter.AddShape(aShape))
		return false;

	aWriter.ComputeModel();
	return aWriter.Write(fileName.c_str()) != false;
}
8.STL入力
//aISContext AIS_InteractiveContextクラスのインスタンスハンドル
//fileName 読み込むするファイル名
//update 描写の更新をするかどうか
bool ImportStl(Handle(AIS_InteractiveContext) aISContext, std::string fileName,
bool update)
{
	StlAPI_Reader aReader;
	TopoDS_Shape aShape;

	if (aReader.Read(aShape, fileName.c_str()))
	{
		aISContext->Display(new AIS_Shape(aShape), update);
    return true;
	}
	else
	{
		return false;
	}
}
9.STL出力
//aISObject AIS_InteractiveObjectクラスのインスタンスハンドル
//fileName 出力するファイル名
bool ExportStl(Handle(AIS_InteractiveObject) aISObject, std::string fileName)
{
	TopoDS_Compound aComp;
	BRep_Builder aBuilder;
	aBuilder.MakeCompound(aComp);

	Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast(aISObject);
	TopoDS_Shape aShape = anIS->Shape();
	if (aShape.IsNull())
	{
		return false;
	}
	aBuilder.Add(aComp, aShape);

	StlAPI_Writer aWriter;
	aWriter.Write(aComp, fileName.c_str());
	return true;
}
10.Vrml出力
//aISObject AIS_InteractiveObjectクラスのインスタンスハンドル
//fileName 出力するファイル名
bool ExportVrml(Handle(AIS_InteractiveObject) aISObject, std::string fileName)
{
	TopoDS_Compound aRes;
	BRep_Builder aBuilder;
	aBuilder.MakeCompound(aRes);

	Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast(aISObject);
	TopoDS_Shape aShape = anIS->Shape();
	if (aShape.IsNull())
	{
		return false;
	}

	aBuilder.Add(aRes, aShape);

	VrmlAPI_Writer aWriter;
	aWriter.Write(aRes, fileName.c_str());

	return true;
}