1 // Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File : SMESH_Client.cxx
23 // Author : Pavel TELKOV
26 #include "SMESH_Client.hxx"
27 #include "SMESH_Mesh.hxx"
29 #include "SALOME_NamingService.hxx"
30 #include "SALOME_LifeCycleCORBA.hxx"
32 #include <SALOMEconfig.h>
33 #include CORBA_SERVER_HEADER(SALOME_Component)
34 #include CORBA_SERVER_HEADER(SALOME_Exception)
36 #include "Basics_Utils.hxx"
37 #include "utilities.h"
48 #define EXCEPTION(TYPE, MSG) {\
49 std::ostringstream aStream;\
50 aStream<<__FILE__<<"["<<__LINE__<<"]::"<<MSG;\
51 throw TYPE(aStream.str());\
56 static int MYDEBUG = 1;
58 static int MYDEBUG = 0;
64 //=======================================================================
66 //=======================================================================
67 inline const SMDS_MeshNode* FindNode(const SMDS_Mesh* theMesh, int theId){
68 if(const SMDS_MeshNode* anElem = theMesh->FindNode(theId)) return anElem;
69 EXCEPTION(runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "<<theId);
73 //=======================================================================
74 //function : FindElement
75 //=======================================================================
76 inline const SMDS_MeshElement* FindElement(const SMDS_Mesh* theMesh, int theId){
77 if(const SMDS_MeshElement* anElem = theMesh->FindElement(theId)) return anElem;
78 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot find a SMDS_MeshElement for ID = "<<theId);
82 //=======================================================================
83 //function : AddNodesWithID
84 //=======================================================================
85 inline void AddNodesWithID(SMDS_Mesh* theMesh,
86 SMESH::log_array_var& theSeq,
89 const SMESH::double_array& aCoords = theSeq[theId].coords;
90 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
91 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
92 if(3*aNbElems != aCoords.length())
93 EXCEPTION(runtime_error,"AddNodesWithID - 3*aNbElems != aCoords.length()");
94 for(CORBA::Long aCoordId = 0; anElemId < aNbElems; anElemId++, aCoordId+=3){
95 SMDS_MeshElement* anElem = theMesh->AddNodeWithID(aCoords[aCoordId],
100 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddNodeWithID for ID = "<<anElemId);
105 //=======================================================================
106 //function : Add0DElementsWithID
107 //=======================================================================
108 inline void Add0DElementsWithID(SMDS_Mesh* theMesh,
109 SMESH::log_array_var& theSeq,
112 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
113 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
114 if (2*aNbElems != anIndexes.length())
115 EXCEPTION(runtime_error,"AddEdgeWithID - 2*aNbElems != aCoords.length()");
116 CORBA::Long anIndexId = 0;
117 for (; anElemId < aNbElems; anElemId++, anIndexId+=2)
119 SMDS_MeshElement* anElem = theMesh->Add0DElementWithID(anIndexes[anIndexId+1],
120 anIndexes[anIndexId]);
122 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot Add0DElementWithID for ID = "<<anElemId);
127 //=======================================================================
128 //function : AddEdgesWithID
129 //=======================================================================
130 inline void AddEdgesWithID(SMDS_Mesh* theMesh,
131 SMESH::log_array_var& theSeq,
134 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
135 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
136 if(3*aNbElems != anIndexes.length())
137 EXCEPTION(runtime_error,"AddEdgeWithID - 3*aNbElems != aCoords.length()");
138 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=3){
139 SMDS_MeshElement* anElem = theMesh->AddEdgeWithID(anIndexes[anIndexId+1],
140 anIndexes[anIndexId+2],
141 anIndexes[anIndexId]);
143 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<<anElemId);
148 //=======================================================================
149 //function : AddTriasWithID
150 //=======================================================================
151 inline void AddTriasWithID(SMDS_Mesh* theMesh,
152 SMESH::log_array_var& theSeq,
155 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
156 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
157 if(4*aNbElems != anIndexes.length())
158 EXCEPTION(runtime_error,"AddTriasWithID - 4*aNbElems != anIndexes.length()");
159 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=4){
160 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
161 anIndexes[anIndexId+2],
162 anIndexes[anIndexId+3],
163 anIndexes[anIndexId]);
165 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
170 //=======================================================================
171 //function : AddQuadsWithID
172 //=======================================================================
173 inline void AddQuadsWithID(SMDS_Mesh* theMesh,
174 SMESH::log_array_var theSeq,
177 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
178 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
179 if(5*aNbElems != anIndexes.length())
180 EXCEPTION(runtime_error,"AddQuadsWithID - 4*aNbElems != anIndexes.length()");
181 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){
182 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
183 anIndexes[anIndexId+2],
184 anIndexes[anIndexId+3],
185 anIndexes[anIndexId+4],
186 anIndexes[anIndexId]);
188 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
193 //=======================================================================
194 //function : AddPolygonsWithID
195 //=======================================================================
196 inline void AddPolygonsWithID(SMDS_Mesh* theMesh,
197 SMESH::log_array_var& theSeq,
200 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
201 CORBA::Long anIndexId = 0, aNbElems = theSeq[theId].number;
203 for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) {
204 int aFaceId = anIndexes[anIndexId++];
206 int aNbNodes = anIndexes[anIndexId++];
207 std::vector<int> nodes_ids (aNbNodes);
208 for (int i = 0; i < aNbNodes; i++) {
209 nodes_ids[i] = anIndexes[anIndexId++];
212 SMDS_MeshElement* anElem = theMesh->AddPolygonalFaceWithID(nodes_ids, aFaceId);
214 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolygonalFaceWithID for ID = "
220 //=======================================================================
221 //function : AddTetrasWithID
222 //=======================================================================
223 inline void AddTetrasWithID(SMDS_Mesh* theMesh,
224 SMESH::log_array_var& theSeq,
227 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
228 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
229 if(5*aNbElems != anIndexes.length())
230 EXCEPTION(runtime_error,"AddTetrasWithID - 5*aNbElems != anIndexes.length()");
231 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){
232 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
233 anIndexes[anIndexId+2],
234 anIndexes[anIndexId+3],
235 anIndexes[anIndexId+4],
236 anIndexes[anIndexId]);
238 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
243 //=======================================================================
244 //function : AddPiramidsWithID
245 //=======================================================================
246 inline void AddPiramidsWithID(SMDS_Mesh* theMesh,
247 SMESH::log_array_var& theSeq,
250 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
251 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
252 if(6*aNbElems != anIndexes.length())
253 EXCEPTION(runtime_error,"AddPiramidsWithID - 6*aNbElems != anIndexes.length()");
254 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=6){
255 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
256 anIndexes[anIndexId+2],
257 anIndexes[anIndexId+3],
258 anIndexes[anIndexId+4],
259 anIndexes[anIndexId+5],
260 anIndexes[anIndexId]);
262 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
267 //=======================================================================
268 //function : AddPrismsWithID
269 //=======================================================================
270 inline void AddPrismsWithID(SMDS_Mesh* theMesh,
271 SMESH::log_array_var& theSeq,
274 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
275 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
276 if(7*aNbElems != anIndexes.length())
277 EXCEPTION(runtime_error,"AddPrismsWithID - 7*aNbElems != anIndexes.length()");
278 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=7){
279 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
280 anIndexes[anIndexId+2],
281 anIndexes[anIndexId+3],
282 anIndexes[anIndexId+4],
283 anIndexes[anIndexId+5],
284 anIndexes[anIndexId+6],
285 anIndexes[anIndexId]);
287 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
292 //=======================================================================
293 //function : AddHexasWithID
294 //=======================================================================
295 inline void AddHexasWithID(SMDS_Mesh* theMesh,
296 SMESH::log_array_var& theSeq,
299 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
300 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
301 if(9*aNbElems != anIndexes.length())
302 EXCEPTION(runtime_error,"AddHexasWithID - 9*aNbElems != anIndexes.length()");
303 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=9){
304 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
305 anIndexes[anIndexId+2],
306 anIndexes[anIndexId+3],
307 anIndexes[anIndexId+4],
308 anIndexes[anIndexId+5],
309 anIndexes[anIndexId+6],
310 anIndexes[anIndexId+7],
311 anIndexes[anIndexId+8],
312 anIndexes[anIndexId]);
314 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
318 //=======================================================================
319 //function : AddHexPrismWithID
320 //=======================================================================
321 inline void AddHexPrismWithID(SMDS_Mesh* theMesh,
322 SMESH::log_array_var& theSeq,
325 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
326 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
327 if(13*aNbElems != anIndexes.length())
328 EXCEPTION(runtime_error,"AddHexPrismWithID - 13*aNbElems != anIndexes.length()");
329 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=13){
330 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
331 anIndexes[anIndexId+2],
332 anIndexes[anIndexId+3],
333 anIndexes[anIndexId+4],
334 anIndexes[anIndexId+5],
335 anIndexes[anIndexId+6],
336 anIndexes[anIndexId+7],
337 anIndexes[anIndexId+8],
338 anIndexes[anIndexId+9],
339 anIndexes[anIndexId+10],
340 anIndexes[anIndexId+11],
341 anIndexes[anIndexId+12],
342 anIndexes[anIndexId]);
344 EXCEPTION(runtime_error,"AddHexPrismWithID - cannot AddVolumeWithID for ID = "<<anElemId);
349 //=======================================================================
350 //function : AddPolyhedronsWithID
351 //=======================================================================
352 inline void AddPolyhedronsWithID (SMDS_Mesh* theMesh,
353 SMESH::log_array_var& theSeq,
356 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
357 CORBA::Long anIndexId = 0, aNbElems = theSeq[theId].number;
359 for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) {
360 int aFaceId = anIndexes[anIndexId++];
362 int aNbNodes = anIndexes[anIndexId++];
363 std::vector<int> nodes_ids (aNbNodes);
364 for (int i = 0; i < aNbNodes; i++) {
365 nodes_ids[i] = anIndexes[anIndexId++];
368 int aNbFaces = anIndexes[anIndexId++];
369 std::vector<int> quantities (aNbFaces);
370 for (int i = 0; i < aNbFaces; i++) {
371 quantities[i] = anIndexes[anIndexId++];
374 SMDS_MeshElement* anElem =
375 theMesh->AddPolyhedralVolumeWithID(nodes_ids, quantities, aFaceId);
377 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolyhedralVolumeWithID for ID = "
383 //=======================================================================
384 //function : AddQuadEdgesWithID
385 //=======================================================================
386 inline void AddQuadEdgesWithID(SMDS_Mesh* theMesh,
387 SMESH::log_array_var& theSeq,
390 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
391 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
392 if(4*aNbElems != anIndexes.length())
393 EXCEPTION(runtime_error,"AddQuadEdgeWithID - 4*aNbElems != aCoords.length()");
394 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=4){
395 SMDS_MeshElement* anElem = theMesh->AddEdgeWithID(anIndexes[anIndexId+1],
396 anIndexes[anIndexId+2],
397 anIndexes[anIndexId+3],
398 anIndexes[anIndexId]);
400 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<<anElemId);
405 //=======================================================================
406 //function : AddQuadTriasWithID
407 //=======================================================================
408 inline void AddQuadTriasWithID(SMDS_Mesh* theMesh,
409 SMESH::log_array_var& theSeq,
412 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
413 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
414 if(7*aNbElems != anIndexes.length())
415 EXCEPTION(runtime_error,"AddQuadTriasWithID - 7*aNbElems != anIndexes.length()");
416 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=7){
417 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
418 anIndexes[anIndexId+2],
419 anIndexes[anIndexId+3],
420 anIndexes[anIndexId+4],
421 anIndexes[anIndexId+5],
422 anIndexes[anIndexId+6],
423 anIndexes[anIndexId]);
425 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
430 //=======================================================================
431 //function : AddQuadQuadsWithID
432 //=======================================================================
433 inline void AddQuadQuadsWithID(SMDS_Mesh* theMesh,
434 SMESH::log_array_var theSeq,
437 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
438 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
439 if(9*aNbElems != anIndexes.length())
440 EXCEPTION(runtime_error,"AddQuadQuadsWithID - 9*aNbElems != anIndexes.length()");
441 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=9){
442 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
443 anIndexes[anIndexId+2],
444 anIndexes[anIndexId+3],
445 anIndexes[anIndexId+4],
446 anIndexes[anIndexId+5],
447 anIndexes[anIndexId+6],
448 anIndexes[anIndexId+7],
449 anIndexes[anIndexId+8],
450 anIndexes[anIndexId]);
452 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
456 //=======================================================================
457 //function : AddBiQuadQuadsWithID
458 //=======================================================================
459 inline void AddBiQuadQuadsWithID(SMDS_Mesh* theMesh,
460 SMESH::log_array_var theSeq,
463 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
464 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
465 if(10*aNbElems != anIndexes.length())
466 EXCEPTION(runtime_error,"AddBiQuadQuadsWithID - 10*aNbElems != anIndexes.length()");
467 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=10){
468 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
469 anIndexes[anIndexId+2],
470 anIndexes[anIndexId+3],
471 anIndexes[anIndexId+4],
472 anIndexes[anIndexId+5],
473 anIndexes[anIndexId+6],
474 anIndexes[anIndexId+7],
475 anIndexes[anIndexId+8],
476 anIndexes[anIndexId+9],
477 anIndexes[anIndexId]);
479 EXCEPTION(runtime_error,"AddBiQuadQuadsWithID() - cannot AddFaceWithID for ID = "<<anElemId);
484 //=======================================================================
485 //function : AddQuadTetrasWithID
486 //=======================================================================
487 inline void AddQuadTetrasWithID(SMDS_Mesh* theMesh,
488 SMESH::log_array_var& theSeq,
491 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
492 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
493 if(11*aNbElems != anIndexes.length())
494 EXCEPTION(runtime_error,"AddQuadTetrasWithID - 11*aNbElems != anIndexes.length()");
495 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=11){
496 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
497 anIndexes[anIndexId+2],
498 anIndexes[anIndexId+3],
499 anIndexes[anIndexId+4],
500 anIndexes[anIndexId+5],
501 anIndexes[anIndexId+6],
502 anIndexes[anIndexId+7],
503 anIndexes[anIndexId+8],
504 anIndexes[anIndexId+9],
505 anIndexes[anIndexId+10],
506 anIndexes[anIndexId]);
508 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
513 //=======================================================================
514 //function : AddQuadPiramidsWithID
515 //=======================================================================
516 inline void AddQuadPiramidsWithID(SMDS_Mesh* theMesh,
517 SMESH::log_array_var& theSeq,
520 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
521 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
522 if(14*aNbElems != anIndexes.length())
523 EXCEPTION(runtime_error,"AddQuadPiramidsWithID - 14*aNbElems != anIndexes.length()");
524 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=14){
525 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
526 anIndexes[anIndexId+2],
527 anIndexes[anIndexId+3],
528 anIndexes[anIndexId+4],
529 anIndexes[anIndexId+5],
530 anIndexes[anIndexId+6],
531 anIndexes[anIndexId+7],
532 anIndexes[anIndexId+8],
533 anIndexes[anIndexId+9],
534 anIndexes[anIndexId+10],
535 anIndexes[anIndexId+11],
536 anIndexes[anIndexId+12],
537 anIndexes[anIndexId+13],
538 anIndexes[anIndexId]);
540 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
545 //=======================================================================
546 //function : AddQuadPentasWithID
547 //=======================================================================
548 inline void AddQuadPentasWithID(SMDS_Mesh* theMesh,
549 SMESH::log_array_var& theSeq,
552 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
553 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
554 if(16*aNbElems != anIndexes.length())
555 EXCEPTION(runtime_error,"AddQuadPentasWithID - 16*aNbElems != anIndexes.length()");
556 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=16){
557 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
558 anIndexes[anIndexId+2],
559 anIndexes[anIndexId+3],
560 anIndexes[anIndexId+4],
561 anIndexes[anIndexId+5],
562 anIndexes[anIndexId+6],
563 anIndexes[anIndexId+7],
564 anIndexes[anIndexId+8],
565 anIndexes[anIndexId+9],
566 anIndexes[anIndexId+10],
567 anIndexes[anIndexId+11],
568 anIndexes[anIndexId+12],
569 anIndexes[anIndexId+13],
570 anIndexes[anIndexId+14],
571 anIndexes[anIndexId+15],
572 anIndexes[anIndexId]);
574 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
579 //=======================================================================
580 //function : AddQuadHexasWithID
581 //=======================================================================
582 inline void AddQuadHexasWithID(SMDS_Mesh* theMesh,
583 SMESH::log_array_var& theSeq,
586 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
587 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
588 if(21*aNbElems != anIndexes.length())
589 EXCEPTION(runtime_error,"AddQuadHexasWithID - 21*aNbElems != anIndexes.length()");
590 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=21){
591 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
592 anIndexes[anIndexId+2],
593 anIndexes[anIndexId+3],
594 anIndexes[anIndexId+4],
595 anIndexes[anIndexId+5],
596 anIndexes[anIndexId+6],
597 anIndexes[anIndexId+7],
598 anIndexes[anIndexId+8],
599 anIndexes[anIndexId+9],
600 anIndexes[anIndexId+10],
601 anIndexes[anIndexId+11],
602 anIndexes[anIndexId+12],
603 anIndexes[anIndexId+13],
604 anIndexes[anIndexId+14],
605 anIndexes[anIndexId+15],
606 anIndexes[anIndexId+16],
607 anIndexes[anIndexId+17],
608 anIndexes[anIndexId+18],
609 anIndexes[anIndexId+19],
610 anIndexes[anIndexId+20],
611 anIndexes[anIndexId]);
613 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
617 //=======================================================================
618 //function : AddTriQuadHexasWithID
619 //=======================================================================
620 inline void AddTriQuadHexasWithID(SMDS_Mesh* theMesh,
621 SMESH::log_array_var& theSeq,
624 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
625 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
626 if(28*aNbElems != anIndexes.length())
627 EXCEPTION(runtime_error,"AddTriQuadHexasWithID - 28*aNbElems != anIndexes.length()");
628 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=28){
629 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
630 anIndexes[anIndexId+2],
631 anIndexes[anIndexId+3],
632 anIndexes[anIndexId+4],
633 anIndexes[anIndexId+5],
634 anIndexes[anIndexId+6],
635 anIndexes[anIndexId+7],
636 anIndexes[anIndexId+8],
637 anIndexes[anIndexId+9],
638 anIndexes[anIndexId+10],
639 anIndexes[anIndexId+11],
640 anIndexes[anIndexId+12],
641 anIndexes[anIndexId+13],
642 anIndexes[anIndexId+14],
643 anIndexes[anIndexId+15],
644 anIndexes[anIndexId+16],
645 anIndexes[anIndexId+17],
646 anIndexes[anIndexId+18],
647 anIndexes[anIndexId+19],
648 anIndexes[anIndexId+20],
649 anIndexes[anIndexId+21],
650 anIndexes[anIndexId+22],
651 anIndexes[anIndexId+23],
652 anIndexes[anIndexId+24],
653 anIndexes[anIndexId+25],
654 anIndexes[anIndexId+26],
655 anIndexes[anIndexId+27],
656 anIndexes[anIndexId]);
658 EXCEPTION(runtime_error,"AddTriQuadHexasWithID() - cannot AddVolumeWithID for ID = "<<anElemId);
663 //=======================================================================
664 //function : ChangePolyhedronNodes
665 //=======================================================================
666 inline void ChangePolyhedronNodes (SMDS_Mesh* theMesh,
667 SMESH::log_array_var& theSeq,
670 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
671 CORBA::Long iind = 0, aNbElems = theSeq[theId].number;
673 for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++)
676 const SMDS_MeshElement* elem = FindElement(theMesh, anIndexes[iind++]);
678 int nbNodes = anIndexes[iind++];
680 std::vector<const SMDS_MeshNode*> aNodes (nbNodes);
681 for (int iNode = 0; iNode < nbNodes; iNode++) {
682 aNodes[iNode] = FindNode(theMesh, anIndexes[iind++]);
685 int nbFaces = anIndexes[iind++];
687 std::vector<int> quantities (nbFaces);
688 for (int iFace = 0; iFace < nbFaces; iFace++) {
689 quantities[iFace] = anIndexes[iind++];
692 theMesh->ChangePolyhedronNodes(elem, aNodes, quantities);
697 //=======================================================================
699 SMESH_Client::GetSMESHGen(CORBA::ORB_ptr theORB,
700 CORBA::Boolean& theIsEmbeddedMode)
702 static SMESH::SMESH_Gen_var aMeshGen;
704 if(CORBA::is_nil(aMeshGen.in())){
706 long aClientPID = (long)_getpid();
708 long aClientPID = (long)getpid();
711 SALOME_NamingService aNamingService(theORB);
712 SALOME_LifeCycleCORBA aLifeCycleCORBA(&aNamingService);
713 Engines::EngineComponent_var aComponent = aLifeCycleCORBA.FindOrLoad_Component("FactoryServer","SMESH");
714 aMeshGen = SMESH::SMESH_Gen::_narrow(aComponent);
716 std::string aClientHostName = Kernel_Utils::GetHostname();
717 Engines::Container_var aServerContainer = aMeshGen->GetContainerRef();
718 CORBA::String_var aServerHostName = aServerContainer->getHostName();
719 CORBA::Long aServerPID = aServerContainer->getPID();
720 aMeshGen->SetEmbeddedMode((aClientPID == aServerPID) && (aClientHostName == aServerHostName.in()));
722 theIsEmbeddedMode = aMeshGen->IsEmbeddedMode();
728 //=======================================================================
729 // function : Create()
731 //=======================================================================
732 SMESH_Client::SMESH_Client(CORBA::ORB_ptr theORB,
733 SMESH::SMESH_Mesh_ptr theMesh):
734 myMeshServer(SMESH::SMESH_Mesh::_duplicate(theMesh)),
738 MESSAGE("SMESH_Client::SMESH_Client");
739 myMeshServer->Register();
741 CORBA::Boolean anIsEmbeddedMode;
742 GetSMESHGen(theORB,anIsEmbeddedMode);
743 if(anIsEmbeddedMode){
745 MESSAGE("Info: The same process, update mesh by pointer ");
746 // just set client mesh pointer to server mesh pointer
747 //SMESH_Mesh* aMesh = reinterpret_cast<SMESH_Mesh*>(theMesh->GetMeshPtr());
748 CORBA::LongLong pointeur = theMesh->GetMeshPtr();
750 MESSAGE("SMESH_Client::SMESH_Client pointeur "<<pointeur);
751 SMESH_Mesh* aMesh = reinterpret_cast<SMESH_Mesh*> (pointeur);
753 MESSAGE("SMESH_Client::SMESH_Client aMesh "<<aMesh);
754 //if(aMesh->GetMeshDS()->IsEmbeddedMode()){
755 if(anIsEmbeddedMode){
756 mySMESHDSMesh = aMesh->GetMeshDS();
757 mySMDSMesh = mySMESHDSMesh;
761 mySMDSMesh = new SMDS_Mesh();
765 //=================================================================================
766 // function : ~SMESH_Client
767 // purpose : Destructor
768 //=================================================================================
769 SMESH_Client::~SMESH_Client()
771 myMeshServer->UnRegister();
777 //=================================================================================
779 SMESH_Client::GetMesh() const
785 //=================================================================================
787 SMESH_Client::operator->() const
793 //=================================================================================
794 SMESH::SMESH_Mesh_ptr
795 SMESH_Client::GetMeshServer()
797 return myMeshServer.in();
801 //=================================================================================
802 // function : SMESH_Client
803 // purpose : Update mesh
804 //=================================================================================
806 SMESH_Client::Update(bool theIsClear)
808 bool anIsModified = true;
810 MESSAGE("Update mySMESHDSMesh");
811 SMESHDS_Script* aScript = mySMESHDSMesh->GetScript();
812 anIsModified = aScript->IsModified();
813 aScript->SetModified(false);
815 MESSAGE("Update CORBA");
816 SMESH::log_array_var aSeq = myMeshServer->GetLog( theIsClear );
817 CORBA::Long aLength = aSeq->length();
818 anIsModified = aLength > 0;
820 MESSAGE( "Update: length of the script is "<<aLength );
825 // update client mesh structure by logged changes commands
828 for ( CORBA::Long anId = 0; anId < aLength; anId++)
830 const SMESH::double_array& aCoords = aSeq[anId].coords;
831 const SMESH::long_array& anIndexes = aSeq[anId].indexes;
832 CORBA::Long anElemId = 0, aNbElems = aSeq[anId].number;
833 CORBA::Long aCommand = aSeq[anId].commandType;
837 case SMESH::ADD_NODE : AddNodesWithID ( mySMDSMesh, aSeq, anId ); break;
838 case SMESH::ADD_ELEM0D : Add0DElementsWithID ( mySMDSMesh, aSeq, anId ); break;
839 case SMESH::ADD_EDGE : AddEdgesWithID ( mySMDSMesh, aSeq, anId ); break;
840 case SMESH::ADD_TRIANGLE : AddTriasWithID ( mySMDSMesh, aSeq, anId ); break;
841 case SMESH::ADD_QUADRANGLE : AddQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
842 case SMESH::ADD_POLYGON : AddPolygonsWithID ( mySMDSMesh, aSeq, anId ); break;
843 case SMESH::ADD_TETRAHEDRON : AddTetrasWithID ( mySMDSMesh, aSeq, anId ); break;
844 case SMESH::ADD_PYRAMID : AddPiramidsWithID ( mySMDSMesh, aSeq, anId ); break;
845 case SMESH::ADD_PRISM : AddPrismsWithID ( mySMDSMesh, aSeq, anId ); break;
846 case SMESH::ADD_HEXAHEDRON : AddHexasWithID ( mySMDSMesh, aSeq, anId ); break;
847 case SMESH::ADD_HEXAGONAL_PRISM : AddHexPrismWithID ( mySMDSMesh, aSeq, anId ); break;
848 case SMESH::ADD_POLYHEDRON : AddPolyhedronsWithID( mySMDSMesh, aSeq, anId ); break;
850 case SMESH::ADD_QUADEDGE : AddQuadEdgesWithID ( mySMDSMesh, aSeq, anId ); break;
851 case SMESH::ADD_QUADTRIANGLE : AddQuadTriasWithID ( mySMDSMesh, aSeq, anId ); break;
852 case SMESH::ADD_QUADQUADRANGLE : AddQuadQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
853 case SMESH::ADD_BIQUAD_QUADRANGLE: AddBiQuadQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
854 case SMESH::ADD_QUADTETRAHEDRON : AddQuadTetrasWithID ( mySMDSMesh, aSeq, anId ); break;
855 case SMESH::ADD_QUADPYRAMID : AddQuadPiramidsWithID( mySMDSMesh, aSeq, anId ); break;
856 case SMESH::ADD_QUADPENTAHEDRON : AddQuadPentasWithID ( mySMDSMesh, aSeq, anId ); break;
857 case SMESH::ADD_QUADHEXAHEDRON : AddQuadHexasWithID ( mySMDSMesh, aSeq, anId ); break;
858 case SMESH::ADD_TRIQUAD_HEXA : AddTriQuadHexasWithID( mySMDSMesh, aSeq, anId ); break;
860 case SMESH::CLEAR_MESH:
864 case SMESH::REMOVE_NODE:
865 for( ; anElemId < aNbElems; anElemId++ )
866 mySMDSMesh->RemoveNode( FindNode( mySMDSMesh, anIndexes[anElemId] ) );
869 case SMESH::REMOVE_ELEMENT:
870 for( ; anElemId < aNbElems; anElemId++ )
871 mySMDSMesh->RemoveElement( FindElement( mySMDSMesh, anIndexes[anElemId] ) );
874 case SMESH::MOVE_NODE:
875 for(CORBA::Long aCoordId=0; anElemId < aNbElems; anElemId++, aCoordId+=3)
877 SMDS_MeshNode* node =
878 const_cast<SMDS_MeshNode*>( FindNode( mySMDSMesh, anIndexes[anElemId] ));
879 node->setXYZ( aCoords[aCoordId], aCoords[aCoordId+1], aCoords[aCoordId+2] );
883 case SMESH::CHANGE_ELEMENT_NODES:
884 for ( CORBA::Long i = 0; anElemId < aNbElems; anElemId++ )
887 const SMDS_MeshElement* elem = FindElement( mySMDSMesh, anIndexes[i++] );
889 int nbNodes = anIndexes[i++];
891 //ASSERT( nbNodes < 9 );
892 vector<const SMDS_MeshNode*> aNodes( nbNodes );
893 for ( int iNode = 0; iNode < nbNodes; iNode++ )
894 aNodes[ iNode ] = FindNode( mySMDSMesh, anIndexes[i++] );
896 mySMDSMesh->ChangeElementNodes( elem, &aNodes[0], nbNodes );
900 case SMESH::CHANGE_POLYHEDRON_NODES:
901 ChangePolyhedronNodes(mySMDSMesh, aSeq, anId);
903 case SMESH::RENUMBER:
904 for(CORBA::Long i=0; anElemId < aNbElems; anElemId++, i+=3)
906 mySMDSMesh->Renumber( anIndexes[i], anIndexes[i+1], anIndexes[i+2] );
914 catch ( SALOME::SALOME_Exception& exc )
916 INFOS("Following exception was cought:\n\t"<<exc.details.text);
918 catch( const std::exception& exc)
920 INFOS("Following exception was cought:\n\t"<<exc.what());
924 INFOS("Unknown exception was cought !!!");
927 if ( MYDEBUG && mySMDSMesh )
929 MESSAGE("Update - mySMDSMesh->NbNodes() = "<<mySMDSMesh->NbNodes());
930 MESSAGE("Update - mySMDSMesh->Nb0DElements() = "<<mySMDSMesh->Nb0DElements());
931 MESSAGE("Update - mySMDSMesh->NbEdges() = "<<mySMDSMesh->NbEdges());
932 MESSAGE("Update - mySMDSMesh->NbFaces() = "<<mySMDSMesh->NbFaces());
933 MESSAGE("Update - mySMDSMesh->NbVolumes() = "<<mySMDSMesh->NbVolumes());
935 } // end of update mesh by log script