/** * @file * @brief IO of a 3D scan for leica ASCII file format with relectance values. * @author Sven Albrecht. Institute of Computer Science, University of Osnabrueck, Germany. */ #ifndef __SCAN_IO_CAD_H__ #define __SCAN_IO_CAD_H__ #include using std::string; #include using std::vector; #include #include #include #include #include "scan_io.h" #include #include namespace po = boost::program_options; // to reduce typing effort namespace fs = boost::filesystem; // to reduce typing effort /** * @brief 3D scan loader for 1 UOS Scan and multiple .stl files * * The compiled class is available as shared object file */ class ScanIO_CAD : public ScanIO { // default values for parameters / flags / etc // sampling parameters static constexpr bool STD_STORE_CAD = false; // don't save sampling static constexpr float STD_SAMPLE_DIST = 0.5f; // point distance of 0.5 (cm) static constexpr bool STD_RND_SAMP = true; // use random sampling // coordinate order static constexpr unsigned int STD_X_INDEX = 0; // cad x coord = uos x coord static constexpr unsigned int STD_Y_INDEX = 2; // cad y coord = uos z coord static constexpr unsigned int STD_Z_INDEX = 1; // cad z coord = uos y coord // scale factors static constexpr float STD_SCALE_FACTOR = 0.1f; // general scale factor static constexpr float STD_X_SCALE = 0.1f; // scale for x axis static constexpr float STD_Y_SCALE = 0.1f; // scale for y axis static constexpr float STD_Z_SCALE = 0.1f; // scale for z axis static constexpr bool STD_COMBINE_SCALES = false; // combine scale factors? static constexpr bool STD_INVERT_AXIS = false; // default inversion for axes public: /** * @brief Default constructor to initialize the member varibales with * their default values. */ ScanIO_CAD(void); virtual int readScans(int start, int end, string &dir, int maxDist, int minDist, double *euler, vector &ptss); private: /** * @brief method to read a scan in regular UOS .3d file format * * @param scan_in the (opened) filestream for the .3d file * @param maxDist the maximal distance threshold from the origin for points * @param minDist the minimal distance threshold from the origin for points * @param points the vector containing the read scan points * */ void read3DScan (std::ifstream &scan_in, int maxDist, int minDist, vector &points); /** * @brief function to create a surface sampling from a given .stl file * * @param scan_in the (opened) filestream for the .stl file * @param points the vector containing the resultant surface sample * @return true if the surface sample could be created, false otherwise */ bool createSamplingFromSTL (std::ifstream &scan_in, vector &points); /** * @brief Function to check if a opened .stl file contains binary or * ASCII data. * * @param scan_in reference to the (opened) filestream for the .stl file * * @return true if the filestream contains an ASCII encoded .stl file, * false otherwise */ bool hasASCIIHeader (std::ifstream &scan_in); /** * @brief Function to parse an ASCII encoded .stl file and create a * 3D surface sampling of it. * * @param scan_in the (opened) filestream containint the .stl information * @param points used to store the 3D points of the surface sampling * @return true if the file could be parsed successfully, false otherwise */ bool parseASCII (std::ifstream &scan_in, vector &points); /** * @brief Function to parse an binary encoded .stl file and create a * 3D surface sampling of it. * * @param scan_in the (opened) filestream containint the .stl information * @param points used to store the 3D points of the surface sampling * @return true if the file could be parsed successfully, false otherwise */ bool parseBinary (std::ifstream &scan_in, vector &points); /** * @brief Method to create a point sampling of a face (i.e. triangle). * * @param vertex1 the first corner of the triangle * @param vertex2 the second corner of the triangle * @param vertex3 the third corner of the triangle * @param points reference to the Point vector, where the sample points * are stored */ void createSampingForFace (float* vertex1, float* vertex2, float* vertex3, vector &points); /** * @brief Method to store the point sampling to the UOS .3d file format. * The resultant .3d file will have the same name as the original .stl * file apart from the file extension. * * @param filename the name of the .stl file * @param points a reference to the vector containing the point * information to be stored */ void storeSamplingTo3D (std::string filename, vector &points); /** * @brief Computes the dot product of two 3D vectors given as float*. * * @param vec1 the first 3D vector as a float array * @param vec2 the second 3D vector as a float array * * @return the dot product of the two vectors */ static float dotProd (const float* vec1, const float* vec2); /** * @brief Method to parse a config file. * The config file needs to have INI file similar syntax. If a parsing * error occurs a help with all available options will be printed to the * console and the program will terminate without matching * * @param config A filestream to the config file */ void parseConfig (std::ifstream &config); /** * @brief Utility method to convert the data of a point in CAD coordinates * to the slam coordinate system. * This can involve the change of coordinate order, axis direction and * scaling (of all or single coordinates), depending on the configuration * passed via config file. * @param raw_data A 3D point read from the CAD file as a float array * @param vertex The resulting 3D point after all specified * operations have taken place */ void copyRawData2Vertex (float *raw_data, float *vertex); // member variables to hold the indices used in data conversion unsigned int x_index; unsigned int y_index; unsigned int z_index; // bools to determine if an axis should be inverted during data conversion bool invert_x; bool invert_y; bool invert_z; // scale factors (global and individual) for data conversion float scale_factor; float x_scale; float y_scale; float z_scale; // determines if individual scale factors should be used bool individual_scale; // determines if individual scaling should be combined with // the global scale factor bool combine_scales; // determines if random sampling should be used for surface sampling bool random_sampling; // determines if the sampled CAD model is stored as a .3d file bool store_cad; // sets the distance between sample points (determines sample density) float sample_point_dist; // option description for easier parsing of config po::options_description _op_descr; po::variables_map _vmap; std::vector _stl_files; size_t _stl_files_pos; /** * @brief Method to set up the option description. * All allowed parameters with their default values should be * initialized here. */ void setUpOptionDescription (void); void parseDirForAllSTL (std::string &directory_name); bool getNextSTLFromDir (fs::path &stl_file); }; // Since this shared object file is loaded on the fly, we // need class factories // the types of the class factories typedef ScanIO* create_sio(); typedef void destroy_sio(ScanIO*); #endif