------------------------------------------------------------ revno: 3661 author: Anton Gladky <[email protected]> committer: Anton Gladky <[email protected]> timestamp: Thu 2015-05-28 20:32:30 +0200 message: Move STLReader into STLImporter Should probably removed in the future due to external libadmesh. removed: lib/import/ lib/import/STLReader.hpp lib/import/utils.hpp modified: pkg/dem/STLImporter.cpp pkg/dem/STLImporter.hpp
-- lp:yade https://code.launchpad.net/~yade-pkg/yade/git-trunk Your team Yade developers is subscribed to branch lp:yade. To unsubscribe from this branch go to https://code.launchpad.net/~yade-pkg/yade/git-trunk/+edit-subscription
=== removed directory 'lib/import' === removed file 'lib/import/STLReader.hpp' --- lib/import/STLReader.hpp 2014-07-02 16:18:24 +0000 +++ lib/import/STLReader.hpp 1970-01-01 00:00:00 +0000 @@ -1,234 +0,0 @@ -/************************************************************************* -* Copyright (C) 2008 by Sergei Dorofeenko * -* [email protected] * -* * -* This program is free software; it is licensed under the terms of the * -* GNU General Public License v2 or later. See file LICENSE for details. * -*************************************************************************/ -#pragma once - -#include <stdio.h> -#include<string.h> -#include <set> -#include <vector> -#include <cmath> -#include "utils.hpp" - -class STLReader { - public: - - // if it is binary there are 80 char of comment, the number fn of faces and then exactly fn*4*3 bytes. - enum {STL_LABEL_SIZE=80}; - - template<class OutV, class OutE, class OutF, class OutN> - bool open(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals); - - float tolerance; - - protected: - template<class OutV, class OutE, class OutF, class OutN> - bool open_binary(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals); - - template<class OutV, class OutE, class OutF, class OutN> - bool open_ascii(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals); - - struct Vrtx { - float pos[3]; - Vrtx(){} - Vrtx(float x, float y, float z) {pos[0]=x; pos[1]=y; pos[2]=z;} - bool operator< (const Vrtx& v) const - { - return memcmp(pos, v.pos,3*sizeof(float)) < 0; - } - float operator[](int id) const { return pos[id]; } - float& operator[](int id) { return pos[id]; } - }; - - class IsDifferent { - float tolerance; - public: - IsDifferent(float _tolerance): tolerance(_tolerance){} - bool operator() (const Vrtx& v1, const Vrtx& v2) - { - if ( std::abs(v1[0]-v2[0])<tolerance - && std::abs(v1[1]-v2[1])<tolerance - && std::abs(v1[2]-v2[2])<tolerance ) - return false; - return true; - } - }; -}; - -template<class OutV, class OutE, class OutF, class OutN> -bool STLReader::open(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals) -{ - FILE *fp; - bool binary=false; - fp = fopen(filename, "r"); - if(fp == NULL) - return false; - - /* Find size of file */ - fseek(fp, 0, SEEK_END); - int file_size = ftell(fp); - int facenum; - /* Check for binary or ASCII file */ - fseek(fp, STL_LABEL_SIZE, SEEK_SET); - size_t res=fread(&facenum, sizeof(int), 1, fp); - int expected_file_size=STL_LABEL_SIZE + 4 + (sizeof(short)+4*sizeof(float) )*facenum ; - if(file_size == expected_file_size) binary = true; - unsigned char tmpbuf[128]; - res=fread(tmpbuf,sizeof(tmpbuf),1,fp); - if (res) - { - for(size_t i = 0; i < sizeof(tmpbuf); i++) - { - if(tmpbuf[i] > 127) - { - binary=true; - break; - } - } - } - // Now we know if the stl file is ascii or binary. - fclose(fp); - if(binary) return open_binary(filename,vertices,edges,facets,normals); - else return open_ascii(filename,vertices,edges,facets,normals); -} - -template<class OutV, class OutE, class OutF, class OutN> -bool STLReader::open_ascii(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals) -{ - FILE *fp; - fp = fopen(filename, "r"); - if(fp == NULL) - return false; - - /* Skip the first line of the file */ - while(getc(fp) != '\n'); - - vector<Vrtx> vcs; - set<pair<int,int> > egs; - - /* Read a single facet from an ASCII .STL file */ - while(!feof(fp)) - { - float n[3]; - Vrtx v[3]; - fscanf(fp, "%*s %*s %f %f %f\n", &n[0], &n[1], &n[2]); - fscanf(fp, "%*s %*s"); - fscanf(fp, "%*s %f %f %f\n", &v[0][0], &v[0][1], &v[0][2]); - fscanf(fp, "%*s %f %f %f\n", &v[1][0], &v[1][1], &v[1][2]); - fscanf(fp, "%*s %f %f %f\n", &v[2][0], &v[2][1], &v[2][2]); - fscanf(fp, "%*s"); // end loop - fscanf(fp, "%*s"); // end facet - if(feof(fp)) break; - - int vid[3]; - for(int i=0;i<3;++i) - { - (normals++) = n[i]; - bool is_different=true; - IsDifferent isd(tolerance); - int j=0; - for(int ej=vcs.size(); j<ej; ++j) - if ( !(is_different = isd(v[i],vcs[j])) ) break; - if (is_different) - { - vid[i] = vcs.size(); - vcs.push_back(v[i]); - } - else - vid[i] = j; - (facets++) = vid[i]; - } - egs.insert(minmax(vid[0], vid[1])); - egs.insert(minmax(vid[1], vid[2])); - egs.insert(minmax(vid[2], vid[0])); - } - fclose(fp); - - for(vector<Vrtx>::iterator it=vcs.begin(),end=vcs.end(); it!=end; ++it) - { - (vertices++) = (*it)[0]; - (vertices++) = (*it)[1]; - (vertices++) = (*it)[2]; - } - for(set<pair<int,int> >::iterator it=egs.begin(),end=egs.end(); it!=end; ++it) - { - (edges++) = it->first; - (edges++) = it->second; - } - return true; -} - -template<class OutV, class OutE, class OutF, class OutN> -bool STLReader::open_binary(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals) -{ - FILE *fp; - fp = fopen(filename, "rb"); - if(fp == NULL) - { - return false; - } - - int facenum; - fseek(fp, STL_LABEL_SIZE, SEEK_SET); - int res=fread(&facenum, sizeof(int), 1, fp); - - vector<Vrtx> vcs; - set<pair<int,int> > egs; - - if (res) - { - // For each triangle read the normal, the three coords and a short set to zero - for(int i=0;i<facenum;++i) - { - short attr; - float n[3]; - Vrtx v[3]; - res=fread(&n,3*sizeof(float),1,fp); - res=fread(&v,sizeof(Vrtx),3,fp); - res=fread(&attr,sizeof(short),1,fp); - - //FIXME: Убрать дублирование кода с open_ascii - int vid[3]; - for(int i=0;i<3;++i) - { - (normals++) = n[i]; - bool is_different=true; - IsDifferent isd(tolerance); - int j=0; - for(int ej=vcs.size(); j<ej; ++j) - if ( !(is_different = isd(v[i],vcs[j])) ) break; - if (is_different) - { - vid[i] = vcs.size(); - vcs.push_back(v[i]); - } - else - vid[i] = j; - (facets++) = vid[i]; - } - egs.insert(minmax(vid[0], vid[1])); - egs.insert(minmax(vid[1], vid[2])); - egs.insert(minmax(vid[2], vid[0])); - } - } - - fclose(fp); - - for(vector<Vrtx>::iterator it=vcs.begin(),end=vcs.end(); it!=end; ++it) - { - (vertices++) = (*it)[0]; - (vertices++) = (*it)[1]; - (vertices++) = (*it)[2]; - } - for(set<pair<int,int> >::iterator it=egs.begin(),end=egs.end(); it!=end; ++it) - { - (edges++) = it->first; - (edges++) = it->second; - } - return true; -} - === removed file 'lib/import/utils.hpp' --- lib/import/utils.hpp 2014-07-02 16:18:24 +0000 +++ lib/import/utils.hpp 1970-01-01 00:00:00 +0000 @@ -1,19 +0,0 @@ -#pragma once - -#include<utility> - -template<class T> -std::pair<T,T> minmax(const T &a, const T &b) -{ - return (a<b) ? std::pair<T,T>(a,b) : std::pair<T,T>(b,a); -} - -template<class T> -void minmaxEx(T &a, T &b) -{ - if (a<b) - { - T t=a; a=b; b=t; - } -} - === modified file 'pkg/dem/STLImporter.cpp' --- pkg/dem/STLImporter.cpp 2014-10-15 06:44:01 +0000 +++ pkg/dem/STLImporter.cpp 2015-05-28 18:32:30 +0000 @@ -7,7 +7,6 @@ *************************************************************************/ #include"STLImporter.hpp" #include<pkg/dem/Shop.hpp> -#include<lib/import/STLReader.hpp> CREATE_LOGGER(STLImporter); === modified file 'pkg/dem/STLImporter.hpp' --- pkg/dem/STLImporter.hpp 2014-10-15 06:44:01 +0000 +++ pkg/dem/STLImporter.hpp 2015-05-28 18:32:30 +0000 @@ -17,3 +17,228 @@ DECLARE_LOGGER; }; +template<class T> +std::pair<T,T> minmax(const T &a, const T &b) +{ + return (a<b) ? std::pair<T,T>(a,b) : std::pair<T,T>(b,a); +} + + + +class STLReader { + public: + + // if it is binary there are 80 char of comment, the number fn of faces and then exactly fn*4*3 bytes. + enum {STL_LABEL_SIZE=80}; + + template<class OutV, class OutE, class OutF, class OutN> + bool open(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals); + + float tolerance; + + protected: + template<class OutV, class OutE, class OutF, class OutN> + bool open_binary(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals); + + template<class OutV, class OutE, class OutF, class OutN> + bool open_ascii(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals); + + struct Vrtx { + float pos[3]; + Vrtx(){} + Vrtx(float x, float y, float z) {pos[0]=x; pos[1]=y; pos[2]=z;} + bool operator< (const Vrtx& v) const + { + return memcmp(pos, v.pos,3*sizeof(float)) < 0; + } + float operator[](int id) const { return pos[id]; } + float& operator[](int id) { return pos[id]; } + }; + + class IsDifferent { + float tolerance; + public: + IsDifferent(float _tolerance): tolerance(_tolerance){} + bool operator() (const Vrtx& v1, const Vrtx& v2) + { + if ( std::abs(v1[0]-v2[0])<tolerance + && std::abs(v1[1]-v2[1])<tolerance + && std::abs(v1[2]-v2[2])<tolerance ) + return false; + return true; + } + }; +}; + +template<class OutV, class OutE, class OutF, class OutN> +bool STLReader::open(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals) +{ + FILE *fp; + bool binary=false; + fp = fopen(filename, "r"); + if(fp == NULL) + return false; + + /* Find size of file */ + fseek(fp, 0, SEEK_END); + int file_size = ftell(fp); + int facenum; + /* Check for binary or ASCII file */ + fseek(fp, STL_LABEL_SIZE, SEEK_SET); + size_t res=fread(&facenum, sizeof(int), 1, fp); + int expected_file_size=STL_LABEL_SIZE + 4 + (sizeof(short)+4*sizeof(float) )*facenum ; + if(file_size == expected_file_size) binary = true; + unsigned char tmpbuf[128]; + res=fread(tmpbuf,sizeof(tmpbuf),1,fp); + if (res) + { + for(size_t i = 0; i < sizeof(tmpbuf); i++) + { + if(tmpbuf[i] > 127) + { + binary=true; + break; + } + } + } + // Now we know if the stl file is ascii or binary. + fclose(fp); + if(binary) return open_binary(filename,vertices,edges,facets,normals); + else return open_ascii(filename,vertices,edges,facets,normals); +} + +template<class OutV, class OutE, class OutF, class OutN> +bool STLReader::open_ascii(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals) +{ + FILE *fp; + fp = fopen(filename, "r"); + if(fp == NULL) + return false; + + /* Skip the first line of the file */ + while(getc(fp) != '\n'); + + vector<Vrtx> vcs; + set<pair<int,int> > egs; + + /* Read a single facet from an ASCII .STL file */ + while(!feof(fp)) + { + float n[3]; + Vrtx v[3]; + fscanf(fp, "%*s %*s %f %f %f\n", &n[0], &n[1], &n[2]); + fscanf(fp, "%*s %*s"); + fscanf(fp, "%*s %f %f %f\n", &v[0][0], &v[0][1], &v[0][2]); + fscanf(fp, "%*s %f %f %f\n", &v[1][0], &v[1][1], &v[1][2]); + fscanf(fp, "%*s %f %f %f\n", &v[2][0], &v[2][1], &v[2][2]); + fscanf(fp, "%*s"); // end loop + fscanf(fp, "%*s"); // end facet + if(feof(fp)) break; + + int vid[3]; + for(int i=0;i<3;++i) + { + (normals++) = n[i]; + bool is_different=true; + IsDifferent isd(tolerance); + int j=0; + for(int ej=vcs.size(); j<ej; ++j) + if ( !(is_different = isd(v[i],vcs[j])) ) break; + if (is_different) + { + vid[i] = vcs.size(); + vcs.push_back(v[i]); + } + else + vid[i] = j; + (facets++) = vid[i]; + } + egs.insert(minmax(vid[0], vid[1])); + egs.insert(minmax(vid[1], vid[2])); + egs.insert(minmax(vid[2], vid[0])); + } + fclose(fp); + + for(vector<Vrtx>::iterator it=vcs.begin(),end=vcs.end(); it!=end; ++it) + { + (vertices++) = (*it)[0]; + (vertices++) = (*it)[1]; + (vertices++) = (*it)[2]; + } + for(set<pair<int,int> >::iterator it=egs.begin(),end=egs.end(); it!=end; ++it) + { + (edges++) = it->first; + (edges++) = it->second; + } + return true; +} + +template<class OutV, class OutE, class OutF, class OutN> +bool STLReader::open_binary(const char* filename, OutV vertices, OutE edges, OutF facets, OutN normals) +{ + FILE *fp; + fp = fopen(filename, "rb"); + if (fp == NULL) + { + return false; + } + + int facenum; + fseek(fp, STL_LABEL_SIZE, SEEK_SET); + int res=fread(&facenum, sizeof(int), 1, fp); + + vector<Vrtx> vcs; + set<pair<int,int> > egs; + + if (res) + { + // For each triangle read the normal, the three coords and a short set to zero + for(int i=0;i<facenum;++i) + { + short attr; + float n[3]; + Vrtx v[3]; + res=fread(&n,3*sizeof(float),1,fp); + res=fread(&v,sizeof(Vrtx),3,fp); + res=fread(&attr,sizeof(short),1,fp); + + //FIXME: Убрать дублирование кода с open_ascii + int vid[3]; + for(int i=0;i<3;++i) + { + (normals++) = n[i]; + bool is_different=true; + IsDifferent isd(tolerance); + int j=0; + for(int ej=vcs.size(); j<ej; ++j) + if ( !(is_different = isd(v[i],vcs[j])) ) break; + if (is_different) + { + vid[i] = vcs.size(); + vcs.push_back(v[i]); + } + else + vid[i] = j; + (facets++) = vid[i]; + } + egs.insert(minmax(vid[0], vid[1])); + egs.insert(minmax(vid[1], vid[2])); + egs.insert(minmax(vid[2], vid[0])); + } + } + + fclose(fp); + + for(vector<Vrtx>::iterator it=vcs.begin(),end=vcs.end(); it!=end; ++it) + { + (vertices++) = (*it)[0]; + (vertices++) = (*it)[1]; + (vertices++) = (*it)[2]; + } + for(set<pair<int,int> >::iterator it=egs.begin(),end=egs.end(); it!=end; ++it) + { + (edges++) = it->first; + (edges++) = it->second; + } + return true; +}
_______________________________________________ Mailing list: https://launchpad.net/~yade-dev Post to : [email protected] Unsubscribe : https://launchpad.net/~yade-dev More help : https://help.launchpad.net/ListHelp

