0024927: Getting rid of "Persistent" functionality -- Code
[occt.git] / src / MNaming / MNaming_NamingStorageDriver.cxx
1 // Created on: 1997-09-17
2 // Created by: Isabelle GRIGNON
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <MNaming_NamingStorageDriver.ixx>
18 #include <PNaming_Naming_2.hxx>
19 #include <PCollection_HAsciiString.hxx>
20 #include <Standard_NoSuchObject.hxx>
21 #include <TDF_Tool.hxx>
22 #include <TNaming_Naming.hxx>
23 #include <TCollection_AsciiString.hxx>
24 #include <TNaming_Name.hxx>
25 #include <PNaming_Name_2.hxx>
26 #include <PNaming_NamedShape.hxx>
27 #include <TNaming_NamedShape.hxx>
28 #include <TNaming_ListOfNamedShape.hxx>
29 #include <TNaming_ListIteratorOfListOfNamedShape.hxx>
30 #include <CDM_MessageDriver.hxx>
31 #include <PNaming_HArray1OfNamedShape.hxx>
32 #include <TopAbs_Orientation.hxx>
33
34 //=======================================================================
35 //function : ShapeEnumToInteger
36 //purpose  : 
37 //=======================================================================
38
39 static Standard_Integer ShapeEnumToInteger (const TopAbs_ShapeEnum   I)
40 {
41   switch(I)
42     {
43     case  TopAbs_COMPOUND  : return 0;
44     case  TopAbs_COMPSOLID : return 1;
45     case  TopAbs_SOLID     : return 2;
46     case  TopAbs_SHELL     : return 3;
47     case  TopAbs_FACE      : return 4;
48     case  TopAbs_WIRE      : return 5;
49     case  TopAbs_EDGE      : return 6;
50     case  TopAbs_VERTEX    : return 7;
51     case  TopAbs_SHAPE     : return 8;  
52     }
53   return 8;
54 }
55
56 //=======================================================================
57 //function : NameTypeToInteger
58 //purpose  : 
59 //=======================================================================
60
61 static  Standard_Integer NameTypeToInteger (const TNaming_NameType I) 
62 {
63   switch(I)
64     { 
65     case  TNaming_UNKNOWN             : return 0;  
66     case  TNaming_IDENTITY            : return 1;
67     case  TNaming_MODIFUNTIL          : return 2;
68     case  TNaming_GENERATION          : return 3;
69     case  TNaming_INTERSECTION        : return 4;
70     case  TNaming_UNION               : return 5;
71     case  TNaming_SUBSTRACTION        : return 6;
72     case  TNaming_CONSTSHAPE          : return 7;
73     case  TNaming_FILTERBYNEIGHBOURGS : return 8;
74     case  TNaming_ORIENTATION         : return 9;
75     case  TNaming_WIREIN              : return 10;
76     case  TNaming_SHELLIN             : return 11;
77       default :
78         Standard_DomainError::Raise("TNaming_NameType; enum term unknown ");
79     }
80   return 0;
81 }
82
83 //=======================================================================
84 //function : OrientationToInteger
85 //purpose  : 
86 //=======================================================================
87
88 static  Standard_Integer OrientationToInteger (const TopAbs_Orientation Or) 
89 {
90   switch(Or)
91     { 
92     case  TopAbs_FORWARD             : return 0;  
93     case  TopAbs_REVERSED            : return 1;
94     case  TopAbs_INTERNAL            : return 2;
95     case  TopAbs_EXTERNAL            : return 3;
96       default :
97         Standard_DomainError::Raise("TNaming_Name::myOrientation; enum term unknown ");
98     }
99   return 0;
100 }
101 //=======================================================================
102 //function : MNaming_NamingStorageDriver
103 //purpose  : 
104 //=======================================================================
105
106 MNaming_NamingStorageDriver::MNaming_NamingStorageDriver(const Handle(CDM_MessageDriver)& theMsgDriver):MDF_ASDriver(theMsgDriver)
107 {
108 }
109
110 //=======================================================================
111 //function : VersionNumber
112 //purpose  : 
113 //=======================================================================
114
115 Standard_Integer MNaming_NamingStorageDriver::VersionNumber() const
116 { return 0; }
117
118 //=======================================================================
119 //function : SourceType
120 //purpose  : 
121 //=======================================================================
122
123 Handle(Standard_Type) MNaming_NamingStorageDriver::SourceType() const
124 { return STANDARD_TYPE(TNaming_Naming);  }
125
126
127 //=======================================================================
128 //function : NewEmpty
129 //purpose  : 
130 //=======================================================================
131
132 Handle(PDF_Attribute) MNaming_NamingStorageDriver::NewEmpty() const
133 { return new PNaming_Naming_2 (); }
134
135
136 //=======================================================================
137 //function : TNamingToPNaming
138 //purpose  : 
139 //=======================================================================
140
141 static void  TNamingToPNaming  (const TNaming_Name&   TN,
142                                 Handle(PNaming_Name_2)& PN,
143                                 const Handle(MDF_SRelocationTable)& RelocTable)
144 {
145   PN = new PNaming_Name_2();
146   PN->Type     (NameTypeToInteger (TN.Type     ()));
147   PN->ShapeType(ShapeEnumToInteger(TN.ShapeType()));
148   
149   Handle (PNaming_NamedShape) PNS;
150   Standard_Integer NbArgs = TN.Arguments().Extent();
151   
152   if (NbArgs > 0) {
153     Handle(PNaming_HArray1OfNamedShape) TabArgs = new PNaming_HArray1OfNamedShape(1,NbArgs);
154     PN->Arguments(TabArgs);
155     
156     Standard_Integer i = 1;
157     for (TNaming_ListIteratorOfListOfNamedShape it (TN.Arguments()); it.More(); it.Next()) {
158       RelocTable->HasRelocation(it.Value(),PNS);
159       TabArgs->SetValue(i++,PNS);
160     }
161   }
162
163   Handle (PNaming_NamedShape) StopPNS;
164   if (!TN.StopNamedShape().IsNull())
165     RelocTable->HasRelocation(TN.StopNamedShape(),StopPNS);
166   PN->StopNamedShape(StopPNS);
167
168   PN->Index(TN.Index());
169   Handle(PCollection_HAsciiString) pEntry; // Null handle.
170   if(!TN.ContextLabel().IsNull()) {
171      TCollection_AsciiString entry;
172      TDF_Tool::Entry(TN.ContextLabel(),entry);
173      pEntry = new PCollection_HAsciiString(entry);
174
175   }
176   PN->ContextLabel(pEntry);
177   PN->Orientation(OrientationToInteger(TN.Orientation()));
178 }
179
180 //=======================================================================
181 //function : Paste
182 //purpose  : 
183 //=======================================================================
184
185 void MNaming_NamingStorageDriver::Paste (
186   const Handle(TDF_Attribute)&        Source,
187   const Handle(PDF_Attribute)&        Target,
188   const Handle(MDF_SRelocationTable)& RelocTable) const
189 {
190   Handle(PNaming_Naming_2) PF = Handle(PNaming_Naming_2)::DownCast(Target);
191   Handle(TNaming_Naming) F  = Handle(TNaming_Naming)::DownCast(Source);  
192   Handle(PNaming_Name_2) PN ;
193   TNamingToPNaming (F->GetName(), PN ,RelocTable);
194   PF->SetName(PN);
195 }
196