Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-16 08:21:08

0001 // Created on: 2018-03-16
0002 // Created by: Eugeny MALTCHIKOV
0003 // Copyright (c) 2018 OPEN CASCADE SAS
0004 //
0005 // This file is part of Open CASCADE Technology software library.
0006 //
0007 // This library is free software; you can redistribute it and/or modify it under
0008 // the terms of the GNU Lesser General Public License version 2.1 as published
0009 // by the Free Software Foundation, with special exception defined in the file
0010 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
0011 // distribution for complete text of the license and disclaimer of any warranty.
0012 //
0013 // Alternatively, this file may be used under the terms of Open CASCADE
0014 // commercial license or contractual agreement.
0015 
0016 #ifndef _BOPAlgo_MakePeriodic_HeaderFile
0017 #define _BOPAlgo_MakePeriodic_HeaderFile
0018 
0019 #include <Standard.hxx>
0020 #include <Standard_DefineAlloc.hxx>
0021 #include <Standard_Handle.hxx>
0022 
0023 #include <BOPAlgo_Options.hxx>
0024 #include <BRepTools_History.hxx>
0025 #include <Standard_Boolean.hxx>
0026 #include <TopoDS_Shape.hxx>
0027 #include <TopTools_DataMapOfShapeShape.hxx>
0028 
0029 //! BOPAlgo_MakePeriodic is the tool for making an arbitrary shape periodic
0030 //! in 3D space in specified directions.
0031 //!
0032 //! Periodicity of the shape means that the shape can be repeated in any
0033 //! periodic direction any number of times without creation of the new
0034 //! geometry or splits.
0035 //!
0036 //! The idea is to make the shape look identical on the opposite sides of the
0037 //! periodic directions, so when translating the copy of a shape on the period
0038 //! there will be no coinciding parts of different dimensions.
0039 //!
0040 //! If necessary the algorithm will trim the shape to fit it into the
0041 //! requested period by splitting it by the planes limiting the shape's
0042 //! requested period.
0043 //!
0044 //! For making the shape periodic in certain direction the algorithm performs
0045 //! the following steps:
0046 //! * Creates the copy of the shape and moves it on the period into negative
0047 //!   side of the requested direction;
0048 //! * Splits the negative side of the shape by the moved copy, ensuring copying
0049 //!   of the geometry from positive side to negative;
0050 //! * Creates the copy of the shape (with already split negative side) and moves
0051 //!   it on the period into the positive side of the requested direction;
0052 //! * Splits the positive side of the shape by the moved copy, ensuring copying
0053 //!   of the geometry from negative side to positive.
0054 //!
0055 //! The algorithm also associates the identical (or twin) shapes located
0056 //! on the opposite sides of the result shape.
0057 //! Using the *GetTwins()* method it is possible to get the twin shapes from
0058 //! the opposite sides.
0059 //!
0060 //! Algorithm also provides the methods to repeat the periodic shape in
0061 //! periodic directions. The subsequent repetitions are performed on the
0062 //! repeated shape, thus repeating the shape two times in X direction will
0063 //! create result in three shapes (original plus two copies).
0064 //! Single subsequent repetition will result already in 6 shapes.
0065 //! The repetitions can be cleared and started over.
0066 //!
0067 //! The algorithm supports History of shapes modifications, thus
0068 //! it is possible to track how the shape has been changed to make it periodic
0069 //! and what new shapes have been created during repetitions.
0070 //!
0071 //! The algorithm supports the parallel processing mode, which allows faster
0072 //! completion of the operations.
0073 //!
0074 //! The algorithm supports the Error/Warning system and returns the following alerts:
0075 //! - *BOPAlgo_AlertNoPeriodicityRequired* - Error alert is given if no periodicity
0076 //!                                          has been requested in any direction;
0077 //! - *BOPAlgo_AlertUnableToTrim* - Error alert is given if the trimming of the shape
0078 //!                                 for fitting it into requested period has failed;
0079 //! - *BOPAlgo_AlertUnableToMakeIdentical* - Error alert is given if splitting of the
0080 //!                                          shape by its moved copies has failed;
0081 //! - *BOPAlgo_AlertUnableToRepeat* - Warning alert is given if the gluing of the repeated
0082 //!                                   shapes has failed.
0083 //!
0084 //! Example of usage of the algorithm:
0085 //! ~~~~
0086 //! TopoDS_Shape aShape = ...;                 // The shape to make periodic
0087 //! Standard_Boolean bMakeXPeriodic = ...;     // Flag for making or not the shape periodic in X
0088 //! direction Standard_Real aXPeriod = ...;              // X period for the shape Standard_Boolean
0089 //! isXTrimmed = ...;         // Flag defining whether it is necessary to trimming
0090 //!                                            // the shape to fit to X period
0091 //! Standard_Real aXFirst = ...;               // Start of the X period
0092 //!                                            // (really necessary only if the trimming is
0093 //!                                            requested)
0094 //! Standard_Boolean bRunParallel = ...;       // Parallel processing mode or single
0095 //!
0096 //! BOPAlgo_MakePeriodic aPeriodicityMaker;                   // Periodicity maker
0097 //! aPeriodicityMaker.SetShape(aShape);                       // Set the shape
0098 //! aPeriodicityMaker.MakeXPeriodic(bMakePeriodic, aXPeriod); // Making the shape periodic in X
0099 //! direction aPeriodicityMaker.SetTrimmed(isXTrimmed, aXFirst);        // Trim the shape to fit X
0100 //! period aPeriodicityMaker.SetRunParallel(bRunParallel);           // Set the parallel processing
0101 //! mode aPeriodicityMaker.Perform();                              // Performing the operation
0102 //!
0103 //! if (aPeriodicityMaker.HasErrors())                        // Check for the errors
0104 //! {
0105 //!   // errors treatment
0106 //!   Standard_SStream aSStream;
0107 //!   aPeriodicityMaker.DumpErrors(aSStream);
0108 //!   return;
0109 //! }
0110 //! if (aPeriodicityMaker.HasWarnings())                      // Check for the warnings
0111 //! {
0112 //!   // warnings treatment
0113 //!   Standard_SStream aSStream;
0114 //!   aPeriodicityMaker.DumpWarnings(aSStream);
0115 //! }
0116 //! const TopoDS_Shape& aPeriodicShape = aPeriodicityMaker.Shape(); // Result periodic shape
0117 //!
0118 //!
0119 //! aPeriodicityMaker.XRepeat(2);                                    // Making repetitions
0120 //! const TopoDS_Shape& aRepeat = aPeriodicityMaker.RepeatedShape(); // Getting the repeated shape
0121 //! aPeriodicityMaker.ClearRepetitions();                            // Clearing the repetitions
0122 //! ~~~~
0123 //!
0124 class BOPAlgo_MakePeriodic : public BOPAlgo_Options
0125 {
0126 public:
0127   DEFINE_STANDARD_ALLOC
0128 
0129 public: //! @name Constructor
0130   //! Empty constructor
0131   BOPAlgo_MakePeriodic()
0132       : BOPAlgo_Options()
0133   {
0134     myRepeatPeriod[0] = myRepeatPeriod[1] = myRepeatPeriod[2] = 0.0;
0135   }
0136 
0137 public: //! @name Setting the shape to make it periodic
0138   //! Sets the shape to make it periodic.
0139   //! @param[in] theShape  The shape to make periodic.
0140   void SetShape(const TopoDS_Shape& theShape) { myInputShape = theShape; }
0141 
0142 public: //! @name Definition of the structure to keep all periodicity parameters
0143   //! Structure to keep all periodicity parameters:
0144   struct PeriodicityParams
0145   {
0146     PeriodicityParams() { Clear(); }
0147 
0148     //! Returns all previously set parameters to default values
0149     void Clear()
0150     {
0151       myPeriodic[0] = myPeriodic[1] = myPeriodic[2] = Standard_False;
0152       myPeriod[0] = myPeriod[1] = myPeriod[2] = 0.0;
0153       myIsTrimmed[0] = myIsTrimmed[1] = myIsTrimmed[2] = Standard_True;
0154       myPeriodFirst[0] = myPeriodFirst[1] = myPeriodFirst[2] = 0.0;
0155     }
0156 
0157     Standard_Boolean myPeriodic[3]; //!< Array of flags defining whether the shape should be
0158                                     //! periodic in XYZ directions
0159     Standard_Real myPeriod[3];      //!< Array of XYZ period values. Defining the period for any
0160                                     //! direction the corresponding flag for that direction in
0161                                     //! myPeriodic should be set to true
0162                                     // clang-format off
0163     Standard_Boolean myIsTrimmed[3]; //!< Array of flags defining whether the input shape has to be
0164                                      //! trimmed to fit the required period in the required direction
0165     Standard_Real myPeriodFirst[3];  //!< Array of start parameters of the XYZ periods: required for trimming
0166                                     // clang-format on
0167   };
0168 
0169 public: //! @name Setters/Getters for periodicity parameters structure
0170   //! Sets the periodicity parameters.
0171   //! @param[in] theParams  Periodicity parameters
0172   void SetPeriodicityParameters(const PeriodicityParams& theParams)
0173   {
0174     myPeriodicityParams = theParams;
0175   }
0176 
0177   const PeriodicityParams& PeriodicityParameters() const { return myPeriodicityParams; }
0178 
0179 public: //! @name Methods for setting/getting periodicity info using ID as a direction
0180   //! Sets the flag to make the shape periodic in specified direction:
0181   //! - 0 - X direction;
0182   //! - 1 - Y direction;
0183   //! - 2 - Z direction.
0184   //!
0185   //! @param[in] theDirectionID  The direction's ID;
0186   //! @param[in] theIsPeriodic  Flag defining periodicity in given direction;
0187   //! @param[in] thePeriod  Required period in given direction.
0188   void MakePeriodic(const Standard_Integer theDirectionID,
0189                     const Standard_Boolean theIsPeriodic,
0190                     const Standard_Real    thePeriod = 0.0)
0191   {
0192     Standard_Integer id                = ToDirectionID(theDirectionID);
0193     myPeriodicityParams.myPeriodic[id] = theIsPeriodic;
0194     myPeriodicityParams.myPeriod[id]   = theIsPeriodic ? thePeriod : 0.0;
0195   }
0196 
0197   //! Returns the info about Periodicity of the shape in specified direction.
0198   //! @param[in] theDirectionID  The direction's ID.
0199   Standard_Boolean IsPeriodic(const Standard_Integer theDirectionID) const
0200   {
0201     return myPeriodicityParams.myPeriodic[ToDirectionID(theDirectionID)];
0202   }
0203 
0204   //! Returns the Period of the shape in specified direction.
0205   //! @param[in] theDirectionID  The direction's ID.
0206   Standard_Real Period(const Standard_Integer theDirectionID) const
0207   {
0208     Standard_Integer id = ToDirectionID(theDirectionID);
0209     return myPeriodicityParams.myPeriodic[id] ? myPeriodicityParams.myPeriod[id] : 0.0;
0210   }
0211 
0212 public: //! @name Named methods for setting/getting info about shape's periodicity
0213   //! Sets the flag to make the shape periodic in X direction.
0214   //! @param[in] theIsPeriodic  Flag defining periodicity in X direction;
0215   //! @param[in] thePeriod  Required period in X direction.
0216   void MakeXPeriodic(const Standard_Boolean theIsPeriodic, const Standard_Real thePeriod = 0.0)
0217   {
0218     MakePeriodic(0, theIsPeriodic, thePeriod);
0219   }
0220 
0221   //! Returns the info about periodicity of the shape in X direction.
0222   Standard_Boolean IsXPeriodic() const { return IsPeriodic(0); }
0223 
0224   //! Returns the XPeriod of the shape
0225   Standard_Real XPeriod() const { return Period(0); }
0226 
0227   //! Sets the flag to make the shape periodic in Y direction.
0228   //! @param[in] theIsPeriodic  Flag defining periodicity in Y direction;
0229   //! @param[in] thePeriod  Required period in Y direction.
0230   void MakeYPeriodic(const Standard_Boolean theIsPeriodic, const Standard_Real thePeriod = 0.0)
0231   {
0232     MakePeriodic(1, theIsPeriodic, thePeriod);
0233   }
0234 
0235   //! Returns the info about periodicity of the shape in Y direction.
0236   Standard_Boolean IsYPeriodic() const { return IsPeriodic(1); }
0237 
0238   //! Returns the YPeriod of the shape.
0239   Standard_Real YPeriod() const { return Period(1); }
0240 
0241   //! Sets the flag to make the shape periodic in Z direction.
0242   //! @param[in] theIsPeriodic  Flag defining periodicity in Z direction;
0243   //! @param[in] thePeriod  Required period in Z direction.
0244   void MakeZPeriodic(const Standard_Boolean theIsPeriodic, const Standard_Real thePeriod = 0.0)
0245   {
0246     MakePeriodic(2, theIsPeriodic, thePeriod);
0247   }
0248 
0249   //! Returns the info about periodicity of the shape in Z direction.
0250   Standard_Boolean IsZPeriodic() const { return IsPeriodic(2); }
0251 
0252   //! Returns the ZPeriod of the shape.
0253   Standard_Real ZPeriod() const { return Period(2); }
0254 
0255 public: //! @name Methods for setting/getting trimming info taking Direction ID as a parameter
0256   //! Defines whether the input shape is already trimmed in specified direction
0257   //! to fit the period in this direction.
0258   //! Direction is defined by an ID:
0259   //! - 0 - X direction;
0260   //! - 1 - Y direction;
0261   //! - 2 - Z direction.
0262   //!
0263   //! If the shape is not trimmed it is required to set the first parameter
0264   //! of the period in that direction.
0265   //! The algorithm will make the shape fit into the period.
0266   //!
0267   //! Before calling this method, the shape has to be set to be periodic in this direction.
0268   //!
0269   //! @param[in] theDirectionID  The direction's ID;
0270   //! @param[in] theIsTrimmed  The flag defining trimming of the shape in given direction;
0271   //! @param[in] theFirst  The first periodic parameter in the given direction.
0272   void SetTrimmed(const Standard_Integer theDirectionID,
0273                   const Standard_Boolean theIsTrimmed,
0274                   const Standard_Real    theFirst = 0.0)
0275   {
0276     Standard_Integer id = ToDirectionID(theDirectionID);
0277     if (IsPeriodic(id))
0278     {
0279       myPeriodicityParams.myIsTrimmed[id]   = theIsTrimmed;
0280       myPeriodicityParams.myPeriodFirst[id] = !theIsTrimmed ? theFirst : 0.0;
0281     }
0282   }
0283 
0284   //! Returns whether the input shape was trimmed in the specified direction.
0285   //! @param[in] theDirectionID  The direction's ID.
0286   Standard_Boolean IsInputTrimmed(const Standard_Integer theDirectionID) const
0287   {
0288     return myPeriodicityParams.myIsTrimmed[ToDirectionID(theDirectionID)];
0289   }
0290 
0291   //! Returns the first periodic parameter in the specified direction.
0292   //! @param[in] theDirectionID  The direction's ID.
0293   Standard_Real PeriodFirst(const Standard_Integer theDirectionID) const
0294   {
0295     Standard_Integer id = ToDirectionID(theDirectionID);
0296     return !myPeriodicityParams.myIsTrimmed[id] ? myPeriodicityParams.myPeriodFirst[id] : 0.0;
0297   }
0298 
0299 public: //! @name Named methods for setting/getting trimming info
0300   //! Defines whether the input shape is already trimmed in X direction
0301   //! to fit the X period. If the shape is not trimmed it is required
0302   //! to set the first parameter for the X period.
0303   //! The algorithm will make the shape fit into the period.
0304   //!
0305   //! Before calling this method, the shape has to be set to be periodic in this direction.
0306   //!
0307   //! @param[in] theIsTrimmed  Flag defining whether the shape is already trimmed
0308   //!                          in X direction to fit the X period;
0309   //! @param[in] theFirst  The first X periodic parameter.
0310   void SetXTrimmed(const Standard_Boolean theIsTrimmed, const Standard_Boolean theFirst = 0.0)
0311   {
0312     SetTrimmed(0, theIsTrimmed, theFirst);
0313   }
0314 
0315   //! Returns whether the input shape was already trimmed for X period.
0316   Standard_Boolean IsInputXTrimmed() const { return IsInputTrimmed(0); }
0317 
0318   //! Returns the first parameter for the X period.
0319   Standard_Real XPeriodFirst() const { return PeriodFirst(0); }
0320 
0321   //! Defines whether the input shape is already trimmed in Y direction
0322   //! to fit the Y period. If the shape is not trimmed it is required
0323   //! to set the first parameter for the Y period.
0324   //! The algorithm will make the shape fit into the period.
0325   //!
0326   //! Before calling this method, the shape has to be set to be periodic in this direction.
0327   //!
0328   //! @param[in] theIsTrimmed  Flag defining whether the shape is already trimmed
0329   //!                          in Y direction to fit the Y period;
0330   //! @param[in] theFirst  The first Y periodic parameter.
0331   void SetYTrimmed(const Standard_Boolean theIsTrimmed, const Standard_Boolean theFirst = 0.0)
0332   {
0333     SetTrimmed(1, theIsTrimmed, theFirst);
0334   }
0335 
0336   //! Returns whether the input shape was already trimmed for Y period.
0337   Standard_Boolean IsInputYTrimmed() const { return IsInputTrimmed(1); }
0338 
0339   //! Returns the first parameter for the Y period.
0340   Standard_Real YPeriodFirst() const { return PeriodFirst(1); }
0341 
0342   //! Defines whether the input shape is already trimmed in Z direction
0343   //! to fit the Z period. If the shape is not trimmed it is required
0344   //! to set the first parameter for the Z period.
0345   //! The algorithm will make the shape fit into the period.
0346   //!
0347   //! Before calling this method, the shape has to be set to be periodic in this direction.
0348   //!
0349   //! @param[in] theIsTrimmed  Flag defining whether the shape is already trimmed
0350   //!                          in Z direction to fit the Z period;
0351   //! @param[in] theFirst  The first Z periodic parameter.
0352   void SetZTrimmed(const Standard_Boolean theIsTrimmed, const Standard_Boolean theFirst = 0.0)
0353   {
0354     SetTrimmed(2, theIsTrimmed, theFirst);
0355   }
0356 
0357   //! Returns whether the input shape was already trimmed for Z period.
0358   Standard_Boolean IsInputZTrimmed() const { return IsInputTrimmed(2); }
0359 
0360   //! Returns the first parameter for the Z period.
0361   Standard_Real ZPeriodFirst() const { return PeriodFirst(2); }
0362 
0363 public: //! @name Performing  the operation
0364   //! Makes the shape periodic in necessary directions
0365   Standard_EXPORT void Perform();
0366 
0367 public: //! @name Using the algorithm to repeat the shape
0368   //! Performs repetition of the shape in specified direction
0369   //! required number of times.
0370   //! Negative value of times means that the repetition should
0371   //! be perform in negative direction.
0372   //! Makes the repeated shape a base for following repetitions.
0373   //!
0374   //! @param[in] theDirectionID  The direction's ID;
0375   //! @param[in] theTimes  Requested number of repetitions.
0376   Standard_EXPORT const TopoDS_Shape& RepeatShape(const Standard_Integer theDirectionID,
0377                                                   const Standard_Integer theTimes);
0378 
0379   //! Repeats the shape in X direction specified number of times.
0380   //! Negative value of times means that the repetition should be
0381   //! perform in negative X direction.
0382   //! Makes the repeated shape a base for following repetitions.
0383   //!
0384   //! @param[in] theTimes  Requested number of repetitions.
0385   const TopoDS_Shape& XRepeat(const Standard_Integer theTimes) { return RepeatShape(0, theTimes); }
0386 
0387   //! Repeats the shape in Y direction specified number of times.
0388   //! Negative value of times means that the repetition should be
0389   //! perform in negative Y direction.
0390   //! Makes the repeated shape a base for following repetitions.
0391   //!
0392   //! @param[in] theTimes  Requested number of repetitions.
0393   const TopoDS_Shape& YRepeat(const Standard_Integer theTimes) { return RepeatShape(1, theTimes); }
0394 
0395   //! Repeats the shape in Z direction specified number of times.
0396   //! Negative value of times means that the repetition should be
0397   //! perform in negative Z direction.
0398   //! Makes the repeated shape a base for following repetitions.
0399   //!
0400   //! @param[in] theTimes  Requested number of repetitions.
0401   const TopoDS_Shape& ZRepeat(const Standard_Integer theTimes) { return RepeatShape(2, theTimes); }
0402 
0403 public: //! @name Starting the repetitions over
0404   //! Returns the repeated shape
0405   const TopoDS_Shape& RepeatedShape() const { return myRepeatedShape; }
0406 
0407   //! Clears all performed repetitions.
0408   //! The next repetition will be performed on the base shape.
0409   void ClearRepetitions()
0410   {
0411     myRepeatPeriod[0] = myRepeatPeriod[1] = myRepeatPeriod[2] = 0.0;
0412     myRepeatedShape.Nullify();
0413     myRepeatedTwins.Clear();
0414     if (!myHistory.IsNull())
0415     {
0416       myHistory->Clear();
0417       if (!mySplitHistory.IsNull())
0418         myHistory->Merge(mySplitHistory);
0419     }
0420   }
0421 
0422 public: //! @name Obtaining the result shape
0423   //! Returns the resulting periodic shape
0424   const TopoDS_Shape& Shape() const { return myShape; }
0425 
0426 public: //! @name Getting the identical shapes
0427   //! Returns the identical shapes for the given shape located
0428   //! on the opposite periodic side.
0429   //! Returns empty list in case the shape has no twin.
0430   //!
0431   //! @param[in] theS  Shape to get the twins for.
0432   const TopTools_ListOfShape& GetTwins(const TopoDS_Shape& theS) const
0433   {
0434     static TopTools_ListOfShape empty;
0435     const TopTools_ListOfShape* aTwins =
0436       myRepeatedTwins.IsEmpty() ? myTwins.Seek(theS) : myRepeatedTwins.Seek(theS);
0437     return (aTwins ? *aTwins : empty);
0438   }
0439 
0440 public: //! @name Getting the History of the algorithm
0441   //! Returns the History of the algorithm
0442   const Handle(BRepTools_History)& History() const { return myHistory; }
0443 
0444 public: //! @name Clearing the algorithm from previous runs
0445   //! Clears the algorithm from previous runs
0446   void Clear()
0447   {
0448     BOPAlgo_Options::Clear();
0449     myPeriodicityParams.Clear();
0450     myShape.Nullify();
0451     if (!mySplitHistory.IsNull())
0452       mySplitHistory->Clear();
0453     if (!myHistory.IsNull())
0454       myHistory->Clear();
0455 
0456     ClearRepetitions();
0457   }
0458 
0459 public: //! @name Conversion of the integer to ID of periodic direction
0460   //! Converts the integer to ID of periodic direction
0461   static Standard_Integer ToDirectionID(const Standard_Integer theDirectionID)
0462   {
0463     return Abs(theDirectionID % 3);
0464   }
0465 
0466 protected: //! @name Protected methods performing the operation
0467   //! Checks the validity of input data
0468   Standard_EXPORT void CheckData();
0469 
0470   //! Trims the shape to fit to the periodic bounds
0471   Standard_EXPORT void Trim();
0472 
0473   //! Makes the shape identical on opposite sides
0474   Standard_EXPORT void MakeIdentical();
0475 
0476   //! Splits the negative side of the shape with the geometry
0477   //! located on the positive side copying the geometry from
0478   //! positive side to the negative.
0479   Standard_EXPORT void SplitNegative();
0480 
0481   //! Splits the positive side of the shape with the geometry
0482   //! located on the negative side of the shape.
0483   //! Ensures that the geometries on the opposite sides will
0484   //! be identical.
0485   //! Associates the identical opposite sub-shapes.
0486   Standard_EXPORT void SplitPositive();
0487 
0488   //! Splits the shape by the given tools, copying the geometry of coinciding
0489   //! parts from the given tools to the split shape.
0490   //! @param[in] theTools  The tools to split the shape and take the geometry
0491   //!                      for coinciding parts.
0492   //! @param[out] theSplitShapeHistory  The history of shape split
0493   //! @param[out] theSplitToolsHistory  The history of tools modifications during the split
0494   Standard_EXPORT void SplitShape(const TopTools_ListOfShape& theTools,
0495                                   Handle(BRepTools_History)   theSplitShapeHistory = NULL,
0496                                   Handle(BRepTools_History)   theSplitToolsHistory = NULL);
0497 
0498   //! Updates the map of twins after periodic shape repetition.
0499   //! @param[in] theTranslationHistory  The history of translation of the periodic shape.
0500   //! @param[in] theGluingHistory  The history of gluing of the repeated shapes.
0501   Standard_EXPORT void UpdateTwins(const BRepTools_History& theTranslationHistory,
0502                                    const BRepTools_History& theGluingHistory);
0503 
0504 protected: //! @name Fields
0505   // Inputs
0506   TopoDS_Shape myInputShape; //!< Input shape to make periodic
0507 
0508   PeriodicityParams myPeriodicityParams; //!< Periodicity parameters
0509 
0510   // Results
0511   TopoDS_Shape  myShape;           //!< Resulting periodic shape (base for repetitions)
0512   TopoDS_Shape  myRepeatedShape;   //!< Resulting shape after making repetitions of the base
0513   Standard_Real myRepeatPeriod[3]; //!< XYZ repeat period
0514                                    // clang-format off
0515   TopTools_DataMapOfShapeListOfShape myRepeatedTwins; //!< Map of associations of the identical sub-shapes
0516                                                       //! after repetition of the periodic shape
0517                                    // clang-format on
0518 
0519   // Twins
0520   TopTools_DataMapOfShapeListOfShape myTwins; //!< Map of associations of the identical sub-shapes
0521                                               //! located on the opposite sides of the shape
0522 
0523   // History
0524   Handle(BRepTools_History) mySplitHistory; //!< Split history - history of shapes modification
0525                                             //! after the split for making the shape periodic
0526   Handle(BRepTools_History) myHistory;      //!< Final history of shapes modifications
0527                                             //! (to include the history of shape repetition)
0528 };
0529 
0530 #endif // _BOPAlgo_MakePeriodic_HeaderFile