0032429: Coding - Warnings during compilation on macosx arm64 with option BUILD_Inspe...
[occt.git] / tools / DFBrowserPane / DFBrowserPane_TNamingNamedShape.cxx
1 // Created on: 2017-06-16
2 // Created by: Natalia ERMOLAEVA
3 // Copyright (c) 2017 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement. 
15
16 #include <inspector/DFBrowserPane_TNamingNamedShape.hxx>
17
18 #include <inspector/DFBrowserPane_AttributePaneModel.hxx>
19 #include <inspector/DFBrowserPane_ItemDelegateButton.hxx>
20 #include <inspector/DFBrowserPane_ItemRole.hxx>
21 #include <inspector/DFBrowserPane_HelperExport.hxx>
22 #include <inspector/DFBrowserPane_SelectionKind.hxx>
23 #include <inspector/DFBrowserPane_TableView.hxx>
24 #include <inspector/DFBrowserPane_Tools.hxx>
25 #include <inspector/TInspectorAPI_PluginParameters.hxx>
26
27 #include <AIS_InteractiveObject.hxx>
28 #include <AIS_Shape.hxx>
29 #include <BRep_Builder.hxx>
30 #include <BRepTools.hxx>
31 #include <TNaming_Builder.hxx>
32 #include <TNaming_Iterator.hxx>
33 #include <TNaming_NamedShape.hxx>
34 #include <TNaming_Tool.hxx>
35 #include <TopoDS_Shape.hxx>
36 #include <TopoDS_Compound.hxx>
37
38 #include <Standard_WarningsDisable.hxx>
39 #include <QFileDialog>
40 #include <QGridLayout>
41 #include <QEvent>
42 #include <QHeaderView>
43 #include <QIcon>
44 #include <QMap>
45 #include <QPainter>
46 #include <QStyledItemDelegate>
47 #include <QTableView>
48 #include <QVariant>
49 #include <QWidget>
50 #include <Standard_WarningsRestore.hxx>
51
52 static const int COLUMN_EXPORT_WIDTH = 20;
53
54 // =======================================================================
55 // function : Constructor
56 // purpose :
57 // =======================================================================
58 DFBrowserPane_TNamingNamedShape::DFBrowserPane_TNamingNamedShape()
59 : DFBrowserPane_AttributePane(), myEvolutionTableView (0), myHelperExport (0)
60 {
61   getPaneModel()->SetColumnCount (5);
62
63   myEvolutionPaneModel = new DFBrowserPane_AttributePaneModel();
64   myEvolutionPaneModel->SetColumnCount (10);
65   QList<int> anItalicColumns;
66   anItalicColumns << 1 << 5;
67   myEvolutionPaneModel->SetItalicColumns (anItalicColumns);
68   QItemSelectionModel* aSelectionModel = new QItemSelectionModel (myEvolutionPaneModel);
69   mySelectionModels.push_back (aSelectionModel);
70 }
71
72 // =======================================================================
73 // function : CreateWidget
74 // purpose :
75 // =======================================================================
76 QWidget* DFBrowserPane_TNamingNamedShape::CreateWidget (QWidget* theParent)
77 {
78   QWidget* aMainWidget = new QWidget (theParent);
79   aMainWidget->setVisible (false);
80
81   myTableView = new DFBrowserPane_TableView (aMainWidget);
82   myTableView->GetTableView()->verticalHeader()->setVisible (false);
83   myTableView->SetModel (myPaneModel);
84   QTableView* aTableView = myTableView->GetTableView();
85   aTableView->setSelectionBehavior (QAbstractItemView::SelectItems);
86   std::list<QItemSelectionModel*>::const_iterator aSelectionModelsIt = mySelectionModels.begin();
87   aTableView->setSelectionModel (*aSelectionModelsIt);
88   aSelectionModelsIt++;
89
90   aTableView->horizontalHeader()->setStretchLastSection (false);
91   aTableView->setColumnWidth (3, COLUMN_EXPORT_WIDTH);
92   aTableView->setColumnWidth (4, COLUMN_EXPORT_WIDTH);
93   DFBrowserPane_ItemDelegateButton* anItemDelegate = new DFBrowserPane_ItemDelegateButton (aTableView,
94                                                                                           ":/icons/export_shape.png");
95   QList<int> aRows;
96   aRows << 0 << 1;
97   anItemDelegate->SetFreeRows (aRows);
98   QObject::connect (anItemDelegate, SIGNAL (buttonPressed (const QModelIndex&)),
99                     &myHelperExport, SLOT (OnButtonPressed (const QModelIndex&)));
100   aTableView->setItemDelegateForColumn (3, anItemDelegate);
101
102   DFBrowserPane_ItemDelegateButton* anItemDelegate2 = new DFBrowserPane_ItemDelegateButton (aTableView,
103                                                                                             ":/icons/folder_export.png");
104   anItemDelegate2->SetFreeRows (aRows);
105   aTableView->setItemDelegateForColumn (4, anItemDelegate2);
106
107   myEvolutionTableView = new DFBrowserPane_TableView (aMainWidget);
108   myEvolutionTableView->SetModel (myEvolutionPaneModel);
109   aTableView = myEvolutionTableView->GetTableView();
110
111   aTableView->setSelectionModel (*aSelectionModelsIt);
112
113   aTableView->horizontalHeader()->setStretchLastSection (false);
114   aTableView->setColumnWidth (4, COLUMN_EXPORT_WIDTH);
115   aTableView->setColumnWidth (9, COLUMN_EXPORT_WIDTH);
116
117   anItemDelegate = new DFBrowserPane_ItemDelegateButton (myEvolutionTableView->GetTableView(), ":/icons/export_shape.png");
118   QObject::connect (anItemDelegate, SIGNAL (buttonPressed (const QModelIndex&)),
119                     &myHelperExport, SLOT (OnButtonPressed (const QModelIndex&)));
120   myEvolutionTableView->GetTableView()->setItemDelegateForColumn (4, anItemDelegate);
121
122   anItemDelegate = new DFBrowserPane_ItemDelegateButton (myEvolutionTableView->GetTableView(), ":/icons/export_shape.png");
123   QObject::connect (anItemDelegate, SIGNAL (buttonPressed (const QModelIndex&)),
124                     &myHelperExport, SLOT (OnButtonPressed (const QModelIndex&)));
125   myEvolutionTableView->GetTableView()->setItemDelegateForColumn (9, anItemDelegate);
126
127   QGridLayout* aLay = new QGridLayout (aMainWidget);
128   aLay->setContentsMargins (0, 0, 0, 0);
129   aLay->addWidget (myTableView, 0, 0);
130   aLay->addWidget (myEvolutionTableView, 1, 0);
131
132   return aMainWidget;
133 }
134
135 // =======================================================================
136 // function : Init
137 // purpose :
138 // =======================================================================
139 void DFBrowserPane_TNamingNamedShape::Init (const Handle(TDF_Attribute)& theAttribute)
140 {
141   Handle(TNaming_NamedShape) aShapeAttr = Handle(TNaming_NamedShape)::DownCast (theAttribute);
142   myHelperExport.Clear();
143
144   QList<QVariant> aValues;
145   aValues << "Version" << QString::number (aShapeAttr->Version()) << "" << "" << "";
146   aValues << "Evolution" << DFBrowserPane_Tools::ToName (DB_NS_TYPE, aShapeAttr->Evolution()).ToCString() << "" << "" << "";
147
148   NCollection_List<TopoDS_Shape> aShapes;
149   QList<int> aFreeRows;
150   aFreeRows << 0 << 1;
151
152   TopoDS_Shape aShape = aShapeAttr->Get();
153   TCollection_AsciiString aShapeInfo = !aShape.IsNull() ? Standard_Dump::GetPointerInfo (aShape.TShape()) : "";
154   aValues << "Shape" << aShapeInfo.ToCString() << DFBrowserPane_Tools::ShapeTypeInfo (aShape) << "" << "";
155   aShapes.Append (aShape);
156   if (aShape.IsNull())
157     aFreeRows << 2;
158
159   TopoDS_Shape aCurrentShape = TNaming_Tool::CurrentShape (aShapeAttr);
160   TCollection_AsciiString aCurrentShapeInfo = !aCurrentShape.IsNull() ?
161     Standard_Dump::GetPointerInfo (aCurrentShape.TShape()) : "";
162   aValues << "CurrentShape" << aCurrentShapeInfo.ToCString()
163           << DFBrowserPane_Tools::ShapeTypeInfo (aCurrentShape) << "" << "";
164   aShapes.Append (aCurrentShape);
165   if (aCurrentShape.IsNull())
166     aFreeRows << 3;
167
168   TopoDS_Shape anOriginalShape = TNaming_Tool::OriginalShape (aShapeAttr);
169   TCollection_AsciiString anOriginalShapeInfo = !anOriginalShape.IsNull() ?
170     Standard_Dump::GetPointerInfo (anOriginalShape.TShape()) : "";
171   aValues << "OriginalShape" << anOriginalShapeInfo.ToCString()
172           << DFBrowserPane_Tools::ShapeTypeInfo (anOriginalShape) << "" << "";
173   aShapes.Append (anOriginalShape);
174   if (anOriginalShape.IsNull())
175     aFreeRows << 4;
176
177
178   DFBrowserPane_AttributePaneModel* aModel = getPaneModel();
179   aModel->Init (aValues);
180   if (myTableView)
181   {
182     QTableView* aTableView = myTableView->GetTableView();
183     for (int i = 0; i < aModel->columnCount(); i++)
184     {
185       if (i == 3 || i == 4)
186         dynamic_cast<DFBrowserPane_ItemDelegateButton*>(aTableView->itemDelegateForColumn(3))->SetFreeRows (aFreeRows);
187       else
188         aTableView->resizeColumnToContents (i);
189     }
190   }
191   QModelIndexList anIndices;
192   int aRowId = 2;
193   for (NCollection_List<TopoDS_Shape>::Iterator aShapeIt (aShapes); aShapeIt.More(); aShapeIt.Next(), aRowId++)
194   {
195     if (aShapeIt.Value().IsNull())
196       continue;
197     anIndices.clear();
198     anIndices << aModel->index (aRowId, 1) << aModel->index (aRowId, 2) <<
199                  aModel->index (aRowId, 3) << aModel->index (aRowId, 4);
200     myHelperExport.AddShape (aShapeIt.Value(), anIndices);
201   }
202
203   // evolution table view filling
204   aValues.clear();
205   aRowId = 0;
206   bool aHasModified = false;
207   for (TNaming_Iterator aShapeAttrIt (aShapeAttr); aShapeAttrIt.More(); aShapeAttrIt.Next(), aRowId++)
208   {
209     const TopoDS_Shape& anOldShape = aShapeAttrIt.OldShape();
210     const TopoDS_Shape& aNewShape = aShapeAttrIt.NewShape();
211
212     Handle(TNaming_NamedShape) anOldAttr = TNaming_Tool::NamedShape (anOldShape, aShapeAttr->Label());
213     aValues << DFBrowserPane_Tools::ToName (DB_NS_TYPE, aShapeAttrIt.Evolution()).ToCString();
214     aHasModified = aHasModified | aShapeAttrIt.IsModification();
215
216     aValues << "New:";
217
218     QString aLabelInfo;
219     if (!anOldAttr.IsNull())
220     {
221       TDF_Label anOldLabel = anOldAttr->Label();
222       if (!anOldLabel.IsNull())
223         aLabelInfo = QString (DFBrowserPane_Tools::GetEntry (anOldLabel).ToCString());
224     }
225     if (!aNewShape.IsNull())
226       aValues << Standard_Dump::GetPointerInfo (aNewShape.TShape()->This()).ToCString()
227               << DFBrowserPane_Tools::ShapeTypeInfo (aNewShape)
228               << "";
229     else
230       aValues << "-" << "-" << "";
231     aValues << "Old:";
232     if (!anOldShape.IsNull())
233       aValues << Standard_Dump::GetPointerInfo (anOldShape.TShape()->This()).ToCString()
234               << DFBrowserPane_Tools::ShapeTypeInfo (anOldShape)
235               << aLabelInfo
236               << "";
237     else
238       aValues << "-" << "-" << "-" << "";
239   }
240
241   if (myEvolutionTableView)
242   {
243     myEvolutionTableView->setVisible (aValues.size() > 0);
244     myEvolutionTableView->GetTableView()->setColumnHidden (1, !aHasModified);
245     myEvolutionPaneModel->Init (aValues);
246
247     aRowId = 0;
248     for (TNaming_Iterator aShapeAttrIt (aShapeAttr); aShapeAttrIt.More(); aShapeAttrIt.Next(), aRowId++)
249     {
250       const TopoDS_Shape& anOldShape = aShapeAttrIt.OldShape();
251       const TopoDS_Shape& aNewShape = aShapeAttrIt.NewShape();
252
253       if (!aNewShape.IsNull())
254       {
255         anIndices.clear();
256         anIndices << myEvolutionPaneModel->index (aRowId, 2) << myEvolutionPaneModel->index (aRowId, 3)
257                   << myEvolutionPaneModel->index (aRowId, 4);
258         myHelperExport.AddShape (aNewShape, anIndices);
259       }
260       if (!anOldShape.IsNull())
261       {
262         anIndices.clear();
263         anIndices << myEvolutionPaneModel->index (aRowId, 6) << myEvolutionPaneModel->index (aRowId, 7)
264                   << myEvolutionPaneModel->index (aRowId, 9);
265         myHelperExport.AddShape (anOldShape, anIndices);
266       }
267     }
268     for (int i = 0; i < myEvolutionPaneModel->columnCount(); i++)
269     {
270       if (i == 5 || i == 10) continue;
271       myEvolutionTableView->GetTableView()->resizeColumnToContents (i);
272     }
273   }
274 }
275
276 // =======================================================================
277 // function : GetValues
278 // purpose :
279 // =======================================================================
280 void DFBrowserPane_TNamingNamedShape::GetValues (const Handle(TDF_Attribute)&, QList<QVariant>&)
281 {
282 }
283
284 // =======================================================================
285 // function : GetAttributeInfo
286 // purpose :
287 // =======================================================================
288 QVariant DFBrowserPane_TNamingNamedShape::GetAttributeInfo (const Handle(TDF_Attribute)& theAttribute, int theRole,
289                                                             int theColumnId)
290 {
291   if (theColumnId != 0)
292     return DFBrowserPane_AttributePane::GetAttributeInfo (theAttribute, theRole, theColumnId);
293
294   switch (theRole)
295   {
296     case Qt::DecorationRole: return QIcon (":/icons/named_shape.png");
297     case DFBrowserPane_ItemRole_Decoration_40x40: return QIcon (":/icons/named_shape_40x40.png");
298     case Qt::ForegroundRole:
299     {
300       TopoDS_Shape aShape;
301       Handle(TNaming_NamedShape) anAttribute = Handle(TNaming_NamedShape)::DownCast (theAttribute);
302       if (!anAttribute.IsNull())
303         aShape = anAttribute->Get();
304       if (aShape.IsNull())
305         return QColor (Qt::black);
306
307       return QColor (aShape.Orientation() == TopAbs_FORWARD ? Qt::darkGray :
308                      aShape.Orientation() == TopAbs_REVERSED ? QColor (Qt::gray) : Qt::black);
309     }
310     default:
311     break;
312   }
313   return DFBrowserPane_AttributePane::GetAttributeInfo (theAttribute, theRole, theColumnId);
314 }
315
316 // =======================================================================
317 // function : GetShortAttributeInfo
318 // purpose :
319 // =======================================================================
320 void DFBrowserPane_TNamingNamedShape::GetShortAttributeInfo (const Handle(TDF_Attribute)& theAttribute,
321                                                              QList<QVariant>& theValues)
322 {
323   Handle(TNaming_NamedShape) aShapeAttribute = Handle(TNaming_NamedShape)::DownCast (theAttribute);
324
325   if (aShapeAttribute->Get().IsNull())
326     theValues.append ("EMPTY SHAPE");
327   else
328   {
329     theValues.append (QString ("%1 : %2").arg (DFBrowserPane_Tools::ToName (DB_SHAPE_TYPE, aShapeAttribute->Get().ShapeType()).ToCString())
330                                          .arg (DFBrowserPane_Tools::ToName (DB_NS_TYPE, aShapeAttribute->Evolution()).ToCString()));
331   }
332 }
333
334 // =======================================================================
335 // function : GetSelectionKind
336 // purpose :
337 // =======================================================================
338 int DFBrowserPane_TNamingNamedShape::GetSelectionKind (QItemSelectionModel* theModel)
339 {
340   int aKind = DFBrowserPane_AttributePaneAPI::GetSelectionKind (theModel);
341
342   QTableView* aTableView = myTableView->GetTableView();
343   if (aTableView->selectionModel() != theModel)
344     return aKind;
345
346   QModelIndexList aSelectedIndices = theModel->selectedIndexes();
347   if (aSelectedIndices.size() != 1)
348     return aKind;
349
350   QModelIndex aSelectedIndex = aSelectedIndices.first();
351   int aRow = aSelectedIndex.row();
352   if (aRow == 0 || aRow == 1)
353     return aKind;
354
355   if (aSelectedIndex.column() == 4)
356     aKind = DFBrowserPane_SelectionKind_ExportToShapeViewer;
357
358   return aKind;
359 }
360
361 // =======================================================================
362 // function : GetSelectionParameters
363 // purpose :
364 // =======================================================================
365 void DFBrowserPane_TNamingNamedShape::GetSelectionParameters (QItemSelectionModel* theModel,
366                                                               NCollection_List<Handle(Standard_Transient)>& theParameters,
367                                                               NCollection_List<TCollection_AsciiString>& theItemNames)
368 {
369   QTableView* aTableView = myTableView->GetTableView();
370   if (aTableView->selectionModel() != theModel)
371     return;
372
373   QModelIndexList aSelectedIndices = theModel->selectedIndexes();
374   if (aSelectedIndices.size() != 1)
375     return;
376
377   QModelIndex aSelectedIndex = aSelectedIndices.first();
378   if (aSelectedIndex.column() != 4)
379     return;
380
381   const TopoDS_Shape& aShape = myHelperExport.Shape (aSelectedIndex);
382   if (aShape.IsNull())
383     return;
384   theParameters.Append (aShape.TShape());
385   theItemNames.Append (TInspectorAPI_PluginParameters::ParametersToString (aShape));
386 }
387
388 // =======================================================================
389 // function : GetReferences
390 // purpose :
391 // =======================================================================
392 void DFBrowserPane_TNamingNamedShape::GetReferences (const Handle(TDF_Attribute)& theAttribute,
393                                                      NCollection_List<TDF_Label>& theRefLabels,
394                                                      Handle(Standard_Transient)& theRefPresentation)
395 {
396   if (!myEvolutionTableView)
397     return;
398   QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (
399                                                           myEvolutionTableView->GetTableView(), 9);
400
401   Handle(TNaming_NamedShape) aShapeAttr = Handle(TNaming_NamedShape)::DownCast (theAttribute);
402   for (TNaming_Iterator aShapeAttrIt (aShapeAttr); aShapeAttrIt.More(); aShapeAttrIt.Next())
403   {
404     const TopoDS_Shape& anOldShape = aShapeAttrIt.OldShape();
405
406     Handle(TNaming_NamedShape) anOldAttr = TNaming_Tool::NamedShape (anOldShape, aShapeAttr->Label());
407     QString aLabelInfo;
408     if (!anOldAttr.IsNull())
409     {
410       TDF_Label anOldLabel = anOldAttr->Label();
411       if (!anOldLabel.IsNull())
412       {
413         if (aSelectedEntries.contains (DFBrowserPane_Tools::GetEntry (anOldLabel).ToCString()))
414         theRefLabels.Append (anOldLabel);
415       }
416     }
417   }
418   TopoDS_Shape aShape = getSelectedShapes();
419   if (!aShape.IsNull())
420   {
421     Handle(AIS_Shape) aPresentation = new AIS_Shape (aShape);
422     aPresentation->Attributes()->SetAutoTriangulation (Standard_False);
423     theRefPresentation = aPresentation;
424   }
425 }
426
427 // =======================================================================
428 // function : GetPresentation
429 // purpose :
430 // =======================================================================
431 Handle(Standard_Transient) DFBrowserPane_TNamingNamedShape::GetPresentation (const Handle(TDF_Attribute)& theAttribute)
432 {
433   Handle(Standard_Transient) aPresentation;
434   Handle(TNaming_NamedShape) aShapeAttr = Handle(TNaming_NamedShape)::DownCast (theAttribute);
435   if (aShapeAttr.IsNull())
436     return aPresentation;
437
438   TopoDS_Shape aShape = aShapeAttr->Get();
439   if (aShape.IsNull())
440     return aPresentation;
441
442   aPresentation = new AIS_Shape (aShape);
443   return aPresentation;
444 }
445
446 // =======================================================================
447 // function : getSelectedShapes
448 // purpose :
449 // =======================================================================
450 TopoDS_Shape DFBrowserPane_TNamingNamedShape::getSelectedShapes()
451 {
452   TopoDS_Shape aShape;
453
454   if (!myTableView && !myEvolutionTableView)
455     return aShape;
456
457   // table view selected shapes
458   QItemSelectionModel* aTableViewSelModel = myTableView->GetTableView()->selectionModel();
459   QModelIndexList anIndices = aTableViewSelModel->selectedIndexes();
460
461   BRep_Builder aBuilder;
462   TopoDS_Compound aComp;
463   aBuilder.MakeCompound (aComp);
464   bool aHasShapes = false;
465   for (QModelIndexList::const_iterator anIt = anIndices.begin(), aLast = anIndices.end(); anIt != aLast; anIt++)
466   {
467     QModelIndex anIndex = *anIt;
468     if (!myHelperExport.HasShape (anIndex))
469       continue;
470     aBuilder.Add (aComp, myHelperExport.Shape (anIndex));
471     aHasShapes = true;
472   }
473
474   // evolution table selected shapes
475   aTableViewSelModel = myEvolutionTableView->GetTableView()->selectionModel();
476   anIndices.clear();
477   anIndices = aTableViewSelModel->selectedIndexes();
478   for (QModelIndexList::const_iterator anIt = anIndices.begin(), aLast = anIndices.end(); anIt != aLast; anIt++)
479   {
480     QModelIndex anIndex = *anIt;
481     if (!myHelperExport.HasShape (anIndex))
482       continue;
483     aBuilder.Add (aComp, myHelperExport.Shape (anIndex));
484     aHasShapes = true;
485   }
486   if (aHasShapes)
487     aShape = aComp;
488   return aShape;
489 }