326 |
const ObjectToTreat& O1, |
const ObjectToTreat& O1, |
327 |
ObjectToTreat& O2); |
ObjectToTreat& O2); |
328 |
|
|
329 |
void __showObject(Structured3DMesh& SMesh, |
void __generateMesh(Structured3DMesh& SMesh, |
330 |
const Object& object, const size_t& level, |
const Object& object, const size_t& level, |
331 |
std::stack<ReferenceCounting<ObjectToTreat> >& objectStack); |
std::stack<ReferenceCounting<ObjectToTreat> >& objectStack); |
332 |
|
|
333 |
ReferenceCounting<Vector<Triangle> > |
ReferenceCounting<Vector<Triangle> > |
334 |
__marchingTetrahedra(Structured3DMesh& SMesh, |
__marchingTetrahedra(Structured3DMesh& SMesh, |
379 |
return __shape; |
return __shape; |
380 |
} |
} |
381 |
|
|
382 |
|
ReferenceCounting<Shape>& shape() |
383 |
|
{ |
384 |
|
assert(__shape != 0); |
385 |
|
return __shape; |
386 |
|
} |
387 |
|
|
388 |
bool inside(const Vertex& V) const |
bool inside(const Vertex& V) const |
389 |
{ |
{ |
390 |
return (*__shape).inside(V); |
return (*__shape).inside(V); |
557 |
hexaList2.insert((*i).first); |
hexaList2.insert((*i).first); |
558 |
} |
} |
559 |
|
|
560 |
|
toTreatHexahedra.clear(); |
561 |
|
|
562 |
std::set_intersection (hexaList1.begin(), hexaList1.end(), |
std::set_intersection (hexaList1.begin(), hexaList1.end(), |
563 |
hexaList2.begin(), hexaList2.end(), |
hexaList2.begin(), hexaList2.end(), |
564 |
inserter(toTreatHexahedra, toTreatHexahedra.begin())); |
inserter(toTreatHexahedra, toTreatHexahedra.begin())); |
2855 |
|
|
2856 |
const Scene& scene =Omega.scene(); |
const Scene& scene =Omega.scene(); |
2857 |
|
|
2858 |
|
#warning SHOULD EXTRACT sub-meshes from here. |
2859 |
for(POVRayReferences::iterator povRef = povRefList.begin(); |
for(POVRayReferences::iterator povRef = povRefList.begin(); |
2860 |
povRef!= povRefList.end(); ++povRef) { |
povRef!= povRefList.end(); ++povRef) { |
2861 |
for (size_t i=0; i<scene.nbObjects(); ++i) { |
for (size_t i=0; i<scene.nbObjects(); ++i) { |
2865 |
SurfaceMeshOfTriangles* surfMesh |
SurfaceMeshOfTriangles* surfMesh |
2866 |
= new SurfaceMeshOfTriangles; |
= new SurfaceMeshOfTriangles; |
2867 |
|
|
2868 |
Reference::Representation ref; |
this->generateSurfacicMesh(Omega, |
|
ref.resize(scene.nbObjects()); |
|
|
|
|
|
ref[i] = true; |
|
|
|
|
|
this->generateSurfacicMesh(O, |
|
|
Omega, |
|
2869 |
*surfMesh, |
*surfMesh, |
2870 |
dynamic_cast<Structured3DMesh&>(M)); |
dynamic_cast<Structured3DMesh&>(M)); |
2871 |
|
|
3020 |
|
|
3021 |
|
|
3022 |
void SurfaceMeshGenerator::Internals:: |
void SurfaceMeshGenerator::Internals:: |
3023 |
__showObject(Structured3DMesh& SMesh, |
__generateMesh(Structured3DMesh& SMesh, |
3024 |
const Object& object, const size_t& level, |
const Object& object, const size_t& level, |
3025 |
std::stack<ReferenceCounting<ObjectToTreat> >& objectStack) |
std::stack<ReferenceCounting<ObjectToTreat> >& objectStack) |
3026 |
{ |
{ |
|
for (size_t i=0; i<level; ++i) |
|
|
std::cout << "=="; |
|
3027 |
switch(object.shapeType()) { |
switch(object.shapeType()) { |
3028 |
case Shape::union_: { |
case Shape::union_: { |
3029 |
const Union& U = static_cast<const Union&>(*(object.shape())); |
const Union& U = static_cast<const Union&>(*(object.shape())); |
3031 |
size_t j=0; |
size_t j=0; |
3032 |
for(Union::const_iterator i = U.begin(); |
for(Union::const_iterator i = U.begin(); |
3033 |
i != U.end(); ++i,++j) { |
i != U.end(); ++i,++j) { |
3034 |
__showObject(SMesh,(*(*i)), level+1, objectStack); |
__generateMesh(SMesh,(*(*i)), level+1, objectStack); |
3035 |
if (j>0) { |
if (j>0) { |
|
for (size_t l=0; l<level; ++l) |
|
|
std::cout << "=="; |
|
|
|
|
|
std::cerr << "Calcule l'union\n"; |
|
|
|
|
3036 |
// get first object of the intersection |
// get first object of the intersection |
3037 |
ReferenceCounting<ObjectToTreat> O1 = objectStack.top(); |
ReferenceCounting<ObjectToTreat> O1 = objectStack.top(); |
3038 |
objectStack.pop(); |
objectStack.pop(); |
3045 |
__operationBoolean<UnionTest>(*O0,*O1, *O2); |
__operationBoolean<UnionTest>(*O0,*O1, *O2); |
3046 |
|
|
3047 |
// Set shape function |
// Set shape function |
3048 |
Union* u = new Union(); |
if (j == 1) { // create an union shape |
3049 |
u->push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0))); |
Union* u = new Union(); |
3050 |
u->push_back(new Object((*O2).shape(), TinyVector<3,real_t>(0,0,0))); |
u->push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0))); |
3051 |
(*O0).setShape(u); |
u->push_back(new Object((*O2).shape(), TinyVector<3,real_t>(0,0,0))); |
3052 |
|
(*O0).setShape(u); |
3053 |
|
} else { //use the union shape contained in O2 |
3054 |
|
Union& u = dynamic_cast<Union&>(*(*O2).shape()); |
3055 |
|
u.push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0))); |
3056 |
|
(*O0).setShape((*O2).shape()); |
3057 |
|
} |
3058 |
|
|
3059 |
objectStack.push(O0); |
objectStack.push(O0); |
|
|
|
|
std::cerr << __LINE__ << " Push union object!\n"; |
|
3060 |
} |
} |
3061 |
} |
} |
3062 |
break; |
break; |
3067 |
size_t j=0; |
size_t j=0; |
3068 |
for(Intersection::const_iterator i = I.begin(); |
for(Intersection::const_iterator i = I.begin(); |
3069 |
i != I.end(); ++i,++j) { |
i != I.end(); ++i,++j) { |
3070 |
__showObject(SMesh,(*(*i)), level+1, objectStack); |
__generateMesh(SMesh,(*(*i)), level+1, objectStack); |
3071 |
if (j>0) { |
if (j>0) { |
|
for (size_t l=0; l<level; ++l) |
|
|
std::cout << "=="; |
|
|
|
|
|
std::cerr << "Calcule l'intersection\n"; |
|
|
|
|
3072 |
// get first object of the intersection |
// get first object of the intersection |
3073 |
ReferenceCounting<ObjectToTreat> O1 = objectStack.top(); |
ReferenceCounting<ObjectToTreat> O1 = objectStack.top(); |
3074 |
objectStack.pop(); |
objectStack.pop(); |
3080 |
ReferenceCounting<ObjectToTreat> O0 = new ObjectToTreat(); |
ReferenceCounting<ObjectToTreat> O0 = new ObjectToTreat(); |
3081 |
__operationBoolean<IntersectionTest>(*O0,*O1, *O2); |
__operationBoolean<IntersectionTest>(*O0,*O1, *O2); |
3082 |
|
|
3083 |
// Set shape function |
if (j == 1) { // create an intersection shape |
3084 |
Intersection* newI = new Intersection(); |
Intersection* newI = new Intersection(); |
3085 |
newI->push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0))); |
newI->push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0))); |
3086 |
newI->push_back(new Object((*O2).shape(), TinyVector<3,real_t>(0,0,0))); |
newI->push_back(new Object((*O2).shape(), TinyVector<3,real_t>(0,0,0))); |
3087 |
(*O0).setShape(newI); |
(*O0).setShape(newI); |
3088 |
|
} else { //use the intersection shape contained in O2 |
3089 |
|
Intersection& newI = dynamic_cast<Intersection&>(*(*O2).shape()); |
3090 |
|
newI.push_back(new Object((*O1).shape(), TinyVector<3,real_t>(0,0,0))); |
3091 |
|
(*O0).setShape((*O2).shape()); |
3092 |
|
} |
3093 |
objectStack.push(O0); |
objectStack.push(O0); |
|
|
|
|
std::cerr << __LINE__ << " Push union object!\n"; |
|
3094 |
} |
} |
3095 |
} |
} |
3096 |
break; |
break; |
3104 |
} |
} |
3105 |
case Shape::not_: { |
case Shape::not_: { |
3106 |
const Object& notObject = *(static_cast<const Not&>(*object.shape()).object()); |
const Object& notObject = *(static_cast<const Not&>(*object.shape()).object()); |
3107 |
__showObject(SMesh, notObject, |
__generateMesh(SMesh, notObject, |
3108 |
level+1, objectStack); |
level+1, objectStack); |
3109 |
|
|
3110 |
ObjectToTreat& o = (*objectStack.top()); |
ObjectToTreat& o = (*objectStack.top()); |
3111 |
ReferenceCounting<Shape> s = o.shape(); |
ReferenceCounting<Shape> s = o.shape(); |
3112 |
#warning NE PAS APPELER 'new Object' |
#warning DO NOT CALL 'new Object' |
3113 |
o.setShape(new Not(new Object(s, TinyVector<3,real_t>(0,0,0)))); |
o.setShape(new Not(new Object(s, TinyVector<3,real_t>(0,0,0)))); |
3114 |
|
|
3115 |
break; |
break; |
3155 |
\warning Implementation could be improved and function size reduced. |
\warning Implementation could be improved and function size reduced. |
3156 |
*/ |
*/ |
3157 |
void SurfaceMeshGenerator:: |
void SurfaceMeshGenerator:: |
3158 |
generateSurfacicMesh(const Object& O, |
generateSurfacicMesh(const Domain& Omega, |
|
const Domain& Omega, |
|
3159 |
SurfaceMeshOfTriangles& s_mesh, |
SurfaceMeshOfTriangles& s_mesh, |
3160 |
Structured3DMesh& SMesh) |
Structured3DMesh& SMesh) |
3161 |
{ |
{ |
|
const Shape& S = *(O.shape()); |
|
|
|
|
3162 |
typedef std::map<TinyVector<3>, Object*, |
typedef std::map<TinyVector<3>, Object*, |
3163 |
SurfaceMeshGenerator::Internals::__ltv> ObjectReferences; |
SurfaceMeshGenerator::Internals::__ltv> ObjectReferences; |
3164 |
|
|
3172 |
} |
} |
3173 |
|
|
3174 |
std::stack<ReferenceCounting<SurfaceMeshGenerator::Internals::ObjectToTreat> > objectStack; |
std::stack<ReferenceCounting<SurfaceMeshGenerator::Internals::ObjectToTreat> > objectStack; |
3175 |
(*__internals).__showObject(SMesh,object, 0, objectStack); |
(*__internals).__generateMesh(SMesh,object, 0, objectStack); |
3176 |
|
|
3177 |
//construction of s_mesh |
//construction of s_mesh |
3178 |
(*__internals).__constructionFinalMesh((*objectStack.top()), |
(*__internals).__constructionFinalMesh((*objectStack.top()), |