00001
00012 #include "STL.h"
00013
00014
00015 using namespace jbxl;
00016
00017
00025 DllExport STLData* jbxl::ReadSTLFile(char* fname, long int* fno)
00026 {
00027 FILE* fp;
00028 struct stat stbuf;
00029 STLData* stldata;
00030 unsigned int temp;
00031
00032 fp = fopen(fname, "rb");
00033 if (fp==NULL) return NULL;
00034 fseek(fp, 80, SEEK_SET);
00035 fread(&temp, 4, 1, fp);
00036 fclose(fp);
00037 *fno = (long int)temp;
00038
00039 stat(fname, &stbuf);
00040 if (stbuf.st_size == (*fno)*50+84) {
00041 stldata = ReadSTLFileB(fname, fno);
00042 }
00043 else {
00044 stldata = ReadSTLFileA(fname, fno);
00045 }
00046
00047 if (stldata==NULL) {
00048 if (*fno!=0) {
00049 DEBUG_MODE PRINT_MESG("ReadSTLFile: メモリの確保に失敗.\n");
00050 }
00051 else {
00052 DEBUG_MODE PRINT_MESG("ReadSTLFile: データの読み込みに失敗.\n");
00053 }
00054 }
00055 else {
00056 DEBUG_MODE PRINT_MESG("ReadSTLFile: file name = %s\n", fname);
00057 DEBUG_MODE PRINT_MESG("ReadSTLFile: read facet No. = %d\n", *fno);
00058 }
00059
00060 return stldata;
00061 }
00062
00063
00064
00073 DllExport int jbxl::WriteSTLFile (char* fname, BREP_SOLID* solid, bool ascii)
00074 {
00075 int nn;
00076
00077 if (ascii) nn = WriteSTLFileA(fname, solid);
00078 else nn = WriteSTLFileB(fname, solid);
00079
00080 if (nn<0) DEBUG_MODE PRINT_MESG("WriteSTLFile: ファイルオープンエラー.\n");
00081 return nn;
00082 }
00083
00084
00093 DllExport int jbxl::WriteSTLFile (char* fname, BREP_SOLID_LIST solid_list, bool ascii)
00094 {
00095 int nn;
00096
00097 if (ascii) nn = WriteSTLFileA(fname, solid_list);
00098 else nn = WriteSTLFileB(fname, solid_list);
00099
00100 if (nn<0) DEBUG_MODE PRINT_MESG("WriteSTLFile: ファイルオープンエラー.\n");
00101 return nn;
00102 }
00103
00104
00105
00112 DllExport STLData* jbxl::ReadSTLFileA(char* fname, long int* fno)
00113 {
00114 FILE* fp;
00115 STLData* stldata = NULL;
00116 float vect[3];
00117 char buffer[LBUF], dummy[LBUF], *pbuf;
00118 int vno=0;
00119
00120
00121 *fno = 0;
00122 fp = fopen(fname, "r");
00123 if (fp==NULL) return NULL;
00124
00125 fgets(buffer, LBUF, fp);
00126 while (!feof(fp)) {
00127 pbuf = buffer;
00128 while(*pbuf==' '||*pbuf==CHAR_TAB) pbuf++;
00129
00130 if (!strncasecmp(pbuf, "facet ", 6)) (*fno)++;
00131 if (!strncasecmp(pbuf, "vertex ", 7)) vno++;
00132 fgets(buffer, LBUF, fp);
00133 }
00134 fclose(fp);
00135
00136
00137 if (vno!=0 && vno==(*fno)*3) {
00138 stldata = (STLData*)malloc(sizeof(STLData)*(*fno));
00139 }
00140 if (stldata==NULL) {
00141 *fno = 0;
00142 return NULL;
00143 }
00144
00145
00146 int i=0, j=0;
00147 fp = fopen(fname, "r");
00148 if (fp==NULL) return NULL;
00149
00150 fgets(buffer, LBUF, fp);
00151 while (!feof(fp)) {
00152 pbuf = buffer;
00153 while(*pbuf==' '||*pbuf==CHAR_TAB) pbuf++;
00154
00155 if (!strncasecmp(pbuf, "facet ", 6)) {
00156 sscanf(buffer, "%s %s %f %f %f", dummy, dummy, &vect[0], &vect[1], &vect[2]);
00157 for (int k=0; k<3; k++) stldata[i].vect[k] = vect[k];
00158 j = 3;
00159 }
00160 else if (!strncasecmp(pbuf, "vertex ", 7) && j>=3 && j<12) {
00161 sscanf(buffer, "%s %f %f %f", dummy, &vect[0], &vect[1], &vect[2]);
00162 for (int k=0; k<3; k++) stldata[i].vect[j+k] = vect[k];
00163 j += 3;
00164 if (j==12) i++;
00165 }
00166 fgets(buffer, LBUF, fp);
00167 }
00168 fclose(fp);
00169
00170 return stldata;
00171 }
00172
00173
00174
00180 DllExport STLData* jbxl::ReadSTLFileB(char* fname, long int* fno)
00181 {
00182 FILE* fp;
00183 char message[81];
00184 tmpSTLData* tmp_stldata;
00185 STLData* stldata;
00186 STLData* exdata;
00187
00188 fp = fopen(fname, "rb");
00189 if (fp==NULL) return NULL;
00190 fread(message, 80, 1, fp);
00191 message[80] = '\0';
00192
00193 fread(fno, 4, 1, fp);
00194 tmp_stldata = (tmpSTLData*)malloc(sizeof(tmpSTLData)*(*fno));
00195 if (tmp_stldata==NULL) return NULL;
00196 fread(tmp_stldata, sizeof(tmpSTLData), *fno, fp);
00197 fclose(fp);
00198
00199 stldata = (STLData*)malloc(sizeof(STLData)*(*fno));
00200 if (stldata==NULL) {
00201 free(tmp_stldata);
00202 return NULL;
00203 }
00204
00205 for (int i=0; i<(*fno); i++) {
00206 exdata = (STLData*)(&tmp_stldata[i]);
00207 for (int j=0; j<12; j++) {
00208 stldata[i].vect[j] = exdata->vect[j];
00209 }
00210 }
00211
00212 free(tmp_stldata);
00213 return stldata;
00214 }
00215
00216
00217
00223 DllExport int jbxl::WriteSTLFileA(char* fname, BREP_SOLID* solid)
00224 {
00225 FILE* fp;
00226 int nn = 0;
00227
00228 fp = fopen(fname, "w");
00229 if (fp==NULL) return -1;
00230
00231 fprintf(fp, "solid %s\n", fname);
00232
00233 BREP_CONTOUR_LIST::iterator icon;
00234 for (icon=solid->contours.begin(); icon!=solid->contours.end(); icon++){
00235 fprintf(fp, "facet normal %g %g %g\n", (*icon)->normal.x, (*icon)->normal.y, (*icon)->normal.z);
00236 fprintf(fp, " outer loop\n");
00237
00238 BREP_WING* wing = (*icon)->wing;
00239 for (int i=0; i<3; i++) {
00240 Vector<double> vect = wing->vertex->point;
00241 fprintf(fp, " vertex %g %g %g\n", vect.x, vect.y, vect.z);
00242 wing = wing->next;
00243 }
00244 fprintf(fp," endloop\n");
00245 fprintf(fp,"endfacet\n");
00246 nn++;
00247 }
00248 fprintf(fp, "endsolid %s\n", fname);
00249 fclose(fp);
00250
00251 return nn;
00252 }
00253
00254
00255
00261 DllExport int jbxl::WriteSTLFileB(char* fname, BREP_SOLID* solid)
00262 {
00263 FILE* fp;
00264 int fno;
00265 char message[80]="STL Binary Data Program by Fumi.Iseki";
00266 STLData stldata;
00267
00268 fp = fopen(fname, "wb");
00269 if (fp==NULL) return -1;
00270
00271 fno = (int)solid->contours.size();
00272 fwrite(message, 80, 1, fp);
00273 fwrite(&fno, 4, 1, fp);
00274
00275 BREP_CONTOUR_LIST::iterator icon;
00276 for (icon=solid->contours.begin(); icon!=solid->contours.end(); icon++){
00277 stldata.vect[0] = (float)(*icon)->normal.x;
00278 stldata.vect[1] = (float)(*icon)->normal.y;
00279 stldata.vect[2] = (float)(*icon)->normal.z;
00280
00281 BREP_WING* wing = (*icon)->wing;
00282 for (int i=0; i<3; i++) {
00283 Vector<double> vect = wing->vertex->point;
00284 stldata.vect[3*i+3] = (float)vect.x;
00285 stldata.vect[3*i+4] = (float)vect.y;
00286 stldata.vect[3*i+5] = (float)vect.z;
00287 wing = wing->next;
00288 }
00289 fwrite(&stldata, 50, 1, fp);
00290 }
00291 fclose(fp);
00292
00293 return fno;
00294 }
00295
00296
00297
00303 DllExport int jbxl::WriteSTLFileA(char* fname, BREP_SOLID_LIST solid_list)
00304 {
00305 FILE* fp;
00306 int nn = 0;
00307
00308 fp = fopen(fname, "wa");
00309 if (fp==NULL) return -1;
00310
00311 fprintf(fp, "solid %s\n", fname);
00312
00313 BREP_SOLID_LIST::iterator isolid;
00314 for (isolid=solid_list.begin(); isolid!=solid_list.end(); isolid++){
00315
00316 BREP_CONTOUR_LIST::iterator icon;
00317 for (icon=(*isolid)->contours.begin(); icon!=(*isolid)->contours.end(); icon++){
00318 fprintf(fp, "facet normal %g %g %g\n", (*icon)->normal.x, (*icon)->normal.y, (*icon)->normal.z);
00319 fprintf(fp, " outer loop\n");
00320
00321 BREP_WING* wing = (*icon)->wing;
00322 for (int i=0; i<3; i++) {
00323 Vector<double> vect = wing->vertex->point;
00324 fprintf(fp, " vertex %g %g %g\n", vect.x, vect.y, vect.z);
00325 wing = wing->next;
00326 }
00327 fprintf(fp," endloop\n");
00328 fprintf(fp,"endfacet\n");
00329 nn++;
00330 }
00331 }
00332 fprintf(fp, "endsolid %s\n", fname);
00333 fclose(fp);
00334
00335 return nn;
00336 }
00337
00338
00339
00345 DllExport int jbxl::WriteSTLFileB(char* fname, BREP_SOLID_LIST solid_list)
00346 {
00347 FILE* fp;
00348 int fno = 0;
00349 char message[80]="STL Binary Data Program by Fumi.Iseki";
00350 STLData stldata;
00351
00352 fp = fopen(fname, "wb");
00353 if (fp==NULL) return -1;
00354
00355 BREP_SOLID_LIST::iterator isolid;
00356 for (isolid=solid_list.begin(); isolid!=solid_list.end(); isolid++){
00357 fno += (int)((*isolid)->contours.size());
00358 }
00359 fwrite(message, 80, 1, fp);
00360 fwrite(&fno, 4, 1, fp);
00361
00362
00363 for (isolid=solid_list.begin(); isolid!=solid_list.end(); isolid++){
00364
00365 BREP_CONTOUR_LIST::iterator icon;
00366 for (icon=(*isolid)->contours.begin(); icon!=(*isolid)->contours.end(); icon++){
00367 stldata.vect[0] = (float)(*icon)->normal.x;
00368 stldata.vect[1] = (float)(*icon)->normal.y;
00369 stldata.vect[2] = (float)(*icon)->normal.z;
00370
00371 BREP_WING* wing = (*icon)->wing;
00372 for (int i=0; i<3; i++) {
00373 Vector<double> vect = wing->vertex->point;
00374 stldata.vect[3*i+3] = (float)vect.x;
00375 stldata.vect[3*i+4] = (float)vect.y;
00376 stldata.vect[3*i+5] = (float)vect.z;
00377 wing = wing->next;
00378 }
00379 fwrite(&stldata, 50, 1, fp);
00380 }
00381 }
00382 fclose(fp);
00383
00384 return fno;
00385 }
00386
00387
00388
00395 DllExport void jbxl::println_FacetAsciiSTL(BREP_CONTOUR* contour)
00396 {
00397 BREP_WING* wing = contour->wing;
00398
00399 PRINT_MESG("facet normal %g %g %g\n", contour->normal.x, contour->normal.y, contour->normal.z);
00400 PRINT_MESG("outer loop\n");
00401 for (int i=0; i<3; i++) {
00402 Vector<double> vect = wing->vertex->point;
00403 PRINT_MESG("vertex %g %g %g\n", vect.x, vect.y, vect.z);
00404 wing = wing->next;
00405 }
00406 PRINT_MESG("endloop\n");
00407 PRINT_MESG("endfacet\n");
00408 }
00409
00410
00411 DllExport void jbxl::freeSTL(STLData* stldata)
00412 {
00413 if (stldata!=NULL) free(stldata);
00414 }
00415
00416