// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //================================================================================================= 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); }