mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-29 08:00:33 +05:00
0022107: EDF 2502 SMESH: Publish the result of show bad mesh in a group
This commit is contained in:
parent
f70691d5a4
commit
88068fce89
Binary file not shown.
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 39 KiB |
Binary file not shown.
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 32 KiB |
@ -22,8 +22,10 @@ written in Python.
|
|||||||
<li>In the \b Mesh menu select <b>Create Mesh</b> or click <em>"Create
|
<li>In the \b Mesh menu select <b>Create Mesh</b> or click <em>"Create
|
||||||
Mesh"</em> button in the toolbar.
|
Mesh"</em> button in the toolbar.
|
||||||
|
|
||||||
|
<center>
|
||||||
\image html image32.png
|
\image html image32.png
|
||||||
<em>"Create Mesh" button</em>
|
<em>"Create Mesh" button</em>
|
||||||
|
</center>
|
||||||
|
|
||||||
The following dialog box will appear:
|
The following dialog box will appear:
|
||||||
|
|
||||||
@ -62,21 +64,27 @@ written in Python.
|
|||||||
mesh in the Object Browser and click "Select" button near \b Geometry
|
mesh in the Object Browser and click "Select" button near \b Geometry
|
||||||
field (if the name of the object has not yet appeared in \b Geometry field).
|
field (if the name of the object has not yet appeared in \b Geometry field).
|
||||||
|
|
||||||
|
<center>
|
||||||
\image html image120.png
|
\image html image120.png
|
||||||
<em>"Select" button</em>
|
<em>"Select" button</em>
|
||||||
|
</center>
|
||||||
|
|
||||||
Now you can define 3D Algorithm and 3D Hypotheses, which will be
|
Now you can define 3D Algorithm and 3D Hypotheses, which will be
|
||||||
applied to the solids of your geometrical object. Click the <em>"Add
|
applied to the solids of your geometrical object. Click the <em>"Add
|
||||||
Hypothesis"</em> button to add a hypothesis.
|
Hypothesis"</em> button to add a hypothesis.
|
||||||
|
|
||||||
|
<center>
|
||||||
\image html image121.png
|
\image html image121.png
|
||||||
<em>"Add Hypothesis" button</em>
|
<em>"Add Hypothesis" button</em>
|
||||||
|
</center>
|
||||||
|
|
||||||
Click the <em>"Edit Hypothesis"</em> button to change the values for the
|
Click the <em>"Edit Hypothesis"</em> button to change the values for the
|
||||||
current hypothesis.
|
current hypothesis.
|
||||||
|
|
||||||
|
<center>
|
||||||
\image html image122.png
|
\image html image122.png
|
||||||
<em>"Edit Hypothesis" button</em>
|
<em>"Edit Hypothesis" button</em>
|
||||||
|
</center>
|
||||||
|
|
||||||
Most standard 2D and 3D algorithms can work without hypotheses
|
Most standard 2D and 3D algorithms can work without hypotheses
|
||||||
using some default parameters. The use of additional hypotheses
|
using some default parameters. The use of additional hypotheses
|
||||||
@ -90,7 +98,8 @@ written in Python.
|
|||||||
the higher dimension algorithm.
|
the higher dimension algorithm.
|
||||||
|
|
||||||
Some algorithms generate mesh of several dimensions, while others
|
Some algorithms generate mesh of several dimensions, while others
|
||||||
produce mesh of only one dimension. In the latter case there must be one Algorithm and zero or several
|
produce mesh of only one dimension. In the latter case there must
|
||||||
|
be one Algorithm and zero or several
|
||||||
Hypotheses for each dimension of your object, otherwise you will
|
Hypotheses for each dimension of your object, otherwise you will
|
||||||
not get any mesh at all. Of course, if you wish to mesh a face,
|
not get any mesh at all. Of course, if you wish to mesh a face,
|
||||||
which is a 2D object, you do not need to define a 3D Algorithm and
|
which is a 2D object, you do not need to define a 3D Algorithm and
|
||||||
@ -99,7 +108,9 @@ written in Python.
|
|||||||
In the <b>Object Browser</b> the structure of the new mesh will be
|
In the <b>Object Browser</b> the structure of the new mesh will be
|
||||||
displayed as follows:
|
displayed as follows:
|
||||||
|
|
||||||
|
<center>
|
||||||
\image html image88.jpg
|
\image html image88.jpg
|
||||||
|
</center>
|
||||||
|
|
||||||
It contains:
|
It contains:
|
||||||
<ul>
|
<ul>
|
||||||
@ -152,8 +163,10 @@ For this, select the mesh in the Object Browser. From the \b Mesh menu
|
|||||||
select \b Preview or click "Preview" button in the toolbar or activate
|
select \b Preview or click "Preview" button in the toolbar or activate
|
||||||
"Preview" item from the pop-up menu.
|
"Preview" item from the pop-up menu.
|
||||||
|
|
||||||
|
<center>
|
||||||
\image html mesh_precompute.png
|
\image html mesh_precompute.png
|
||||||
<em>"Preview" button</em>
|
<em>"Preview" button</em>
|
||||||
|
</center>
|
||||||
|
|
||||||
Select <b>1D mesh</b> or <b>2D mesh</b> preview mode in the Preview dialog.
|
Select <b>1D mesh</b> or <b>2D mesh</b> preview mode in the Preview dialog.
|
||||||
|
|
||||||
@ -265,33 +278,29 @@ the hypotheses are assigned. For this, select your mesh in
|
|||||||
the <b>Object Browser</b>. From the \b Mesh menu select \b Compute or
|
the <b>Object Browser</b>. From the \b Mesh menu select \b Compute or
|
||||||
click "Compute" button of the toolbar.
|
click "Compute" button of the toolbar.
|
||||||
|
|
||||||
|
<center>
|
||||||
\image html image28.png
|
\image html image28.png
|
||||||
<em>"Compute" button</em>
|
<em>"Compute" button</em>
|
||||||
|
</center>
|
||||||
|
|
||||||
The Mesh Computation information box appears.
|
After the mesh computation finishes, the Mesh Computation information
|
||||||
|
box appears. In case of a success, the box shows
|
||||||
|
information on number of entities of different types in the mesh.
|
||||||
|
|
||||||
\image html meshcomputationsucceed.png
|
\image html meshcomputationsucceed.png
|
||||||
|
|
||||||
If the mesh computation failed, the information about the cause of the
|
If the mesh computation failed, the information about the cause of the
|
||||||
failure is provided.
|
failure is provided in \b Errors table.
|
||||||
|
|
||||||
\image html meshcomputationfail.png
|
\image html meshcomputationfail.png
|
||||||
|
|
||||||
After you select the error, <b>Show Sub-shape</b> button allows
|
After you select the error, <b>Show Sub-shape</b> button allows
|
||||||
visualizing in magenta the geometrical entity that causes it.
|
visualizing in magenta the geometrical entity that causes the error.
|
||||||
|
|
||||||
\image html failed_computation.png
|
\image html failed_computation.png
|
||||||
<em>3D algorithm failed to compute mesh on a box shown using <b>Show
|
<em>3D algorithm failed to compute mesh on a box shown using <b>Show
|
||||||
Sub-shape</b> button</em>
|
Sub-shape</b> button</em>
|
||||||
|
|
||||||
|
|
||||||
\note Mesh Computation Information box does not appear if you set
|
|
||||||
"Mesh computation/Show a computation result notification" preference
|
|
||||||
to the "Never" value. This option gives the possibility to control mesh
|
|
||||||
computation reporting. There are the following possibilities: always
|
|
||||||
show the information box, show only if an error occurs or never.
|
|
||||||
By default, the information box is always shown after mesh computation operation.
|
|
||||||
|
|
||||||
<b>Publish Sub-shape</b> button publishes the sub-shape, whose meshing
|
<b>Publish Sub-shape</b> button publishes the sub-shape, whose meshing
|
||||||
has failed, in GEOM component as a child of the mesh geometry, which
|
has failed, in GEOM component as a child of the mesh geometry, which
|
||||||
allows analyzing the problem geometry and creating a submesh on it in
|
allows analyzing the problem geometry and creating a submesh on it in
|
||||||
@ -305,9 +314,20 @@ or/and hidden by other mesh elements. They can be seen after
|
|||||||
switching the mesh to Wireframe visualization mode or switching off
|
switching the mesh to Wireframe visualization mode or switching off
|
||||||
the visualization of faces and volumes (if any).
|
the visualization of faces and volumes (if any).
|
||||||
|
|
||||||
|
<b>Bad Mesh to Group</b> button creates groups of the bad mesh entities,
|
||||||
|
thus allowing you for more comfortable analysis of these entities.
|
||||||
|
|
||||||
\image html show_bad_mesh.png
|
\image html show_bad_mesh.png
|
||||||
<em>Too close nodes causing meshing failure are shown in magenta using <b>Show
|
<em>Edges bounding a hole in the surface are shown in magenta using <b>Show
|
||||||
bad Mesh</b> button</em>
|
bad Mesh</b> button</em>
|
||||||
|
|
||||||
|
\note Mesh Computation Information box does not appear if you set
|
||||||
|
"Mesh computation/Show a computation result notification" preference
|
||||||
|
to the "Never" value. This option gives the possibility to control mesh
|
||||||
|
computation reporting. There are the following possibilities: always
|
||||||
|
show the information box, show only if an error occurs or never.
|
||||||
|
By default, the information box is always shown after mesh computation operation.
|
||||||
|
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
\anchor use_existing_anchor
|
\anchor use_existing_anchor
|
||||||
@ -320,13 +340,13 @@ this, there exist two algorithms: <b>Use existing edges</b> and <b>Use
|
|||||||
existing faces</b>.
|
existing faces</b>.
|
||||||
For example, you want to use standard algorithms to generate 1D and 3D
|
For example, you want to use standard algorithms to generate 1D and 3D
|
||||||
meshes and to create 2D mesh by your python code. Then you
|
meshes and to create 2D mesh by your python code. Then you
|
||||||
<ul>
|
<ol>
|
||||||
<li> create a mesh object, assign a 1D algorithm,</li>
|
<li> create a mesh object, assign an 1D algorithm,</li>
|
||||||
<li> invoke \b Compute command, which computes a 1D mesh,</li>
|
<li> invoke \b Compute command, which computes an 1D mesh,</li>
|
||||||
<li> assign <b>Use existing faces</b> and a 3D algorithm,</li>
|
<li> assign <b>Use existing faces</b> and a 3D algorithm,</li>
|
||||||
<li> run your python code, which creates a 2D mesh,</li>
|
<li> run your python code, which creates a 2D mesh,</li>
|
||||||
<li> invoke \b Compute command, which computes a 3D mesh.</li>
|
<li> invoke \b Compute command, which computes a 3D mesh.</li>
|
||||||
</ul>
|
</ol>
|
||||||
|
|
||||||
Consider trying a sample script demonstrating the usage of
|
Consider trying a sample script demonstrating the usage of
|
||||||
\ref tui_use_existing_faces "Use existing faces" algorithm for
|
\ref tui_use_existing_faces "Use existing faces" algorithm for
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
\n Scripts generated for SALOME 6 and older versions must be adapted to work in SALOME 7.2 with full functionality.
|
\n Scripts generated for SALOME 6 and older versions must be adapted to work in SALOME 7.2 with full functionality.
|
||||||
\n The compatibility mode allows old scripts to work in almost all cases, but with a warning.
|
\n The compatibility mode allows old scripts to work in almost all cases, but with a warning.
|
||||||
|
|
||||||
See also <li>\subpage geompy_migration_page</li>
|
See also \subpage geompy_migration_page
|
||||||
|
|
||||||
<b>Salome initialisation must always be done as shown below</b>
|
<b>Salome initialisation must always be done as shown below</b>
|
||||||
\n (<em>salome_init()</em> can be invoked safely several times):
|
\n (<em>salome_init()</em> can be invoked safely several times):
|
||||||
|
@ -13,7 +13,7 @@ in the \ref smeshBuilder and \ref StdMeshersBuilder Python packages.
|
|||||||
|
|
||||||
\n With SALOME 7.2, the Python interface for %Mesh has been slightly modified to offer new functionality,
|
\n With SALOME 7.2, the Python interface for %Mesh has been slightly modified to offer new functionality,
|
||||||
\n You may have to modify your scripts generated with SALOME 6 or older versions.
|
\n You may have to modify your scripts generated with SALOME 6 or older versions.
|
||||||
\n Please see <li>\ref smesh_migration_page</li>
|
\n Please see \ref smesh_migration_page
|
||||||
|
|
||||||
Class \ref smeshBuilder.smeshBuilder "smeshBuilder" provides an interface to create and handle
|
Class \ref smeshBuilder.smeshBuilder "smeshBuilder" provides an interface to create and handle
|
||||||
meshes. It can be used to create an empty mesh or to import mesh from the data file.
|
meshes. It can be used to create an empty mesh or to import mesh from the data file.
|
||||||
|
@ -61,6 +61,8 @@
|
|||||||
#include <SALOMEDSClient_SObject.hxx>
|
#include <SALOMEDSClient_SObject.hxx>
|
||||||
#include <SALOMEDS_wrap.hxx>
|
#include <SALOMEDS_wrap.hxx>
|
||||||
|
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Group)
|
||||||
|
|
||||||
// OCCT includes
|
// OCCT includes
|
||||||
#include <BRep_Tool.hxx>
|
#include <BRep_Tool.hxx>
|
||||||
#include <TopExp.hxx>
|
#include <TopExp.hxx>
|
||||||
@ -460,9 +462,11 @@ namespace SMESH
|
|||||||
foreach( range, selRanges )
|
foreach( range, selRanges )
|
||||||
{
|
{
|
||||||
for ( int row = range.topRow(); row <= range.bottomRow(); ++row )
|
for ( int row = range.topRow(); row <= range.bottomRow(); ++row )
|
||||||
|
if ( !rows.count( row ))
|
||||||
rows.append( row );
|
rows.append( row );
|
||||||
}
|
}
|
||||||
if ( rows.isEmpty() && table->currentRow() > -1 )
|
if ( rows.isEmpty() && table->currentRow() > -1 )
|
||||||
|
if ( !rows.count( table->currentRow() ))
|
||||||
rows.append( table->currentRow() );
|
rows.append( table->currentRow() );
|
||||||
|
|
||||||
return rows.count();
|
return rows.count();
|
||||||
@ -553,6 +557,7 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval)
|
|||||||
myShowBtn = new QPushButton(tr("SHOW_SHAPE"), myCompErrorGroup);
|
myShowBtn = new QPushButton(tr("SHOW_SHAPE"), myCompErrorGroup);
|
||||||
myPublishBtn = new QPushButton(tr("PUBLISH_SHAPE"), myCompErrorGroup);
|
myPublishBtn = new QPushButton(tr("PUBLISH_SHAPE"), myCompErrorGroup);
|
||||||
myBadMeshBtn = new QPushButton(tr("SHOW_BAD_MESH"), myCompErrorGroup);
|
myBadMeshBtn = new QPushButton(tr("SHOW_BAD_MESH"), myCompErrorGroup);
|
||||||
|
myBadMeshToGroupBtn = new QPushButton(tr("GROUP_OF_BAD_MESH"), myCompErrorGroup);
|
||||||
|
|
||||||
//myTable->setReadOnly( true ); // VSR: check
|
//myTable->setReadOnly( true ); // VSR: check
|
||||||
myTable->setEditTriggers( QAbstractItemView::NoEditTriggers );
|
myTable->setEditTriggers( QAbstractItemView::NoEditTriggers );
|
||||||
@ -582,6 +587,7 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval)
|
|||||||
grpLayout->addWidget( myShowBtn, 2, 0 );
|
grpLayout->addWidget( myShowBtn, 2, 0 );
|
||||||
grpLayout->addWidget( myPublishBtn, 2, 1 );
|
grpLayout->addWidget( myPublishBtn, 2, 1 );
|
||||||
grpLayout->addWidget( myBadMeshBtn, 2, 2 );
|
grpLayout->addWidget( myBadMeshBtn, 2, 2 );
|
||||||
|
grpLayout->addWidget( myBadMeshToGroupBtn, 2, 3 );
|
||||||
grpLayout->setColumnStretch( 3, 1 );
|
grpLayout->setColumnStretch( 3, 1 );
|
||||||
|
|
||||||
// Hypothesis definition errors
|
// Hypothesis definition errors
|
||||||
@ -1068,11 +1074,14 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack,
|
|||||||
tbl->resizeColumnToContents( COL_SHAPE );
|
tbl->resizeColumnToContents( COL_SHAPE );
|
||||||
tbl->setWordWrap( true );
|
tbl->setWordWrap( true );
|
||||||
|
|
||||||
if ( hasBadMesh )
|
if ( hasBadMesh ) {
|
||||||
aCompDlg->myBadMeshBtn->show();
|
aCompDlg->myBadMeshBtn->show();
|
||||||
else
|
aCompDlg->myBadMeshToGroupBtn->show();
|
||||||
|
}
|
||||||
|
else {
|
||||||
aCompDlg->myBadMeshBtn->hide();
|
aCompDlg->myBadMeshBtn->hide();
|
||||||
|
aCompDlg->myBadMeshToGroupBtn->hide();
|
||||||
|
}
|
||||||
tbl->setCurrentCell(0,0);
|
tbl->setCurrentCell(0,0);
|
||||||
currentCellChanged(); // to update buttons
|
currentCellChanged(); // to update buttons
|
||||||
}
|
}
|
||||||
@ -1189,6 +1198,43 @@ void SMESHGUI_BaseComputeOp::onShowBadMesh()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//================================================================================
|
||||||
|
/*!
|
||||||
|
* \brief create groups of bad mesh elements preventing computation of a submesh of current row
|
||||||
|
*/
|
||||||
|
//================================================================================
|
||||||
|
|
||||||
|
void SMESHGUI_BaseComputeOp::onGroupOfBadMesh()
|
||||||
|
{
|
||||||
|
QList<int> rows;
|
||||||
|
SMESH::getSelectedRows( table(), rows );
|
||||||
|
int row;
|
||||||
|
foreach ( row, rows )
|
||||||
|
{
|
||||||
|
bool hasBadMesh = ( !table()->item(row, COL_BAD_MESH)->text().isEmpty() );
|
||||||
|
if ( hasBadMesh ) {
|
||||||
|
int curSub = table()->item(rows.front(), COL_SHAPEID)->text().toInt();
|
||||||
|
QString grName = table()->item(rows.front(), COL_SHAPE)->text();
|
||||||
|
if ( grName.isEmpty() ) grName = "bad mesh";
|
||||||
|
else grName = "bad mesh of " + grName;
|
||||||
|
SMESH::SMESH_Gen_var gen = getSMESHGUI()->GetSMESHGen();
|
||||||
|
SMESH::ListOfGroups_var groups
|
||||||
|
( gen->MakeGroupsOfBadInputElements(myMesh,curSub,grName.toLatin1().data()) );
|
||||||
|
update( UF_ObjBrowser | UF_Model );
|
||||||
|
if( LightApp_Application* anApp = dynamic_cast<LightApp_Application*>( application() ))
|
||||||
|
{
|
||||||
|
QStringList anEntryList;
|
||||||
|
for ( size_t i = 0; i < groups->length(); ++i )
|
||||||
|
if ( _PTR(SObject) so = SMESH::FindSObject( groups[i] ))
|
||||||
|
anEntryList.append( so->GetID().c_str() );
|
||||||
|
|
||||||
|
if ( !anEntryList.isEmpty())
|
||||||
|
anApp->browseObjects( anEntryList, true, false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//================================================================================
|
//================================================================================
|
||||||
/*!
|
/*!
|
||||||
* \brief SLOT called when a selected cell in table() changed
|
* \brief SLOT called when a selected cell in table() changed
|
||||||
@ -1290,6 +1336,7 @@ SMESHGUI_ComputeDlg* SMESHGUI_BaseComputeOp::computeDlg() const
|
|||||||
connect(myCompDlg->myShowBtn, SIGNAL (clicked()), SLOT(onPreviewShape()));
|
connect(myCompDlg->myShowBtn, SIGNAL (clicked()), SLOT(onPreviewShape()));
|
||||||
connect(myCompDlg->myPublishBtn, SIGNAL (clicked()), SLOT(onPublishShape()));
|
connect(myCompDlg->myPublishBtn, SIGNAL (clicked()), SLOT(onPublishShape()));
|
||||||
connect(myCompDlg->myBadMeshBtn, SIGNAL (clicked()), SLOT(onShowBadMesh()));
|
connect(myCompDlg->myBadMeshBtn, SIGNAL (clicked()), SLOT(onShowBadMesh()));
|
||||||
|
connect(myCompDlg->myBadMeshToGroupBtn, SIGNAL (clicked()), SLOT(onGroupOfBadMesh()));
|
||||||
|
|
||||||
QTableWidget* aTable = me->table();
|
QTableWidget* aTable = me->table();
|
||||||
connect(aTable, SIGNAL(itemSelectionChanged()), SLOT(currentCellChanged()));
|
connect(aTable, SIGNAL(itemSelectionChanged()), SLOT(currentCellChanged()));
|
||||||
|
@ -99,6 +99,7 @@ protected slots:
|
|||||||
void onPreviewShape();
|
void onPreviewShape();
|
||||||
void onPublishShape();
|
void onPublishShape();
|
||||||
void onShowBadMesh();
|
void onShowBadMesh();
|
||||||
|
void onGroupOfBadMesh();
|
||||||
void currentCellChanged();
|
void currentCellChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -226,6 +227,7 @@ protected:
|
|||||||
QPushButton* myShowBtn;
|
QPushButton* myShowBtn;
|
||||||
QPushButton* myPublishBtn;
|
QPushButton* myPublishBtn;
|
||||||
QPushButton* myBadMeshBtn;
|
QPushButton* myBadMeshBtn;
|
||||||
|
QPushButton* myBadMeshToGroupBtn;
|
||||||
|
|
||||||
SMESHGUI_MeshInfosBox* myBriefInfo;
|
SMESHGUI_MeshInfosBox* myBriefInfo;
|
||||||
SMESHGUI_MeshInfosBox* myFullInfo;
|
SMESHGUI_MeshInfosBox* myFullInfo;
|
||||||
|
@ -4604,6 +4604,10 @@ Please, create VTK viewer and try again</translation>
|
|||||||
<source>SHOW_BAD_MESH</source>
|
<source>SHOW_BAD_MESH</source>
|
||||||
<translation>Show bad Mesh</translation>
|
<translation>Show bad Mesh</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>GROUP_OF_BAD_MESH</source>
|
||||||
|
<translation>Bad Mesh to Group</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>SMESHGUI_PrecomputeDlg</name>
|
<name>SMESHGUI_PrecomputeDlg</name>
|
||||||
@ -5496,15 +5500,15 @@ Please enter correct value and try again</translation>
|
|||||||
<translation>OCTA12</translation>
|
<translation>OCTA12</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>ENTITY_TYPE_21</source>
|
<source>ENTITY_TYPE_22</source>
|
||||||
<translation>POLYEDRE</translation>
|
<translation>POLYEDRE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>ENTITY_TYPE_22</source>
|
<source>ENTITY_TYPE_23</source>
|
||||||
<translation>QPOLYEDRE</translation>
|
<translation>QPOLYEDRE</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>ENTITY_TYPE_23</source>
|
<source>ENTITY_TYPE_24</source>
|
||||||
<translation>BALL</translation>
|
<translation>BALL</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
Loading…
Reference in New Issue
Block a user