1 // Created on: 2001-09-04
2 // Created by: Julia DOROVSKIKH
3 // Copyright (c) 2001-2014 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 <XmlMDataXtd_PresentationDriver.hxx>
17 
18 #include <Message_Messenger.hxx>
19 #include <Standard_Type.hxx>
20 #include <TDF_Attribute.hxx>
21 #include <XmlObjMgt.hxx>
22 #include <XmlObjMgt_Persistent.hxx>
23 #include <TDataXtd_Presentation.hxx>
24 #include <Quantity_Color.hxx>
25 
IMPLEMENT_STANDARD_RTTIEXT(XmlMDataXtd_PresentationDriver,XmlMDF_ADriver)26 IMPLEMENT_STANDARD_RTTIEXT(XmlMDataXtd_PresentationDriver,XmlMDF_ADriver)
27 
28 IMPLEMENT_DOMSTRING (GuidString,        "guid")
29 IMPLEMENT_DOMSTRING (IsDisplayedString, "isdisplayed")
30 IMPLEMENT_DOMSTRING (ColorString,       "color")
31 IMPLEMENT_DOMSTRING (MaterialString,    "material")
32 IMPLEMENT_DOMSTRING (TransparencyString,"transparency")
33 IMPLEMENT_DOMSTRING (WidthString,       "width")
34 IMPLEMENT_DOMSTRING (ModeString,        "mode")
35 
36 IMPLEMENT_DOMSTRING (DisplayedString,   "true")
37 
38 //=======================================================================
39 //function : XmlMDataXtd_PresentationDriver
40 //purpose  : Constructor
41 //=======================================================================
42 XmlMDataXtd_PresentationDriver::XmlMDataXtd_PresentationDriver
43   (const Handle(Message_Messenger)& theMsgDriver)
44   : XmlMDF_ADriver (theMsgDriver, NULL)
45 {}
46 
47 //=======================================================================
48 //function : NewEmpty
49 //purpose  :
50 //=======================================================================
Handle(TDF_Attribute)51 Handle(TDF_Attribute) XmlMDataXtd_PresentationDriver::NewEmpty() const
52 {
53   return (new TDataXtd_Presentation());
54 }
55 
56 //=======================================================================
57 //function : Paste
58 //purpose  : persistent -> transient (retrieve)
59 //=======================================================================
Paste(const XmlObjMgt_Persistent & theSource,const Handle (TDF_Attribute)& theTarget,XmlObjMgt_RRelocationTable &) const60 Standard_Boolean XmlMDataXtd_PresentationDriver::Paste
61   (const XmlObjMgt_Persistent&  theSource,
62   const Handle(TDF_Attribute)& theTarget,
63   XmlObjMgt_RRelocationTable&  ) const
64 {
65   TCollection_ExtendedString aMessageString;
66   XmlObjMgt_DOMString aDOMStr;
67 
68   Handle(TDataXtd_Presentation) aTPrs =
69     Handle(TDataXtd_Presentation)::DownCast(theTarget);
70   const XmlObjMgt_Element& anElem = theSource;
71 
72   //convert attribute value into GUID
73   aDOMStr = anElem.getAttribute(::GuidString());
74   if (aDOMStr == NULL)
75   {
76     myMessageDriver->Send("Cannot retrieve guid string from attribute", Message_Fail);
77     return Standard_False;
78   }
79   Standard_CString aGuidStr = (Standard_CString) aDOMStr.GetString();
80   aTPrs->SetDriverGUID(aGuidStr);
81 
82   // is displayed
83   aDOMStr = anElem.getAttribute(::IsDisplayedString());
84   aTPrs->SetDisplayed(aDOMStr != NULL);
85 
86   Standard_Integer anIValue;
87 
88   // color
89   aDOMStr = anElem.getAttribute(::ColorString());
90   if (aDOMStr != NULL)
91   {
92     if (!aDOMStr.GetInteger(anIValue))
93     {
94       aMessageString = TCollection_ExtendedString
95         ("Cannot retrieve Integer value from \"") + aDOMStr + "\"";
96       myMessageDriver->Send (aMessageString, Message_Fail);
97       return Standard_False;
98     }
99 
100     const Quantity_NameOfColor aNameOfColor = TDataXtd_Presentation::getColorNameFromOldEnum (anIValue);
101     aTPrs->SetColor(aNameOfColor);
102   }
103   else
104   {
105     aTPrs->UnsetColor();
106   }
107 
108   // material
109   aDOMStr = anElem.getAttribute(::MaterialString());
110   if (aDOMStr != NULL)
111   {
112     if (!aDOMStr.GetInteger(anIValue))
113     {
114       aMessageString = TCollection_ExtendedString
115         ("Cannot retrieve Integer value from \"") + aDOMStr + "\"";
116       myMessageDriver->Send (aMessageString, Message_Fail);
117       return Standard_False;
118     }
119     aTPrs->SetMaterialIndex(anIValue);
120   }
121   else
122   {
123     aTPrs->UnsetMaterial();
124   }
125 
126   Standard_Real aValue;
127 
128   // transparency
129   aDOMStr = anElem.getAttribute(::TransparencyString());
130   if (aDOMStr != NULL)
131   {
132     if (!XmlObjMgt::GetReal(aDOMStr, aValue))
133     {
134       aMessageString = TCollection_ExtendedString
135         ("Cannot retrieve Real value from \"") + aDOMStr + "\"";
136       myMessageDriver->Send (aMessageString, Message_Fail);
137       return Standard_False;
138     }
139     aTPrs->SetTransparency(aValue);
140   }
141   else
142   {
143     aTPrs->UnsetTransparency();
144   }
145 
146   // width
147   aDOMStr = anElem.getAttribute(::WidthString());
148   if (aDOMStr != NULL)
149   {
150     if (!XmlObjMgt::GetReal(aDOMStr, aValue))
151     {
152       aMessageString = TCollection_ExtendedString
153         ("Cannot retrieve Real value from \"") + aDOMStr + "\"";
154       myMessageDriver->Send (aMessageString, Message_Fail);
155       return Standard_False;
156     }
157     aTPrs->SetWidth(aValue);
158   }
159   else
160   {
161     aTPrs->UnsetWidth();
162   }
163 
164   // mode
165   aDOMStr = anElem.getAttribute(::ModeString());
166   if (aDOMStr != NULL)
167   {
168     if (!aDOMStr.GetInteger(anIValue))
169     {
170       aMessageString = TCollection_ExtendedString
171         ("Cannot retrieve Integer value from \"") + aDOMStr + "\"";
172       myMessageDriver->Send (aMessageString, Message_Fail);
173       return Standard_False;
174     }
175     aTPrs->SetMode(anIValue);
176   }
177   else
178   {
179     aTPrs->UnsetMode();
180   }
181 
182   return Standard_True;
183 }
184 
185 //=======================================================================
186 //function : Paste
187 //purpose  : transient -> persistent (store)
188 //=======================================================================
Paste(const Handle (TDF_Attribute)& theSource,XmlObjMgt_Persistent & theTarget,XmlObjMgt_SRelocationTable &) const189 void XmlMDataXtd_PresentationDriver::Paste
190                                   (const Handle(TDF_Attribute)& theSource,
191                                    XmlObjMgt_Persistent&        theTarget,
192                                    XmlObjMgt_SRelocationTable&) const
193 {
194   Handle(TDataXtd_Presentation) aTPrs =
195     Handle(TDataXtd_Presentation)::DownCast(theSource);
196   if (aTPrs.IsNull()) return;
197 
198   //convert GUID into attribute value
199   Standard_Character aGuidStr [40];
200   Standard_PCharacter pGuidStr;
201   pGuidStr=aGuidStr;
202   aTPrs->GetDriverGUID().ToCString (pGuidStr);
203   theTarget.Element().setAttribute(::GuidString(), aGuidStr);
204 
205   // is displayed
206   if (aTPrs->IsDisplayed())
207     theTarget.Element().setAttribute(::IsDisplayedString(), ::DisplayedString());
208 
209   Standard_Integer aNb;
210 
211   // color
212   if (aTPrs->HasOwnColor())
213   {
214     aNb = TDataXtd_Presentation::getOldColorNameFromNewEnum (aTPrs->Color());
215     theTarget.Element().setAttribute(::ColorString(), aNb);
216   }
217 
218   // material
219   if (aTPrs->HasOwnMaterial())
220   {
221     aNb = aTPrs->MaterialIndex();
222     theTarget.Element().setAttribute(::MaterialString(), aNb);
223   }
224 
225   // transparency
226   if (aTPrs->HasOwnTransparency())
227   {
228     TCollection_AsciiString aRNbStr (aTPrs->Transparency());
229     theTarget.Element().setAttribute(::TransparencyString(), aRNbStr.ToCString());
230   }
231 
232   // width
233   if (aTPrs->HasOwnWidth())
234   {
235     TCollection_AsciiString aRNbStr (aTPrs->Width());
236     theTarget.Element().setAttribute(::WidthString(), aRNbStr.ToCString());
237   }
238 
239   // mode
240   if (aTPrs->HasOwnMode())
241   {
242     aNb = aTPrs->Mode();
243     theTarget.Element().setAttribute(::ModeString(), aNb);
244   }
245 }
246