0023265: cppcheck warning: Mismatching allocation and deallocation
[occt.git] / src / QADNaming / QADNaming_IteratorsCommands.cxx
1 // Created on: 2002-04-25
2 // Created by: Michael PONIKAROV
3 // Copyright (c) 2002-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20
21 #include <stdio.h>
22
23 #include <QADNaming.hxx>
24 #include <TDF_Label.hxx>
25 #include <Draw_Interpretor.hxx>
26 #include <TNaming_Iterator.hxx>
27 #include <TNaming_NewShapeIterator.hxx>
28 #include <TNaming_OldShapeIterator.hxx>
29 #include <TNaming_SameShapeIterator.hxx>
30 #include <TNaming_Tool.hxx>
31 #include <TopoDS_Shape.hxx>
32 #include <DBRep.hxx>
33 #include <TNaming.hxx>
34 #include <TNaming_NamedShape.hxx>
35
36 #include <DDF.hxx>
37
38 #include <TDF_Data.hxx>
39 #include <TDF_Tool.hxx>
40
41 static const char* EvolutionString(TNaming_Evolution theEvolution) {
42   switch(theEvolution){
43   case TNaming_PRIMITIVE :
44     return "PRIMITIVE";
45   case TNaming_GENERATED :
46     return "GENERATED";
47   case TNaming_MODIFY :
48     return "MODIFY";
49   case TNaming_DELETE :
50     return "DELETE";
51   case TNaming_SELECTED :
52     return "SELECTED";
53   case TNaming_REPLACE :
54     return "REPLACE";
55   }
56   return "UNKNOWN_Evolution";
57 }
58
59
60 static Standard_Integer GetNewShapes (Draw_Interpretor& di,
61                                       Standard_Integer nb, 
62                                       const char** arg) {
63   if (nb==3 || nb==4) {
64     TDF_Label aLabel;
65     if (!QADNaming::Entry(arg, aLabel)) return 1;
66     Handle(TNaming_NamedShape) aNS;
67     if (!aLabel.FindAttribute(TNaming_NamedShape::GetID(),aNS)) {
68       di<<"Label has no NamedShape"<<"\n";
69       return 1;
70     }
71     di<<EvolutionString(aNS->Evolution());
72     TNaming_Iterator anIter(aNS);
73     Standard_Integer a;
74     char aName[200];
75     for(a=1;anIter.More();anIter.Next(),a++) {
76       if (anIter.NewShape().IsNull()) a--;
77       else if (nb==4) {
78         sprintf(aName,"%s_%d",arg[3],a);
79         DBRep::Set (aName,anIter.NewShape());
80       }
81     }
82     di<<" "<<a-1;
83   } else {
84     di<<"Usage: GetNewShapes df entry [res]"<<"\n";
85     return 1;
86   }
87   return 0;
88 }
89
90 static Standard_Integer GetOldShapes (Draw_Interpretor& di,
91                                       Standard_Integer nb, 
92                                       const char** arg) {
93   if (nb==3 || nb==4) {
94     TDF_Label aLabel;
95     if (!QADNaming::Entry(arg, aLabel)) return 1;
96     Handle(TNaming_NamedShape) aNS;
97     if (!aLabel.FindAttribute(TNaming_NamedShape::GetID(),aNS)) {
98       di<<"Label has no NamedShape"<<"\n";
99       return 1;
100     }
101     di<<EvolutionString(aNS->Evolution());
102     TNaming_Iterator anIter(aNS);
103     Standard_Integer a;
104     char aName[200];
105     for(a=1;anIter.More();anIter.Next(),a++) {
106       if (anIter.OldShape().IsNull()) a--;
107       else if (nb==4) {
108         sprintf(aName,"%s_%d",arg[3],a);
109         DBRep::Set (aName,anIter.OldShape());
110       }
111     }
112     di<<" "<<a-1;
113   } else {
114     di<<"Usage: GetOldShapes df entry [res]"<<"\n";
115     return 1;
116   }
117   return 0;
118 }
119
120 static int GetAllNew(const TopoDS_Shape& theShape, const TDF_Label& theAccess, const char* theName, Standard_Integer theIndex) {
121   TNaming_NewShapeIterator anIter(theShape,theAccess);
122   char aName[200];
123   for(;anIter.More();anIter.Next()) {
124     if (!anIter.Shape().IsNull()) {
125       theIndex++;
126       if (theName != NULL) {
127         sprintf(aName,"%s_%d",theName,theIndex);
128         DBRep::Set(aName,anIter.Shape());
129       }
130       theIndex = GetAllNew(anIter.Shape(),theAccess,theName,theIndex);
131     }
132   }
133   return theIndex;
134 }
135
136 static Standard_Integer GetAllNewShapes (Draw_Interpretor& di,
137                                          Standard_Integer nb, 
138                                          const char** arg) {
139   Standard_Integer aResult = 0;
140   if (nb==3 || nb==4) {
141     const char* aName = (nb==4) ? arg[3] : NULL;
142
143     if (arg[2][0]=='0') { // label
144       TDF_Label aLabel;
145       if (!QADNaming::Entry(arg, aLabel)) return 1;
146       Handle(TNaming_NamedShape) aNS;
147       if (!aLabel.FindAttribute(TNaming_NamedShape::GetID(),aNS)) {
148         di<<"Label has no NamedShape"<<"\n";
149         return 1;
150       }
151       Standard_Integer a;
152       TNaming_Iterator anIter(aNS);
153       for(a=1;anIter.More();anIter.Next(),a++) {
154         if (!anIter.NewShape().IsNull()) {
155           char* aSubName;
156           if (aName!=NULL) {
157             aSubName = new char[200];
158             sprintf(aSubName,"%s_%d",aName,a);
159           } else aSubName = NULL;
160           aResult+=GetAllNew(anIter.NewShape(),aLabel,aSubName,0);
161           if (aSubName != NULL) delete [] aSubName;
162         }
163       }
164     } else { // shape
165       Handle(TDF_Data) DF;
166       if (!DDF::GetDF(arg[1],DF)) {
167         di<<"Wrong df"<<"\n";
168         return 1;
169       }
170       TopoDS_Shape aShape = DBRep::Get(arg[2]);
171       aResult=GetAllNew(aShape,DF->Root(),aName,0);
172     }
173   } else {
174     di<<"Usage: GetAllNewShapes df entry/shape [res]"<<"\n";
175     return 1;
176   }
177   di<<aResult;
178   return 0;
179 }
180
181 static int GetAllOld(const TopoDS_Shape& theShape, const TDF_Label& theAccess, const char* theName, Standard_Integer theIndex) {
182   char aName[200];
183   Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(theShape,theAccess);
184   if (aNS.IsNull()) return theIndex;
185   TNaming_Iterator anIter(aNS);
186   for(;anIter.More();anIter.Next()) {
187     if (!anIter.OldShape().IsNull() && !anIter.NewShape().IsNull()) if (anIter.NewShape().IsSame(theShape)) {
188       theIndex++;
189       if (theName!=NULL) {
190         sprintf(aName,"%s_%d",theName,theIndex);
191         DBRep::Set(aName,anIter.OldShape());
192       }
193       theIndex = GetAllOld(anIter.OldShape(),theAccess,theName,theIndex);
194     }
195   }
196   return theIndex;
197 }
198
199 static Standard_Integer GetAllOldShapes (Draw_Interpretor& di,
200                                          Standard_Integer nb, 
201                                          const char** arg) {
202   Standard_Integer aResult = 0;
203   if (nb==3 || nb==4) {
204     const char* aName = (nb==4) ? arg[3] : NULL;
205
206     if (arg[2][0]=='0') { // label
207       TDF_Label aLabel;
208       if (!QADNaming::Entry(arg, aLabel)) return 1;
209       Handle(TNaming_NamedShape) aNS;
210       if (!aLabel.FindAttribute(TNaming_NamedShape::GetID(),aNS)) {
211         di<<"Label has no NamedShape"<<"\n";
212         return 1;
213       }
214       Standard_Integer a;
215       TNaming_Iterator anIter(aNS);
216       for(a=1;anIter.More();anIter.Next(),a++) {
217         if (!anIter.NewShape().IsNull()) {
218           char* aSubName;
219           if (aName!=NULL) {
220             aSubName = new char[200];
221             sprintf(aSubName,"%s_%d",aName,a);
222           } else aSubName = NULL;
223           aResult+=GetAllOld(anIter.NewShape(),aLabel,aSubName,0);
224         }
225       }
226     } else { // shape
227       Handle(TDF_Data) DF;
228       if (!DDF::GetDF(arg[1],DF)) {
229         di<<"Wrong df"<<"\n";
230         return 1;
231       }
232       TopoDS_Shape aShape = DBRep::Get(arg[2]);
233       aResult=GetAllOld(aShape,DF->Root(),aName,0);
234     }
235   } else {
236     di<<"Usage: GetAllNewShapes df entry/shape [res]"<<"\n";
237     return 1;
238   }
239   di<<aResult;
240   return 0;
241 }
242
243 static Standard_Integer GetSameShapes (Draw_Interpretor& di,
244                                        Standard_Integer nb, 
245                                        const char** arg) {
246   TCollection_AsciiString aRes;
247   if (nb == 3) {
248     Standard_Integer aResult = 0;
249     Handle(TDF_Data) DF;
250     if (!DDF::GetDF(arg[1],DF)) {
251       di<<"Wrong df"<<"\n";
252       return 1;
253     }
254     TopoDS_Shape aShape = DBRep::Get(arg[2]);
255     TNaming_SameShapeIterator anIter(aShape,DF->Root());
256     for(;anIter.More();anIter.Next()) {
257       if (!anIter.Label().IsNull()) {
258         TCollection_AsciiString Name;
259         TDF_Tool::Entry(anIter.Label(),Name);
260         if (aResult != 0) aRes=aRes+Name+" "; else aRes=Name;
261         aResult++;
262       }
263     }
264   } else {
265     di<<"Usage: GetSameShapes df shape"<<"\n";
266     return 1;
267   }
268   di<<aRes.ToCString();
269   return 0;
270 }
271
272 void QADNaming::IteratorsCommands(Draw_Interpretor& theCommands)
273 {
274   static Standard_Boolean done = Standard_False;
275   if (done) return;
276   done = Standard_True;
277
278   const char* g = "Naming builder commands";
279
280   theCommands.Add("GetNewShapes","GetNewShapes df entry [res]",__FILE__,GetNewShapes,g);
281
282   theCommands.Add("GetOldShapes","GetOldShapes df entry [res]",__FILE__,GetOldShapes,g);
283
284   theCommands.Add("GetAllNewShapes","GetAllNewShapes df entry/shape [res]",__FILE__,GetAllNewShapes,g);
285
286   theCommands.Add("GetAllOldShapes","GetAllOldShapes df entry/shape [res]",__FILE__,GetAllOldShapes,g);
287
288   theCommands.Add("GetSameShapes","GetSameShapes df shape",__FILE__,GetSameShapes,g);
289
290 }