00e7041b57450dc9d9ba903153d05180512e8f92
[occt.git] / tools / DFBrowserPane / DFBrowserPane_TNamingUsedShapes.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_TNamingUsedShapes.hxx>
17
18 #include <AIS_Shape.hxx>
19 #include <BRep_Builder.hxx>
20
21 #include <inspector/DFBrowserPane_AttributePaneModel.hxx>
22 #include <inspector/DFBrowserPane_AttributePaneSelector.hxx>
23 #include <inspector/DFBrowserPane_TableView.hxx>
24 #include <inspector/DFBrowserPane_Tools.hxx>
25
26 #include <TDF_Label.hxx>
27
28 #include <TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape.hxx>
29 #include <TNaming_NamedShape.hxx>
30 #include <TNaming_PtrRefShape.hxx>
31 #include <TNaming_RefShape.hxx>
32 #include <TNaming_UsedShapes.hxx>
33
34 #include <TopoDS_Compound.hxx>
35 #include <TopoDS_Shape.hxx>
36
37 #include <Standard_WarningsDisable.hxx>
38 #include <QItemSelectionModel>
39 #include <QTableView>
40 #include <QVariant>
41 #include <QWidget>
42 #include <Standard_WarningsRestore.hxx>
43
44 const int COLUMN_TYPE_WIDTH = 70;
45 const int COLUMN_POINTER_WIDTH = 90;
46 const int COLUMN_REFERENCE_WIDTH = 90;
47
48 // =======================================================================
49 // function : Constructor
50 // purpose :
51 // =======================================================================
52 DFBrowserPane_TNamingUsedShapes::DFBrowserPane_TNamingUsedShapes()
53 : DFBrowserPane_AttributePane()
54 {
55   getPaneModel()->SetColumnCount (4);
56   getPaneModel()->SetItalicColumns (QList<int>());
57
58   QList<QVariant> aValues;
59   aValues << "ShapeType" << "TShape" << "Label" << "RefShape";
60   getPaneModel()->SetHeaderValues (aValues, Qt::Horizontal);
61 }
62
63 // =======================================================================
64 // function : GetValues
65 // purpose :
66 // =======================================================================
67 void DFBrowserPane_TNamingUsedShapes::GetValues (const Handle(TDF_Attribute)& theAttribute, QList<QVariant>& theValues)
68 {
69   Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast (theAttribute);
70   if (anAttribute.IsNull())
71     return;
72
73   std::list<TCollection_AsciiString> aReferences;
74   if (myAttributeRefs.Find (anAttribute, aReferences))
75   {
76     QMap<TCollection_AsciiString, QList<QVariant> > anEntryValues;
77     QList<QVariant> aValues;
78     TNaming_DataMapOfShapePtrRefShape& aMap = anAttribute->Map();
79     for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt (aMap); aRefIt.More(); aRefIt.Next())
80     {
81       TCollection_AsciiString anEntry = DFBrowserPane_Tools::GetEntry (aRefIt.Value()->Label());
82       aValues.clear();
83       TopoDS_Shape aShape = aRefIt.Key();
84       aValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::ToName (DB_SHAPE_TYPE, aShape.ShapeType()).ToCString()
85                                        : "EMPTY SHAPE");
86       aValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()->This()).ToCString() : "");
87       const TopoDS_Shape aValueShape = aRefIt.Value()->Shape();
88       aValues.append (!aValueShape.IsNull() ?
89                                     DFBrowserPane_Tools::GetPointerInfo (aValueShape.TShape()->This()).ToCString() : "");
90       anEntryValues[anEntry] = aValues;
91     }
92
93     for (std::list<TCollection_AsciiString>::const_iterator aRefIt = aReferences.begin(); aRefIt != aReferences.end(); aRefIt++)
94     {
95       aValues = anEntryValues[*aRefIt];
96       theValues << aValues[0] << aValues[1] << QString ((*aRefIt).ToCString()) << aValues[2];
97     }
98   }
99   else
100   {
101     TNaming_DataMapOfShapePtrRefShape& aMap = anAttribute->Map();
102     for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt (aMap); aRefIt.More(); aRefIt.Next())
103     {
104       TopoDS_Shape aShape = aRefIt.Key();
105       theValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::ToName (DB_SHAPE_TYPE, aShape.ShapeType()).ToCString()
106                                          : "EMPTY SHAPE");
107       theValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()->This()).ToCString() : "");
108       theValues.append (DFBrowserPane_Tools::GetEntry (aRefIt.Value()->Label()).ToCString());
109       const TopoDS_Shape aValueShape = aRefIt.Value()->Shape();
110       theValues.append (!aValueShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aValueShape.TShape()->This()).ToCString() : "");
111     }
112   }
113 }
114
115 // =======================================================================
116 // function : GetAttributeInfo
117 // purpose :
118 // =======================================================================
119 QVariant DFBrowserPane_TNamingUsedShapes::GetAttributeInfo (const Handle(TDF_Attribute)& theAttribute, int theRole,
120                                                             int theColumnId)
121 {
122   if (theColumnId != 0)
123     return DFBrowserPane_AttributePane::GetAttributeInfo (theAttribute, theRole, theColumnId);
124
125   switch (theRole)
126   {
127     case Qt::ForegroundRole: return QColor (myAttributeRefs.IsEmpty() ? Qt::gray : Qt::black);
128     case Qt::ToolTipRole:
129       return QVariant (myAttributeRefs.IsEmpty() ? QString (QObject::tr ("Content is not sorted yet")) : "");
130     default:
131       break;
132   }
133   return DFBrowserPane_AttributePane::GetAttributeInfo (theAttribute, theRole, theColumnId);
134 }
135
136 // =======================================================================
137 // function : GetShortAttributeInfo
138 // purpose :
139 // =======================================================================
140 void DFBrowserPane_TNamingUsedShapes::GetShortAttributeInfo (const Handle(TDF_Attribute)& theAttribute,
141                                                              QList<QVariant>& theValues)
142 {
143   Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast (theAttribute);
144   if (anAttribute.IsNull())
145     return;
146
147   theValues.append (QString ("%1").arg (anAttribute->Map().Extent()));
148 }
149
150 // =======================================================================
151 // function : GetAttributeReferences
152 // purpose :
153 // =======================================================================
154 void DFBrowserPane_TNamingUsedShapes::GetAttributeReferences (const Handle(TDF_Attribute)& theAttribute,
155                                                               NCollection_List<Handle(TDF_Attribute)>& theRefAttributes,
156                                                               Handle(Standard_Transient)& /*theRefPresentation*/)
157 {
158   Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast (theAttribute);
159   if (anAttribute.IsNull())
160     return;
161
162   QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 2);
163   if (aSelectedEntries.isEmpty())
164     return;
165
166   for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt (anAttribute->Map()); aRefIt.More(); aRefIt.Next())
167   {
168     if (aSelectedEntries.contains (DFBrowserPane_Tools::GetEntry (aRefIt.Value()->Label()).ToCString()))
169       theRefAttributes.Append (aRefIt.Value()->NamedShape());
170   }
171 }
172
173 // =======================================================================
174 // function : getTableColumnWidths
175 // purpose :
176 // =======================================================================
177 QMap<int, int> DFBrowserPane_TNamingUsedShapes::getTableColumnWidths() const
178 {
179   QMap<int, int> aValues;
180   aValues[0] = COLUMN_TYPE_WIDTH; // "ShapeType"
181   aValues[1] = COLUMN_POINTER_WIDTH; // "Key_TShape"
182   aValues[2] = COLUMN_REFERENCE_WIDTH; // "Label Entry"
183   return aValues;
184 }