1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/STEPConstruct/STEPConstruct_ValidationProps.cxx
dpasukhi a5a7b3185b Coding - Apply .clang-format formatting #286
Update empty method guards to new style with regex (see PR).
Used clang-format 18.1.8.
New actions to validate code formatting is added.
Update .clang-format with disabling of include sorting.
  It is temporary changes, then include will be sorted.
Apply formatting for /src and /tools folder.
The files with .hxx,.cxx,.lxx,.h,.pxx,.hpp,*.cpp extensions.
2025-01-26 00:43:57 +00:00

787 lines
30 KiB
C++

// Created on: 1999-09-09
// Created by: Andrey BETENEV
// Copyright (c) 1999-1999 Matra Datavision
// 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 <APIHeaderSection_MakeHeader.hxx>
#include <gp_Pnt.hxx>
#include <Interface_EntityIterator.hxx>
#include <Interface_Macros.hxx>
#include <Message.hxx>
#include <StepBasic_DerivedUnit.hxx>
#include <StepBasic_DerivedUnitElement.hxx>
#include <StepBasic_HArray1OfDerivedUnitElement.hxx>
#include <StepBasic_MeasureValueMember.hxx>
#include <StepBasic_ProductDefinition.hxx>
#include <StepBasic_SiUnitAndLengthUnit.hxx>
#include <STEPConstruct_UnitContext.hxx>
#include <STEPConstruct_ValidationProps.hxx>
#include <StepData_Factors.hxx>
#include <StepData_StepModel.hxx>
#include <StepGeom_CartesianPoint.hxx>
#include <StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext.hxx>
#include <StepGeom_GeometricRepresentationItem.hxx>
#include <StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx.hxx>
#include <StepRepr_GlobalUnitAssignedContext.hxx>
#include <StepRepr_MeasureRepresentationItem.hxx>
#include <StepRepr_NextAssemblyUsageOccurrence.hxx>
#include <StepRepr_ProductDefinitionShape.hxx>
#include <StepRepr_PropertyDefinition.hxx>
#include <StepRepr_RepresentationContext.hxx>
#include <StepRepr_RepresentationItem.hxx>
#include <StepRepr_ShapeAspect.hxx>
#include <StepRepr_ShapeRepresentationRelationship.hxx>
#include <StepShape_ShapeDefinitionRepresentation.hxx>
#include <StepShape_ShapeRepresentation.hxx>
#include <TCollection_HAsciiString.hxx>
#include <Transfer_Binder.hxx>
#include <Transfer_SimpleBinderOfTransient.hxx>
#include <TransferBRep.hxx>
#include <TransferBRep_ShapeMapper.hxx>
#include <XSControl_TransferReader.hxx>
#include <XSControl_TransferWriter.hxx>
#include <XSControl_WorkSession.hxx>
//=================================================================================================
STEPConstruct_ValidationProps::STEPConstruct_ValidationProps() {}
//=================================================================================================
STEPConstruct_ValidationProps::STEPConstruct_ValidationProps(
const Handle(XSControl_WorkSession)& WS)
: STEPConstruct_Tool(WS)
{
}
//=================================================================================================
Standard_Boolean STEPConstruct_ValidationProps::Init(const Handle(XSControl_WorkSession)& WS)
{
return SetWS(WS);
}
//=================================================================================================
static Handle(Transfer_SimpleBinderOfTransient) TransientResult(
const Handle(Standard_Transient)& res)
{
Handle(Transfer_SimpleBinderOfTransient) binder;
if (res.IsNull())
return binder;
binder = new Transfer_SimpleBinderOfTransient;
binder->SetResult(res);
return binder;
}
//=================================================================================================
Standard_Boolean STEPConstruct_ValidationProps::FindTarget(
const TopoDS_Shape& Shape,
StepRepr_CharacterizedDefinition& target,
Handle(StepRepr_RepresentationContext)& Context,
const Standard_Boolean instance)
{
// find the target STEP entity corresponding to a shape
Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper(FinderProcess(), Shape);
Handle(Transfer_Binder) binder = FinderProcess()->Find(mapper);
// if requested, try to find instance of assembly
if (instance)
{
/*
Handle(StepRepr_NextAssemblyUsageOccurrence) NAUO;
Standard_Boolean found = myAssemblyPD.IsNull()?
FinderProcess()->FindTypedTransient
(mapper,STANDARD_TYPE(StepRepr_NextAssemblyUsageOccurrence), NAUO) : STEPConstruct::FindNAUO
(binder,myAssemblyPD,NAUO); if ( found ) {
//skl find CDSR using NAUO:
Handle(StepShape_ContextDependentShapeRepresentation) CDSR
Interface_EntityIterator subs1 = graph.Sharings(NAUO);
for (subs1.Start(); subs1.More(); subs1.Next()) {
Handle(StepRepr_ProductDefinitionShape) PDS =
Handle(StepRepr_ProductDefinitionShape)::DownCast(subs1.Value());
if(PDS.IsNull()) continue;
//IsPDS=Standard_True;
Interface_EntityIterator subs2 = graph.Sharings(PDS);
for (subs2.Start(); CDSR.IsNull() && subs2.More(); subs2.Next()) {
CDSR = Handle(StepShape_ContextDependentShapeRepresentation)::DownCast(subs2.Value());
}
}
if(!CDSR.IsNull()) {
target.SetValue ( CDSR->RepresentedProductRelation() );
Context = CDSR->RepresentationRelation()->Rep2()->ContextOfItems();
}
#ifdef OCCT_DEBUG
else std::cout << "INSTANCE: CDRS from NAUO NOT found" << std::endl;
#endif
}
#ifdef OCCT_DEBUG
else std::cout << "INSTANCE: NAUO NOT found" << std::endl;
#endif
*/
}
// for Compounds, search for SDR
else if (Shape.ShapeType() == TopAbs_COMPOUND)
{
Handle(StepBasic_ProductDefinition) ProdDef;
if (FinderProcess()->FindTypedTransient(mapper,
STANDARD_TYPE(StepBasic_ProductDefinition),
ProdDef))
{
Handle(StepRepr_ProductDefinitionShape) PDS;
Interface_EntityIterator subs1 = Graph().Sharings(ProdDef);
for (subs1.Start(); PDS.IsNull() && subs1.More(); subs1.Next())
{
PDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(subs1.Value());
}
target.SetValue(PDS);
#ifdef OCCT_DEBUG
// std::cout << "COMPOUND: SDR found: " << sdr->DynamicType()->Name() << std::endl;
#endif
}
else
{
#ifdef OCCT_DEBUG
std::cout << "COMPOUND: ProdDef NOT found" << std::endl;
#endif
Handle(StepShape_ShapeRepresentation) SR;
if (FinderProcess()->FindTypedTransient(mapper,
STANDARD_TYPE(StepShape_ShapeRepresentation),
SR))
{
Handle(StepRepr_ProductDefinitionShape) PDS;
Interface_EntityIterator subs1 = Graph().Sharings(SR);
for (subs1.Start(); PDS.IsNull() && subs1.More(); subs1.Next())
{
Handle(StepShape_ShapeDefinitionRepresentation) SDR =
Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(subs1.Value());
if (SDR.IsNull())
continue;
PDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(
SDR->Definition().PropertyDefinition());
}
if (PDS.IsNull())
{
subs1 = Graph().Sharings(SR);
for (subs1.Start(); PDS.IsNull() && subs1.More(); subs1.Next())
{
Handle(StepRepr_RepresentationRelationship) RR =
Handle(StepRepr_RepresentationRelationship)::DownCast(subs1.Value());
if (RR.IsNull())
continue;
Handle(StepShape_ShapeRepresentation) SR1;
if (RR->Rep1() == SR)
SR1 = Handle(StepShape_ShapeRepresentation)::DownCast(RR->Rep2());
else
SR1 = Handle(StepShape_ShapeRepresentation)::DownCast(RR->Rep1());
if (!SR1.IsNull())
{
Interface_EntityIterator subs2 = Graph().Sharings(SR1);
for (subs2.Start(); PDS.IsNull() && subs2.More(); subs2.Next())
{
Handle(StepShape_ShapeDefinitionRepresentation) SDR =
Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(subs2.Value());
if (SDR.IsNull())
continue;
PDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(
SDR->Definition().PropertyDefinition());
}
}
}
}
if (!PDS.IsNull())
{
target.SetValue(PDS);
Context = SR->ContextOfItems();
}
}
}
}
// for others, search for GEOMETRIC_REPRESENTATION_ITEM
else
{
Handle(StepGeom_GeometricRepresentationItem) item;
if (FinderProcess()->FindTypedTransient(mapper,
STANDARD_TYPE(StepGeom_GeometricRepresentationItem),
item))
{
#ifdef OCCT_DEBUG
// std::cout << Shape.TShape()->DynamicType()->Name() << ": GeomRepItem found: " <<
// item->DynamicType()->Name() << std::endl;
#endif
// find PDS (GRI <- SR <- SDR -> PDS)
Handle(StepRepr_ProductDefinitionShape) PDS;
Interface_EntityIterator subs = Graph().Sharings(item);
for (subs.Start(); PDS.IsNull() && subs.More(); subs.Next())
{
#ifdef OCCT_DEBUG
// std::cout << "Parsing back refs: found " << subs.Value()->DynamicType()->Name() << std::endl;
#endif
if (!subs.Value()->IsKind(STANDARD_TYPE(StepShape_ShapeRepresentation)))
continue;
Handle(StepShape_ShapeRepresentation) sr =
Handle(StepShape_ShapeRepresentation)::DownCast(subs.Value());
Context = sr->ContextOfItems();
Interface_EntityIterator sub2 = Graph().Sharings(subs.Value());
for (sub2.Start(); sub2.More(); sub2.Next())
{
if (!sub2.Value()->IsKind(STANDARD_TYPE(StepShape_ShapeDefinitionRepresentation)))
continue;
Handle(StepShape_ShapeDefinitionRepresentation) sdr =
Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(sub2.Value());
PDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(
sdr->Definition().PropertyDefinition());
}
}
if (!PDS.IsNull())
{
// find SHAPE_ASPECT or create it with all associated info if not yet exists
Handle(StepRepr_ShapeAspect) aspect;
Handle(Transfer_Binder) bbb = binder;
while (!bbb.IsNull())
{
Handle(Transfer_SimpleBinderOfTransient) bx =
Handle(Transfer_SimpleBinderOfTransient)::DownCast(bbb);
if (!bx.IsNull())
{
Handle(StepRepr_ShapeAspect) asp = Handle(StepRepr_ShapeAspect)::DownCast(bx->Result());
if (!asp.IsNull() && asp->OfShape() == PDS)
{
aspect = asp;
break;
}
}
bbb = bbb->NextResult();
}
if (aspect.IsNull())
{
// if ( ! FinderProcess()->FindTypedTransient (mapper,STANDARD_TYPE(StepRepr_ShapeAspect), aspect )
//|| aspect->OfShape() != PDS )
#ifdef OCCT_DEBUG
std::cout << Shape.TShape()->DynamicType()->Name() << ": SHAPE_ASPECT NOT found, creating"
<< std::endl;
#endif
// create aspect and all related data
Handle(TCollection_HAsciiString) AspectName = new TCollection_HAsciiString("");
Handle(TCollection_HAsciiString) AspectDescr = new TCollection_HAsciiString("");
aspect = new StepRepr_ShapeAspect;
aspect->Init(AspectName, AspectDescr, PDS, StepData_LFalse);
StepRepr_CharacterizedDefinition SA;
SA.SetValue(aspect);
Handle(TCollection_HAsciiString) PropDefName =
new TCollection_HAsciiString("shape with specific properties");
Handle(TCollection_HAsciiString) PropDefDescr =
new TCollection_HAsciiString("properties for subshape");
Handle(StepRepr_PropertyDefinition) propdef = new StepRepr_PropertyDefinition;
propdef->Init(PropDefName, Standard_True, PropDefDescr, SA);
Handle(TCollection_HAsciiString) SRName = new TCollection_HAsciiString("");
Handle(StepShape_ShapeRepresentation) SR = new StepShape_ShapeRepresentation;
Handle(StepRepr_HArray1OfRepresentationItem) SRItems =
new StepRepr_HArray1OfRepresentationItem(1, 1);
SRItems->SetValue(1, item);
SR->Init(SRName, SRItems, Context);
Handle(StepShape_ShapeDefinitionRepresentation) SDR =
new StepShape_ShapeDefinitionRepresentation;
StepRepr_RepresentedDefinition RD;
RD.SetValue(propdef);
SDR->Init(RD, SR);
// record SHAPE_ASPECT in the map
binder->AddResult(TransientResult(aspect));
// add SDR and all the data into model
Model()->AddWithRefs(SDR);
}
// SHAPE_ASPECT found, but we also need context: FIND IT !!!!
else
{
#ifdef OCCT_DEBUG
std::cout << Shape.TShape()->DynamicType()->Name() << ": SHAPE_ASPECT found" << std::endl;
#endif
Handle(StepRepr_ProductDefinitionShape) aPDS = aspect->OfShape();
Interface_EntityIterator asubs = Graph().Sharings(aPDS);
for (asubs.Start(); Context.IsNull() && asubs.More(); asubs.Next())
{
if (!asubs.Value()->IsKind(STANDARD_TYPE(StepShape_ShapeDefinitionRepresentation)))
continue;
Handle(StepShape_ShapeDefinitionRepresentation) sdr =
Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(asubs.Value());
Context = sdr->UsedRepresentation()->ContextOfItems();
}
}
if (!aspect.IsNull())
target.SetValue(aspect);
}
#ifdef OCCT_DEBUG
else
std::cout << Shape.TShape()->DynamicType()->Name()
<< ": PDS NOT found, fail to create SHAPE_ASPECT" << std::endl;
#endif
}
#ifdef OCCT_DEBUG
else
std::cout << Shape.TShape()->DynamicType()->Name() << ": GeomRepItem NOT found" << std::endl;
#endif
}
// if target not found and shape has location, try the same shape without location
return !target.IsNull();
}
//=================================================================================================
Standard_Boolean STEPConstruct_ValidationProps::AddProp(
const StepRepr_CharacterizedDefinition& target,
const Handle(StepRepr_RepresentationContext)& Context,
const Handle(StepRepr_RepresentationItem)& Prop,
const Standard_CString Descr)
{
// FINALLY, create a structure of 5 entities describing a link between a shape and its property
Handle(TCollection_HAsciiString) PropDefName =
new TCollection_HAsciiString("geometric validation property");
Handle(TCollection_HAsciiString) PropDefDescr = new TCollection_HAsciiString(Descr);
Handle(StepRepr_PropertyDefinition) propdef = new StepRepr_PropertyDefinition;
propdef->Init(PropDefName, Standard_True, PropDefDescr, target);
Handle(TCollection_HAsciiString) SRName = new TCollection_HAsciiString(Descr);
Handle(StepRepr_Representation) rep = new StepRepr_Representation;
Handle(StepRepr_HArray1OfRepresentationItem) SRItems =
new StepRepr_HArray1OfRepresentationItem(1, 1);
SRItems->SetValue(1, Prop);
rep->Init(SRName, SRItems, Context);
Handle(StepRepr_PropertyDefinitionRepresentation) PrDR =
new StepRepr_PropertyDefinitionRepresentation;
StepRepr_RepresentedDefinition RD;
RD.SetValue(propdef);
PrDR->Init(RD, rep);
// record SDR in order to have it written to the file
Model()->AddWithRefs(PrDR);
Handle(StepData_StepModel) aStepModel = Handle(StepData_StepModel)::DownCast(Model());
// for AP203, add subschema name
if (aStepModel->InternalParameters.WriteSchema == 3)
{
APIHeaderSection_MakeHeader mkHdr(aStepModel);
Handle(TCollection_HAsciiString) subSchema =
new TCollection_HAsciiString("GEOMETRIC_VALIDATION_PROPERTIES_MIM");
mkHdr.AddSchemaIdentifier(subSchema);
}
return Standard_True;
}
//=================================================================================================
Standard_Boolean STEPConstruct_ValidationProps::AddProp(
const TopoDS_Shape& Shape,
const Handle(StepRepr_RepresentationItem)& Prop,
const Standard_CString Descr,
const Standard_Boolean instance)
{
StepRepr_CharacterizedDefinition target;
Handle(StepRepr_RepresentationContext) Context;
if (!FindTarget(Shape, target, Context, instance))
return Standard_False;
return AddProp(target, Context, Prop, Descr);
}
//=================================================================================================
Standard_Boolean STEPConstruct_ValidationProps::AddVolume(const TopoDS_Shape& Shape,
const Standard_Real Vol)
{
Handle(StepBasic_MeasureValueMember) Val = new StepBasic_MeasureValueMember;
Val->SetReal(Vol);
// Val->SetName ( "solid volume" );
Val->SetName("VOLUME_MEASURE");
// for volume unit, either take existing or create a new
if (volUnit.DerivedUnit().IsNull())
{
Handle(StepBasic_SiUnitAndLengthUnit) MM = new StepBasic_SiUnitAndLengthUnit;
MM->Init(Standard_True, StepBasic_spMilli, StepBasic_sunMetre);
Handle(StepBasic_DerivedUnitElement) DUE = new StepBasic_DerivedUnitElement;
DUE->Init(MM, 3.);
Handle(StepBasic_HArray1OfDerivedUnitElement) DUElems =
new StepBasic_HArray1OfDerivedUnitElement(1, 1);
DUElems->SetValue(1, DUE);
Handle(StepBasic_DerivedUnit) DU = new StepBasic_DerivedUnit;
DU->Init(DUElems);
volUnit.SetValue(DU);
}
Handle(TCollection_HAsciiString) MRIName = new TCollection_HAsciiString("volume measure");
Handle(StepRepr_MeasureRepresentationItem) MRI = new StepRepr_MeasureRepresentationItem;
MRI->Init(MRIName, Val, volUnit);
return AddProp(Shape, MRI, "volume");
}
//=================================================================================================
Standard_Boolean STEPConstruct_ValidationProps::AddArea(const TopoDS_Shape& Shape,
const Standard_Real Area)
{
Handle(StepBasic_MeasureValueMember) Val = new StepBasic_MeasureValueMember;
Val->SetReal(Area);
// Val->SetName ( "surface area" );
Val->SetName("AREA_MEASURE");
// for area unit, either take existing or create a new
if (areaUnit.DerivedUnit().IsNull())
{
Handle(StepBasic_SiUnitAndLengthUnit) MM = new StepBasic_SiUnitAndLengthUnit;
MM->Init(Standard_True, StepBasic_spMilli, StepBasic_sunMetre);
Handle(StepBasic_DerivedUnitElement) DUE = new StepBasic_DerivedUnitElement;
DUE->Init(MM, 2.);
Handle(StepBasic_HArray1OfDerivedUnitElement) DUElems =
new StepBasic_HArray1OfDerivedUnitElement(1, 1);
DUElems->SetValue(1, DUE);
Handle(StepBasic_DerivedUnit) DU = new StepBasic_DerivedUnit;
DU->Init(DUElems);
areaUnit.SetValue(DU);
}
Handle(TCollection_HAsciiString) MRIName = new TCollection_HAsciiString("surface area measure");
Handle(StepRepr_MeasureRepresentationItem) MRI = new StepRepr_MeasureRepresentationItem;
MRI->Init(MRIName, Val, areaUnit);
return AddProp(Shape, MRI, "surface area");
}
//=================================================================================================
Standard_Boolean STEPConstruct_ValidationProps::AddCentroid(const TopoDS_Shape& Shape,
const gp_Pnt& Pnt,
const Standard_Boolean instance)
{
Handle(TCollection_HAsciiString) CPName = new TCollection_HAsciiString("centre point");
Handle(StepGeom_CartesianPoint) CP = new StepGeom_CartesianPoint;
CP->Init3D(CPName, Pnt.X(), Pnt.Y(), Pnt.Z());
return AddProp(Shape, CP, "centroid", instance);
}
//=================================================================================================
Standard_Boolean STEPConstruct_ValidationProps::LoadProps(TColStd_SequenceOfTransient& seq) const
{
// parse on PropertyDefinitionRepresentations
Standard_Integer nb = Model()->NbEntities();
Handle(Standard_Type) tPDR = STANDARD_TYPE(StepRepr_PropertyDefinitionRepresentation);
for (Standard_Integer i = 1; i <= nb; i++)
{
Handle(Standard_Transient) enti = Model()->Value(i);
if (!enti->IsKind(tPDR))
continue;
Handle(StepRepr_PropertyDefinitionRepresentation) PDR =
Handle(StepRepr_PropertyDefinitionRepresentation)::DownCast(enti);
// Check that PDR is for validation props.
Handle(StepRepr_PropertyDefinition) PD = PDR->Definition().PropertyDefinition();
if (!PD.IsNull() && !PD->Name().IsNull())
{
// Note: according to "Recommended Practices for Geometric and Assembly Validation Properties"
// Release 4.4 as of Augist 17, 2016, item 4.6, the name of PropertyDefinition should be
// "geometric validation property" with words separated by spaces; however older versions of
// the same RP document used underscores. To be able to read files written using older
// convention, we convert all underscores to spaces for this check.
TCollection_AsciiString aName = PD->Name()->String();
aName.ChangeAll('_', ' ', Standard_False);
aName.LowerCase();
if (aName != "geometric validation property")
continue;
}
seq.Append(PDR);
}
return seq.Length() > 0;
}
//=================================================================================================
Handle(StepBasic_ProductDefinition) STEPConstruct_ValidationProps::GetPropPD(
const Handle(StepRepr_PropertyDefinition)& PD) const
{
StepRepr_CharacterizedDefinition CD = PD->Definition();
// detect target entity of valprop
Handle(StepBasic_ProductDefinition) ProdDef;
Handle(StepRepr_PropertyDefinition) PDS = CD.ProductDefinitionShape();
if (PDS.IsNull())
{
Handle(StepRepr_ShapeAspect) SA = CD.ShapeAspect();
if (SA.IsNull())
{
#ifdef OCCT_DEBUG
Message_Messenger::StreamBuffer sout = Message::SendInfo();
sout << "Error: Cannot find target entity (SA) for geometric_validation_property ";
Model()->PrintLabel(PD, sout);
sout << std::endl;
#endif
return ProdDef;
}
Interface_EntityIterator subs = Graph().Sharings(SA);
for (subs.Start(); subs.More(); subs.Next())
{
PDS = Handle(StepRepr_PropertyDefinition)::DownCast(subs.Value());
if (PDS.IsNull())
return ProdDef;
Interface_EntityIterator subs1 = Graph().Shareds(PDS);
for (subs1.Start(); ProdDef.IsNull() && subs1.More(); subs1.Next())
{
ProdDef = Handle(StepBasic_ProductDefinition)::DownCast(subs1.Value());
}
}
}
else
{
Interface_EntityIterator subs = Graph().Shareds(PDS);
for (subs.Start(); ProdDef.IsNull() && subs.More(); subs.Next())
{
ProdDef = Handle(StepBasic_ProductDefinition)::DownCast(subs.Value());
}
}
#ifdef OCCT_DEBUG
if (ProdDef.IsNull())
{
Message_Messenger::StreamBuffer sout = Message::SendInfo();
sout << "Error: Cannot find target entity (SDR) for geometric_validation_property ";
Model()->PrintLabel(PD, sout);
sout << std::endl;
}
#endif
return ProdDef;
}
//=================================================================================================
Handle(StepRepr_NextAssemblyUsageOccurrence) STEPConstruct_ValidationProps::GetPropNAUO(
const Handle(StepRepr_PropertyDefinition)& PD) const
{
StepRepr_CharacterizedDefinition CD = PD->Definition();
// detect target entity of valprop
Handle(StepRepr_NextAssemblyUsageOccurrence) NAUO;
Handle(StepRepr_PropertyDefinition) PDS = CD.ProductDefinitionShape();
if (PDS.IsNull())
return NAUO; // not found
Interface_EntityIterator subs = Graph().Shareds(PDS);
for (subs.Start(); NAUO.IsNull() && subs.More(); subs.Next())
{
NAUO = Handle(StepRepr_NextAssemblyUsageOccurrence)::DownCast(subs.Value());
}
return NAUO;
}
//=================================================================================================
TopoDS_Shape STEPConstruct_ValidationProps::GetPropShape(
const Handle(StepBasic_ProductDefinition)& ProdDef) const
{
// find target shape
TopoDS_Shape S;
Handle(Transfer_Binder) binder = TransientProcess()->Find(ProdDef);
if (!binder.IsNull() && binder->HasResult())
{
S = TransferBRep::ShapeResult(TransientProcess(), binder);
}
// if ( S.IsNull() ) { // for subshape (via shape_aspect)
// Handle(StepRepr_Representation) rep = SDR->UsedRepresentation();
// for ( Standard_Integer j=1; S.IsNull() && j <= rep->NbItems(); j++ ) {
// binder = TransientProcess()->Find(rep->ItemsValue(j));
// if ( ! binder.IsNull() && binder->HasResult() ) {
// S = TransferBRep::ShapeResult ( TransientProcess(), binder );
// }
// }
// }
#ifdef OCCT_DEBUG
if (S.IsNull())
{
Message_Messenger::StreamBuffer sout = Message::SendInfo();
sout << "Warning: Entity ";
Model()->PrintLabel(ProdDef, sout);
sout << " is not mapped to shape" << std::endl;
}
#endif
return S;
}
//=================================================================================================
TopoDS_Shape STEPConstruct_ValidationProps::GetPropShape(
const Handle(StepRepr_PropertyDefinition)& PD) const
{
Handle(StepBasic_ProductDefinition) ProdDef = GetPropPD(PD);
TopoDS_Shape S;
if (!ProdDef.IsNull())
S = GetPropShape(ProdDef);
return S;
}
//=================================================================================================
Standard_Boolean STEPConstruct_ValidationProps::GetPropReal(
const Handle(StepRepr_RepresentationItem)& item,
Standard_Real& Val,
Standard_Boolean& isArea,
const StepData_Factors& theLocalFactors) const
{
// decode volume & area
if (!item->IsKind(STANDARD_TYPE(StepRepr_MeasureRepresentationItem)))
return Standard_False;
Handle(StepRepr_MeasureRepresentationItem) mri =
Handle(StepRepr_MeasureRepresentationItem)::DownCast(item);
Handle(StepBasic_MeasureWithUnit) M = mri->Measure();
TCollection_AsciiString Name = M->ValueComponentMember()->Name();
StepBasic_Unit Unit = M->UnitComponent();
Standard_Real scale = 1.;
Handle(StepBasic_DerivedUnit) DU = Unit.DerivedUnit();
if (!DU.IsNull())
{
for (Standard_Integer ind = 1; ind <= DU->NbElements(); ind++)
{
Handle(StepBasic_DerivedUnitElement) DUE = DU->ElementsValue(ind);
Standard_Real exp = DUE->Exponent();
Handle(StepBasic_NamedUnit) NU = DUE->Unit();
STEPConstruct_UnitContext unit;
unit.ComputeFactors(NU, theLocalFactors);
if (unit.LengthDone())
{
Standard_Real lengthFactor = unit.LengthFactor();
scale *= pow(lengthFactor, exp);
}
}
}
else
{
Handle(StepBasic_NamedUnit) NU = Unit.NamedUnit();
if (!NU.IsNull())
{
STEPConstruct_UnitContext unit;
unit.ComputeFactors(NU, theLocalFactors);
if (unit.AreaDone())
scale = unit.AreaFactor();
if (unit.VolumeDone())
scale = unit.VolumeFactor();
}
}
Val = M->ValueComponent() * scale;
if (Name == "AREA_MEASURE")
isArea = Standard_True;
else if (Name == "VOLUME_MEASURE")
isArea = Standard_False;
else
{
#ifdef OCCT_DEBUG
std::cout << "Warning: Measure " << Model()->StringLabel(M)->String()
<< " is neither area not volume" << std::endl;
#endif
return Standard_False;
}
return Standard_True;
}
//=================================================================================================
Standard_Boolean STEPConstruct_ValidationProps::GetPropPnt(
const Handle(StepRepr_RepresentationItem)& item,
const Handle(StepRepr_RepresentationContext)& Context,
gp_Pnt& Pnt,
const StepData_Factors& theLocalFactors) const
{
// centroid
if (!item->IsKind(STANDARD_TYPE(StepGeom_CartesianPoint)))
return Standard_False;
Handle(StepGeom_CartesianPoint) P = Handle(StepGeom_CartesianPoint)::DownCast(item);
if (P.IsNull() || P->NbCoordinates() != 3)
{
#ifdef OCCT_DEBUG
std::cout << "Warning: Point " << Model()->StringLabel(P)->String()
<< " is not valid for centroid" << std::endl;
#endif
return Standard_False;
}
gp_Pnt pos(P->CoordinatesValue(1), P->CoordinatesValue(2), P->CoordinatesValue(3));
// scale according to units
if (!Context.IsNull())
{
Handle(StepRepr_GlobalUnitAssignedContext) theGUAC;
if (Context->IsKind(
STANDARD_TYPE(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext)))
{
DeclareAndCast(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext,
theGRCAGAUC,
Context);
theGUAC = theGRCAGAUC->GlobalUnitAssignedContext();
}
else if (Context->IsKind(
STANDARD_TYPE(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx)))
{
DeclareAndCast(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx,
theGRCAGAUC,
Context);
theGUAC = theGRCAGAUC->GlobalUnitAssignedContext();
}
if (!theGUAC.IsNull())
{
STEPConstruct_UnitContext UnitTool;
UnitTool.ComputeFactors(theGUAC, theLocalFactors);
gp_Pnt zero(0, 0, 0);
pos.Scale(zero, UnitTool.LengthFactor());
}
}
Pnt = pos;
return Standard_True;
}
//=================================================================================================
void STEPConstruct_ValidationProps::SetAssemblyShape(const TopoDS_Shape& shape)
{
Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper(FinderProcess(), shape);
FinderProcess()->FindTypedTransient(mapper,
STANDARD_TYPE(StepBasic_ProductDefinition),
myAssemblyPD);
}