Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 10:04:07

0001 // Created by: Christian CAILLET <cky@phobox> 
0002 // Copyright (c) 1992-1999 Matra Datavision
0003 // Copyright (c) 1999-2014 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 _Interface_InterfaceModel_HeaderFile
0017 #define _Interface_InterfaceModel_HeaderFile
0018 
0019 #include <Standard.hxx>
0020 #include <Standard_Type.hxx>
0021 
0022 #include <TColStd_IndexedMapOfTransient.hxx>
0023 #include <TColStd_DataMapOfIntegerTransient.hxx>
0024 #include <Standard_Transient.hxx>
0025 #include <Standard_Integer.hxx>
0026 #include <Interface_DataState.hxx>
0027 #include <TColStd_HSequenceOfHAsciiString.hxx>
0028 class Interface_Check;
0029 class TCollection_HAsciiString;
0030 class Interface_GTool;
0031 class Interface_Protocol;
0032 class Interface_ReportEntity;
0033 class Interface_CheckIterator;
0034 class Interface_GeneralLib;
0035 class Interface_EntityIterator;
0036 
0037 
0038 class Interface_InterfaceModel;
0039 DEFINE_STANDARD_HANDLE(Interface_InterfaceModel, Standard_Transient)
0040 
0041 //! Defines an (Indexed) Set of data corresponding to a complete
0042 //! Transfer by a File Interface, i.e. File Header and Transient
0043 //! Entities (Objects) contained in a File. Contained Entities are
0044 //! identified in the Model by unique and consecutive Numbers.
0045 //!
0046 //! In addition, a Model can attach to each entity, a specific
0047 //! Label according to the norm (e.g. Name for VDA, #ident for
0048 //! Step ...), intended to be output on a string or a stream
0049 //! (remark : labels are not obliged to be unique)
0050 //!
0051 //! InterfaceModel itself is not Transient, it is intended to
0052 //! work on a set of Transient Data. The services offered are
0053 //! basic Listing and Identification operations on Transient
0054 //! Entities, storage of Error Reports, Copying.
0055 //!
0056 //! Moreovere, it is possible to define and use templates. These
0057 //! are empty Models, from which copies can be obtained in order
0058 //! to be filled with effective data. This allows to record
0059 //! standard definitions for headers, avoiding to recreate them
0060 //! for each sendings, and assuring customisation of produced
0061 //! files for a given site.
0062 //! A template is attached to a name. It is possible to define a
0063 //! template from another one (get it, edit it then record it
0064 //! under another name).
0065 //!
0066 //! See also Graph, ShareTool, CheckTool for more
0067 class Interface_InterfaceModel : public Standard_Transient
0068 {
0069 
0070 public:
0071 
0072   
0073   //! Clears the list of entities (service WhenDelete)
0074   Standard_EXPORT void Destroy();
0075 ~Interface_InterfaceModel()
0076 {
0077   Destroy();
0078 }
0079   
0080   //! Sets a Protocol for this Model
0081   //! It is also set by a call to AddWithRefs with Protocol
0082   //! It is used for : DumpHeader (as required), ClearEntities ...
0083   Standard_EXPORT void SetProtocol (const Handle(Interface_Protocol)& proto);
0084   
0085   //! Returns the Protocol which has been set by SetProtocol, or
0086   //! AddWithRefs with Protocol
0087   Standard_EXPORT virtual Handle(Interface_Protocol) Protocol() const;
0088   
0089   //! Sets a GTool for this model, which already defines a Protocol
0090   Standard_EXPORT void SetGTool (const Handle(Interface_GTool)& gtool);
0091   
0092   //! Returns the GTool, set by SetProtocol or by SetGTool
0093   Standard_EXPORT Handle(Interface_GTool) GTool() const;
0094   
0095   //! Returns the Dispatch Status, either for get or set
0096   //! A Model which is produced from Dispatch may share entities
0097   //! with the original (according to the Protocol), hence these
0098   //! non-copied entities should not be deleted
0099   Standard_EXPORT Standard_Boolean& DispatchStatus();
0100   
0101   //! Erases contained data; used when a Model is copied to others :
0102   //! the new copied ones begin from clear
0103   //! Clear calls specific method ClearHeader (see below)
0104   Standard_EXPORT virtual void Clear();
0105   
0106   //! Clears the entities; uses the general service WhenDelete, in
0107   //! addition to the standard Memory Manager; can be redefined
0108   Standard_EXPORT virtual void ClearEntities();
0109   
0110   //! Erases information about labels, if any : specific to each
0111   //! norm
0112   Standard_EXPORT virtual void ClearLabels() = 0;
0113   
0114   //! Clears Model's header : specific to each norm
0115   Standard_EXPORT virtual void ClearHeader() = 0;
0116   
0117   //! Returns count of contained Entities
0118   Standard_EXPORT Standard_Integer NbEntities() const;
0119   
0120   //! Returns True if a Model contains an Entity (for a ReportEntity,
0121   //! looks for the ReportEntity itself AND its Concerned Entity)
0122   Standard_EXPORT Standard_Boolean Contains (const Handle(Standard_Transient)& anentity) const;
0123   
0124   //! Returns the Number of an Entity in the Model if it contains it.
0125   //! Else returns 0. For a ReportEntity, looks at Concerned Entity.
0126   //! Returns the Directory entry   Number of  an Entity in
0127   //! the  Model if it contains it.   Else returns  0.  For a
0128   //! ReportEntity, looks at Concerned Entity.
0129   Standard_EXPORT Standard_Integer Number (const Handle(Standard_Transient)& anentity) const;
0130   
0131   //! Returns an Entity identified by its number in the Model
0132   //! Each sub-class of InterfaceModel can define its own method
0133   //! Entity to return its specific class of Entity (e.g. for VDA,
0134   //! VDAModel returns a VDAEntity), working by calling Value
0135   //! Remark : For a Reported Entity, (Erroneous, Corrected, Unknown), this
0136   //! method returns this Reported Entity.
0137   //! See ReportEntity for other questions.
0138   Standard_EXPORT const Handle(Standard_Transient)& Value (const Standard_Integer num) const;
0139   
0140   //! Returns the count of DISTINCT types under which an entity may
0141   //! be processed. Defined by the Protocol, which gives default as
0142   //! 1 (dynamic Type).
0143   Standard_EXPORT Standard_Integer NbTypes (const Handle(Standard_Transient)& ent) const;
0144   
0145   //! Returns a type, given its rank : defined by the Protocol
0146   //! (by default, the first one)
0147   Standard_EXPORT Handle(Standard_Type) Type (const Handle(Standard_Transient)& ent, const Standard_Integer num = 1) const;
0148   
0149   //! Returns the type name of an entity, from the list of types
0150   //! (one or more ...)
0151   //! <complete> True (D) gives the complete type, else packages are
0152   //! removed
0153   //! WARNING : buffered, to be immediately copied or printed
0154   Standard_EXPORT Standard_CString TypeName (const Handle(Standard_Transient)& ent, const Standard_Boolean complete = Standard_True) const;
0155   
0156   //! From a CDL Type Name, returns the Class part (package dropped)
0157   //! WARNING : buffered, to be immediately copied or printed
0158   Standard_EXPORT static Standard_CString ClassName (const Standard_CString typnam);
0159   
0160   //! Returns the State of an entity, given its number
0161   Standard_EXPORT Interface_DataState EntityState (const Standard_Integer num) const;
0162   
0163   //! Returns True if <num> identifies a ReportEntity in the Model
0164   //! Hence, ReportEntity can be called.
0165   //!
0166   //! By default, queries main report, if <semantic> is True, it
0167   //! queries report for semantic check
0168   //!
0169   //! Remember that a Report Entity can be defined for an Unknown
0170   //! Entity, or a Corrected or Erroneous (at read time) Entity.
0171   //! The ReportEntity is defined before call to method AddEntity.
0172   Standard_EXPORT Standard_Boolean IsReportEntity (const Standard_Integer num, const Standard_Boolean semantic = Standard_False) const;
0173   
0174   //! Returns a ReportEntity identified by its number in the Model,
0175   //! or a Null Handle If <num> does not identify a ReportEntity.
0176   //!
0177   //! By default, queries main report, if <semantic> is True, it
0178   //! queries report for semantic check
0179   Standard_EXPORT Handle(Interface_ReportEntity) ReportEntity (const Standard_Integer num, const Standard_Boolean semantic = Standard_False) const;
0180   
0181   //! Returns True if <num> identifies an Error Entity : in this
0182   //! case, a ReportEntity brings Fail Messages and possibly an
0183   //! "undefined" Content, see IsRedefinedEntity
0184   Standard_EXPORT Standard_Boolean IsErrorEntity (const Standard_Integer num) const;
0185   
0186   //! Returns True if <num> identifies an Entity which content is
0187   //! redefined through a ReportEntity (i.e. with literal data only)
0188   //! This happens when an entity is syntactically erroneous in the
0189   //! way that its basic content remains empty.
0190   //! For more details (such as content itself), see ReportEntity
0191   Standard_EXPORT Standard_Boolean IsRedefinedContent (const Standard_Integer num) const;
0192   
0193   //! Removes the ReportEntity attached to Entity <num>. Returns
0194   //! True if done, False if no ReportEntity was attached to <num>.
0195   //! Warning : the caller must assume that this clearing is meaningful
0196   Standard_EXPORT Standard_Boolean ClearReportEntity (const Standard_Integer num);
0197   
0198   //! Sets or Replaces a ReportEntity for the Entity <num>. Returns
0199   //! True if Report is replaced, False if it has been replaced
0200   //! Warning : the caller must assume that this setting is meaningful
0201   Standard_EXPORT Standard_Boolean SetReportEntity (const Standard_Integer num, const Handle(Interface_ReportEntity)& rep);
0202   
0203   //! Adds a ReportEntity as such. Returns False if the concerned
0204   //! entity is not recorded in the Model
0205   //! Else, adds it into, either the main report list or the
0206   //! list for semantic checks, then returns True
0207   Standard_EXPORT Standard_Boolean AddReportEntity (const Handle(Interface_ReportEntity)& rep, const Standard_Boolean semantic = Standard_False);
0208   
0209   //! Returns True if <num> identifies an Unknown Entity : in this
0210   //! case, a ReportEntity with no Check Messages designates it.
0211   Standard_EXPORT Standard_Boolean IsUnknownEntity (const Standard_Integer num) const;
0212   
0213   //! Fills the list of semantic checks.
0214   //! This list is computed (by CheckTool). Hence, it can be stored
0215   //! in the model for later queries
0216   //! <clear> True (D) : new list replaces
0217   //! <clear> False    : new list is cumulated
0218   Standard_EXPORT void FillSemanticChecks (const Interface_CheckIterator& checks, const Standard_Boolean clear = Standard_True);
0219   
0220   //! Returns True if semantic checks have been filled
0221   Standard_EXPORT Standard_Boolean HasSemanticChecks() const;
0222   
0223   //! Returns the check attached to an entity, designated by its
0224   //! Number. 0 for global check
0225   //! <semantic> True  : recorded semantic check
0226   //! <semantic> False : recorded syntactic check (see ReportEntity)
0227   //! If no check is recorded for <num>, returns an empty Check
0228   Standard_EXPORT const Handle(Interface_Check)& Check (const Standard_Integer num, const Standard_Boolean syntactic) const;
0229   
0230   //! Does a reservation for the List of Entities (for optimized
0231   //! storage management). If it is not called, storage management
0232   //! can be less efficient. <nbent> is the expected count of
0233   //! Entities to store
0234   Standard_EXPORT virtual void Reservate (const Standard_Integer nbent);
0235   
0236   //! Internal method for adding an Entity. Used by file reading
0237   //! (defined by each Interface) and Transfer tools. It adds the
0238   //! entity required to be added, not its refs : see AddWithRefs.
0239   //! If <anentity> is a ReportEntity, it is added to the list of
0240   //! Reports, its Concerned Entity (Erroneous or Corrected, else
0241   //! Unknown) is added to the list of Entities.
0242   //! That is, the ReportEntity must be created before Adding
0243   Standard_EXPORT virtual void AddEntity (const Handle(Standard_Transient)& anentity);
0244   
0245   //! Adds to the Model, an Entity with all its References, as they
0246   //! are defined by General Services FillShared and ListImplied.
0247   //! Process is recursive (any sub-levels) if <level> = 0 (Default)
0248   //! Else, adds sub-entities until the required sub-level.
0249   //! Especially, if <level> = 1, adds immediate subs and that's all
0250   //!
0251   //! If <listall> is False (Default), an entity (<anentity> itself
0252   //! or one of its subs at any level) which is already recorded in
0253   //! the Model is not analysed, only the newly added ones are.
0254   //! If <listall> is True, all items are analysed (this allows to
0255   //! ensure the consistency of an adding made by steps)
0256   Standard_EXPORT void AddWithRefs (const Handle(Standard_Transient)& anent, const Handle(Interface_Protocol)& proto, const Standard_Integer level = 0, const Standard_Boolean listall = Standard_False);
0257   
0258   //! Same as above, but works with the Protocol of the Model
0259   Standard_EXPORT void AddWithRefs (const Handle(Standard_Transient)& anent, const Standard_Integer level = 0, const Standard_Boolean listall = Standard_False);
0260   
0261   //! Same as above, but works with an already created GeneralLib
0262   Standard_EXPORT void AddWithRefs (const Handle(Standard_Transient)& anent, const Interface_GeneralLib& lib, const Standard_Integer level = 0, const Standard_Boolean listall = Standard_False);
0263   
0264   //! Replace Entity with Number=nument on other entity - "anent"
0265   Standard_EXPORT void ReplaceEntity (const Standard_Integer nument, const Handle(Standard_Transient)& anent);
0266   
0267   //! Reverses the Numbers of the Entities, between <after> and the
0268   //! total count of Entities. Thus, the entities :
0269   //! 1,2 ... after, after+1 ... nb-1, nb  become numbered as :
0270   //! 1,2 ... after, nb, nb-1 ... after+1
0271   //! By default (after = 0) the whole list of Entities is reversed
0272   Standard_EXPORT void ReverseOrders (const Standard_Integer after = 0);
0273   
0274   //! Changes the Numbers of some Entities : <oldnum> is moved to
0275   //! <newnum>, same for <count> entities. Thus :
0276   //! 1,2 ... newnum-1 newnum ... oldnum .. oldnum+count oldnum+count+1 .. gives
0277   //! 1,2 ... newnum-1 oldnum .. oldnum+count newnum ... oldnum+count+1
0278   //! (can be seen as a circular permutation)
0279   Standard_EXPORT void ChangeOrder (const Standard_Integer oldnum, const Standard_Integer newnum, const Standard_Integer count = 1);
0280   
0281   //! Gets contents from an EntityIterator, prepared by a
0282   //! Transfer tool (e.g TransferCopy). Starts from clear
0283   Standard_EXPORT void GetFromTransfer (const Interface_EntityIterator& aniter);
0284   
0285   //! Gets header (data specific of a defined Interface) from
0286   //! another InterfaceModel; called from TransferCopy
0287   Standard_EXPORT virtual void GetFromAnother (const Handle(Interface_InterfaceModel)& other) = 0;
0288   
0289   //! Returns a New Empty Model, same type as <me> (whatever its
0290   //! Type); called to Copy parts a Model into other ones, then
0291   //! followed by a call to GetFromAnother (Header) then filling
0292   //! with specified Entities, themselves copied
0293   Standard_EXPORT virtual Handle(Interface_InterfaceModel) NewEmptyModel() const = 0;
0294   
0295   //! Records a category number for an entity number
0296   //! Returns True when done, False if <num> is out of range
0297   Standard_EXPORT Standard_Boolean SetCategoryNumber (const Standard_Integer num, const Standard_Integer val);
0298   
0299   //! Returns the recorded category number for a given entity number
0300   //! 0 if none was defined for this entity
0301   Standard_EXPORT Standard_Integer CategoryNumber (const Standard_Integer num) const;
0302   
0303   //! Allows an EntityIterator to get a list of Entities
0304   Standard_EXPORT void FillIterator (Interface_EntityIterator& iter) const;
0305   
0306   //! Returns the list of all Entities, as an Iterator on Entities
0307   //! (the Entities themselves, not the Reports)
0308   Standard_EXPORT Interface_EntityIterator Entities() const;
0309   
0310   //! Returns the list of all ReportEntities, i.e. data about
0311   //! Entities read with Error or Warning information
0312   //! (each item has to be casted to Report Entity then it can be
0313   //! queried for Concerned Entity, Content, Check ...)
0314   //! By default, returns the main reports, is <semantic> is True it
0315   //! returns the list for semantic checks
0316   Standard_EXPORT Interface_EntityIterator Reports (const Standard_Boolean semantic = Standard_False) const;
0317   
0318   //! Returns the list of ReportEntities which redefine data
0319   //! (generally, if concerned entity is "Error", a literal content
0320   //! is added to it : this is a "redefined entity"
0321   Standard_EXPORT Interface_EntityIterator Redefineds() const;
0322   
0323   //! Returns the GlobalCheck, which memorizes messages global to
0324   //! the file (not specific to an Entity), especially Header
0325   Standard_EXPORT const Handle(Interface_Check)& GlobalCheck (const Standard_Boolean syntactic = Standard_True) const;
0326   
0327   //! Allows to modify GlobalCheck, after getting then completing it
0328   //! Remark : it is SYNTACTIC check. Semantics, see FillChecks
0329   Standard_EXPORT void SetGlobalCheck (const Handle(Interface_Check)& ach);
0330   
0331   //! Minimum Semantic Global Check on data in model (header)
0332   //! Can only check basic Data. See also GlobalCheck from Protocol
0333   //! for a check which takes the Graph into account
0334   //! Default does nothing, can be redefined
0335   Standard_EXPORT virtual void VerifyCheck (Handle(Interface_Check)& ach) const;
0336   
0337   //! Dumps Header in a short, easy to read, form, onto a Stream
0338   //! <level> allows to print more or less parts of the header,
0339   //! if necessary. 0 for basic print
0340   Standard_EXPORT virtual void DumpHeader (Standard_OStream& S, const Standard_Integer level = 0) const = 0;
0341   
0342   //! Prints identification of a given entity in <me>, in order to
0343   //! be printed in a list or phrase
0344   //! <mode> < 0 : prints only its number
0345   //! <mode> = 1 : just calls PrintLabel
0346   //! <mode> = 0 (D) : prints its number plus '/' plus PrintLabel
0347   //! If <ent> == <me>, simply prints "Global"
0348   //! If <ent> is unknown, prints "??/its type"
0349   Standard_EXPORT void Print (const Handle(Standard_Transient)& ent, Standard_OStream& s, const Standard_Integer mode = 0) const;
0350   
0351   //! Prints label specific to each norm, for a given entity.
0352   //! Must only print label itself, in order to be included in a
0353   //! phrase. Can call the result of StringLabel, but not obliged.
0354   Standard_EXPORT virtual void PrintLabel (const Handle(Standard_Transient)& ent, Standard_OStream& S) const = 0;
0355   
0356   //! Prints label specific to each norm in log format, for
0357   //! a given entity.
0358   //! By default, just calls PrintLabel, can be redefined
0359   Standard_EXPORT virtual void PrintToLog (const Handle(Standard_Transient)& ent, Standard_OStream& S) const;
0360   
0361   //! Returns a string with the label attached to a given entity.
0362   //! Warning : While this string may be edited on the spot, if it is a read
0363   //! field, the returned value must be copied before.
0364   Standard_EXPORT virtual Handle(TCollection_HAsciiString) StringLabel (const Handle(Standard_Transient)& ent) const = 0;
0365   
0366   //! Searches a label which matches with one entity.
0367   //! Begins from <lastnum>+1 (default:1) and scans the entities
0368   //! until <NbEntities>. For the first which matches <label>,
0369   //! this method returns its Number. Returns 0 if nothing found
0370   //! Can be called recursively (labels are not specified as unique)
0371   //! <exact> : if True (default), exact match is required
0372   //! else, checks the END of entity label
0373   //!
0374   //! This method is virtual, hence it can be redefined for a more
0375   //! efficient search (if exact is true).
0376   Standard_EXPORT virtual Standard_Integer NextNumberForLabel (const Standard_CString label, const Standard_Integer lastnum = 0, const Standard_Boolean exact = Standard_True) const;
0377   
0378   //! Returns true if a template is attached to a given name
0379   Standard_EXPORT static Standard_Boolean HasTemplate (const Standard_CString name);
0380   
0381   //! Returns the template model attached to a name, or a Null Handle
0382   Standard_EXPORT static Handle(Interface_InterfaceModel) Template (const Standard_CString name);
0383   
0384   //! Records a new template model with a name. If the name was
0385   //! already recorded, the corresponding template is replaced by
0386   //! the new one. Then, WARNING : test HasTemplate to avoid
0387   //! surprises
0388   Standard_EXPORT static Standard_Boolean SetTemplate (const Standard_CString name, const Handle(Interface_InterfaceModel)& model);
0389   
0390   //! Returns the complete list of names attached to template models
0391   Standard_EXPORT static Handle(TColStd_HSequenceOfHAsciiString) ListTemplates();
0392 
0393 
0394 
0395   DEFINE_STANDARD_RTTIEXT(Interface_InterfaceModel,Standard_Transient)
0396 
0397 protected:
0398 
0399   
0400   //! Defines empty InterfaceModel, ready to be filled
0401   Standard_EXPORT Interface_InterfaceModel();
0402 
0403 
0404 
0405 private:
0406 
0407 
0408   TColStd_IndexedMapOfTransient theentities;
0409   TColStd_DataMapOfIntegerTransient thereports;
0410   TColStd_DataMapOfIntegerTransient therepch;
0411   Handle(Interface_Check) thecheckstx;
0412   Handle(Interface_Check) thechecksem;
0413   Standard_Boolean haschecksem;
0414   Standard_Boolean isdispatch;
0415   Handle(TCollection_HAsciiString) thecategory;
0416   Handle(Interface_GTool) thegtool;
0417 
0418 
0419 };
0420 
0421 
0422 
0423 
0424 
0425 
0426 
0427 #endif // _Interface_InterfaceModel_HeaderFile