#ifndef __BREP_H_ #define __BREP_H_ /** @brief BREP ライブリラリ ヘッダ @file Brep.h @version @author modified by Fumi.Iseki @par ライセンス LGPL. http://breplibrary.sourceforge.net/ の BRLを改造 */ #ifdef WIN32 #pragma warning(disable:4251) #endif #include "ClassBox.h" #include #include #include "Vector.h" using namespace jbxl; //#define COUNTER_RATE 1000 // カウンタを表示する間隔 //class DllExport std::list; //class DllExport std::basic_string; class DllExport BREP_SOLID; class DllExport BREP_SHELL; class DllExport BREP_FACE; class DllExport BREP_CONTOUR; class DllExport BREP_EDGE; class DllExport BREP_WING; class DllExport BREP_VERTEX; class DllExport OctreeNode; typedef std::list BREP_SHELL_RING; typedef std::list BREP_FACE_RING; typedef std::list BREP_CONTOUR_RING; typedef std::list BREP_EDGE_RING; typedef std::list BREP_WING_RING; typedef std::list BREP_VERTEX_RING; DllExport BREP_WING* BrepCreateWingWithoutContour(BREP_VERTEX* vertex1, BREP_VERTEX* vertex2); DllExport BREP_EDGE* BrepFindEdge(BREP_VERTEX* vertex1, BREP_VERTEX* vertex2); DllExport BREP_EDGE* CreateEdge(BREP_VERTEX* v1, BREP_VERTEX* v2); DllExport BREP_VERTEX* AddVertex2Octree(BREP_VERTEX* vertex, OctreeNode* octree); DllExport void ComputeVertexNormal(BREP_VERTEX* vert); DllExport void BrepConnectWingToVertex(BREP_WING* wing); DllExport void BrepDestroyWing(BREP_WING* wing); DllExport int VertexCompare(BREP_VERTEX* v1, BREP_VERTEX* v2); DllExport BREP_WING* BrepEdgeOtherWing(BREP_WING* wing); //DllExport void FaceClose(BREP_VERTEX *vertex); /********************************* BREP_SOLID *********************************/ class DllExport BREP_SOLID { public: unsigned int facetno; unsigned int vertexno; BREP_SHELL_RING shells; RBound rbound; OctreeNode* octree; CVCounter* counter; ///< 仮想計量カウンタ BREP_CONTOUR_RING contours; BREP_WING_RING wings; public: BREP_SOLID(); ~BREP_SOLID(); void DataCloseCallback(); void ConnectShell(BREP_SHELL* shell); void DisconnectShell(BREP_SHELL* shell); }; /********************************* BREP_SHELL *********************************/ class DllExport BREP_SHELL { public: BREP_SOLID* solid; BREP_FACE_RING faces; RBound rbound; public: BREP_SHELL(BREP_SOLID* pr_solid); ~BREP_SHELL(); void DataCloseCallback(); void ConnectFace(BREP_FACE* face); void DisconnectFace(BREP_FACE* face); }; /********************************* BREP_FACE *********************************/ class DllExport BREP_FACE { public: BREP_SHELL* shell; BREP_CONTOUR_RING outer_contours; VECTOR normal; RBound rbound; double d; ///< 定数,原点から平面への距離*(-1) double tolerance; public: BREP_FACE(BREP_SHELL* pr_shell); ~BREP_FACE(); void DataCloseCallback(); void ConnectContour(BREP_CONTOUR* contour); void DisconnectContour(BREP_CONTOUR* contour); void ComputePlaneEquation(); }; /********************************* BREP_CONTOUR *********************************/ class DllExport BREP_CONTOUR { public: BREP_FACE* face; BREP_WING* wing; RBound rbound; VECTOR normal; int dup_edge; ///< 多重エッジの数. public: BREP_CONTOUR(BREP_FACE* pr_face); ~BREP_CONTOUR(); void DataCloseCallback(); void ConnectWing(BREP_WING* wing); void DisconnectWing(BREP_WING* wing); void DestroyWings(); void IterateWings (void (*func)(BREP_WING*)); void IterateVertices(void (*func)(BREP_VERTEX*)); void ComputeNormal(); BREP_WING* CreateWing(BREP_VERTEX* vertex1, BREP_VERTEX* vertex2); }; /********************************* BREP_WING *********************************/ class DllExport BREP_WING { public: BREP_VERTEX* vertex; ///< Start of Vertex BREP_WING* prev; BREP_WING* next; BREP_EDGE* edge; BREP_CONTOUR* contour; public: BREP_WING(BREP_VERTEX* v); ~BREP_WING() {} }; /********************************* BREP_EDGE *********************************/ class DllExport BREP_EDGE { public: BREP_WING* wing1; BREP_WING* wing2; VECTOR center; BREP_EDGE_RING* edge_ring; ///< 多重エッジのリストへのポインタ bool complete; ///< 完全なエッジ.2つの Wingは共に使用されている. double tolerance; public: BREP_EDGE(BREP_VERTEX* vertex1, BREP_VERTEX* vertex2); ~BREP_EDGE(); void DataCloseCallback(); }; /********************************* BREP_VERTEX *********************************/ class DllExport BREP_VERTEX { public: BREP_WING_RING wing_ring; VECTOR point; VECTOR normal; double tolerance; public: BREP_VERTEX(); ~BREP_VERTEX(); void DataCloseCallback(); void DisconnectWing(BREP_WING* wing); void ComputeNormal(); void ComputeTolerance(); // [copy] void IterateWings(void (*func)(BREP_WING*)); }; /********************************* OctreeNode *********************************/ class DllExport OctreeNode { public: BREP_SOLID* solid; private: BREP_VERTEX* vertex; OctreeNode* child[8]; public: // /// OctreeNodeのコンストラクタは,新たに領域を作らずにポインタをコピーすることに注意!! OctreeNode(BREP_VERTEX* new_vertex, BREP_SOLID* sld/*=NULL*/); ~OctreeNode(); // /// Octreeに Vertex new_vertexそのものを登録する.登録した OctreeNodeを返す. /// ^^^^^^^^ /// 既に同じ位置のVertexが登録済みの場合は,その OctreeNodeを返す. /// AddWithDuplicates() とは戻り値が違うので注意する. OctreeNode* AddWithUnique(BREP_VERTEX* new_vertex); // /// Octreeに Vertex new_vertex そのものを登録する.重複登録を許す. ^^^^^^^^ /// Octreeのトップのポインタを返す. OctreeNode* AddWithDuplicates(BREP_VERTEX* new_vertex); /// /// Vertex element と同じ位置にある Vertexを含むノードを返す. OctreeNode* FindSubtree(BREP_VERTEX* element); // // [copy] /// Vertex element と同じ位置にある Vertexを返す. BREP_VERTEX* Find(BREP_VERTEX* element); // // [copy] void Iterate(void (*func)(BREP_VERTEX*)); friend BREP_VERTEX* AddVertex2Octree(BREP_VERTEX* vertex, OctreeNode* octree); }; #endif