File indexing completed on 2026-04-09 07:49:39
0001 #pragma once
0002
0003
0004
0005
0006
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
0047
0048
0049
0050
0051
0052
0053
0054 inline SMeshGroup* SMeshGroup::MakeCopy(const SMeshGroup* src, const SBitSet* elv )
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
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