1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00
Files
occt/src/IGESData/IGESData_IGESReaderTool.cxx
abv d5f74e42d6 0024624: Lost word in license statement in source files
License statement text corrected; compiler warnings caused by Bison 2.41 disabled for MSVC; a few other compiler warnings on 54-bit Windows eliminated by appropriate type cast
Wrong license statements corrected in several files.
Copyright and license statements added in XSD and GLSL files.
Copyright year updated in some files.
Obsolete documentation files removed from DrawResources.
2014-02-20 16:15:17 +04:00

423 lines
14 KiB
C++

// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <IGESData_IGESReaderTool.ixx>
#include <IGESData_IGESReaderData.hxx>
#include <IGESData_ParamCursor.hxx>
#include <Interface_ReaderModule.hxx>
#include <IGESData_ReadWriteModule.hxx>
#include <IGESData_IGESModel.hxx>
#include <IGESData_IGESEntity.hxx>
#include <IGESData_UndefinedEntity.hxx>
#include <Interface_FileParameter.hxx>
#include <Interface_ParamList.hxx>
#include <TCollection_HAsciiString.hxx>
#include <Interface_Macros.hxx>
#include <stdio.h>
// MGE 17/06/98
// To use Msg class
#include <Message_Msg.hxx>
IGESData_IGESReaderTool::IGESData_IGESReaderTool
(const Handle(IGESData_IGESReaderData)& reader,
const Handle(IGESData_Protocol)& protocol)
: theglib(protocol) , therlib(protocol)
{ SetData (reader,protocol); }
// ###########################################################################
// ######## PREPARATION ########
void IGESData_IGESReaderTool::Prepare
(const Handle(IGESData_FileRecognizer)& reco)
{
DeclareAndCast(IGESData_IGESReaderData,igesdat,Data());
igesdat->SetEntityNumbers();
thereco = reco;
SetEntities();
thelist = igesdat->Params(0);
}
Standard_Boolean IGESData_IGESReaderTool::Recognize
(const Standard_Integer num, Handle(Interface_Check)& ach,
Handle(Standard_Transient)& ent)
{
DeclareAndCast(IGESData_IGESReaderData,igesdat,Data());
thecnum = num; thectyp = igesdat->DirType(num);
Handle(IGESData_IGESEntity) anent;
Standard_Boolean res = Standard_False;
// Recognizer -> Liste limitative
if (!thereco.IsNull()) res = thereco->Evaluate(thectyp,anent);
if (res) ent = anent;
// Sinon, Library
else res = RecognizeByLib (num,theglib,therlib,ach,ent);
return res;
}
// ###########################################################################
// ######## LECTURE (Controle General) ########
// (Elements enchaines par la classe de base Interface_FileReaderTool)
void IGESData_IGESReaderTool::BeginRead
(const Handle(Interface_InterfaceModel)& amodel)
{
DeclareAndCast(IGESData_IGESModel,amod,amodel);
DeclareAndCast(IGESData_IGESReaderData,igesdat,Data());
const IGESData_GlobalSection& gs = igesdat->GlobalSection();
amod->SetStartSection (igesdat->StartSection(),Standard_False);
amod->SetGlobalSection (gs);
Handle(Interface_Check) glob = amod->GlobalCheck();
glob->GetMessages (igesdat->GlobalCheck());
amod->SetGlobalCheck (glob);
themaxweight = gs.MaxLineWeight();
thegradweight = gs.LineWeightGrad();
if (thegradweight > 0)
{ themaxweight = themaxweight/thegradweight; thegradweight = 1; }
thedefweight = igesdat->DefaultLineWeight();
}
// Manquent les procedures de reprise sur erreur en cours de route ...
Standard_Boolean IGESData_IGESReaderTool::AnalyseRecord
(const Standard_Integer num, const Handle(Standard_Transient)& anent,
Handle(Interface_Check)& ach)
{
Handle(TCollection_HAsciiString) lab;
DeclareAndCast(IGESData_IGESEntity,ent,anent);
DeclareAndCast(IGESData_IGESReaderData,igesdat,Data());
// Demarrage de la lecture : Faire Clear
ent->Clear();
// UndefinedEntity : une pre-analyse est faite
DeclareAndCast(IGESData_UndefinedEntity,undent,ent);
if (!undent.IsNull()) {
IGESData_DirPart DP = igesdat->DirPart(num); // qui le copie ...
undent->ReadDir (igesdat,DP,ach); // DP a pu etre modifie
ReadDir (ent,igesdat,DP,ach); // Lecture avec ce DP
}
else ReadDir (ent,igesdat,igesdat->DirPart(num),ach);
thestep = IGESData_ReadDir;
// Liste de Parametres : controle de son entete
// Handle(Interface_ParamList) list = Data()->Params(num);
Standard_Integer nbpar = Data()->NbParams(num);
Standard_Integer n0par = (num == 1 ? 1 : (Data()->ParamFirstRank(num-1) +1));
if (nbpar < 1) {
// Liste vide non admise, sauf si Undefined (par exemple type nul)
if (!undent.IsNull()) return Standard_True;
// Sending of message : DE : no parameter
Message_Msg Msg27 ("XSTEP_27");
Msg27.Arg(thecnum);
ach->SendFail(Msg27);
return Standard_False;
}
const Interface_FileParameter& FP = thelist->Value(n0par);
if ((FP.ParamType() != Interface_ParamInteger) || (atoi(FP.CValue()) != ent->TypeNumber()))
{
// Sending of message : DE : Incorrect type
Message_Msg Msg28 ("XSTEP_28");
Msg28.Arg(thecnum);
ach->SendFail(Msg28);
return Standard_False;
}
IGESData_ParamReader PR (thelist,ach,n0par,nbpar,num);
thestep = IGESData_ReadOwn;
ReadOwnParams (ent,igesdat,PR);
if ((thestep = PR.Stage()) == IGESData_ReadOwn) PR.NextStage();
if (thestep == IGESData_ReadEnd) {
if (!PR.IsCheckEmpty()) ach = PR.Check();
return (!ach->HasFailed());
}
ReadAssocs (ent,igesdat,PR);
if ((thestep = PR.Stage()) == IGESData_ReadAssocs) PR.NextStage();
if (thestep == IGESData_ReadEnd) {
if (!PR.IsCheckEmpty()) ach = PR.Check();
return (!ach->HasFailed());
}
ReadProps (ent,igesdat,PR);
// thestep = IGESData_ReadEnd;
if (!PR.IsCheckEmpty()) ach = PR.Check();
return (!ach->HasFailed());
}
void IGESData_IGESReaderTool::EndRead
(const Handle(Interface_InterfaceModel)& /* amodel */)
{
/*
DeclareAndCast(IGESData_IGESModel,amod,amodel);
DeclareAndCast(IGESData_IGESReaderData,igesdat,Data());
amod->SetLineWeights(igesdat->DefaultLineWeight());
*/
}
// ###########################################################################
// ######## UNE ENTITE ########
// ######## Directory Part ########
void IGESData_IGESReaderTool::ReadDir
(const Handle(IGESData_IGESEntity)& ent,
const Handle(IGESData_IGESReaderData)& IR,
const IGESData_DirPart& DP, Handle(Interface_Check)& ach) const
{
Standard_Integer v[17];
Standard_Character nom[9]; Standard_Character snum[9], theRes1[9],theRes2[9];
//char mess[50]; //szv#4:S4163:12Mar99 unused
DP.Values(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],
v[12],v[13],v[14],v[15],v[16],theRes1,theRes2,nom,snum);
ent->InitTypeAndForm (v[0] , v[16]);
Handle(IGESData_IGESEntity) fieldent, Structure, fieldlab;
if (v[2] < 0) Structure = GetCasted
(IGESData_IGESEntity, IR->BoundEntity( (1-v[2])/2 ));
Handle(IGESData_LineFontEntity) Lnf;
if (v[3] < 0) {
fieldent = GetCasted(IGESData_IGESEntity, IR->BoundEntity( (1-v[3])/2 ));
Lnf = GetCasted(IGESData_LineFontEntity, fieldent);
if (Lnf.IsNull()) {
// Sending of message : Incorrect Line Font Pattern
Message_Msg Msg29 ("XSTEP_29");
Msg29.Arg(thecnum);
Msg29.Arg(thectyp.Type());
ach->SendWarning(Msg29);
ent->InitDirFieldEntity(4,fieldent);
}
else ent->InitLineFont (Lnf);
}
else ent->InitLineFont(Lnf,v[3]); // ici Lnf Null
Handle(IGESData_LevelListEntity) Lvs;
if (v[4] < 0) {
fieldent = GetCasted(IGESData_IGESEntity, IR->BoundEntity( (1-v[4])/2 ));
Lvs = GetCasted(IGESData_LevelListEntity, fieldent);
if (Lvs.IsNull()) {
// Sending of message : Incorrect Line Font Pattern
Message_Msg Msg30 ("XSTEP_30");
Msg30.Arg(thecnum);
Msg30.Arg(thectyp.Type());
ach->SendWarning(Msg30);
ent->InitDirFieldEntity(5,fieldent);
}
else ent->InitLevel(Lvs,-1);
}
else ent->InitLevel(Lvs,v[4]); // ici Lvs Null
if (v[5] != 0) {
fieldent = GetCasted(IGESData_IGESEntity,IR->BoundEntity( (1+v[5])/2 ));
DeclareAndCast(IGESData_ViewKindEntity,View,fieldent);
if (View.IsNull()) {
// Sending of message : Incorrect View
Message_Msg Msg31 ("XSTEP_31");
Msg31.Arg(thecnum);
Msg31.Arg(thectyp.Type());
ach->SendWarning(Msg31);
ent->InitDirFieldEntity(6,fieldent);
}
else ent->InitView(View);
}
if (v[6] != 0) {
fieldent = GetCasted(IGESData_IGESEntity,IR->BoundEntity( (1+v[6])/2 ));
DeclareAndCast(IGESData_TransfEntity,Transf,fieldent);
if (Transf.IsNull()) {
// Sending of message : Incorrect Transformation Matrix
Message_Msg Msg32 ("XSTEP_32");
Msg32.Arg(thecnum);
Msg32.Arg(thectyp.Type());
ach->SendWarning(Msg32);
ent->InitDirFieldEntity(7,fieldent);
}
else ent->InitTransf(Transf);
}
Handle(IGESData_LabelDisplayEntity) Lbd;
if (v[7] != 0) {
fieldlab = GetCasted(IGESData_IGESEntity,IR->BoundEntity( (1+v[7])/2 ));
Lbd = GetCasted(IGESData_LabelDisplayEntity,fieldent);
if (Lbd.IsNull()) {
// Sending of message : Incorrect Label Display
Message_Msg Msg33 ("XSTEP_33");
Msg33.Arg(thecnum);
Msg33.Arg(thectyp.Type());
ach->SendWarning(Msg33);
}
}
ent->InitStatus (v[8] , v[9] , v[10] , v[11]);
Standard_Integer LWeightNum = v[13];
Handle(IGESData_ColorEntity) Color;
if (v[14] < 0) {
fieldent = GetCasted(IGESData_IGESEntity,IR->BoundEntity( (1-v[14])/2 ));
Color = GetCasted(IGESData_ColorEntity, fieldent);
if (Color.IsNull()) {
// Sending of message : Incorrect Color Number
Message_Msg Msg34 ("XSTEP_34");
Msg34.Arg(thecnum);
Msg34.Arg(thectyp.Type());
ach->SendWarning(Msg34);
ent->InitDirFieldEntity(13,fieldent);
}
else ent->InitColor(Color);
}
else ent->InitColor(Color,v[14]);
ent->InitMisc (Structure,Lbd,LWeightNum);
ent->InitDirFieldEntity(8,fieldlab);
// ignores : 1(type),2(ptrPsect),13(type),16(lignesPsect),17(form)
// type et forme sont lus directement du DirPart; autres infos recalculees
// Restent a analyser nom (short label) et snum (subscript number)
Handle(TCollection_HAsciiString) ShortLabel;
Standard_Integer SubScriptN = -1;
Standard_Integer iacar = 0;
Standard_Integer i; // svv Jan11 2000 : porting on DEC
for (i = 0; i < 8; i ++) { if (nom[i] > ' ') iacar = 1; }
if (iacar > 0) ShortLabel = new TCollection_HAsciiString(nom);
iacar = 0;
for (i = 0; i < 8; i ++)
{ if (snum[i] > ' ') iacar = 1; if(snum[i] == 0) break; }
if (iacar > 0) SubScriptN = atoi(snum);
ent->SetLabel(ShortLabel,SubScriptN);
// Enfin, SetLineWeight, tenant compte du defaut
ent->SetLineWeight (IR->DefaultLineWeight(),themaxweight,thegradweight);
}
// ######## Partie Specifique ########
void IGESData_IGESReaderTool::ReadOwnParams
(const Handle(IGESData_IGESEntity)& ent,
const Handle(IGESData_IGESReaderData)& IR,
IGESData_ParamReader& PR) const
{
Handle(Interface_Check) ach = new Interface_Check;;
Handle(IGESData_ReadWriteModule) module; Standard_Integer CN;
// Les Modules font tout
if (therlib.Select(ent,module,CN))
module->ReadOwnParams(CN,ent,IR,PR);
else if (ent.IsNull()) {
// Pas trouve dutout
// Sending of message : Null Entity
Message_Msg Msg35 ("XSTEP_35");
Msg35.Arg(thecnum);
ach->SendFail(Msg35);
// Cas de UndefinedEntity
} else if (ent->IsKind(STANDARD_TYPE(IGESData_UndefinedEntity))) {
DeclareAndCast(IGESData_UndefinedEntity,undent,ent);
undent->ReadOwnParams(IR,PR);
// IGESEntity creee puis non reconnue ... (bizarre, non ?)
} else {
// IGESData_IGESType DT = ent->IGESType();
// Sending of message : Unknown Entity
Message_Msg Msg36 ("XSTEP_36");
Msg36.Arg(thecnum);
ach->SendFail(Msg36);
}
}
// ######## Proprietes ########
void IGESData_IGESReaderTool::ReadProps
(const Handle(IGESData_IGESEntity)& ent,
const Handle(IGESData_IGESReaderData)& IR,
IGESData_ParamReader& PR) const
{
// MGE 17/06/98
// Building of Messages
//=====================================
Message_Msg Msg38 ("XSTEP_38");
//Message_Msg Msg221 ("XSTEP_221");
//=====================================
Handle(Interface_Check) ach = new Interface_Check;
Msg38.Arg(thecnum);
Msg38.Arg(thectyp.Type());
if (PR.Stage() != IGESData_ReadProps) ach->SendFail(Msg38);
Standard_Integer ncur = PR.CurrentNumber();
Standard_Integer nbp = PR.NbParams();
if (ncur == nbp + 1) { PR.EndAll(); return; }
else if (ncur > nbp || ncur == 0) ach->SendWarning(Msg38);
Standard_Integer nbprops = 0;
if (!PR.DefinedElseSkip()) return;
if (!PR.ReadInteger(ncur,nbprops)) {
Message_Msg Msg221 ("XSTEP_221");
PR.SendFail(Msg221);
return;
}
if (nbprops == 0) return; ncur ++;
Interface_EntityList props;
if (PR.ReadEntList
(IR,PR.CurrentList(nbprops),Msg38, props,Standard_False) )
ent->LoadProperties(props);
}
// ######## Associativites ########
void IGESData_IGESReaderTool::ReadAssocs
(const Handle(IGESData_IGESEntity)& ent,
const Handle(IGESData_IGESReaderData)& IR,
IGESData_ParamReader& PR) const
{
// MGE 17/06/98
// Building of Messages
//=====================================
Message_Msg Msg37 ("XSTEP_37");
// Message_Msg Msg220 ("XSTEP_220");
//=====================================
Msg37.Arg(thecnum);
Msg37.Arg(thectyp.Type());
Handle(Interface_Check) ach = new Interface_Check;
if (PR.Stage() != IGESData_ReadAssocs) ach->SendFail(Msg37);
Standard_Integer ncur = PR.CurrentNumber();
Standard_Integer nbp = PR.NbParams();
if (ncur == nbp + 1) { PR.EndAll(); return; }
else if (ncur > nbp || ncur == 0) ach->SendWarning(Msg37);
Standard_Integer nbassocs = 0;
if (!PR.DefinedElseSkip()) return;
if (!PR.ReadInteger(PR.Current(),nbassocs)){
Message_Msg Msg220 ("XSTEP_220");
PR.SendFail(Msg220);
return;
}
if (nbassocs == 0) return;
Interface_EntityList assocs;
if (PR.ReadEntList
(IR,PR.CurrentList(nbassocs),Msg37, assocs,Standard_False) )
ent->LoadAssociativities(assocs);
}