Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-09 07:49:39

0001 #pragma once
0002 /**
0003 SMeshGroup.h : collection of SMesh subs and names
0004 ===================================================
0005 
0006 Persists as folder with int keys.
0007 
0008 
0009 **/
0010 struct SMesh ;
0011 struct NPFold ;
0012 
0013 #include "SBitSet.h"
0014 #include <string>
0015 #include <vector>
0016 
0017 
0018 struct SMeshGroup
0019 {
0020     static constexpr const bool DUMP = false ;
0021     std::vector<const SMesh*> subs ;
0022     std::vector<std::string> names ;
0023 
0024     SMeshGroup();
0025 
0026     static SMeshGroup* MakeCopy(const SMeshGroup* src, const SBitSet* elv );
0027     SMeshGroup* copy(const SBitSet* elv=nullptr) const ;
0028 
0029 
0030     NPFold* serialize() const ;
0031     void save(const char* dir) const ;
0032     static SMeshGroup* Import(const NPFold* fold );
0033     void import(const NPFold* fold );
0034 
0035     std::string descRange(const std::vector<std::string>* soname=nullptr) const ;
0036     static std::string DescSubMesh(const std::vector<const SMesh*>& subs, const std::vector<std::string>* soname);
0037     void findSubMesh(std::vector<const SMesh*>& subs, int lvid) const;
0038 
0039 };
0040 
0041 inline SMeshGroup::SMeshGroup(){}
0042 
0043 
0044 
0045 /**
0046 SMeshGroup::MakeCopy
0047 ---------------------
0048 
0049 NB if none of the subs from the src SMeshGroup are selected by elv a nullptr is returned
0050 
0051 **/
0052 
0053 
0054 inline SMeshGroup* SMeshGroup::MakeCopy(const SMeshGroup* src, const SBitSet* elv ) // static
0055 {
0056     size_t s_num_subs = src->subs.size();
0057     size_t s_num_names = src->names.size();
0058     assert( s_num_subs == s_num_names );
0059 
0060     SMeshGroup* dst = nullptr ;
0061     for(size_t i=0 ; i < s_num_subs ; i++ )
0062     {
0063         const SMesh* s_sub = src->subs[i] ;
0064         const std::string& s_name = src->names[i] ;
0065         int s_sub_lvid = s_sub->lvid ;
0066         bool selected = ( elv == nullptr || s_sub_lvid == -1 ) ? true : elv->is_set(s_sub_lvid) ;
0067 
0068         if(DUMP) std::cout
0069             << "SMeshGroup::MakeCopy"
0070             << " i " << i
0071             << " s_name " << s_name
0072             << " s_sub_lvid " << s_sub_lvid
0073             << " s_num_subs " << s_num_subs
0074             << " s_num_names " << s_num_names
0075             << "\n"
0076             ;
0077 
0078         //assert( s_sub_lvid > -1 );
0079         if(!selected) continue ;
0080 
0081         const SMesh* d_sub = s_sub->copy();
0082         std::string d_name = s_name ;
0083 
0084         if(!dst) dst = new SMeshGroup ;
0085         dst->subs.push_back(d_sub) ;
0086         dst->names.push_back(d_name) ;
0087     }
0088     return dst ;
0089 }
0090 
0091 inline SMeshGroup* SMeshGroup::copy(const SBitSet* elv) const
0092 {
0093     return MakeCopy(this, elv);
0094 }
0095 
0096 
0097 
0098 
0099 
0100 
0101 
0102 
0103 
0104 
0105 inline NPFold* SMeshGroup::serialize() const
0106 {
0107     NPFold* fold = new NPFold ;
0108     int num_sub = subs.size();
0109     for(int i=0 ; i < num_sub ; i++)
0110     {
0111         const SMesh* sub = subs[i];
0112         const char* name = SMesh::FormName(i) ;
0113         fold->add_subfold( name, sub->serialize() );
0114     }
0115     fold->names = names ;
0116     return fold ;
0117 }
0118 
0119 inline void SMeshGroup::save(const char* dir) const
0120 {
0121     NPFold* fold = serialize();
0122     fold->save(dir);
0123 }
0124 
0125 inline SMeshGroup* SMeshGroup::Import(const NPFold* fold )
0126 {
0127     if(DUMP) std::cout << "[SMeshGroup::Import \n" ;
0128     SMeshGroup* mg = new SMeshGroup ;
0129     mg->import(fold);
0130     if(DUMP) std::cout << "]SMeshGroup::Import \n" ;
0131     return mg ;
0132 }
0133 
0134 inline void SMeshGroup::import(const NPFold* fold )
0135 {
0136     int num_sub = fold->get_num_subfold() ;
0137     if(DUMP) std::cout << "[SMeshGroup::import num_sub " << num_sub << "\n" ;
0138     for(int i=0 ; i < num_sub ; i++)
0139     {
0140         const NPFold* sub = fold->get_subfold(i);
0141         if(DUMP) std::cout << ".SMeshGroup::import sub.desc " << sub->desc() << "\n" ;
0142 
0143         const SMesh* m = SMesh::Import(sub) ;
0144         if(DUMP) std::cout << ".SMeshGroup::import SMesh::Import(sub).lvid" << m->lvid << "\n" ;
0145         subs.push_back(m);
0146     }
0147     names = fold->names ;
0148     if(DUMP) std::cout << "]SMeshGroup::import num_sub " << num_sub << "\n" ;
0149 }
0150 
0151 inline std::string SMeshGroup::descRange(const std::vector<std::string>* soname) const
0152 {
0153     return DescSubMesh(subs, soname);
0154 }
0155 
0156 inline std::string SMeshGroup::DescSubMesh(const std::vector<const SMesh*>& subs, const std::vector<std::string>* soname)
0157 {
0158     size_t num_so = soname ? soname->size() : 0 ;
0159     size_t num_subs = subs.size();
0160     std::stringstream ss ;
0161     ss << "[SMeshGroup::DescSubMesh num_subs " << num_subs << "\n" ;
0162     for(size_t i=0 ; i < subs.size() ; i++)
0163     {
0164         const SMesh* sub = subs[i];
0165         const char* so = sub->lvid >= 0 && sub->lvid < int(num_so) ? (*soname)[sub->lvid].c_str() : nullptr ;
0166         ss
0167            << std::setw(4) << i
0168            << " : " << sub->descRange()
0169            << " so[" << ( so ? so : "-" ) << "]\n"
0170            ;
0171     }
0172     ss << "]SMeshGroup::DescSubMesh\n" ;
0173     std::string str = ss.str() ;
0174     return str ;
0175 }
0176 
0177 
0178 inline void SMeshGroup::findSubMesh(std::vector<const SMesh*>& collect_subs, int lvid) const
0179 {
0180     size_t num_subs = subs.size();
0181     for(size_t i=0 ; i < num_subs ; i++)
0182     {
0183         const SMesh* sub = subs[i];
0184         if(lvid == sub->lvid) collect_subs.push_back(sub); 
0185     }
0186 }
0187 
0188 
0189 
0190 
0191 
0192 
0193 
0194 
0195 
0196