#pragma once
#include "rust/cxx.h"
#include <TopoDS_Shape.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Solid.hxx>
#include <TopoDS_Compound.hxx>
#include <TopExp_Explorer.hxx>
#include <TopAbs_ShapeEnum.hxx>
#include <TopoDS.hxx>
#include <BRepBuilderAPI_Copy.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepPrimAPI_MakeCylinder.hxx>
#include <BRepPrimAPI_MakeHalfSpace.hxx>
#include <BRepPrimAPI_MakePrism.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
#include <BRepAlgoAPI_Cut.hxx>
#include <BRepAlgoAPI_Common.hxx>
#include <ShapeUpgrade_UnifySameDomain.hxx>
#include <BRepMesh_IncrementalMesh.hxx>
#include <BRep_Tool.hxx>
#include <Poly_Triangulation.hxx>
#include <BRepGProp.hxx>
#include <BRepGProp_Face.hxx>
#include <GProp_GProps.hxx>
#include <GeomAPI_ProjectPointOnSurf.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <GCPnts_TangentialDeflection.hxx>
#include <BRep_Builder.hxx>
#include <TopExp.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <gp_Pln.hxx>
#include <gp_Ax2.hxx>
#include <gp_Trsf.hxx>
#include <TopLoc_Location.hxx>
#include <BinTools.hxx>
#include <BRepTools.hxx>
#include <STEPControl_Reader.hxx>
#include <Message_ProgressRange.hxx>
#include <Standard_Failure.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <streambuf>
#include <istream>
#include <ostream>
#include <sstream>
#include <memory>
namespace chijin {
using TopoDS_Shape = ::TopoDS_Shape;
using TopoDS_Face = ::TopoDS_Face;
using TopoDS_Edge = ::TopoDS_Edge;
using TopExp_Explorer = ::TopExp_Explorer;
struct RustReader;
struct RustWriter;
struct MeshData;
struct ApproxPoints;
class RustReadStreambuf : public std::streambuf {
public:
explicit RustReadStreambuf(RustReader& reader) : reader_(reader) {}
protected:
int_type underflow() override;
private:
RustReader& reader_;
char buf_[8192];
};
class RustWriteStreambuf : public std::streambuf {
public:
explicit RustWriteStreambuf(RustWriter& writer) : writer_(writer) {}
~RustWriteStreambuf() override {
sync();
}
protected:
int_type overflow(int_type ch) override;
std::streamsize xsputn(const char* s, std::streamsize count) override;
int sync() override;
private:
bool flush_buf();
RustWriter& writer_;
char buf_[8192];
size_t pos_ = 0;
};
std::unique_ptr<TopoDS_Shape> read_step_stream(RustReader& reader);
std::unique_ptr<TopoDS_Shape> read_brep_bin_stream(RustReader& reader);
bool write_brep_bin_stream(const TopoDS_Shape& shape, RustWriter& writer);
std::unique_ptr<TopoDS_Shape> read_brep_text_stream(RustReader& reader);
bool write_brep_text_stream(const TopoDS_Shape& shape, RustWriter& writer);
std::unique_ptr<TopoDS_Shape> make_half_space(
double ox, double oy, double oz,
double nx, double ny, double nz);
std::unique_ptr<TopoDS_Shape> make_box(
double x1, double y1, double z1,
double x2, double y2, double z2);
std::unique_ptr<TopoDS_Shape> make_cylinder(
double px, double py, double pz,
double dx, double dy, double dz,
double radius, double height);
std::unique_ptr<TopoDS_Shape> make_empty();
std::unique_ptr<TopoDS_Shape> deep_copy(const TopoDS_Shape& shape);
std::unique_ptr<TopoDS_Shape> boolean_fuse(
const TopoDS_Shape& a, const TopoDS_Shape& b);
std::unique_ptr<TopoDS_Shape> boolean_cut(
const TopoDS_Shape& a, const TopoDS_Shape& b);
std::unique_ptr<TopoDS_Shape> boolean_common(
const TopoDS_Shape& a, const TopoDS_Shape& b);
std::unique_ptr<TopoDS_Shape> clean_shape(const TopoDS_Shape& shape);
std::unique_ptr<TopoDS_Shape> translate_shape(
const TopoDS_Shape& shape, double tx, double ty, double tz);
bool shape_is_null(const TopoDS_Shape& shape);
MeshData mesh_shape(const TopoDS_Shape& shape, double tolerance);
std::unique_ptr<TopExp_Explorer> explore_faces(const TopoDS_Shape& shape);
std::unique_ptr<TopExp_Explorer> explore_edges(const TopoDS_Shape& shape);
bool explorer_more(const TopExp_Explorer& explorer);
void explorer_next(TopExp_Explorer& explorer);
std::unique_ptr<TopoDS_Face> explorer_current_face(const TopExp_Explorer& explorer);
std::unique_ptr<TopoDS_Edge> explorer_current_edge(const TopExp_Explorer& explorer);
void face_center_of_mass(const TopoDS_Face& face,
double& cx, double& cy, double& cz);
void face_normal_at_center(const TopoDS_Face& face,
double& nx, double& ny, double& nz);
std::unique_ptr<TopoDS_Shape> face_extrude(const TopoDS_Face& face,
double dx, double dy, double dz);
std::unique_ptr<TopoDS_Shape> face_to_shape(const TopoDS_Face& face);
ApproxPoints edge_approximation_segments(
const TopoDS_Edge& edge, double tolerance);
}