0031668: Visualization - WebGL sample doesn't work on Emscripten 1.39
[occt.git] / src / STEPSelections / STEPSelections_AssemblyExplorer.cxx
CommitLineData
b311480e 1// Created on: 1999-03-24
2// Created by: data exchange team
3// Copyright (c) 1999-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 8// This library is free software; you can redistribute it and/or modify it under
9// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
42cf5bc1 17
7fd59977 18#include <Interface_EntityIterator.hxx>
42cf5bc1 19#include <Interface_Graph.hxx>
20#include <Interface_InterfaceModel.hxx>
21#include <Interface_Macros.hxx>
22#include <Standard_Transient.hxx>
7fd59977 23#include <StepBasic_Product.hxx>
42cf5bc1 24#include <StepBasic_ProductDefinition.hxx>
7fd59977 25#include <StepBasic_ProductDefinitionFormation.hxx>
42cf5bc1 26#include <StepRepr_MappedItem.hxx>
ec357c5c 27#include <StepRepr_NextAssemblyUsageOccurrence.hxx>
42cf5bc1 28#include <StepRepr_ProductDefinitionShape.hxx>
29#include <StepRepr_PropertyDefinition.hxx>
ec357c5c 30#include <STEPSelections_AssemblyComponent.hxx>
42cf5bc1 31#include <STEPSelections_AssemblyExplorer.hxx>
32#include <STEPSelections_AssemblyLink.hxx>
33#include <STEPSelections_HSequenceOfAssemblyLink.hxx>
34#include <StepShape_ContextDependentShapeRepresentation.hxx>
35#include <StepShape_ShapeDefinitionRepresentation.hxx>
36#include <StepShape_ShapeRepresentation.hxx>
37#include <TCollection_HAsciiString.hxx>
7fd59977 38
39STEPSelections_AssemblyExplorer::STEPSelections_AssemblyExplorer(const Interface_Graph &G):myGraph(G)
40{
41 Init(G);
42}
43
44Handle(Standard_Transient) STEPSelections_AssemblyExplorer::
45 FindItemWithNAUO(const Handle(StepRepr_NextAssemblyUsageOccurrence)& nauo) const
46{
47 Handle(Standard_Transient) item;
48 Handle(StepRepr_ProductDefinitionShape) pds;
49 Interface_EntityIterator subs = myGraph.Sharings(nauo);
50 for(subs.Start(); subs.More()&&pds.IsNull(); subs.Next())
51 if(subs.Value()->IsKind(STANDARD_TYPE(StepRepr_ProductDefinitionShape)))
52 pds = Handle(StepRepr_ProductDefinitionShape)::DownCast(subs.Value());
53 if(pds.IsNull()) return item;
54
55 subs = myGraph.Sharings(pds);
56 Handle(StepShape_ContextDependentShapeRepresentation) cdsr;
57 Handle(StepShape_ShapeDefinitionRepresentation) shdefrep;
58 Handle(Standard_Transient) itmp;
59 for(subs.Start(); subs.More()&&shdefrep.IsNull(); subs.Next()) {
60 itmp = subs.Value();
61 if(itmp->IsKind(STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation)))
62 return itmp;
63 if(itmp->IsKind(STANDARD_TYPE(StepShape_ShapeDefinitionRepresentation)))
64 shdefrep = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(itmp);
65 }
66 if(shdefrep.IsNull()) return shdefrep ;
67 Handle(StepShape_ShapeRepresentation) srep = Handle(StepShape_ShapeRepresentation)::DownCast(shdefrep->UsedRepresentation());
68 if(srep.IsNull()) return srep;
69 for(Standard_Integer i = 1; i <= srep->NbItems(); i++) {
70 Handle(StepRepr_RepresentationItem) repitem = srep->ItemsValue(i);
71 if(repitem->IsKind(STANDARD_TYPE(StepRepr_MappedItem)))
72 return repitem;
73 }
74 return item;
75}
76
77Handle(StepShape_ShapeDefinitionRepresentation) STEPSelections_AssemblyExplorer::
78 FindSDRWithProduct(const Handle(StepBasic_ProductDefinition)& product) const
79{
80 Interface_EntityIterator subs = myGraph.Sharings(product);
81 for(subs.Start(); subs.More(); subs.Next())
82 if(subs.Value()->IsKind(STANDARD_TYPE(StepRepr_PropertyDefinition))) {
83 Interface_EntityIterator subs1 = myGraph.Sharings(subs.Value());
84 for(subs1.Start(); subs1.More(); subs1.Next())
85 if(subs1.Value()->IsKind(STANDARD_TYPE(StepShape_ShapeDefinitionRepresentation))) {
86 DeclareAndCast(StepShape_ShapeDefinitionRepresentation,SDR,subs1.Value());
87 return SDR;
88 }
89 }
90 Handle(StepShape_ShapeDefinitionRepresentation) sdr;
91 return sdr;
92}
93
94void STEPSelections_AssemblyExplorer::FillListWithGraph(const Handle(STEPSelections_AssemblyComponent)& cmp)
95{
96 Handle(StepShape_ShapeDefinitionRepresentation) SDR = cmp->GetSDR();
97 Handle(STEPSelections_HSequenceOfAssemblyLink) list = cmp->GetList();
98 Handle(StepRepr_ProductDefinitionShape) pdsh =
99 Handle(StepRepr_ProductDefinitionShape)::DownCast ( SDR->Definition().PropertyDefinition() );
100 if(pdsh.IsNull()) return;
101 Handle(StepBasic_ProductDefinition) pdf = pdsh->Definition().ProductDefinition();
102 if(pdf.IsNull()) return;
103 Interface_EntityIterator subs = myGraph.Sharings(pdf);
104 for(subs.Start(); subs.More(); subs.Next())
105 if(subs.Value()->IsKind(STANDARD_TYPE(StepRepr_NextAssemblyUsageOccurrence))) {
106 DeclareAndCast(StepRepr_NextAssemblyUsageOccurrence,nauo,subs.Value());
107 if(pdf==nauo->RelatingProductDefinition()) {
108 Handle(STEPSelections_AssemblyLink) link = new STEPSelections_AssemblyLink;
109 link->SetNAUO(nauo);
110 link->SetItem(FindItemWithNAUO(nauo));
111 Handle(StepBasic_ProductDefinition) pdrComponent = nauo->RelatedProductDefinition();
112 if(pdrComponent.IsNull()) continue;
113 Handle(StepShape_ShapeDefinitionRepresentation) subSDR = FindSDRWithProduct(pdrComponent);
114 if(subSDR.IsNull()) continue;
115 Standard_Integer index = myMap.FindIndex(subSDR);
116 if(index)
117 link->SetComponent(Handle(STEPSelections_AssemblyComponent)::DownCast(myMap.FindFromIndex(index)));
118 else {
119 Handle(STEPSelections_HSequenceOfAssemblyLink) sublist = new STEPSelections_HSequenceOfAssemblyLink;
120 Handle(STEPSelections_AssemblyComponent) subCmp = new STEPSelections_AssemblyComponent(subSDR,sublist);
121 FillListWithGraph(subCmp);
122 link->SetComponent(subCmp);
123 myMap.Add(subSDR,subCmp);
124 }
125 list->Append(link);
126 }
127 }
128}
129
130
131void STEPSelections_AssemblyExplorer::Init(const Interface_Graph &G)
132{
133 myGraph = G;
134 myRoots.Clear();
135 myMap.Clear();
136 Interface_EntityIterator roots = myGraph.RootEntities();
137 for(roots.Start(); roots.More(); roots.Next())
138 if(roots.Value()->IsKind(STANDARD_TYPE(StepShape_ShapeDefinitionRepresentation))) {
139 Handle(STEPSelections_AssemblyComponent) cmp = new STEPSelections_AssemblyComponent;
140 cmp->SetSDR(Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(roots.Value()));
141 cmp->SetList(new STEPSelections_HSequenceOfAssemblyLink);
142 FillListWithGraph(cmp);
143 myRoots.Append(cmp);
144 }
145}
146
147
148static Standard_CString GetProductName(const Handle(StepShape_ShapeDefinitionRepresentation) &SDR)
149{
150 Standard_CString str = "";
151 Handle(StepBasic_Product) empty;
152 Handle(StepRepr_PropertyDefinition) PropDf = SDR->Definition().PropertyDefinition();
153 if ( PropDf.IsNull() ) return str;
154 Handle(StepBasic_ProductDefinition) PD = PropDf->Definition().ProductDefinition();
155 if ( PD.IsNull() ) return str;
156 Handle(StepBasic_ProductDefinitionFormation) PDF = PD->Formation();
157 if ( PDF.IsNull() ) return str;
158 return PDF->OfProduct()->Name()->ToCString();
159}
160
161static void PrintSubAssembly(Standard_OStream &os,
162 const Handle(STEPSelections_AssemblyComponent)& cmp,
163 const Handle(Interface_InterfaceModel) &Model,
164 Standard_Integer level)
165{
166 //for ( Standard_Integer j=0; j < level; j++ ) os << "\t";
167 os << "SDR: " <<Model->StringLabel(cmp->GetSDR())->ToCString()<<"\t";
168
04232180 169 os << "Product: "<<GetProductName(cmp->GetSDR())<<std::endl;
7fd59977 170 for ( Standard_Integer i = 1; i <= cmp->GetList()->Length(); i++) {
171 for ( Standard_Integer j=0; j < level+1; j++ ) os << "\t";
172 os << "NAUO :"<<Model->StringLabel(cmp->GetList()->Value(i)->GetNAUO())->ToCString()<<";\t";
173 if(cmp->GetList()->Value(i)->GetItem()->IsKind(STANDARD_TYPE(StepRepr_MappedItem)))
174 os <<"MI ";
175 else
176 if(cmp->GetList()->Value(i)->GetItem()->IsKind(STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation)))
177 os <<"CDSR ";
178 else
179 os <<"UNKNOWN LINK!!!";
180 PrintSubAssembly(os,cmp->GetList()->Value(i)->GetComponent(),Model,level+1);
181 }
182}
183
184
185void STEPSelections_AssemblyExplorer::Dump(Standard_OStream &os) const
186{
187 Handle(Interface_InterfaceModel) model = myGraph.Model();
188 for(Standard_Integer i = 1 ; i <=myRoots.Length(); i++) {
04232180 189 os<<"Assembly N: "<<i<<std::endl<<std::endl;
7fd59977 190 PrintSubAssembly(os,myRoots.Value(i),model,0);
191 }
192}