0029743: Samples - Inspector tool - crash by selecting TNaming_UsedShapes tree item
[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   TNaming_DataMapOfShapePtrRefShape& aMap = anAttribute->Map();
75   for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt (aMap); aRefIt.More(); aRefIt.Next())
76   {
77     TopoDS_Shape aShape = aRefIt.Key();
78     TNaming_PtrRefShape aPtrRefShape = aRefIt.Value();
79       
80     if (!aShape.IsNull())
81     {
82       theValues.append(DFBrowserPane_Tools::ToName(DB_SHAPE_TYPE, aShape.ShapeType()).ToCString());
83       theValues.append(DFBrowserPane_Tools::GetPointerInfo(aShape.TShape()->This()).ToCString());
84     }
85     else
86       theValues << "EMPTY SHAPE" << "";
87
88     if (aPtrRefShape && aPtrRefShape->FirstUse())
89     {
90       theValues.append(DFBrowserPane_Tools::GetEntry(aPtrRefShape->Label()).ToCString());
91       const TopoDS_Shape& aValueShape = aPtrRefShape->Shape();
92       theValues.append(!aValueShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo(aValueShape.TShape()->This()).ToCString() : "");
93     }
94     else
95       theValues << "" << "";
96   }
97 }
98
99 // =======================================================================
100 // function : GetShortAttributeInfo
101 // purpose :
102 // =======================================================================
103 void DFBrowserPane_TNamingUsedShapes::GetShortAttributeInfo (const Handle(TDF_Attribute)& theAttribute,
104                                                              QList<QVariant>& theValues)
105 {
106   Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast (theAttribute);
107   if (anAttribute.IsNull())
108     return;
109
110   theValues.append (QString ("%1").arg (anAttribute->Map().Extent()));
111 }
112
113 // =======================================================================
114 // function : GetAttributeReferences
115 // purpose :
116 // =======================================================================
117 void DFBrowserPane_TNamingUsedShapes::GetAttributeReferences (const Handle(TDF_Attribute)& theAttribute,
118                                                               NCollection_List<Handle(TDF_Attribute)>& theRefAttributes,
119                                                               Handle(Standard_Transient)& /*theRefPresentation*/)
120 {
121   Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast (theAttribute);
122   if (anAttribute.IsNull())
123     return;
124
125   QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 2);
126   if (aSelectedEntries.isEmpty())
127     return;
128
129   for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt (anAttribute->Map()); aRefIt.More(); aRefIt.Next())
130   {
131     TNaming_PtrRefShape aPtrRefShape = aRefIt.Value();
132     if (!aPtrRefShape || !aPtrRefShape->FirstUse())
133       continue;
134
135     if (aSelectedEntries.contains (DFBrowserPane_Tools::GetEntry (aPtrRefShape->Label()).ToCString()))
136       theRefAttributes.Append (aPtrRefShape->NamedShape());
137   }
138 }
139
140 // =======================================================================
141 // function : getTableColumnWidths
142 // purpose :
143 // =======================================================================
144 QMap<int, int> DFBrowserPane_TNamingUsedShapes::getTableColumnWidths() const
145 {
146   QMap<int, int> aValues;
147   aValues[0] = COLUMN_TYPE_WIDTH; // "ShapeType"
148   aValues[1] = COLUMN_POINTER_WIDTH; // "Key_TShape"
149   aValues[2] = COLUMN_REFERENCE_WIDTH; // "Label Entry"
150   return aValues;
151 }