1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-01 10:26:12 +03:00
occt/src/STEPConstruct/STEPConstruct_ExternRefs.cxx
skl 3b7f55e9d1 0029873: Data Exchange - STEPCAFControl_Reader::Transfer() returns TRUE even when external files are missing
Output information about failure during reading of external file has been added (it can be checked by using Draw command "tpstat").
If the reader cannot find an external file at the first found location
(using entity APPLIED_EXTERNAL_IDENTIFICATION_ASSIGNMENT) it checks other information about file path
(using entity DOCUMENT_FILE related with the above-mentioned entity) and uses a new location for import of the external file.
2018-07-13 16:38:07 +03:00

934 lines
40 KiB
C++

// Created on: 2000-09-29
// Created by: Andrey BETENEV
// Copyright (c) 2000-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 <Interface_EntityIterator.hxx>
#include <StepAP203_ApprovedItem.hxx>
#include <StepAP203_CcDesignApproval.hxx>
#include <StepAP203_CcDesignDateAndTimeAssignment.hxx>
#include <StepAP203_CcDesignPersonAndOrganizationAssignment.hxx>
#include <StepAP203_DateTimeItem.hxx>
#include <StepAP203_HArray1OfApprovedItem.hxx>
#include <StepAP203_HArray1OfDateTimeItem.hxx>
#include <StepAP203_HArray1OfPersonOrganizationItem.hxx>
#include <StepAP203_PersonOrganizationItem.hxx>
#include <StepAP214_AppliedDocumentReference.hxx>
#include <StepAP214_AppliedExternalIdentificationAssignment.hxx>
#include <StepAP214_ExternalIdentificationItem.hxx>
#include <StepAP214_HArray1OfDocumentReferenceItem.hxx>
#include <StepAP214_HArray1OfExternalIdentificationItem.hxx>
#include <StepBasic_ApplicationContext.hxx>
#include <StepBasic_ApplicationProtocolDefinition.hxx>
#include <StepBasic_Document.hxx>
#include <StepBasic_DocumentFile.hxx>
#include <StepBasic_DocumentProductEquivalence.hxx>
#include <StepBasic_DocumentRepresentationType.hxx>
#include <StepBasic_DocumentType.hxx>
#include <StepBasic_ExternalSource.hxx>
#include <StepBasic_HArray1OfDocument.hxx>
#include <StepBasic_HArray1OfProduct.hxx>
#include <StepBasic_HArray1OfProductContext.hxx>
#include <StepBasic_IdentificationRole.hxx>
#include <StepBasic_ObjectRole.hxx>
#include <StepBasic_Product.hxx>
#include <StepBasic_ProductContext.hxx>
#include <StepBasic_ProductDefinition.hxx>
#include <StepBasic_ProductDefinitionContext.hxx>
#include <StepBasic_ProductDefinitionFormation.hxx>
#include <StepBasic_ProductDefinitionWithAssociatedDocuments.hxx>
#include <StepBasic_ProductOrFormationOrDefinition.hxx>
#include <StepBasic_ProductRelatedProductCategory.hxx>
#include <StepBasic_RoleAssociation.hxx>
#include <StepBasic_SourceItem.hxx>
#include <STEPConstruct_ExternRefs.hxx>
#include <StepData_SelectNamed.hxx>
#include <StepRepr_CharacterizedDefinition.hxx>
#include <StepRepr_DescriptiveRepresentationItem.hxx>
#include <StepRepr_HArray1OfRepresentationItem.hxx>
#include <StepRepr_NextAssemblyUsageOccurrence.hxx>
#include <StepRepr_ProductDefinitionShape.hxx>
#include <StepRepr_PropertyDefinition.hxx>
#include <StepRepr_PropertyDefinitionRepresentation.hxx>
#include <StepRepr_RepresentationContext.hxx>
#include <StepRepr_RepresentedDefinition.hxx>
#include <StepShape_ShapeRepresentation.hxx>
#include <TCollection_HAsciiString.hxx>
#include <XSControl_WorkSession.hxx>
#include <XSControl_TransferReader.hxx>
#include <OSD_File.hxx>
#include <OSD_Path.hxx>
//=======================================================================
//function : STEPConstruct_ExternRefs
//purpose :
//=======================================================================
STEPConstruct_ExternRefs::STEPConstruct_ExternRefs ()
{
}
//=======================================================================
//function : STEPConstruct_ExternRefs
//purpose :
//=======================================================================
STEPConstruct_ExternRefs::STEPConstruct_ExternRefs (const Handle(XSControl_WorkSession) &WS)
: STEPConstruct_Tool ( WS )
{
}
//=======================================================================
//function : Init
//purpose :
//=======================================================================
Standard_Boolean STEPConstruct_ExternRefs::Init (const Handle(XSControl_WorkSession) &WS)
{
Clear();
return SetWS ( WS );
}
//=======================================================================
//function : Clear
//purpose :
//=======================================================================
void STEPConstruct_ExternRefs::Clear ()
{
myAEIAs.Clear();
myRoles.Clear();
myFormats.Clear();
myShapes.Clear();
myTypes.Clear();
myIsAP214.Clear();
// PTV 30.01.2003 TRJ11
myDocFiles.Clear();
mySharedPRPC.Nullify();
mySharedDocType.Nullify();
mySharedPDC.Nullify();
mySharedPC.Nullify();
myAPD.Nullify();
}
//=======================================================================
//function : LoadExternRefs
//purpose :
//=======================================================================
static Standard_Boolean findPDWADandExcludeExcess (Handle(StepAP214_AppliedDocumentReference)& ADR,
TColStd_SequenceOfTransient& aSeqOfPDWAD,
const Interface_Graph& Graph,
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments)& aPDWAD)
{
// WARNING! do not add check for aSeqOfPDWAD.Length() and exit if it < 1,
// because this methods invokes with an empty sequence too to find PDWAD by ADR
Interface_EntityIterator subsADR = Graph.Shareds(ADR);
for ( subsADR.Start(); subsADR.More(); subsADR.Next() ) {
if ( !subsADR.Value()->IsKind (STANDARD_TYPE(StepBasic_Document)) )
continue;
Handle(StepBasic_Document) aDoc = Handle(StepBasic_Document)::DownCast(subsADR.Value());
// looking for Document Product Equivalence
Interface_EntityIterator subsD = Graph.Sharings(aDoc);
for ( subsD.Start(); subsD.More(); subsD.Next() ) {
if ( !subsD.Value()->IsKind (STANDARD_TYPE(StepBasic_DocumentProductEquivalence)) )
continue;
Handle(StepBasic_DocumentProductEquivalence) aDPE =
Handle(StepBasic_DocumentProductEquivalence)::DownCast(subsD.Value());
// take PDF and search the same PDF by PDWAD chain
Interface_EntityIterator subsDPE = Graph.Shareds(aDPE);
for ( subsDPE.Start(); subsDPE.More(); subsDPE.Next() ) {
if ( !subsDPE.Value()->IsKind (STANDARD_TYPE(StepBasic_ProductDefinitionFormation)) )
continue;
Handle(StepBasic_ProductDefinitionFormation) aPDF =
Handle(StepBasic_ProductDefinitionFormation)::DownCast(subsDPE.Value());
Interface_EntityIterator subs = Graph.Sharings(aPDF);
for ( subs.Start(); subs.More(); subs.Next() ) {
if ( !subs.Value()->IsKind (STANDARD_TYPE(StepBasic_ProductDefinitionWithAssociatedDocuments)) )
continue;
aPDWAD = Handle(StepBasic_ProductDefinitionWithAssociatedDocuments)::DownCast(subs.Value());
}
// now searching for PDWAD that refer to the same PDF
for (Standard_Integer pdwadi = 1; pdwadi <= aSeqOfPDWAD.Length(); pdwadi++) {
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments) aCurPDWAD =
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments)::DownCast(aSeqOfPDWAD(pdwadi));
if ( !aCurPDWAD.IsNull() && aPDWAD == aCurPDWAD ) {
// found the same Product Definition Formation
aSeqOfPDWAD.Remove( pdwadi );
return Standard_True;
}
}
} // end of looking for PDF by ADR chain
} // end of looking for DPE
} // end iterations on Shareds(ADR)
return Standard_False;
}
Standard_Boolean STEPConstruct_ExternRefs::LoadExternRefs ()
{
// iterate on entities in the model and find AEIAs
// or PDWADs (for AP203)
Handle(Interface_InterfaceModel) model = Model();
Handle(Standard_Type) tADR = STANDARD_TYPE(StepAP214_AppliedDocumentReference);
Handle(Standard_Type) tPDWAD = STANDARD_TYPE(StepBasic_ProductDefinitionWithAssociatedDocuments);
Standard_Integer nb = model->NbEntities();
// PTV 28.01.2003 CAX-IF TRJ11, file ext_ref_master.stp
// search all ADR and PDWAD and exclude excess PDWADs
TColStd_SequenceOfTransient aSeqOfADR, aSeqOfPDWAD;
for (Standard_Integer ient = 1; ient <= nb; ient ++) {
Handle(Standard_Transient) enti = model->Value(ient);
if ( enti->DynamicType() == tPDWAD )
aSeqOfPDWAD.Append( enti );
else if ( enti->DynamicType() == tADR )
aSeqOfADR.Append( enti );
}
Standard_Integer IsAP214 = 0;
// run on sequence aSeqOfADR of ADR and remove excess PDWAD from aSeqOfPDWAD
for (Standard_Integer adri = 1; adri <= aSeqOfADR.Length(); adri++) {
Handle(StepAP214_AppliedDocumentReference) ADR =
Handle(StepAP214_AppliedDocumentReference)::DownCast(aSeqOfADR.Value(adri));
// looking for Product Definition Formation and exlude excess PDWAD from aSeqOfPDWAD
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments) aPDWAD;
findPDWADandExcludeExcess( ADR, aSeqOfPDWAD, Graph(), aPDWAD );
// now add all necessary information as original implementation.
IsAP214 = 1;
Handle(StepBasic_RoleAssociation) Role;
Handle(StepBasic_ProductDefinition) Shape;
Handle(StepRepr_PropertyDefinitionRepresentation) Format;
Handle(StepBasic_DocumentRepresentationType) Type;
// AppliedDocumentReference with RoleAssociation...
Interface_EntityIterator subs4 = Graph().Sharings(ADR);
for (subs4.Start(); subs4.More(); subs4.Next()) {
if ( subs4.Value()->IsKind ( STANDARD_TYPE(StepBasic_RoleAssociation) ) )
Role = Handle(StepBasic_RoleAssociation)::DownCast(subs4.Value());
}
subs4 = Graph().Shareds(ADR);
for (subs4.Start(); subs4.More(); subs4.Next()) {
if ( subs4.Value()->IsKind ( STANDARD_TYPE(StepBasic_ProductDefinition) ) )
Shape = Handle(StepBasic_ProductDefinition)::DownCast(subs4.Value());
}
// search for Document file
Handle(StepBasic_DocumentFile) DocFile;
if ( aPDWAD.IsNull() ) { // shoudnot be begin from TRJ11
// lookinf from ADR
subs4 = Graph().Shareds(ADR);
} else
// looking from PDWAD
subs4 = Graph().Shareds(aPDWAD);
for (subs4.Start(); subs4.More(); subs4.Next()) {
if ( !subs4.Value()->IsKind ( STANDARD_TYPE(StepBasic_DocumentFile) ) )
continue;
DocFile = Handle(StepBasic_DocumentFile)::DownCast(subs4.Value());
if ( DocFile.IsNull() )
continue;
// for each DocumentFile, find associated with it data:
Interface_EntityIterator subs = Graph().Sharings(DocFile);
for (subs.Start(); subs.More(); subs.Next()) {
Handle(Standard_Transient) sub = subs.Value();
// FORMAT - ???????
//
// PDRs of a shape and of a file format
if ( sub->IsKind ( STANDARD_TYPE(StepRepr_PropertyDefinition) ) ) {
Handle(StepRepr_PropertyDefinition) PD = Handle(StepRepr_PropertyDefinition)::DownCast(sub);
Interface_EntityIterator subs2 = Graph().Sharings(PD);
for (subs2.Start(); subs2.More(); subs2.Next()) {
Handle(StepRepr_PropertyDefinitionRepresentation) PDR =
Handle(StepRepr_PropertyDefinitionRepresentation)::DownCast(subs2.Value());
if ( PDR.IsNull() ) continue;
if ( PDR->UsedRepresentation()->IsKind(STANDARD_TYPE(StepShape_ShapeRepresentation)) )
Format = PDR;
}
}
// DocumentRepresentationType
if ( sub->IsKind ( STANDARD_TYPE(StepBasic_DocumentRepresentationType) ) ) {
Type = Handle(StepBasic_DocumentRepresentationType)::DownCast(sub);
}
if ( !Type.IsNull() && !Format.IsNull() )
break;
}
if ( !Type.IsNull() && !Format.IsNull() )
break;
}
if ( DocFile.IsNull() )
continue;
myAEIAs.Append ( ADR );
myRoles.Append ( Role );
myFormats.Append ( Format );
myShapes.Append ( Shape );
myTypes.Append ( Type );
myIsAP214.Append ( IsAP214 );
myDocFiles.Append( DocFile );
} // end iterations on aSeqOfADR
// now iterates on sequence aSeqOfPDWAD of Product Definition With Associated Documents
for (Standard_Integer pdwadi = 1; pdwadi <= aSeqOfPDWAD.Length(); pdwadi++) {
IsAP214 = 0;
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments) aPDWAD =
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments)::DownCast(aSeqOfPDWAD(pdwadi));
myShapes.Append(aPDWAD);
myIsAP214.Append ( IsAP214 );
Handle(StepAP214_AppliedExternalIdentificationAssignment) AEIA;
Handle(StepBasic_RoleAssociation) Role;
Handle(StepRepr_PropertyDefinitionRepresentation) Format;
Handle(StepBasic_DocumentRepresentationType) Type;
Handle(StepBasic_DocumentFile) DocFile;
myAEIAs.Append ( AEIA );
myRoles.Append ( Role );
myFormats.Append ( Format );
myTypes.Append ( Type );
myDocFiles.Append( DocFile );
}
return myShapes.Length() >0;
}
//=======================================================================
//function : NbExternRefs
//purpose :
//=======================================================================
Standard_Integer STEPConstruct_ExternRefs::NbExternRefs () const
{
return myShapes.Length();
}
//=======================================================================
//function : FileName
//purpose :
//=======================================================================
Standard_CString STEPConstruct_ExternRefs::FileName (const Standard_Integer num) const
{
Handle(StepBasic_DocumentFile) DocFile;
Handle(StepAP214_AppliedExternalIdentificationAssignment) AEIA;
Standard_CString aCStringFileName = 0;
if ( myDocFiles.Length() >= num && !myDocFiles.Value(num).IsNull() )
DocFile = Handle(StepBasic_DocumentFile)::DownCast(myDocFiles.Value( num ));
else if (myIsAP214(num)==1)
{
Handle(StepAP214_AppliedDocumentReference) ADR =
Handle(StepAP214_AppliedDocumentReference)::DownCast ( myAEIAs(num) );
// PTV 28.01.2003 CAX-IF TRJ11, file ext_ref_master.stp
// serach document file name by long chain ADR->D<-DPE->PDF<-PDWAD->DF
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments) aPDWAD;
// create an empty aSeqOfPDWAD
TColStd_SequenceOfTransient aSeqOfPDWAD;
// we do not need to exclude, just find PDWAD
findPDWADandExcludeExcess( ADR, aSeqOfPDWAD, Graph(), aPDWAD );
// search for Document file
Interface_EntityIterator subs4;
if ( aPDWAD.IsNull() ) { // shoudnot be begin from TRJ11
// lookinf from ADR
subs4 = Graph().Shareds(ADR);
} else
// looking from PDWAD
subs4 = Graph().Shareds(aPDWAD);
for (subs4.Start(); subs4.More(); subs4.Next()) {
if ( !subs4.Value()->IsKind ( STANDARD_TYPE(StepBasic_DocumentFile) ) )
continue;
DocFile = Handle(StepBasic_DocumentFile)::DownCast(subs4.Value());
if ( DocFile.IsNull() ) continue;
}
}
else {
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments) aPDWAD =
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments)::DownCast(myShapes(num));
if ( aPDWAD.IsNull() || aPDWAD->DocIds().IsNull() )
return "";
Standard_Integer i;
for ( i=1; i <= aPDWAD->NbDocIds(); i++ ) {
Handle(StepBasic_Document) Doc = aPDWAD->DocIdsValue(i);
Handle(TCollection_HAsciiString) aFilename = Doc->Name();
if (!aFilename.IsNull() && !aFilename->IsEmpty()) return aFilename->ToCString();
}
return "";
}
// take name from AEIA and from DF
if(!DocFile.IsNull()) {
Interface_EntityIterator subs3 = Graph().Sharings(DocFile);
for (subs3.Start(); subs3.More(); subs3.Next()) {
if (subs3.Value()->IsKind(STANDARD_TYPE(StepAP214_AppliedExternalIdentificationAssignment))) {
AEIA = Handle(StepAP214_AppliedExternalIdentificationAssignment)::DownCast(subs3.Value());
if (!AEIA.IsNull())
break;
}
}
}
if(!AEIA.IsNull()) {
Handle(TCollection_HAsciiString) aFilename;
aFilename = AEIA->AssignedId();
if (!aFilename.IsNull() && !aFilename->IsEmpty()) {
aCStringFileName = aFilename->ToCString();
// ptv 29.01.2003 file trj4_xr1-tc-214.stp entity #71 have id "#71"
if ( aCStringFileName && aCStringFileName[0] == '#')
aCStringFileName = 0;
}
if ( ! aCStringFileName || ! aCStringFileName[0] ) {
// try to take name from external source
Handle(StepBasic_ExternalSource) theSource = AEIA->Source();
if (!theSource.IsNull()) {
StepBasic_SourceItem theSourceId = theSource->SourceId();
if (!theSourceId.IsNull()) {
Handle(StepData_SelectNamed) theFileName;
theFileName = Handle(StepData_SelectNamed)::DownCast (theSourceId.Value());
if (theFileName.IsNull() || theFileName->Kind()!=6 ) {
// nothing to do, hope could take name later.
}
else
aCStringFileName = theFileName->String();
}
}
}
}
Standard_CString oldFileName = 0;
// compute true path to the extern file
OSD_Path mainfile(WS()->LoadedFile());
mainfile.SetName("");
mainfile.SetExtension("");
TCollection_AsciiString dpath;
mainfile.SystemName(dpath);
if (aCStringFileName && aCStringFileName[0]) {
TCollection_AsciiString fullname = OSD_Path::AbsolutePath(dpath, aCStringFileName);
if (fullname.Length() <= 0) fullname = aCStringFileName;
if (!OSD_File(fullname).Exists()) {
oldFileName = aCStringFileName;
aCStringFileName = 0;
}
}
if (!aCStringFileName || !aCStringFileName[0]) {
// try to find name of the directory from DocFile
if ( !DocFile.IsNull() ) {
Handle(TCollection_HAsciiString) aFilename = DocFile->Id();
if (!aFilename.IsNull() && !aFilename->IsEmpty())
aCStringFileName = aFilename->ToCString();
if ( ! aCStringFileName || ! aCStringFileName[0] ) {
aFilename = DocFile->Name();
if (!aFilename.IsNull() && !aFilename->IsEmpty())
aCStringFileName = aFilename->ToCString();
}
if ( ! aCStringFileName || ! aCStringFileName[0] ) {
if (oldFileName) {
aCStringFileName = oldFileName;
}
else {
return "";
}
}
}
}
TCollection_AsciiString fullname = OSD_Path::AbsolutePath(dpath, aCStringFileName);
if (fullname.Length() <= 0) fullname = aCStringFileName;
if (!OSD_File(fullname).Exists()) {
if (oldFileName) {
aCStringFileName = oldFileName;
}
Handle(Transfer_TransientProcess) aTP = WS()->TransferReader()->TransientProcess();
TCollection_AsciiString aMess("Can not read external file ");
aMess.AssignCat(aCStringFileName);
aTP->AddFail(DocFile, aMess.ToCString());
}
else {
if (oldFileName && strcmp(oldFileName, aCStringFileName) != 0) {
Handle(Transfer_TransientProcess) aTP = WS()->TransferReader()->TransientProcess();
TCollection_AsciiString aMess("External file with name from entity AEIA (");
aMess.AssignCat(oldFileName);
aMess.AssignCat(") not existed => use file name from DocumentFile entity - ");
aMess.AssignCat(aCStringFileName);
aTP->AddWarning(DocFile, aMess.ToCString());
}
}
return aCStringFileName;
}
//=======================================================================
//function : ProdDef
//purpose :
//=======================================================================
Handle(StepBasic_ProductDefinition) STEPConstruct_ExternRefs::ProdDef (const Standard_Integer num) const
{
return Handle(StepBasic_ProductDefinition)::DownCast( myShapes(num) );
}
//=======================================================================
//function : Format
//purpose :
//=======================================================================
Handle(TCollection_HAsciiString) STEPConstruct_ExternRefs::Format (const Standard_Integer num) const
{
Handle(TCollection_HAsciiString) Format;
if (myIsAP214(num)==0) return Format;
Handle(StepRepr_PropertyDefinitionRepresentation) PDR =
Handle(StepRepr_PropertyDefinitionRepresentation)::DownCast ( myFormats(num) );
if (PDR.IsNull()) return Format;
Handle(StepRepr_Representation) rep = PDR->UsedRepresentation();
for ( Standard_Integer i=1; i <= rep->NbItems(); i++ ) {
if ( rep->ItemsValue(i)->IsKind ( STANDARD_TYPE(StepRepr_DescriptiveRepresentationItem) ) ) {
Handle(StepRepr_DescriptiveRepresentationItem) DRI =
Handle(StepRepr_DescriptiveRepresentationItem)::DownCast ( rep->ItemsValue(i) );
Format = DRI->Description();
break;
}
}
return Format;
}
//=======================================================================
//function : AddExternRef
//purpose :
//=======================================================================
Standard_Integer STEPConstruct_ExternRefs::AddExternRef (const Standard_CString filename,
const Handle(StepBasic_ProductDefinition) &PD,
const Standard_CString format)
{
Handle(TCollection_HAsciiString) EmptyString = new TCollection_HAsciiString("");
Handle(TCollection_HAsciiString) fmt = new TCollection_HAsciiString(format);
Handle(TCollection_HAsciiString) tmp = new TCollection_HAsciiString("203");
Standard_Integer np = fmt->Location(tmp,1,fmt->Length());
// if( !(fmt==tmp) ) {
if( !(np>0) ) {
// create core entity DocumentFile
Handle(StepBasic_DocumentType) DT = new StepBasic_DocumentType;
DT->Init(EmptyString);
Handle(TCollection_HAsciiString) DFid = new TCollection_HAsciiString(filename);
// PTV 30.01.2003 TRJ11 - copy external filename as is
// DFid->AssignCat ( " file id" );
Handle(StepBasic_DocumentFile) DF = new StepBasic_DocumentFile;
DF->Init(DFid, EmptyString, Standard_False, EmptyString, DT, EmptyString, Standard_False, EmptyString);
// create AppliedExternalIdentificationAssignment et al
Handle(StepBasic_IdentificationRole) IR = new StepBasic_IdentificationRole;
// PTV 30.01.2003 TRJ11
// - set the ("external document id and location", $) without unmeaning description
Handle(TCollection_HAsciiString) aName =
new TCollection_HAsciiString("external document id and location");
IR->SetName( aName );
// Handle(TCollection_HAsciiString) aIRdescr = new TCollection_HAsciiString("source system");
// IR->Init(aName, Standard_True, aIRdescr);
Handle(StepData_SelectNamed) SDS = new StepData_SelectNamed;
SDS->SetString ( filename );
SDS->SetName("IDENTIFIER");
StepBasic_SourceItem SID;
SID.SetValue(SDS);
Handle(StepBasic_ExternalSource) ES = new StepBasic_ExternalSource;
ES->Init(SID);
StepAP214_ExternalIdentificationItem Item;
Item.SetValue(DF);
Handle(StepAP214_HArray1OfExternalIdentificationItem) Items =
new StepAP214_HArray1OfExternalIdentificationItem(1,1);
Items->SetValue(1, Item);
Handle(StepAP214_AppliedExternalIdentificationAssignment) ExtIdent =
new StepAP214_AppliedExternalIdentificationAssignment;
// ExtIdent->Init(EmptyString, IR, ES, Items);
// PTV 30.01.2003 TRJ11 - store filename in AEIA
Handle(TCollection_HAsciiString) aFName = new TCollection_HAsciiString(filename);
ExtIdent->Init(aFName, IR, ES, Items);
// create DocumentRepresentationType
Handle(TCollection_HAsciiString) Dig = new TCollection_HAsciiString("digital");
Handle(StepBasic_DocumentRepresentationType) Type = new StepBasic_DocumentRepresentationType;
Type->Init(Dig, DF);
// create AppliedDocumentReference,
Handle(StepAP214_AppliedDocumentReference) ADR = new StepAP214_AppliedDocumentReference;
// PTV 30.01.2003 TRJ11 - create additional entities for AP214
addAP214ExterRef( ADR, PD, DF, filename );
// create RoleAssociation etc.
Handle(StepBasic_ObjectRole) OR = new StepBasic_ObjectRole;
Handle(TCollection_HAsciiString) mandatory = new TCollection_HAsciiString("mandatory");
OR->Init(mandatory, Standard_False, EmptyString);
StepBasic_RoleSelect RS;
RS.SetValue(ADR);
Handle(StepBasic_RoleAssociation) Role = new StepBasic_RoleAssociation;
Role->Init(OR, RS);
// create PDR for association with SR
StepRepr_CharacterizedDefinition CD;
CD.SetValue(DF);
Handle(TCollection_HAsciiString) PDname = new TCollection_HAsciiString("external definition");
Handle(StepRepr_PropertyDefinition) PropD = new StepRepr_PropertyDefinition;
PropD->Init(PDname, Standard_True, EmptyString, CD);
StepRepr_RepresentedDefinition RD;
RD.SetValue(PropD);
// Handle(StepRepr_PropertyDefinitionRepresentation) PDRshape = new StepRepr_PropertyDefinitionRepresentation;
// PDRshape->Init ( RD, SDR->UsedRepresentation() );
// create PDR for definition of document format (if defined)
Handle(StepRepr_PropertyDefinitionRepresentation) PDRformat;
if ( format && format[0] ) {
Handle(TCollection_HAsciiString) RCftype = new TCollection_HAsciiString ( "document parameters" );
Handle(StepRepr_RepresentationContext) RCf = new StepRepr_RepresentationContext;
RCf->Init ( EmptyString, RCftype );
Handle(TCollection_HAsciiString) DRIname = new TCollection_HAsciiString ( "data format" );
Handle(TCollection_HAsciiString) DRIdscr = new TCollection_HAsciiString ( format );
Handle(StepRepr_DescriptiveRepresentationItem) DRI = new StepRepr_DescriptiveRepresentationItem;
DRI->Init ( DRIname, DRIdscr );
Handle(StepRepr_HArray1OfRepresentationItem) fItems = new StepRepr_HArray1OfRepresentationItem(1,1);
fItems->SetValue ( 1, DRI );
Handle(TCollection_HAsciiString) SRfname = new TCollection_HAsciiString ( "document format" );
Handle(StepRepr_Representation) SRformat = new StepRepr_Representation;
SRformat->Init(SRfname, fItems, RCf);
StepRepr_CharacterizedDefinition CDf;
CDf.SetValue(DF);
Handle(TCollection_HAsciiString) PDfname = new TCollection_HAsciiString("document property");
Handle(StepRepr_PropertyDefinition) PDf = new StepRepr_PropertyDefinition;
PDf->Init(PDfname, Standard_True, EmptyString, CDf);
StepRepr_RepresentedDefinition RDf;
RDf.SetValue(PDf);
PDRformat = new StepRepr_PropertyDefinitionRepresentation;
PDRformat->Init ( RDf, SRformat );
}
// add all the created root entities to sequences
myAEIAs.Append ( ExtIdent ); //StepAP214_AppliedExternalIdentificationAssignment
myRoles.Append ( Role ); //StepBasic_RoleAssociation
myFormats.Append ( PDRformat ); //StepRepr_PropertyDefinitionRepresentation
// myShapes.Append ( PDRshape ); //StepRepr_PropertyDefinitionRepresentation
myShapes.Append ( PD ); //StepBasic_ProductDefinition
myTypes.Append ( Type ); //StepBasic_DocumentRepresentationType
}
else { // format=="AP203"
// StepRepr_RepresentedDefinition aRD = SDR->Definition();
// Handle(StepRepr_PropertyDefinition) aPD = aRD.PropertyDefinition();
// StepRepr_CharacterizedDefinition aCD = aPD->Definition();
// Handle(StepBasic_ProductDefinition) aProdDef = aCD.ProductDefinition();
Handle(StepBasic_ProductDefinitionFormation) ProdDefForm = PD->Formation();
Handle(StepBasic_ProductDefinitionContext) ProdDefCont = PD->FrameOfReference();
// create document
Handle(TCollection_HAsciiString) fname = new TCollection_HAsciiString(filename);
Handle(StepBasic_DocumentType) aDocType = new StepBasic_DocumentType;
Handle(TCollection_HAsciiString) aDT = new TCollection_HAsciiString("cad_filename");
aDocType->Init(aDT);
Handle(StepBasic_Document) aDoc = new StepBasic_Document;
Handle(TCollection_HAsciiString) aDescription =
new TCollection_HAsciiString("CAD Model associated to the part");
aDoc->Init(EmptyString,fname,Standard_True,aDescription,aDocType);
Handle(StepBasic_HArray1OfDocument) aDocIds = new StepBasic_HArray1OfDocument(1,1);
aDocIds->SetValue(1,aDoc);
// create ProductDefinitionWithAssociatedDocuments
aDescription = PD->Description();
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments) PDWAD =
new StepBasic_ProductDefinitionWithAssociatedDocuments;
PDWAD->Init(EmptyString,aDescription,ProdDefForm,ProdDefCont,aDocIds);
//Handle(StepBasic_ProductDefinitionWithAssociatedDocuments) PDWAD =
// Handle(StepBasic_ProductDefinitionWithAssociatedDocuments)::DownCast(PD);
// searh in graph for replace
// Standard_Integer numProdDef;
// Interface_EntityIterator subs = Graph().Shareds(SDR);
// for (subs.Start(); subs.More(); subs.Next()) {
// Handle(Standard_Transient) sub = subs.Value();
Interface_EntityIterator subs = Graph().Sharings(PD);
for (subs.Start(); subs.More(); subs.Next()) {
Handle(Standard_Transient) sub = subs.Value();
if (!sub->IsKind(STANDARD_TYPE(StepRepr_ProductDefinitionShape))) continue;
Handle(StepRepr_ProductDefinitionShape) ProdDefSh =
Handle(StepRepr_ProductDefinitionShape)::DownCast ( sub );
if(ProdDefSh.IsNull()) continue;
StepRepr_CharacterizedDefinition CDf;
CDf.SetValue(PDWAD);
ProdDefSh->SetDefinition(CDf);
}
// Interface_EntityIterator subs1 = Graph().Shareds(ProdDefSh);
// for (subs1.Start(); subs1.More(); subs1.Next()) {
// Handle(Standard_Transient) sub1 = subs1.Value();
// if (!sub1->IsKind(STANDARD_TYPE(StepBasic_ProductDefinition))) continue;
// Handle(StepBasic_ProductDefinition) ProdDef =
// Handle(StepBasic_ProductDefinition)::DownCast ( sub1 );
// numProdDef = Model()->Number(ProdDef);
Standard_Integer numProdDef = Model()->Number(PD);
// Interface_EntityIterator subs2 = Graph().Sharings(ProdDef);
Interface_EntityIterator subs2 = Graph().Sharings(PD);
for (subs2.Start(); subs2.More(); subs2.Next()) {
Handle(Standard_Transient) sub2 = subs2.Value();
if (sub2->IsKind(STANDARD_TYPE(StepRepr_NextAssemblyUsageOccurrence))) {
Handle(StepRepr_NextAssemblyUsageOccurrence) NAUO =
Handle(StepRepr_NextAssemblyUsageOccurrence)::DownCast ( sub2 );
NAUO->SetRelatedProductDefinition(PDWAD);
}
if (sub2->IsKind(STANDARD_TYPE(StepAP203_CcDesignPersonAndOrganizationAssignment))) {
Handle(StepAP203_CcDesignPersonAndOrganizationAssignment) CDPAOA =
Handle(StepAP203_CcDesignPersonAndOrganizationAssignment)::DownCast ( sub2 );
Handle(StepAP203_HArray1OfPersonOrganizationItem) HAPOI = CDPAOA->Items();
for(Standard_Integer i=1; i<=HAPOI->Length(); i++) {
StepAP203_PersonOrganizationItem POI = HAPOI->Value(i);
Handle(StepBasic_ProductDefinition) PDtmp = POI.ProductDefinition();
Standard_Integer numPDtmp = Model()->Number(PDtmp);
if(numProdDef==numPDtmp) {
POI.SetValue(PDWAD);
HAPOI->SetValue(i,POI);
}
}
}
if (sub2->IsKind(STANDARD_TYPE(StepAP203_CcDesignDateAndTimeAssignment))) {
Handle(StepAP203_CcDesignDateAndTimeAssignment) CDDATA =
Handle(StepAP203_CcDesignDateAndTimeAssignment)::DownCast ( sub2 );
Handle(StepAP203_HArray1OfDateTimeItem) HADTI = CDDATA->Items();
for(Standard_Integer i=1; i<=HADTI->Length(); i++) {
StepAP203_DateTimeItem DTI = HADTI->Value(i);
Handle(StepBasic_ProductDefinition) PDtmp = DTI.ProductDefinition();
Standard_Integer numPDtmp = Model()->Number(PDtmp);
if(numProdDef==numPDtmp) {
DTI.SetValue(PDWAD);
HADTI->SetValue(i,DTI);
}
}
}
if (sub2->IsKind(STANDARD_TYPE(StepAP203_CcDesignApproval))) {
Handle(StepAP203_CcDesignApproval) CDA =
Handle(StepAP203_CcDesignApproval)::DownCast ( sub2 );
Handle(StepAP203_HArray1OfApprovedItem) HAAI = CDA->Items();
for(Standard_Integer i=1; i<=HAAI->Length(); i++) {
StepAP203_ApprovedItem AI = HAAI->Value(i);
Handle(StepBasic_ProductDefinition) PDtmp = AI.ProductDefinition();
Standard_Integer numPDtmp = Model()->Number(PDtmp);
if(numProdDef==numPDtmp) {
AI.SetValue(PDWAD);
HAAI->SetValue(i,AI);
}
}
}
}
// }
//
// StepRepr_CharacterizedDefinition ChartDef;
// ChartDef.SetValue(PDWAD);
// ProdDefSh->SetDefinition(ChartDef);
// }
myAEIAs.Append ( PDWAD );
myReplaceNum.Append(numProdDef);
myRoles.Append ( aDoc );
myTypes.Append ( aDocType );
}
return myAEIAs.Length();
}
//=======================================================================
//function : WriteExternRefs
//purpose :
//=======================================================================
Standard_Integer STEPConstruct_ExternRefs::WriteExternRefs (const Standard_Integer num) const
{
if(num==3) {
for ( Standard_Integer i=1; i <= myAEIAs.Length(); i++ ) {
Model()->ReplaceEntity(myReplaceNum(i),myAEIAs(i));
if ( ! myRoles(i).IsNull() )
Model()->AddWithRefs ( myRoles(i) );
if ( ! myTypes(i).IsNull() )
Model()->AddWithRefs ( myTypes(i) );
}
}
else {
for ( Standard_Integer i=1; i <= myAEIAs.Length(); i++ ) {
Model()->AddWithRefs ( myAEIAs(i) );
if ( ! myRoles(i).IsNull() )
Model()->AddWithRefs ( myRoles(i) );
if ( ! myFormats(i).IsNull() )
Model()->AddWithRefs ( myFormats(i) );
if ( ! myShapes(i).IsNull() )
Model()->AddWithRefs ( myShapes(i) );
if ( ! myTypes(i).IsNull() )
Model()->AddWithRefs ( myTypes(i) );
}
}
// PTV 30.01.2003 TRJ11
if ( !myAPD.IsNull() )
Model()->AddWithRefs( myAPD );
if ( !mySharedPRPC.IsNull() )
Model()->AddWithRefs( mySharedPRPC );
return myAEIAs.Length();
}
//=======================================================================
//function : addAP214ExterRef
//purpose : PTV 30.01.2003 TRJ11
//=======================================================================
Standard_Boolean STEPConstruct_ExternRefs::addAP214ExterRef (const Handle(StepAP214_AppliedDocumentReference)& ADR,
const Handle(StepBasic_ProductDefinition)& PD,
const Handle(StepBasic_DocumentFile)& DF,
const Standard_CString filename )
{
Handle(StepAP214_HArray1OfDocumentReferenceItem) DRIs = new StepAP214_HArray1OfDocumentReferenceItem(1,1);
StepAP214_DocumentReferenceItem aDRI;
aDRI.SetValue(PD);
DRIs->SetValue(1, aDRI);
Handle(TCollection_HAsciiString) EmptyString = new TCollection_HAsciiString("");
// create/get created shared entities:
// DocumentType, ProductDefinitionContext, ProductRelatedProductCategory, ProductContext
checkAP214Shared();
// create document
Handle(StepBasic_Document) aDocument = new StepBasic_Document;
aDocument->Init( EmptyString, EmptyString, Standard_False, EmptyString, mySharedDocType );
ADR->Init(aDocument, EmptyString, DRIs);
// create new product
Handle(StepBasic_Product) Product = new StepBasic_Product;
Handle(StepBasic_HArray1OfProduct) HProducts = mySharedPRPC->Products();
Standard_Integer nbProducts = 0;
if (!HProducts.IsNull())
nbProducts = HProducts->Length();
Standard_Integer intProdId = 20001 + nbProducts;
Handle(TCollection_HAsciiString) ProductID = new TCollection_HAsciiString( intProdId );
Handle(TCollection_HAsciiString) ProductName = new TCollection_HAsciiString(filename);
ProductName->AssignCat( "-Doc" );
Handle(StepBasic_HArray1OfProductContext) aHProdContext = new StepBasic_HArray1OfProductContext(1, 1);
aHProdContext->SetValue( 1, mySharedPC );
Product->Init( ProductID, ProductName, EmptyString, aHProdContext );
// create new product definition formation
Handle(StepBasic_ProductDefinitionFormation) PDF = new StepBasic_ProductDefinitionFormation;
// name id taked from exapmle Standard_ExtString_ref_master.stp
Handle(TCollection_HAsciiString) PDF_ID = new TCollection_HAsciiString("1");
PDF->Init( PDF_ID, EmptyString, Product );
Handle(StepBasic_DocumentProductEquivalence) DPE = new StepBasic_DocumentProductEquivalence;
Handle(TCollection_HAsciiString) DPEname = new TCollection_HAsciiString("equivalence");
StepBasic_ProductOrFormationOrDefinition aPOFOD;
aPOFOD.SetValue( PDF );
DPE->Init( DPEname, Standard_False, EmptyString, aDocument, aPOFOD );
// add to the model with references
Model()->AddWithRefs( DPE );
// add products to shared PRPC
Handle(StepBasic_HArray1OfProduct) newHProducts = new StepBasic_HArray1OfProduct(1, nbProducts + 1);
for (Standard_Integer pi = 1; pi <= nbProducts; pi++)
newHProducts->SetValue( pi, HProducts->Value( pi ) );
newHProducts->SetValue( nbProducts + 1, Product );
// set the hArray to the PRPC
mySharedPRPC->SetProducts( newHProducts );
// create new PDWAD
Handle(StepBasic_ProductDefinitionWithAssociatedDocuments) PDWAD =
new StepBasic_ProductDefinitionWithAssociatedDocuments;
Handle(StepBasic_HArray1OfDocument) aDocIds = new StepBasic_HArray1OfDocument(1,1);
aDocIds->SetValue( 1, DF );
Handle(TCollection_HAsciiString) PDWAD_ID = new TCollection_HAsciiString("1");
PDWAD->Init( PDWAD_ID, EmptyString, PDF, mySharedPDC, aDocIds );
// add to the model with references
Model()->AddWithRefs( PDWAD );
return Standard_True;
}
//=======================================================================
//function : SetAP214APD
//purpose :
//=======================================================================
void STEPConstruct_ExternRefs::SetAP214APD (const Handle(StepBasic_ApplicationProtocolDefinition)& APD)
{
myAPD = APD;
}
//=======================================================================
//function : GetAP214APD
//purpose :
//=======================================================================
Handle(StepBasic_ApplicationProtocolDefinition) STEPConstruct_ExternRefs::GetAP214APD()
{
if (myAPD.IsNull()) {
// create new APD with new Application Context
myAPD = new StepBasic_ApplicationProtocolDefinition;
// examples of the values taken from ext_ref_master.stp
Handle(TCollection_HAsciiString) status =
new TCollection_HAsciiString("version 1.1");
Handle(TCollection_HAsciiString) appSchemaName =
new TCollection_HAsciiString("pdm_schema");
Standard_Integer intProtocolYear = 1999;
Handle(StepBasic_ApplicationContext) aApplication = new StepBasic_ApplicationContext;
Handle(TCollection_HAsciiString) EmptyString = new TCollection_HAsciiString("");
aApplication->Init( EmptyString );
myAPD->Init( status, appSchemaName, intProtocolYear, aApplication );
}
return myAPD;
}
void STEPConstruct_ExternRefs::checkAP214Shared ()
{
Handle(TCollection_HAsciiString) EmptyString = new TCollection_HAsciiString("");
if ( mySharedPRPC.IsNull() ) {
// create new ProductRelatedProductCategory for all extern files.
Handle(TCollection_HAsciiString) PRPCname = new TCollection_HAsciiString("document");
mySharedPRPC = new StepBasic_ProductRelatedProductCategory;
mySharedPRPC->Init( PRPCname, Standard_False, EmptyString, 0 );
}
if ( mySharedDocType.IsNull() ) {
// create new shared Document Type
mySharedDocType = new StepBasic_DocumentType;
Handle(TCollection_HAsciiString) prod_dat_type =
new TCollection_HAsciiString("configuration controlled document version");
mySharedDocType->Init( prod_dat_type );
}
if ( mySharedPDC.IsNull() ) {
// create new shared Product Definition Context
mySharedPDC = new StepBasic_ProductDefinitionContext;
Handle(TCollection_HAsciiString) aPDCname =
new TCollection_HAsciiString("digital document definition");
Handle(StepBasic_ApplicationContext) anAppContext = GetAP214APD()->Application();
mySharedPDC->Init( aPDCname, anAppContext, EmptyString );
}
if ( mySharedPC.IsNull() ) {
// create new shared ProductContext
mySharedPC = new StepBasic_ProductContext;
Handle(StepBasic_ApplicationContext) anAppContext = GetAP214APD()->Application();
mySharedPC->Init( EmptyString, anAppContext, EmptyString );
}
}