JunkBox_Lib++ (for Windows) 1.10.1
Loading...
Searching...
No Matches
BrepLib.cpp
Go to the documentation of this file.
1
7#include "BrepLib.h"
8
9
10using namespace jbxl;
11
12
14// BrepSolidList
15//
16
18{
19 DEBUG_INFO("INFO: DESTRUCTOR: BrepSolidList");
20}
21
22
24{
25 solid_list.clear();
26}
27
28
30{
31 BREP_SOLID_LIST::iterator isolid;
32 for (isolid=solid_list.begin(); isolid!=solid_list.end(); isolid++) freeBrepSolid(*isolid);
33
34 solid_list.clear();
35}
36
37
39{
40 BREP_SOLID_LIST::iterator isolid;
41 for (isolid=solid_list.begin(); isolid!=solid_list.end(); isolid++) (*isolid)->FreeData();
42
43 solid_list.clear();
44}
45
46
47
49//
50
51/*
52データにソリッドを追加する.
53*/
55{
56 if (mesh==NULL) return 0;
57
58 Vector<double> vertex[3];
59 Vector<double> normal[3];
60
61 BREP_SOLID* solid = new BREP_SOLID();
62 BREP_SHELL* shell = new BREP_SHELL(solid);
63
64 MeshFacetNode* node = mesh->facet;
65 while (node!=NULL) {
66 //
67 for (int num = 0; num < node->num_index - 2; num += 3) {
68 BREP_FACET* facet = new BREP_FACET(shell);
69 //
70 int idx0 = node->data_index[num];
71 int idx1 = node->data_index[num+1];
72 int idx2 = node->data_index[num+2];
73
74 vertex[0] = node->vertex_value[idx0];
75 vertex[1] = node->vertex_value[idx1];
76 vertex[2] = node->vertex_value[idx2];
77 normal[0] = node->normal_value[idx0];
78 normal[1] = node->normal_value[idx1];
79 normal[2] = node->normal_value[idx2];
80
81 BREP_CONTOUR* contour = CreateContourByVector(facet, vertex, normal, NULL, NULL, false);
82 if (contour!=NULL) {
83 solid->contours.push_back(contour);
84 }
85 else {
86 deleteNull(facet);
87 }
88 }
89 node = node->next;
90 }
91
92 int fno = CloseTriSolid(solid, false, NULL);
93 solid->facetno = fno;
94
95 //
96 if (mesh->affineTrans!=NULL) {
97 long int vnum;
98 BREP_VERTEX** vertex_data = GetOctreeVertices(solid->octree, &vnum);
99
100 for (long int i=0; i<vnum; i++) {
101 vertex_data[i]->point = mesh->affineTrans->execTrans (vertex_data[i]->point);
102 vertex_data[i]->normal = mesh->affineTrans->execRotation(vertex_data[i]->normal);
103 }
104 ::free(vertex_data);
105 }
106
107 solid_list.push_back(solid);
108
109 return fno;
110}
111
112
113void BrepSolidList::outputFile(const char* fname, const char* path, bool ascii)
114{
115 char* packname = pack_head_tail_char(get_file_name(fname), ' ');
116 Buffer file_name = make_Buffer_bystr(packname);
117 ::free(packname);
118 //
119 canonical_filename_Buffer(&file_name, TRUE);
120 if (file_name.buf[0]=='.') file_name.buf[0] = '_';
121
122 Buffer out_path;
123 if (path==NULL) out_path = make_Buffer_bystr("./");
124 else out_path = make_Buffer_bystr(path);
125 cat_Buffer(&file_name, &out_path);
126 change_file_extension_Buffer(&out_path, ".stl");
127
128 BREP_SOLID* solid = getMerge(NULL);
129 if (solid!=NULL) {
130 if (ascii) {
131 writeSTLFileA((char*)out_path.buf, solid);
132 }
133 else {
134 writeSTLFileB((char*)out_path.buf, solid);
135 }
136 delete solid;
137 }
138
139 free_Buffer(&file_name);
140 free_Buffer(&out_path);
141
142 return;
143}
144
145
147{
148 BREP_SOLID* solid = new BREP_SOLID();
149 BREP_SHELL* shell = new BREP_SHELL(solid);
150
151 // Counter
152 if (counter!=NULL) {
153 int maxnum = 0;
154 BREP_SOLID_LIST::iterator isolid;
155 for (isolid=solid_list.begin(); isolid!=solid_list.end(); isolid++){
156 BREP_CONTOUR_LIST::iterator icon;
157 for (icon=(*isolid)->contours.begin(); icon!=(*isolid)->contours.end(); icon++){
158 maxnum++;
159 }
160 }
161 counter->GetUsableCounter();
162 counter->Start(maxnum);
163 }
164
165 BREP_SOLID_LIST::iterator isolid;
166 for (isolid=solid_list.begin(); isolid!=solid_list.end(); isolid++){
167 //
168 BREP_CONTOUR_LIST::iterator icon;
169 for (icon=(*isolid)->contours.begin(); icon!=(*isolid)->contours.end(); icon++){
170 Vector<double> vect[3];
171 Vector<double> norm[3];
172 //
173 BREP_WING* wing = (*icon)->wing;
174 for (int i=0; i<3; i++) {
175 vect[i] = wing->vertex->point;
176 norm[i] = wing->vertex->normal;
177 wing = wing->next;
178 }
179 //
180 BREP_FACET* facet = new BREP_FACET(shell);
181 BREP_CONTOUR* contour = CreateContourByVector(facet, vect, norm, NULL, NULL, false);
182 if (contour!=NULL) solid->contours.push_back(contour);
183 else deleteNull(facet);
184 //
185 if (counter!=NULL) counter->StepIt();
186 }
187 }
188
189 int fno = CloseTriSolid(solid, false, NULL);
190 solid->facetno = fno;
191
192 return solid;
193}
BREP (Boundary REPresentation model) Library.
void free_Buffer(Buffer *buf)
Buffer型変数のバッファ部を解放する
Definition buffer.cpp:128
int cat_Buffer(Buffer *src, Buffer *dst)
Buffer変数 srcから dstへバッファを catする.
Definition buffer.cpp:384
#define make_Buffer_bystr(str)
set_Buffer()
Definition buffer.h:57
Vector< T > execTrans(Vector< T > v)
Vector< T > execRotation(Vector< T > v)
OctreeNode * octree
Definition Brep.h:80
BREP_CONTOUR_LIST contours
Contours リスト
Definition Brep.h:83
unsigned int facetno
面の数
Definition Brep.h:74
Vector< double > point
頂点の座標.
Definition Brep.h:260
Vector< double > normal
法線ベクトル.周りの Contour の法線ベクトルの平均.
Definition Brep.h:261
BREP_WING * next
Definition Brep.h:212
BREP_VERTEX * vertex
Start of Vertex.
Definition Brep.h:210
BREP_SOLID * getMerge(CVCounter *counter=NULL)
Definition BrepLib.cpp:146
int addSolid(MeshObjectData *mesh)
Definition BrepLib.cpp:54
void init(void)
Definition BrepLib.cpp:23
BREP_SOLID_LIST solid_list
Definition BrepLib.h:34
virtual ~BrepSolidList(void)
Definition BrepLib.cpp:17
void outputFile(const char *fn, const char *path=NULL, bool asciifile=true)
Definition BrepLib.cpp:113
void free(void)
Definition BrepLib.cpp:29
void clear(void)
Definition BrepLib.cpp:38
virtual void StepIt(int n=1)
カウンタのメモリを増やす
Definition ClassBox.h:171
virtual void Start(int m=100, char *tn=NULL)
カウンタのスタート & タイトル定義
Definition ClassBox.h:169
virtual CVCounter * GetUsableCounter()
現在使用可能な目盛りの有効領域を確保
Definition ClassBox.h:177
MeshObject の Polygonデータ(1面)を格納するクラス.リスト構造を取る.
Vector< double > * normal_value
法線ベクトルデータの並び.要素数は num_vertex
int num_index
頂点の延べ数.num_polygon*MeshObjectData::num_vcount (num_polygon*3)(data_index の要素数)
int * data_index
インデックスデータ.要素数は num_index
MeshFacetNode * next
Vector< double > * vertex_value
頂点データの並び.要素数は num_vertex
AffineTrans< double > * affineTrans
アフィン変換.ここで使用するのは,shift, rotate, scale(size) のみ
MeshFacetNode * facet
FACETデータ(1面のポリゴンデータ)のリストへのポインタ
#define TRUE
Definition common.h:226
Definition Brep.h:29
void freeBrepSolid(BREP_SOLID *&solid)
Definition Brep.h:105
class DllExport BREP_SOLID
Definition Brep.h:32
DllExport int CloseTriSolid(BREP_SOLID *solid, bool check=true, CVCounter *counter=NULL)
Definition TriBrep.cpp:1459
DllExport int writeSTLFileA(char *fname, BREP_SOLID *solid)
Definition STL.cpp:233
class DllExport BREP_FACET
Definition Brep.h:34
class DllExport BREP_SHELL
Definition Brep.h:33
DllExport BREP_VERTEX ** GetOctreeVertices(OctreeNode *octree, long int *vertexno)
Definition Brep.cpp:913
DllExport BREP_CONTOUR * CreateContourByVector(BREP_FACET *facet, Vector< double > *v, Vector< double > *n=NULL, UVMap< double > *uv=NULL, ArrayParam< int > *w=NULL, bool dupli=false)
Definition TriBrep.cpp:684
DllExport int writeSTLFileB(char *fname, BREP_SOLID *solid)
Definition STL.cpp:273
void deleteNull(T &p)
Definition common++.h:39
unsigned char * buf
バッファの先頭へのポインタ.str[bufsz]は必ず 0x00となる.
Definition buffer.h:39
char * get_file_name(const char *str)
フルパスからファイル名へのポインタを取り出す.free() してはいけない.
Definition tools.cpp:2066
char * pack_head_tail_char(char *mesg, char cc)
文字の先頭のcc(複数),TAB, CR, LF.終わりのcc(複数),TAB, CR, LF を削除.要 free()
Definition tools.cpp:1092
#define DEBUG_INFO
デバッグ用出力関数.コンパイル時に削除可能
Definition tools.h:511
void canonical_filename_Buffer(Buffer *fname, int no_dir)
fname の問題になりそうな ASCII文字を '_' に変換する.
Definition xtools.cpp:2057
void change_file_extension_Buffer(Buffer *path, const char *ext)
ファイルの拡張子を extにする.ファイルに拡張子が無い場合は extを付加する
Definition xtools.cpp:1960