#pragma once
#include "rust/cxx.h"
#include <TopoDS_Shape.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Edge.hxx>
#include <TopExp_Explorer.hxx>
#include <cstdint>
#include <streambuf>
#include <memory>
#include <vector>
namespace cadrum {
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;
};
#ifndef CADRUM_COLOR
std::unique_ptr<TopoDS_Shape> read_step_stream(RustReader& reader);
bool write_step_stream(const TopoDS_Shape& shape, RustWriter& writer);
#endif
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_sphere(
double cx, double cy, double cz,
double radius);
std::unique_ptr<TopoDS_Shape> make_cone(
double px, double py, double pz,
double dx, double dy, double dz,
double r1, double r2, double height);
std::unique_ptr<TopoDS_Shape> make_torus(
double px, double py, double pz,
double dx, double dy, double dz,
double r1, double r2);
std::unique_ptr<TopoDS_Shape> make_empty();
std::unique_ptr<TopoDS_Shape> deep_copy(const TopoDS_Shape& shape);
std::unique_ptr<TopoDS_Shape> shallow_copy(const TopoDS_Shape& shape);
class BooleanShape {
public:
TopoDS_Shape shape;
std::vector<uint64_t> from_a; std::vector<uint64_t> from_b; };
std::unique_ptr<BooleanShape> boolean_op(
const TopoDS_Shape& a, const TopoDS_Shape& b, uint32_t op_kind);
std::unique_ptr<TopoDS_Shape> boolean_shape_shape(const BooleanShape& r);
rust::Vec<uint64_t> boolean_shape_from_a(const BooleanShape& r);
rust::Vec<uint64_t> boolean_shape_from_b(const BooleanShape& r);
#ifndef CADRUM_COLOR
std::unique_ptr<TopoDS_Shape> clean_shape(const TopoDS_Shape& shape);
#endif
std::unique_ptr<TopoDS_Shape> translate_shape(
const TopoDS_Shape& shape, double tx, double ty, double tz);
std::unique_ptr<TopoDS_Shape> rotate_shape(
const TopoDS_Shape& shape,
double ox, double oy, double oz,
double dx, double dy, double dz,
double angle);
std::unique_ptr<TopoDS_Shape> scale_shape(
const TopoDS_Shape& shape,
double cx, double cy, double cz,
double factor);
std::unique_ptr<TopoDS_Shape> mirror_shape(
const TopoDS_Shape& shape,
double ox, double oy, double oz,
double nx, double ny, double nz);
bool shape_is_null(const TopoDS_Shape& shape);
bool shape_is_solid(const TopoDS_Shape& shape);
uint32_t shape_shell_count(const TopoDS_Shape& shape);
double shape_volume(const TopoDS_Shape& shape);
bool shape_contains_point(const TopoDS_Shape& shape, double x, double y, double z);
void shape_bounding_box(const TopoDS_Shape& shape,
double& xmin, double& ymin, double& zmin,
double& xmax, double& ymax, double& zmax);
std::unique_ptr<std::vector<TopoDS_Shape>> decompose_into_solids(const TopoDS_Shape& shape);
void compound_add(TopoDS_Shape& compound, const TopoDS_Shape& child);
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);
ApproxPoints edge_approximation_segments(
const TopoDS_Edge& edge, double tolerance);
ApproxPoints edge_approximation_segments_ex(
const TopoDS_Edge& edge, double angular, double chord);
std::unique_ptr<TopoDS_Edge> make_helix_edge(
double ax, double ay, double az,
double xrx, double xry, double xrz,
double radius, double pitch, double height);
std::unique_ptr<std::vector<TopoDS_Edge>> make_polygon_edges(
rust::Slice<const double> coords);
std::unique_ptr<TopoDS_Edge> make_circle_edge(
double ax, double ay, double az, double radius);
std::unique_ptr<TopoDS_Edge> make_line_edge(
double ax, double ay, double az,
double bx, double by, double bz);
std::unique_ptr<TopoDS_Edge> make_arc_edge(
double sx, double sy, double sz,
double mx, double my, double mz,
double ex, double ey, double ez);
std::unique_ptr<TopoDS_Edge> make_bspline_edge(
rust::Slice<const double> coords,
uint32_t end_kind,
double sx, double sy, double sz,
double ex, double ey, double ez);
void edge_start_point(const TopoDS_Edge& edge, double& x, double& y, double& z);
void edge_start_tangent(const TopoDS_Edge& edge, double& x, double& y, double& z);
bool edge_is_closed(const TopoDS_Edge& edge);
std::unique_ptr<TopoDS_Edge> deep_copy_edge(const TopoDS_Edge& edge);
std::unique_ptr<TopoDS_Edge> translate_edge(
const TopoDS_Edge& edge, double tx, double ty, double tz);
std::unique_ptr<TopoDS_Edge> rotate_edge(
const TopoDS_Edge& edge,
double ox, double oy, double oz,
double dx, double dy, double dz,
double angle);
std::unique_ptr<TopoDS_Edge> scale_edge(
const TopoDS_Edge& edge,
double cx, double cy, double cz,
double factor);
std::unique_ptr<TopoDS_Edge> mirror_edge(
const TopoDS_Edge& edge,
double ox, double oy, double oz,
double nx, double ny, double nz);
std::unique_ptr<TopoDS_Shape> make_extrude(
const std::vector<TopoDS_Edge>& profile_edges,
double dx, double dy, double dz);
std::unique_ptr<TopoDS_Shape> make_pipe_shell(
const std::vector<TopoDS_Edge>& all_edges,
const std::vector<TopoDS_Edge>& spine_edges,
uint32_t orient,
double ux, double uy, double uz,
const std::vector<TopoDS_Edge>& aux_spine_edges);
std::unique_ptr<std::vector<TopoDS_Edge>> edge_vec_new();
void edge_vec_push(std::vector<TopoDS_Edge>& v, const TopoDS_Edge& e);
void edge_vec_push_null(std::vector<TopoDS_Edge>& v);
std::unique_ptr<TopoDS_Shape> make_loft(
const std::vector<TopoDS_Edge>& all_edges);
std::unique_ptr<TopoDS_Shape> make_bspline_solid(
rust::Slice<const double> coords,
uint32_t nu, uint32_t nv,
bool u_periodic);
uint64_t face_tshape_id(const TopoDS_Face& face);
uint64_t shape_tshape_id(const TopoDS_Shape& shape);
}
#ifdef CADRUM_COLOR
namespace cadrum {
class ColoredStepData {
public:
TopoDS_Shape shape;
std::vector<uint64_t> ids;
std::vector<float> r, g, b;
};
std::unique_ptr<ColoredStepData> read_step_color_stream(RustReader& reader);
std::unique_ptr<TopoDS_Shape> colored_step_shape(const ColoredStepData& d);
rust::Vec<uint64_t> colored_step_ids(const ColoredStepData& d);
rust::Vec<float> colored_step_colors_r(const ColoredStepData& d);
rust::Vec<float> colored_step_colors_g(const ColoredStepData& d);
rust::Vec<float> colored_step_colors_b(const ColoredStepData& d);
bool write_step_color_stream(
const TopoDS_Shape& shape,
rust::Slice<const uint64_t> ids,
rust::Slice<const float> cr,
rust::Slice<const float> cg,
rust::Slice<const float> cb,
RustWriter& writer);
class CleanShape {
public:
TopoDS_Shape shape;
std::vector<uint64_t> mapping; };
std::unique_ptr<CleanShape> clean_shape_full(const TopoDS_Shape& shape);
std::unique_ptr<TopoDS_Shape> clean_shape_get(const CleanShape& r);
rust::Vec<uint64_t> clean_shape_mapping(const CleanShape& r);
}
#endif