1 // Copyright (C) 2007-2020 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, or (at your option) any later version.
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"
28 #include "SMESHDS_Mesh.hxx"
29 #include "SMESHDS_Script.hxx"
30 #include "SMESH_Mesh.hxx"
32 #include "SALOME_NamingService.hxx"
33 #include "SALOME_LifeCycleCORBA.hxx"
35 #include <SALOMEconfig.h>
36 #include CORBA_SERVER_HEADER(SALOME_Component)
37 #include CORBA_SERVER_HEADER(SALOME_Exception)
39 #include "Basics_Utils.hxx"
40 #include "utilities.h"
51 #define EXCEPTION(TYPE, MSG) {\
52 std::ostringstream aStream;\
53 aStream<<__FILE__<<"["<<__LINE__<<"]::"<<MSG;\
54 throw TYPE(aStream.str());\
59 static int MYDEBUG = 0;
61 static int MYDEBUG = 0;
66 using std::runtime_error;
68 //=======================================================================
70 //=======================================================================
71 inline const SMDS_MeshNode* FindNode(const SMDS_Mesh* theMesh, int theId){
72 if(const SMDS_MeshNode* anElem = theMesh->FindNode(theId)) return anElem;
73 EXCEPTION(runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "<<theId);
77 //=======================================================================
78 //function : FindElement
79 //=======================================================================
80 inline const SMDS_MeshElement* FindElement(const SMDS_Mesh* theMesh, int theId){
81 if(const SMDS_MeshElement* anElem = theMesh->FindElement(theId)) return anElem;
82 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot find a SMDS_MeshElement for ID = "<<theId);
86 //=======================================================================
87 //function : AddNodesWithID
88 //=======================================================================
89 inline void AddNodesWithID(SMDS_Mesh* theMesh,
90 SMESH::log_array_var& theSeq,
93 const SMESH::double_array& aCoords = theSeq[theId].coords;
94 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
95 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
96 if(3*aNbElems != (CORBA::Long) aCoords.length())
97 EXCEPTION(runtime_error,"AddNodesWithID - 3*aNbElems != aCoords.length()");
98 for(CORBA::Long aCoordId = 0; anElemId < aNbElems; anElemId++, aCoordId+=3){
99 SMDS_MeshElement* anElem = theMesh->AddNodeWithID(aCoords[aCoordId],
102 anIndexes[anElemId]);
104 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddNodeWithID for ID = "<<anElemId);
109 //=======================================================================
110 //function : Add0DElementsWithID
111 //=======================================================================
112 inline void Add0DElementsWithID(SMDS_Mesh* theMesh,
113 SMESH::log_array_var& theSeq,
116 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
117 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
118 if (2*aNbElems != (CORBA::Long) anIndexes.length())
119 EXCEPTION(runtime_error,"AddEdgeWithID - 2*aNbElems != aCoords.length()");
120 CORBA::Long anIndexId = 0;
121 for (; anElemId < aNbElems; anElemId++, anIndexId+=2)
123 SMDS_MeshElement* anElem = theMesh->Add0DElementWithID(anIndexes[anIndexId+1],
124 anIndexes[anIndexId]);
126 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot Add0DElementWithID for ID = "<<anElemId);
131 //=======================================================================
132 //function : AddBallsWithID
133 //=======================================================================
134 inline void AddBallsWithID(SMDS_Mesh* theMesh,
135 SMESH::log_array_var& theSeq,
138 const SMESH::double_array& aDiameter = theSeq[theId].coords;
139 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
140 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
141 if (2*aNbElems != (CORBA::Long) anIndexes.length() )
142 EXCEPTION(runtime_error,"AddEdgeWithID - 2*aNbElems != anIndexes.length()");
143 if (aNbElems != (CORBA::Long) aDiameter.length())
144 EXCEPTION(runtime_error,"AddEdgeWithID - aNbElems != aDiameter.length()");
145 CORBA::Long anIndexId = 0;
146 for (; anElemId < aNbElems; anElemId++, anIndexId+=2)
148 SMDS_MeshElement* anElem = theMesh->AddBallWithID(anIndexes[anIndexId+1],
150 anIndexes[anIndexId]);
152 EXCEPTION(runtime_error,"cannot SMDS_Mesh::AddBallsWithID for ID = "<<anElemId);
157 //=======================================================================
158 //function : AddEdgesWithID
159 //=======================================================================
160 inline void AddEdgesWithID(SMDS_Mesh* theMesh,
161 SMESH::log_array_var& theSeq,
164 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
165 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
166 if(3*aNbElems != (CORBA::Long) anIndexes.length())
167 EXCEPTION(runtime_error,"AddEdgeWithID - 3*aNbElems != aCoords.length()");
168 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=3){
169 SMDS_MeshElement* anElem = theMesh->AddEdgeWithID(anIndexes[anIndexId+1],
170 anIndexes[anIndexId+2],
171 anIndexes[anIndexId]);
173 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<<anElemId);
178 //=======================================================================
179 //function : AddTriasWithID
180 //=======================================================================
181 inline void AddTriasWithID(SMDS_Mesh* theMesh,
182 SMESH::log_array_var& theSeq,
185 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
186 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
187 if(4*aNbElems != (CORBA::Long) anIndexes.length())
188 EXCEPTION(runtime_error,"AddTriasWithID - 4*aNbElems != anIndexes.length()");
189 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=4){
190 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
191 anIndexes[anIndexId+2],
192 anIndexes[anIndexId+3],
193 anIndexes[anIndexId]);
195 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
200 //=======================================================================
201 //function : AddQuadsWithID
202 //=======================================================================
203 inline void AddQuadsWithID(SMDS_Mesh* theMesh,
204 SMESH::log_array_var theSeq,
207 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
208 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
209 if(5*aNbElems != (CORBA::Long) anIndexes.length())
210 EXCEPTION(runtime_error,"AddQuadsWithID - 4*aNbElems != anIndexes.length()");
211 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){
212 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
213 anIndexes[anIndexId+2],
214 anIndexes[anIndexId+3],
215 anIndexes[anIndexId+4],
216 anIndexes[anIndexId]);
218 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
223 //=======================================================================
224 //function : AddPolygonsWithID
225 //=======================================================================
226 inline void AddPolygonsWithID(SMDS_Mesh* theMesh,
227 SMESH::log_array_var& theSeq,
230 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
231 CORBA::Long anIndexId = 0, aNbElems = theSeq[theId].number;
233 for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) {
234 int aFaceId = anIndexes[anIndexId++];
236 int aNbNodes = anIndexes[anIndexId++];
237 std::vector<int> nodes_ids (aNbNodes);
238 for (int i = 0; i < aNbNodes; i++) {
239 nodes_ids[i] = anIndexes[anIndexId++];
242 SMDS_MeshElement* anElem = theMesh->AddPolygonalFaceWithID(nodes_ids, aFaceId);
244 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolygonalFaceWithID for ID = "
250 //=======================================================================
251 //function : AddQaudPolygonsWithID
252 //=======================================================================
253 inline void AddQuadPolygonsWithID(SMDS_Mesh* theMesh,
254 SMESH::log_array_var& theSeq,
257 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
258 CORBA::Long anIndexId = 0, aNbElems = theSeq[theId].number;
260 for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) {
261 int aFaceId = anIndexes[anIndexId++];
263 int aNbNodes = anIndexes[anIndexId++];
264 std::vector<int> nodes_ids (aNbNodes);
265 for (int i = 0; i < aNbNodes; i++) {
266 nodes_ids[i] = anIndexes[anIndexId++];
269 SMDS_MeshElement* anElem = theMesh->AddQuadPolygonalFaceWithID(nodes_ids, aFaceId);
271 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddQaudPolygonalFaceWithID for ID = "
277 //=======================================================================
278 //function : AddTetrasWithID
279 //=======================================================================
280 inline void AddTetrasWithID(SMDS_Mesh* theMesh,
281 SMESH::log_array_var& theSeq,
284 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
285 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
286 if(5*aNbElems != (CORBA::Long) anIndexes.length())
287 EXCEPTION(runtime_error,"AddTetrasWithID - 5*aNbElems != anIndexes.length()");
288 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){
289 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
290 anIndexes[anIndexId+2],
291 anIndexes[anIndexId+3],
292 anIndexes[anIndexId+4],
293 anIndexes[anIndexId]);
295 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
300 //=======================================================================
301 //function : AddPiramidsWithID
302 //=======================================================================
303 inline void AddPiramidsWithID(SMDS_Mesh* theMesh,
304 SMESH::log_array_var& theSeq,
307 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
308 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
309 if(6*aNbElems != (CORBA::Long) anIndexes.length())
310 EXCEPTION(runtime_error,"AddPiramidsWithID - 6*aNbElems != anIndexes.length()");
311 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=6){
312 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
313 anIndexes[anIndexId+2],
314 anIndexes[anIndexId+3],
315 anIndexes[anIndexId+4],
316 anIndexes[anIndexId+5],
317 anIndexes[anIndexId]);
319 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
324 //=======================================================================
325 //function : AddPrismsWithID
326 //=======================================================================
327 inline void AddPrismsWithID(SMDS_Mesh* theMesh,
328 SMESH::log_array_var& theSeq,
331 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
332 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
333 if(7*aNbElems != (CORBA::Long) anIndexes.length())
334 EXCEPTION(runtime_error,"AddPrismsWithID - 7*aNbElems != anIndexes.length()");
335 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=7){
336 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
337 anIndexes[anIndexId+2],
338 anIndexes[anIndexId+3],
339 anIndexes[anIndexId+4],
340 anIndexes[anIndexId+5],
341 anIndexes[anIndexId+6],
342 anIndexes[anIndexId]);
344 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
349 //=======================================================================
350 //function : AddHexasWithID
351 //=======================================================================
352 inline void AddHexasWithID(SMDS_Mesh* theMesh,
353 SMESH::log_array_var& theSeq,
356 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
357 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
358 if(9*aNbElems != (CORBA::Long) anIndexes.length())
359 EXCEPTION(runtime_error,"AddHexasWithID - 9*aNbElems != anIndexes.length()");
360 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=9){
361 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
362 anIndexes[anIndexId+2],
363 anIndexes[anIndexId+3],
364 anIndexes[anIndexId+4],
365 anIndexes[anIndexId+5],
366 anIndexes[anIndexId+6],
367 anIndexes[anIndexId+7],
368 anIndexes[anIndexId+8],
369 anIndexes[anIndexId]);
371 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
375 //=======================================================================
376 //function : AddHexPrismWithID
377 //=======================================================================
378 inline void AddHexPrismWithID(SMDS_Mesh* theMesh,
379 SMESH::log_array_var& theSeq,
382 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
383 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
384 if(13*aNbElems != (CORBA::Long) anIndexes.length())
385 EXCEPTION(runtime_error,"AddHexPrismWithID - 13*aNbElems != anIndexes.length()");
386 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=13){
387 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
388 anIndexes[anIndexId+2],
389 anIndexes[anIndexId+3],
390 anIndexes[anIndexId+4],
391 anIndexes[anIndexId+5],
392 anIndexes[anIndexId+6],
393 anIndexes[anIndexId+7],
394 anIndexes[anIndexId+8],
395 anIndexes[anIndexId+9],
396 anIndexes[anIndexId+10],
397 anIndexes[anIndexId+11],
398 anIndexes[anIndexId+12],
399 anIndexes[anIndexId]);
401 EXCEPTION(runtime_error,"AddHexPrismWithID - cannot AddVolumeWithID for ID = "<<anElemId);
406 //=======================================================================
407 //function : AddPolyhedronsWithID
408 //=======================================================================
409 inline void AddPolyhedronsWithID (SMDS_Mesh* theMesh,
410 SMESH::log_array_var& theSeq,
413 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
414 CORBA::Long anIndexId = 0, aNbElems = theSeq[theId].number;
416 for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) {
417 int aFaceId = anIndexes[anIndexId++];
419 int aNbNodes = anIndexes[anIndexId++];
420 std::vector<int> nodes_ids (aNbNodes);
421 for (int i = 0; i < aNbNodes; i++) {
422 nodes_ids[i] = anIndexes[anIndexId++];
425 int aNbFaces = anIndexes[anIndexId++];
426 std::vector<int> quantities (aNbFaces);
427 for (int i = 0; i < aNbFaces; i++) {
428 quantities[i] = anIndexes[anIndexId++];
431 SMDS_MeshElement* anElem =
432 theMesh->AddPolyhedralVolumeWithID(nodes_ids, quantities, aFaceId);
434 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolyhedralVolumeWithID for ID = "
440 //=======================================================================
441 //function : AddQuadEdgesWithID
442 //=======================================================================
443 inline void AddQuadEdgesWithID(SMDS_Mesh* theMesh,
444 SMESH::log_array_var& theSeq,
447 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
448 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
449 if(4*aNbElems != (CORBA::Long) anIndexes.length())
450 EXCEPTION(runtime_error,"AddQuadEdgeWithID - 4*aNbElems != aCoords.length()");
451 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=4){
452 SMDS_MeshElement* anElem = theMesh->AddEdgeWithID(anIndexes[anIndexId+1],
453 anIndexes[anIndexId+2],
454 anIndexes[anIndexId+3],
455 anIndexes[anIndexId]);
457 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<<anElemId);
462 //=======================================================================
463 //function : AddQuadTriasWithID
464 //=======================================================================
465 inline void AddQuadTriasWithID(SMDS_Mesh* theMesh,
466 SMESH::log_array_var& theSeq,
469 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
470 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
471 if(7*aNbElems != (CORBA::Long) anIndexes.length())
472 EXCEPTION(runtime_error,"AddQuadTriasWithID - 7*aNbElems != anIndexes.length()");
473 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=7){
474 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
475 anIndexes[anIndexId+2],
476 anIndexes[anIndexId+3],
477 anIndexes[anIndexId+4],
478 anIndexes[anIndexId+5],
479 anIndexes[anIndexId+6],
480 anIndexes[anIndexId]);
482 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
487 //=======================================================================
488 //function : AddQuadQuadsWithID
489 //=======================================================================
490 inline void AddQuadQuadsWithID(SMDS_Mesh* theMesh,
491 SMESH::log_array_var theSeq,
494 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
495 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
496 if(9*aNbElems != (CORBA::Long) anIndexes.length())
497 EXCEPTION(runtime_error,"AddQuadQuadsWithID - 9*aNbElems != anIndexes.length()");
498 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=9){
499 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
500 anIndexes[anIndexId+2],
501 anIndexes[anIndexId+3],
502 anIndexes[anIndexId+4],
503 anIndexes[anIndexId+5],
504 anIndexes[anIndexId+6],
505 anIndexes[anIndexId+7],
506 anIndexes[anIndexId+8],
507 anIndexes[anIndexId]);
509 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
513 //=======================================================================
514 //function : AddBiQuadQuadsWithID
515 //=======================================================================
516 inline void AddBiQuadQuadsWithID(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(10*aNbElems != (CORBA::Long) anIndexes.length())
523 EXCEPTION(runtime_error,"AddBiQuadQuadsWithID - 10*aNbElems != anIndexes.length()");
524 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=10){
525 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(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]);
536 EXCEPTION(runtime_error,"AddBiQuadQuadsWithID() - cannot AddFaceWithID for ID = "<<anElemId);
540 //=======================================================================
541 //function : AddBiQuadTriasWithID
542 //=======================================================================
543 inline void AddBiQuadTriasWithID(SMDS_Mesh* theMesh,
544 SMESH::log_array_var theSeq,
547 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
548 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
549 if(8*aNbElems != (CORBA::Long) anIndexes.length())
550 EXCEPTION(runtime_error,"AddBiQuadTriasWithID - 8*aNbElems != anIndexes.length()");
551 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=8){
552 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
553 anIndexes[anIndexId+2],
554 anIndexes[anIndexId+3],
555 anIndexes[anIndexId+4],
556 anIndexes[anIndexId+5],
557 anIndexes[anIndexId+6],
558 anIndexes[anIndexId+7],
559 anIndexes[anIndexId]);
561 EXCEPTION(runtime_error,"AddBiQuadTriasWithID() - cannot AddFaceWithID for ID = "<<anElemId);
566 //=======================================================================
567 //function : AddQuadTetrasWithID
568 //=======================================================================
569 inline void AddQuadTetrasWithID(SMDS_Mesh* theMesh,
570 SMESH::log_array_var& theSeq,
573 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
574 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
575 if(11*aNbElems != (CORBA::Long) anIndexes.length())
576 EXCEPTION(runtime_error,"AddQuadTetrasWithID - 11*aNbElems != anIndexes.length()");
577 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=11){
578 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
579 anIndexes[anIndexId+2],
580 anIndexes[anIndexId+3],
581 anIndexes[anIndexId+4],
582 anIndexes[anIndexId+5],
583 anIndexes[anIndexId+6],
584 anIndexes[anIndexId+7],
585 anIndexes[anIndexId+8],
586 anIndexes[anIndexId+9],
587 anIndexes[anIndexId+10],
588 anIndexes[anIndexId]);
590 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
595 //=======================================================================
596 //function : AddQuadPiramidsWithID
597 //=======================================================================
598 inline void AddQuadPiramidsWithID(SMDS_Mesh* theMesh,
599 SMESH::log_array_var& theSeq,
602 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
603 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
604 if(14*aNbElems != (CORBA::Long) anIndexes.length())
605 EXCEPTION(runtime_error,"AddQuadPiramidsWithID - 14*aNbElems != anIndexes.length()");
606 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=14){
607 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
608 anIndexes[anIndexId+2],
609 anIndexes[anIndexId+3],
610 anIndexes[anIndexId+4],
611 anIndexes[anIndexId+5],
612 anIndexes[anIndexId+6],
613 anIndexes[anIndexId+7],
614 anIndexes[anIndexId+8],
615 anIndexes[anIndexId+9],
616 anIndexes[anIndexId+10],
617 anIndexes[anIndexId+11],
618 anIndexes[anIndexId+12],
619 anIndexes[anIndexId+13],
620 anIndexes[anIndexId]);
622 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
627 //=======================================================================
628 //function : AddQuadPentasWithID
629 //=======================================================================
630 inline void AddQuadPentasWithID(SMDS_Mesh* theMesh,
631 SMESH::log_array_var& theSeq,
634 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
635 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
636 if(16*aNbElems != (CORBA::Long) anIndexes.length())
637 EXCEPTION(runtime_error,"AddQuadPentasWithID - 16*aNbElems != anIndexes.length()");
638 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=16){
639 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
640 anIndexes[anIndexId+2],
641 anIndexes[anIndexId+3],
642 anIndexes[anIndexId+4],
643 anIndexes[anIndexId+5],
644 anIndexes[anIndexId+6],
645 anIndexes[anIndexId+7],
646 anIndexes[anIndexId+8],
647 anIndexes[anIndexId+9],
648 anIndexes[anIndexId+10],
649 anIndexes[anIndexId+11],
650 anIndexes[anIndexId+12],
651 anIndexes[anIndexId+13],
652 anIndexes[anIndexId+14],
653 anIndexes[anIndexId+15],
654 anIndexes[anIndexId]);
656 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
661 //=======================================================================
662 //function : AddQuadHexasWithID
663 //=======================================================================
664 inline void AddQuadHexasWithID(SMDS_Mesh* theMesh,
665 SMESH::log_array_var& theSeq,
668 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
669 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
670 if(21*aNbElems != (CORBA::Long) anIndexes.length())
671 EXCEPTION(runtime_error,"AddQuadHexasWithID - 21*aNbElems != anIndexes.length()");
672 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=21){
673 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
674 anIndexes[anIndexId+2],
675 anIndexes[anIndexId+3],
676 anIndexes[anIndexId+4],
677 anIndexes[anIndexId+5],
678 anIndexes[anIndexId+6],
679 anIndexes[anIndexId+7],
680 anIndexes[anIndexId+8],
681 anIndexes[anIndexId+9],
682 anIndexes[anIndexId+10],
683 anIndexes[anIndexId+11],
684 anIndexes[anIndexId+12],
685 anIndexes[anIndexId+13],
686 anIndexes[anIndexId+14],
687 anIndexes[anIndexId+15],
688 anIndexes[anIndexId+16],
689 anIndexes[anIndexId+17],
690 anIndexes[anIndexId+18],
691 anIndexes[anIndexId+19],
692 anIndexes[anIndexId+20],
693 anIndexes[anIndexId]);
695 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
699 //=======================================================================
700 //function : AddTriQuadHexasWithID
701 //=======================================================================
702 inline void AddTriQuadHexasWithID(SMDS_Mesh* theMesh,
703 SMESH::log_array_var& theSeq,
706 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
707 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
708 if(28*aNbElems != (CORBA::Long) anIndexes.length())
709 EXCEPTION(runtime_error,"AddTriQuadHexasWithID - 28*aNbElems != anIndexes.length()");
710 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=28){
711 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
712 anIndexes[anIndexId+2],
713 anIndexes[anIndexId+3],
714 anIndexes[anIndexId+4],
715 anIndexes[anIndexId+5],
716 anIndexes[anIndexId+6],
717 anIndexes[anIndexId+7],
718 anIndexes[anIndexId+8],
719 anIndexes[anIndexId+9],
720 anIndexes[anIndexId+10],
721 anIndexes[anIndexId+11],
722 anIndexes[anIndexId+12],
723 anIndexes[anIndexId+13],
724 anIndexes[anIndexId+14],
725 anIndexes[anIndexId+15],
726 anIndexes[anIndexId+16],
727 anIndexes[anIndexId+17],
728 anIndexes[anIndexId+18],
729 anIndexes[anIndexId+19],
730 anIndexes[anIndexId+20],
731 anIndexes[anIndexId+21],
732 anIndexes[anIndexId+22],
733 anIndexes[anIndexId+23],
734 anIndexes[anIndexId+24],
735 anIndexes[anIndexId+25],
736 anIndexes[anIndexId+26],
737 anIndexes[anIndexId+27],
738 anIndexes[anIndexId]);
740 EXCEPTION(runtime_error,"AddTriQuadHexasWithID() - cannot AddVolumeWithID for ID = "<<anElemId);
745 //=======================================================================
746 //function : ChangePolyhedronNodes
747 //=======================================================================
748 inline void ChangePolyhedronNodes (SMDS_Mesh* theMesh,
749 SMESH::log_array_var& theSeq,
752 // const SMESH::long_array& anIndexes = theSeq[theId].indexes;
753 // CORBA::Long iind = 0, aNbElems = theSeq[theId].number;
755 // for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++)
758 // const SMDS_MeshElement* elem = FindElement(theMesh, anIndexes[iind++]);
760 // int nbNodes = anIndexes[iind++];
762 // std::vector<const SMDS_MeshNode*> aNodes (nbNodes);
763 // for (int iNode = 0; iNode < nbNodes; iNode++) {
764 // aNodes[iNode] = FindNode(theMesh, anIndexes[iind++]);
767 // int nbFaces = anIndexes[iind++];
769 // std::vector<int> quantities (nbFaces);
770 // for (int iFace = 0; iFace < nbFaces; iFace++) {
771 // quantities[iFace] = anIndexes[iind++];
774 // theMesh->ChangePolyhedronNodes(elem, aNodes, quantities);
779 //=======================================================================
781 SMESH_Client::GetSMESHGen(CORBA::ORB_ptr theORB,
782 CORBA::Boolean& theIsEmbeddedMode)
784 static SMESH::SMESH_Gen_var aMeshGen;
786 if(CORBA::is_nil(aMeshGen.in())){
788 long aClientPID = (long)_getpid();
790 long aClientPID = (long)getpid();
793 SALOME_NamingService aNamingService(theORB);
794 SALOME_LifeCycleCORBA aLifeCycleCORBA(&aNamingService);
795 Engines::EngineComponent_var aComponent = aLifeCycleCORBA.FindOrLoad_Component("FactoryServer","SMESH");
796 aMeshGen = SMESH::SMESH_Gen::_narrow(aComponent);
798 std::string aClientHostName = Kernel_Utils::GetHostname();
799 Engines::Container_var aServerContainer = aMeshGen->GetContainerRef();
800 CORBA::String_var aServerHostName = aServerContainer->getHostName();
801 CORBA::Long aServerPID = aServerContainer->getPID();
802 aMeshGen->SetEmbeddedMode((aClientPID == aServerPID) && (aClientHostName == aServerHostName.in()));
804 theIsEmbeddedMode = aMeshGen->IsEmbeddedMode();
810 //=======================================================================
811 // function : Create()
813 //=======================================================================
814 SMESH_Client::SMESH_Client(CORBA::ORB_ptr theORB,
815 SMESH::SMESH_Mesh_ptr theMesh):
816 myMeshServer(SMESH::SMESH_Mesh::_duplicate(theMesh)),
820 if ( MYDEBUG ) MESSAGE("SMESH_Client::SMESH_Client");
821 myMeshServer->Register();
823 CORBA::Boolean anIsEmbeddedMode;
824 GetSMESHGen(theORB,anIsEmbeddedMode);
825 if(anIsEmbeddedMode){
826 if ( MYDEBUG ) MESSAGE("Info: The same process, update mesh by pointer ");
827 // just set client mesh pointer to server mesh pointer
828 //SMESH_Mesh* aMesh = reinterpret_cast<SMESH_Mesh*>(theMesh->GetMeshPtr());
829 CORBA::LongLong pointeur = theMesh->GetMeshPtr();
830 if( MYDEBUG ) MESSAGE("SMESH_Client::SMESH_Client pointeur "<<pointeur);
831 SMESH_Mesh* aMesh = reinterpret_cast<SMESH_Mesh*> (pointeur);
832 if ( MYDEBUG ) MESSAGE("SMESH_Client::SMESH_Client aMesh "<<aMesh);
833 //if(aMesh->GetMeshDS()->IsEmbeddedMode()){
834 if(anIsEmbeddedMode){
835 mySMESHDSMesh = aMesh->GetMeshDS();
836 mySMDSMesh = mySMESHDSMesh;
840 mySMDSMesh = new SMDS_Mesh();
844 //=================================================================================
845 // function : ~SMESH_Client
846 // purpose : Destructor
847 //=================================================================================
848 SMESH_Client::~SMESH_Client()
850 myMeshServer->UnRegister();
856 //=================================================================================
858 SMESH_Client::GetMesh() const
864 //=================================================================================
866 SMESH_Client::operator->() const
872 //=================================================================================
873 SMESH::SMESH_Mesh_ptr
874 SMESH_Client::GetMeshServer()
876 return myMeshServer.in();
880 //=================================================================================
881 // function : SMESH_Client
882 // purpose : Update mesh
883 //=================================================================================
885 SMESH_Client::Update(bool theIsClear)
887 bool anIsModified = true;
890 if ( MYDEBUG ) MESSAGE("Update mySMESHDSMesh");
891 SMESHDS_Script* aScript = mySMESHDSMesh->GetScript();
892 anIsModified = aScript->IsModified();
893 aScript->SetModified(false);
897 if ( MYDEBUG ) MESSAGE("Update CORBA");
898 SMESH::log_array_var aSeq = myMeshServer->GetLog( theIsClear );
899 CORBA::Long aLength = aSeq->length();
900 anIsModified = aLength > 0;
901 if ( MYDEBUG ) MESSAGE( "Update: length of the script is "<<aLength );
906 // update client mesh structure by logged changes commands
909 for ( CORBA::Long anId = 0; anId < aLength; anId++)
911 const SMESH::double_array& aCoords = aSeq[anId].coords;
912 const SMESH::long_array& anIndexes = aSeq[anId].indexes;
913 CORBA::Long anElemId = 0, aNbElems = aSeq[anId].number;
914 CORBA::Long aCommand = aSeq[anId].commandType;
918 case SMESH::ADD_NODE : AddNodesWithID ( mySMDSMesh, aSeq, anId ); break;
919 case SMESH::ADD_EDGE : AddEdgesWithID ( mySMDSMesh, aSeq, anId ); break;
920 case SMESH::ADD_TRIANGLE : AddTriasWithID ( mySMDSMesh, aSeq, anId ); break;
921 case SMESH::ADD_QUADRANGLE : AddQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
922 case SMESH::ADD_POLYGON : AddPolygonsWithID ( mySMDSMesh, aSeq, anId ); break;
923 case SMESH::ADD_TETRAHEDRON : AddTetrasWithID ( mySMDSMesh, aSeq, anId ); break;
924 case SMESH::ADD_PYRAMID : AddPiramidsWithID ( mySMDSMesh, aSeq, anId ); break;
925 case SMESH::ADD_PRISM : AddPrismsWithID ( mySMDSMesh, aSeq, anId ); break;
926 case SMESH::ADD_HEXAHEDRON : AddHexasWithID ( mySMDSMesh, aSeq, anId ); break;
927 case SMESH::ADD_HEXAGONAL_PRISM : AddHexPrismWithID ( mySMDSMesh, aSeq, anId ); break;
928 case SMESH::ADD_POLYHEDRON : AddPolyhedronsWithID( mySMDSMesh, aSeq, anId ); break;
929 case SMESH::ADD_ELEM0D : Add0DElementsWithID ( mySMDSMesh, aSeq, anId ); break;
930 case SMESH::ADD_BALL : AddBallsWithID ( mySMDSMesh, aSeq, anId ); break;
932 case SMESH::ADD_QUADEDGE : AddQuadEdgesWithID ( mySMDSMesh, aSeq, anId ); break;
933 case SMESH::ADD_QUADTRIANGLE : AddQuadTriasWithID ( mySMDSMesh, aSeq, anId ); break;
934 case SMESH::ADD_QUADQUADRANGLE : AddQuadQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
935 case SMESH::ADD_QUADPOLYGON : AddQuadPolygonsWithID( mySMDSMesh, aSeq, anId ); break;
936 case SMESH::ADD_QUADTETRAHEDRON : AddQuadTetrasWithID ( mySMDSMesh, aSeq, anId ); break;
937 case SMESH::ADD_QUADPYRAMID : AddQuadPiramidsWithID( mySMDSMesh, aSeq, anId ); break;
938 case SMESH::ADD_QUADPENTAHEDRON : AddQuadPentasWithID ( mySMDSMesh, aSeq, anId ); break;
939 case SMESH::ADD_QUADHEXAHEDRON : AddQuadHexasWithID ( mySMDSMesh, aSeq, anId ); break;
941 case SMESH::ADD_BIQUAD_QUADRANGLE: AddBiQuadQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
942 case SMESH::ADD_BIQUAD_TRIANGLE : AddBiQuadTriasWithID ( mySMDSMesh, aSeq, anId ); break;
943 case SMESH::ADD_TRIQUAD_HEXA : AddTriQuadHexasWithID( mySMDSMesh, aSeq, anId ); break;
945 case SMESH::CLEAR_MESH:
949 case SMESH::REMOVE_NODE:
950 for( ; anElemId < aNbElems; anElemId++ )
951 mySMDSMesh->RemoveNode( FindNode( mySMDSMesh, anIndexes[anElemId] ) );
954 case SMESH::REMOVE_ELEMENT:
955 for( ; anElemId < aNbElems; anElemId++ )
956 mySMDSMesh->RemoveElement( FindElement( mySMDSMesh, anIndexes[anElemId] ) );
959 case SMESH::MOVE_NODE:
960 for(CORBA::Long aCoordId=0; anElemId < aNbElems; anElemId++, aCoordId+=3)
962 SMDS_MeshNode* node =
963 const_cast<SMDS_MeshNode*>( FindNode( mySMDSMesh, anIndexes[anElemId] ));
964 node->setXYZ( aCoords[aCoordId], aCoords[aCoordId+1], aCoords[aCoordId+2] );
968 case SMESH::CHANGE_ELEMENT_NODES:
969 for ( CORBA::Long i = 0; anElemId < aNbElems; anElemId++ )
972 const SMDS_MeshElement* elem = FindElement( mySMDSMesh, anIndexes[i++] );
974 int nbNodes = anIndexes[i++];
976 //ASSERT( nbNodes < 9 );
977 std::vector<const SMDS_MeshNode*> aNodes( nbNodes );
978 for ( int iNode = 0; iNode < nbNodes; iNode++ )
979 aNodes[ iNode ] = FindNode( mySMDSMesh, anIndexes[i++] );
981 mySMDSMesh->ChangeElementNodes( elem, &aNodes[0], nbNodes );
985 case SMESH::CHANGE_POLYHEDRON_NODES:
986 ChangePolyhedronNodes(mySMDSMesh, aSeq, anId);
988 case SMESH::RENUMBER:
989 // for(CORBA::Long i=0; anElemId < aNbElems; anElemId++, i+=3)
991 // mySMDSMesh->Renumber( anIndexes[i], anIndexes[i+1], anIndexes[i+2] );
999 catch ( SALOME::SALOME_Exception& exc )
1001 INFOS("Following exception was cought:\n\t"<<exc.details.text);
1003 catch( const std::exception& exc)
1005 INFOS("Following exception was cought:\n\t"<<exc.what());
1009 INFOS("Unknown exception was cought !!!");
1012 if ( MYDEBUG && mySMDSMesh )
1014 MESSAGE("Update - mySMDSMesh->NbNodes() = "<<mySMDSMesh->NbNodes());
1015 MESSAGE("Update - mySMDSMesh->Nb0DElements() = "<<mySMDSMesh->Nb0DElements());
1016 MESSAGE("Update - mySMDSMesh->NbEdges() = "<<mySMDSMesh->NbEdges());
1017 MESSAGE("Update - mySMDSMesh->NbFaces() = "<<mySMDSMesh->NbFaces());
1018 MESSAGE("Update - mySMDSMesh->NbVolumes() = "<<mySMDSMesh->NbVolumes());
1020 } // end of update mesh by log script
1022 return anIsModified;