0031687: Draw Harness, ViewerTest - extend command vrenderparams with option updating...
[occt.git] / src / ShapePersistent / ShapePersistent_Geom.hxx
1 // Copyright (c) 2015 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
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.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14
15 #ifndef _ShapePersistent_Geom_HeaderFile
16 #define _ShapePersistent_Geom_HeaderFile
17
18 #include <Standard_NotImplemented.hxx>
19 #include <Standard_NullObject.hxx>
20
21 #include <StdObjMgt_WriteData.hxx>
22 #include <StdObjMgt_SharedObject.hxx>
23 #include <StdObjMgt_TransientPersistentMap.hxx>
24
25 #include <StdObject_gp_Vectors.hxx>
26 #include <StdObject_gp_Axes.hxx>
27 #include <StdObject_gp_Curves.hxx>
28 #include <StdObject_gp_Surfaces.hxx>
29 #include <StdObject_gp_Trsfs.hxx>
30
31 #include <Geom_CartesianPoint.hxx>
32 #include <Geom_Direction.hxx>
33 #include <Geom_VectorWithMagnitude.hxx>
34 #include <Geom_Axis1Placement.hxx>
35 #include <Geom_Axis2Placement.hxx>
36 #include <Geom_Transformation.hxx>
37 #include <Geom_Curve.hxx>
38 #include <Geom_Surface.hxx>
39
40 class ShapePersistent_Geom : public StdObjMgt_SharedObject
41 {
42 public:
43   class Geometry : public StdObjMgt_Persistent
44   {
45   public:
46     //! Read persistent data from a file.
47     Standard_EXPORT virtual void Read (StdObjMgt_ReadData& theReadData);
48     //! Write persistent data to a file.
49     Standard_EXPORT virtual void Write (StdObjMgt_WriteData& theWriteData) const;
50     //! Gets persistent objects
51     Standard_EXPORT virtual void PChildren(SequenceOfPersistent& theChildren) const;
52     //! Returns persistent type name
53     virtual Standard_CString PName() const { return "PGeom_Geometry"; }
54   };
55
56 protected:
57   template <class Transient>
58   struct geometryBase : public DelayedBase<Geometry, Transient> 
59   {
60     //! Write persistent data to a file.
61     virtual void Write (StdObjMgt_WriteData&) const
62     {
63       Standard_NotImplemented::Raise("ShapePersistent_Geom::geometryBase::Write - not implemented");
64     }
65     //! Gets persistent child objects
66     virtual void PChildren (StdObjMgt_Persistent::SequenceOfPersistent&) const { }
67     //! Returns persistent type name
68     virtual Standard_CString PName() const
69     { 
70       Standard_NotImplemented::Raise("ShapePersistent_Geom::geometryBase::PName - not implemented");
71       return ""; 
72     }
73   };
74
75   template <class Base, class PData>
76   class subBase : public Base
77   {
78   public:
79     //! Read persistent data from a file.
80     virtual void Read (StdObjMgt_ReadData& theReadData)
81       { PData().Read (theReadData); }
82     //! Write persistent data to a file.
83     virtual void Write (StdObjMgt_WriteData& theWriteData) const
84       { PData().Write(theWriteData); }
85     //! Gets persistent child objects
86     virtual void PChildren (StdObjMgt_Persistent::SequenceOfPersistent&) const
87     {
88       Standard_NotImplemented::Raise("ShapePersistent_Geom::subBase::PChildren - not implemented");
89     }
90     //! Returns persistent type name
91     virtual Standard_CString PName() const
92     { 
93       Standard_NotImplemented::Raise("ShapePersistent_Geom::subBase::PName - not implemented");
94       return ""; 
95     }
96   };
97
98   template <class Base, class GpData>
99   struct subBase_gp : public Base
100   {
101   public:
102     //! Read persistent data from a file.
103     virtual void Read (StdObjMgt_ReadData&) { }
104     //! Write persistent data to a file.
105     virtual void Write (StdObjMgt_WriteData&) const { }
106     //! Gets persistent child objects
107     virtual void PChildren (StdObjMgt_Persistent::SequenceOfPersistent&) const { }
108     //! Returns persistent type name
109     virtual Standard_CString PName() const
110     {
111       Standard_NotImplemented::Raise("ShapePersistent_Geom::subBase_gp::PName - not implemented");
112       return "";
113     }
114   };
115
116   template <class Base>
117   struct subBase_empty : Base  
118   { 
119     //! Returns persistent type name
120     virtual Standard_CString PName() const
121     {
122       Standard_NotImplemented::Raise("ShapePersistent_Geom::subBase_empty::PName - not implemented");
123       return "";
124     }
125   };
126
127   template <class Base, class Target, class Data = void>
128   class instance : public Base
129   {
130   public:
131     //! Read persistent data from a file.
132     virtual void Read (StdObjMgt_ReadData& theReadData)
133     {
134       Data aData;
135       theReadData >> aData;
136       this->myTransient = new Target(aData);
137     }
138     //! Gets persistent child objects
139     virtual void PChildren(StdObjMgt_Persistent::SequenceOfPersistent&) const { }
140     //! Write persistent data to a file.
141     virtual void Write(StdObjMgt_WriteData&) const
142     {
143       Standard_NotImplemented::Raise("ShapePersistent_Geom::instance::Write - not implemented");
144     }
145     //! Returns persistent type name
146     virtual Standard_CString PName() const
147     {
148       Standard_NotImplemented::Raise("ShapePersistent_Geom::instance::PName - not implemented");
149       return "";
150     }
151   };
152
153 private:
154   typedef geometryBase<Geom_Geometry> basic;
155
156 public:
157   typedef subBase_empty<basic>                                 Point;
158   typedef instance<Point, Geom_CartesianPoint, gp_Pnt>         CartesianPoint;
159
160   typedef subBase_gp<basic, gp_Vec>                            Vector;
161   typedef instance<Vector, Geom_Direction          , gp_Dir>   Direction;
162   typedef instance<Vector, Geom_VectorWithMagnitude, gp_Vec>   VectorWithMagnitude;
163
164   typedef subBase_gp<basic, gp_Ax1>                            AxisPlacement;
165   typedef instance<AxisPlacement, Geom_Axis1Placement, gp_Ax1> Axis1Placement;
166   typedef instance<AxisPlacement, Geom_Axis2Placement>         Axis2Placement;
167
168   typedef instance <SharedBase<Geom_Transformation>,
169                     Geom_Transformation,
170                     gp_Trsf>                                   Transformation;
171
172   typedef geometryBase<Geom_Curve>                             Curve;
173   typedef geometryBase<Geom_Surface>                           Surface;
174
175 public:
176   //! Create a persistent object for a curve
177   Standard_EXPORT static Handle(Curve) Translate (const Handle(Geom_Curve)& theCurve,
178                                                   StdObjMgt_TransientPersistentMap& theMap);
179   //! Create a persistent object for a curve
180   Standard_EXPORT static Handle(Surface) Translate (const Handle(Geom_Surface)& theSurf,
181                                                     StdObjMgt_TransientPersistentMap& theMap);
182 };
183
184 //=======================================================================
185 // Point 
186 //=======================================================================
187
188 template<>
189 inline Standard_CString ShapePersistent_Geom::subBase_empty<ShapePersistent_Geom::basic>
190   ::PName() const { return "PGeom_Point"; }
191
192 //=======================================================================
193 // CartesianPoint
194 //=======================================================================
195
196 template<>
197 inline Standard_CString ShapePersistent_Geom::instance<ShapePersistent_Geom::Point,
198                                                        Geom_CartesianPoint,
199                                                        gp_Pnt>
200   ::PName() const { return "PGeom_CartesianPoint"; }
201
202 template<>
203 inline void ShapePersistent_Geom::instance<ShapePersistent_Geom::Point,
204                                            Geom_CartesianPoint,
205                                            gp_Pnt>
206   ::Write(StdObjMgt_WriteData& theWriteData) const
207 {
208   Handle(Geom_CartesianPoint) aMyGeom =
209     Handle(Geom_CartesianPoint)::DownCast(myTransient);
210   theWriteData << aMyGeom->Pnt();
211 }
212
213 //=======================================================================
214 // Vector
215 //=======================================================================
216
217 template<>
218 inline Standard_CString ShapePersistent_Geom::subBase_gp<ShapePersistent_Geom::basic,
219                                                          gp_Vec>
220   ::PName() const { return "PGeom_Vector"; }
221
222 //=======================================================================
223 // Direction
224 //=======================================================================
225
226 template<>
227 inline Standard_CString ShapePersistent_Geom::instance<ShapePersistent_Geom::Direction,
228                                                        Geom_Direction,
229                                                        gp_Dir>
230   ::PName() const { return "PGeom_Direction"; }
231
232 template<>
233 inline void ShapePersistent_Geom::instance<ShapePersistent_Geom::Direction,
234                                            Geom_Direction,
235                                            gp_Dir>
236   ::Write(StdObjMgt_WriteData& theWriteData) const
237 {
238   Handle(Geom_Direction) aMyGeom =
239     Handle(Geom_Direction)::DownCast(myTransient);
240   theWriteData << aMyGeom->Dir();
241 }
242
243 //=======================================================================
244 // VectorWithMagnitude
245 //=======================================================================
246
247 template<>
248 inline Standard_CString ShapePersistent_Geom::instance<ShapePersistent_Geom::VectorWithMagnitude,
249                                                        Geom_VectorWithMagnitude,
250                                                        gp_Vec>
251   ::PName() const { return "PGeom_VectorWithMagnitude"; }
252
253 template<>
254 inline void ShapePersistent_Geom::instance<ShapePersistent_Geom::VectorWithMagnitude,
255                                            Geom_VectorWithMagnitude,
256                                            gp_Vec>
257   ::Write(StdObjMgt_WriteData& theWriteData) const
258 {
259   Handle(Geom_VectorWithMagnitude) aMyGeom =
260     Handle(Geom_VectorWithMagnitude)::DownCast(myTransient);
261   theWriteData << aMyGeom->Vec();
262 }
263
264 //=======================================================================
265 // AxisPlacement 
266 //=======================================================================
267
268 template<>
269 inline Standard_CString ShapePersistent_Geom::subBase_gp<ShapePersistent_Geom::basic,
270                                                          gp_Ax1>
271   ::PName() const { return "PGeom_AxisPlacement"; }
272
273 //=======================================================================
274 // Axis1Placement
275 //=======================================================================
276
277 template<>
278 inline Standard_CString ShapePersistent_Geom::instance<ShapePersistent_Geom::Axis1Placement,
279                                                        Geom_Axis1Placement,
280                                                        gp_Ax1>
281   ::PName() const { return "PGeom_Axis1Placement"; }
282
283 template<>
284 inline void ShapePersistent_Geom::instance<ShapePersistent_Geom::Axis1Placement,
285                                            Geom_Axis1Placement,
286                                            gp_Ax1>
287   ::Write(StdObjMgt_WriteData& theWriteData) const
288 {
289   Handle(Geom_Axis1Placement) aMyGeom =
290     Handle(Geom_Axis1Placement)::DownCast(myTransient);
291   write(theWriteData, aMyGeom->Ax1());
292 }
293
294 //=======================================================================
295 // Axis2Placement 
296 //=======================================================================
297
298 template<>
299 inline Standard_CString ShapePersistent_Geom::instance<ShapePersistent_Geom::AxisPlacement,
300                                                        Geom_Axis2Placement>
301   ::PName() const { return "PGeom_Axis2Placement"; }
302
303 template<>
304 inline void ShapePersistent_Geom::instance<ShapePersistent_Geom::AxisPlacement,
305                                            Geom_Axis2Placement>
306   ::Read (StdObjMgt_ReadData& theReadData)
307 {
308   gp_Ax1 anAxis;
309   gp_Dir anXDirection;
310
311   theReadData >> anAxis >> anXDirection;
312
313   myTransient = new Geom_Axis2Placement(anAxis.Location(),
314     anAxis.Direction(),
315     anXDirection);
316 }
317
318 template<>
319 inline void ShapePersistent_Geom::instance<ShapePersistent_Geom::AxisPlacement,
320                                            Geom_Axis2Placement>
321   ::Write (StdObjMgt_WriteData& theWriteData) const
322 {
323   Handle(Geom_Axis2Placement) aMyGeom =
324     Handle(Geom_Axis2Placement)::DownCast(myTransient);
325   const gp_Ax1& anAxis = aMyGeom->Axis();
326   const gp_Dir& anXDirection = aMyGeom->Direction();
327   write(theWriteData, anAxis) << anXDirection;
328 }
329
330 //=======================================================================
331 // Transformation
332 //=======================================================================
333
334 template<>
335 inline Standard_CString ShapePersistent_Geom::instance<ShapePersistent_Geom::Transformation,
336                                                        Geom_Transformation,
337                                                        gp_Trsf>
338   ::PName() const { return "PGeom_Transformation"; }
339
340 template<>
341 inline void ShapePersistent_Geom::instance<ShapePersistent_Geom::Transformation,
342                                            Geom_Transformation,
343                                            gp_Trsf>
344   ::Write (StdObjMgt_WriteData& theWriteData) const
345 {
346   theWriteData << myTransient->Trsf();
347 }
348
349 //=======================================================================
350 // Geometry
351 //=======================================================================
352
353 template<>
354 inline Standard_CString ShapePersistent_Geom::geometryBase<Geom_Geometry>
355   ::PName() const { return "PGeom_Geometry"; }
356
357 //=======================================================================
358 // Curve
359 //=======================================================================
360
361 template<>
362 inline Standard_CString ShapePersistent_Geom::geometryBase<Geom_Curve>
363   ::PName() const { return "PGeom_Curve"; }
364
365 //=======================================================================
366 // Surface
367 //=======================================================================
368
369 template<>
370 inline Standard_CString ShapePersistent_Geom::geometryBase<Geom_Surface>
371   ::PName() const { return "PGeom_Surface"; }
372
373 #endif