1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
15 #include <gp_Pnt2d.hxx>
16 #include <IFSelect_ContextModif.hxx>
17 #include <IFSelect_PacketList.hxx>
18 #include <IGESData_IGESModel.hxx>
19 #include <IGESDraw_Drawing.hxx>
20 #include <IGESDraw_DrawingWithRotation.hxx>
21 #include <IGESDraw_HArray1OfViewKindEntity.hxx>
22 #include <IGESSelect_RebuildDrawings.hxx>
23 #include <IGESSelect_ViewSorter.hxx>
24 #include <Interface_CopyTool.hxx>
25 #include <Interface_EntityIterator.hxx>
26 #include <Interface_Macros.hxx>
27 #include <Standard_Type.hxx>
28 #include <TColgp_HArray1OfXY.hxx>
29 #include <TCollection_AsciiString.hxx>
30 #include <TColStd_Array1OfInteger.hxx>
31 #include <TColStd_HArray1OfReal.hxx>
33 IMPLEMENT_STANDARD_RTTIEXT(IGESSelect_RebuildDrawings,IGESSelect_ModelModifier)
35 #define PourDrawing 404
38 IGESSelect_RebuildDrawings::IGESSelect_RebuildDrawings ()
39 : IGESSelect_ModelModifier (Standard_True) { }
42 void IGESSelect_RebuildDrawings::Performing
43 (IFSelect_ContextModif& ctx,
44 const Handle(IGESData_IGESModel)& target,
45 Interface_CopyTool& TC) const
47 // On reconstruit les drawings qui peuvent l etre
48 // Pour chaque drawing de l original, on regarde les composants transferes
49 // (evt filtres par <ctx>). Pour cela, on s aide d un ViewSorter
50 // Pour chaque drawing dont au moins un element a ete transfere :
51 // - On passe le Drawing lui-meme, avec ses views, mais pas ses annotations
52 // (c-a-d on le reconstruit)
53 // - On reconnecte les views aux entites (cf Directory Part)
55 DeclareAndCast(IGESData_IGESModel,original,ctx.OriginalModel());
56 Standard_Integer nbo = original->NbEntities();
57 TColStd_Array1OfInteger pris(0,nbo); pris.Init(0);
59 // Entites a prendre en compte pour la reconstruction
60 // NB : Les drawings deja transferes ne sont bien sur pas reconstruits !
61 Handle(IGESSelect_ViewSorter) sorter = new IGESSelect_ViewSorter;
62 sorter->SetModel(original);
63 sorter->Add(original);
64 for (ctx.Start(); ctx.More(); ctx.Next()) {
65 pris.SetValue (original->Number(ctx.ValueOriginal()),1);
67 sorter->SortDrawings(ctx.OriginalGraph());
68 Handle(IFSelect_PacketList) sets = sorter->Sets(Standard_True);
69 // Regarder, pour chaque paquet, si au moins un element a ete copie
70 Standard_Integer nbs = sets->NbPackets();
71 for (Standard_Integer is = 1; is <= nbs; is ++) {
72 Interface_EntityIterator setl = sets->Entities(is);
73 Interface_EntityIterator newset;
74 for (setl.Start(); setl.More(); setl.Next()) {
75 Handle(Standard_Transient) newent;
76 if (TC.Search(setl.Value(),newent)) newset.AddItem(newent);
78 if (newset.NbEntities() == 0) continue;
79 // On en tient un : le transferer (le reconstruire)
80 Handle(IGESData_IGESEntity) item = sorter->SetItem(is,Standard_True);
81 if (item->TypeNumber() != PourDrawing) continue;
82 if (item->IsKind(STANDARD_TYPE(IGESDraw_Drawing))) {
83 DeclareAndCast(IGESDraw_Drawing,draw,item);
84 Standard_Integer nbv = draw->NbViews();
85 Handle(IGESDraw_HArray1OfViewKindEntity) views;
86 if (nbv > 0) views = new IGESDraw_HArray1OfViewKindEntity (1,nbv);
87 // Passer ses vues : toutes
88 // Aussi les positions des vues
89 Handle(TColgp_HArray1OfXY) origs;
90 if (nbv > 0) origs = new TColgp_HArray1OfXY (1,nbv);
91 for (Standard_Integer iv = 1; iv <= nbv; iv ++) {
92 DeclareAndCast(IGESData_ViewKindEntity,aview,
93 TC.Transferred(draw->ViewItem(iv)));
94 views->SetValue(iv,aview);
95 target->AddEntity(aview);
96 origs->SetValue(iv,draw->ViewOrigin(iv).XY());
98 // Frame : passer ce qui a ete transfere
99 Handle(IGESData_HArray1OfIGESEntity) frame;
100 Standard_Integer nba = draw->NbAnnotations();
101 Interface_EntityIterator framelist;
102 Standard_Integer ia; // svv Jan11 2000 : porting on DEC
103 for (ia = 1; ia <= nba; ia ++) {
104 Handle(Standard_Transient) annot;
105 if (TC.Search(draw->Annotation(ia),annot)) framelist.GetOneItem(annot);
107 nba = framelist.NbEntities(); ia = 0;
108 if (nba > 0) frame = new IGESData_HArray1OfIGESEntity (1,nba);
109 for (framelist.Start(); framelist.More(); framelist.Next()) {
110 ia ++; frame->SetValue(ia,GetCasted(IGESData_IGESEntity,framelist.Value()));
112 // Cayest, fabriquer le nouveau Drawing et l ajouter
113 Handle(IGESDraw_Drawing) newdraw = new IGESDraw_Drawing;
114 newdraw->Init (views,origs,frame);
115 // Reste le nom, + autres ? drawing unit, ...
117 // Drawing With Rotation : quasiment identique
118 } else if (item->IsKind(STANDARD_TYPE(IGESDraw_DrawingWithRotation))) {
119 DeclareAndCast(IGESDraw_DrawingWithRotation,draw,item);
120 Standard_Integer nbv = draw->NbViews();
121 Handle(IGESDraw_HArray1OfViewKindEntity) views;
122 if (nbv > 0) views = new IGESDraw_HArray1OfViewKindEntity (1,nbv);
123 // Passer ses vues : toutes
124 // Aussi les positions des vues .. et les rotations
125 Handle(TColgp_HArray1OfXY) origs;
126 if (nbv > 0) origs = new TColgp_HArray1OfXY (1,nbv);
127 Handle(TColStd_HArray1OfReal) rots;
128 if (nbv > 0) { rots = new TColStd_HArray1OfReal (1,nbv); rots->Init(0.0); }
130 for (Standard_Integer iv = 1; iv <= nbv; iv ++) {
131 DeclareAndCast(IGESData_ViewKindEntity,aview,
132 TC.Transferred(draw->ViewItem(iv)));
133 views->SetValue(iv,aview);
134 target->AddEntity(aview);
135 rots->SetValue(iv,draw->OrientationAngle(iv));
136 origs->SetValue(iv,draw->ViewOrigin(iv).XY());
138 // Frame : passer ce qui a ete transfere
139 Handle(IGESData_HArray1OfIGESEntity) frame;
140 Standard_Integer nba = draw->NbAnnotations();
141 Interface_EntityIterator framelist;
142 Standard_Integer ia; // svv Jan11 2000 : porting on DEC
143 for (ia = 1; ia <= nba; ia ++) {
144 Handle(Standard_Transient) annot;
145 if (TC.Search(draw->Annotation(ia),annot)) framelist.GetOneItem(annot);
147 nba = framelist.NbEntities(); ia = 0;
148 if (nba > 0) frame = new IGESData_HArray1OfIGESEntity (1,nba);
149 for (framelist.Start(); framelist.More(); framelist.Next()) {
150 ia ++; frame->SetValue(ia,GetCasted(IGESData_IGESEntity,framelist.Value()));
152 // Cayest, fabriquer le nouveau DrawingWithRotation et l ajouter
153 Handle(IGESDraw_DrawingWithRotation) newdraw = new IGESDraw_DrawingWithRotation;
154 newdraw->Init (views,origs,rots,frame);
155 // Reste le nom, + autres ? drawing unit, ...
158 // Il faut encore mettre a jour les Views notees en Directory Part
159 // Pour cela, considerer <setl>, pour chaque terme, regarder View()
160 // si View() transfere, mettre a jour ...
161 for (setl.Start(); setl.More(); setl.Next()) {
162 DeclareAndCast(IGESData_IGESEntity,ent,setl.Value());
163 Handle(IGESData_ViewKindEntity) vieworig = ent->View();
164 if (vieworig.IsNull()) continue;
165 Handle(Standard_Transient) aView;
166 if (!TC.Search(vieworig,aView)) continue;
167 Handle(IGESData_ViewKindEntity) viewnew =
168 Handle(IGESData_ViewKindEntity)::DownCast (aView);
169 if (! viewnew.IsNull())
170 ent->InitView(viewnew);
176 TCollection_AsciiString IGESSelect_RebuildDrawings::Label () const
177 { return TCollection_AsciiString("Rebuild Drawings (with empty views)"); }