1 // Copyright (C) 2007-2022 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_Fake_NamingService.hxx"
34 #include "SALOME_LifeCycleCORBA.hxx"
36 #include <SALOMEconfig.h>
37 #include <smIdType.hxx>
38 #include CORBA_SERVER_HEADER(SALOME_Component)
39 #include CORBA_SERVER_HEADER(SALOME_Exception)
41 #include "Basics_Utils.hxx"
42 #include "KernelBasis.hxx"
43 #include "utilities.h"
55 #define EXCEPTION(TYPE, MSG) {\
56 std::ostringstream aStream;\
57 aStream<<__FILE__<<"["<<__LINE__<<"]::"<<MSG;\
58 throw TYPE(aStream.str());\
64 using std::runtime_error;
66 //=======================================================================
68 //=======================================================================
69 inline const SMDS_MeshNode* FindNode(const SMDS_Mesh* theMesh, int theId){
70 if(const SMDS_MeshNode* anElem = theMesh->FindNode(theId)) return anElem;
71 EXCEPTION(runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "<<theId);
75 //=======================================================================
76 //function : FindElement
77 //=======================================================================
78 inline const SMDS_MeshElement* FindElement(const SMDS_Mesh* theMesh, int theId){
79 if(const SMDS_MeshElement* anElem = theMesh->FindElement(theId)) return anElem;
80 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot find a SMDS_MeshElement for ID = "<<theId);
84 //=======================================================================
85 //function : AddNodesWithID
86 //=======================================================================
87 inline void AddNodesWithID(SMDS_Mesh* theMesh,
88 SMESH::log_array_var& theSeq,
89 SMESH::smIdType theId)
91 const SMESH::double_array& aCoords = theSeq[theId].coords;
92 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
93 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
94 if(3*aNbElems != (SMESH::smIdType) aCoords.length())
95 EXCEPTION(runtime_error,"AddNodesWithID - 3*aNbElems != aCoords.length()");
96 for(SMESH::smIdType aCoordId = 0; anElemId < aNbElems; anElemId++, aCoordId+=3){
97 SMDS_MeshElement* anElem = theMesh->AddNodeWithID(aCoords[aCoordId],
100 anIndexes[anElemId]);
102 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddNodeWithID for ID = "<<anElemId);
107 //=======================================================================
108 //function : Add0DElementsWithID
109 //=======================================================================
110 inline void Add0DElementsWithID(SMDS_Mesh* theMesh,
111 SMESH::log_array_var& theSeq,
112 SMESH::smIdType theId)
114 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
115 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
116 if (2*aNbElems != (SMESH::smIdType) anIndexes.length())
117 EXCEPTION(runtime_error,"AddEdgeWithID - 2*aNbElems != aCoords.length()");
118 SMESH::smIdType anIndexId = 0;
119 for (; anElemId < aNbElems; anElemId++, anIndexId+=2)
121 SMDS_MeshElement* anElem = theMesh->Add0DElementWithID(anIndexes[anIndexId+1],
122 anIndexes[anIndexId]);
124 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot Add0DElementWithID for ID = "<<anElemId);
129 //=======================================================================
130 //function : AddBallsWithID
131 //=======================================================================
132 inline void AddBallsWithID(SMDS_Mesh* theMesh,
133 SMESH::log_array_var& theSeq,
134 SMESH::smIdType theId)
136 const SMESH::double_array& aDiameter = theSeq[theId].coords;
137 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
138 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
139 if (2*aNbElems != (SMESH::smIdType) anIndexes.length() )
140 EXCEPTION(runtime_error,"AddEdgeWithID - 2*aNbElems != anIndexes.length()");
141 if (aNbElems != (SMESH::smIdType) aDiameter.length())
142 EXCEPTION(runtime_error,"AddEdgeWithID - aNbElems != aDiameter.length()");
143 SMESH::smIdType anIndexId = 0;
144 for (; anElemId < aNbElems; anElemId++, anIndexId+=2)
146 SMDS_MeshElement* anElem = theMesh->AddBallWithID(anIndexes[anIndexId+1],
148 anIndexes[anIndexId]);
150 EXCEPTION(runtime_error,"cannot SMDS_Mesh::AddBallsWithID for ID = "<<anElemId);
155 //=======================================================================
156 //function : AddEdgesWithID
157 //=======================================================================
158 inline void AddEdgesWithID(SMDS_Mesh* theMesh,
159 SMESH::log_array_var& theSeq,
160 SMESH::smIdType theId)
162 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
163 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
164 if(3*aNbElems != (SMESH::smIdType) anIndexes.length())
165 EXCEPTION(runtime_error,"AddEdgeWithID - 3*aNbElems != aCoords.length()");
166 for(SMESH::smIdType anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=3){
167 SMDS_MeshElement* anElem = theMesh->AddEdgeWithID(anIndexes[anIndexId+1],
168 anIndexes[anIndexId+2],
169 anIndexes[anIndexId]);
171 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<<anElemId);
176 //=======================================================================
177 //function : AddTriasWithID
178 //=======================================================================
179 inline void AddTriasWithID(SMDS_Mesh* theMesh,
180 SMESH::log_array_var& theSeq,
181 SMESH::smIdType theId)
183 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
184 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
185 if(4*aNbElems != (SMESH::smIdType) anIndexes.length())
186 EXCEPTION(runtime_error,"AddTriasWithID - 4*aNbElems != anIndexes.length()");
187 for(SMESH::smIdType anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=4){
188 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
189 anIndexes[anIndexId+2],
190 anIndexes[anIndexId+3],
191 anIndexes[anIndexId]);
193 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
198 //=======================================================================
199 //function : AddQuadsWithID
200 //=======================================================================
201 inline void AddQuadsWithID(SMDS_Mesh* theMesh,
202 SMESH::log_array_var theSeq,
203 SMESH::smIdType theId)
205 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
206 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
207 if(5*aNbElems != (SMESH::smIdType) anIndexes.length())
208 EXCEPTION(runtime_error,"AddQuadsWithID - 4*aNbElems != anIndexes.length()");
209 for(SMESH::smIdType anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){
210 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
211 anIndexes[anIndexId+2],
212 anIndexes[anIndexId+3],
213 anIndexes[anIndexId+4],
214 anIndexes[anIndexId]);
216 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
221 //=======================================================================
222 //function : AddPolygonsWithID
223 //=======================================================================
224 inline void AddPolygonsWithID(SMDS_Mesh* theMesh,
225 SMESH::log_array_var& theSeq,
226 SMESH::smIdType theId)
228 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
229 SMESH::smIdType anIndexId = 0, aNbElems = theSeq[theId].number;
231 for (SMESH::smIdType anElemId = 0; anElemId < aNbElems; anElemId++) {
232 smIdType aFaceId = anIndexes[anIndexId++];
234 int aNbNodes = anIndexes[anIndexId++];
235 std::vector<smIdType> nodes_ids (aNbNodes);
236 for (int i = 0; i < aNbNodes; i++) {
237 nodes_ids[i] = anIndexes[anIndexId++];
240 SMDS_MeshElement* anElem = theMesh->AddPolygonalFaceWithID(nodes_ids, aFaceId);
242 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolygonalFaceWithID for ID = "
248 //=======================================================================
249 //function : AddQaudPolygonsWithID
250 //=======================================================================
251 inline void AddQuadPolygonsWithID(SMDS_Mesh* theMesh,
252 SMESH::log_array_var& theSeq,
253 SMESH::smIdType theId)
255 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
256 SMESH::smIdType anIndexId = 0, aNbElems = theSeq[theId].number;
258 for (SMESH::smIdType anElemId = 0; anElemId < aNbElems; anElemId++) {
259 smIdType aFaceId = anIndexes[anIndexId++];
261 int aNbNodes = anIndexes[anIndexId++];
262 std::vector<smIdType> nodes_ids (aNbNodes);
263 for (int i = 0; i < aNbNodes; i++) {
264 nodes_ids[i] = anIndexes[anIndexId++];
267 SMDS_MeshElement* anElem = theMesh->AddQuadPolygonalFaceWithID(nodes_ids, aFaceId);
269 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddQaudPolygonalFaceWithID for ID = "
275 //=======================================================================
276 //function : AddTetrasWithID
277 //=======================================================================
278 inline void AddTetrasWithID(SMDS_Mesh* theMesh,
279 SMESH::log_array_var& theSeq,
280 SMESH::smIdType theId)
282 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
283 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
284 if(5*aNbElems != (SMESH::smIdType) anIndexes.length())
285 EXCEPTION(runtime_error,"AddTetrasWithID - 5*aNbElems != anIndexes.length()");
286 for(SMESH::smIdType anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){
287 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
288 anIndexes[anIndexId+2],
289 anIndexes[anIndexId+3],
290 anIndexes[anIndexId+4],
291 anIndexes[anIndexId]);
293 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
298 //=======================================================================
299 //function : AddPiramidsWithID
300 //=======================================================================
301 inline void AddPiramidsWithID(SMDS_Mesh* theMesh,
302 SMESH::log_array_var& theSeq,
303 SMESH::smIdType theId)
305 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
306 SMESH::smIdType anElemId = 0, aNbElems = theSeq[theId].number;
307 if(6*aNbElems != (SMESH::smIdType) anIndexes.length())
308 EXCEPTION(runtime_error,"AddPiramidsWithID - 6*aNbElems != anIndexes.length()");
309 for(SMESH::smIdType anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=6){
310 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
311 anIndexes[anIndexId+2],
312 anIndexes[anIndexId+3],
313 anIndexes[anIndexId+4],
314 anIndexes[anIndexId+5],
315 anIndexes[anIndexId]);
317 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
322 //=======================================================================
323 //function : AddPrismsWithID
324 //=======================================================================
325 inline void AddPrismsWithID(SMDS_Mesh* theMesh,
326 SMESH::log_array_var& theSeq,
327 SMESH::smIdType theId)
329 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
330 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
331 if(7*aNbElems != (CORBA::Long) anIndexes.length())
332 EXCEPTION(runtime_error,"AddPrismsWithID - 7*aNbElems != anIndexes.length()");
333 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=7){
334 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
335 anIndexes[anIndexId+2],
336 anIndexes[anIndexId+3],
337 anIndexes[anIndexId+4],
338 anIndexes[anIndexId+5],
339 anIndexes[anIndexId+6],
340 anIndexes[anIndexId]);
342 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
347 //=======================================================================
348 //function : AddHexasWithID
349 //=======================================================================
350 inline void AddHexasWithID(SMDS_Mesh* theMesh,
351 SMESH::log_array_var& theSeq,
354 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
355 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
356 if(9*aNbElems != (CORBA::Long) anIndexes.length())
357 EXCEPTION(runtime_error,"AddHexasWithID - 9*aNbElems != anIndexes.length()");
358 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=9){
359 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
360 anIndexes[anIndexId+2],
361 anIndexes[anIndexId+3],
362 anIndexes[anIndexId+4],
363 anIndexes[anIndexId+5],
364 anIndexes[anIndexId+6],
365 anIndexes[anIndexId+7],
366 anIndexes[anIndexId+8],
367 anIndexes[anIndexId]);
369 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
373 //=======================================================================
374 //function : AddHexPrismWithID
375 //=======================================================================
376 inline void AddHexPrismWithID(SMDS_Mesh* theMesh,
377 SMESH::log_array_var& theSeq,
380 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
381 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
382 if(13*aNbElems != (CORBA::Long) anIndexes.length())
383 EXCEPTION(runtime_error,"AddHexPrismWithID - 13*aNbElems != anIndexes.length()");
384 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=13){
385 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
386 anIndexes[anIndexId+2],
387 anIndexes[anIndexId+3],
388 anIndexes[anIndexId+4],
389 anIndexes[anIndexId+5],
390 anIndexes[anIndexId+6],
391 anIndexes[anIndexId+7],
392 anIndexes[anIndexId+8],
393 anIndexes[anIndexId+9],
394 anIndexes[anIndexId+10],
395 anIndexes[anIndexId+11],
396 anIndexes[anIndexId+12],
397 anIndexes[anIndexId]);
399 EXCEPTION(runtime_error,"AddHexPrismWithID - cannot AddVolumeWithID for ID = "<<anElemId);
404 //=======================================================================
405 //function : AddPolyhedronsWithID
406 //=======================================================================
407 inline void AddPolyhedronsWithID (SMDS_Mesh* theMesh,
408 SMESH::log_array_var& theSeq,
411 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
412 CORBA::Long anIndexId = 0, aNbElems = theSeq[theId].number;
414 for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) {
415 smIdType aFaceId = anIndexes[anIndexId++];
417 int aNbNodes = anIndexes[anIndexId++];
418 std::vector<smIdType> nodes_ids (aNbNodes);
419 for (int i = 0; i < aNbNodes; i++) {
420 nodes_ids[i] = anIndexes[anIndexId++];
423 int aNbFaces = anIndexes[anIndexId++];
424 std::vector<int> quantities (aNbFaces);
425 for (int i = 0; i < aNbFaces; i++) {
426 quantities[i] = anIndexes[anIndexId++];
429 SMDS_MeshElement* anElem =
430 theMesh->AddPolyhedralVolumeWithID(nodes_ids, quantities, aFaceId);
432 EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolyhedralVolumeWithID for ID = "
438 //=======================================================================
439 //function : AddQuadEdgesWithID
440 //=======================================================================
441 inline void AddQuadEdgesWithID(SMDS_Mesh* theMesh,
442 SMESH::log_array_var& theSeq,
445 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
446 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
447 if(4*aNbElems != (CORBA::Long) anIndexes.length())
448 EXCEPTION(runtime_error,"AddQuadEdgeWithID - 4*aNbElems != aCoords.length()");
449 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=4){
450 SMDS_MeshElement* anElem = theMesh->AddEdgeWithID(anIndexes[anIndexId+1],
451 anIndexes[anIndexId+2],
452 anIndexes[anIndexId+3],
453 anIndexes[anIndexId]);
455 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<<anElemId);
460 //=======================================================================
461 //function : AddQuadTriasWithID
462 //=======================================================================
463 inline void AddQuadTriasWithID(SMDS_Mesh* theMesh,
464 SMESH::log_array_var& theSeq,
467 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
468 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
469 if(7*aNbElems != (CORBA::Long) anIndexes.length())
470 EXCEPTION(runtime_error,"AddQuadTriasWithID - 7*aNbElems != anIndexes.length()");
471 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=7){
472 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
473 anIndexes[anIndexId+2],
474 anIndexes[anIndexId+3],
475 anIndexes[anIndexId+4],
476 anIndexes[anIndexId+5],
477 anIndexes[anIndexId+6],
478 anIndexes[anIndexId]);
480 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
485 //=======================================================================
486 //function : AddQuadQuadsWithID
487 //=======================================================================
488 inline void AddQuadQuadsWithID(SMDS_Mesh* theMesh,
489 SMESH::log_array_var theSeq,
492 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
493 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
494 if(9*aNbElems != (CORBA::Long) anIndexes.length())
495 EXCEPTION(runtime_error,"AddQuadQuadsWithID - 9*aNbElems != anIndexes.length()");
496 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=9){
497 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
498 anIndexes[anIndexId+2],
499 anIndexes[anIndexId+3],
500 anIndexes[anIndexId+4],
501 anIndexes[anIndexId+5],
502 anIndexes[anIndexId+6],
503 anIndexes[anIndexId+7],
504 anIndexes[anIndexId+8],
505 anIndexes[anIndexId]);
507 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
511 //=======================================================================
512 //function : AddBiQuadQuadsWithID
513 //=======================================================================
514 inline void AddBiQuadQuadsWithID(SMDS_Mesh* theMesh,
515 SMESH::log_array_var theSeq,
518 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
519 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
520 if(10*aNbElems != (CORBA::Long) anIndexes.length())
521 EXCEPTION(runtime_error,"AddBiQuadQuadsWithID - 10*aNbElems != anIndexes.length()");
522 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=10){
523 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
524 anIndexes[anIndexId+2],
525 anIndexes[anIndexId+3],
526 anIndexes[anIndexId+4],
527 anIndexes[anIndexId+5],
528 anIndexes[anIndexId+6],
529 anIndexes[anIndexId+7],
530 anIndexes[anIndexId+8],
531 anIndexes[anIndexId+9],
532 anIndexes[anIndexId]);
534 EXCEPTION(runtime_error,"AddBiQuadQuadsWithID() - cannot AddFaceWithID for ID = "<<anElemId);
538 //=======================================================================
539 //function : AddBiQuadTriasWithID
540 //=======================================================================
541 inline void AddBiQuadTriasWithID(SMDS_Mesh* theMesh,
542 SMESH::log_array_var theSeq,
545 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
546 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
547 if(8*aNbElems != (CORBA::Long) anIndexes.length())
548 EXCEPTION(runtime_error,"AddBiQuadTriasWithID - 8*aNbElems != anIndexes.length()");
549 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=8){
550 SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
551 anIndexes[anIndexId+2],
552 anIndexes[anIndexId+3],
553 anIndexes[anIndexId+4],
554 anIndexes[anIndexId+5],
555 anIndexes[anIndexId+6],
556 anIndexes[anIndexId+7],
557 anIndexes[anIndexId]);
559 EXCEPTION(runtime_error,"AddBiQuadTriasWithID() - cannot AddFaceWithID for ID = "<<anElemId);
564 //=======================================================================
565 //function : AddQuadTetrasWithID
566 //=======================================================================
567 inline void AddQuadTetrasWithID(SMDS_Mesh* theMesh,
568 SMESH::log_array_var& theSeq,
571 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
572 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
573 if(11*aNbElems != (CORBA::Long) anIndexes.length())
574 EXCEPTION(runtime_error,"AddQuadTetrasWithID - 11*aNbElems != anIndexes.length()");
575 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=11){
576 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
577 anIndexes[anIndexId+2],
578 anIndexes[anIndexId+3],
579 anIndexes[anIndexId+4],
580 anIndexes[anIndexId+5],
581 anIndexes[anIndexId+6],
582 anIndexes[anIndexId+7],
583 anIndexes[anIndexId+8],
584 anIndexes[anIndexId+9],
585 anIndexes[anIndexId+10],
586 anIndexes[anIndexId]);
588 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
593 //=======================================================================
594 //function : AddQuadPiramidsWithID
595 //=======================================================================
596 inline void AddQuadPiramidsWithID(SMDS_Mesh* theMesh,
597 SMESH::log_array_var& theSeq,
600 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
601 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
602 if(14*aNbElems != (CORBA::Long) anIndexes.length())
603 EXCEPTION(runtime_error,"AddQuadPiramidsWithID - 14*aNbElems != anIndexes.length()");
604 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=14){
605 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
606 anIndexes[anIndexId+2],
607 anIndexes[anIndexId+3],
608 anIndexes[anIndexId+4],
609 anIndexes[anIndexId+5],
610 anIndexes[anIndexId+6],
611 anIndexes[anIndexId+7],
612 anIndexes[anIndexId+8],
613 anIndexes[anIndexId+9],
614 anIndexes[anIndexId+10],
615 anIndexes[anIndexId+11],
616 anIndexes[anIndexId+12],
617 anIndexes[anIndexId+13],
618 anIndexes[anIndexId]);
620 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
625 //=======================================================================
626 //function : AddQuadPentasWithID
627 //=======================================================================
628 inline void AddQuadPentasWithID(SMDS_Mesh* theMesh,
629 SMESH::log_array_var& theSeq,
632 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
633 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
634 if(16*aNbElems != (CORBA::Long) anIndexes.length())
635 EXCEPTION(runtime_error,"AddQuadPentasWithID - 16*aNbElems != anIndexes.length()");
636 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=16){
637 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
638 anIndexes[anIndexId+2],
639 anIndexes[anIndexId+3],
640 anIndexes[anIndexId+4],
641 anIndexes[anIndexId+5],
642 anIndexes[anIndexId+6],
643 anIndexes[anIndexId+7],
644 anIndexes[anIndexId+8],
645 anIndexes[anIndexId+9],
646 anIndexes[anIndexId+10],
647 anIndexes[anIndexId+11],
648 anIndexes[anIndexId+12],
649 anIndexes[anIndexId+13],
650 anIndexes[anIndexId+14],
651 anIndexes[anIndexId+15],
652 anIndexes[anIndexId]);
654 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
659 //=======================================================================
660 //function : AddQuadHexasWithID
661 //=======================================================================
662 inline void AddQuadHexasWithID(SMDS_Mesh* theMesh,
663 SMESH::log_array_var& theSeq,
666 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
667 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
668 if(21*aNbElems != (CORBA::Long) anIndexes.length())
669 EXCEPTION(runtime_error,"AddQuadHexasWithID - 21*aNbElems != anIndexes.length()");
670 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=21){
671 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
672 anIndexes[anIndexId+2],
673 anIndexes[anIndexId+3],
674 anIndexes[anIndexId+4],
675 anIndexes[anIndexId+5],
676 anIndexes[anIndexId+6],
677 anIndexes[anIndexId+7],
678 anIndexes[anIndexId+8],
679 anIndexes[anIndexId+9],
680 anIndexes[anIndexId+10],
681 anIndexes[anIndexId+11],
682 anIndexes[anIndexId+12],
683 anIndexes[anIndexId+13],
684 anIndexes[anIndexId+14],
685 anIndexes[anIndexId+15],
686 anIndexes[anIndexId+16],
687 anIndexes[anIndexId+17],
688 anIndexes[anIndexId+18],
689 anIndexes[anIndexId+19],
690 anIndexes[anIndexId+20],
691 anIndexes[anIndexId]);
693 EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
697 //=======================================================================
698 //function : AddTriQuadHexasWithID
699 //=======================================================================
700 inline void AddTriQuadHexasWithID(SMDS_Mesh* theMesh,
701 SMESH::log_array_var& theSeq,
704 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
705 CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
706 if(28*aNbElems != (CORBA::Long) anIndexes.length())
707 EXCEPTION(runtime_error,"AddTriQuadHexasWithID - 28*aNbElems != anIndexes.length()");
708 for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=28){
709 SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
710 anIndexes[anIndexId+2],
711 anIndexes[anIndexId+3],
712 anIndexes[anIndexId+4],
713 anIndexes[anIndexId+5],
714 anIndexes[anIndexId+6],
715 anIndexes[anIndexId+7],
716 anIndexes[anIndexId+8],
717 anIndexes[anIndexId+9],
718 anIndexes[anIndexId+10],
719 anIndexes[anIndexId+11],
720 anIndexes[anIndexId+12],
721 anIndexes[anIndexId+13],
722 anIndexes[anIndexId+14],
723 anIndexes[anIndexId+15],
724 anIndexes[anIndexId+16],
725 anIndexes[anIndexId+17],
726 anIndexes[anIndexId+18],
727 anIndexes[anIndexId+19],
728 anIndexes[anIndexId+20],
729 anIndexes[anIndexId+21],
730 anIndexes[anIndexId+22],
731 anIndexes[anIndexId+23],
732 anIndexes[anIndexId+24],
733 anIndexes[anIndexId+25],
734 anIndexes[anIndexId+26],
735 anIndexes[anIndexId+27],
736 anIndexes[anIndexId]);
738 EXCEPTION(runtime_error,"AddTriQuadHexasWithID() - cannot AddVolumeWithID for ID = "<<anElemId);
743 //=======================================================================
744 //function : ChangePolyhedronNodes
745 //=======================================================================
746 inline void ChangePolyhedronNodes (SMDS_Mesh* theMesh,
747 SMESH::log_array_var& theSeq,
750 const SMESH::long_array& anIndexes = theSeq[theId].indexes;
751 CORBA::Long iind = 0, aNbElems = theSeq[theId].number;
753 for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++)
756 const SMDS_MeshElement* elem = FindElement(theMesh, anIndexes[iind++]);
758 int nbNodes = anIndexes[iind++];
760 std::vector<const SMDS_MeshNode*> aNodes (nbNodes);
761 for (int iNode = 0; iNode < nbNodes; iNode++) {
762 aNodes[iNode] = FindNode(theMesh, anIndexes[iind++]);
765 int nbFaces = anIndexes[iind++];
767 std::vector<int> quantities (nbFaces);
768 for (int iFace = 0; iFace < nbFaces; iFace++) {
769 quantities[iFace] = anIndexes[iind++];
772 theMesh->ChangePolyhedronNodes(elem, aNodes, quantities);
777 //=======================================================================
779 SMESH_Client::GetSMESHGen(CORBA::ORB_ptr theORB,
780 CORBA::Boolean& theIsEmbeddedMode)
782 static SMESH::SMESH_Gen_var aMeshGen;
784 if(CORBA::is_nil(aMeshGen.in()))
787 long aClientPID = (long)_getpid();
789 long aClientPID = (long)getpid();
792 std::unique_ptr<SALOME_NamingService_Abstract> aNamingService;
795 aNamingService.reset(new SALOME_Fake_NamingService);
799 aNamingService.reset(new SALOME_NamingService(theORB));
801 SALOME_LifeCycleCORBA aLifeCycleCORBA(aNamingService.get());
802 Engines::EngineComponent_var aComponent = aLifeCycleCORBA.FindOrLoad_Component("FactoryServer","SMESH");
803 aMeshGen = SMESH::SMESH_Gen::_narrow(aComponent);
805 std::string aClientHostName = Kernel_Utils::GetHostname();
806 Engines::Container_var aServerContainer = aMeshGen->GetContainerRef();
807 CORBA::String_var aServerHostName = aServerContainer->getHostName();
808 CORBA::Long aServerPID = aServerContainer->getPID();
809 aMeshGen->SetEmbeddedMode((aClientPID == aServerPID) && (aClientHostName == aServerHostName.in()));
811 theIsEmbeddedMode = aMeshGen->IsEmbeddedMode();
816 //=======================================================================
817 // function : Create()
819 //=======================================================================
820 SMESH_Client::SMESH_Client(CORBA::ORB_ptr theORB,
821 SMESH::SMESH_Mesh_ptr theMesh):
822 myMeshServer(SMESH::SMESH_Mesh::_duplicate(theMesh)),
826 MESSAGE("SMESH_Client::SMESH_Client");
827 myMeshServer->Register();
829 CORBA::Boolean anIsEmbeddedMode;
830 GetSMESHGen(theORB,anIsEmbeddedMode);
831 if(anIsEmbeddedMode){
832 MESSAGE("Info: The same process, update mesh by pointer ");
833 // just set client mesh pointer to server mesh pointer
834 //SMESH_Mesh* aMesh = reinterpret_cast<SMESH_Mesh*>(theMesh->GetMeshPtr());
835 CORBA::LongLong pointeur = theMesh->GetMeshPtr();
836 MESSAGE("SMESH_Client::SMESH_Client pointeur "<<pointeur);
837 SMESH_Mesh* aMesh = reinterpret_cast<SMESH_Mesh*> (pointeur);
838 MESSAGE("SMESH_Client::SMESH_Client aMesh "<<aMesh);
839 //if(aMesh->GetMeshDS()->IsEmbeddedMode()){
840 if(anIsEmbeddedMode){
841 mySMESHDSMesh = aMesh->GetMeshDS();
842 mySMDSMesh = mySMESHDSMesh;
846 mySMDSMesh = new SMDS_Mesh();
850 //=================================================================================
851 // function : ~SMESH_Client
852 // purpose : Destructor
853 //=================================================================================
854 SMESH_Client::~SMESH_Client()
856 myMeshServer->UnRegister();
862 //=================================================================================
864 SMESH_Client::GetMesh() const
870 //=================================================================================
872 SMESH_Client::operator->() const
878 //=================================================================================
879 SMESH::SMESH_Mesh_ptr
880 SMESH_Client::GetMeshServer()
882 return myMeshServer.in();
886 //=================================================================================
887 // function : SMESH_Client
888 // purpose : Update mesh
889 //=================================================================================
891 SMESH_Client::Update(bool theIsClear)
893 bool anIsModified = true;
896 MESSAGE("Update mySMESHDSMesh");
897 SMESHDS_Script* aScript = mySMESHDSMesh->GetScript();
898 anIsModified = aScript->IsModified();
899 aScript->SetModified(false);
903 MESSAGE("Update CORBA");
904 SMESH::log_array_var aSeq = myMeshServer->GetLog( theIsClear );
905 CORBA::Long aLength = aSeq->length();
906 anIsModified = aLength > 0;
907 MESSAGE( "Update: length of the script is "<<aLength );
912 // update client mesh structure by logged changes commands
915 for ( CORBA::Long anId = 0; anId < aLength; anId++)
917 const SMESH::double_array& aCoords = aSeq[anId].coords;
918 const SMESH::long_array& anIndexes = aSeq[anId].indexes;
919 CORBA::Long anElemId = 0, aNbElems = aSeq[anId].number;
920 CORBA::Long aCommand = aSeq[anId].commandType;
924 case SMESH::ADD_NODE : AddNodesWithID ( mySMDSMesh, aSeq, anId ); break;
925 case SMESH::ADD_EDGE : AddEdgesWithID ( mySMDSMesh, aSeq, anId ); break;
926 case SMESH::ADD_TRIANGLE : AddTriasWithID ( mySMDSMesh, aSeq, anId ); break;
927 case SMESH::ADD_QUADRANGLE : AddQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
928 case SMESH::ADD_POLYGON : AddPolygonsWithID ( mySMDSMesh, aSeq, anId ); break;
929 case SMESH::ADD_TETRAHEDRON : AddTetrasWithID ( mySMDSMesh, aSeq, anId ); break;
930 case SMESH::ADD_PYRAMID : AddPiramidsWithID ( mySMDSMesh, aSeq, anId ); break;
931 case SMESH::ADD_PRISM : AddPrismsWithID ( mySMDSMesh, aSeq, anId ); break;
932 case SMESH::ADD_HEXAHEDRON : AddHexasWithID ( mySMDSMesh, aSeq, anId ); break;
933 case SMESH::ADD_HEXAGONAL_PRISM : AddHexPrismWithID ( mySMDSMesh, aSeq, anId ); break;
934 case SMESH::ADD_POLYHEDRON : AddPolyhedronsWithID( mySMDSMesh, aSeq, anId ); break;
935 case SMESH::ADD_ELEM0D : Add0DElementsWithID ( mySMDSMesh, aSeq, anId ); break;
936 case SMESH::ADD_BALL : AddBallsWithID ( mySMDSMesh, aSeq, anId ); break;
938 case SMESH::ADD_QUADEDGE : AddQuadEdgesWithID ( mySMDSMesh, aSeq, anId ); break;
939 case SMESH::ADD_QUADTRIANGLE : AddQuadTriasWithID ( mySMDSMesh, aSeq, anId ); break;
940 case SMESH::ADD_QUADQUADRANGLE : AddQuadQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
941 case SMESH::ADD_QUADPOLYGON : AddQuadPolygonsWithID( mySMDSMesh, aSeq, anId ); break;
942 case SMESH::ADD_QUADTETRAHEDRON : AddQuadTetrasWithID ( mySMDSMesh, aSeq, anId ); break;
943 case SMESH::ADD_QUADPYRAMID : AddQuadPiramidsWithID( mySMDSMesh, aSeq, anId ); break;
944 case SMESH::ADD_QUADPENTAHEDRON : AddQuadPentasWithID ( mySMDSMesh, aSeq, anId ); break;
945 case SMESH::ADD_QUADHEXAHEDRON : AddQuadHexasWithID ( mySMDSMesh, aSeq, anId ); break;
947 case SMESH::ADD_BIQUAD_QUADRANGLE: AddBiQuadQuadsWithID ( mySMDSMesh, aSeq, anId ); break;
948 case SMESH::ADD_BIQUAD_TRIANGLE : AddBiQuadTriasWithID ( mySMDSMesh, aSeq, anId ); break;
949 case SMESH::ADD_TRIQUAD_HEXA : AddTriQuadHexasWithID( mySMDSMesh, aSeq, anId ); break;
951 case SMESH::CLEAR_MESH:
955 case SMESH::REMOVE_NODE:
956 for( ; anElemId < aNbElems; anElemId++ )
957 mySMDSMesh->RemoveNode( FindNode( mySMDSMesh, anIndexes[anElemId] ) );
960 case SMESH::REMOVE_ELEMENT:
961 for( ; anElemId < aNbElems; anElemId++ )
962 mySMDSMesh->RemoveElement( FindElement( mySMDSMesh, anIndexes[anElemId] ) );
965 case SMESH::MOVE_NODE:
966 for(CORBA::Long aCoordId=0; anElemId < aNbElems; anElemId++, aCoordId+=3)
968 SMDS_MeshNode* node =
969 const_cast<SMDS_MeshNode*>( FindNode( mySMDSMesh, anIndexes[anElemId] ));
970 node->setXYZ( aCoords[aCoordId], aCoords[aCoordId+1], aCoords[aCoordId+2] );
974 case SMESH::CHANGE_ELEMENT_NODES:
975 for ( CORBA::Long i = 0; anElemId < aNbElems; anElemId++ )
978 const SMDS_MeshElement* elem = FindElement( mySMDSMesh, anIndexes[i++] );
980 int nbNodes = anIndexes[i++];
982 //ASSERT( nbNodes < 9 );
983 std::vector<const SMDS_MeshNode*> aNodes( nbNodes );
984 for ( int iNode = 0; iNode < nbNodes; iNode++ )
985 aNodes[ iNode ] = FindNode( mySMDSMesh, anIndexes[i++] );
987 mySMDSMesh->ChangeElementNodes( elem, &aNodes[0], nbNodes );
991 case SMESH::CHANGE_POLYHEDRON_NODES:
992 ChangePolyhedronNodes(mySMDSMesh, aSeq, anId);
994 case SMESH::RENUMBER:
995 // for(CORBA::Long i=0; anElemId < aNbElems; anElemId++, i+=3)
997 // mySMDSMesh->Renumber( anIndexes[i], anIndexes[i+1], anIndexes[i+2] );
1005 catch ( SALOME::SALOME_Exception& exc )
1007 INFOS("Following exception was cought:\n\t"<<exc.details.text);
1009 catch( const std::exception& exc)
1011 INFOS("Following exception was cought:\n\t"<<exc.what());
1015 INFOS("Unknown exception was cought !!!");
1020 MESSAGE("Update - mySMDSMesh->NbNodes() = "<<mySMDSMesh->NbNodes());
1021 MESSAGE("Update - mySMDSMesh->Nb0DElements() = "<<mySMDSMesh->Nb0DElements());
1022 MESSAGE("Update - mySMDSMesh->NbEdges() = "<<mySMDSMesh->NbEdges());
1023 MESSAGE("Update - mySMDSMesh->NbFaces() = "<<mySMDSMesh->NbFaces());
1024 MESSAGE("Update - mySMDSMesh->NbVolumes() = "<<mySMDSMesh->NbVolumes());
1026 } // end of update mesh by log script
1028 return anIsModified;