1 // Copyright (C) 2007-2021 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"
31 #include "SMESH_Component_Generator.hxx"
33 #include "SALOME_NamingService.hxx"
34 #include "SALOME_Fake_NamingService.hxx"
35 #include "SALOME_LifeCycleCORBA.hxx"
37 #include <SALOMEconfig.h>
38 #include <smIdType.hxx>
39 #include CORBA_SERVER_HEADER(SALOME_Component)
40 #include CORBA_SERVER_HEADER(SALOME_Exception)
42 #include "Basics_Utils.hxx"
43 #include "KernelBasis.hxx"
44 #include "utilities.h"
56 #define EXCEPTION(TYPE, MSG) {\
57 std::ostringstream aStream;\
58 aStream<<__FILE__<<"["<<__LINE__<<"]::"<<MSG;\
59 throw TYPE(aStream.str());\
64 static int MYDEBUG = 0;
66 static int MYDEBUG = 0;
71 using std::runtime_error;
73 //=======================================================================
75 //=======================================================================
76 inline const SMDS_MeshNode* FindNode(const SMDS_Mesh* theMesh, int theId){
77 if(const SMDS_MeshNode* anElem = theMesh->FindNode(theId)) return anElem;
78 EXCEPTION(runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "<<theId);
82 //=======================================================================
83 //function : FindElement
84 //=======================================================================
85 inline const SMDS_MeshElement* FindElement(const SMDS_Mesh* theMesh, int theId){
86 if(const SMDS_MeshElement* anElem = theMesh->FindElement(theId)) return anElem;
87 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot find a SMDS_MeshElement for ID = "<<theId);
91 //=======================================================================
92 //function : AddNodesWithID
93 //=======================================================================
94 inline void AddNodesWithID(SMDS_Mesh* theMesh,
95 SMESH::log_array_var& theSeq,
96 SMESH::smIdType theId)
98 const SMESH::double_array& aCoords = theSeq[theId].coords;
99 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
100 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
101 if(3*aNbElems != (SMESH::smIdType) aCoords.length())
102 EXCEPTION(runtime_error,"AddNodesWithID - 3*aNbElems != aCoords.length()");
103 for(SMESH::smIdType aCoordId = 0; anElemId < aNbElems; anElemId++, aCoordId+=3){
104 SMDS_MeshElement* anElem = theMesh->AddNodeWithID(aCoords[aCoordId],
107 anIndexes[anElemId]);
109 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddNodeWithID for ID = "<<anElemId);
114 //=======================================================================
115 //function : Add0DElementsWithID
116 //=======================================================================
117 inline void Add0DElementsWithID(SMDS_Mesh* theMesh,
118 SMESH::log_array_var& theSeq,
119 SMESH::smIdType theId)
121 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
122 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
123 if (2*aNbElems != (SMESH::smIdType) anIndexes.length())
124 EXCEPTION(runtime_error,"AddEdgeWithID - 2*aNbElems != aCoords.length()");
125 SMESH::smIdType anIndexId = 0;
126 for (; anElemId < aNbElems; anElemId++, anIndexId+=2)
128 SMDS_MeshElement* anElem = theMesh->Add0DElementWithID(anIndexes[anIndexId+1],
129 anIndexes[anIndexId]);
131 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot Add0DElementWithID for ID = "<<anElemId);
136 //=======================================================================
137 //function : AddBallsWithID
138 //=======================================================================
139 inline void AddBallsWithID(SMDS_Mesh* theMesh,
140 SMESH::log_array_var& theSeq,
141 SMESH::smIdType theId)
143 const SMESH::double_array& aDiameter = theSeq[theId].coords;
144 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
145 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
146 if (2*aNbElems != (SMESH::smIdType) anIndexes.length() )
147 EXCEPTION(runtime_error,"AddEdgeWithID - 2*aNbElems != anIndexes.length()");
148 if (aNbElems != (SMESH::smIdType) aDiameter.length())
149 EXCEPTION(runtime_error,"AddEdgeWithID - aNbElems != aDiameter.length()");
150 SMESH::smIdType anIndexId = 0;
151 for (; anElemId < aNbElems; anElemId++, anIndexId+=2)
153 SMDS_MeshElement* anElem = theMesh->AddBallWithID(anIndexes[anIndexId+1],
155 anIndexes[anIndexId]);
157 EXCEPTION(runtime_error,"cannot SMDS_Mesh::AddBallsWithID for ID = "<<anElemId);
162 //=======================================================================
163 //function : AddEdgesWithID
164 //=======================================================================
165 inline void AddEdgesWithID(SMDS_Mesh* theMesh,
166 SMESH::log_array_var& theSeq,
167 SMESH::smIdType theId)
169 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
170 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
171 if(3*aNbElems != (SMESH::smIdType) anIndexes.length())
172 EXCEPTION(runtime_error,"AddEdgeWithID - 3*aNbElems != aCoords.length()");
173 for(SMESH::smIdType anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=3){
174 SMDS_MeshElement* anElem = theMesh->AddEdgeWithID(anIndexes[anIndexId+1],
175 anIndexes[anIndexId+2],
176 anIndexes[anIndexId]);
178 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<<anElemId);
183 //=======================================================================
184 //function : AddTriasWithID
185 //=======================================================================
186 inline void AddTriasWithID(SMDS_Mesh* theMesh,
187 SMESH::log_array_var& theSeq,
188 SMESH::smIdType theId)
190 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
191 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
192 if(4*aNbElems != (SMESH::smIdType) anIndexes.length())
193 EXCEPTION(runtime_error,"AddTriasWithID - 4*aNbElems != anIndexes.length()");
194 for(SMESH::smIdType anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=4){
195 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
196 anIndexes[anIndexId+2],
197 anIndexes[anIndexId+3],
198 anIndexes[anIndexId]);
200 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
205 //=======================================================================
206 //function : AddQuadsWithID
207 //=======================================================================
208 inline void AddQuadsWithID(SMDS_Mesh* theMesh,
209 SMESH::log_array_var theSeq,
210 SMESH::smIdType theId)
212 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
213 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
214 if(5*aNbElems != (SMESH::smIdType) anIndexes.length())
215 EXCEPTION(runtime_error,"AddQuadsWithID - 4*aNbElems != anIndexes.length()");
216 for(SMESH::smIdType anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){
217 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
218 anIndexes[anIndexId+2],
219 anIndexes[anIndexId+3],
220 anIndexes[anIndexId+4],
221 anIndexes[anIndexId]);
223 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
228 //=======================================================================
229 //function : AddPolygonsWithID
230 //=======================================================================
231 inline void AddPolygonsWithID(SMDS_Mesh* theMesh,
232 SMESH::log_array_var& theSeq,
233 SMESH::smIdType theId)
235 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
236 SMESH::smIdType anIndexId = 0, aNbElems = theSeq[theId].number;
238 for (SMESH::smIdType anElemId = 0; anElemId < aNbElems; anElemId++) {
239 smIdType aFaceId = anIndexes[anIndexId++];
241 int aNbNodes = anIndexes[anIndexId++];
242 std::vector<smIdType> nodes_ids (aNbNodes);
243 for (int i = 0; i < aNbNodes; i++) {
244 nodes_ids[i] = anIndexes[anIndexId++];
247 SMDS_MeshElement* anElem = theMesh->AddPolygonalFaceWithID(nodes_ids, aFaceId);
249 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolygonalFaceWithID for ID = "
255 //=======================================================================
256 //function : AddQaudPolygonsWithID
257 //=======================================================================
258 inline void AddQuadPolygonsWithID(SMDS_Mesh* theMesh,
259 SMESH::log_array_var& theSeq,
260 SMESH::smIdType theId)
262 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
263 SMESH::smIdType anIndexId = 0, aNbElems = theSeq[theId].number;
265 for (SMESH::smIdType anElemId = 0; anElemId < aNbElems; anElemId++) {
266 smIdType aFaceId = anIndexes[anIndexId++];
268 int aNbNodes = anIndexes[anIndexId++];
269 std::vector<smIdType> nodes_ids (aNbNodes);
270 for (int i = 0; i < aNbNodes; i++) {
271 nodes_ids[i] = anIndexes[anIndexId++];
274 SMDS_MeshElement* anElem = theMesh->AddQuadPolygonalFaceWithID(nodes_ids, aFaceId);
276 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddQaudPolygonalFaceWithID for ID = "
282 //=======================================================================
283 //function : AddTetrasWithID
284 //=======================================================================
285 inline void AddTetrasWithID(SMDS_Mesh* theMesh,
286 SMESH::log_array_var& theSeq,
287 SMESH::smIdType theId)
289 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
290 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
291 if(5*aNbElems != (SMESH::smIdType) anIndexes.length())
292 EXCEPTION(runtime_error,"AddTetrasWithID - 5*aNbElems != anIndexes.length()");
293 for(SMESH::smIdType anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){
294 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
295 anIndexes[anIndexId+2],
296 anIndexes[anIndexId+3],
297 anIndexes[anIndexId+4],
298 anIndexes[anIndexId]);
300 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
305 //=======================================================================
306 //function : AddPiramidsWithID
307 //=======================================================================
308 inline void AddPiramidsWithID(SMDS_Mesh* theMesh,
309 SMESH::log_array_var& theSeq,
310 SMESH::smIdType theId)
312 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
313 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
314 if(6*aNbElems != (SMESH::smIdType) anIndexes.length())
315 EXCEPTION(runtime_error,"AddPiramidsWithID - 6*aNbElems != anIndexes.length()");
316 for(SMESH::smIdType anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=6){
317 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
318 anIndexes[anIndexId+2],
319 anIndexes[anIndexId+3],
320 anIndexes[anIndexId+4],
321 anIndexes[anIndexId+5],
322 anIndexes[anIndexId]);
324 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
329 //=======================================================================
330 //function : AddPrismsWithID
331 //=======================================================================
332 inline void AddPrismsWithID(SMDS_Mesh* theMesh,
333 SMESH::log_array_var& theSeq,
334 SMESH::smIdType theId)
336 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
337 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
338 if(7*aNbElems != (CORBA::Long) anIndexes.length())
339 EXCEPTION(runtime_error,"AddPrismsWithID - 7*aNbElems != anIndexes.length()");
340 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=7){
341 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
342 anIndexes[anIndexId+2],
343 anIndexes[anIndexId+3],
344 anIndexes[anIndexId+4],
345 anIndexes[anIndexId+5],
346 anIndexes[anIndexId+6],
347 anIndexes[anIndexId]);
349 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
354 //=======================================================================
355 //function : AddHexasWithID
356 //=======================================================================
357 inline void AddHexasWithID(SMDS_Mesh* theMesh,
358 SMESH::log_array_var& theSeq,
361 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
362 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
363 if(9*aNbElems != (CORBA::Long) anIndexes.length())
364 EXCEPTION(runtime_error,"AddHexasWithID - 9*aNbElems != anIndexes.length()");
365 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=9){
366 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
367 anIndexes[anIndexId+2],
368 anIndexes[anIndexId+3],
369 anIndexes[anIndexId+4],
370 anIndexes[anIndexId+5],
371 anIndexes[anIndexId+6],
372 anIndexes[anIndexId+7],
373 anIndexes[anIndexId+8],
374 anIndexes[anIndexId]);
376 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
380 //=======================================================================
381 //function : AddHexPrismWithID
382 //=======================================================================
383 inline void AddHexPrismWithID(SMDS_Mesh* theMesh,
384 SMESH::log_array_var& theSeq,
387 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
388 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
389 if(13*aNbElems != (CORBA::Long) anIndexes.length())
390 EXCEPTION(runtime_error,"AddHexPrismWithID - 13*aNbElems != anIndexes.length()");
391 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=13){
392 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
393 anIndexes[anIndexId+2],
394 anIndexes[anIndexId+3],
395 anIndexes[anIndexId+4],
396 anIndexes[anIndexId+5],
397 anIndexes[anIndexId+6],
398 anIndexes[anIndexId+7],
399 anIndexes[anIndexId+8],
400 anIndexes[anIndexId+9],
401 anIndexes[anIndexId+10],
402 anIndexes[anIndexId+11],
403 anIndexes[anIndexId+12],
404 anIndexes[anIndexId]);
406 EXCEPTION(runtime_error,"AddHexPrismWithID - cannot AddVolumeWithID for ID = "<<anElemId);
411 //=======================================================================
412 //function : AddPolyhedronsWithID
413 //=======================================================================
414 inline void AddPolyhedronsWithID (SMDS_Mesh* theMesh,
415 SMESH::log_array_var& theSeq,
418 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
419 CORBA::Long anIndexId = 0, aNbElems = theSeq[theId].number;
421 for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) {
422 smIdType aFaceId = anIndexes[anIndexId++];
424 int aNbNodes = anIndexes[anIndexId++];
425 std::vector<smIdType> nodes_ids (aNbNodes);
426 for (int i = 0; i < aNbNodes; i++) {
427 nodes_ids[i] = anIndexes[anIndexId++];
430 int aNbFaces = anIndexes[anIndexId++];
431 std::vector<int> quantities (aNbFaces);
432 for (int i = 0; i < aNbFaces; i++) {
433 quantities[i] = anIndexes[anIndexId++];
436 SMDS_MeshElement* anElem =
437 theMesh->AddPolyhedralVolumeWithID(nodes_ids, quantities, aFaceId);
439 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolyhedralVolumeWithID for ID = "
445 //=======================================================================
446 //function : AddQuadEdgesWithID
447 //=======================================================================
448 inline void AddQuadEdgesWithID(SMDS_Mesh* theMesh,
449 SMESH::log_array_var& theSeq,
452 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
453 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
454 if(4*aNbElems != (CORBA::Long) anIndexes.length())
455 EXCEPTION(runtime_error,"AddQuadEdgeWithID - 4*aNbElems != aCoords.length()");
456 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=4){
457 SMDS_MeshElement* anElem = theMesh->AddEdgeWithID(anIndexes[anIndexId+1],
458 anIndexes[anIndexId+2],
459 anIndexes[anIndexId+3],
460 anIndexes[anIndexId]);
462 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<<anElemId);
467 //=======================================================================
468 //function : AddQuadTriasWithID
469 //=======================================================================
470 inline void AddQuadTriasWithID(SMDS_Mesh* theMesh,
471 SMESH::log_array_var& theSeq,
474 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
475 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
476 if(7*aNbElems != (CORBA::Long) anIndexes.length())
477 EXCEPTION(runtime_error,"AddQuadTriasWithID - 7*aNbElems != anIndexes.length()");
478 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=7){
479 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
480 anIndexes[anIndexId+2],
481 anIndexes[anIndexId+3],
482 anIndexes[anIndexId+4],
483 anIndexes[anIndexId+5],
484 anIndexes[anIndexId+6],
485 anIndexes[anIndexId]);
487 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
492 //=======================================================================
493 //function : AddQuadQuadsWithID
494 //=======================================================================
495 inline void AddQuadQuadsWithID(SMDS_Mesh* theMesh,
496 SMESH::log_array_var theSeq,
499 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
500 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
501 if(9*aNbElems != (CORBA::Long) anIndexes.length())
502 EXCEPTION(runtime_error,"AddQuadQuadsWithID - 9*aNbElems != anIndexes.length()");
503 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=9){
504 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
505 anIndexes[anIndexId+2],
506 anIndexes[anIndexId+3],
507 anIndexes[anIndexId+4],
508 anIndexes[anIndexId+5],
509 anIndexes[anIndexId+6],
510 anIndexes[anIndexId+7],
511 anIndexes[anIndexId+8],
512 anIndexes[anIndexId]);
514 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
518 //=======================================================================
519 //function : AddBiQuadQuadsWithID
520 //=======================================================================
521 inline void AddBiQuadQuadsWithID(SMDS_Mesh* theMesh,
522 SMESH::log_array_var theSeq,
525 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
526 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
527 if(10*aNbElems != (CORBA::Long) anIndexes.length())
528 EXCEPTION(runtime_error,"AddBiQuadQuadsWithID - 10*aNbElems != anIndexes.length()");
529 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=10){
530 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
531 anIndexes[anIndexId+2],
532 anIndexes[anIndexId+3],
533 anIndexes[anIndexId+4],
534 anIndexes[anIndexId+5],
535 anIndexes[anIndexId+6],
536 anIndexes[anIndexId+7],
537 anIndexes[anIndexId+8],
538 anIndexes[anIndexId+9],
539 anIndexes[anIndexId]);
541 EXCEPTION(runtime_error,"AddBiQuadQuadsWithID() - cannot AddFaceWithID for ID = "<<anElemId);
545 //=======================================================================
546 //function : AddBiQuadTriasWithID
547 //=======================================================================
548 inline void AddBiQuadTriasWithID(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(8*aNbElems != (CORBA::Long) anIndexes.length())
555 EXCEPTION(runtime_error,"AddBiQuadTriasWithID - 8*aNbElems != anIndexes.length()");
556 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=8){
557 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(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]);
566 EXCEPTION(runtime_error,"AddBiQuadTriasWithID() - cannot AddFaceWithID for ID = "<<anElemId);
571 //=======================================================================
572 //function : AddQuadTetrasWithID
573 //=======================================================================
574 inline void AddQuadTetrasWithID(SMDS_Mesh* theMesh,
575 SMESH::log_array_var& theSeq,
578 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
579 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
580 if(11*aNbElems != (CORBA::Long) anIndexes.length())
581 EXCEPTION(runtime_error,"AddQuadTetrasWithID - 11*aNbElems != anIndexes.length()");
582 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=11){
583 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
584 anIndexes[anIndexId+2],
585 anIndexes[anIndexId+3],
586 anIndexes[anIndexId+4],
587 anIndexes[anIndexId+5],
588 anIndexes[anIndexId+6],
589 anIndexes[anIndexId+7],
590 anIndexes[anIndexId+8],
591 anIndexes[anIndexId+9],
592 anIndexes[anIndexId+10],
593 anIndexes[anIndexId]);
595 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
600 //=======================================================================
601 //function : AddQuadPiramidsWithID
602 //=======================================================================
603 inline void AddQuadPiramidsWithID(SMDS_Mesh* theMesh,
604 SMESH::log_array_var& theSeq,
607 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
608 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
609 if(14*aNbElems != (CORBA::Long) anIndexes.length())
610 EXCEPTION(runtime_error,"AddQuadPiramidsWithID - 14*aNbElems != anIndexes.length()");
611 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=14){
612 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
613 anIndexes[anIndexId+2],
614 anIndexes[anIndexId+3],
615 anIndexes[anIndexId+4],
616 anIndexes[anIndexId+5],
617 anIndexes[anIndexId+6],
618 anIndexes[anIndexId+7],
619 anIndexes[anIndexId+8],
620 anIndexes[anIndexId+9],
621 anIndexes[anIndexId+10],
622 anIndexes[anIndexId+11],
623 anIndexes[anIndexId+12],
624 anIndexes[anIndexId+13],
625 anIndexes[anIndexId]);
627 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
632 //=======================================================================
633 //function : AddQuadPentasWithID
634 //=======================================================================
635 inline void AddQuadPentasWithID(SMDS_Mesh* theMesh,
636 SMESH::log_array_var& theSeq,
639 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
640 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
641 if(16*aNbElems != (CORBA::Long) anIndexes.length())
642 EXCEPTION(runtime_error,"AddQuadPentasWithID - 16*aNbElems != anIndexes.length()");
643 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=16){
644 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
645 anIndexes[anIndexId+2],
646 anIndexes[anIndexId+3],
647 anIndexes[anIndexId+4],
648 anIndexes[anIndexId+5],
649 anIndexes[anIndexId+6],
650 anIndexes[anIndexId+7],
651 anIndexes[anIndexId+8],
652 anIndexes[anIndexId+9],
653 anIndexes[anIndexId+10],
654 anIndexes[anIndexId+11],
655 anIndexes[anIndexId+12],
656 anIndexes[anIndexId+13],
657 anIndexes[anIndexId+14],
658 anIndexes[anIndexId+15],
659 anIndexes[anIndexId]);
661 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
666 //=======================================================================
667 //function : AddQuadHexasWithID
668 //=======================================================================
669 inline void AddQuadHexasWithID(SMDS_Mesh* theMesh,
670 SMESH::log_array_var& theSeq,
673 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
674 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
675 if(21*aNbElems != (CORBA::Long) anIndexes.length())
676 EXCEPTION(runtime_error,"AddQuadHexasWithID - 21*aNbElems != anIndexes.length()");
677 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=21){
678 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
679 anIndexes[anIndexId+2],
680 anIndexes[anIndexId+3],
681 anIndexes[anIndexId+4],
682 anIndexes[anIndexId+5],
683 anIndexes[anIndexId+6],
684 anIndexes[anIndexId+7],
685 anIndexes[anIndexId+8],
686 anIndexes[anIndexId+9],
687 anIndexes[anIndexId+10],
688 anIndexes[anIndexId+11],
689 anIndexes[anIndexId+12],
690 anIndexes[anIndexId+13],
691 anIndexes[anIndexId+14],
692 anIndexes[anIndexId+15],
693 anIndexes[anIndexId+16],
694 anIndexes[anIndexId+17],
695 anIndexes[anIndexId+18],
696 anIndexes[anIndexId+19],
697 anIndexes[anIndexId+20],
698 anIndexes[anIndexId]);
700 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
704 //=======================================================================
705 //function : AddTriQuadHexasWithID
706 //=======================================================================
707 inline void AddTriQuadHexasWithID(SMDS_Mesh* theMesh,
708 SMESH::log_array_var& theSeq,
711 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
712 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
713 if(28*aNbElems != (CORBA::Long) anIndexes.length())
714 EXCEPTION(runtime_error,"AddTriQuadHexasWithID - 28*aNbElems != anIndexes.length()");
715 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=28){
716 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
717 anIndexes[anIndexId+2],
718 anIndexes[anIndexId+3],
719 anIndexes[anIndexId+4],
720 anIndexes[anIndexId+5],
721 anIndexes[anIndexId+6],
722 anIndexes[anIndexId+7],
723 anIndexes[anIndexId+8],
724 anIndexes[anIndexId+9],
725 anIndexes[anIndexId+10],
726 anIndexes[anIndexId+11],
727 anIndexes[anIndexId+12],
728 anIndexes[anIndexId+13],
729 anIndexes[anIndexId+14],
730 anIndexes[anIndexId+15],
731 anIndexes[anIndexId+16],
732 anIndexes[anIndexId+17],
733 anIndexes[anIndexId+18],
734 anIndexes[anIndexId+19],
735 anIndexes[anIndexId+20],
736 anIndexes[anIndexId+21],
737 anIndexes[anIndexId+22],
738 anIndexes[anIndexId+23],
739 anIndexes[anIndexId+24],
740 anIndexes[anIndexId+25],
741 anIndexes[anIndexId+26],
742 anIndexes[anIndexId+27],
743 anIndexes[anIndexId]);
745 EXCEPTION(runtime_error,"AddTriQuadHexasWithID() - cannot AddVolumeWithID for ID = "<<anElemId);
750 //=======================================================================
751 //function : ChangePolyhedronNodes
752 //=======================================================================
753 inline void ChangePolyhedronNodes (SMDS_Mesh* theMesh,
754 SMESH::log_array_var& theSeq,
757 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
758 CORBA::Long iind = 0, aNbElems = theSeq[theId].number;
760 for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++)
763 const SMDS_MeshElement* elem = FindElement(theMesh, anIndexes[iind++]);
765 int nbNodes = anIndexes[iind++];
767 std::vector<const SMDS_MeshNode*> aNodes (nbNodes);
768 for (int iNode = 0; iNode < nbNodes; iNode++) {
769 aNodes[iNode] = FindNode(theMesh, anIndexes[iind++]);
772 int nbFaces = anIndexes[iind++];
774 std::vector<int> quantities (nbFaces);
775 for (int iFace = 0; iFace < nbFaces; iFace++) {
776 quantities[iFace] = anIndexes[iind++];
779 theMesh->ChangePolyhedronNodes(elem, aNodes, quantities);
784 //=======================================================================
786 SMESH_Client::GetSMESHGen(CORBA::ORB_ptr theORB,
787 CORBA::Boolean& theIsEmbeddedMode)
789 static SMESH::SMESH_Gen_var aMeshGen;
791 if(CORBA::is_nil(aMeshGen.in()))
793 Engines::EngineComponent_var isCompoInSSLMode = GetSMESHInstanceHasThis();
794 if( CORBA::is_nil(isCompoInSSLMode) )
797 long aClientPID = (long)_getpid();
799 long aClientPID = (long)getpid();
802 std::unique_ptr<SALOME_NamingService_Abstract> aNamingService;
805 aNamingService.reset(new SALOME_Fake_NamingService);
809 aNamingService.reset(new SALOME_NamingService(theORB));
811 SALOME_LifeCycleCORBA aLifeCycleCORBA(aNamingService.get());
812 Engines::EngineComponent_var aComponent = aLifeCycleCORBA.FindOrLoad_Component("FactoryServer","SMESH");
813 aMeshGen = SMESH::SMESH_Gen::_narrow(aComponent);
815 std::string aClientHostName = Kernel_Utils::GetHostname();
816 Engines::Container_var aServerContainer = aMeshGen->GetContainerRef();
817 CORBA::String_var aServerHostName = aServerContainer->getHostName();
818 CORBA::Long aServerPID = aServerContainer->getPID();
819 aMeshGen->SetEmbeddedMode((aClientPID == aServerPID) && (aClientHostName == aServerHostName.in()));
823 aMeshGen = SMESH::SMESH_Gen::_narrow(isCompoInSSLMode);
827 theIsEmbeddedMode = aMeshGen->IsEmbeddedMode();
832 //=======================================================================
833 // function : Create()
835 //=======================================================================
836 SMESH_Client::SMESH_Client(CORBA::ORB_ptr theORB,
837 SMESH::SMESH_Mesh_ptr theMesh):
838 myMeshServer(SMESH::SMESH_Mesh::_duplicate(theMesh)),
842 if ( MYDEBUG ) MESSAGE("SMESH_Client::SMESH_Client");
843 myMeshServer->Register();
845 CORBA::Boolean anIsEmbeddedMode;
846 GetSMESHGen(theORB,anIsEmbeddedMode);
847 if(anIsEmbeddedMode){
848 if ( MYDEBUG ) MESSAGE("Info: The same process, update mesh by pointer ");
849 // just set client mesh pointer to server mesh pointer
850 //SMESH_Mesh* aMesh = reinterpret_cast<SMESH_Mesh*>(theMesh->GetMeshPtr());
851 CORBA::LongLong pointeur = theMesh->GetMeshPtr();
852 if( MYDEBUG ) MESSAGE("SMESH_Client::SMESH_Client pointeur "<<pointeur);
853 SMESH_Mesh* aMesh = reinterpret_cast<SMESH_Mesh*> (pointeur);
854 if ( MYDEBUG ) MESSAGE("SMESH_Client::SMESH_Client aMesh "<<aMesh);
855 //if(aMesh->GetMeshDS()->IsEmbeddedMode()){
856 if(anIsEmbeddedMode){
857 mySMESHDSMesh = aMesh->GetMeshDS();
858 mySMDSMesh = mySMESHDSMesh;
862 mySMDSMesh = new SMDS_Mesh();
866 //=================================================================================
867 // function : ~SMESH_Client
868 // purpose : Destructor
869 //=================================================================================
870 SMESH_Client::~SMESH_Client()
872 myMeshServer->UnRegister();
878 //=================================================================================
880 SMESH_Client::GetMesh() const
886 //=================================================================================
888 SMESH_Client::operator->() const
894 //=================================================================================
895 SMESH::SMESH_Mesh_ptr
896 SMESH_Client::GetMeshServer()
898 return myMeshServer.in();
902 //=================================================================================
903 // function : SMESH_Client
904 // purpose : Update mesh
905 //=================================================================================
907 SMESH_Client::Update(bool theIsClear)
909 bool anIsModified = true;
912 if ( MYDEBUG ) MESSAGE("Update mySMESHDSMesh");
913 SMESHDS_Script* aScript = mySMESHDSMesh->GetScript();
914 anIsModified = aScript->IsModified();
915 aScript->SetModified(false);
919 if ( MYDEBUG ) MESSAGE("Update CORBA");
920 SMESH::log_array_var aSeq = myMeshServer->GetLog( theIsClear );
921 CORBA::Long aLength = aSeq->length();
922 anIsModified = aLength > 0;
923 if ( MYDEBUG ) MESSAGE( "Update: length of the script is "<<aLength );
928 // update client mesh structure by logged changes commands
931 for ( CORBA::Long anId = 0; anId < aLength; anId++)
933 const SMESH::double_array& aCoords = aSeq[anId].coords;
934 const SMESH::long_array& anIndexes = aSeq[anId].indexes;
935 CORBA::Long anElemId = 0, aNbElems = aSeq[anId].number;
936 CORBA::Long aCommand = aSeq[anId].commandType;
940 case SMESH::ADD_NODE : AddNodesWithID ( mySMDSMesh, aSeq, anId ); break;
941 case SMESH::ADD_EDGE : AddEdgesWithID ( mySMDSMesh, aSeq, anId ); break;
942 case SMESH::ADD_TRIANGLE : AddTriasWithID ( mySMDSMesh, aSeq, anId ); break;
943 case SMESH::ADD_QUADRANGLE : AddQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
944 case SMESH::ADD_POLYGON : AddPolygonsWithID ( mySMDSMesh, aSeq, anId ); break;
945 case SMESH::ADD_TETRAHEDRON : AddTetrasWithID ( mySMDSMesh, aSeq, anId ); break;
946 case SMESH::ADD_PYRAMID : AddPiramidsWithID ( mySMDSMesh, aSeq, anId ); break;
947 case SMESH::ADD_PRISM : AddPrismsWithID ( mySMDSMesh, aSeq, anId ); break;
948 case SMESH::ADD_HEXAHEDRON : AddHexasWithID ( mySMDSMesh, aSeq, anId ); break;
949 case SMESH::ADD_HEXAGONAL_PRISM : AddHexPrismWithID ( mySMDSMesh, aSeq, anId ); break;
950 case SMESH::ADD_POLYHEDRON : AddPolyhedronsWithID( mySMDSMesh, aSeq, anId ); break;
951 case SMESH::ADD_ELEM0D : Add0DElementsWithID ( mySMDSMesh, aSeq, anId ); break;
952 case SMESH::ADD_BALL : AddBallsWithID ( mySMDSMesh, aSeq, anId ); break;
954 case SMESH::ADD_QUADEDGE : AddQuadEdgesWithID ( mySMDSMesh, aSeq, anId ); break;
955 case SMESH::ADD_QUADTRIANGLE : AddQuadTriasWithID ( mySMDSMesh, aSeq, anId ); break;
956 case SMESH::ADD_QUADQUADRANGLE : AddQuadQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
957 case SMESH::ADD_QUADPOLYGON : AddQuadPolygonsWithID( mySMDSMesh, aSeq, anId ); break;
958 case SMESH::ADD_QUADTETRAHEDRON : AddQuadTetrasWithID ( mySMDSMesh, aSeq, anId ); break;
959 case SMESH::ADD_QUADPYRAMID : AddQuadPiramidsWithID( mySMDSMesh, aSeq, anId ); break;
960 case SMESH::ADD_QUADPENTAHEDRON : AddQuadPentasWithID ( mySMDSMesh, aSeq, anId ); break;
961 case SMESH::ADD_QUADHEXAHEDRON : AddQuadHexasWithID ( mySMDSMesh, aSeq, anId ); break;
963 case SMESH::ADD_BIQUAD_QUADRANGLE: AddBiQuadQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
964 case SMESH::ADD_BIQUAD_TRIANGLE : AddBiQuadTriasWithID ( mySMDSMesh, aSeq, anId ); break;
965 case SMESH::ADD_TRIQUAD_HEXA : AddTriQuadHexasWithID( mySMDSMesh, aSeq, anId ); break;
967 case SMESH::CLEAR_MESH:
971 case SMESH::REMOVE_NODE:
972 for( ; anElemId < aNbElems; anElemId++ )
973 mySMDSMesh->RemoveNode( FindNode( mySMDSMesh, anIndexes[anElemId] ) );
976 case SMESH::REMOVE_ELEMENT:
977 for( ; anElemId < aNbElems; anElemId++ )
978 mySMDSMesh->RemoveElement( FindElement( mySMDSMesh, anIndexes[anElemId] ) );
981 case SMESH::MOVE_NODE:
982 for(CORBA::Long aCoordId=0; anElemId < aNbElems; anElemId++, aCoordId+=3)
984 SMDS_MeshNode* node =
985 const_cast<SMDS_MeshNode*>( FindNode( mySMDSMesh, anIndexes[anElemId] ));
986 node->setXYZ( aCoords[aCoordId], aCoords[aCoordId+1], aCoords[aCoordId+2] );
990 case SMESH::CHANGE_ELEMENT_NODES:
991 for ( CORBA::Long i = 0; anElemId < aNbElems; anElemId++ )
994 const SMDS_MeshElement* elem = FindElement( mySMDSMesh, anIndexes[i++] );
996 int nbNodes = anIndexes[i++];
998 //ASSERT( nbNodes < 9 );
999 std::vector<const SMDS_MeshNode*> aNodes( nbNodes );
1000 for ( int iNode = 0; iNode < nbNodes; iNode++ )
1001 aNodes[ iNode ] = FindNode( mySMDSMesh, anIndexes[i++] );
1003 mySMDSMesh->ChangeElementNodes( elem, &aNodes[0], nbNodes );
1007 case SMESH::CHANGE_POLYHEDRON_NODES:
1008 ChangePolyhedronNodes(mySMDSMesh, aSeq, anId);
1010 case SMESH::RENUMBER:
1011 // for(CORBA::Long i=0; anElemId < aNbElems; anElemId++, i+=3)
1013 // mySMDSMesh->Renumber( anIndexes[i], anIndexes[i+1], anIndexes[i+2] );
1021 catch ( SALOME::SALOME_Exception& exc )
1023 INFOS("Following exception was cought:\n\t"<<exc.details.text);
1025 catch( const std::exception& exc)
1027 INFOS("Following exception was cought:\n\t"<<exc.what());
1031 INFOS("Unknown exception was cought !!!");
1034 if ( MYDEBUG && mySMDSMesh )
1036 MESSAGE("Update - mySMDSMesh->NbNodes() = "<<mySMDSMesh->NbNodes());
1037 MESSAGE("Update - mySMDSMesh->Nb0DElements() = "<<mySMDSMesh->Nb0DElements());
1038 MESSAGE("Update - mySMDSMesh->NbEdges() = "<<mySMDSMesh->NbEdges());
1039 MESSAGE("Update - mySMDSMesh->NbFaces() = "<<mySMDSMesh->NbFaces());
1040 MESSAGE("Update - mySMDSMesh->NbVolumes() = "<<mySMDSMesh->NbVolumes());
1042 } // end of update mesh by log script
1044 return anIsModified;