From: dpasukhi Date: Sun, 30 Aug 2020 15:44:33 +0000 (+0300) Subject: 0031388: Data Exchange - support kinematics data in STEP format X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=1753246b830c970057507cc9134134a4284efe36;p=occt-copy.git 0031388: Data Exchange - support kinematics data in STEP format # Reorganize STEP Write Kinematics --- diff --git a/src/STEPCAFControl/STEPCAFControl_Writer.cxx b/src/STEPCAFControl/STEPCAFControl_Writer.cxx index f471677109..3f082b4567 100644 --- a/src/STEPCAFControl/STEPCAFControl_Writer.cxx +++ b/src/STEPCAFControl/STEPCAFControl_Writer.cxx @@ -274,6 +274,8 @@ #include #include #include + +#include // End Added for kinematics implementation #include @@ -2188,2977 +2190,2963 @@ Standard_Boolean STEPCAFControl_Writer::WriteSHUOs (const Handle(XSControl_WorkS } //======================================================================= -//function : createKinematicLink -//purpose : auxilary +//function : FindPDSforDGT +//purpose : auxilary: find PDS for AdvancedFace or EdgeCurve for creation +// needed ShapeAspect in D> structure //======================================================================= -static Standard_Boolean createKinematicLink(const Handle(XSControl_WorkSession)& theWS, - const Handle(XCAFDoc_KinematicTool)& theKTool, - const Interface_Graph& theGraph, - const TDF_Label& theLabelLink, - NCollection_IndexedDataMap& theMapOfLinks, - Handle(StepKinematics_RigidLinkRepresentation)& theBaseLink, - Handle(StepRepr_PropertyDefinition)& theGeneralPD) +static Standard_Boolean FindPDSforDGT(const Interface_Graph &aGraph, + const Handle(Standard_Transient) &ent, + Handle(StepRepr_ProductDefinitionShape) &PDS, + Handle(StepRepr_RepresentationContext) &RC, + Handle(StepShape_AdvancedFace) &AF, + Handle(StepShape_EdgeCurve) &EC) { - const Handle(Interface_InterfaceModel)& Model = theWS->Model(); - const Handle(XSControl_TransferWriter)& TW = theWS->TransferWriter(); - const Handle(Transfer_FinderProcess)& FP = TW->FinderProcess(); - Handle(StepKinematics_KinematicLink) aLink = new StepKinematics_KinematicLink; - - Handle(TDataStd_Name) aNameLink; - Handle(TCollection_HAsciiString) aHNameLink; - if (theLabelLink.FindAttribute(TDataStd_Name::GetID(), aNameLink)) - aHNameLink = new TCollection_HAsciiString(aNameLink->Get()); - aLink->Init(aHNameLink); - - //Choose type of the representation link - Standard_Boolean isLinear = Standard_True; - TDF_LabelSequence aJoints = theKTool->GetJointsOfLink(theLabelLink, Standard_True, Standard_False); - if (aJoints.IsEmpty()) - isLinear = Standard_False; - for (TDF_LabelSequence::Iterator anItJoint(aJoints); anItJoint.More() && isLinear; anItJoint.Next()) - { - Handle(XCAFDoc_KinematicPair) aKPairAttr; - if (!anItJoint.Value().FindAttribute(XCAFDoc_KinematicPair::GetID(), aKPairAttr)) - continue; - Handle(XCAFKinematics_PairObject) aPairObject = aKPairAttr->GetObject(); - if (aPairObject->Type() == XCAFKinematics_PairType_NoType) - continue; - if (aPairObject->Type() != XCAFKinematics_PairType_LinearFlexibleAndPinion && - aPairObject->Type() != XCAFKinematics_PairType_LinearFlexibleAndPlanarCurve) - isLinear = Standard_False; - } - aJoints = theKTool->GetJointsOfLink(theLabelLink, Standard_False, Standard_True); - if (!aJoints.IsEmpty()) - isLinear = Standard_False; - - Handle(StepKinematics_KinematicLinkRepresentation) aLinkRepr; - Handle(TCollection_HAsciiString) aNameOfLinkRepr = new TCollection_HAsciiString(""); - // create empty collection for updating during creating a referenced pairs - Handle(StepRepr_HArray1OfRepresentationItem) aPlacementsOfPairs = new StepRepr_HArray1OfRepresentationItem(); - - TDF_LabelSequence aShapesL = theKTool->GetRefShapes(theLabelLink); - if (aShapesL.IsEmpty()) + if (ent.IsNull()) + return Standard_False; + if( !ent->IsKind(STANDARD_TYPE(StepShape_EdgeCurve)) && + !ent->IsKind(STANDARD_TYPE(StepShape_AdvancedFace)) ) return Standard_False; - // find ref shapes - for (TDF_LabelSequence::Iterator anItShapes(aShapesL); anItShapes.More(); anItShapes.Next()) { - TopoDS_Shape aTopoShape = XCAFDoc_ShapeTool::GetShape(anItShapes.Value()); - TopLoc_Location aLoc; - TColStd_SequenceOfTransient seqRI; - FindEntities(FP, aTopoShape, aLoc, seqRI); - if (seqRI.Length() <= 0) { - FP->Messenger()->SendInfo() << "Warning: Cannot find RI for " << aTopoShape.TShape()->DynamicType()->Name() << std::endl; - continue; + AF = Handle(StepShape_AdvancedFace)::DownCast(ent); + if( AF.IsNull() ) { + EC = Handle(StepShape_EdgeCurve)::DownCast(ent); + Interface_EntityIterator subs = aGraph.Sharings(EC); + for(subs.Start(); subs.More() && AF.IsNull(); subs.Next()) { + Handle(StepShape_OrientedEdge) OE = Handle(StepShape_OrientedEdge)::DownCast(subs.Value()); + if(OE.IsNull()) continue; + Interface_EntityIterator subs1 = aGraph.Sharings(OE); + for(subs1.Start(); subs1.More() && AF.IsNull(); subs1.Next()) { + Handle(StepShape_EdgeLoop) EL = Handle(StepShape_EdgeLoop)::DownCast(subs1.Value()); + if(EL.IsNull()) continue; + Interface_EntityIterator subs2 = aGraph.Sharings(EL); + for(subs2.Start(); subs2.More() && AF.IsNull(); subs2.Next()) { + Handle(StepShape_FaceBound) FB = Handle(StepShape_FaceBound)::DownCast(subs2.Value()); + if(FB.IsNull()) continue; + Interface_EntityIterator subs3 = aGraph.Sharings(FB); + for(subs3.Start(); subs3.More() && AF.IsNull(); subs3.Next()) { + AF = Handle(StepShape_AdvancedFace)::DownCast(subs3.Value()); + } + } + } } + } + if(AF.IsNull()) return Standard_False; - // get PDS of Shape - Handle(StepShape_ShapeRepresentation) aShapeRepr; - Handle(StepRepr_PropertyDefinition) aPD; - Interface_EntityIterator anItRI = theGraph.Sharings(seqRI.Value(1)); - for (anItRI.Start(); anItRI.More() && aPD.IsNull(); anItRI.Next()) { - aShapeRepr = Handle(StepShape_ShapeRepresentation)::DownCast(anItRI.Value()); - if (aShapeRepr.IsNull()) - continue; - Interface_EntityIterator aSDRIt = theGraph.Sharings(aShapeRepr); - for (aSDRIt.Start(); aSDRIt.More() && aPD.IsNull(); aSDRIt.Next()) { - Handle(StepShape_ShapeDefinitionRepresentation) aSDR = - Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(aSDRIt.Value()); - if (aSDR.IsNull()) continue; - aPD = aSDR->Definition().PropertyDefinition(); + Interface_EntityIterator subs = aGraph.Sharings(AF); + for(subs.Start(); subs.More() && PDS.IsNull(); subs.Next()) { + Handle(StepShape_ConnectedFaceSet) CFS = + Handle(StepShape_ConnectedFaceSet)::DownCast(subs.Value()); + if(CFS.IsNull()) continue; + Interface_EntityIterator subs1 = aGraph.Sharings(CFS); + for(subs1.Start(); subs1.More() && PDS.IsNull(); subs1.Next()) { + Handle(StepRepr_RepresentationItem) RI = + Handle(StepRepr_RepresentationItem)::DownCast(subs1.Value()); + if(RI.IsNull()) continue; + Interface_EntityIterator subs2 = aGraph.Sharings(RI); + for(subs2.Start(); subs2.More() && PDS.IsNull(); subs2.Next()) { + Handle(StepShape_ShapeRepresentation) SR = + Handle(StepShape_ShapeRepresentation)::DownCast(subs2.Value()); + if(SR.IsNull()) continue; + RC = SR->ContextOfItems(); + Interface_EntityIterator subs3 = aGraph.Sharings(SR); + for(subs3.Start(); subs3.More() && PDS.IsNull(); subs3.Next()) { + Handle(StepShape_ShapeDefinitionRepresentation) SDR = + Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(subs3.Value()); + if(SDR.IsNull()) continue; + Handle(StepRepr_PropertyDefinition) PropD = SDR->Definition().PropertyDefinition(); + if(PropD.IsNull()) continue; + PDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(PropD); + } } } - if (aPD.IsNull()) - return Standard_False; + } + + return Standard_True; +} - if (theGeneralPD.IsNull() && !isLinear) - theGeneralPD = aPD; +//======================================================================= +//function : FindPDS +//purpose : auxilary: find Product_definition_shape entity for given entity +//======================================================================= +static Handle(StepRepr_ProductDefinitionShape) FindPDS(const Interface_Graph &theGraph, + const Handle(Standard_Transient) &theEnt, + Handle(StepRepr_RepresentationContext) &theRC) +{ + if (theEnt.IsNull()) + return NULL; + Handle(StepRepr_ProductDefinitionShape) aPDS; - Handle(TDataStd_Integer) aBase; - if (theBaseLink.IsNull() && theLabelLink.FindAttribute(TDataStd_Integer::GetID(), aBase)) { - theGeneralPD = aPD; - theBaseLink = Handle(StepKinematics_RigidLinkRepresentation)::DownCast(aLinkRepr); + // try to find shape_representation in sharings + Interface_EntityIterator anIter = theGraph.Sharings(theEnt); + for (anIter.Start(); anIter.More() && aPDS.IsNull(); anIter.Next()) { + Handle(StepShape_ShapeRepresentation) aSR = Handle(StepShape_ShapeRepresentation)::DownCast(anIter.Value()); + if (aSR.IsNull()) + continue; + theRC = aSR->ContextOfItems(); + Interface_EntityIterator aSDRIt = theGraph.Sharings(aSR); + for (aSDRIt.Start(); aSDRIt.More() && aPDS.IsNull(); aSDRIt.Next()) { + Handle(StepShape_ShapeDefinitionRepresentation) aSDR = + Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(aSDRIt.Value()); + if (aSDR.IsNull()) continue; + Handle(StepRepr_PropertyDefinition) aPropD = aSDR->Definition().PropertyDefinition(); + if (aPropD.IsNull()) continue; + aPDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(aPropD); } + } + if (!aPDS.IsNull()) + return aPDS; - if (aLinkRepr.IsNull()) + anIter = theGraph.Sharings(theEnt); + for (anIter.Start(); anIter.More(); anIter.Next()) { + if (anIter.Value()->IsKind(STANDARD_TYPE(StepShape_TopologicalRepresentationItem)) || + anIter.Value()->IsKind(STANDARD_TYPE(StepGeom_GeometricRepresentationItem))) { - if (isLinear) - aLinkRepr = new StepKinematics_LinearFlexibleLinkRepresentation; - else - aLinkRepr = new StepKinematics_RigidLinkRepresentation; - aLinkRepr->Init(aNameOfLinkRepr, aPlacementsOfPairs, aShapeRepr->ContextOfItems(), aLink); - theMapOfLinks.Add(theLabelLink, aLinkRepr); - Model->AddEntity(aLink); - Model->AddEntity(aLinkRepr); + aPDS = FindPDS(theGraph, anIter.Value(), theRC); + if (!aPDS.IsNull()) + return aPDS; } - - Handle(StepKinematics_KinematicLinkRepresentationAssociation) aLinkRepresentationAssociation = new StepKinematics_KinematicLinkRepresentationAssociation; - aLinkRepresentationAssociation->Init(aNameOfLinkRepr, aNameOfLinkRepr, aLinkRepr, aShapeRepr); - Handle(StepKinematics_ContextDependentKinematicLinkRepresentation) aCDKLRS = new StepKinematics_ContextDependentKinematicLinkRepresentation; - Handle(StepKinematics_ProductDefinitionRelationshipKinematics) aPDRK = new StepKinematics_ProductDefinitionRelationshipKinematics; - aPDRK->Init(aNameOfLinkRepr, Standard_False, aLinkRepresentationAssociation->Description(), aPD->Definition()); - aCDKLRS->Init(aLinkRepresentationAssociation, aPDRK); - Model->AddEntity(aLinkRepresentationAssociation); - Model->AddEntity(aPDRK); - Model->AddEntity(aCDKLRS); } - return Standard_True; + return aPDS; } //======================================================================= -//function : createKinematicJoint -//purpose : auxilary +//function : GetUnit +//purpose : auxiliary //======================================================================= -static Standard_Boolean createKinematicJoint(const Handle(XCAFDoc_KinematicTool)& theKTool, - const TDF_Label& theLabelJoint, - const Handle(XCAFKinematics_PairObject)& theKinPairObj, - const NCollection_IndexedDataMap& theMapOfLinks, - Handle(StepKinematics_KinematicLinkRepresentation)& theLinkRepr1, - Handle(StepKinematics_KinematicLinkRepresentation)& theLinkRepr2, - Handle(StepKinematics_KinematicJoint)& theJoint) +static StepBasic_Unit GetUnit(const Handle(StepRepr_RepresentationContext)& theRC, + const Standard_Boolean isAngle = Standard_False) { - TDF_Label aLinkStartL, aLinkEndL; - theJoint = new StepKinematics_KinematicJoint; - theKTool->GetLinksOfJoint(theLabelJoint, aLinkStartL, aLinkEndL); - Handle(TCollection_HAsciiString) aNameJoint = new TCollection_HAsciiString(theKinPairObj->Name()); - - Handle(StepShape_Vertex) anEdgeStart; - Handle(StepShape_Vertex) anEdgeEnd; - - if (!theMapOfLinks.FindFromKey(aLinkStartL, theLinkRepr1)) - return Standard_False; - if (!theMapOfLinks.FindFromKey(aLinkEndL, theLinkRepr2)) - return Standard_False; - - anEdgeStart = theLinkRepr1->RepresentedLink(); - anEdgeEnd = theLinkRepr2->RepresentedLink(); - - if (anEdgeEnd.IsNull() || anEdgeStart.IsNull()) - return Standard_False; + StepBasic_Unit aUnit; + Handle(StepBasic_NamedUnit) aCurrentUnit; + if (isAngle) { + Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext) aCtx = + Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext)::DownCast(theRC); + if(!aCtx.IsNull()) { + for(Standard_Integer j = 1; j <= aCtx->NbUnits(); j++) { + if (aCtx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndPlaneAngleUnit)) || + aCtx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_ConversionBasedUnitAndPlaneAngleUnit))) { + aCurrentUnit = aCtx->UnitsValue(j); + break; + } + } + } + if (aCurrentUnit.IsNull()) { + Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx) aCtx1 = + Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx)::DownCast(theRC); + if(!aCtx1.IsNull()) { + for(Standard_Integer j = 1; j <= aCtx1->NbUnits(); j++) { + if (aCtx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndPlaneAngleUnit)) || + aCtx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_ConversionBasedUnitAndPlaneAngleUnit))) { + aCurrentUnit = aCtx1->UnitsValue(j); + break; + } + } + } + } + if (aCurrentUnit.IsNull()) + aCurrentUnit = new StepBasic_SiUnitAndPlaneAngleUnit; + } + else { + Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext) aCtx = + Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext)::DownCast(theRC); + if(!aCtx.IsNull()) { + for(Standard_Integer j = 1; j <= aCtx->NbUnits(); j++) { + if (aCtx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndLengthUnit)) || + aCtx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_ConversionBasedUnitAndLengthUnit))) { + aCurrentUnit = aCtx->UnitsValue(j); + break; + } + } + } + if (aCurrentUnit.IsNull()) { + Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx) aCtx1 = + Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx)::DownCast(theRC); + if(!aCtx1.IsNull()) { + for(Standard_Integer j = 1; j <= aCtx1->NbUnits(); j++) { + if (aCtx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndLengthUnit)) || + aCtx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_ConversionBasedUnitAndLengthUnit))) { + aCurrentUnit = aCtx1->UnitsValue(j); + break; + } + } + } + } + if (aCurrentUnit.IsNull()) + aCurrentUnit = new StepBasic_SiUnitAndLengthUnit; + } - theJoint->Init(aNameJoint, anEdgeStart, anEdgeEnd); - return Standard_True; + aUnit.SetValue(aCurrentUnit); + return aUnit; } //======================================================================= -//function : createKinematicPair -//purpose : auxilary -//======================================================================= -static Standard_Boolean createKinematicPair(const Handle(XCAFKinematics_PairObject)& theKinPairObj, - const Handle(StepKinematics_KinematicJoint)& theJoint, - const Handle(StepKinematics_KinematicLinkRepresentation)& theLinkRepr1, - const Handle(StepKinematics_KinematicLinkRepresentation)& theLinkRepr2, - Handle(StepKinematics_KinematicPair)& theKinematicPair) +//function : CreateDimValue +//purpose : auxiliary +//====================================================================== +static Handle(StepRepr_ReprItemAndMeasureWithUnit) CreateDimValue(const Standard_Real theValue, + const StepBasic_Unit theUnit, + const Handle(TCollection_HAsciiString)& theName, + const Standard_CString theMeasureName, + const Standard_Boolean isAngle, + const Standard_Boolean isQualified = Standard_False, + const Handle(StepShape_QualifiedRepresentationItem)& theQRI = NULL) { - if (theKinPairObj->Type() == XCAFKinematics_PairType_NoType) - return Standard_False; - Handle(StepRepr_RepresentationItem) aTransformItem1 = GeomToStep_MakeAxis2Placement3d(theKinPairObj->FirstTransformation()).Value(); - Handle(StepRepr_RepresentationItem) aTransformItem2 = GeomToStep_MakeAxis2Placement3d(theKinPairObj->SecondTransformation()).Value(); - if (aTransformItem1.IsNull() || aTransformItem2.IsNull()) - return Standard_False; - - Standard_Boolean hasDescription = Standard_False; - Handle(TCollection_HAsciiString) aPairName; - if (!theKinPairObj->Name().Search("Joint")) - aPairName = new TCollection_HAsciiString(theKinPairObj->Name()); - else - aPairName = new TCollection_HAsciiString(""); - Handle(TCollection_HAsciiString) aDescription; - Standard_Boolean isRanged = theKinPairObj->HasLimits(); - if (theKinPairObj->IsKind(STANDARD_TYPE(XCAFKinematics_LowOrderPairObject))) - { - Handle(XCAFKinematics_LowOrderPairObject) aLowOrderPairObj = Handle(XCAFKinematics_LowOrderPairObject)::DownCast(theKinPairObj); - Standard_Boolean aTX = Standard_True; - Standard_Boolean aTY = Standard_True; - Standard_Boolean aTZ = Standard_True; - Standard_Boolean aRX = Standard_True; - Standard_Boolean aRY = Standard_True; - Standard_Boolean aRZ = Standard_True; - switch (theKinPairObj->Type()) - { - case(XCAFKinematics_PairType_Revolute): - { - aTX = Standard_False; - aTY = Standard_False; - aTZ = Standard_False; - aRX = Standard_False; - aRY = Standard_False; - if (isRanged) - { - theKinematicPair = new StepKinematics_RevolutePairWithRange; - Standard_Real aLowerLimitActualRotation = aLowOrderPairObj->MinRotationZ(); - Standard_Real aUpperLimitActualRotation = aLowOrderPairObj->MaxRotationZ(); - aRZ = Standard_True; - Handle(StepKinematics_RevolutePairWithRange) aRevolutePairWithRange = Handle(StepKinematics_RevolutePairWithRange)::DownCast(theKinematicPair); - aRevolutePairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitActualRotation, Standard_True, aUpperLimitActualRotation); - } - else - { - theKinematicPair = new StepKinematics_RevolutePair; - Handle(StepKinematics_RevolutePair) aRevolutePair = Handle(StepKinematics_RevolutePair)::DownCast(theKinematicPair); - aRevolutePair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ); - } - break; - } - case(XCAFKinematics_PairType_Prismatic): - { - aTY = Standard_False; - aTZ = Standard_False; - aRX = Standard_False; - aRY = Standard_False; - aRZ = Standard_False; - if (isRanged) - { - theKinematicPair = new StepKinematics_PrismaticPairWithRange; - Handle(StepKinematics_PrismaticPairWithRange) aPrismaticPairWithRange = Handle(StepKinematics_PrismaticPairWithRange)::DownCast(theKinematicPair); - Standard_Real aUpperLimitActualTranslation = aLowOrderPairObj->MaxTranslationX(); - Standard_Real aLowerLimitActualTranslation = aLowOrderPairObj->MinTranslationX(); - aPrismaticPairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitActualTranslation, Standard_True, aUpperLimitActualTranslation); - } - else - { - theKinematicPair = new StepKinematics_PrismaticPair; - Handle(StepKinematics_PrismaticPair) aPrismaticPair = Handle(StepKinematics_PrismaticPair)::DownCast(theKinematicPair); - aPrismaticPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ); - } - break; - } - case(XCAFKinematics_PairType_Cylindrical): - { - aTX = Standard_False; - aTY = Standard_False; - aRX = Standard_False; - aRY = Standard_False; - if (isRanged) - { - theKinematicPair = new StepKinematics_CylindricalPairWithRange; - Handle(StepKinematics_CylindricalPairWithRange) aCylindricalPairWithRange = Handle(StepKinematics_CylindricalPairWithRange)::DownCast(theKinematicPair); - Standard_Real aUpperLimitActualTranslation = aLowOrderPairObj->MaxTranslationZ(); - Standard_Real aLowerLimitActualTranslation = aLowOrderPairObj->MinTranslationZ(); - Standard_Real aLowerLimitActualRotation = aLowOrderPairObj->MinRotationZ(); - Standard_Real aUpperLimitActualRotation = aLowOrderPairObj->MaxRotationZ(); - aCylindricalPairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitActualTranslation, Standard_True, - aUpperLimitActualTranslation, Standard_True, aLowerLimitActualRotation, Standard_True, aUpperLimitActualRotation); - } - else - { - theKinematicPair = new StepKinematics_CylindricalPair; - Handle(StepKinematics_CylindricalPair) aCylindricalPair = Handle(StepKinematics_CylindricalPair)::DownCast(theKinematicPair); - aCylindricalPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ); - } - break; + Handle(StepRepr_RepresentationItem) aReprItem = new StepRepr_RepresentationItem(); + aReprItem->Init(new TCollection_HAsciiString(theName)); + Handle(StepBasic_MeasureWithUnit) aMWU = new StepBasic_MeasureWithUnit(); + Handle(StepBasic_MeasureValueMember) aValueMember = new StepBasic_MeasureValueMember(); + aValueMember->SetName(theMeasureName); + aValueMember->SetReal(theValue); + aMWU->Init(aValueMember, theUnit); + if (isQualified) { + if (isAngle) { + // Angle & with qualifiers + Handle(StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI) anItem = + new StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI(); + anItem->Init(aMWU, aReprItem, theQRI); + return anItem; } - case(XCAFKinematics_PairType_Universal): - { - aTX = Standard_False; - aTY = Standard_False; - aTZ = Standard_False; - aRY = Standard_False; - Standard_Real theUniversalPair_InputSkewAngle = aLowOrderPairObj->SkewAngle(); - if (isRanged) - { - theKinematicPair = new StepKinematics_UniversalPairWithRange; - Handle(StepKinematics_UniversalPairWithRange) anUniversalPairWithRange = Handle(StepKinematics_UniversalPairWithRange)::DownCast(theKinematicPair); - Standard_Real aUpperLimitActualRotationX = aLowOrderPairObj->MaxRotationX(); - Standard_Real aLowerLimitActualRotationX = aLowOrderPairObj->MinRotationX(); - Standard_Real aUpperLimitActualRotationZ = aLowOrderPairObj->MaxRotationZ(); - Standard_Real aLowerLimitActualRotationZ = aLowOrderPairObj->MinRotationZ(); - anUniversalPairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, theUniversalPair_InputSkewAngle, Standard_True, aLowerLimitActualRotationX, Standard_True, - aUpperLimitActualRotationX, Standard_True, aLowerLimitActualRotationZ, Standard_True, aUpperLimitActualRotationZ); - } - else - { - theKinematicPair = new StepKinematics_UniversalPair; - Handle(StepKinematics_UniversalPair) anUniversalPair = Handle(StepKinematics_UniversalPair)::DownCast(theKinematicPair); - anUniversalPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, theUniversalPair_InputSkewAngle); - } - break; + else { + // Length & with qualifiers + Handle(StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI) anItem = + new StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI(); + anItem->Init(aMWU, aReprItem, theQRI); + return anItem; } - case(XCAFKinematics_PairType_SphericalWithPin): - { - aTX = Standard_False; - aTY = Standard_False; - aTZ = Standard_False; - aRX = Standard_False; - aRY = Standard_False; - if (isRanged) - { - Standard_Real aUpperLimitYaw = aLowOrderPairObj->MaxRotationZ(); - Standard_Real aLowerLimitYaw = aLowOrderPairObj->MinRotationZ(); - Standard_Real aUpperLimitRoll = aLowOrderPairObj->MaxRotationX(); - Standard_Real aLowerLimitRoll = aLowOrderPairObj->MinRotationX(); - theKinematicPair = new StepKinematics_SphericalPairWithPinAndRange; - Handle(StepKinematics_SphericalPairWithPinAndRange) aSphericalPairWithPinAndRange = Handle(StepKinematics_SphericalPairWithPinAndRange)::DownCast(theKinematicPair); - aSphericalPairWithPinAndRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitYaw, Standard_True, - aUpperLimitYaw, Standard_True, aLowerLimitRoll, Standard_True, aUpperLimitRoll); - } - else - { - theKinematicPair = new StepKinematics_SphericalPairWithPin; - Handle(StepKinematics_SphericalPairWithPin) aSphericalPairWithPin = Handle(StepKinematics_SphericalPairWithPin)::DownCast(theKinematicPair); - aSphericalPairWithPin->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ); - } - break; + } + else { + if (isAngle) { + // Angle & without qualifiers + Handle(StepRepr_ReprItemAndPlaneAngleMeasureWithUnit) anItem = + new StepRepr_ReprItemAndPlaneAngleMeasureWithUnit(); + anItem->Init(aMWU, aReprItem); + return anItem; } - case(XCAFKinematics_PairType_Spherical): - { - aTX = Standard_False; - aTY = Standard_False; - aTZ = Standard_False; - if (isRanged) - { - Standard_Real aUpperLimitYaw = aLowOrderPairObj->MaxRotationZ(); - Standard_Real aLowerLimitYaw = aLowOrderPairObj->MinRotationZ(); - Standard_Real aUpperLimitRoll = aLowOrderPairObj->MaxRotationX(); - Standard_Real aLowerLimitRoll = aLowOrderPairObj->MinRotationX(); - Standard_Real aUpperLimitPitch = aLowOrderPairObj->MaxRotationY(); - Standard_Real aLowerLimitPitch= aLowOrderPairObj->MinRotationY(); - theKinematicPair = new StepKinematics_SphericalPairWithRange; - Handle(StepKinematics_SphericalPairWithRange) aSphericalPairWithRange = Handle(StepKinematics_SphericalPairWithRange)::DownCast(theKinematicPair); - aSphericalPairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitYaw, Standard_True, - aUpperLimitYaw, Standard_True, aLowerLimitRoll, Standard_True, aUpperLimitRoll, Standard_True, aLowerLimitPitch, Standard_True, aUpperLimitPitch); - } - else - { - theKinematicPair = new StepKinematics_SphericalPair; - Handle(StepKinematics_SphericalPair) aSphericalPair = Handle(StepKinematics_SphericalPair)::DownCast(theKinematicPair); - aSphericalPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ); - } - break; + else { + // Length & without qualifiers + Handle(StepRepr_ReprItemAndLengthMeasureWithUnit) anItem = + new StepRepr_ReprItemAndLengthMeasureWithUnit(); + anItem->Init(aMWU, aReprItem); + return anItem; } - case(XCAFKinematics_PairType_Planar): - { - aTZ = Standard_False; - aRX = Standard_False; - aRY = Standard_False; - if (isRanged) - { - theKinematicPair = new StepKinematics_PlanarPairWithRange; - Handle(StepKinematics_PlanarPairWithRange) aPlanarPairWithRange = Handle(StepKinematics_PlanarPairWithRange)::DownCast(theKinematicPair); - Standard_Real aUpperLimitActualTranslationX = aLowOrderPairObj->MaxTranslationX(); - Standard_Real aLowerLimitActualTranslationX = aLowOrderPairObj->MinTranslationX(); - Standard_Real aUpperLimitActualTranslationY = aLowOrderPairObj->MaxTranslationY(); - Standard_Real aLowerLimitActualTranslationY = aLowOrderPairObj->MinTranslationY(); - Standard_Real aLowerLimitActualRotation = aLowOrderPairObj->MinRotationZ(); - Standard_Real aUpperLimitActualRotation = aLowOrderPairObj->MaxRotationZ(); - aPlanarPairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitActualTranslationX, Standard_True, aUpperLimitActualTranslationX, - Standard_True, aLowerLimitActualTranslationY, Standard_True, aUpperLimitActualTranslationY, - Standard_True, aLowerLimitActualRotation, Standard_True, aUpperLimitActualRotation); - } - else - { - theKinematicPair = new StepKinematics_PlanarPair; - Handle(StepKinematics_PlanarPair) aPlanarPair = Handle(StepKinematics_PlanarPair)::DownCast(theKinematicPair); - aPlanarPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ); - } - break; - } - case(XCAFKinematics_PairType_Unconstrained): - { - theKinematicPair = new StepKinematics_LowOrderKinematicPairWithRange; - - Standard_Real aUpperLimitActualTranslationX = aLowOrderPairObj->MaxTranslationX(); - Standard_Real aLowerLimitActualTranslationX = aLowOrderPairObj->MinTranslationX(); - Standard_Real aUpperLimitActualTranslationY = aLowOrderPairObj->MaxTranslationY(); - Standard_Real aLowerLimitActualTranslationY = aLowOrderPairObj->MinTranslationY(); - Standard_Real aUpperLimitActualTranslationZ = aLowOrderPairObj->MaxTranslationZ(); - Standard_Real aLowerLimitActualTranslationZ = aLowOrderPairObj->MinTranslationZ(); - Standard_Real aLowerLimitActualRotationX = aLowOrderPairObj->MinRotationX(); - Standard_Real aUpperLimitActualRotationX = aLowOrderPairObj->MaxRotationX(); - Standard_Real aLowerLimitActualRotationY = aLowOrderPairObj->MinRotationY(); - Standard_Real aUpperLimitActualRotationY = aLowOrderPairObj->MaxRotationY(); - Standard_Real aLowerLimitActualRotationZ = aLowOrderPairObj->MinRotationZ(); - Standard_Real aUpperLimitActualRotationZ = aLowOrderPairObj->MaxRotationZ(); - Handle(StepKinematics_LowOrderKinematicPairWithRange) anUnconstrainedPairWithRange = Handle(StepKinematics_LowOrderKinematicPairWithRange)::DownCast(theKinematicPair); - anUnconstrainedPairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitActualRotationX, Standard_True, aUpperLimitActualRotationX, - Standard_True, aLowerLimitActualRotationY, Standard_True, aUpperLimitActualRotationY, - Standard_True, aLowerLimitActualRotationZ, Standard_True, aUpperLimitActualRotationZ, - Standard_True, aLowerLimitActualTranslationX, Standard_True, aUpperLimitActualTranslationX, - Standard_True, aLowerLimitActualTranslationY, Standard_True, aUpperLimitActualTranslationY, - Standard_True, aLowerLimitActualTranslationZ, Standard_True, aUpperLimitActualTranslationZ); - break; - } - case(XCAFKinematics_PairType_FullyConstrained): - { - theKinematicPair = new StepKinematics_FullyConstrainedPair; - Handle(StepKinematics_FullyConstrainedPair) aFullyConstrainedPair = Handle(StepKinematics_FullyConstrainedPair)::DownCast(theKinematicPair); - aFullyConstrainedPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ); - break; - } - case(XCAFKinematics_PairType_Homokinetic): - { - aTX = Standard_False; - aTY = Standard_False; - aTZ = Standard_False; - aRY = Standard_False; - Standard_Real InputSkewAngle = aLowOrderPairObj->SkewAngle(); - theKinematicPair = new StepKinematics_HomokineticPair; - Handle(StepKinematics_HomokineticPair) aHomokineticPair = Handle(StepKinematics_HomokineticPair)::DownCast(theKinematicPair); - aHomokineticPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, - aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, InputSkewAngle); - break; - } - default: - return Standard_False; - } - } - else if (theKinPairObj->IsKind(STANDARD_TYPE(XCAFKinematics_LowOrderPairObjectWithCoupling))) - { - Handle(XCAFKinematics_LowOrderPairObjectWithCoupling) aLowOrderPairObjectWithCoupling = Handle(XCAFKinematics_LowOrderPairObjectWithCoupling)::DownCast(theKinPairObj); - switch (theKinPairObj->Type()) - { - case(XCAFKinematics_PairType_Screw): - { - Standard_Real aPitch = aLowOrderPairObjectWithCoupling->Pitch(); - if (isRanged) - { - theKinematicPair = new StepKinematics_ScrewPairWithRange; - Handle(StepKinematics_ScrewPairWithRange) aScrewPairWithRange = Handle(StepKinematics_ScrewPairWithRange)::DownCast(theKinematicPair); - Standard_Real aLowLimit = aLowOrderPairObjectWithCoupling->LowLimit(); - Standard_Real aUpperLimit = aLowOrderPairObjectWithCoupling->UpperLimit(); - aScrewPairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint,aPitch, - Standard_True, aLowLimit, Standard_True, aUpperLimit); - } - else - { - theKinematicPair = new StepKinematics_ScrewPair; - Handle(StepKinematics_ScrewPair) aScrewPair = Handle(StepKinematics_ScrewPair)::DownCast(theKinematicPair); - aScrewPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint,aPitch); - } - break; - } - case(XCAFKinematics_PairType_RackAndPinion): - { - Standard_Real aPinionRadius = aLowOrderPairObjectWithCoupling->PinionRadius(); - if (isRanged) - { - theKinematicPair = new StepKinematics_RackAndPinionPairWithRange; - Standard_Real aLowLimit = aLowOrderPairObjectWithCoupling->LowLimit(); - Standard_Real aUpperLimit = aLowOrderPairObjectWithCoupling->UpperLimit(); - Handle(StepKinematics_RackAndPinionPairWithRange) aRackAndPinionPairWithRange = Handle(StepKinematics_RackAndPinionPairWithRange)::DownCast(theKinematicPair); - aRackAndPinionPairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPinionRadius, - Standard_True, aLowLimit, Standard_True, aUpperLimit); - } - else - { - theKinematicPair = new StepKinematics_RackAndPinionPair; - Handle(StepKinematics_RackAndPinionPair) aRackAndPinionPair = Handle(StepKinematics_RackAndPinionPair)::DownCast(theKinematicPair); - aRackAndPinionPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPinionRadius); - } - break; - } - case(XCAFKinematics_PairType_Gear): - { - Standard_Real aBevel = aLowOrderPairObjectWithCoupling->Bevel(); - Standard_Real aGearRatio = aLowOrderPairObjectWithCoupling->GearRatio(); - Standard_Real aHelicalAngle = aLowOrderPairObjectWithCoupling->HelicalAngle(); - Standard_Real aRadiusFirstLink = aLowOrderPairObjectWithCoupling->RadiusFirstLink();; - Standard_Real aRadiusSecondLink = aLowOrderPairObjectWithCoupling->RadiusSecondLink();; - if (isRanged) - { - Standard_Real aLowLimit = aLowOrderPairObjectWithCoupling->LowLimit(); - Standard_Real aUpperLimit = aLowOrderPairObjectWithCoupling->UpperLimit(); - theKinematicPair = new StepKinematics_GearPairWithRange; - Handle(StepKinematics_GearPairWithRange) aGearPairWithRange = Handle(StepKinematics_GearPairWithRange)::DownCast(theKinematicPair); - aGearPairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aRadiusFirstLink, aRadiusSecondLink, aBevel, aHelicalAngle, aGearRatio, - Standard_True, aLowLimit, Standard_True, aUpperLimit); - } - else - { - theKinematicPair = new StepKinematics_GearPair; - Handle(StepKinematics_GearPair) aGearPair = Handle(StepKinematics_GearPair)::DownCast(theKinematicPair); - aGearPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint,aRadiusFirstLink,aRadiusSecondLink,aBevel,aHelicalAngle, aGearRatio); - } - break; - } - case(XCAFKinematics_PairType_LinearFlexibleAndPinion): - { - Standard_Real aPinionRadius = aLowOrderPairObjectWithCoupling->PinionRadius(); - theKinematicPair = new StepKinematics_LinearFlexibleAndPinionPair; - Handle(StepKinematics_LinearFlexibleAndPinionPair) aLinearFlexibleAndPinionPair = Handle(StepKinematics_LinearFlexibleAndPinionPair)::DownCast(theKinematicPair); - aLinearFlexibleAndPinionPair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPinionRadius); - break; - } - default: - return Standard_False; - } - } - else if (theKinPairObj->IsKind(STANDARD_TYPE(XCAFKinematics_HighOrderPairObject))) - { - Handle(XCAFKinematics_HighOrderPairObject) aHighOrderPairObject = Handle(XCAFKinematics_HighOrderPairObject)::DownCast(theKinPairObj); - switch (theKinPairObj->Type()) - { - case(XCAFKinematics_PairType_PointOnSurface): - { - GeomToStep_MakeSurface aMaker(aHighOrderPairObject->Surface()); - Handle(StepGeom_Surface) aPairSurface = aMaker.Value(); - if (isRanged && !aPairSurface.IsNull() && - aPairSurface->IsKind(STANDARD_TYPE(StepGeom_RectangularTrimmedSurface))) - { - Standard_Real aLowerLimitYaw = aHighOrderPairObject->LowLimitYaw(); - Standard_Real aUpperLimitYaw = aHighOrderPairObject->UpperLimitYaw(); - Standard_Real aLowerLimitPitch = aHighOrderPairObject->LowLimitPitch(); - Standard_Real aUpperLimitPitch = aHighOrderPairObject->UpperLimitPitch(); - Standard_Real aLowerLimitRoll = aHighOrderPairObject->LowLimitRoll(); - Standard_Real aUpperLimitRoll = aHighOrderPairObject->UpperLimitRoll(); - GeomToStep_MakeSurface aMakerSurface(aHighOrderPairObject->Surface()); - Handle(StepGeom_RectangularTrimmedSurface) aRangeOnPairSurface = Handle(StepGeom_RectangularTrimmedSurface)::DownCast(aMakerSurface.Value()); - theKinematicPair = new StepKinematics_PointOnSurfacePairWithRange; - Handle(StepKinematics_PointOnSurfacePairWithRange) aPointOnSurfacePairWithRange = Handle(StepKinematics_PointOnSurfacePairWithRange)::DownCast(theKinematicPair); - aPointOnSurfacePairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPairSurface,aRangeOnPairSurface, Standard_True, aLowerLimitYaw, Standard_True, aUpperLimitYaw, Standard_True, - aLowerLimitPitch, Standard_True, aUpperLimitPitch, Standard_True, aLowerLimitRoll, Standard_True, aUpperLimitRoll); - } - else - { - theKinematicPair = new StepKinematics_PointOnSurfacePair; - Handle(StepKinematics_PointOnSurfacePair) aPointOnSurface = Handle(StepKinematics_PointOnSurfacePair)::DownCast(theKinematicPair); - aPointOnSurface->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPairSurface); - } - break; - } - case(XCAFKinematics_PairType_SlidingSurface): - { - theKinematicPair = new StepKinematics_SlidingSurfacePair; - GeomToStep_MakeSurface aMaker(aHighOrderPairObject->FirstSurface()); - Handle(StepGeom_Surface) aPairSurfac1 = aMaker.Value(); - GeomToStep_MakeSurface aMaker2(aHighOrderPairObject->SecondSurface()); - Handle(StepGeom_Surface) aPairSurface2 = aMaker2.Value(); - Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); - Handle(StepKinematics_SlidingSurfacePair) aSlidingSurfacePair = Handle(StepKinematics_SlidingSurfacePair)::DownCast(theKinematicPair); - aSlidingSurfacePair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPairSurfac1, aPairSurface2, anOrientation); - break; - } - case(XCAFKinematics_PairType_RollingSurface): - { - theKinematicPair = new StepKinematics_RollingSurfacePair; - GeomToStep_MakeSurface aMaker(aHighOrderPairObject->FirstSurface()); - Handle(StepGeom_Surface) aPairSurfac1 = aMaker.Value(); - GeomToStep_MakeSurface aMaker2(aHighOrderPairObject->SecondSurface()); - Handle(StepGeom_Surface) aPairSurface2 = aMaker2.Value(); - Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); - Handle(StepKinematics_RollingSurfacePair) aRollingSurfacePair = Handle(StepKinematics_RollingSurfacePair)::DownCast(theKinematicPair); - aRollingSurfacePair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPairSurfac1, aPairSurface2, anOrientation); - break; - } - case(XCAFKinematics_PairType_PointOnPlanarCurve): - { - GeomToStep_MakeCurve aMaker(aHighOrderPairObject->Curve()); - Handle(StepGeom_Curve) aPairCurve = aMaker.Value(); - Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); - if (isRanged && !aPairCurve.IsNull() && - aPairCurve->IsKind(STANDARD_TYPE(StepGeom_TrimmedCurve))) - { - Standard_Real aLowerLimitYaw = aHighOrderPairObject->LowLimitYaw(); - Standard_Real aUpperLimitYaw = aHighOrderPairObject->UpperLimitYaw(); - Standard_Real aLowerLimitPitch = aHighOrderPairObject->LowLimitPitch(); - Standard_Real aUpperLimitPitch = aHighOrderPairObject->UpperLimitPitch(); - Standard_Real aLowerLimitRoll = aHighOrderPairObject->LowLimitRoll(); - Standard_Real aUpperLimitRoll = aHighOrderPairObject->UpperLimitRoll(); - Handle(StepGeom_TrimmedCurve) aRangeOnPairCurve = Handle(StepGeom_TrimmedCurve)::DownCast(aPairCurve); - theKinematicPair = new StepKinematics_PointOnPlanarCurvePairWithRange; - Handle(StepKinematics_PointOnPlanarCurvePairWithRange) aPointOnPlanarCurvePairWithRange = Handle(StepKinematics_PointOnPlanarCurvePairWithRange)::DownCast(theKinematicPair); - aPointOnPlanarCurvePairWithRange->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPairCurve, anOrientation, aRangeOnPairCurve, Standard_True, aLowerLimitYaw, Standard_True, aUpperLimitYaw, Standard_True, - aLowerLimitPitch, Standard_True, aUpperLimitPitch, Standard_True, aLowerLimitRoll, Standard_True, aUpperLimitRoll); - } - else - { - theKinematicPair = new StepKinematics_PointOnPlanarCurvePair; - Handle(StepKinematics_PointOnPlanarCurvePair) aPointOnPlanarCurvePair = Handle(StepKinematics_PointOnPlanarCurvePair)::DownCast(theKinematicPair); - aPointOnPlanarCurvePair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPairCurve, anOrientation); - } - break; - } - case(XCAFKinematics_PairType_SlidingCurve): - { - GeomToStep_MakeCurve aMaker(aHighOrderPairObject->FirstCurve()); - Handle(StepGeom_Curve) aPairCurve = aMaker.Value(); - Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); - GeomToStep_MakeCurve aMaker2(aHighOrderPairObject->SecondCurve()); - Handle(StepGeom_Curve) aPairCurve2 = aMaker2.Value(); - theKinematicPair = new StepKinematics_SlidingCurvePair; - Handle(StepKinematics_SlidingCurvePair) aSlidingCurvePair = Handle(StepKinematics_SlidingCurvePair)::DownCast(theKinematicPair); - aSlidingCurvePair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPairCurve, aPairCurve2, anOrientation); - break; - } - case(XCAFKinematics_PairType_RollingCurve): - { - GeomToStep_MakeCurve aMaker(aHighOrderPairObject->FirstCurve()); - Handle(StepGeom_Curve) aPairCurve = aMaker.Value(); - Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); - GeomToStep_MakeCurve aMaker2(aHighOrderPairObject->SecondCurve()); - Handle(StepGeom_Curve) aPairCurve2 = aMaker2.Value(); - theKinematicPair = new StepKinematics_RollingCurvePair; - Handle(StepKinematics_RollingCurvePair) aRollingCurvePair = Handle(StepKinematics_RollingCurvePair)::DownCast(theKinematicPair); - aRollingCurvePair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPairCurve, aPairCurve2, anOrientation); - break; - } - case(XCAFKinematics_PairType_LinearFlexibleAndPlanarCurve): - { - theKinematicPair = new StepKinematics_LinearFlexibleAndPlanarCurvePair; - GeomToStep_MakeCurve aMaker(aHighOrderPairObject->Curve()); - Handle(StepGeom_Curve) aPairCurve = aMaker.Value(); - Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); - Handle(StepKinematics_LinearFlexibleAndPlanarCurvePair) aLinearFlexibleAndPlanarCurvePair = Handle(StepKinematics_LinearFlexibleAndPlanarCurvePair)::DownCast(theKinematicPair); - aLinearFlexibleAndPlanarCurvePair->Init(aPairName, aPairName, hasDescription, - aDescription, aTransformItem1, aTransformItem2, theJoint, aPairCurve, anOrientation); - break; - } - default: - return Standard_False; - } - } - - // updating placements of the both link representations - theLinkRepr1->Items()->Resize(theLinkRepr1->Items()->Lower(), theLinkRepr1->Items()->Upper() + 1, Standard_True); - theLinkRepr1->Items()->ChangeLast() = aTransformItem1; - theLinkRepr2->Items()->Resize(theLinkRepr2->Items()->Lower(), theLinkRepr2->Items()->Upper() + 1, Standard_True); - theLinkRepr2->Items()->ChangeLast() = aTransformItem2; - - return Standard_True; -} - -//======================================================================= -//function : createKinematicPairValue -//purpose : -//======================================================================= -static Standard_Boolean createKinematicPairValue(const Handle(XCAFKinematics_PairValueObject)& theKinPairValueObj, - const Handle(StepKinematics_PairRepresentationRelationship)& thePairReprRelationship, - Handle(StepKinematics_PairValue)& thePairValue) -{ - if (theKinPairValueObj->Type() == XCAFKinematics_PairType_NoType) - return Standard_False; - - switch (theKinPairValueObj->Type()) - { - case(XCAFKinematics_PairType_Revolute): - { - thePairValue = new StepKinematics_RevolutePairValue; - Handle(StepKinematics_RevolutePairValue) aRevolutePairValue = - Handle(StepKinematics_RevolutePairValue)::DownCast(thePairValue); - aRevolutePairValue->SetActualRotation(theKinPairValueObj->GetRotation()); - break; - } - case(XCAFKinematics_PairType_Prismatic): - { - thePairValue = new StepKinematics_PrismaticPairValue; - Handle(StepKinematics_PrismaticPairValue) aPrismaticPairValue = - Handle(StepKinematics_PrismaticPairValue)::DownCast(thePairValue); - aPrismaticPairValue->SetActualTranslation(theKinPairValueObj->GetTranslation()); - break; - } - case(XCAFKinematics_PairType_Cylindrical): - { - thePairValue = new StepKinematics_CylindricalPairValue; - Handle(StepKinematics_CylindricalPairValue) aCylindricalPairValue = - Handle(StepKinematics_CylindricalPairValue)::DownCast(thePairValue); - aCylindricalPairValue->SetActualTranslation(theKinPairValueObj->GetTranslation()); - aCylindricalPairValue->SetActualRotation(theKinPairValueObj->GetRotation()); - break; - } - case(XCAFKinematics_PairType_Universal): - case(XCAFKinematics_PairType_Homokinetic): - { - thePairValue = new StepKinematics_UniversalPairValue; - Handle(StepKinematics_UniversalPairValue) aUniversalPairValue = - Handle(StepKinematics_UniversalPairValue)::DownCast(thePairValue); - aUniversalPairValue->SetFirstRotationAngle(theKinPairValueObj->GetFirstRotation()); - aUniversalPairValue->SetSecondRotationAngle(theKinPairValueObj->GetSecondRotation()); - break; - } - case(XCAFKinematics_PairType_Spherical): - case(XCAFKinematics_PairType_SphericalWithPin): - { - thePairValue = new StepKinematics_SphericalPairValue; - Handle(StepKinematics_SphericalPairValue) aSphericalPairValue = - Handle(StepKinematics_SphericalPairValue)::DownCast(thePairValue); - StepKinematics_SpatialRotation InputRotation; - InputRotation.SetValue(theKinPairValueObj->GetAllValues()); - aSphericalPairValue->SetInputOrientation(InputRotation); - break; - } - case(XCAFKinematics_PairType_Planar): - { - thePairValue = new StepKinematics_PlanarPairValue; - Handle(StepKinematics_PlanarPairValue) aPlanarPairValue = - Handle(StepKinematics_PlanarPairValue)::DownCast(thePairValue); - aPlanarPairValue->SetActualRotation(theKinPairValueObj->GetRotation()); - aPlanarPairValue->SetActualTranslationX(theKinPairValueObj->GetFirstTranslation()); - aPlanarPairValue->SetActualTranslationY(theKinPairValueObj->GetSecondTranslation()); - break; - } - case(XCAFKinematics_PairType_Unconstrained): - { - thePairValue = new StepKinematics_UnconstrainedPairValue; - Handle(StepKinematics_UnconstrainedPairValue) anUnconstrainedPairValue = - Handle(StepKinematics_UnconstrainedPairValue)::DownCast(thePairValue); - GeomToStep_MakeAxis2Placement3d anActualPlacement(theKinPairValueObj->GetTransformation()); - anUnconstrainedPairValue->SetActualPlacement(anActualPlacement.Value()); - break; - } - case(XCAFKinematics_PairType_Screw): - { - thePairValue = new StepKinematics_ScrewPairValue; - Handle(StepKinematics_ScrewPairValue) aScrewPairValue = - Handle(StepKinematics_ScrewPairValue)::DownCast(thePairValue); - aScrewPairValue->SetActualRotation(theKinPairValueObj->GetRotation()); - break; - } - case(XCAFKinematics_PairType_RackAndPinion): - { - thePairValue = new StepKinematics_RackAndPinionPairValue; - Handle(StepKinematics_RackAndPinionPairValue) aRackAndPinionPairValue = - Handle(StepKinematics_RackAndPinionPairValue)::DownCast(thePairValue); - aRackAndPinionPairValue->SetActualDisplacement(theKinPairValueObj->GetTranslation()); - break; - } - case(XCAFKinematics_PairType_Gear): - { - thePairValue = new StepKinematics_GearPairValue; - Handle(StepKinematics_GearPairValue) aGearPairValue = - Handle(StepKinematics_GearPairValue)::DownCast(thePairValue); - aGearPairValue->SetActualRotation1(theKinPairValueObj->GetRotation()); - break; - } - case(XCAFKinematics_PairType_PointOnSurface): - { - thePairValue = new StepKinematics_PointOnSurfacePairValue; - Handle(StepKinematics_PointOnSurfacePairValue) aPointOnSurfacePairValue = - Handle(StepKinematics_PointOnSurfacePairValue)::DownCast(thePairValue); - Handle(StepGeom_PointOnSurface) aActualPointOnSurface = new StepGeom_PointOnSurface; - Handle(StepKinematics_PointOnSurfacePair) aPointOnSurfacePair = - Handle(StepKinematics_PointOnSurfacePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); - Standard_Real theU; - Standard_Real theV; - theKinPairValueObj->GetPointOnSurface(theU, theV); - aActualPointOnSurface->Init(new TCollection_HAsciiString, aPointOnSurfacePair->PairSurface(), theU, theV); - aPointOnSurfacePairValue->SetActualPointOnSurface(aActualPointOnSurface); - StepKinematics_SpatialRotation aYRP; - Handle(TColStd_HArray1OfReal) anArrayYRP = new TColStd_HArray1OfReal(1,3); - Standard_Real aYaw; - Standard_Real aPitch; - Standard_Real aRoll; - theKinPairValueObj->GetYPR(aYaw, aPitch, aRoll); - anArrayYRP->SetValue(1, aYaw); - anArrayYRP->SetValue(2, aPitch); - anArrayYRP->SetValue(3, aRoll); - aYRP.SetValue(anArrayYRP); - aPointOnSurfacePairValue->SetInputOrientation(aYRP); - break; - } - case(XCAFKinematics_PairType_SlidingSurface): - { - thePairValue = new StepKinematics_SlidingSurfacePairValue; - Handle(StepKinematics_SlidingSurfacePairValue) aSlidingSurfacePairValue = - Handle(StepKinematics_SlidingSurfacePairValue)::DownCast(thePairValue); - Handle(StepGeom_PointOnSurface) aActualPointOnSurface1 = new StepGeom_PointOnSurface; - Handle(StepKinematics_SlidingSurfacePair) SlidingSurfacePair = - Handle(StepKinematics_SlidingSurfacePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); - Standard_Real theU1; - Standard_Real theV1; - theKinPairValueObj->GetFirstPointOnSurface(theU1, theV1); - aActualPointOnSurface1->Init(new TCollection_HAsciiString, SlidingSurfacePair->Surface1(), theU1, theV1); - aSlidingSurfacePairValue->SetActualPointOnSurface1(aActualPointOnSurface1); - Handle(StepGeom_PointOnSurface) aActualPointOnSurface2 = new StepGeom_PointOnSurface; - Standard_Real theU2; - Standard_Real theV2; - theKinPairValueObj->GetSecondPointOnSurface(theU2, theV2); - aActualPointOnSurface2->Init(new TCollection_HAsciiString, SlidingSurfacePair->Surface2(), theU2, theV2); - aSlidingSurfacePairValue->SetActualPointOnSurface2(aActualPointOnSurface2); - aSlidingSurfacePairValue->SetActualRotation(theKinPairValueObj->GetRotation()); - break; - } - case(XCAFKinematics_PairType_RollingSurface): - { - thePairValue = new StepKinematics_RollingSurfacePairValue; - Handle(StepKinematics_RollingSurfacePairValue) aRollingSurfacePairValue = - Handle(StepKinematics_RollingSurfacePairValue)::DownCast(thePairValue); - aRollingSurfacePairValue->SetActualRotation(theKinPairValueObj->GetRotation()); - Handle(StepGeom_PointOnSurface) aActualPointOnSurface = new StepGeom_PointOnSurface; - Handle(StepKinematics_RollingSurfacePair) aRollingSurfacePair = - Handle(StepKinematics_RollingSurfacePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); - Standard_Real theU; - Standard_Real theV; - theKinPairValueObj->GetPointOnSurface(theU, theV); - aActualPointOnSurface->Init(new TCollection_HAsciiString, aRollingSurfacePair->Surface1(), theU, theV); - aRollingSurfacePairValue->SetActualPointOnSurface(aActualPointOnSurface); - break; - } - case(XCAFKinematics_PairType_PointOnPlanarCurve): - { - thePairValue = new StepKinematics_PointOnPlanarCurvePairValue; - Handle(StepKinematics_PointOnPlanarCurvePairValue) aPointOnPlanarCurvePairValue = - Handle(StepKinematics_PointOnPlanarCurvePairValue)::DownCast(thePairValue); - StepKinematics_SpatialRotation aYRP; - Handle(TColStd_HArray1OfReal) anArrayYRP = new TColStd_HArray1OfReal(1, 3); - Standard_Real aYaw; - Standard_Real aPitch; - Standard_Real aRoll; - theKinPairValueObj->GetYPR(aYaw, aPitch, aRoll); - anArrayYRP->SetValue(1, aYaw); - anArrayYRP->SetValue(2, aPitch); - anArrayYRP->SetValue(3, aRoll); - aYRP.SetValue(anArrayYRP); - aPointOnPlanarCurvePairValue->SetInputOrientation(aYRP); - Handle(StepGeom_PointOnCurve) anActualPointOnCurve = new StepGeom_PointOnCurve; - Handle(StepKinematics_PointOnPlanarCurvePair) aPointOnPlanarCurvePair = - Handle(StepKinematics_PointOnPlanarCurvePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); - Standard_Real aParametr = theKinPairValueObj->GetPointOnCurve(); - anActualPointOnCurve->Init(aPointOnPlanarCurvePair->Name(), aPointOnPlanarCurvePair->PairCurve(), aParametr); - aPointOnPlanarCurvePairValue->SetActualPointOnCurve(anActualPointOnCurve); - break; - } - case(XCAFKinematics_PairType_SlidingCurve): - { - thePairValue = new StepKinematics_SlidingCurvePairValue; - Handle(StepKinematics_SlidingCurvePairValue) aSlidingCurvePairValue = - Handle(StepKinematics_SlidingCurvePairValue)::DownCast(thePairValue); - Handle(StepGeom_PointOnCurve) anActualPointOnCurve1 = new StepGeom_PointOnCurve; - Handle(StepKinematics_SlidingCurvePair) aSlidingCurvePair = - Handle(StepKinematics_SlidingCurvePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); - Standard_Real aParametr1 = theKinPairValueObj->GetFirstPointOnCurve(); - anActualPointOnCurve1->Init(aSlidingCurvePair->Name(), aSlidingCurvePair->Curve1(), aParametr1); - aSlidingCurvePairValue->SetActualPointOnCurve1(anActualPointOnCurve1); - Handle(StepGeom_PointOnCurve) anActualPointOnCurve2 = new StepGeom_PointOnCurve; - Standard_Real aParametr2 = theKinPairValueObj->GetSecondPointOnCurve(); - anActualPointOnCurve2->Init(aSlidingCurvePair->Name(), aSlidingCurvePair->Curve2(), aParametr2); - aSlidingCurvePairValue->SetActualPointOnCurve2(anActualPointOnCurve2); - break; - } - case(XCAFKinematics_PairType_RollingCurve): - { - thePairValue = new StepKinematics_RollingCurvePairValue; - Handle(StepKinematics_RollingCurvePairValue) aRollingCurvePairValue = - Handle(StepKinematics_RollingCurvePairValue)::DownCast(thePairValue); - Handle(StepGeom_PointOnCurve) anActualPointOnCurve = new StepGeom_PointOnCurve; - Handle(StepKinematics_RollingCurvePair) aRollingCurvePair = - Handle(StepKinematics_RollingCurvePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); - Standard_Real aParametr = theKinPairValueObj->GetPointOnCurve(); - anActualPointOnCurve->Init(aRollingCurvePair->Name(), aRollingCurvePair->Curve1(), aParametr); - aRollingCurvePairValue->SetActualPointOnCurve1(anActualPointOnCurve); - break; - } - default: - return Standard_False; - break; } - Handle(StepKinematics_KinematicPair) aAppliesToPair = - thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair(); - thePairValue->SetAppliesToPair(aAppliesToPair); - thePairValue->SetName(aAppliesToPair->Name()); - return Standard_True; } //======================================================================= -//function : WriteKinematics -//purpose : +//function : WriteShapeAspect +//purpose : auxiliary (write Shape_Aspect entity for given shape) //======================================================================= -Standard_EXPORT Standard_Boolean STEPCAFControl_Writer::WriteKinematics(const Handle(XSControl_WorkSession)& theWS, const TDF_LabelSequence& theLabels) -{ - if (theLabels.Length() <= 0) return Standard_False; - - // get working data - const Handle(Interface_InterfaceModel)& Model = theWS->Model(); - - const Handle(Interface_HGraph) aHGraph = theWS->HGraph(); +Handle(StepRepr_ShapeAspect) STEPCAFControl_Writer::WriteShapeAspect (const Handle(XSControl_WorkSession) &WS, + const TDF_Label theLabel, + const TopoDS_Shape theShape, + Handle(StepRepr_RepresentationContext)& theRC, + Handle(StepAP242_GeometricItemSpecificUsage)& theGISU) +{ + // Get working data + const Handle(Interface_InterfaceModel) &Model = WS->Model(); + const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter(); + const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess(); + const Handle(Interface_HGraph) aHGraph = WS->HGraph(); if (aHGraph.IsNull()) - return Standard_False; - + return NULL; Interface_Graph aGraph = aHGraph->Graph(); - Handle(XCAFDoc_KinematicTool) aKTool = XCAFDoc_DocumentTool::KinematicTool(theLabels(1)); - if (aKTool.IsNull()) - return Standard_False; - - TDF_LabelSequence aMechanismsL; - aMechanismsL = aKTool->GetMechanisms(); - if (aMechanismsL.Length() <= 0) return Standard_False; - - for (TDF_LabelSequence::Iterator anItMech(aMechanismsL); anItMech.More(); anItMech.Next()) - { - // write Links - Handle(StepKinematics_RigidLinkRepresentation) aBaseLinkOfMech; - Handle(StepRepr_PropertyDefinition) aGeneralDefinition; - NCollection_IndexedDataMap aMapOfLinks; - - TDF_LabelSequence aSeqOfLinskL = aKTool->GetLinks(anItMech.Value()); - if (aSeqOfLinskL.Length() <= 0) - continue; - - for (TDF_LabelSequence::Iterator anItLink(aSeqOfLinskL); anItLink.More(); anItLink.Next()) - { - TDF_Label aLinkL = anItLink.Value(); - if (!createKinematicLink(theWS, aKTool, aGraph, aLinkL, aMapOfLinks, aBaseLinkOfMech, aGeneralDefinition)) - continue; - } - if (aGeneralDefinition.IsNull()) - continue; - // if not found base link in OCAF - // first rigid link became base of the mechanism - for (Standard_Integer anIndOfLink = 1; anIndOfLink <= aMapOfLinks.Size() && aBaseLinkOfMech.IsNull(); ++anIndOfLink) - aBaseLinkOfMech = Handle(StepKinematics_RigidLinkRepresentation)::DownCast(aMapOfLinks.FindFromIndex(anIndOfLink)); - if (aBaseLinkOfMech.IsNull()) - continue; - - // write joints - TDF_LabelSequence aSeqOfJointsL = aKTool->GetJoints(anItMech.Value()); - if (aSeqOfJointsL.Length() <= 0) - continue; - NCollection_IndexedDataMap aMapofJoints; - Handle(StepRepr_HArray1OfRepresentationItem) anArrayOfPairs = new StepRepr_HArray1OfRepresentationItem(1, aSeqOfJointsL.Length()); - - Handle(StepKinematics_KinematicPropertyMechanismRepresentation) aPropertyMechanismRepr = new StepKinematics_KinematicPropertyMechanismRepresentation; - Handle(StepKinematics_MechanismRepresentation) aMechanism = new StepKinematics_MechanismRepresentation; - StepRepr_RepresentedDefinition aPDK; - Handle(StepKinematics_KinematicTopologyStructure) aKTopoStruct = new StepKinematics_KinematicTopologyStructure; - Standard_Integer aJointInd = 1; - for (TDF_LabelSequence::Iterator anItJoint(aSeqOfJointsL); anItJoint.More(); anItJoint.Next()) - { - TDF_Label aJointL = anItJoint.Value(); - Handle(StepKinematics_KinematicJoint) aJoint; - Handle(XCAFDoc_KinematicPair) aKPairAttr; - Handle(StepKinematics_KinematicPair) aKinematicPair; - if (!aJointL.FindAttribute(XCAFDoc_KinematicPair::GetID(), aKPairAttr)) - continue; - Handle(XCAFKinematics_PairObject) aPairObject = aKPairAttr->GetObject(); - Handle(StepKinematics_KinematicLinkRepresentation) aLinkRepr1; - Handle(StepKinematics_KinematicLinkRepresentation) aLinkRepr2; - if (!createKinematicJoint(aKTool, aJointL, aPairObject, aMapOfLinks, aLinkRepr1, aLinkRepr2, aJoint)) - continue; - if (!createKinematicPair(aPairObject, aJoint, aLinkRepr1, aLinkRepr2, aKinematicPair)) - continue; - aMapofJoints.Add(anItJoint.Value(), aJoint); - Handle(StepKinematics_PairRepresentationRelationship) aPairReprRelationship = new StepKinematics_PairRepresentationRelationship; - StepRepr_RepresentationOrRepresentationReference aDataLinkStart; - aDataLinkStart.SetValue(aLinkRepr1); - StepRepr_RepresentationOrRepresentationReference aDataLinkEnd; - aDataLinkEnd.SetValue(aLinkRepr2); - StepRepr_Transformation aPair; - aPair.SetValue(aKinematicPair); - Handle(TCollection_HAsciiString) aDescription; - aPairReprRelationship->Init(aKinematicPair->Name(), aKinematicPair->Name(), Standard_False, aDescription, aDataLinkStart, aDataLinkEnd, aPair); - anArrayOfPairs->SetValue(aJointInd++, aPairReprRelationship); + TopLoc_Location aLoc; + TColStd_SequenceOfTransient aSeqRI; + FindEntities( FP, theShape, aLoc, aSeqRI ); + if ( aSeqRI.Length() <= 0 ) { + FP->Messenger()->SendInfo() << "Warning: Cannot find RI for "<DynamicType()->Name()<AddEntity(aJoint); - Model->AddWithRefs(aPairReprRelationship); - } + Handle(StepRepr_ProductDefinitionShape) aPDS; + Handle(StepRepr_RepresentationContext) aRC; + Handle(Standard_Transient) anEnt = aSeqRI.Value(1); + aPDS = FindPDS(aGraph, anEnt, aRC); + if(aPDS.IsNull()) + return NULL; - // write mechanism - Handle(StepKinematics_ProductDefinitionKinematics) aProductDefKin = new StepKinematics_ProductDefinitionKinematics; - aProductDefKin->Init(new TCollection_HAsciiString, Standard_False, new TCollection_HAsciiString, aGeneralDefinition->Definition()); - aKTopoStruct->Init(new TCollection_HAsciiString, anArrayOfPairs, aBaseLinkOfMech->ContextOfItems()); - StepKinematics_KinematicTopologyRepresentationSelect aTopoSelect; - aTopoSelect.SetValue(aKTopoStruct); - Handle(TDataStd_Name) aAttrName; - anItMech.Value().FindAttribute(TDataStd_Name::GetID(), aAttrName); - Handle(TCollection_HAsciiString) aHNameMechanism = new TCollection_HAsciiString(aAttrName->Get()); - aPDK.SetValue(aProductDefKin); - aMechanism->Init(aHNameMechanism, anArrayOfPairs, aBaseLinkOfMech->ContextOfItems(), aTopoSelect); - aPropertyMechanismRepr->Init(aPDK, aMechanism, aBaseLinkOfMech); - Model->AddWithRefs(aPropertyMechanismRepr); + theRC = aRC; + // Shape_Aspect + Handle(TCollection_HAsciiString) aName = new TCollection_HAsciiString(); + Handle(TDataStd_Name) aNameAttr; + if (theLabel.FindAttribute(TDataStd_Name::GetID(), aNameAttr)) { + aName = new TCollection_HAsciiString(TCollection_AsciiString(aNameAttr->Get(), '?')); + Standard_Integer aFirstSpace = aName->Search(" "); + if (aFirstSpace != -1) + aName = aName->SubString(aFirstSpace + 1, aName->Length()); + else + aName = new TCollection_HAsciiString(); + } + Handle(TCollection_HAsciiString) aDescription = new TCollection_HAsciiString(); + Handle(StepRepr_ShapeAspect) aSA = new StepRepr_ShapeAspect; + aSA->Init(aName, aDescription, aPDS, StepData_LTrue); - // (optional) write States - TDF_LabelSequence aSeqOfStates = aKTool->GetStates(anItMech.Value()); - for (TDF_LabelSequence::Iterator anItState(aSeqOfStates); anItState.More(); anItState.Next()) - { - Handle(StepKinematics_MechanismStateRepresentation) aStateRepr = new StepKinematics_MechanismStateRepresentation; - TDF_LabelSequence aSeqOfValues = aKTool->GetValuesOfState(anItState.Value()); - if (aSeqOfValues.IsEmpty()) - continue; - Handle(StepRepr_HArray1OfRepresentationItem) aItems = new StepRepr_HArray1OfRepresentationItem(1, aSeqOfValues.Length()); - Standard_Integer aValueInd = 1; - for (TDF_LabelSequence::Iterator anItValue(aSeqOfValues); anItValue.More(); anItValue.Next()) - { - TDF_Label aJointL = aKTool->GetJointOfValue(anItValue.Value()); - Handle(StepKinematics_KinematicJoint) aJoint; - Handle(StepKinematics_PairRepresentationRelationship) aPairReprRelationship; - if (!aMapofJoints.FindFromKey(aJointL, aJoint)) - continue; - aPairReprRelationship = Handle(StepKinematics_PairRepresentationRelationship)::DownCast(anArrayOfPairs->Value(aMapofJoints.FindIndex(aJointL))); - if (aPairReprRelationship.IsNull()) - continue; - Handle(XCAFDoc_KinematicPairValue) aKPairValueAttr; - if (!anItValue.Value().FindAttribute(XCAFDoc_KinematicPairValue::GetID(), aKPairValueAttr)) - continue; - Handle(TCollection_HAsciiString) aNameOfValue; - Handle(TDataStd_Name) aNameAttr; - if (anItValue.Value().FindAttribute(TDataStd_Name::GetID(), aNameAttr)) - aNameOfValue = new TCollection_HAsciiString(aNameAttr->Get()); - Handle(XCAFKinematics_PairValueObject) aPairValueObject = aKPairValueAttr->GetObject(); - Handle(StepKinematics_PairValue) aPairValue; - if (!createKinematicPairValue(aPairValueObject, aPairReprRelationship, aPairValue)) - continue; - aPairValue->SetName(aNameOfValue); - aItems->SetValue(aValueInd++, aPairValue); - } - if (aValueInd == 1) - continue; - Handle(TCollection_HAsciiString) aNameOfState; - Handle(TDataStd_Name) aNameAttr; - if (anItState.Value().FindAttribute(TDataStd_Name::GetID(), aNameAttr)) - aNameOfState = new TCollection_HAsciiString(aNameAttr->Get()); - aStateRepr->Init(aNameOfState, aItems, aMechanism->ContextOfItems(), aMechanism); - Model->AddWithRefs(aStateRepr); - } + // Geometric_Item_Specific_Usage + Handle(StepAP242_GeometricItemSpecificUsage) aGISU = new StepAP242_GeometricItemSpecificUsage(); + StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; + aDefinition.SetValue(aSA); + Handle(StepRepr_HArray1OfRepresentationItem) anReprItems = new StepRepr_HArray1OfRepresentationItem(1, 1); + Handle(StepRepr_RepresentationItem) anIdentifiedItem = Handle(StepRepr_RepresentationItem)::DownCast(anEnt); + anReprItems->SetValue(1, anIdentifiedItem); + Interface_EntityIterator subs = aGraph.Sharings(aPDS); + Handle(StepShape_ShapeDefinitionRepresentation) aSDR; + for (subs.Start(); subs.More() && aSDR.IsNull(); subs.Next()) { + Handle(Standard_Transient) anEntity = subs.Value(); + aSDR = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(anEntity); } + if (aSDR.IsNull()) + return NULL; - return Standard_True; + // Set entities to model + aGISU->Init(aName, aDescription, aDefinition, aSDR->UsedRepresentation(), anReprItems); + Model->AddWithRefs(aSA); + Model->AddWithRefs(aGISU); + theGISU = aGISU; + return aSA; } //======================================================================= -//function : FindPDSforDGT -//purpose : auxilary: find PDS for AdvancedFace or EdgeCurve for creation -// needed ShapeAspect in D> structure -//======================================================================= -static Standard_Boolean FindPDSforDGT(const Interface_Graph &aGraph, - const Handle(Standard_Transient) &ent, - Handle(StepRepr_ProductDefinitionShape) &PDS, - Handle(StepRepr_RepresentationContext) &RC, - Handle(StepShape_AdvancedFace) &AF, - Handle(StepShape_EdgeCurve) &EC) +//function : WritePresentation +//purpose : auxiliary (write annotation plane and presentation) +//====================================================================== +void STEPCAFControl_Writer::WritePresentation(const Handle(XSControl_WorkSession) &WS, + const TopoDS_Shape thePresentation, + const Handle(TCollection_HAsciiString)& thePrsName, + const Standard_Boolean hasSemantic, + const Standard_Boolean hasPlane, + const gp_Ax2 theAnnotationPlane, + const gp_Pnt theTextPosition, + const Handle(Standard_Transient) theDimension) { - if (ent.IsNull()) - return Standard_False; - if( !ent->IsKind(STANDARD_TYPE(StepShape_EdgeCurve)) && - !ent->IsKind(STANDARD_TYPE(StepShape_AdvancedFace)) ) - return Standard_False; + if (thePresentation.IsNull()) + return; + // Get working data + const Handle(Interface_InterfaceModel) &aModel = WS->Model(); - AF = Handle(StepShape_AdvancedFace)::DownCast(ent); - if( AF.IsNull() ) { - EC = Handle(StepShape_EdgeCurve)::DownCast(ent); - Interface_EntityIterator subs = aGraph.Sharings(EC); - for(subs.Start(); subs.More() && AF.IsNull(); subs.Next()) { - Handle(StepShape_OrientedEdge) OE = Handle(StepShape_OrientedEdge)::DownCast(subs.Value()); - if(OE.IsNull()) continue; - Interface_EntityIterator subs1 = aGraph.Sharings(OE); - for(subs1.Start(); subs1.More() && AF.IsNull(); subs1.Next()) { - Handle(StepShape_EdgeLoop) EL = Handle(StepShape_EdgeLoop)::DownCast(subs1.Value()); - if(EL.IsNull()) continue; - Interface_EntityIterator subs2 = aGraph.Sharings(EL); - for(subs2.Start(); subs2.More() && AF.IsNull(); subs2.Next()) { - Handle(StepShape_FaceBound) FB = Handle(StepShape_FaceBound)::DownCast(subs2.Value()); - if(FB.IsNull()) continue; - Interface_EntityIterator subs3 = aGraph.Sharings(FB); - for(subs3.Start(); subs3.More() && AF.IsNull(); subs3.Next()) { - AF = Handle(StepShape_AdvancedFace)::DownCast(subs3.Value()); - } - } - } - } - } - if(AF.IsNull()) return Standard_False; + // Presentation + Handle(StepVisual_TessellatedGeometricSet) aGeomSet = STEPCAFControl_GDTProperty::GetTessellation(thePresentation); + Handle(StepVisual_TessellatedAnnotationOccurrence) aTAO = new StepVisual_TessellatedAnnotationOccurrence(); + aTAO->Init(new TCollection_HAsciiString(), myGDTPrsCurveStyle, aGeomSet); + StepVisual_DraughtingCalloutElement aDCElement; + aDCElement.SetValue(aTAO); + Handle(StepVisual_HArray1OfDraughtingCalloutElement) aTAOs = new StepVisual_HArray1OfDraughtingCalloutElement(1, 1); + aTAOs->SetValue(1, aDCElement); + Handle(StepVisual_DraughtingCallout) aDCallout = new StepVisual_DraughtingCallout(); + Handle(TCollection_HAsciiString) aPrsName = thePrsName.IsNull() ? new TCollection_HAsciiString() : thePrsName; + aDCallout->Init(aPrsName, aTAOs); + Handle(StepRepr_HArray1OfRepresentationItem) aDCsForDMIA = new StepRepr_HArray1OfRepresentationItem(1, 1); + aDCsForDMIA->SetValue(1, aDCallout); + myGDTAnnotations.Append(aDCallout); + StepAP242_ItemIdentifiedRepresentationUsageDefinition aDimension; + aDimension.SetValue(theDimension); + Handle(TCollection_HAsciiString) aDMIAName; + if (hasSemantic) + aDMIAName = new TCollection_HAsciiString("PMI representation to presentation link"); + else + aDMIAName = new TCollection_HAsciiString(); + Handle(StepAP242_DraughtingModelItemAssociation) aDMIA = + new StepAP242_DraughtingModelItemAssociation(); + aDMIA->Init(aDMIAName, new TCollection_HAsciiString(), aDimension, myGDTPresentationDM, aDCsForDMIA); + aModel->AddWithRefs(aDMIA); - Interface_EntityIterator subs = aGraph.Sharings(AF); - for(subs.Start(); subs.More() && PDS.IsNull(); subs.Next()) { - Handle(StepShape_ConnectedFaceSet) CFS = - Handle(StepShape_ConnectedFaceSet)::DownCast(subs.Value()); - if(CFS.IsNull()) continue; - Interface_EntityIterator subs1 = aGraph.Sharings(CFS); - for(subs1.Start(); subs1.More() && PDS.IsNull(); subs1.Next()) { - Handle(StepRepr_RepresentationItem) RI = - Handle(StepRepr_RepresentationItem)::DownCast(subs1.Value()); - if(RI.IsNull()) continue; - Interface_EntityIterator subs2 = aGraph.Sharings(RI); - for(subs2.Start(); subs2.More() && PDS.IsNull(); subs2.Next()) { - Handle(StepShape_ShapeRepresentation) SR = - Handle(StepShape_ShapeRepresentation)::DownCast(subs2.Value()); - if(SR.IsNull()) continue; - RC = SR->ContextOfItems(); - Interface_EntityIterator subs3 = aGraph.Sharings(SR); - for(subs3.Start(); subs3.More() && PDS.IsNull(); subs3.Next()) { - Handle(StepShape_ShapeDefinitionRepresentation) SDR = - Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(subs3.Value()); - if(SDR.IsNull()) continue; - Handle(StepRepr_PropertyDefinition) PropD = SDR->Definition().PropertyDefinition(); - if(PropD.IsNull()) continue; - PDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(PropD); - } - } - } - } - - return Standard_True; + if (!hasPlane) + return; + + // Annotation plane + // Presentation Style + Handle(StepVisual_NullStyleMember) aNullStyle = new StepVisual_NullStyleMember(); + aNullStyle->SetEnumText(0, ".NULL."); + StepVisual_PresentationStyleSelect aStyleItem; + aStyleItem.SetValue(aNullStyle); + Handle(StepVisual_HArray1OfPresentationStyleSelect) aStyles = new StepVisual_HArray1OfPresentationStyleSelect(1, 1); + aStyles->SetValue(1, aStyleItem); + Handle(StepVisual_PresentationStyleAssignment) aPrsStyle = new StepVisual_PresentationStyleAssignment(); + aPrsStyle->Init(aStyles); + Handle(StepVisual_HArray1OfPresentationStyleAssignment) aPrsStyles = + new StepVisual_HArray1OfPresentationStyleAssignment(1, 1); + aPrsStyles->SetValue(1, aPrsStyle); + // Plane + Handle(StepGeom_Plane) aPlane = new StepGeom_Plane(); + GeomToStep_MakeAxis2Placement3d anAxisMaker(theAnnotationPlane); + Handle(StepGeom_Axis2Placement3d) anAxis = anAxisMaker.Value(); + // Set text position to plane origin + Handle(StepGeom_CartesianPoint) aTextPos = new StepGeom_CartesianPoint(); + Handle(TColStd_HArray1OfReal) aCoords = new TColStd_HArray1OfReal(1, 3); + for (Standard_Integer i = 1; i <= 3; i++) + aCoords->SetValue(i, theTextPosition.Coord(i)); + aTextPos->Init(new TCollection_HAsciiString(), aCoords); + anAxis->SetLocation(aTextPos); + aPlane->Init(new TCollection_HAsciiString(), anAxis); + // Annotation plane element + StepVisual_AnnotationPlaneElement aPlaneElement; + aPlaneElement.SetValue(aDCallout); + Handle(StepVisual_HArray1OfAnnotationPlaneElement) aDCsForAnnPln = new StepVisual_HArray1OfAnnotationPlaneElement(1, 1); + aDCsForAnnPln->SetValue(1, aPlaneElement); + // Init AnnotationPlane entity + Handle(StepVisual_AnnotationPlane) anAnnPlane = new StepVisual_AnnotationPlane(); + anAnnPlane->Init(new TCollection_HAsciiString(), aPrsStyles, aPlane, aDCsForAnnPln); + myGDTAnnotations.Append(anAnnPlane); + aModel->AddWithRefs(anAnnPlane); } //======================================================================= -//function : FindPDS -//purpose : auxilary: find Product_definition_shape entity for given entity +//function : WriteDatumAP242 +//purpose : auxiliary (write Datum entity for given shape or write all +// necessary entities and link them to already written datum +// in case of multiple features association) //======================================================================= -static Handle(StepRepr_ProductDefinitionShape) FindPDS(const Interface_Graph &theGraph, - const Handle(Standard_Transient) &theEnt, - Handle(StepRepr_RepresentationContext) &theRC) +Handle(StepDimTol_Datum) STEPCAFControl_Writer::WriteDatumAP242(const Handle(XSControl_WorkSession) &WS, + const TDF_LabelSequence theShapeL, + const TDF_Label theDatumL, + const Standard_Boolean isFirstDTarget, + const Handle(StepDimTol_Datum) theWrittenDatum) { - if (theEnt.IsNull()) + // Get working data + const Handle(Interface_InterfaceModel) &Model = WS->Model(); + const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter(); + const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess(); + const Handle(Interface_HGraph) aHGraph = WS->HGraph(); + if (aHGraph.IsNull()) return NULL; + Interface_Graph aGraph = aHGraph->Graph(); + + Handle(StepRepr_ShapeAspect) aSA; + Handle(StepRepr_RepresentationContext) aRC; Handle(StepRepr_ProductDefinitionShape) aPDS; + NCollection_Sequence aSASeq; + Handle(StepAP242_GeometricItemSpecificUsage) aGISU; + Standard_Integer aSANum = 0, aGISUNum = 0; + // Link with datum feature + for (Standard_Integer i = 1; i <= theShapeL.Length(); i++) { + Handle(Standard_Transient) anEnt; + TopoDS_Shape aShape; + TopLoc_Location aLoc; + TColStd_SequenceOfTransient aSeqRI; - // try to find shape_representation in sharings - Interface_EntityIterator anIter = theGraph.Sharings(theEnt); - for (anIter.Start(); anIter.More() && aPDS.IsNull(); anIter.Next()) { - Handle(StepShape_ShapeRepresentation) aSR = Handle(StepShape_ShapeRepresentation)::DownCast(anIter.Value()); - if (aSR.IsNull()) + aShape = XCAFDoc_ShapeTool::GetShape(theShapeL.Value(i)); + FindEntities(FP, aShape, aLoc, aSeqRI); + if (aSeqRI.Length() <= 0) { + FP->Messenger()->SendInfo() << "Warning: Cannot find RI for " << aShape.TShape()->DynamicType()->Name() << std::endl; continue; - theRC = aSR->ContextOfItems(); - Interface_EntityIterator aSDRIt = theGraph.Sharings(aSR); - for (aSDRIt.Start(); aSDRIt.More() && aPDS.IsNull(); aSDRIt.Next()) { - Handle(StepShape_ShapeDefinitionRepresentation) aSDR = - Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(aSDRIt.Value()); - if (aSDR.IsNull()) continue; - Handle(StepRepr_PropertyDefinition) aPropD = aSDR->Definition().PropertyDefinition(); - if (aPropD.IsNull()) continue; - aPDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(aPropD); } - } - if (!aPDS.IsNull()) - return aPDS; + anEnt = aSeqRI.Value(1); + aPDS = FindPDS(aGraph, anEnt, aRC); + if (aPDS.IsNull()) + continue; - anIter = theGraph.Sharings(theEnt); - for (anIter.Start(); anIter.More(); anIter.Next()) { - if (anIter.Value()->IsKind(STANDARD_TYPE(StepShape_TopologicalRepresentationItem)) || - anIter.Value()->IsKind(STANDARD_TYPE(StepGeom_GeometricRepresentationItem))) - { - aPDS = FindPDS(theGraph, anIter.Value(), theRC); - if (!aPDS.IsNull()) - return aPDS; + Handle(StepRepr_ShapeAspect) aCurrentSA = WriteShapeAspect(WS, theDatumL, aShape, aRC, aGISU); + if (aCurrentSA.IsNull()) + continue; + aSASeq.Append(aCurrentSA); + aSANum = Model->Number(aCurrentSA); + aGISUNum = Model->Number(aGISU); + } + if (aPDS.IsNull()) { + // Workaround for datums without shape + aPDS = myGDTCommonPDS; + Interface_EntityIterator aSDRIt = aGraph.Sharings(aPDS); + Handle(StepShape_ShapeDefinitionRepresentation) aSDR; + for (aSDRIt.Start(); aSDRIt.More() && aSDR.IsNull(); aSDRIt.Next()) + aSDR = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(aSDRIt.Value()); + if (!aSDR.IsNull()) { + Handle(StepRepr_Representation) aRepr = aSDR->UsedRepresentation(); + if (!aRepr.IsNull()) + aRC = aRepr->ContextOfItems(); } } - return aPDS; -} -//======================================================================= -//function : GetUnit -//purpose : auxiliary -//======================================================================= -static StepBasic_Unit GetUnit(const Handle(StepRepr_RepresentationContext)& theRC, - const Standard_Boolean isAngle = Standard_False) -{ - StepBasic_Unit aUnit; - Handle(StepBasic_NamedUnit) aCurrentUnit; - if (isAngle) { - Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext) aCtx = - Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext)::DownCast(theRC); - if(!aCtx.IsNull()) { - for(Standard_Integer j = 1; j <= aCtx->NbUnits(); j++) { - if (aCtx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndPlaneAngleUnit)) || - aCtx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_ConversionBasedUnitAndPlaneAngleUnit))) { - aCurrentUnit = aCtx->UnitsValue(j); - break; - } - } + // Find if datum has datum targets and get common datum attributes + Handle(XCAFDoc_Datum) aDatumAttr; + if (!theDatumL.FindAttribute(XCAFDoc_Datum::GetID(), aDatumAttr)) + return NULL; + Handle(XCAFDimTolObjects_DatumObject) anObject = aDatumAttr->GetObject(); + if (anObject.IsNull()) + return NULL; + Standard_Boolean isSimpleDatum = !anObject->IsDatumTarget(); + Handle(TCollection_HAsciiString) anIdentifier = anObject->GetName(); + Handle(TCollection_HAsciiString) aTargetId = (anObject->GetDatumTargetNumber() == 0 ? + new TCollection_HAsciiString() : new TCollection_HAsciiString(anObject->GetDatumTargetNumber())); + + // If datum type is area, but there is no area in object, write as simple datum + if (anObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area && + anObject->GetDatumTarget().IsNull()) + isSimpleDatum = Standard_True; + + // Simple datum + if (isSimpleDatum) { + if (aSASeq.Length() == 0) { + // Create empty datum with name and presentation only + Handle(StepDimTol_DatumFeature) aDF = new StepDimTol_DatumFeature(); + aDF->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, StepData_LTrue); + aSA = aDF; + Model->AddWithRefs(aDF); } - if (aCurrentUnit.IsNull()) { - Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx) aCtx1 = - Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx)::DownCast(theRC); - if(!aCtx1.IsNull()) { - for(Standard_Integer j = 1; j <= aCtx1->NbUnits(); j++) { - if (aCtx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndPlaneAngleUnit)) || - aCtx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_ConversionBasedUnitAndPlaneAngleUnit))) { - aCurrentUnit = aCtx1->UnitsValue(j); - break; - } - } + else if (aSASeq.Length() == 1) { + Handle(StepDimTol_DatumFeature) aDF = new StepDimTol_DatumFeature(); + aDF->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, StepData_LTrue); + Model->ReplaceEntity(aSANum, aDF); + aSA = aDF; + StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; + aDefinition.SetValue(aDF); + aGISU->SetDefinition(aDefinition); + Model->ReplaceEntity(aGISUNum, aGISU); + } + else if (aSASeq.Length() > 1) { + Handle(StepRepr_CompShAspAndDatumFeatAndShAsp) aDF = new StepRepr_CompShAspAndDatumFeatAndShAsp(); + aDF->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, StepData_LTrue); + for (Standard_Integer i = 1; i <= aSASeq.Length(); i++) { + Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); + aSAR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aDF, aSASeq.Value(i)); + Model->AddWithRefs(aSAR); } + aSA = aDF; + Model->AddWithRefs(aDF); } - if (aCurrentUnit.IsNull()) - aCurrentUnit = new StepBasic_SiUnitAndPlaneAngleUnit; } + // Datum with datum targets else { - Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext) aCtx = - Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext)::DownCast(theRC); - if(!aCtx.IsNull()) { - for(Standard_Integer j = 1; j <= aCtx->NbUnits(); j++) { - if (aCtx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndLengthUnit)) || - aCtx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_ConversionBasedUnitAndLengthUnit))) { - aCurrentUnit = aCtx->UnitsValue(j); - break; - } - } + XCAFDimTolObjects_DatumTargetType aDatumType = anObject->GetDatumTargetType(); + Handle(StepDimTol_DatumTarget) aDatumTarget; + // Note: the given way to write such datum type may be incorrect (too little information) + if (aDatumType == XCAFDimTolObjects_DatumTargetType_Area) { + TopoDS_Shape aDTShape = anObject->GetDatumTarget(); + Handle(StepAP242_GeometricItemSpecificUsage) anAreaGISU; + Handle(StepRepr_ShapeAspect) anAreaSA = WriteShapeAspect(WS, theDatumL, aDTShape, aRC, anAreaGISU); + aSANum = Model->Number(anAreaSA); + aGISUNum = Model->Number(anAreaGISU); + Handle(StepDimTol_DatumTarget) aDT = new StepDimTol_DatumTarget(); + aDT->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString("area"), anAreaSA->OfShape(), + StepData_LTrue, aTargetId); + Model->ReplaceEntity(aSANum, aDT); + StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; + aDefinition.SetValue(aDT); + anAreaGISU->SetDefinition(aDefinition); + Model->ReplaceEntity(aGISUNum, anAreaGISU); } - if (aCurrentUnit.IsNull()) { - Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx) aCtx1 = - Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx)::DownCast(theRC); - if(!aCtx1.IsNull()) { - for(Standard_Integer j = 1; j <= aCtx1->NbUnits(); j++) { - if (aCtx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndLengthUnit)) || - aCtx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_ConversionBasedUnitAndLengthUnit))) { - aCurrentUnit = aCtx1->UnitsValue(j); - break; + else { + Handle(StepDimTol_PlacedDatumTargetFeature) aPDTF = new StepDimTol_PlacedDatumTargetFeature(); + aPDTF->Init(new TCollection_HAsciiString(), STEPCAFControl_GDTProperty::GetDatumTargetName(aDatumType), + aPDS, StepData_LTrue, aTargetId); + Model->AddWithRefs(aPDTF); + aDatumTarget = aPDTF; + // Datum targets + Handle(StepRepr_PropertyDefinition) aPD = new StepRepr_PropertyDefinition(); + StepRepr_CharacterizedDefinition aCDefinition; + aCDefinition.SetValue(aPDTF); + aPD->Init(new TCollection_HAsciiString(), Standard_False, NULL, aCDefinition); + if (anObject->HasDatumTargetParams()) { + // write all parameters of datum target + Handle(StepShape_ShapeRepresentationWithParameters) aSRWP = new StepShape_ShapeRepresentationWithParameters(); + // Common for all datum targets + StepBasic_Unit aUnit = GetUnit(aRC); + gp_Ax2 aDTAxis = anObject->GetDatumTargetAxis(); + GeomToStep_MakeAxis2Placement3d anAxisMaker(aDTAxis); + Handle(StepGeom_Axis2Placement3d) anA2P3D = anAxisMaker.Value(); + anA2P3D->SetName(new TCollection_HAsciiString("orientation")); + Handle(StepRepr_HArray1OfRepresentationItem) anItems; + // Process each datum target type + if (aDatumType == XCAFDimTolObjects_DatumTargetType_Point) { + anItems = new StepRepr_HArray1OfRepresentationItem(1, 1); + } + else { + Handle(TCollection_HAsciiString) aTargetValueName; + if (aDatumType == XCAFDimTolObjects_DatumTargetType_Line) { + anItems = new StepRepr_HArray1OfRepresentationItem(1, 2); + aTargetValueName = new TCollection_HAsciiString("target length"); + } + else if (aDatumType == XCAFDimTolObjects_DatumTargetType_Rectangle) { + anItems = new StepRepr_HArray1OfRepresentationItem(1, 3); + aTargetValueName = new TCollection_HAsciiString("target length"); + // Additional value + Handle(StepRepr_ReprItemAndMeasureWithUnit) aTargetValue = CreateDimValue(anObject->GetDatumTargetWidth(), + aUnit, new TCollection_HAsciiString("target width"), "POSITIVE_LENGTH_MEASURE", Standard_False); + anItems->SetValue(2, aTargetValue); + Model->AddWithRefs(aTargetValue); + } + else if (aDatumType == XCAFDimTolObjects_DatumTargetType_Circle) { + anItems = new StepRepr_HArray1OfRepresentationItem(1, 2); + aTargetValueName = new TCollection_HAsciiString("target diameter"); } + // Value + Handle(StepRepr_ReprItemAndMeasureWithUnit) aTargetValue = CreateDimValue(anObject->GetDatumTargetLength(), + aUnit, aTargetValueName, "POSITIVE_LENGTH_MEASURE", Standard_False); + anItems->SetValue(1, aTargetValue); + Model->AddWithRefs(aTargetValue); } + anItems->SetValue(anItems->Length(), anA2P3D); + aSRWP->Init(new TCollection_HAsciiString(), anItems, aRC); + // Create and write auxiliary entities + Handle(StepShape_ShapeDefinitionRepresentation) aSDR = new StepShape_ShapeDefinitionRepresentation(); + StepRepr_RepresentedDefinition aRDefinition; + aRDefinition.SetValue(aPD); + aSDR->Init(aRDefinition, aSRWP); + Model->AddWithRefs(aPD); + Model->AddWithRefs(aSRWP); + Model->AddWithRefs(aSDR); } } - if (aCurrentUnit.IsNull()) - aCurrentUnit = new StepBasic_SiUnitAndLengthUnit; + // Link datum target to datum feature + // if aSASeq.Length() == 0 nothing to do + if (aSASeq.Length() == 1) { + Handle(StepRepr_FeatureForDatumTargetRelationship) aFFDTR = new StepRepr_FeatureForDatumTargetRelationship(); + aFFDTR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aSASeq.Value(1), aDatumTarget); + Model->AddWithRefs(aFFDTR); + } + else if (aSASeq.Length() > 1) { + Handle(StepRepr_CompositeShapeAspect) aCompSA = new StepRepr_CompositeShapeAspect(); + aCompSA->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, aSASeq.Value(1)->ProductDefinitional()); + for (Standard_Integer i = 1; i <= aSASeq.Length(); i++) { + Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); + aSAR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aCompSA, aSASeq.Value(i)); + Model->AddWithRefs(aSAR); + } + Handle(StepRepr_FeatureForDatumTargetRelationship) aFFDTR = new StepRepr_FeatureForDatumTargetRelationship(); + aFFDTR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aCompSA, aDatumTarget); + Model->AddWithRefs(aFFDTR); + } + aSA = aDatumTarget; } - aUnit.SetValue(aCurrentUnit); - return aUnit; + // Datum + Handle(StepDimTol_Datum) aDatum = theWrittenDatum; + if (isFirstDTarget) { + aDatum = new StepDimTol_Datum(); + aDatum->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, StepData_LFalse, anIdentifier); + Model->AddWithRefs(aDatum); + } + + // Shape_Aspect_Relationship + if (!aSA.IsNull()) { + Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); + aSAR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aSA, aDatum); + Model->AddWithRefs(aSAR); + } + + //Annotation plane and Presentation + WritePresentation(WS, anObject->GetPresentation(), anObject->GetPresentationName(), Standard_True, anObject->HasPlane(), + anObject->GetPlane(), anObject->GetPointTextAttach(), aSA); + + return aDatum; } //======================================================================= -//function : CreateDimValue -//purpose : auxiliary +//function : WriteDimValues +//purpose : auxiliary (write all data for given dimension: values, +// qualifiers, modifiers, orientation and tolerance class) //====================================================================== -static Handle(StepRepr_ReprItemAndMeasureWithUnit) CreateDimValue(const Standard_Real theValue, - const StepBasic_Unit theUnit, - const Handle(TCollection_HAsciiString)& theName, - const Standard_CString theMeasureName, - const Standard_Boolean isAngle, - const Standard_Boolean isQualified = Standard_False, - const Handle(StepShape_QualifiedRepresentationItem)& theQRI = NULL) +static void WriteDimValues(const Handle(XSControl_WorkSession) &WS, + const Handle(XCAFDimTolObjects_DimensionObject) theObject, + const Handle(StepRepr_RepresentationContext) theRC, + const StepShape_DimensionalCharacteristic theDimension) { - Handle(StepRepr_RepresentationItem) aReprItem = new StepRepr_RepresentationItem(); - aReprItem->Init(new TCollection_HAsciiString(theName)); - Handle(StepBasic_MeasureWithUnit) aMWU = new StepBasic_MeasureWithUnit(); - Handle(StepBasic_MeasureValueMember) aValueMember = new StepBasic_MeasureValueMember(); - aValueMember->SetName(theMeasureName); - aValueMember->SetReal(theValue); - aMWU->Init(aValueMember, theUnit); - if (isQualified) { - if (isAngle) { - // Angle & with qualifiers - Handle(StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI) anItem = - new StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI(); - anItem->Init(aMWU, aReprItem, theQRI); - return anItem; + // Get working data + const Handle(Interface_InterfaceModel) &aModel = WS->Model(); + XCAFDimTolObjects_DimensionModifiersSequence aModifiers = theObject->GetModifiers(); + Handle(Standard_Transient) aDim = theDimension.Value(); + Standard_Boolean isAngle = aDim->IsKind(STANDARD_TYPE(StepShape_AngularLocation)) || + aDim->IsKind(STANDARD_TYPE(StepShape_AngularSize)); + + // Unit + StepBasic_Unit aUnit = GetUnit(theRC, isAngle); + Standard_CString aMeasureName; + if (isAngle) + aMeasureName = "POSITIVE_PLANE_ANGLE_MEASURE"; + else + aMeasureName = "POSITIVE_LENGTH_MEASURE"; + + // Values + Handle(StepRepr_HArray1OfRepresentationItem) aValues; + Standard_Integer aNbItems = 1, aValIt = 1; + if (theObject->IsDimWithRange()) + aNbItems += 2; + if (aModifiers.Length() > 0) + aNbItems++; + if (theObject->GetType() == XCAFDimTolObjects_DimensionType_Location_Oriented) + aNbItems++; + aNbItems += theObject->NbDescriptions(); + aValues = new StepRepr_HArray1OfRepresentationItem(1, aNbItems); + + // Nominal value + Standard_Real aNominal = theObject->GetValue(); + Standard_Integer aLeftNbDigits, aRightNbDigits; + theObject->GetNbOfDecimalPlaces(aLeftNbDigits, aRightNbDigits); + Standard_Integer aNbQualifiers = 0; + if (theObject->HasQualifier() && !isAngle) + aNbQualifiers++; + if (aLeftNbDigits > 0 || aRightNbDigits > 0) + aNbQualifiers++; + // With qualifiers + if (aNbQualifiers > 0) { + Handle(StepShape_QualifiedRepresentationItem) aQRI = new StepShape_QualifiedRepresentationItem(); + Handle(StepShape_HArray1OfValueQualifier) aQualifiers = new StepShape_HArray1OfValueQualifier(1, aNbQualifiers); + // Type qualifier + if (theObject->HasQualifier() && !isAngle) { + StepShape_ValueQualifier anItem; + Handle(StepShape_TypeQualifier) aType = new StepShape_TypeQualifier(); + XCAFDimTolObjects_DimensionQualifier aQualifier = theObject->GetQualifier(); + aType->Init(STEPCAFControl_GDTProperty::GetDimQualifierName(aQualifier)); + aModel->AddWithRefs(aType); + anItem.SetValue(aType); + aQualifiers->SetValue(1, anItem); } - else { - // Length & with qualifiers - Handle(StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI) anItem = - new StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI(); - anItem->Init(aMWU, aReprItem, theQRI); - return anItem; + // Number of decimal places + if (aLeftNbDigits > 0 || aRightNbDigits > 0) { + StepShape_ValueQualifier anItem; + Handle(StepShape_ValueFormatTypeQualifier) aType = new StepShape_ValueFormatTypeQualifier(); + Handle(TCollection_HAsciiString) aFormatType = new TCollection_HAsciiString("NR2 "); + aFormatType->AssignCat(new TCollection_HAsciiString(aLeftNbDigits)); + aFormatType->AssignCat(new TCollection_HAsciiString(".")); + aFormatType->AssignCat(new TCollection_HAsciiString(aRightNbDigits)); + aType->Init(aFormatType); + aModel->AddWithRefs(aType); + anItem.SetValue(aType); + aQualifiers->SetValue(aNbQualifiers, anItem); } + // Set qualifiers + aQRI->SetQualifiers(aQualifiers); + Handle(StepRepr_ReprItemAndMeasureWithUnit) anItem = CreateDimValue(aNominal, aUnit, + new TCollection_HAsciiString("nominal value"), aMeasureName, isAngle, Standard_True, aQRI); + aValues->SetValue(aValIt, anItem); + aValIt++; } + // Without qualifiers else { - if (isAngle) { - // Angle & without qualifiers - Handle(StepRepr_ReprItemAndPlaneAngleMeasureWithUnit) anItem = - new StepRepr_ReprItemAndPlaneAngleMeasureWithUnit(); - anItem->Init(aMWU, aReprItem); - return anItem; - } - else { - // Length & without qualifiers - Handle(StepRepr_ReprItemAndLengthMeasureWithUnit) anItem = - new StepRepr_ReprItemAndLengthMeasureWithUnit(); - anItem->Init(aMWU, aReprItem); - return anItem; - } + Handle(StepRepr_ReprItemAndMeasureWithUnit) anItem = CreateDimValue(aNominal, aUnit, + new TCollection_HAsciiString("nominal value"), aMeasureName, isAngle); + aValues->SetValue(aValIt, anItem); + aValIt++; } -} -//======================================================================= -//function : WriteShapeAspect -//purpose : auxiliary (write Shape_Aspect entity for given shape) -//======================================================================= + // Ranges + if (theObject->IsDimWithRange()) { + Handle(StepRepr_ReprItemAndMeasureWithUnit) aLowerItem = CreateDimValue(theObject->GetLowerBound(), aUnit, + new TCollection_HAsciiString("lower limit"), aMeasureName, isAngle); + Handle(StepRepr_ReprItemAndMeasureWithUnit) anUpperItem = CreateDimValue(theObject->GetUpperBound(), aUnit, + new TCollection_HAsciiString("upper limit"), aMeasureName, isAngle); + aValues->SetValue(aValIt, aLowerItem); + aValIt++; + aValues->SetValue(aValIt, anUpperItem); + aValIt++; + } -Handle(StepRepr_ShapeAspect) STEPCAFControl_Writer::WriteShapeAspect (const Handle(XSControl_WorkSession) &WS, - const TDF_Label theLabel, - const TopoDS_Shape theShape, - Handle(StepRepr_RepresentationContext)& theRC, - Handle(StepAP242_GeometricItemSpecificUsage)& theGISU) -{ - // Get working data - const Handle(Interface_InterfaceModel) &Model = WS->Model(); - const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter(); - const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess(); - const Handle(Interface_HGraph) aHGraph = WS->HGraph(); - if (aHGraph.IsNull()) - return NULL; - Interface_Graph aGraph = aHGraph->Graph(); + // Modifiers + if (aModifiers.Length() > 0) { + Handle(StepRepr_CompoundRepresentationItem) aCompoundRI = new StepRepr_CompoundRepresentationItem(); + Handle (StepRepr_HArray1OfRepresentationItem) aModifItems = + new StepRepr_HArray1OfRepresentationItem(1, aModifiers.Length()); + for (Standard_Integer i = 1; i <= aModifiers.Length(); i++) { + XCAFDimTolObjects_DimensionModif aModif = aModifiers.Value(i); + Handle(StepRepr_DescriptiveRepresentationItem) aModifItem = + new StepRepr_DescriptiveRepresentationItem(); + aModifItem->Init(new TCollection_HAsciiString(), STEPCAFControl_GDTProperty::GetDimModifierName(aModif)); + aModel->AddWithRefs(aModifItem); + aModifItems->SetValue(i, aModifItem); + } + aCompoundRI->Init(new TCollection_HAsciiString(), aModifItems); + aValues->SetValue(aValIt, aCompoundRI); + aValIt++; + } - TopLoc_Location aLoc; - TColStd_SequenceOfTransient aSeqRI; - FindEntities( FP, theShape, aLoc, aSeqRI ); - if ( aSeqRI.Length() <= 0 ) { - FP->Messenger()->SendInfo() << "Warning: Cannot find RI for "<DynamicType()->Name()<GetType() == XCAFDimTolObjects_DimensionType_Location_Oriented) { + Handle(StepGeom_Axis2Placement3d) anOrientation = new StepGeom_Axis2Placement3d(); + gp_Dir aDir; + theObject->GetDirection(aDir); + GeomToStep_MakeCartesianPoint MkPoint(gp_Pnt(0, 0, 0)); + Handle(StepGeom_CartesianPoint) aLoc = MkPoint.Value(); + Handle(StepGeom_Direction) anAxis = new StepGeom_Direction(); + Handle(TColStd_HArray1OfReal) aCoords = new TColStd_HArray1OfReal(1, 3); + aCoords->SetValue(1, aDir.X()); + aCoords->SetValue(2, aDir.Y()); + aCoords->SetValue(3, aDir.Z()); + anAxis->Init(new TCollection_HAsciiString(), aCoords); + anOrientation->Init(new TCollection_HAsciiString("orientation"), aLoc, Standard_True, anAxis, Standard_False, NULL); + aValues->SetValue(aValIt, anOrientation); + aValIt++; } - Handle(StepRepr_ProductDefinitionShape) aPDS; - Handle(StepRepr_RepresentationContext) aRC; - Handle(Standard_Transient) anEnt = aSeqRI.Value(1); - aPDS = FindPDS(aGraph, anEnt, aRC); - if(aPDS.IsNull()) - return NULL; + // Descriptions + if (theObject->HasDescriptions()) { + for (Standard_Integer i = 0; i < theObject->NbDescriptions(); i++) { + Handle(StepRepr_DescriptiveRepresentationItem) aDRI = new StepRepr_DescriptiveRepresentationItem(); + aDRI->Init(theObject->GetDescriptionName(i), theObject->GetDescription(i)); + aValues->SetValue(aValIt, aDRI); + aValIt++; + } + } - theRC = aRC; - // Shape_Aspect - Handle(TCollection_HAsciiString) aName = new TCollection_HAsciiString(); - Handle(TDataStd_Name) aNameAttr; - if (theLabel.FindAttribute(TDataStd_Name::GetID(), aNameAttr)) { - aName = new TCollection_HAsciiString(TCollection_AsciiString(aNameAttr->Get(), '?')); - Standard_Integer aFirstSpace = aName->Search(" "); - if (aFirstSpace != -1) - aName = aName->SubString(aFirstSpace + 1, aName->Length()); - else - aName = new TCollection_HAsciiString(); + for (Standard_Integer i = 1; i <= aValues->Length(); i++) + aModel->AddWithRefs(aValues->Value(i)); + + // Create resulting Shape_Dimension_Representation + Handle(StepShape_ShapeDimensionRepresentation) aSDR = new StepShape_ShapeDimensionRepresentation(); + aSDR->Init(new TCollection_HAsciiString(), aValues, theRC); + aModel->AddWithRefs(aSDR); + Handle(StepShape_DimensionalCharacteristicRepresentation) aDCR = new StepShape_DimensionalCharacteristicRepresentation(); + aDCR->Init(theDimension, aSDR); + aModel->AddWithRefs(aDCR); + + // Plus_Minus_Tolerance + if (theObject->IsDimWithPlusMinusTolerance()) { + Handle(TCollection_HAsciiString) aDummyName = new TCollection_HAsciiString(aMeasureName); + aDummyName = aDummyName->SubString(9, aDummyName->Length()); //delete "POSITIVE_" + aMeasureName = aDummyName->ToCString(); + Standard_Real aLowerTolValue = -theObject->GetLowerTolValue(), + anUpperTolValue = theObject->GetUpperTolValue(); + // Upper + Handle(StepBasic_MeasureWithUnit) anUpperMWU = new StepBasic_MeasureWithUnit(); + Handle(StepBasic_MeasureValueMember) anUpperValue = new StepBasic_MeasureValueMember(); + anUpperValue->SetName(aMeasureName); + anUpperValue->SetReal(anUpperTolValue); + anUpperMWU->Init(anUpperValue, aUnit); + aModel->AddWithRefs(anUpperMWU); + // Lower + Handle(StepBasic_MeasureWithUnit) aLowerMWU = new StepBasic_MeasureWithUnit(); + Handle(StepBasic_MeasureValueMember) aLowerValue = new StepBasic_MeasureValueMember(); + aLowerValue->SetName(aMeasureName); + aLowerValue->SetReal(aLowerTolValue); + aLowerMWU->Init(aLowerValue, aUnit); + aModel->AddWithRefs(aLowerMWU); + // Tolerance + Handle(StepShape_ToleranceValue) aTolValue = new StepShape_ToleranceValue(); + aTolValue->Init(aLowerMWU, anUpperMWU); + aModel->AddWithRefs(aTolValue); + StepShape_ToleranceMethodDefinition aMethod; + aMethod.SetValue(aTolValue); + Handle(StepShape_PlusMinusTolerance) aPlusMinusTol = new StepShape_PlusMinusTolerance(); + aPlusMinusTol->Init(aMethod, theDimension); + aModel->AddWithRefs(aPlusMinusTol); } - Handle(TCollection_HAsciiString) aDescription = new TCollection_HAsciiString(); - Handle(StepRepr_ShapeAspect) aSA = new StepRepr_ShapeAspect; - aSA->Init(aName, aDescription, aPDS, StepData_LTrue); + // Tolerance class + if (theObject->IsDimWithClassOfTolerance()) { + Standard_Boolean isHole; + XCAFDimTolObjects_DimensionFormVariance aFormVariance; + XCAFDimTolObjects_DimensionGrade aGrade; + if (!theObject->GetClassOfTolerance(isHole, aFormVariance, aGrade)) + return; + Handle(StepShape_LimitsAndFits) aLAF = STEPCAFControl_GDTProperty::GetLimitsAndFits(isHole, aFormVariance, aGrade); + aModel->AddWithRefs(aLAF); + StepShape_ToleranceMethodDefinition aMethod; + aMethod.SetValue(aLAF); + Handle(StepShape_PlusMinusTolerance) aPlusMinusTol = new StepShape_PlusMinusTolerance(); + aPlusMinusTol->Init(aMethod, theDimension); + aModel->AddWithRefs(aPlusMinusTol); + } +} - // Geometric_Item_Specific_Usage - Handle(StepAP242_GeometricItemSpecificUsage) aGISU = new StepAP242_GeometricItemSpecificUsage(); - StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; - aDefinition.SetValue(aSA); - Handle(StepRepr_HArray1OfRepresentationItem) anReprItems = new StepRepr_HArray1OfRepresentationItem(1, 1); - Handle(StepRepr_RepresentationItem) anIdentifiedItem = Handle(StepRepr_RepresentationItem)::DownCast(anEnt); - anReprItems->SetValue(1, anIdentifiedItem); - Interface_EntityIterator subs = aGraph.Sharings(aPDS); - Handle(StepShape_ShapeDefinitionRepresentation) aSDR; - for (subs.Start(); subs.More() && aSDR.IsNull(); subs.Next()) { - Handle(Standard_Transient) anEntity = subs.Value(); - aSDR = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(anEntity); +//======================================================================= +//function : WriteDerivedGeometry +//purpose : auxiliary (write connection point for dimensions) +//====================================================================== +static void WriteDerivedGeometry (const Handle(XSControl_WorkSession) &WS, + const Handle(XCAFDimTolObjects_DimensionObject)& theObject, + const Handle(StepRepr_ConstructiveGeometryRepresentation) theRepr, + Handle(StepRepr_ShapeAspect)& theFirstSA, + Handle(StepRepr_ShapeAspect)& theSecondSA, + NCollection_Vector& thePnts) +{ + const Handle(Interface_InterfaceModel) &aModel = WS->Model(); + // First point + if (theObject->HasPoint()) { + GeomToStep_MakeCartesianPoint aPointMaker(theObject->GetPoint()); + Handle(StepGeom_CartesianPoint) aPoint = aPointMaker.Value(); + thePnts.Append(aPoint); + Handle(StepRepr_DerivedShapeAspect) aDSA = new StepRepr_DerivedShapeAspect(); + aDSA->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), theFirstSA->OfShape(), StepData_LFalse); + Handle(StepAP242_GeometricItemSpecificUsage) aGISU = new StepAP242_GeometricItemSpecificUsage(); + StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; + aDefinition.SetValue(aDSA); + Handle(StepRepr_HArray1OfRepresentationItem) anItem = new StepRepr_HArray1OfRepresentationItem(1, 1); + anItem->SetValue(1, aPoint); + aGISU->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aDefinition, theRepr, anItem); + Handle(StepRepr_ShapeAspectDerivingRelationship) aSADR = new StepRepr_ShapeAspectDerivingRelationship(); + aSADR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aDSA, theFirstSA); + theFirstSA = aDSA; + aModel->AddWithRefs(aGISU); + aModel->AddWithRefs(aSADR); + } + + // Second point (for locations) + if (theObject->HasPoint2()) { + GeomToStep_MakeCartesianPoint aPointMaker(theObject->GetPoint2()); + Handle(StepGeom_CartesianPoint) aPoint = aPointMaker.Value(); + thePnts.Append(aPoint); + Handle(StepRepr_DerivedShapeAspect) aDSA = new StepRepr_DerivedShapeAspect(); + aDSA->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), theFirstSA->OfShape(), StepData_LFalse); + Handle(StepAP242_GeometricItemSpecificUsage) aGISU = new StepAP242_GeometricItemSpecificUsage(); + StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; + aDefinition.SetValue(aDSA); + Handle(StepRepr_HArray1OfRepresentationItem) anItem = new StepRepr_HArray1OfRepresentationItem(1, 1); + anItem->SetValue(1, aPoint); + aGISU->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aDefinition, theRepr, anItem); + Handle(StepRepr_ShapeAspectDerivingRelationship) aSADR = new StepRepr_ShapeAspectDerivingRelationship(); + aSADR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aDSA, theSecondSA); + theSecondSA = aDSA; + aModel->AddWithRefs(aGISU); + aModel->AddWithRefs(aSADR); } - if (aSDR.IsNull()) - return NULL; - - // Set entities to model - aGISU->Init(aName, aDescription, aDefinition, aSDR->UsedRepresentation(), anReprItems); - Model->AddWithRefs(aSA); - Model->AddWithRefs(aGISU); - theGISU = aGISU; - return aSA; } //======================================================================= -//function : WritePresentation -//purpose : auxiliary (write annotation plane and presentation) +//function : WriteDatumSystem +//purpose : auxiliary (write Write datum system for given +// geometric_tolerance) //====================================================================== -void STEPCAFControl_Writer::WritePresentation(const Handle(XSControl_WorkSession) &WS, - const TopoDS_Shape thePresentation, - const Handle(TCollection_HAsciiString)& thePrsName, - const Standard_Boolean hasSemantic, - const Standard_Boolean hasPlane, - const gp_Ax2 theAnnotationPlane, - const gp_Pnt theTextPosition, - const Handle(Standard_Transient) theDimension) +static Handle(StepDimTol_HArray1OfDatumSystemOrReference) WriteDatumSystem(const Handle(XSControl_WorkSession) &WS, + const TDF_Label theGeomTolL, + const TDF_LabelSequence theDatumSeq, + const STEPConstruct_DataMapOfAsciiStringTransient theDatumMap, + const Handle(StepRepr_RepresentationContext)& theRC) { - if (thePresentation.IsNull()) - return; // Get working data - const Handle(Interface_InterfaceModel) &aModel = WS->Model(); + const Handle(Interface_InterfaceModel) &Model = WS->Model(); + const Handle(Interface_HGraph) aHGraph = WS->HGraph(); + if (aHGraph.IsNull()) + return NULL; + Interface_Graph aGraph = aHGraph->Graph(); + Handle(XCAFDoc_GeomTolerance) aGTAttr; + if (!theGeomTolL.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGTAttr)) + return NULL; + Handle(XCAFDimTolObjects_GeomToleranceObject) anObject = aGTAttr->GetObject(); + if (anObject.IsNull()) + return NULL; - // Presentation - Handle(StepVisual_TessellatedGeometricSet) aGeomSet = STEPCAFControl_GDTProperty::GetTessellation(thePresentation); - Handle(StepVisual_TessellatedAnnotationOccurrence) aTAO = new StepVisual_TessellatedAnnotationOccurrence(); - aTAO->Init(new TCollection_HAsciiString(), myGDTPrsCurveStyle, aGeomSet); - StepVisual_DraughtingCalloutElement aDCElement; - aDCElement.SetValue(aTAO); - Handle(StepVisual_HArray1OfDraughtingCalloutElement) aTAOs = new StepVisual_HArray1OfDraughtingCalloutElement(1, 1); - aTAOs->SetValue(1, aDCElement); - Handle(StepVisual_DraughtingCallout) aDCallout = new StepVisual_DraughtingCallout(); - Handle(TCollection_HAsciiString) aPrsName = thePrsName.IsNull() ? new TCollection_HAsciiString() : thePrsName; - aDCallout->Init(aPrsName, aTAOs); - Handle(StepRepr_HArray1OfRepresentationItem) aDCsForDMIA = new StepRepr_HArray1OfRepresentationItem(1, 1); - aDCsForDMIA->SetValue(1, aDCallout); - myGDTAnnotations.Append(aDCallout); - StepAP242_ItemIdentifiedRepresentationUsageDefinition aDimension; - aDimension.SetValue(theDimension); - Handle(TCollection_HAsciiString) aDMIAName; - if (hasSemantic) - aDMIAName = new TCollection_HAsciiString("PMI representation to presentation link"); - else - aDMIAName = new TCollection_HAsciiString(); - Handle(StepAP242_DraughtingModelItemAssociation) aDMIA = - new StepAP242_DraughtingModelItemAssociation(); - aDMIA->Init(aDMIAName, new TCollection_HAsciiString(), aDimension, myGDTPresentationDM, aDCsForDMIA); - aModel->AddWithRefs(aDMIA); + // Unit + StepBasic_Unit aUnit = GetUnit(theRC); - if (!hasPlane) - return; + XCAFDimTolObjects_DatumObjectSequence aDatums; + Standard_Integer aMaxDatumNum = 0; + for (Standard_Integer i = 1; i <= theDatumSeq.Length(); i++) { + Handle(XCAFDoc_Datum) aDatumAttr; + if (!theDatumSeq.Value(i).FindAttribute(XCAFDoc_Datum::GetID(), aDatumAttr)) + continue; + Handle(XCAFDimTolObjects_DatumObject) aDatumObj = aDatumAttr->GetObject(); + if (aDatumObj.IsNull()) + continue; + aDatums.Append(aDatumObj); + aMaxDatumNum = Max(aMaxDatumNum, aDatumObj->GetPosition()); + } + if (aMaxDatumNum == 0) + return NULL; - // Annotation plane - // Presentation Style - Handle(StepVisual_NullStyleMember) aNullStyle = new StepVisual_NullStyleMember(); - aNullStyle->SetEnumText(0, ".NULL."); - StepVisual_PresentationStyleSelect aStyleItem; - aStyleItem.SetValue(aNullStyle); - Handle(StepVisual_HArray1OfPresentationStyleSelect) aStyles = new StepVisual_HArray1OfPresentationStyleSelect(1, 1); - aStyles->SetValue(1, aStyleItem); - Handle(StepVisual_PresentationStyleAssignment) aPrsStyle = new StepVisual_PresentationStyleAssignment(); - aPrsStyle->Init(aStyles); - Handle(StepVisual_HArray1OfPresentationStyleAssignment) aPrsStyles = - new StepVisual_HArray1OfPresentationStyleAssignment(1, 1); - aPrsStyles->SetValue(1, aPrsStyle); - // Plane - Handle(StepGeom_Plane) aPlane = new StepGeom_Plane(); - GeomToStep_MakeAxis2Placement3d anAxisMaker(theAnnotationPlane); - Handle(StepGeom_Axis2Placement3d) anAxis = anAxisMaker.Value(); - // Set text position to plane origin - Handle(StepGeom_CartesianPoint) aTextPos = new StepGeom_CartesianPoint(); - Handle(TColStd_HArray1OfReal) aCoords = new TColStd_HArray1OfReal(1, 3); - for (Standard_Integer i = 1; i <= 3; i++) - aCoords->SetValue(i, theTextPosition.Coord(i)); - aTextPos->Init(new TCollection_HAsciiString(), aCoords); - anAxis->SetLocation(aTextPos); - aPlane->Init(new TCollection_HAsciiString(), anAxis); - // Annotation plane element - StepVisual_AnnotationPlaneElement aPlaneElement; - aPlaneElement.SetValue(aDCallout); - Handle(StepVisual_HArray1OfAnnotationPlaneElement) aDCsForAnnPln = new StepVisual_HArray1OfAnnotationPlaneElement(1, 1); - aDCsForAnnPln->SetValue(1, aPlaneElement); - // Init AnnotationPlane entity - Handle(StepVisual_AnnotationPlane) anAnnPlane = new StepVisual_AnnotationPlane(); - anAnnPlane->Init(new TCollection_HAsciiString(), aPrsStyles, aPlane, aDCsForAnnPln); - myGDTAnnotations.Append(anAnnPlane); - aModel->AddWithRefs(anAnnPlane); + Handle(StepDimTol_HArray1OfDatumReferenceCompartment) aConstituents = + new StepDimTol_HArray1OfDatumReferenceCompartment(1, aMaxDatumNum); + // Auxiliary datum to initialize attributes in Datum_System + Handle(StepDimTol_Datum) aFirstDatum; + Standard_Integer aConstituentsNum = 0; + for (Standard_Integer i = 1; i <= aMaxDatumNum; i++) { + // Collect datums with i-th position + XCAFDimTolObjects_DatumObjectSequence aDatumSeqPos; + for (Standard_Integer j = 1; j <= aDatums.Length(); j++) + if (aDatums.Value(j)->GetPosition() == i) + aDatumSeqPos.Append(aDatums.Value(j)); + if (aDatumSeqPos.Length() < 1) + continue; + + aConstituentsNum++; + // Initialize Datum_Reference_Compartment + StepDimTol_DatumOrCommonDatum aDatumRef; + Handle(StepDimTol_DatumReferenceCompartment) aCompartment = + new StepDimTol_DatumReferenceCompartment(); + Handle(StepDimTol_HArray1OfDatumReferenceModifier) aModifiers; + if (aDatumSeqPos.Length() == 1) { + // Datum entity + Handle(Standard_Transient) aFDValue; + if (theDatumMap.Find(aDatumSeqPos.Value(1)->GetName()->String(), aFDValue) && !aFDValue.IsNull()) + aFirstDatum = Handle(StepDimTol_Datum)::DownCast (aFDValue); + aDatumRef.SetValue(aFirstDatum); + // Modifiers + XCAFDimTolObjects_DatumModifiersSequence aSimpleModifiers = aDatumSeqPos.Value(1)->GetModifiers(); + XCAFDimTolObjects_DatumModifWithValue aModifWithVal; + Standard_Real aValue = 0; + aDatumSeqPos.Value(1)->GetModifierWithValue(aModifWithVal, aValue); + aModifiers = STEPCAFControl_GDTProperty::GetDatumRefModifiers(aSimpleModifiers, aModifWithVal, aValue, aUnit); + // Add Datum_Reference_Modifier_With_Value + if (!aModifiers.IsNull()) { + Handle(StepDimTol_DatumReferenceModifierWithValue) aDRMWV = + aModifiers->Value(aModifiers->Length()).DatumReferenceModifierWithValue(); + if (!aDRMWV.IsNull()) { + Model->AddWithRefs(aDRMWV); + } + } + } + else { + Handle(StepDimTol_HArray1OfDatumReferenceElement) aCommonDatumList = new StepDimTol_HArray1OfDatumReferenceElement(1, aDatumSeqPos.Length()); + for (Standard_Integer j = 1; j <= aDatumSeqPos.Length(); j++) { + // Datum entity + Handle(StepDimTol_Datum) aDatum; + Handle(Standard_Transient) aDValue; + if (theDatumMap.Find(aDatumSeqPos.Value(j)->GetName()->String(), aDValue)) + aDatum = Handle(StepDimTol_Datum)::DownCast (aDValue); + StepDimTol_DatumOrCommonDatum anElemDatumRef; + anElemDatumRef.SetValue(aDatum); + if (aFirstDatum.IsNull()) + aFirstDatum = aDatum; + // Modifiers + XCAFDimTolObjects_DatumModifiersSequence aSimpleModifiers = aDatumSeqPos.Value(j)->GetModifiers(); + XCAFDimTolObjects_DatumModifWithValue aModifWithVal; + Standard_Real aValue = 0; + aDatumSeqPos.Value(j)->GetModifierWithValue(aModifWithVal, aValue); + Handle(StepDimTol_HArray1OfDatumReferenceModifier) anElemModifiers = + STEPCAFControl_GDTProperty::GetDatumRefModifiers(aSimpleModifiers, aModifWithVal, aValue, aUnit); + // Add Datum_Reference_Modifier_With_Value + if (!anElemModifiers.IsNull()) { + Handle(StepDimTol_DatumReferenceModifierWithValue) aDRMWV = + anElemModifiers->Value(anElemModifiers->Length()).DatumReferenceModifierWithValue(); + if (!aDRMWV.IsNull()) { + Model->AddWithRefs(aDRMWV); + } + } + // Datum_Reference_Element + Handle(StepDimTol_DatumReferenceElement) anElement = new StepDimTol_DatumReferenceElement(); + anElement->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aDatum->OfShape(), + aDatum->ProductDefinitional(), anElemDatumRef, !anElemModifiers.IsNull(), anElemModifiers); + Model->AddWithRefs(anElement); + aCommonDatumList->SetValue(j, anElement); + } + aDatumRef.SetValue(aCommonDatumList); + } + aCompartment->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aFirstDatum->OfShape(), + aFirstDatum->ProductDefinitional(), aDatumRef, !aModifiers.IsNull(), aModifiers); + Model->AddWithRefs(aCompartment); + aConstituents->SetValue(aConstituentsNum, aCompartment); + } + // Remove null elements from aConstituents + Standard_Integer aNbConstituents = 0; + for (Standard_Integer i = 1; i <= aConstituents->Length(); i++) + if (!aConstituents->Value(i).IsNull()) + aNbConstituents++; + Handle(StepDimTol_HArray1OfDatumReferenceCompartment) aResConstituents = + new StepDimTol_HArray1OfDatumReferenceCompartment(1, aNbConstituents); + Standard_Integer aConstituentsIt = 0; + for (Standard_Integer i = 1; i <= aConstituents->Length(); i++) + if (!aConstituents->Value(i).IsNull()) { + aConstituentsIt++; + aResConstituents->SetValue(aConstituentsIt, aConstituents->Value(i)); + } + + Handle(StepDimTol_HArray1OfDatumSystemOrReference) aDatumSystem; + Handle(StepDimTol_DatumSystem) aDS = new StepDimTol_DatumSystem(); + aDS->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aFirstDatum->OfShape(), + aFirstDatum->ProductDefinitional(), aResConstituents); + Model->AddWithRefs(aDS); + StepDimTol_DatumSystemOrReference anArrayValue; + anArrayValue.SetValue(aDS); + aDatumSystem = new StepDimTol_HArray1OfDatumSystemOrReference(1, 1); + aDatumSystem->SetValue(1, anArrayValue); + + // Axis + if (anObject->HasAxis()) { + GeomToStep_MakeAxis2Placement3d anAxisMaker(anObject->GetAxis()); + Handle(StepGeom_Axis2Placement3d) anAxis = anAxisMaker.Value(); + anAxis->SetName(new TCollection_HAsciiString("orientation")); + Handle(StepAP242_GeometricItemSpecificUsage) aGISU = new StepAP242_GeometricItemSpecificUsage(); + StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; + aDefinition.SetValue(aDS); + Handle(StepRepr_HArray1OfRepresentationItem) anReprItems = new StepRepr_HArray1OfRepresentationItem(1, 1); + Handle(StepRepr_RepresentationItem) anIdentifiedItem = anAxis; + anReprItems->SetValue(1, anIdentifiedItem); + Interface_EntityIterator subs = aGraph.Sharings(aFirstDatum->OfShape()); + Handle(StepShape_ShapeDefinitionRepresentation) aSDR; + for (subs.Start(); subs.More() && aSDR.IsNull(); subs.Next()) { + Handle(Standard_Transient) anEntity = subs.Value(); + aSDR = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(anEntity); + } + if (aSDR.IsNull()) + return aDatumSystem; + + aGISU->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), + aDefinition, aSDR->UsedRepresentation(), anReprItems); + Model->AddWithRefs(anAxis); + Model->AddWithRefs(aGISU); + } + + return aDatumSystem; } //======================================================================= -//function : WriteDatumAP242 -//purpose : auxiliary (write Datum entity for given shape or write all -// necessary entities and link them to already written datum -// in case of multiple features association) +//function : WriteToleranceZone +//purpose : auxiliary (write tolerace zones) //======================================================================= -Handle(StepDimTol_Datum) STEPCAFControl_Writer::WriteDatumAP242(const Handle(XSControl_WorkSession) &WS, - const TDF_LabelSequence theShapeL, - const TDF_Label theDatumL, - const Standard_Boolean isFirstDTarget, - const Handle(StepDimTol_Datum) theWrittenDatum) +void STEPCAFControl_Writer::WriteToleranceZone (const Handle(XSControl_WorkSession) &WS, + const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObject, + const Handle(StepDimTol_GeometricTolerance)& theEntity, + const Handle(StepRepr_RepresentationContext)& theRC) { // Get working data const Handle(Interface_InterfaceModel) &Model = WS->Model(); - const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter(); - const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess(); - const Handle(Interface_HGraph) aHGraph = WS->HGraph(); - if (aHGraph.IsNull()) - return NULL; - Interface_Graph aGraph = aHGraph->Graph(); + if (theEntity.IsNull() || theObject.IsNull()) + return; - Handle(StepRepr_ShapeAspect) aSA; - Handle(StepRepr_RepresentationContext) aRC; - Handle(StepRepr_ProductDefinitionShape) aPDS; - NCollection_Sequence aSASeq; - Handle(StepAP242_GeometricItemSpecificUsage) aGISU; - Standard_Integer aSANum = 0, aGISUNum = 0; - // Link with datum feature - for (Standard_Integer i = 1; i <= theShapeL.Length(); i++) { - Handle(Standard_Transient) anEnt; - TopoDS_Shape aShape; - TopLoc_Location aLoc; - TColStd_SequenceOfTransient aSeqRI; + // Return if there is no tolerance zones + if (theObject->GetTypeOfValue() == XCAFDimTolObjects_GeomToleranceTypeValue_None && + theObject->GetZoneModifier() != XCAFDimTolObjects_GeomToleranceZoneModif_Runout) + return; - aShape = XCAFDoc_ShapeTool::GetShape(theShapeL.Value(i)); - FindEntities(FP, aShape, aLoc, aSeqRI); - if (aSeqRI.Length() <= 0) { - FP->Messenger()->SendInfo() << "Warning: Cannot find RI for " << aShape.TShape()->DynamicType()->Name() << std::endl; - continue; - } - anEnt = aSeqRI.Value(1); - aPDS = FindPDS(aGraph, anEnt, aRC); - if (aPDS.IsNull()) - continue; + // Create Tolerance_Zone + Handle(StepDimTol_ToleranceZoneForm) aForm = new StepDimTol_ToleranceZoneForm(); + Model->AddWithRefs(aForm); + aForm->Init(STEPCAFControl_GDTProperty::GetTolValueType(theObject->GetTypeOfValue())); + Handle(StepDimTol_HArray1OfToleranceZoneTarget) aZoneTargetArray = new StepDimTol_HArray1OfToleranceZoneTarget(1, 1); + StepDimTol_ToleranceZoneTarget aTarget; + aTarget.SetValue(theEntity); + aZoneTargetArray->SetValue(1, aTarget); + Handle(StepDimTol_ToleranceZone) aZone = new StepDimTol_ToleranceZone(); + aZone->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), + theEntity->TolerancedShapeAspect().ShapeAspect()->OfShape(), StepData_LFalse, + aZoneTargetArray, aForm); + Model->AddWithRefs(aZone); - Handle(StepRepr_ShapeAspect) aCurrentSA = WriteShapeAspect(WS, theDatumL, aShape, aRC, aGISU); - if (aCurrentSA.IsNull()) - continue; - aSASeq.Append(aCurrentSA); - aSANum = Model->Number(aCurrentSA); - aGISUNum = Model->Number(aGISU); + // Runout_Tolerance_Zone + Handle(StepBasic_PlaneAngleMeasureWithUnit) aPAMWU = new StepBasic_PlaneAngleMeasureWithUnit(); + Handle(StepBasic_MeasureValueMember) aValueMember = new StepBasic_MeasureValueMember(); + aValueMember->SetName("PLANE_ANGLE_MEASURE"); + aValueMember->SetReal(theObject->GetValueOfZoneModifier()); + aPAMWU->Init(aValueMember, GetUnit(theRC, Standard_True)); + Handle(StepDimTol_RunoutZoneOrientation) anOrientation = new StepDimTol_RunoutZoneOrientation(); + anOrientation->Init(aPAMWU); + Handle(StepDimTol_RunoutZoneDefinition) aDefinition = new StepDimTol_RunoutZoneDefinition(); + aDefinition->Init(aZone, NULL, anOrientation); + Model->AddWithRefs(aDefinition); + Model->AddWithRefs(anOrientation); + Model->AddWithRefs(aPAMWU); +} + +//======================================================================= +//function : WriteGeomTolerance +//purpose : auxiliary (write Geometric_Tolerance entity for given shapes, +// label and datum system) +//====================================================================== +void STEPCAFControl_Writer::WriteGeomTolerance (const Handle(XSControl_WorkSession) &WS, + const TDF_LabelSequence theShapeSeqL, + const TDF_Label theGeomTolL, + const Handle(StepDimTol_HArray1OfDatumSystemOrReference)& theDatumSystem, + const Handle(StepRepr_RepresentationContext)& theRC) +{ + // Get working data + const Handle(Interface_InterfaceModel) &Model = WS->Model(); + Handle(XCAFDoc_GeomTolerance) aGTAttr; + if (!theGeomTolL.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGTAttr)) + return; + Handle(XCAFDimTolObjects_GeomToleranceObject) anObject = aGTAttr->GetObject(); + if (anObject.IsNull()) + return; + + // Value + Handle(StepBasic_LengthMeasureWithUnit) aLMWU = new StepBasic_LengthMeasureWithUnit(); + StepBasic_Unit aUnit = GetUnit(theRC); + Handle(StepBasic_MeasureValueMember) aValueMember = new StepBasic_MeasureValueMember(); + aValueMember->SetName("LENGTH_MEASURE"); + aValueMember->SetReal(anObject->GetValue()); + aLMWU->Init(aValueMember, aUnit); + Model->AddWithRefs(aLMWU); + + // Geometric_Tolerance target + Handle(StepRepr_ShapeAspect) aMainSA; + Handle(StepRepr_RepresentationContext) dummyRC; + Handle(StepAP242_GeometricItemSpecificUsage) dummyGISU; + if (theShapeSeqL.Length() == 1) { + TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(theShapeSeqL.Value(1)); + aMainSA = WriteShapeAspect(WS, theGeomTolL, aShape, dummyRC, dummyGISU); + Model->AddWithRefs(aMainSA); } - if (aPDS.IsNull()) { - // Workaround for datums without shape - aPDS = myGDTCommonPDS; - Interface_EntityIterator aSDRIt = aGraph.Sharings(aPDS); - Handle(StepShape_ShapeDefinitionRepresentation) aSDR; - for (aSDRIt.Start(); aSDRIt.More() && aSDR.IsNull(); aSDRIt.Next()) - aSDR = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(aSDRIt.Value()); - if (!aSDR.IsNull()) { - Handle(StepRepr_Representation) aRepr = aSDR->UsedRepresentation(); - if (!aRepr.IsNull()) - aRC = aRepr->ContextOfItems(); + else { + Handle(StepRepr_CompositeShapeAspect) aCSA; + for (Standard_Integer i = 1; i <= theShapeSeqL.Length(); i++) { + TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(theShapeSeqL.Value(i)); + Handle(StepRepr_ShapeAspect) aSA = WriteShapeAspect(WS, theGeomTolL, aShape, dummyRC, dummyGISU); + if (aSA.IsNull()) + continue; + if (aCSA.IsNull()) { + aCSA = new StepRepr_CompositeShapeAspect(); + aCSA->Init(aSA->Name(), aSA->Description(), aSA->OfShape(), aSA->ProductDefinitional()); + Model->AddWithRefs(aCSA); + } + Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); + aSAR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aCSA, aSA); + Model->AddWithRefs(aSAR); } + aMainSA = aCSA; } + StepDimTol_GeometricToleranceTarget aGTTarget; + aGTTarget.SetValue(aMainSA); + Standard_Boolean isWithModif = Standard_False, + isWithDatRef = Standard_False, + isWithMaxTol = Standard_False; + // Modifiers + // Simple modifiers + XCAFDimTolObjects_GeomToleranceModifiersSequence aModifiers = anObject->GetModifiers(); + Handle(StepDimTol_HArray1OfGeometricToleranceModifier) aModifArray; + Handle(StepBasic_LengthMeasureWithUnit) aMaxLMWU; + Standard_Integer aModifNb = aModifiers.Length(); + if (anObject->GetMaterialRequirementModifier() != XCAFDimTolObjects_GeomToleranceMatReqModif_None) + aModifNb++; + for (Standard_Integer i = 1; i <= aModifiers.Length(); i++) + if (aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Around || + aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Over) + aModifNb--; + if (aModifNb > 0) { + isWithModif = Standard_True; + aModifArray = new StepDimTol_HArray1OfGeometricToleranceModifier(1, aModifNb); + Standard_Integer k = 1; + for (Standard_Integer i = 1; i <= aModifiers.Length(); i++) { + if (aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Around || + aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Over) + continue; + StepDimTol_GeometricToleranceModifier aModif = + STEPCAFControl_GDTProperty::GetGeomToleranceModifier(aModifiers.Value(i)); + aModifArray->SetValue(k, aModif); + k++; + } + if (anObject->GetMaterialRequirementModifier() == XCAFDimTolObjects_GeomToleranceMatReqModif_L) { + aModifArray->SetValue(aModifNb, StepDimTol_GTMLeastMaterialRequirement); + } + else if (anObject->GetMaterialRequirementModifier() == XCAFDimTolObjects_GeomToleranceMatReqModif_M) { + aModifArray->SetValue(aModifNb, StepDimTol_GTMMaximumMaterialRequirement); + } + // Modifier with value + if (anObject->GetMaxValueModifier() != 0) { + isWithMaxTol = Standard_True; + aMaxLMWU = new StepBasic_LengthMeasureWithUnit(); + Handle(StepBasic_MeasureValueMember) aModifierValueMember = new StepBasic_MeasureValueMember(); + aModifierValueMember->SetName("LENGTH_MEASURE"); + aModifierValueMember->SetReal(anObject->GetMaxValueModifier()); + aMaxLMWU->Init(aModifierValueMember, aUnit); + Model->AddWithRefs(aMaxLMWU); + } + } - // Find if datum has datum targets and get common datum attributes - Handle(XCAFDoc_Datum) aDatumAttr; - if (!theDatumL.FindAttribute(XCAFDoc_Datum::GetID(), aDatumAttr)) - return NULL; - Handle(XCAFDimTolObjects_DatumObject) anObject = aDatumAttr->GetObject(); - if (anObject.IsNull()) - return NULL; - Standard_Boolean isSimpleDatum = !anObject->IsDatumTarget(); - Handle(TCollection_HAsciiString) anIdentifier = anObject->GetName(); - Handle(TCollection_HAsciiString) aTargetId = (anObject->GetDatumTargetNumber() == 0 ? - new TCollection_HAsciiString() : new TCollection_HAsciiString(anObject->GetDatumTargetNumber())); + // Datum Reference + isWithDatRef = !theDatumSystem.IsNull(); - // If datum type is area, but there is no area in object, write as simple datum - if (anObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area && - anObject->GetDatumTarget().IsNull()) - isSimpleDatum = Standard_True; + // Collect all attributes + Handle(TCollection_HAsciiString) aName = new TCollection_HAsciiString(), + aDescription = new TCollection_HAsciiString(); + Handle(StepDimTol_GeometricToleranceWithDatumReference) aGTWDR = + new StepDimTol_GeometricToleranceWithDatumReference(); + aGTWDR->SetDatumSystem(theDatumSystem); + Handle(StepDimTol_GeometricToleranceWithModifiers) aGTWM = + new StepDimTol_GeometricToleranceWithModifiers(); + aGTWM->SetModifiers(aModifArray); + StepDimTol_GeometricToleranceType aType = + STEPCAFControl_GDTProperty::GetGeomToleranceType(anObject->GetType()); - // Simple datum - if (isSimpleDatum) { - if (aSASeq.Length() == 0) { - // Create empty datum with name and presentation only - Handle(StepDimTol_DatumFeature) aDF = new StepDimTol_DatumFeature(); - aDF->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, StepData_LTrue); - aSA = aDF; - Model->AddWithRefs(aDF); - } - else if (aSASeq.Length() == 1) { - Handle(StepDimTol_DatumFeature) aDF = new StepDimTol_DatumFeature(); - aDF->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, StepData_LTrue); - Model->ReplaceEntity(aSANum, aDF); - aSA = aDF; - StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; - aDefinition.SetValue(aDF); - aGISU->SetDefinition(aDefinition); - Model->ReplaceEntity(aGISUNum, aGISU); + // Init and write necessary subtype of Geometric_Tolerance entity + Handle(StepDimTol_GeometricTolerance) aGeomTol; + if (isWithModif) { + if (isWithMaxTol) { + if (isWithDatRef) { + // Geometric_Tolerance & Geometric_Tolerance_With_Datum_Reference & + //Geometric_Tolerance_With_Maximum_Tolerance & Geometric_Tolerance_With_Modifiers + Handle(StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol) aResult = + new StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol(); + aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWDR, aGTWM, aMaxLMWU, aType); + aGeomTol = aResult; + } + else { + // Geometric_Tolerance & Geometric_Tolerance_With_Maximum_Tolerance & Geometric_Tolerance_With_Modifiers + Handle(StepDimTol_GeoTolAndGeoTolWthMaxTol) aResult = + new StepDimTol_GeoTolAndGeoTolWthMaxTol(); + aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWM, aMaxLMWU, aType); + aGeomTol = aResult; + } } - else if (aSASeq.Length() > 1) { - Handle(StepRepr_CompShAspAndDatumFeatAndShAsp) aDF = new StepRepr_CompShAspAndDatumFeatAndShAsp(); - aDF->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, StepData_LTrue); - for (Standard_Integer i = 1; i <= aSASeq.Length(); i++) { - Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); - aSAR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aDF, aSASeq.Value(i)); - Model->AddWithRefs(aSAR); + else { + if (isWithDatRef) { + // Geometric_Tolerance & Geometric_Tolerance_With_Datum_Reference & Geometric_Tolerance_With_Modifiers + Handle(StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod) aResult = + new StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod(); + aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWDR, aGTWM, aType); + aGeomTol = aResult; + } + else { + // Geometric_Tolerance & Geometric_Tolerance_With_Modifiers + Handle(StepDimTol_GeoTolAndGeoTolWthMod) aResult = + new StepDimTol_GeoTolAndGeoTolWthMod(); + aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWM, aType); + aGeomTol = aResult; } - aSA = aDF; - Model->AddWithRefs(aDF); } } - // Datum with datum targets else { - XCAFDimTolObjects_DatumTargetType aDatumType = anObject->GetDatumTargetType(); - Handle(StepDimTol_DatumTarget) aDatumTarget; - // Note: the given way to write such datum type may be incorrect (too little information) - if (aDatumType == XCAFDimTolObjects_DatumTargetType_Area) { - TopoDS_Shape aDTShape = anObject->GetDatumTarget(); - Handle(StepAP242_GeometricItemSpecificUsage) anAreaGISU; - Handle(StepRepr_ShapeAspect) anAreaSA = WriteShapeAspect(WS, theDatumL, aDTShape, aRC, anAreaGISU); - aSANum = Model->Number(anAreaSA); - aGISUNum = Model->Number(anAreaGISU); - Handle(StepDimTol_DatumTarget) aDT = new StepDimTol_DatumTarget(); - aDT->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString("area"), anAreaSA->OfShape(), - StepData_LTrue, aTargetId); - Model->ReplaceEntity(aSANum, aDT); - StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; - aDefinition.SetValue(aDT); - anAreaGISU->SetDefinition(aDefinition); - Model->ReplaceEntity(aGISUNum, anAreaGISU); + if (isWithDatRef) { + // Geometric_Tolerance & Geometric_Tolerance_With_Datum_Reference + Handle(StepDimTol_GeoTolAndGeoTolWthDatRef) aResult = + new StepDimTol_GeoTolAndGeoTolWthDatRef(); + aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWDR, aType); + aGeomTol = aResult; } else { - Handle(StepDimTol_PlacedDatumTargetFeature) aPDTF = new StepDimTol_PlacedDatumTargetFeature(); - aPDTF->Init(new TCollection_HAsciiString(), STEPCAFControl_GDTProperty::GetDatumTargetName(aDatumType), - aPDS, StepData_LTrue, aTargetId); - Model->AddWithRefs(aPDTF); - aDatumTarget = aPDTF; - // Datum targets - Handle(StepRepr_PropertyDefinition) aPD = new StepRepr_PropertyDefinition(); - StepRepr_CharacterizedDefinition aCDefinition; - aCDefinition.SetValue(aPDTF); - aPD->Init(new TCollection_HAsciiString(), Standard_False, NULL, aCDefinition); - if (anObject->HasDatumTargetParams()) { - // write all parameters of datum target - Handle(StepShape_ShapeRepresentationWithParameters) aSRWP = new StepShape_ShapeRepresentationWithParameters(); - // Common for all datum targets - StepBasic_Unit aUnit = GetUnit(aRC); - gp_Ax2 aDTAxis = anObject->GetDatumTargetAxis(); - GeomToStep_MakeAxis2Placement3d anAxisMaker(aDTAxis); - Handle(StepGeom_Axis2Placement3d) anA2P3D = anAxisMaker.Value(); - anA2P3D->SetName(new TCollection_HAsciiString("orientation")); - Handle(StepRepr_HArray1OfRepresentationItem) anItems; - // Process each datum target type - if (aDatumType == XCAFDimTolObjects_DatumTargetType_Point) { - anItems = new StepRepr_HArray1OfRepresentationItem(1, 1); - } - else { - Handle(TCollection_HAsciiString) aTargetValueName; - if (aDatumType == XCAFDimTolObjects_DatumTargetType_Line) { - anItems = new StepRepr_HArray1OfRepresentationItem(1, 2); - aTargetValueName = new TCollection_HAsciiString("target length"); - } - else if (aDatumType == XCAFDimTolObjects_DatumTargetType_Rectangle) { - anItems = new StepRepr_HArray1OfRepresentationItem(1, 3); - aTargetValueName = new TCollection_HAsciiString("target length"); - // Additional value - Handle(StepRepr_ReprItemAndMeasureWithUnit) aTargetValue = CreateDimValue(anObject->GetDatumTargetWidth(), - aUnit, new TCollection_HAsciiString("target width"), "POSITIVE_LENGTH_MEASURE", Standard_False); - anItems->SetValue(2, aTargetValue); - Model->AddWithRefs(aTargetValue); - } - else if (aDatumType == XCAFDimTolObjects_DatumTargetType_Circle) { - anItems = new StepRepr_HArray1OfRepresentationItem(1, 2); - aTargetValueName = new TCollection_HAsciiString("target diameter"); - } - // Value - Handle(StepRepr_ReprItemAndMeasureWithUnit) aTargetValue = CreateDimValue(anObject->GetDatumTargetLength(), - aUnit, aTargetValueName, "POSITIVE_LENGTH_MEASURE", Standard_False); - anItems->SetValue(1, aTargetValue); - Model->AddWithRefs(aTargetValue); - } - anItems->SetValue(anItems->Length(), anA2P3D); - aSRWP->Init(new TCollection_HAsciiString(), anItems, aRC); - // Create and write auxiliary entities - Handle(StepShape_ShapeDefinitionRepresentation) aSDR = new StepShape_ShapeDefinitionRepresentation(); - StepRepr_RepresentedDefinition aRDefinition; - aRDefinition.SetValue(aPD); - aSDR->Init(aRDefinition, aSRWP); - Model->AddWithRefs(aPD); - Model->AddWithRefs(aSRWP); - Model->AddWithRefs(aSDR); - } - } - // Link datum target to datum feature - // if aSASeq.Length() == 0 nothing to do - if (aSASeq.Length() == 1) { - Handle(StepRepr_FeatureForDatumTargetRelationship) aFFDTR = new StepRepr_FeatureForDatumTargetRelationship(); - aFFDTR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aSASeq.Value(1), aDatumTarget); - Model->AddWithRefs(aFFDTR); - } - else if (aSASeq.Length() > 1) { - Handle(StepRepr_CompositeShapeAspect) aCompSA = new StepRepr_CompositeShapeAspect(); - aCompSA->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, aSASeq.Value(1)->ProductDefinitional()); - for (Standard_Integer i = 1; i <= aSASeq.Length(); i++) { - Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); - aSAR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aCompSA, aSASeq.Value(i)); - Model->AddWithRefs(aSAR); + // Geometric_Tolerance + Handle(StepDimTol_GeometricTolerance) aResult = + STEPCAFControl_GDTProperty::GetGeomTolerance(anObject->GetType()); + if (!aResult.IsNull()) { + aResult->Init(aName, aDescription, aLMWU, aGTTarget); + aGeomTol = aResult; } - Handle(StepRepr_FeatureForDatumTargetRelationship) aFFDTR = new StepRepr_FeatureForDatumTargetRelationship(); - aFFDTR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aCompSA, aDatumTarget); - Model->AddWithRefs(aFFDTR); } - aSA = aDatumTarget; - } - - // Datum - Handle(StepDimTol_Datum) aDatum = theWrittenDatum; - if (isFirstDTarget) { - aDatum = new StepDimTol_Datum(); - aDatum->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, StepData_LFalse, anIdentifier); - Model->AddWithRefs(aDatum); - } - - // Shape_Aspect_Relationship - if (!aSA.IsNull()) { - Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); - aSAR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aSA, aDatum); - Model->AddWithRefs(aSAR); } - + Model->AddWithRefs(aGeomTol); + WriteToleranceZone(WS, anObject, aGeomTol, theRC); //Annotation plane and Presentation WritePresentation(WS, anObject->GetPresentation(), anObject->GetPresentationName(), Standard_True, anObject->HasPlane(), - anObject->GetPlane(), anObject->GetPointTextAttach(), aSA); - - return aDatum; + anObject->GetPlane(), anObject->GetPointTextAttach(), aGeomTol); } //======================================================================= -//function : WriteDimValues -//purpose : auxiliary (write all data for given dimension: values, -// qualifiers, modifiers, orientation and tolerance class) -//====================================================================== -static void WriteDimValues(const Handle(XSControl_WorkSession) &WS, - const Handle(XCAFDimTolObjects_DimensionObject) theObject, - const Handle(StepRepr_RepresentationContext) theRC, - const StepShape_DimensionalCharacteristic theDimension) +//function : WriteDGTs +//purpose : +//======================================================================= +Standard_Boolean STEPCAFControl_Writer::WriteDGTs (const Handle(XSControl_WorkSession) &WS, + const TDF_LabelSequence &labels ) const { - // Get working data - const Handle(Interface_InterfaceModel) &aModel = WS->Model(); - XCAFDimTolObjects_DimensionModifiersSequence aModifiers = theObject->GetModifiers(); - Handle(Standard_Transient) aDim = theDimension.Value(); - Standard_Boolean isAngle = aDim->IsKind(STANDARD_TYPE(StepShape_AngularLocation)) || - aDim->IsKind(STANDARD_TYPE(StepShape_AngularSize)); - - // Unit - StepBasic_Unit aUnit = GetUnit(theRC, isAngle); - Standard_CString aMeasureName; - if (isAngle) - aMeasureName = "POSITIVE_PLANE_ANGLE_MEASURE"; - else - aMeasureName = "POSITIVE_LENGTH_MEASURE"; - - // Values - Handle(StepRepr_HArray1OfRepresentationItem) aValues; - Standard_Integer aNbItems = 1, aValIt = 1; - if (theObject->IsDimWithRange()) - aNbItems += 2; - if (aModifiers.Length() > 0) - aNbItems++; - if (theObject->GetType() == XCAFDimTolObjects_DimensionType_Location_Oriented) - aNbItems++; - aNbItems += theObject->NbDescriptions(); - aValues = new StepRepr_HArray1OfRepresentationItem(1, aNbItems); - - // Nominal value - Standard_Real aNominal = theObject->GetValue(); - Standard_Integer aLeftNbDigits, aRightNbDigits; - theObject->GetNbOfDecimalPlaces(aLeftNbDigits, aRightNbDigits); - Standard_Integer aNbQualifiers = 0; - if (theObject->HasQualifier() && !isAngle) - aNbQualifiers++; - if (aLeftNbDigits > 0 || aRightNbDigits > 0) - aNbQualifiers++; - // With qualifiers - if (aNbQualifiers > 0) { - Handle(StepShape_QualifiedRepresentationItem) aQRI = new StepShape_QualifiedRepresentationItem(); - Handle(StepShape_HArray1OfValueQualifier) aQualifiers = new StepShape_HArray1OfValueQualifier(1, aNbQualifiers); - // Type qualifier - if (theObject->HasQualifier() && !isAngle) { - StepShape_ValueQualifier anItem; - Handle(StepShape_TypeQualifier) aType = new StepShape_TypeQualifier(); - XCAFDimTolObjects_DimensionQualifier aQualifier = theObject->GetQualifier(); - aType->Init(STEPCAFControl_GDTProperty::GetDimQualifierName(aQualifier)); - aModel->AddWithRefs(aType); - anItem.SetValue(aType); - aQualifiers->SetValue(1, anItem); - } - // Number of decimal places - if (aLeftNbDigits > 0 || aRightNbDigits > 0) { - StepShape_ValueQualifier anItem; - Handle(StepShape_ValueFormatTypeQualifier) aType = new StepShape_ValueFormatTypeQualifier(); - Handle(TCollection_HAsciiString) aFormatType = new TCollection_HAsciiString("NR2 "); - aFormatType->AssignCat(new TCollection_HAsciiString(aLeftNbDigits)); - aFormatType->AssignCat(new TCollection_HAsciiString(".")); - aFormatType->AssignCat(new TCollection_HAsciiString(aRightNbDigits)); - aType->Init(aFormatType); - aModel->AddWithRefs(aType); - anItem.SetValue(aType); - aQualifiers->SetValue(aNbQualifiers, anItem); - } - // Set qualifiers - aQRI->SetQualifiers(aQualifiers); - Handle(StepRepr_ReprItemAndMeasureWithUnit) anItem = CreateDimValue(aNominal, aUnit, - new TCollection_HAsciiString("nominal value"), aMeasureName, isAngle, Standard_True, aQRI); - aValues->SetValue(aValIt, anItem); - aValIt++; - } - // Without qualifiers - else { - Handle(StepRepr_ReprItemAndMeasureWithUnit) anItem = CreateDimValue(aNominal, aUnit, - new TCollection_HAsciiString("nominal value"), aMeasureName, isAngle); - aValues->SetValue(aValIt, anItem); - aValIt++; - } + + if ( labels.Length() <=0 ) return Standard_False; + + // get working data + const Handle(Interface_InterfaceModel) &Model = WS->Model(); + const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter(); + const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess(); - // Ranges - if (theObject->IsDimWithRange()) { - Handle(StepRepr_ReprItemAndMeasureWithUnit) aLowerItem = CreateDimValue(theObject->GetLowerBound(), aUnit, - new TCollection_HAsciiString("lower limit"), aMeasureName, isAngle); - Handle(StepRepr_ReprItemAndMeasureWithUnit) anUpperItem = CreateDimValue(theObject->GetUpperBound(), aUnit, - new TCollection_HAsciiString("upper limit"), aMeasureName, isAngle); - aValues->SetValue(aValIt, aLowerItem); - aValIt++; - aValues->SetValue(aValIt, anUpperItem); - aValIt++; - } + const Handle(Interface_HGraph) aHGraph = WS->HGraph(); + if(aHGraph.IsNull()) + return Standard_False; - // Modifiers - if (aModifiers.Length() > 0) { - Handle(StepRepr_CompoundRepresentationItem) aCompoundRI = new StepRepr_CompoundRepresentationItem(); - Handle (StepRepr_HArray1OfRepresentationItem) aModifItems = - new StepRepr_HArray1OfRepresentationItem(1, aModifiers.Length()); - for (Standard_Integer i = 1; i <= aModifiers.Length(); i++) { - XCAFDimTolObjects_DimensionModif aModif = aModifiers.Value(i); - Handle(StepRepr_DescriptiveRepresentationItem) aModifItem = - new StepRepr_DescriptiveRepresentationItem(); - aModifItem->Init(new TCollection_HAsciiString(), STEPCAFControl_GDTProperty::GetDimModifierName(aModif)); - aModel->AddWithRefs(aModifItem); - aModifItems->SetValue(i, aModifItem); + Interface_Graph aGraph = aHGraph->Graph(); + Handle(XCAFDoc_DimTolTool) DGTTool = XCAFDoc_DocumentTool::DimTolTool( labels(1) ); + if(DGTTool.IsNull() ) return Standard_False; + + TDF_LabelSequence DGTLabels; + + STEPConstruct_DataMapOfAsciiStringTransient DatumMap; + + // write Datums + DGTLabels.Clear(); + DGTTool->GetDatumLabels(DGTLabels); + if(DGTLabels.Length()<=0) return Standard_False; + Standard_Integer i; + for(i=1; i<=DGTLabels.Length(); i++) { + TDF_Label DatumL = DGTLabels.Value(i); + TDF_LabelSequence ShapeL; + TDF_LabelSequence aNullSeq; + if(!DGTTool->GetRefShapeLabel(DatumL,ShapeL,aNullSeq)) continue; + // find target shape + TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL.Value(1)); + TopLoc_Location Loc; + TColStd_SequenceOfTransient seqRI; + FindEntities( FP, aShape, Loc, seqRI ); + if ( seqRI.Length() <= 0 ) { + FP->Messenger()->SendInfo() << "Warning: Cannot find RI for "<DynamicType()->Name()<Init(new TCollection_HAsciiString(), aModifItems); - aValues->SetValue(aValIt, aCompoundRI); - aValIt++; + Handle(StepRepr_ProductDefinitionShape) PDS; + Handle(StepRepr_RepresentationContext) RC; + Handle(Standard_Transient) ent = seqRI.Value(1); + Handle(StepShape_AdvancedFace) AF; + Handle(StepShape_EdgeCurve) EC; + FindPDSforDGT(aGraph,ent,PDS,RC,AF,EC); + if(PDS.IsNull()) continue; + //std::cout<<"Model->Number(PDS)="<Number(PDS)<GetName(); + Handle(TCollection_HAsciiString) aDescription = DatumAttr->GetDescription(); + Handle(TCollection_HAsciiString) anIdentification = DatumAttr->GetIdentification(); + Handle(StepDimTol_DatumFeature) DF = new StepDimTol_DatumFeature; + Handle(StepDimTol_Datum) aDatum = new StepDimTol_Datum; + DF->Init(aName, new TCollection_HAsciiString, PDS, StepData_LTrue); + Model->AddWithRefs(DF); + aDatum->Init(aName, new TCollection_HAsciiString, PDS, StepData_LFalse, anIdentification); + Model->AddWithRefs(aDatum); + Handle(StepRepr_ShapeAspectRelationship) SAR = new StepRepr_ShapeAspectRelationship; + SAR->SetName(aName); + SAR->SetRelatingShapeAspect(DF); + SAR->SetRelatedShapeAspect(aDatum); + Model->AddWithRefs(SAR); + // write chain for DatumFeature + StepRepr_CharacterizedDefinition CD; + CD.SetValue(DF); + Handle(StepRepr_PropertyDefinition) PropD = new StepRepr_PropertyDefinition; + PropD->Init(aName,Standard_True,aDescription,CD); + Model->AddWithRefs(PropD); + StepRepr_RepresentedDefinition RD; + RD.SetValue(PropD); + Handle(StepShape_ShapeRepresentation) SR = new StepShape_ShapeRepresentation; + Handle(StepRepr_HArray1OfRepresentationItem) HARI = + new StepRepr_HArray1OfRepresentationItem(1,1); + HARI->SetValue(1,AF); + SR->Init(aName,HARI,RC); + Handle(StepShape_ShapeDefinitionRepresentation) SDR = new StepShape_ShapeDefinitionRepresentation; + SDR->Init(RD,SR); + Model->AddWithRefs(SDR); + // write chain for Datum + StepRepr_CharacterizedDefinition CD1; + CD1.SetValue(aDatum); + Handle(StepRepr_PropertyDefinition) PropD1 = new StepRepr_PropertyDefinition; + PropD1->Init(aName,Standard_True,aDescription,CD1); + Model->AddWithRefs(PropD1); + StepRepr_RepresentedDefinition RD1; + RD1.SetValue(PropD1); + Handle(StepShape_ShapeRepresentation) SR1 = new StepShape_ShapeRepresentation; + Handle(StepRepr_HArray1OfRepresentationItem) HARI1 = + new StepRepr_HArray1OfRepresentationItem(1,1); + HARI1->SetValue(1,AF->FaceGeometry()); + SR1->Init(aName,HARI1,RC); + Model->AddWithRefs(SR1); + Handle(StepShape_ShapeDefinitionRepresentation) SDR1 = new StepShape_ShapeDefinitionRepresentation; + SDR1->Init(RD1,SR1); + Model->AddWithRefs(SDR1); + // add created Datum into Map + TCollection_AsciiString stmp(aName->ToCString()); + stmp.AssignCat(aDescription->ToCString()); + stmp.AssignCat(anIdentification->ToCString()); + DatumMap.Bind(stmp,aDatum); } - // Orientation - if (theObject->GetType() == XCAFDimTolObjects_DimensionType_Location_Oriented) { - Handle(StepGeom_Axis2Placement3d) anOrientation = new StepGeom_Axis2Placement3d(); - gp_Dir aDir; - theObject->GetDirection(aDir); - GeomToStep_MakeCartesianPoint MkPoint(gp_Pnt(0, 0, 0)); - Handle(StepGeom_CartesianPoint) aLoc = MkPoint.Value(); - Handle(StepGeom_Direction) anAxis = new StepGeom_Direction(); - Handle(TColStd_HArray1OfReal) aCoords = new TColStd_HArray1OfReal(1, 3); - aCoords->SetValue(1, aDir.X()); - aCoords->SetValue(2, aDir.Y()); - aCoords->SetValue(3, aDir.Z()); - anAxis->Init(new TCollection_HAsciiString(), aCoords); - anOrientation->Init(new TCollection_HAsciiString("orientation"), aLoc, Standard_True, anAxis, Standard_False, NULL); - aValues->SetValue(aValIt, anOrientation); - aValIt++; - } + // write Tolerances and Dimensions + DGTLabels.Clear(); + DGTTool->GetDimTolLabels(DGTLabels); + if(DGTLabels.Length()<=0) return Standard_False; + for(i=1; i<=DGTLabels.Length(); i++) { + TDF_Label DimTolL = DGTLabels.Value(i); + TDF_LabelSequence ShapeL; + TDF_LabelSequence aNullSeq; + if(!DGTTool->GetRefShapeLabel(DimTolL,ShapeL,aNullSeq)) continue; + // find target shape + TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL.Value(1)); + TopLoc_Location Loc; + TColStd_SequenceOfTransient seqRI; + FindEntities( FP, aShape, Loc, seqRI ); + if ( seqRI.Length() <= 0 ) { + FP->Messenger()->SendInfo() << "Warning: Cannot find RI for "<DynamicType()->Name()<Number(PDS)="<Number(PDS)<HasDescriptions()) { - for (Standard_Integer i = 0; i < theObject->NbDescriptions(); i++) { - Handle(StepRepr_DescriptiveRepresentationItem) aDRI = new StepRepr_DescriptiveRepresentationItem(); - aDRI->Init(theObject->GetDescriptionName(i), theObject->GetDescription(i)); - aValues->SetValue(aValIt, aDRI); - aValIt++; + Handle(XCAFDoc_DimTol) DimTolAttr; + if(!DimTolL.FindAttribute(XCAFDoc_DimTol::GetID(),DimTolAttr)) continue; + Standard_Integer kind = DimTolAttr->GetKind(); + Handle(TColStd_HArray1OfReal) aVal = DimTolAttr->GetVal(); + Handle(TCollection_HAsciiString) aName = DimTolAttr->GetName(); + Handle(TCollection_HAsciiString) aDescription = DimTolAttr->GetDescription(); + + // common part of writing D> entities + StepRepr_CharacterizedDefinition CD; + Handle(StepRepr_ShapeAspect) SA = new StepRepr_ShapeAspect; + SA->Init(aName, new TCollection_HAsciiString, PDS, StepData_LTrue); + Model->AddWithRefs(SA); + CD.SetValue(SA); + Handle(StepRepr_PropertyDefinition) PropD = new StepRepr_PropertyDefinition; + PropD->Init(aName,Standard_True,aDescription,CD); + Model->AddWithRefs(PropD); + StepRepr_RepresentedDefinition RD; + RD.SetValue(PropD); + Handle(StepShape_ShapeRepresentation) SR = new StepShape_ShapeRepresentation; + Handle(StepRepr_HArray1OfRepresentationItem) HARI = + new StepRepr_HArray1OfRepresentationItem(1,1); + if(kind<20) + HARI->SetValue(1,EC); + else + HARI->SetValue(1,AF); + SR->Init(aName,HARI,RC); + Handle(StepShape_ShapeDefinitionRepresentation) SDR = new StepShape_ShapeDefinitionRepresentation; + SDR->Init(RD,SR); + Model->AddWithRefs(SDR); + // define aUnit for creation LengthMeasureWithUnit (common for all) + StepBasic_Unit aUnit; + aUnit = GetUnit(RC); + + // specific part of writing D> entities + if(kind<20) { //dimension + Handle(StepShape_DimensionalSize) DimSize = new StepShape_DimensionalSize; + DimSize->Init(SA,aDescription); + Model->AddWithRefs(DimSize); + if(aVal->Length()>1) { + // create MeasureWithUnits + Handle(StepBasic_MeasureValueMember) MVM1 = new StepBasic_MeasureValueMember; + MVM1->SetName("POSITIVE_LENGTH_MEASURE"); + MVM1->SetReal(aVal->Value(1)); + Handle(StepBasic_MeasureWithUnit) MWU1 = new StepBasic_MeasureWithUnit; + MWU1->Init(MVM1,aUnit); + Handle(StepBasic_MeasureValueMember) MVM2 = new StepBasic_MeasureValueMember; + MVM2->SetName("POSITIVE_LENGTH_MEASURE"); + MVM2->SetReal(aVal->Value(2)); + Handle(StepBasic_MeasureWithUnit) MWU2 = new StepBasic_MeasureWithUnit; + MWU2->Init(MVM2,aUnit); + Handle(StepRepr_RepresentationItem) RI1 = new StepRepr_RepresentationItem; + RI1->Init(new TCollection_HAsciiString("lower limit")); + Handle(StepRepr_RepresentationItem) RI2 = new StepRepr_RepresentationItem; + RI2->Init(new TCollection_HAsciiString("upper limit")); + Handle(StepRepr_ReprItemAndLengthMeasureWithUnit) RILMU1 = + new StepRepr_ReprItemAndLengthMeasureWithUnit; + RILMU1->Init(MWU1,RI1); + Handle(StepRepr_ReprItemAndLengthMeasureWithUnit) RILMU2 = + new StepRepr_ReprItemAndLengthMeasureWithUnit; + RILMU2->Init(MWU2,RI2); + Model->AddWithRefs(RILMU1); + Model->AddWithRefs(RILMU2); + //Handle(StepRepr_CompoundItemDefinitionMember) CIDM = + // new StepRepr_CompoundItemDefinitionMember; + //Handle(TColStd_HArray1OfTransient) ArrTr = new TColStd_HArray1OfTransient(1,2); + //ArrTr->SetValue(1,RILMU1); + //ArrTr->SetValue(2,RILMU2); + //CIDM->SetArrTransient(ArrTr); + //CIDM->SetName("SET_REPRESENTATION_ITEM"); + //StepRepr_CompoundItemDefinition CID; + //CID.SetValue(CIDM); + Handle(StepRepr_HArray1OfRepresentationItem) HARIVR = + new StepRepr_HArray1OfRepresentationItem(1,2); + HARIVR->SetValue(1,RILMU1); + HARIVR->SetValue(2,RILMU2); + Handle(StepRepr_ValueRange) VR = new StepRepr_ValueRange; + //VR->Init(aName,CID); + VR->Init(aName,HARIVR); + Model->AddEntity(VR); + Handle(StepShape_ShapeDimensionRepresentation) SDimR = + new StepShape_ShapeDimensionRepresentation; + Handle(StepRepr_HArray1OfRepresentationItem) aHARI = + new StepRepr_HArray1OfRepresentationItem(1,1); + aHARI->SetValue(1,VR); + SDimR->Init(aName,aHARI,RC); + Model->AddWithRefs(SDimR); + Handle(StepShape_DimensionalCharacteristicRepresentation) DimCharR = + new StepShape_DimensionalCharacteristicRepresentation; + StepShape_DimensionalCharacteristic DimChar; + DimChar.SetValue(DimSize); + DimCharR->Init(DimChar,SDimR); + Model->AddEntity(DimCharR); + } + } + else if(kind<50) { //tolerance + if(kind<35) { // tolerance with datum system + TDF_LabelSequence DatumLabels; + DGTTool->GetDatumOfTolerLabels(DimTolL,DatumLabels); + Standard_Integer NbDR = DatumLabels.Length(); + Handle(StepDimTol_HArray1OfDatumReference) HADR = new StepDimTol_HArray1OfDatumReference(1,NbDR); + for(Standard_Integer j=1; j<=NbDR; j++) { + Handle(XCAFDoc_Datum) DatumAttr; + TDF_Label DatumL = DatumLabels.Value(j); + if(!DatumL.FindAttribute(XCAFDoc_Datum::GetID(),DatumAttr)) continue; + Handle(TCollection_HAsciiString) aNameD = DatumAttr->GetName(); + Handle(TCollection_HAsciiString) aDescriptionD = DatumAttr->GetDescription(); + Handle(TCollection_HAsciiString) anIdentificationD = DatumAttr->GetIdentification(); + TCollection_AsciiString stmp(aNameD->ToCString()); + stmp.AssignCat(aDescriptionD->ToCString()); + stmp.AssignCat(anIdentificationD->ToCString()); + if(DatumMap.IsBound(stmp)) { + Handle(StepDimTol_Datum) aDatum = + Handle(StepDimTol_Datum)::DownCast(DatumMap.Find(stmp)); + Handle(StepDimTol_DatumReference) DR = new StepDimTol_DatumReference; + DR->Init(j,aDatum); + Model->AddWithRefs(DR); + HADR->SetValue(j,DR); + } + } + // create LengthMeasureWithUnit + Handle(StepBasic_MeasureValueMember) MVM = new StepBasic_MeasureValueMember; + MVM->SetName("LENGTH_MEASURE"); + MVM->SetReal(aVal->Value(1)); + Handle(StepBasic_LengthMeasureWithUnit) LMWU = new StepBasic_LengthMeasureWithUnit; + LMWU->Init(MVM,aUnit); + // create tolerance by it's type + if(kind<24) { + Handle(StepDimTol_GeometricToleranceWithDatumReference) GTWDR = + new StepDimTol_GeometricToleranceWithDatumReference; + GTWDR->SetDatumSystem(HADR); + Handle(StepDimTol_ModifiedGeometricTolerance) MGT = + new StepDimTol_ModifiedGeometricTolerance; + if(kind==21) MGT->SetModifier(StepDimTol_MaximumMaterialCondition); + else if(kind==22) MGT->SetModifier(StepDimTol_LeastMaterialCondition); + else if(kind==23) MGT->SetModifier(StepDimTol_RegardlessOfFeatureSize); + Handle(StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol) GTComplex = + new StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol; + GTComplex->Init(aName,aDescription,LMWU,SA,GTWDR,MGT); + Model->AddWithRefs(GTComplex); + } + else if(kind==24) { + Handle(StepDimTol_AngularityTolerance) aToler = + new StepDimTol_AngularityTolerance; + aToler->Init(aName,aDescription,LMWU,SA,HADR); + Model->AddWithRefs(aToler); + } + else if(kind==25) { + Handle(StepDimTol_CircularRunoutTolerance) aToler = + new StepDimTol_CircularRunoutTolerance; + aToler->Init(aName,aDescription,LMWU,SA,HADR); + Model->AddWithRefs(aToler); + } + else if(kind==26) { + Handle(StepDimTol_CoaxialityTolerance) aToler = + new StepDimTol_CoaxialityTolerance; + aToler->Init(aName,aDescription,LMWU,SA,HADR); + Model->AddWithRefs(aToler); + } + else if(kind==27) { + Handle(StepDimTol_ConcentricityTolerance) aToler = + new StepDimTol_ConcentricityTolerance; + aToler->Init(aName,aDescription,LMWU,SA,HADR); + Model->AddWithRefs(aToler); + } + else if(kind==28) { + Handle(StepDimTol_ParallelismTolerance) aToler = + new StepDimTol_ParallelismTolerance; + aToler->Init(aName,aDescription,LMWU,SA,HADR); + Model->AddWithRefs(aToler); + } + else if(kind==29) { + Handle(StepDimTol_PerpendicularityTolerance) aToler = + new StepDimTol_PerpendicularityTolerance; + aToler->Init(aName,aDescription,LMWU,SA,HADR); + Model->AddWithRefs(aToler); + } + else if(kind==30) { + Handle(StepDimTol_SymmetryTolerance) aToler = + new StepDimTol_SymmetryTolerance; + aToler->Init(aName,aDescription,LMWU,SA,HADR); + Model->AddWithRefs(aToler); + } + else if(kind==31) { + Handle(StepDimTol_TotalRunoutTolerance) aToler = + new StepDimTol_TotalRunoutTolerance; + aToler->Init(aName,aDescription,LMWU,SA,HADR); + Model->AddWithRefs(aToler); + } + } } } - for (Standard_Integer i = 1; i <= aValues->Length(); i++) - aModel->AddWithRefs(aValues->Value(i)); - - // Create resulting Shape_Dimension_Representation - Handle(StepShape_ShapeDimensionRepresentation) aSDR = new StepShape_ShapeDimensionRepresentation(); - aSDR->Init(new TCollection_HAsciiString(), aValues, theRC); - aModel->AddWithRefs(aSDR); - Handle(StepShape_DimensionalCharacteristicRepresentation) aDCR = new StepShape_DimensionalCharacteristicRepresentation(); - aDCR->Init(theDimension, aSDR); - aModel->AddWithRefs(aDCR); - - // Plus_Minus_Tolerance - if (theObject->IsDimWithPlusMinusTolerance()) { - Handle(TCollection_HAsciiString) aDummyName = new TCollection_HAsciiString(aMeasureName); - aDummyName = aDummyName->SubString(9, aDummyName->Length()); //delete "POSITIVE_" - aMeasureName = aDummyName->ToCString(); - Standard_Real aLowerTolValue = -theObject->GetLowerTolValue(), - anUpperTolValue = theObject->GetUpperTolValue(); - // Upper - Handle(StepBasic_MeasureWithUnit) anUpperMWU = new StepBasic_MeasureWithUnit(); - Handle(StepBasic_MeasureValueMember) anUpperValue = new StepBasic_MeasureValueMember(); - anUpperValue->SetName(aMeasureName); - anUpperValue->SetReal(anUpperTolValue); - anUpperMWU->Init(anUpperValue, aUnit); - aModel->AddWithRefs(anUpperMWU); - // Lower - Handle(StepBasic_MeasureWithUnit) aLowerMWU = new StepBasic_MeasureWithUnit(); - Handle(StepBasic_MeasureValueMember) aLowerValue = new StepBasic_MeasureValueMember(); - aLowerValue->SetName(aMeasureName); - aLowerValue->SetReal(aLowerTolValue); - aLowerMWU->Init(aLowerValue, aUnit); - aModel->AddWithRefs(aLowerMWU); - // Tolerance - Handle(StepShape_ToleranceValue) aTolValue = new StepShape_ToleranceValue(); - aTolValue->Init(aLowerMWU, anUpperMWU); - aModel->AddWithRefs(aTolValue); - StepShape_ToleranceMethodDefinition aMethod; - aMethod.SetValue(aTolValue); - Handle(StepShape_PlusMinusTolerance) aPlusMinusTol = new StepShape_PlusMinusTolerance(); - aPlusMinusTol->Init(aMethod, theDimension); - aModel->AddWithRefs(aPlusMinusTol); - } - // Tolerance class - if (theObject->IsDimWithClassOfTolerance()) { - Standard_Boolean isHole; - XCAFDimTolObjects_DimensionFormVariance aFormVariance; - XCAFDimTolObjects_DimensionGrade aGrade; - if (!theObject->GetClassOfTolerance(isHole, aFormVariance, aGrade)) - return; - Handle(StepShape_LimitsAndFits) aLAF = STEPCAFControl_GDTProperty::GetLimitsAndFits(isHole, aFormVariance, aGrade); - aModel->AddWithRefs(aLAF); - StepShape_ToleranceMethodDefinition aMethod; - aMethod.SetValue(aLAF); - Handle(StepShape_PlusMinusTolerance) aPlusMinusTol = new StepShape_PlusMinusTolerance(); - aPlusMinusTol->Init(aMethod, theDimension); - aModel->AddWithRefs(aPlusMinusTol); - } + return Standard_True; } //======================================================================= -//function : WriteDerivedGeometry -//purpose : auxiliary (write connection point for dimensions) -//====================================================================== -static void WriteDerivedGeometry (const Handle(XSControl_WorkSession) &WS, - const Handle(XCAFDimTolObjects_DimensionObject)& theObject, - const Handle(StepRepr_ConstructiveGeometryRepresentation) theRepr, - Handle(StepRepr_ShapeAspect)& theFirstSA, - Handle(StepRepr_ShapeAspect)& theSecondSA, - NCollection_Vector& thePnts) -{ - const Handle(Interface_InterfaceModel) &aModel = WS->Model(); - // First point - if (theObject->HasPoint()) { - GeomToStep_MakeCartesianPoint aPointMaker(theObject->GetPoint()); - Handle(StepGeom_CartesianPoint) aPoint = aPointMaker.Value(); - thePnts.Append(aPoint); - Handle(StepRepr_DerivedShapeAspect) aDSA = new StepRepr_DerivedShapeAspect(); - aDSA->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), theFirstSA->OfShape(), StepData_LFalse); - Handle(StepAP242_GeometricItemSpecificUsage) aGISU = new StepAP242_GeometricItemSpecificUsage(); - StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; - aDefinition.SetValue(aDSA); - Handle(StepRepr_HArray1OfRepresentationItem) anItem = new StepRepr_HArray1OfRepresentationItem(1, 1); - anItem->SetValue(1, aPoint); - aGISU->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aDefinition, theRepr, anItem); - Handle(StepRepr_ShapeAspectDerivingRelationship) aSADR = new StepRepr_ShapeAspectDerivingRelationship(); - aSADR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aDSA, theFirstSA); - theFirstSA = aDSA; - aModel->AddWithRefs(aGISU); - aModel->AddWithRefs(aSADR); - } - - // Second point (for locations) - if (theObject->HasPoint2()) { - GeomToStep_MakeCartesianPoint aPointMaker(theObject->GetPoint2()); - Handle(StepGeom_CartesianPoint) aPoint = aPointMaker.Value(); - thePnts.Append(aPoint); - Handle(StepRepr_DerivedShapeAspect) aDSA = new StepRepr_DerivedShapeAspect(); - aDSA->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), theFirstSA->OfShape(), StepData_LFalse); - Handle(StepAP242_GeometricItemSpecificUsage) aGISU = new StepAP242_GeometricItemSpecificUsage(); - StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; - aDefinition.SetValue(aDSA); - Handle(StepRepr_HArray1OfRepresentationItem) anItem = new StepRepr_HArray1OfRepresentationItem(1, 1); - anItem->SetValue(1, aPoint); - aGISU->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aDefinition, theRepr, anItem); - Handle(StepRepr_ShapeAspectDerivingRelationship) aSADR = new StepRepr_ShapeAspectDerivingRelationship(); - aSADR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aDSA, theSecondSA); - theSecondSA = aDSA; - aModel->AddWithRefs(aGISU); - aModel->AddWithRefs(aSADR); - } -} - +//function : WriteDGTsAP242 +//purpose : //======================================================================= -//function : WriteDatumSystem -//purpose : auxiliary (write Write datum system for given -// geometric_tolerance) -//====================================================================== -static Handle(StepDimTol_HArray1OfDatumSystemOrReference) WriteDatumSystem(const Handle(XSControl_WorkSession) &WS, - const TDF_Label theGeomTolL, - const TDF_LabelSequence theDatumSeq, - const STEPConstruct_DataMapOfAsciiStringTransient theDatumMap, - const Handle(StepRepr_RepresentationContext)& theRC) + +Standard_Boolean STEPCAFControl_Writer::WriteDGTsAP242 (const Handle(XSControl_WorkSession) &WS, + const TDF_LabelSequence &labels ) { // Get working data - const Handle(Interface_InterfaceModel) &Model = WS->Model(); + const Handle(Interface_InterfaceModel) &aModel = WS->Model(); + const Handle(Interface_HGraph) aHGraph = WS->HGraph(); - if (aHGraph.IsNull()) - return NULL; + if(aHGraph.IsNull()) + return Standard_False; + Interface_Graph aGraph = aHGraph->Graph(); - Handle(XCAFDoc_GeomTolerance) aGTAttr; - if (!theGeomTolL.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGTAttr)) - return NULL; - Handle(XCAFDimTolObjects_GeomToleranceObject) anObject = aGTAttr->GetObject(); - if (anObject.IsNull()) - return NULL; + Handle(XCAFDoc_DimTolTool) DGTTool = XCAFDoc_DocumentTool::DimTolTool(labels(1)); + if(DGTTool.IsNull()) + return Standard_False; - // Unit - StepBasic_Unit aUnit = GetUnit(theRC); + // Common entities for presentation + STEPConstruct_Styles aStyles (WS); + Handle(StepVisual_Colour) aCurvColor = aStyles.EncodeColor(Quantity_NOC_WHITE); + Handle(StepRepr_RepresentationItem) anItem = NULL; + myGDTPrsCurveStyle->SetValue(1, aStyles.MakeColorPSA(anItem, aCurvColor, aCurvColor, aCurvColor, 0.0)); + Interface_EntityIterator aModelIter = aModel->Entities(); + for (; aModelIter.More() && myGDTCommonPDS.IsNull(); aModelIter.Next()) + myGDTCommonPDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(aModelIter.Value()); + + TDF_LabelSequence aDGTLabels; + STEPConstruct_DataMapOfAsciiStringTransient aDatumMap; + Handle(StepRepr_RepresentationContext) aRC; - XCAFDimTolObjects_DatumObjectSequence aDatums; - Standard_Integer aMaxDatumNum = 0; - for (Standard_Integer i = 1; i <= theDatumSeq.Length(); i++) { + //------------- // + // write Datums // + //--------------// + DGTTool->GetDatumLabels(aDGTLabels); + // Find all shapes with datums + TColStd_MapOfAsciiString aNameIdMap; + for(Standard_Integer i = 1; i <= aDGTLabels.Length(); i++) { + TDF_Label aDatumL = aDGTLabels.Value(i); + TDF_LabelSequence aShapeL, aNullSeq; + DGTTool->GetRefShapeLabel(aDatumL, aShapeL, aNullSeq); Handle(XCAFDoc_Datum) aDatumAttr; - if (!theDatumSeq.Value(i).FindAttribute(XCAFDoc_Datum::GetID(), aDatumAttr)) - continue; - Handle(XCAFDimTolObjects_DatumObject) aDatumObj = aDatumAttr->GetObject(); - if (aDatumObj.IsNull()) + aDatumL.FindAttribute(XCAFDoc_Datum::GetID(), aDatumAttr); + Handle(XCAFDimTolObjects_DatumObject) anObject = aDatumAttr->GetObject(); + TCollection_AsciiString aDatumName = anObject->GetName()->String(); + TCollection_AsciiString aDatumTargetId = TCollection_AsciiString(anObject->GetDatumTargetNumber()); + if (!aNameIdMap.Add(aDatumName.Cat(aDatumTargetId))) continue; - aDatums.Append(aDatumObj); - aMaxDatumNum = Max(aMaxDatumNum, aDatumObj->GetPosition()); + Handle(Standard_Transient) aWrittenDatum; + Standard_Boolean isFirstDT = !aDatumMap.Find(aDatumName, aWrittenDatum); + Handle(StepDimTol_Datum) aDatum = WriteDatumAP242(WS, aShapeL, aDatumL, isFirstDT, + Handle(StepDimTol_Datum)::DownCast (aWrittenDatum)); + // Add created Datum into Map + aDatumMap.Bind(aDatumName, aDatum); } - if (aMaxDatumNum == 0) - return NULL; - Handle(StepDimTol_HArray1OfDatumReferenceCompartment) aConstituents = - new StepDimTol_HArray1OfDatumReferenceCompartment(1, aMaxDatumNum); - // Auxiliary datum to initialize attributes in Datum_System - Handle(StepDimTol_Datum) aFirstDatum; - Standard_Integer aConstituentsNum = 0; - for (Standard_Integer i = 1; i <= aMaxDatumNum; i++) { - // Collect datums with i-th position - XCAFDimTolObjects_DatumObjectSequence aDatumSeqPos; - for (Standard_Integer j = 1; j <= aDatums.Length(); j++) - if (aDatums.Value(j)->GetPosition() == i) - aDatumSeqPos.Append(aDatums.Value(j)); - if (aDatumSeqPos.Length() < 1) + //----------------- // + // write Dimensions // + //------------------// + aDGTLabels.Clear(); + DGTTool->GetDimensionLabels(aDGTLabels); + // Auxiliary entities for derived geometry + Handle(StepRepr_ConstructiveGeometryRepresentation) aCGRepr = + new StepRepr_ConstructiveGeometryRepresentation(); + Handle(StepRepr_ConstructiveGeometryRepresentationRelationship) aCGReprRel = + new StepRepr_ConstructiveGeometryRepresentationRelationship(); + NCollection_Vector aConnectionPnts; + Handle(StepRepr_RepresentationContext) dummyRC; + Handle(StepAP242_GeometricItemSpecificUsage) dummyGISU; + for (Standard_Integer i = 1; i <= aDGTLabels.Length(); i++) { + TDF_Label aDimensionL = aDGTLabels.Value(i); + TDF_LabelSequence aFirstShapeL, aSecondShapeL; + Handle(XCAFDoc_Dimension) aDimAttr; + if (!aDimensionL.FindAttribute(XCAFDoc_Dimension::GetID(),aDimAttr)) + continue; + Handle(XCAFDimTolObjects_DimensionObject) anObject = aDimAttr->GetObject(); + if (anObject.IsNull()) continue; + if (anObject->GetType() == XCAFDimTolObjects_DimensionType_CommonLabel) + { + Handle(StepRepr_ShapeAspect) aSA = new StepRepr_ShapeAspect(); + aSA->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), myGDTCommonPDS, StepData_LTrue); + aModel->AddWithRefs(aSA); + WritePresentation(WS, anObject->GetPresentation(), anObject->GetPresentationName(), anObject->HasPlane(), + Standard_False, anObject->GetPlane(), anObject->GetPointTextAttach(), aSA); + } - aConstituentsNum++; - // Initialize Datum_Reference_Compartment - StepDimTol_DatumOrCommonDatum aDatumRef; - Handle(StepDimTol_DatumReferenceCompartment) aCompartment = - new StepDimTol_DatumReferenceCompartment(); - Handle(StepDimTol_HArray1OfDatumReferenceModifier) aModifiers; - if (aDatumSeqPos.Length() == 1) { - // Datum entity - Handle(Standard_Transient) aFDValue; - if (theDatumMap.Find(aDatumSeqPos.Value(1)->GetName()->String(), aFDValue) && !aFDValue.IsNull()) - aFirstDatum = Handle(StepDimTol_Datum)::DownCast (aFDValue); - aDatumRef.SetValue(aFirstDatum); - // Modifiers - XCAFDimTolObjects_DatumModifiersSequence aSimpleModifiers = aDatumSeqPos.Value(1)->GetModifiers(); - XCAFDimTolObjects_DatumModifWithValue aModifWithVal; - Standard_Real aValue = 0; - aDatumSeqPos.Value(1)->GetModifierWithValue(aModifWithVal, aValue); - aModifiers = STEPCAFControl_GDTProperty::GetDatumRefModifiers(aSimpleModifiers, aModifWithVal, aValue, aUnit); - // Add Datum_Reference_Modifier_With_Value - if (!aModifiers.IsNull()) { - Handle(StepDimTol_DatumReferenceModifierWithValue) aDRMWV = - aModifiers->Value(aModifiers->Length()).DatumReferenceModifierWithValue(); - if (!aDRMWV.IsNull()) { - Model->AddWithRefs(aDRMWV); + if (!DGTTool->GetRefShapeLabel(aDimensionL, aFirstShapeL, aSecondShapeL)) + continue; + + // Write links with shapes + Handle(StepRepr_ShapeAspect) aFirstSA, aSecondSA; + if (aFirstShapeL.Length() == 1) { + TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(aFirstShapeL.Value(1)); + aFirstSA = WriteShapeAspect(WS, aDimensionL, aShape, dummyRC, dummyGISU); + if (aRC.IsNull() && !dummyRC.IsNull()) + aRC = dummyRC; + } + else if (aFirstShapeL.Length() > 1) { + Handle(StepRepr_CompositeShapeAspect) aCSA; + for (Standard_Integer shIt = 1; shIt <= aFirstShapeL.Length(); shIt++) { + TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(aFirstShapeL.Value(shIt)); + Handle(StepRepr_ShapeAspect) aSA = WriteShapeAspect(WS, aDimensionL, aShape, dummyRC, dummyGISU); + if (aSA.IsNull()) + continue; + if (aCSA.IsNull()) { + aCSA = new StepRepr_CompositeShapeAspect(); + aCSA->Init(aSA->Name(), aSA->Description(), aSA->OfShape(), aSA->ProductDefinitional()); + aModel->AddWithRefs(aCSA); } + Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); + aSAR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aCSA, aSA); + aModel->AddWithRefs(aSAR); + if (aRC.IsNull() && !dummyRC.IsNull()) + aRC = dummyRC; } + aFirstSA = aCSA; } - else { - Handle(StepDimTol_HArray1OfDatumReferenceElement) aCommonDatumList = new StepDimTol_HArray1OfDatumReferenceElement(1, aDatumSeqPos.Length()); - for (Standard_Integer j = 1; j <= aDatumSeqPos.Length(); j++) { - // Datum entity - Handle(StepDimTol_Datum) aDatum; - Handle(Standard_Transient) aDValue; - if (theDatumMap.Find(aDatumSeqPos.Value(j)->GetName()->String(), aDValue)) - aDatum = Handle(StepDimTol_Datum)::DownCast (aDValue); - StepDimTol_DatumOrCommonDatum anElemDatumRef; - anElemDatumRef.SetValue(aDatum); - if (aFirstDatum.IsNull()) - aFirstDatum = aDatum; - // Modifiers - XCAFDimTolObjects_DatumModifiersSequence aSimpleModifiers = aDatumSeqPos.Value(j)->GetModifiers(); - XCAFDimTolObjects_DatumModifWithValue aModifWithVal; - Standard_Real aValue = 0; - aDatumSeqPos.Value(j)->GetModifierWithValue(aModifWithVal, aValue); - Handle(StepDimTol_HArray1OfDatumReferenceModifier) anElemModifiers = - STEPCAFControl_GDTProperty::GetDatumRefModifiers(aSimpleModifiers, aModifWithVal, aValue, aUnit); - // Add Datum_Reference_Modifier_With_Value - if (!anElemModifiers.IsNull()) { - Handle(StepDimTol_DatumReferenceModifierWithValue) aDRMWV = - anElemModifiers->Value(anElemModifiers->Length()).DatumReferenceModifierWithValue(); - if (!aDRMWV.IsNull()) { - Model->AddWithRefs(aDRMWV); - } + if (aSecondShapeL.Length() == 1) { + TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(aSecondShapeL.Value(1)); + aSecondSA = WriteShapeAspect(WS, aDimensionL, aShape, dummyRC, dummyGISU); + if (aRC.IsNull() && !dummyRC.IsNull()) + aRC = dummyRC; + } + else if (aSecondShapeL.Length() > 1) { + Handle(StepRepr_CompositeShapeAspect) aCSA; + for (Standard_Integer shIt = 1; shIt <= aSecondShapeL.Length(); shIt++) { + TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(aSecondShapeL.Value(shIt)); + Handle(StepRepr_ShapeAspect) aSA = WriteShapeAspect(WS, aDimensionL, aShape, dummyRC, dummyGISU); + if (aCSA.IsNull() && !aSA.IsNull()) + { + aCSA = new StepRepr_CompositeShapeAspect(); } - // Datum_Reference_Element - Handle(StepDimTol_DatumReferenceElement) anElement = new StepDimTol_DatumReferenceElement(); - anElement->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aDatum->OfShape(), - aDatum->ProductDefinitional(), anElemDatumRef, !anElemModifiers.IsNull(), anElemModifiers); - Model->AddWithRefs(anElement); - aCommonDatumList->SetValue(j, anElement); + aCSA->Init(aSA->Name(), aSA->Description(), aSA->OfShape(), aSA->ProductDefinitional()); + if (!aSA.IsNull()) { + Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); + aSAR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aCSA, aSA); + aModel->AddWithRefs(aSAR); + } + if (aRC.IsNull() && !dummyRC.IsNull()) + aRC = dummyRC; } - aDatumRef.SetValue(aCommonDatumList); + aSecondSA = aCSA; } - aCompartment->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aFirstDatum->OfShape(), - aFirstDatum->ProductDefinitional(), aDatumRef, !aModifiers.IsNull(), aModifiers); - Model->AddWithRefs(aCompartment); - aConstituents->SetValue(aConstituentsNum, aCompartment); - } - // Remove null elements from aConstituents - Standard_Integer aNbConstituents = 0; - for (Standard_Integer i = 1; i <= aConstituents->Length(); i++) - if (!aConstituents->Value(i).IsNull()) - aNbConstituents++; - Handle(StepDimTol_HArray1OfDatumReferenceCompartment) aResConstituents = - new StepDimTol_HArray1OfDatumReferenceCompartment(1, aNbConstituents); - Standard_Integer aConstituentsIt = 0; - for (Standard_Integer i = 1; i <= aConstituents->Length(); i++) - if (!aConstituents->Value(i).IsNull()) { - aConstituentsIt++; - aResConstituents->SetValue(aConstituentsIt, aConstituents->Value(i)); + + if (anObject->GetType() == XCAFDimTolObjects_DimensionType_DimensionPresentation) + { + WritePresentation(WS, anObject->GetPresentation(), anObject->GetPresentationName(), anObject->HasPlane(), + Standard_False, anObject->GetPlane(), anObject->GetPointTextAttach(), aFirstSA); + continue; + } + + // Write dimensions + StepShape_DimensionalCharacteristic aDimension; + if (anObject->HasPoint() || anObject->HasPoint2()) + WriteDerivedGeometry(WS, anObject, aCGRepr, aFirstSA, aSecondSA, aConnectionPnts); + XCAFDimTolObjects_DimensionType aDimType = anObject->GetType(); + if (STEPCAFControl_GDTProperty::IsDimensionalLocation(aDimType)) { + // Dimensional_Location + Handle(StepShape_DimensionalLocation) aDim = new StepShape_DimensionalLocation(); + aDim->Init(STEPCAFControl_GDTProperty::GetDimTypeName(aDimType), Standard_False, NULL, aFirstSA, aSecondSA); + aDimension.SetValue(aDim); + } + else if (aDimType == XCAFDimTolObjects_DimensionType_Location_Angular) { + // Angular_Location + Handle(StepShape_AngularLocation) aDim = new StepShape_AngularLocation(); + StepShape_AngleRelator aRelator = StepShape_Equal; + if (anObject->HasQualifier()) { + XCAFDimTolObjects_DimensionQualifier aQualifier = anObject->GetQualifier(); + switch (aQualifier) { + case XCAFDimTolObjects_DimensionQualifier_Min: aRelator = StepShape_Small; + break; + case XCAFDimTolObjects_DimensionQualifier_Max: aRelator = StepShape_Large; + break; + default: aRelator = StepShape_Equal; + } + } + aDim->Init(new TCollection_HAsciiString(), Standard_False, NULL, aFirstSA, aSecondSA, aRelator); + aDimension.SetValue(aDim); + } + else if (aDimType == XCAFDimTolObjects_DimensionType_Location_WithPath) { + // Dimensional_Location_With_Path + Handle(StepShape_DimensionalLocationWithPath) aDim = new StepShape_DimensionalLocationWithPath(); + Handle(StepRepr_ShapeAspect) aPathSA = WriteShapeAspect(WS, aDimensionL, anObject->GetPath(), dummyRC, dummyGISU); + aDim->Init(new TCollection_HAsciiString(), Standard_False, NULL, aFirstSA, aSecondSA, aPathSA); + aDimension.SetValue(aDim); + } + else if (STEPCAFControl_GDTProperty::IsDimensionalSize(aDimType)) { + // Dimensional_Size + Handle(StepShape_DimensionalSize) aDim = new StepShape_DimensionalSize(); + aDim->Init(aFirstSA, STEPCAFControl_GDTProperty::GetDimTypeName(aDimType)); + aDimension.SetValue(aDim); + } + else if (aDimType == XCAFDimTolObjects_DimensionType_Size_Angular) { + // Angular_Size + Handle(StepShape_AngularSize) aDim = new StepShape_AngularSize(); + StepShape_AngleRelator aRelator = StepShape_Equal; + if (anObject->HasQualifier()) { + XCAFDimTolObjects_DimensionQualifier aQualifier = anObject->GetQualifier(); + switch (aQualifier) { + case XCAFDimTolObjects_DimensionQualifier_Min: aRelator = StepShape_Small; + break; + case XCAFDimTolObjects_DimensionQualifier_Max: aRelator = StepShape_Large; + break; + default: aRelator = StepShape_Equal; + } + } + aDim->Init(aFirstSA, new TCollection_HAsciiString(), aRelator); + aDimension.SetValue(aDim); + } + else if (aDimType == XCAFDimTolObjects_DimensionType_Size_WithPath) { + // Dimensional_Size_With_Path + Handle(StepShape_DimensionalSizeWithPath) aDim = new StepShape_DimensionalSizeWithPath(); + Handle(StepRepr_ShapeAspect) aPathSA = WriteShapeAspect(WS, aDimensionL, anObject->GetPath(), dummyRC, dummyGISU); + aDim->Init(aFirstSA, new TCollection_HAsciiString(), aPathSA); + aDimension.SetValue(aDim); } - Handle(StepDimTol_HArray1OfDatumSystemOrReference) aDatumSystem; - Handle(StepDimTol_DatumSystem) aDS = new StepDimTol_DatumSystem(); - aDS->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aFirstDatum->OfShape(), - aFirstDatum->ProductDefinitional(), aResConstituents); - Model->AddWithRefs(aDS); - StepDimTol_DatumSystemOrReference anArrayValue; - anArrayValue.SetValue(aDS); - aDatumSystem = new StepDimTol_HArray1OfDatumSystemOrReference(1, 1); - aDatumSystem->SetValue(1, anArrayValue); + // Write values + WriteDimValues(WS, anObject, aRC, aDimension); + //Annotation plane and Presentation + WritePresentation(WS, anObject->GetPresentation(), anObject->GetPresentationName(), Standard_True, anObject->HasPlane(), + anObject->GetPlane(), anObject->GetPointTextAttach(), aDimension.Value()); + } + // Write Derived geometry + if (aConnectionPnts.Length() > 0) { + Handle(StepRepr_HArray1OfRepresentationItem) anItems = new StepRepr_HArray1OfRepresentationItem(1, aConnectionPnts.Length()); + for (Standard_Integer i = 0; i < aConnectionPnts.Length(); i++) + anItems->SetValue(i + 1, aConnectionPnts(i)); + aCGRepr->Init(new TCollection_HAsciiString(), anItems, dummyRC); + aCGReprRel->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), dummyGISU->UsedRepresentation(), aCGRepr); + aModel->AddWithRefs(aCGReprRel); + } - // Axis - if (anObject->HasAxis()) { - GeomToStep_MakeAxis2Placement3d anAxisMaker(anObject->GetAxis()); - Handle(StepGeom_Axis2Placement3d) anAxis = anAxisMaker.Value(); - anAxis->SetName(new TCollection_HAsciiString("orientation")); - Handle(StepAP242_GeometricItemSpecificUsage) aGISU = new StepAP242_GeometricItemSpecificUsage(); - StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition; - aDefinition.SetValue(aDS); - Handle(StepRepr_HArray1OfRepresentationItem) anReprItems = new StepRepr_HArray1OfRepresentationItem(1, 1); - Handle(StepRepr_RepresentationItem) anIdentifiedItem = anAxis; - anReprItems->SetValue(1, anIdentifiedItem); - Interface_EntityIterator subs = aGraph.Sharings(aFirstDatum->OfShape()); - Handle(StepShape_ShapeDefinitionRepresentation) aSDR; - for (subs.Start(); subs.More() && aSDR.IsNull(); subs.Next()) { - Handle(Standard_Transient) anEntity = subs.Value(); - aSDR = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(anEntity); - } - if (aSDR.IsNull()) - return aDatumSystem; - - aGISU->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), - aDefinition, aSDR->UsedRepresentation(), anReprItems); - Model->AddWithRefs(anAxis); - Model->AddWithRefs(aGISU); + //----------------------------// + // write Geometric Tolerances // + //----------------------------// + aDGTLabels.Clear(); + DGTTool->GetGeomToleranceLabels(aDGTLabels); + for (Standard_Integer i = 1; i <= aDGTLabels.Length(); i++) { + TDF_Label aGeomTolL = aDGTLabels.Value(i); + TDF_LabelSequence aFirstShapeL, aNullSeqL; + if (!DGTTool->GetRefShapeLabel(aGeomTolL, aFirstShapeL, aNullSeqL)) + continue; + TDF_LabelSequence aDatumSeq; + DGTTool->GetDatumWithObjectOfTolerLabels(aGeomTolL, aDatumSeq); + Handle(StepDimTol_HArray1OfDatumSystemOrReference) aDatumSystem; + if (aDatumSeq.Length() > 0) + aDatumSystem = WriteDatumSystem(WS, aGeomTolL, aDatumSeq, aDatumMap, aRC); + WriteGeomTolerance(WS, aFirstShapeL, aGeomTolL, aDatumSystem, aRC); } - return aDatumSystem; + // Write Draughting model for Annotation Planes + if (myGDTAnnotations.Length() == 0) + return Standard_True; + + Handle(StepRepr_HArray1OfRepresentationItem) aItems = + new StepRepr_HArray1OfRepresentationItem(1, myGDTAnnotations.Length()); + for (Standard_Integer i = 1; i <= aItems->Length(); i++) { + aItems->SetValue(i, myGDTAnnotations.Value(i - 1)); + } + myGDTPresentationDM->Init(new TCollection_HAsciiString(), aItems, aRC); + aModel->AddWithRefs(myGDTPresentationDM); + + return Standard_True; } //======================================================================= -//function : WriteToleranceZone -//purpose : auxiliary (write tolerace zones) +//function : createKinematicLink +//purpose : auxilary //======================================================================= -void STEPCAFControl_Writer::WriteToleranceZone (const Handle(XSControl_WorkSession) &WS, - const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObject, - const Handle(StepDimTol_GeometricTolerance)& theEntity, - const Handle(StepRepr_RepresentationContext)& theRC) +static Standard_Boolean createKinematicLink(const Handle(XSControl_WorkSession)& theWS, + const Handle(XCAFDoc_KinematicTool)& theKTool, + const TDF_Label& theLabelOfLink, + NCollection_IndexedDataMap& theMapOfLinks, + Handle(StepKinematics_KinematicLinkRepresentation)& theLinkRepr, + Handle(TColStd_HSequenceOfTransient)& theSeqOfContexLink, + Handle(StepKinematics_RigidLinkRepresentation)& theBaseLink, + Handle(StepRepr_PropertyDefinition)& theGeneralPD) { - // Get working data - const Handle(Interface_InterfaceModel) &Model = WS->Model(); - if (theEntity.IsNull() || theObject.IsNull()) - return; - - // Return if there is no tolerance zones - if (theObject->GetTypeOfValue() == XCAFDimTolObjects_GeomToleranceTypeValue_None && - theObject->GetZoneModifier() != XCAFDimTolObjects_GeomToleranceZoneModif_Runout) - return; - - // Create Tolerance_Zone - Handle(StepDimTol_ToleranceZoneForm) aForm = new StepDimTol_ToleranceZoneForm(); - Model->AddWithRefs(aForm); - aForm->Init(STEPCAFControl_GDTProperty::GetTolValueType(theObject->GetTypeOfValue())); - Handle(StepDimTol_HArray1OfToleranceZoneTarget) aZoneTargetArray = new StepDimTol_HArray1OfToleranceZoneTarget(1, 1); - StepDimTol_ToleranceZoneTarget aTarget; - aTarget.SetValue(theEntity); - aZoneTargetArray->SetValue(1, aTarget); - Handle(StepDimTol_ToleranceZone) aZone = new StepDimTol_ToleranceZone(); - aZone->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), - theEntity->TolerancedShapeAspect().ShapeAspect()->OfShape(), StepData_LFalse, - aZoneTargetArray, aForm); - Model->AddWithRefs(aZone); - // Runout_Tolerance_Zone - Handle(StepBasic_PlaneAngleMeasureWithUnit) aPAMWU = new StepBasic_PlaneAngleMeasureWithUnit(); - Handle(StepBasic_MeasureValueMember) aValueMember = new StepBasic_MeasureValueMember(); - aValueMember->SetName("PLANE_ANGLE_MEASURE"); - aValueMember->SetReal(theObject->GetValueOfZoneModifier()); - aPAMWU->Init(aValueMember, GetUnit(theRC, Standard_True)); - Handle(StepDimTol_RunoutZoneOrientation) anOrientation = new StepDimTol_RunoutZoneOrientation(); - anOrientation->Init(aPAMWU); - Handle(StepDimTol_RunoutZoneDefinition) aDefinition = new StepDimTol_RunoutZoneDefinition(); - aDefinition->Init(aZone, NULL, anOrientation); - Model->AddWithRefs(aDefinition); - Model->AddWithRefs(anOrientation); - Model->AddWithRefs(aPAMWU); -} + if (theMapOfLinks.FindFromKey(theLabelOfLink, theLinkRepr)) + return Standard_True; -//======================================================================= -//function : WriteGeomTolerance -//purpose : auxiliary (write Geometric_Tolerance entity for given shapes, -// label and datum system) -//====================================================================== -void STEPCAFControl_Writer::WriteGeomTolerance (const Handle(XSControl_WorkSession) &WS, - const TDF_LabelSequence theShapeSeqL, - const TDF_Label theGeomTolL, - const Handle(StepDimTol_HArray1OfDatumSystemOrReference)& theDatumSystem, - const Handle(StepRepr_RepresentationContext)& theRC) -{ - // Get working data - const Handle(Interface_InterfaceModel) &Model = WS->Model(); - Handle(XCAFDoc_GeomTolerance) aGTAttr; - if (!theGeomTolL.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGTAttr)) - return; - Handle(XCAFDimTolObjects_GeomToleranceObject) anObject = aGTAttr->GetObject(); - if (anObject.IsNull()) - return; + const Handle(XSControl_TransferWriter)& TW = theWS->TransferWriter(); + const Handle(Transfer_FinderProcess)& FP = TW->FinderProcess(); + Interface_Graph aGraph = theWS->HGraph()->Graph(); - // Value - Handle(StepBasic_LengthMeasureWithUnit) aLMWU = new StepBasic_LengthMeasureWithUnit(); - StepBasic_Unit aUnit = GetUnit(theRC); - Handle(StepBasic_MeasureValueMember) aValueMember = new StepBasic_MeasureValueMember(); - aValueMember->SetName("LENGTH_MEASURE"); - aValueMember->SetReal(anObject->GetValue()); - aLMWU->Init(aValueMember, aUnit); - Model->AddWithRefs(aLMWU); + Handle(StepKinematics_KinematicLink) aLink = new StepKinematics_KinematicLink; + Handle(TDataStd_Name) aNameLink; + Handle(TCollection_HAsciiString) aHNameLink; + if (theLabelOfLink.FindAttribute(TDataStd_Name::GetID(), aNameLink)) + aHNameLink = new TCollection_HAsciiString(aNameLink->Get()); + else + aHNameLink = new TCollection_HAsciiString(""); + aLink->Init(aHNameLink); - // Geometric_Tolerance target - Handle(StepRepr_ShapeAspect) aMainSA; - Handle(StepRepr_RepresentationContext) dummyRC; - Handle(StepAP242_GeometricItemSpecificUsage) dummyGISU; - if (theShapeSeqL.Length() == 1) { - TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(theShapeSeqL.Value(1)); - aMainSA = WriteShapeAspect(WS, theGeomTolL, aShape, dummyRC, dummyGISU); - Model->AddWithRefs(aMainSA); - } - else { - Handle(StepRepr_CompositeShapeAspect) aCSA; - for (Standard_Integer i = 1; i <= theShapeSeqL.Length(); i++) { - TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(theShapeSeqL.Value(i)); - Handle(StepRepr_ShapeAspect) aSA = WriteShapeAspect(WS, theGeomTolL, aShape, dummyRC, dummyGISU); - if (aSA.IsNull()) - continue; - if (aCSA.IsNull()) { - aCSA = new StepRepr_CompositeShapeAspect(); - aCSA->Init(aSA->Name(), aSA->Description(), aSA->OfShape(), aSA->ProductDefinitional()); - Model->AddWithRefs(aCSA); - } - Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); - aSAR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aCSA, aSA); - Model->AddWithRefs(aSAR); - } - aMainSA = aCSA; + // Choose type of the representation link + Standard_Boolean isLinear = Standard_True; + TDF_LabelSequence aJoints = theKTool->GetJointsOfLink(theLabelOfLink, Standard_True, Standard_False); + if (aJoints.IsEmpty()) + isLinear = Standard_False; + for (TDF_LabelSequence::Iterator anItJoint(aJoints); anItJoint.More() && isLinear; anItJoint.Next()) + { + Handle(XCAFDoc_KinematicPair) aKPairAttr; + if (!anItJoint.Value().FindAttribute(XCAFDoc_KinematicPair::GetID(), aKPairAttr)) + continue; + Handle(XCAFKinematics_PairObject) aPairObject = aKPairAttr->GetObject(); + if (aPairObject->Type() == XCAFKinematics_PairType_NoType) + continue; + if (aPairObject->Type() != XCAFKinematics_PairType_LinearFlexibleAndPinion && + aPairObject->Type() != XCAFKinematics_PairType_LinearFlexibleAndPlanarCurve) + isLinear = Standard_False; } - StepDimTol_GeometricToleranceTarget aGTTarget; - aGTTarget.SetValue(aMainSA); + aJoints = theKTool->GetJointsOfLink(theLabelOfLink, Standard_False, Standard_True); + if (!aJoints.IsEmpty()) + isLinear = Standard_False; - Standard_Boolean isWithModif = Standard_False, - isWithDatRef = Standard_False, - isWithMaxTol = Standard_False; - // Modifiers - // Simple modifiers - XCAFDimTolObjects_GeomToleranceModifiersSequence aModifiers = anObject->GetModifiers(); - Handle(StepDimTol_HArray1OfGeometricToleranceModifier) aModifArray; - Handle(StepBasic_LengthMeasureWithUnit) aMaxLMWU; - Standard_Integer aModifNb = aModifiers.Length(); - if (anObject->GetMaterialRequirementModifier() != XCAFDimTolObjects_GeomToleranceMatReqModif_None) - aModifNb++; - for (Standard_Integer i = 1; i <= aModifiers.Length(); i++) - if (aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Around || - aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Over) - aModifNb--; - if (aModifNb > 0) { - isWithModif = Standard_True; - aModifArray = new StepDimTol_HArray1OfGeometricToleranceModifier(1, aModifNb); - Standard_Integer k = 1; - for (Standard_Integer i = 1; i <= aModifiers.Length(); i++) { - if (aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Around || - aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Over) - continue; - StepDimTol_GeometricToleranceModifier aModif = - STEPCAFControl_GDTProperty::GetGeomToleranceModifier(aModifiers.Value(i)); - aModifArray->SetValue(k, aModif); - k++; - } - if (anObject->GetMaterialRequirementModifier() == XCAFDimTolObjects_GeomToleranceMatReqModif_L) { - aModifArray->SetValue(aModifNb, StepDimTol_GTMLeastMaterialRequirement); + Handle(TCollection_HAsciiString) aNameOfLinkRepr = new TCollection_HAsciiString(""); + // Create empty collection for updating during creating a referenced pairs + Handle(StepRepr_HArray1OfRepresentationItem) aPlacementsOfPairs = new StepRepr_HArray1OfRepresentationItem(); + + TDF_LabelSequence aShapesL = theKTool->GetRefShapes(theLabelOfLink); + if (aShapesL.IsEmpty()) + return Standard_False; + + // Find ref shapes + for (TDF_LabelSequence::Iterator anItShapes(aShapesL); anItShapes.More(); anItShapes.Next()) { + TopoDS_Shape aTopoShape = XCAFDoc_ShapeTool::GetShape(anItShapes.Value()); + TopLoc_Location aLoc; + TColStd_SequenceOfTransient seqRI; + FindEntities(FP, aTopoShape, aLoc, seqRI); + if (seqRI.Length() <= 0) { + FP->Messenger()->SendInfo() << "Warning: Cannot find RI for " << aTopoShape.TShape()->DynamicType()->Name() << std::endl; + continue; } - else if (anObject->GetMaterialRequirementModifier() == XCAFDimTolObjects_GeomToleranceMatReqModif_M) { - aModifArray->SetValue(aModifNb, StepDimTol_GTMMaximumMaterialRequirement); + + // Get PDS of Shape + Handle(StepShape_ShapeRepresentation) aShapeRepr; + Handle(StepRepr_PropertyDefinition) aPD; + Handle(StepRepr_RepresentationContext) aRC; + aPD = FindPDS(aGraph, seqRI.Value(1), aRC); + if (aPD.IsNull()) + continue; + Interface_EntityIterator aSRIt = aGraph.Sharings(aRC); + for (aSRIt.Start(); aSRIt.More() && aShapeRepr.IsNull(); aSRIt.Next()) + aShapeRepr = Handle(StepShape_ShapeRepresentation)::DownCast(aSRIt.Value()); + if (aShapeRepr.IsNull()) + continue; + + if (theLinkRepr.IsNull()) + { + if (isLinear) + theLinkRepr = new StepKinematics_LinearFlexibleLinkRepresentation; + else + theLinkRepr = new StepKinematics_RigidLinkRepresentation; + theLinkRepr->Init(aNameOfLinkRepr, aPlacementsOfPairs, aRC, aLink); } - // Modifier with value - if (anObject->GetMaxValueModifier() != 0) { - isWithMaxTol = Standard_True; - aMaxLMWU = new StepBasic_LengthMeasureWithUnit(); - Handle(StepBasic_MeasureValueMember) aModifierValueMember = new StepBasic_MeasureValueMember(); - aModifierValueMember->SetName("LENGTH_MEASURE"); - aModifierValueMember->SetReal(anObject->GetMaxValueModifier()); - aMaxLMWU->Init(aModifierValueMember, aUnit); - Model->AddWithRefs(aMaxLMWU); + + Handle(TDataStd_Integer) aBase; + if (theBaseLink.IsNull() || theLabelOfLink.FindAttribute(TDataStd_Integer::GetID(), aBase)) { + theGeneralPD = aPD; + theBaseLink = Handle(StepKinematics_RigidLinkRepresentation)::DownCast(theLinkRepr); } + + Handle(StepKinematics_KinematicLinkRepresentationAssociation) aLinkRepresentationAssociation = new StepKinematics_KinematicLinkRepresentationAssociation; + aLinkRepresentationAssociation->Init(aNameOfLinkRepr, aNameOfLinkRepr, theLinkRepr, aShapeRepr); + Handle(StepKinematics_ContextDependentKinematicLinkRepresentation) aCDKLRS = new StepKinematics_ContextDependentKinematicLinkRepresentation; + Handle(StepKinematics_ProductDefinitionRelationshipKinematics) aPDRK = new StepKinematics_ProductDefinitionRelationshipKinematics; + aPDRK->Init(aNameOfLinkRepr, Standard_False, aLinkRepresentationAssociation->Description(), aPD->Definition()); + aCDKLRS->Init(aLinkRepresentationAssociation, aPDRK); + theSeqOfContexLink->Append(aCDKLRS); } - // Datum Reference - isWithDatRef = !theDatumSystem.IsNull(); + if (theLinkRepr.IsNull()) + return Standard_False; - // Collect all attributes - Handle(TCollection_HAsciiString) aName = new TCollection_HAsciiString(), - aDescription = new TCollection_HAsciiString(); - Handle(StepDimTol_GeometricToleranceWithDatumReference) aGTWDR = - new StepDimTol_GeometricToleranceWithDatumReference(); - aGTWDR->SetDatumSystem(theDatumSystem); - Handle(StepDimTol_GeometricToleranceWithModifiers) aGTWM = - new StepDimTol_GeometricToleranceWithModifiers(); - aGTWM->SetModifiers(aModifArray); - StepDimTol_GeometricToleranceType aType = - STEPCAFControl_GDTProperty::GetGeomToleranceType(anObject->GetType()); + theMapOfLinks.Add(theLabelOfLink, theLinkRepr); + return Standard_True; +} - // Init and write necessary subtype of Geometric_Tolerance entity - Handle(StepDimTol_GeometricTolerance) aGeomTol; - if (isWithModif) { - if (isWithMaxTol) { - if (isWithDatRef) { - // Geometric_Tolerance & Geometric_Tolerance_With_Datum_Reference & - //Geometric_Tolerance_With_Maximum_Tolerance & Geometric_Tolerance_With_Modifiers - Handle(StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol) aResult = - new StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol(); - aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWDR, aGTWM, aMaxLMWU, aType); - aGeomTol = aResult; +//======================================================================= +//function : createKinematicJoint +//purpose : auxilary +//======================================================================= +static Standard_Boolean createKinematicJoint(const Handle(XCAFKinematics_PairObject)& theKinPairObj, + Handle(StepKinematics_KinematicLinkRepresentation)& theLinkRepr1, + Handle(StepKinematics_KinematicLinkRepresentation)& theLinkRepr2, + Handle(StepKinematics_KinematicJoint)& theJoint) +{ + theJoint = new StepKinematics_KinematicJoint; + Handle(TCollection_HAsciiString) aNameJoint = new TCollection_HAsciiString(theKinPairObj->Name()); + + Handle(StepShape_Vertex) anEdgeStart; + Handle(StepShape_Vertex) anEdgeEnd; + + anEdgeStart = theLinkRepr1->RepresentedLink(); + anEdgeEnd = theLinkRepr2->RepresentedLink(); + + if (anEdgeEnd.IsNull() || anEdgeStart.IsNull()) + return Standard_False; + + theJoint->Init(aNameJoint, anEdgeStart, anEdgeEnd); + return Standard_True; +} + +//======================================================================= +//function : createKinematicPair +//purpose : auxilary +//======================================================================= +static Standard_Boolean createKinematicPair(const Handle(XCAFKinematics_PairObject)& theKinPairObj, + const Handle(StepKinematics_KinematicJoint)& theJoint, + const Handle(StepKinematics_KinematicLinkRepresentation)& theLinkRepr1, + const Handle(StepKinematics_KinematicLinkRepresentation)& theLinkRepr2, + Handle(StepKinematics_KinematicPair)& theKinematicPair) +{ + if (theKinPairObj->Type() == XCAFKinematics_PairType_NoType) + return Standard_False; + Handle(StepRepr_RepresentationItem) aTransformItem1 = GeomToStep_MakeAxis2Placement3d(theKinPairObj->FirstTransformation()).Value(); + Handle(StepRepr_RepresentationItem) aTransformItem2 = GeomToStep_MakeAxis2Placement3d(theKinPairObj->SecondTransformation()).Value(); + if (aTransformItem1.IsNull() || aTransformItem2.IsNull()) + return Standard_False; + + Standard_Boolean hasDescription = Standard_False; + Handle(TCollection_HAsciiString) aPairName = new TCollection_HAsciiString(theKinPairObj->Name()); + Handle(TCollection_HAsciiString) aDescription; + Standard_Boolean isRanged = theKinPairObj->HasLimits(); + if (theKinPairObj->IsKind(STANDARD_TYPE(XCAFKinematics_LowOrderPairObject))) + { + Handle(XCAFKinematics_LowOrderPairObject) aLowOrderPairObj = Handle(XCAFKinematics_LowOrderPairObject)::DownCast(theKinPairObj); + Standard_Boolean aTX = Standard_True; + Standard_Boolean aTY = Standard_True; + Standard_Boolean aTZ = Standard_True; + Standard_Boolean aRX = Standard_True; + Standard_Boolean aRY = Standard_True; + Standard_Boolean aRZ = Standard_True; + switch (theKinPairObj->Type()) + { + case(XCAFKinematics_PairType_Revolute): + { + aTX = Standard_False; + aTY = Standard_False; + aTZ = Standard_False; + aRX = Standard_False; + aRY = Standard_False; + if (isRanged) + { + theKinematicPair = new StepKinematics_RevolutePairWithRange; + Standard_Real aLowerLimitActualRotation = aLowOrderPairObj->MinRotationZ(); + Standard_Real aUpperLimitActualRotation = aLowOrderPairObj->MaxRotationZ(); + aRZ = Standard_True; + Handle(StepKinematics_RevolutePairWithRange) aRevolutePairWithRange = Handle(StepKinematics_RevolutePairWithRange)::DownCast(theKinematicPair); + aRevolutePairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitActualRotation, Standard_True, aUpperLimitActualRotation); } - else { - // Geometric_Tolerance & Geometric_Tolerance_With_Maximum_Tolerance & Geometric_Tolerance_With_Modifiers - Handle(StepDimTol_GeoTolAndGeoTolWthMaxTol) aResult = - new StepDimTol_GeoTolAndGeoTolWthMaxTol(); - aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWM, aMaxLMWU, aType); - aGeomTol = aResult; + else + { + theKinematicPair = new StepKinematics_RevolutePair; + Handle(StepKinematics_RevolutePair) aRevolutePair = Handle(StepKinematics_RevolutePair)::DownCast(theKinematicPair); + aRevolutePair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ); + } + break; + } + case(XCAFKinematics_PairType_Prismatic): + { + aTY = Standard_False; + aTZ = Standard_False; + aRX = Standard_False; + aRY = Standard_False; + aRZ = Standard_False; + if (isRanged) + { + theKinematicPair = new StepKinematics_PrismaticPairWithRange; + Handle(StepKinematics_PrismaticPairWithRange) aPrismaticPairWithRange = Handle(StepKinematics_PrismaticPairWithRange)::DownCast(theKinematicPair); + Standard_Real aUpperLimitActualTranslation = aLowOrderPairObj->MaxTranslationX(); + Standard_Real aLowerLimitActualTranslation = aLowOrderPairObj->MinTranslationX(); + aPrismaticPairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitActualTranslation, Standard_True, aUpperLimitActualTranslation); + } + else + { + theKinematicPair = new StepKinematics_PrismaticPair; + Handle(StepKinematics_PrismaticPair) aPrismaticPair = Handle(StepKinematics_PrismaticPair)::DownCast(theKinematicPair); + aPrismaticPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ); + } + break; + } + case(XCAFKinematics_PairType_Cylindrical): + { + aTX = Standard_False; + aTY = Standard_False; + aRX = Standard_False; + aRY = Standard_False; + if (isRanged) + { + theKinematicPair = new StepKinematics_CylindricalPairWithRange; + Handle(StepKinematics_CylindricalPairWithRange) aCylindricalPairWithRange = Handle(StepKinematics_CylindricalPairWithRange)::DownCast(theKinematicPair); + Standard_Real aUpperLimitActualTranslation = aLowOrderPairObj->MaxTranslationZ(); + Standard_Real aLowerLimitActualTranslation = aLowOrderPairObj->MinTranslationZ(); + Standard_Real aLowerLimitActualRotation = aLowOrderPairObj->MinRotationZ(); + Standard_Real aUpperLimitActualRotation = aLowOrderPairObj->MaxRotationZ(); + aCylindricalPairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitActualTranslation, Standard_True, + aUpperLimitActualTranslation, Standard_True, aLowerLimitActualRotation, Standard_True, aUpperLimitActualRotation); + } + else + { + theKinematicPair = new StepKinematics_CylindricalPair; + Handle(StepKinematics_CylindricalPair) aCylindricalPair = Handle(StepKinematics_CylindricalPair)::DownCast(theKinematicPair); + aCylindricalPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ); + } + break; + } + case(XCAFKinematics_PairType_Universal): + { + aTX = Standard_False; + aTY = Standard_False; + aTZ = Standard_False; + aRY = Standard_False; + Standard_Real theUniversalPair_InputSkewAngle = aLowOrderPairObj->SkewAngle(); + if (isRanged) + { + theKinematicPair = new StepKinematics_UniversalPairWithRange; + Handle(StepKinematics_UniversalPairWithRange) anUniversalPairWithRange = Handle(StepKinematics_UniversalPairWithRange)::DownCast(theKinematicPair); + Standard_Real aUpperLimitActualRotationX = aLowOrderPairObj->MaxRotationX(); + Standard_Real aLowerLimitActualRotationX = aLowOrderPairObj->MinRotationX(); + Standard_Real aUpperLimitActualRotationZ = aLowOrderPairObj->MaxRotationZ(); + Standard_Real aLowerLimitActualRotationZ = aLowOrderPairObj->MinRotationZ(); + anUniversalPairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, theUniversalPair_InputSkewAngle, Standard_True, aLowerLimitActualRotationX, Standard_True, + aUpperLimitActualRotationX, Standard_True, aLowerLimitActualRotationZ, Standard_True, aUpperLimitActualRotationZ); + } + else + { + theKinematicPair = new StepKinematics_UniversalPair; + Handle(StepKinematics_UniversalPair) anUniversalPair = Handle(StepKinematics_UniversalPair)::DownCast(theKinematicPair); + anUniversalPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, theUniversalPair_InputSkewAngle); + } + break; + } + case(XCAFKinematics_PairType_SphericalWithPin): + { + aTX = Standard_False; + aTY = Standard_False; + aTZ = Standard_False; + aRX = Standard_False; + aRY = Standard_False; + if (isRanged) + { + Standard_Real aUpperLimitYaw = aLowOrderPairObj->MaxRotationZ(); + Standard_Real aLowerLimitYaw = aLowOrderPairObj->MinRotationZ(); + Standard_Real aUpperLimitRoll = aLowOrderPairObj->MaxRotationX(); + Standard_Real aLowerLimitRoll = aLowOrderPairObj->MinRotationX(); + theKinematicPair = new StepKinematics_SphericalPairWithPinAndRange; + Handle(StepKinematics_SphericalPairWithPinAndRange) aSphericalPairWithPinAndRange = Handle(StepKinematics_SphericalPairWithPinAndRange)::DownCast(theKinematicPair); + aSphericalPairWithPinAndRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitYaw, Standard_True, + aUpperLimitYaw, Standard_True, aLowerLimitRoll, Standard_True, aUpperLimitRoll); + } + else + { + theKinematicPair = new StepKinematics_SphericalPairWithPin; + Handle(StepKinematics_SphericalPairWithPin) aSphericalPairWithPin = Handle(StepKinematics_SphericalPairWithPin)::DownCast(theKinematicPair); + aSphericalPairWithPin->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ); } + break; } - else { - if (isWithDatRef) { - // Geometric_Tolerance & Geometric_Tolerance_With_Datum_Reference & Geometric_Tolerance_With_Modifiers - Handle(StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod) aResult = - new StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod(); - aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWDR, aGTWM, aType); - aGeomTol = aResult; + case(XCAFKinematics_PairType_Spherical): + { + aTX = Standard_False; + aTY = Standard_False; + aTZ = Standard_False; + if (isRanged) + { + Standard_Real aUpperLimitYaw = aLowOrderPairObj->MaxRotationZ(); + Standard_Real aLowerLimitYaw = aLowOrderPairObj->MinRotationZ(); + Standard_Real aUpperLimitRoll = aLowOrderPairObj->MaxRotationX(); + Standard_Real aLowerLimitRoll = aLowOrderPairObj->MinRotationX(); + Standard_Real aUpperLimitPitch = aLowOrderPairObj->MaxRotationY(); + Standard_Real aLowerLimitPitch= aLowOrderPairObj->MinRotationY(); + theKinematicPair = new StepKinematics_SphericalPairWithRange; + Handle(StepKinematics_SphericalPairWithRange) aSphericalPairWithRange = Handle(StepKinematics_SphericalPairWithRange)::DownCast(theKinematicPair); + aSphericalPairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitYaw, Standard_True, + aUpperLimitYaw, Standard_True, aLowerLimitRoll, Standard_True, aUpperLimitRoll, Standard_True, aLowerLimitPitch, Standard_True, aUpperLimitPitch); } - else { - // Geometric_Tolerance & Geometric_Tolerance_With_Modifiers - Handle(StepDimTol_GeoTolAndGeoTolWthMod) aResult = - new StepDimTol_GeoTolAndGeoTolWthMod(); - aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWM, aType); - aGeomTol = aResult; + else + { + theKinematicPair = new StepKinematics_SphericalPair; + Handle(StepKinematics_SphericalPair) aSphericalPair = Handle(StepKinematics_SphericalPair)::DownCast(theKinematicPair); + aSphericalPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ); } + break; } - } - else { - if (isWithDatRef) { - // Geometric_Tolerance & Geometric_Tolerance_With_Datum_Reference - Handle(StepDimTol_GeoTolAndGeoTolWthDatRef) aResult = - new StepDimTol_GeoTolAndGeoTolWthDatRef(); - aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWDR, aType); - aGeomTol = aResult; - } - else { - // Geometric_Tolerance - Handle(StepDimTol_GeometricTolerance) aResult = - STEPCAFControl_GDTProperty::GetGeomTolerance(anObject->GetType()); - if (!aResult.IsNull()) { - aResult->Init(aName, aDescription, aLMWU, aGTTarget); - aGeomTol = aResult; + case(XCAFKinematics_PairType_Planar): + { + aTZ = Standard_False; + aRX = Standard_False; + aRY = Standard_False; + if (isRanged) + { + theKinematicPair = new StepKinematics_PlanarPairWithRange; + Handle(StepKinematics_PlanarPairWithRange) aPlanarPairWithRange = Handle(StepKinematics_PlanarPairWithRange)::DownCast(theKinematicPair); + Standard_Real aUpperLimitActualTranslationX = aLowOrderPairObj->MaxTranslationX(); + Standard_Real aLowerLimitActualTranslationX = aLowOrderPairObj->MinTranslationX(); + Standard_Real aUpperLimitActualTranslationY = aLowOrderPairObj->MaxTranslationY(); + Standard_Real aLowerLimitActualTranslationY = aLowOrderPairObj->MinTranslationY(); + Standard_Real aLowerLimitActualRotation = aLowOrderPairObj->MinRotationZ(); + Standard_Real aUpperLimitActualRotation = aLowOrderPairObj->MaxRotationZ(); + aPlanarPairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitActualTranslationX, Standard_True, aUpperLimitActualTranslationX, + Standard_True, aLowerLimitActualTranslationY, Standard_True, aUpperLimitActualTranslationY, + Standard_True, aLowerLimitActualRotation, Standard_True, aUpperLimitActualRotation); + } + else + { + theKinematicPair = new StepKinematics_PlanarPair; + Handle(StepKinematics_PlanarPair) aPlanarPair = Handle(StepKinematics_PlanarPair)::DownCast(theKinematicPair); + aPlanarPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ); } + break; } - } - Model->AddWithRefs(aGeomTol); - WriteToleranceZone(WS, anObject, aGeomTol, theRC); - //Annotation plane and Presentation - WritePresentation(WS, anObject->GetPresentation(), anObject->GetPresentationName(), Standard_True, anObject->HasPlane(), - anObject->GetPlane(), anObject->GetPointTextAttach(), aGeomTol); -} - -//======================================================================= -//function : WriteDGTs -//purpose : -//======================================================================= -Standard_Boolean STEPCAFControl_Writer::WriteDGTs (const Handle(XSControl_WorkSession) &WS, - const TDF_LabelSequence &labels ) const -{ - - if ( labels.Length() <=0 ) return Standard_False; - - // get working data - const Handle(Interface_InterfaceModel) &Model = WS->Model(); - const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter(); - const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess(); - - const Handle(Interface_HGraph) aHGraph = WS->HGraph(); - if(aHGraph.IsNull()) - return Standard_False; - - Interface_Graph aGraph = aHGraph->Graph(); - Handle(XCAFDoc_DimTolTool) DGTTool = XCAFDoc_DocumentTool::DimTolTool( labels(1) ); - if(DGTTool.IsNull() ) return Standard_False; - - TDF_LabelSequence DGTLabels; - - STEPConstruct_DataMapOfAsciiStringTransient DatumMap; + case(XCAFKinematics_PairType_Unconstrained): + { + theKinematicPair = new StepKinematics_LowOrderKinematicPairWithRange; - // write Datums - DGTLabels.Clear(); - DGTTool->GetDatumLabels(DGTLabels); - if(DGTLabels.Length()<=0) return Standard_False; - Standard_Integer i; - for(i=1; i<=DGTLabels.Length(); i++) { - TDF_Label DatumL = DGTLabels.Value(i); - TDF_LabelSequence ShapeL; - TDF_LabelSequence aNullSeq; - if(!DGTTool->GetRefShapeLabel(DatumL,ShapeL,aNullSeq)) continue; - // find target shape - TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL.Value(1)); - TopLoc_Location Loc; - TColStd_SequenceOfTransient seqRI; - FindEntities( FP, aShape, Loc, seqRI ); - if ( seqRI.Length() <= 0 ) { - FP->Messenger()->SendInfo() << "Warning: Cannot find RI for "<DynamicType()->Name()<MaxTranslationX(); + Standard_Real aLowerLimitActualTranslationX = aLowOrderPairObj->MinTranslationX(); + Standard_Real aUpperLimitActualTranslationY = aLowOrderPairObj->MaxTranslationY(); + Standard_Real aLowerLimitActualTranslationY = aLowOrderPairObj->MinTranslationY(); + Standard_Real aUpperLimitActualTranslationZ = aLowOrderPairObj->MaxTranslationZ(); + Standard_Real aLowerLimitActualTranslationZ = aLowOrderPairObj->MinTranslationZ(); + Standard_Real aLowerLimitActualRotationX = aLowOrderPairObj->MinRotationX(); + Standard_Real aUpperLimitActualRotationX = aLowOrderPairObj->MaxRotationX(); + Standard_Real aLowerLimitActualRotationY = aLowOrderPairObj->MinRotationY(); + Standard_Real aUpperLimitActualRotationY = aLowOrderPairObj->MaxRotationY(); + Standard_Real aLowerLimitActualRotationZ = aLowOrderPairObj->MinRotationZ(); + Standard_Real aUpperLimitActualRotationZ = aLowOrderPairObj->MaxRotationZ(); + Handle(StepKinematics_LowOrderKinematicPairWithRange) anUnconstrainedPairWithRange = Handle(StepKinematics_LowOrderKinematicPairWithRange)::DownCast(theKinematicPair); + anUnconstrainedPairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, aLowerLimitActualRotationX, Standard_True, aUpperLimitActualRotationX, + Standard_True, aLowerLimitActualRotationY, Standard_True, aUpperLimitActualRotationY, + Standard_True, aLowerLimitActualRotationZ, Standard_True, aUpperLimitActualRotationZ, + Standard_True, aLowerLimitActualTranslationX, Standard_True, aUpperLimitActualTranslationX, + Standard_True, aLowerLimitActualTranslationY, Standard_True, aUpperLimitActualTranslationY, + Standard_True, aLowerLimitActualTranslationZ, Standard_True, aUpperLimitActualTranslationZ); + break; + } + case(XCAFKinematics_PairType_FullyConstrained): + { + theKinematicPair = new StepKinematics_FullyConstrainedPair; + Handle(StepKinematics_FullyConstrainedPair) aFullyConstrainedPair = Handle(StepKinematics_FullyConstrainedPair)::DownCast(theKinematicPair); + aFullyConstrainedPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ); + break; + } + case(XCAFKinematics_PairType_Homokinetic): + { + aTX = Standard_False; + aTY = Standard_False; + aTZ = Standard_False; + aRY = Standard_False; + Standard_Real InputSkewAngle = aLowOrderPairObj->SkewAngle(); + theKinematicPair = new StepKinematics_HomokineticPair; + Handle(StepKinematics_HomokineticPair) aHomokineticPair = Handle(StepKinematics_HomokineticPair)::DownCast(theKinematicPair); + aHomokineticPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, + aTX, aTY, aTZ, aRX, aRY, aRZ, Standard_True, InputSkewAngle); + break; + } + default: + return Standard_False; } - Handle(StepRepr_ProductDefinitionShape) PDS; - Handle(StepRepr_RepresentationContext) RC; - Handle(Standard_Transient) ent = seqRI.Value(1); - Handle(StepShape_AdvancedFace) AF; - Handle(StepShape_EdgeCurve) EC; - FindPDSforDGT(aGraph,ent,PDS,RC,AF,EC); - if(PDS.IsNull()) continue; - //std::cout<<"Model->Number(PDS)="<Number(PDS)<GetName(); - Handle(TCollection_HAsciiString) aDescription = DatumAttr->GetDescription(); - Handle(TCollection_HAsciiString) anIdentification = DatumAttr->GetIdentification(); - Handle(StepDimTol_DatumFeature) DF = new StepDimTol_DatumFeature; - Handle(StepDimTol_Datum) aDatum = new StepDimTol_Datum; - DF->Init(aName, new TCollection_HAsciiString, PDS, StepData_LTrue); - Model->AddWithRefs(DF); - aDatum->Init(aName, new TCollection_HAsciiString, PDS, StepData_LFalse, anIdentification); - Model->AddWithRefs(aDatum); - Handle(StepRepr_ShapeAspectRelationship) SAR = new StepRepr_ShapeAspectRelationship; - SAR->SetName(aName); - SAR->SetRelatingShapeAspect(DF); - SAR->SetRelatedShapeAspect(aDatum); - Model->AddWithRefs(SAR); - // write chain for DatumFeature - StepRepr_CharacterizedDefinition CD; - CD.SetValue(DF); - Handle(StepRepr_PropertyDefinition) PropD = new StepRepr_PropertyDefinition; - PropD->Init(aName,Standard_True,aDescription,CD); - Model->AddWithRefs(PropD); - StepRepr_RepresentedDefinition RD; - RD.SetValue(PropD); - Handle(StepShape_ShapeRepresentation) SR = new StepShape_ShapeRepresentation; - Handle(StepRepr_HArray1OfRepresentationItem) HARI = - new StepRepr_HArray1OfRepresentationItem(1,1); - HARI->SetValue(1,AF); - SR->Init(aName,HARI,RC); - Handle(StepShape_ShapeDefinitionRepresentation) SDR = new StepShape_ShapeDefinitionRepresentation; - SDR->Init(RD,SR); - Model->AddWithRefs(SDR); - // write chain for Datum - StepRepr_CharacterizedDefinition CD1; - CD1.SetValue(aDatum); - Handle(StepRepr_PropertyDefinition) PropD1 = new StepRepr_PropertyDefinition; - PropD1->Init(aName,Standard_True,aDescription,CD1); - Model->AddWithRefs(PropD1); - StepRepr_RepresentedDefinition RD1; - RD1.SetValue(PropD1); - Handle(StepShape_ShapeRepresentation) SR1 = new StepShape_ShapeRepresentation; - Handle(StepRepr_HArray1OfRepresentationItem) HARI1 = - new StepRepr_HArray1OfRepresentationItem(1,1); - HARI1->SetValue(1,AF->FaceGeometry()); - SR1->Init(aName,HARI1,RC); - Model->AddWithRefs(SR1); - Handle(StepShape_ShapeDefinitionRepresentation) SDR1 = new StepShape_ShapeDefinitionRepresentation; - SDR1->Init(RD1,SR1); - Model->AddWithRefs(SDR1); - // add created Datum into Map - TCollection_AsciiString stmp(aName->ToCString()); - stmp.AssignCat(aDescription->ToCString()); - stmp.AssignCat(anIdentification->ToCString()); - DatumMap.Bind(stmp,aDatum); } - - // write Tolerances and Dimensions - DGTLabels.Clear(); - DGTTool->GetDimTolLabels(DGTLabels); - if(DGTLabels.Length()<=0) return Standard_False; - for(i=1; i<=DGTLabels.Length(); i++) { - TDF_Label DimTolL = DGTLabels.Value(i); - TDF_LabelSequence ShapeL; - TDF_LabelSequence aNullSeq; - if(!DGTTool->GetRefShapeLabel(DimTolL,ShapeL,aNullSeq)) continue; - // find target shape - TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL.Value(1)); - TopLoc_Location Loc; - TColStd_SequenceOfTransient seqRI; - FindEntities( FP, aShape, Loc, seqRI ); - if ( seqRI.Length() <= 0 ) { - FP->Messenger()->SendInfo() << "Warning: Cannot find RI for "<DynamicType()->Name()<IsKind(STANDARD_TYPE(XCAFKinematics_LowOrderPairObjectWithCoupling))) + { + Handle(XCAFKinematics_LowOrderPairObjectWithCoupling) aLowOrderPairObjectWithCoupling = Handle(XCAFKinematics_LowOrderPairObjectWithCoupling)::DownCast(theKinPairObj); + switch (theKinPairObj->Type()) + { + case(XCAFKinematics_PairType_Screw): + { + Standard_Real aPitch = aLowOrderPairObjectWithCoupling->Pitch(); + if (isRanged) + { + theKinematicPair = new StepKinematics_ScrewPairWithRange; + Handle(StepKinematics_ScrewPairWithRange) aScrewPairWithRange = Handle(StepKinematics_ScrewPairWithRange)::DownCast(theKinematicPair); + Standard_Real aLowLimit = aLowOrderPairObjectWithCoupling->LowLimit(); + Standard_Real aUpperLimit = aLowOrderPairObjectWithCoupling->UpperLimit(); + aScrewPairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint,aPitch, + Standard_True, aLowLimit, Standard_True, aUpperLimit); + } + else + { + theKinematicPair = new StepKinematics_ScrewPair; + Handle(StepKinematics_ScrewPair) aScrewPair = Handle(StepKinematics_ScrewPair)::DownCast(theKinematicPair); + aScrewPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint,aPitch); + } + break; } - Handle(StepRepr_ProductDefinitionShape) PDS; - Handle(StepRepr_RepresentationContext) RC; - Handle(Standard_Transient) ent = seqRI.Value(1); - Handle(StepShape_AdvancedFace) AF; - Handle(StepShape_EdgeCurve) EC; - FindPDSforDGT(aGraph,ent,PDS,RC,AF,EC); - if(PDS.IsNull()) continue; - //std::cout<<"Model->Number(PDS)="<Number(PDS)<GetKind(); - Handle(TColStd_HArray1OfReal) aVal = DimTolAttr->GetVal(); - Handle(TCollection_HAsciiString) aName = DimTolAttr->GetName(); - Handle(TCollection_HAsciiString) aDescription = DimTolAttr->GetDescription(); - - // common part of writing D> entities - StepRepr_CharacterizedDefinition CD; - Handle(StepRepr_ShapeAspect) SA = new StepRepr_ShapeAspect; - SA->Init(aName, new TCollection_HAsciiString, PDS, StepData_LTrue); - Model->AddWithRefs(SA); - CD.SetValue(SA); - Handle(StepRepr_PropertyDefinition) PropD = new StepRepr_PropertyDefinition; - PropD->Init(aName,Standard_True,aDescription,CD); - Model->AddWithRefs(PropD); - StepRepr_RepresentedDefinition RD; - RD.SetValue(PropD); - Handle(StepShape_ShapeRepresentation) SR = new StepShape_ShapeRepresentation; - Handle(StepRepr_HArray1OfRepresentationItem) HARI = - new StepRepr_HArray1OfRepresentationItem(1,1); - if(kind<20) - HARI->SetValue(1,EC); - else - HARI->SetValue(1,AF); - SR->Init(aName,HARI,RC); - Handle(StepShape_ShapeDefinitionRepresentation) SDR = new StepShape_ShapeDefinitionRepresentation; - SDR->Init(RD,SR); - Model->AddWithRefs(SDR); - // define aUnit for creation LengthMeasureWithUnit (common for all) - StepBasic_Unit aUnit; - aUnit = GetUnit(RC); - - // specific part of writing D> entities - if(kind<20) { //dimension - Handle(StepShape_DimensionalSize) DimSize = new StepShape_DimensionalSize; - DimSize->Init(SA,aDescription); - Model->AddWithRefs(DimSize); - if(aVal->Length()>1) { - // create MeasureWithUnits - Handle(StepBasic_MeasureValueMember) MVM1 = new StepBasic_MeasureValueMember; - MVM1->SetName("POSITIVE_LENGTH_MEASURE"); - MVM1->SetReal(aVal->Value(1)); - Handle(StepBasic_MeasureWithUnit) MWU1 = new StepBasic_MeasureWithUnit; - MWU1->Init(MVM1,aUnit); - Handle(StepBasic_MeasureValueMember) MVM2 = new StepBasic_MeasureValueMember; - MVM2->SetName("POSITIVE_LENGTH_MEASURE"); - MVM2->SetReal(aVal->Value(2)); - Handle(StepBasic_MeasureWithUnit) MWU2 = new StepBasic_MeasureWithUnit; - MWU2->Init(MVM2,aUnit); - Handle(StepRepr_RepresentationItem) RI1 = new StepRepr_RepresentationItem; - RI1->Init(new TCollection_HAsciiString("lower limit")); - Handle(StepRepr_RepresentationItem) RI2 = new StepRepr_RepresentationItem; - RI2->Init(new TCollection_HAsciiString("upper limit")); - Handle(StepRepr_ReprItemAndLengthMeasureWithUnit) RILMU1 = - new StepRepr_ReprItemAndLengthMeasureWithUnit; - RILMU1->Init(MWU1,RI1); - Handle(StepRepr_ReprItemAndLengthMeasureWithUnit) RILMU2 = - new StepRepr_ReprItemAndLengthMeasureWithUnit; - RILMU2->Init(MWU2,RI2); - Model->AddWithRefs(RILMU1); - Model->AddWithRefs(RILMU2); - //Handle(StepRepr_CompoundItemDefinitionMember) CIDM = - // new StepRepr_CompoundItemDefinitionMember; - //Handle(TColStd_HArray1OfTransient) ArrTr = new TColStd_HArray1OfTransient(1,2); - //ArrTr->SetValue(1,RILMU1); - //ArrTr->SetValue(2,RILMU2); - //CIDM->SetArrTransient(ArrTr); - //CIDM->SetName("SET_REPRESENTATION_ITEM"); - //StepRepr_CompoundItemDefinition CID; - //CID.SetValue(CIDM); - Handle(StepRepr_HArray1OfRepresentationItem) HARIVR = - new StepRepr_HArray1OfRepresentationItem(1,2); - HARIVR->SetValue(1,RILMU1); - HARIVR->SetValue(2,RILMU2); - Handle(StepRepr_ValueRange) VR = new StepRepr_ValueRange; - //VR->Init(aName,CID); - VR->Init(aName,HARIVR); - Model->AddEntity(VR); - Handle(StepShape_ShapeDimensionRepresentation) SDimR = - new StepShape_ShapeDimensionRepresentation; - Handle(StepRepr_HArray1OfRepresentationItem) aHARI = - new StepRepr_HArray1OfRepresentationItem(1,1); - aHARI->SetValue(1,VR); - SDimR->Init(aName,aHARI,RC); - Model->AddWithRefs(SDimR); - Handle(StepShape_DimensionalCharacteristicRepresentation) DimCharR = - new StepShape_DimensionalCharacteristicRepresentation; - StepShape_DimensionalCharacteristic DimChar; - DimChar.SetValue(DimSize); - DimCharR->Init(DimChar,SDimR); - Model->AddEntity(DimCharR); + case(XCAFKinematics_PairType_RackAndPinion): + { + Standard_Real aPinionRadius = aLowOrderPairObjectWithCoupling->PinionRadius(); + if (isRanged) + { + theKinematicPair = new StepKinematics_RackAndPinionPairWithRange; + Standard_Real aLowLimit = aLowOrderPairObjectWithCoupling->LowLimit(); + Standard_Real aUpperLimit = aLowOrderPairObjectWithCoupling->UpperLimit(); + Handle(StepKinematics_RackAndPinionPairWithRange) aRackAndPinionPairWithRange = Handle(StepKinematics_RackAndPinionPairWithRange)::DownCast(theKinematicPair); + aRackAndPinionPairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPinionRadius, + Standard_True, aLowLimit, Standard_True, aUpperLimit); + } + else + { + theKinematicPair = new StepKinematics_RackAndPinionPair; + Handle(StepKinematics_RackAndPinionPair) aRackAndPinionPair = Handle(StepKinematics_RackAndPinionPair)::DownCast(theKinematicPair); + aRackAndPinionPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPinionRadius); + } + break; + } + case(XCAFKinematics_PairType_Gear): + { + Standard_Real aBevel = aLowOrderPairObjectWithCoupling->Bevel(); + Standard_Real aGearRatio = aLowOrderPairObjectWithCoupling->GearRatio(); + Standard_Real aHelicalAngle = aLowOrderPairObjectWithCoupling->HelicalAngle(); + Standard_Real aRadiusFirstLink = aLowOrderPairObjectWithCoupling->RadiusFirstLink();; + Standard_Real aRadiusSecondLink = aLowOrderPairObjectWithCoupling->RadiusSecondLink();; + if (isRanged) + { + Standard_Real aLowLimit = aLowOrderPairObjectWithCoupling->LowLimit(); + Standard_Real aUpperLimit = aLowOrderPairObjectWithCoupling->UpperLimit(); + theKinematicPair = new StepKinematics_GearPairWithRange; + Handle(StepKinematics_GearPairWithRange) aGearPairWithRange = Handle(StepKinematics_GearPairWithRange)::DownCast(theKinematicPair); + aGearPairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aRadiusFirstLink, aRadiusSecondLink, aBevel, aHelicalAngle, aGearRatio, + Standard_True, aLowLimit, Standard_True, aUpperLimit); + } + else + { + theKinematicPair = new StepKinematics_GearPair; + Handle(StepKinematics_GearPair) aGearPair = Handle(StepKinematics_GearPair)::DownCast(theKinematicPair); + aGearPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint,aRadiusFirstLink,aRadiusSecondLink,aBevel,aHelicalAngle, aGearRatio); + } + break; + } + case(XCAFKinematics_PairType_LinearFlexibleAndPinion): + { + Standard_Real aPinionRadius = aLowOrderPairObjectWithCoupling->PinionRadius(); + theKinematicPair = new StepKinematics_LinearFlexibleAndPinionPair; + Handle(StepKinematics_LinearFlexibleAndPinionPair) aLinearFlexibleAndPinionPair = Handle(StepKinematics_LinearFlexibleAndPinionPair)::DownCast(theKinematicPair); + aLinearFlexibleAndPinionPair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPinionRadius); + break; + } + default: + return Standard_False; + } + } + else if (theKinPairObj->IsKind(STANDARD_TYPE(XCAFKinematics_HighOrderPairObject))) + { + Handle(XCAFKinematics_HighOrderPairObject) aHighOrderPairObject = Handle(XCAFKinematics_HighOrderPairObject)::DownCast(theKinPairObj); + switch (theKinPairObj->Type()) + { + case(XCAFKinematics_PairType_PointOnSurface): + { + GeomToStep_MakeSurface aMaker(aHighOrderPairObject->Surface()); + Handle(StepGeom_Surface) aPairSurface = aMaker.Value(); + if (isRanged && !aPairSurface.IsNull() && + aPairSurface->IsKind(STANDARD_TYPE(StepGeom_RectangularTrimmedSurface))) + { + Standard_Real aLowerLimitYaw = aHighOrderPairObject->LowLimitYaw(); + Standard_Real aUpperLimitYaw = aHighOrderPairObject->UpperLimitYaw(); + Standard_Real aLowerLimitPitch = aHighOrderPairObject->LowLimitPitch(); + Standard_Real aUpperLimitPitch = aHighOrderPairObject->UpperLimitPitch(); + Standard_Real aLowerLimitRoll = aHighOrderPairObject->LowLimitRoll(); + Standard_Real aUpperLimitRoll = aHighOrderPairObject->UpperLimitRoll(); + GeomToStep_MakeSurface aMakerSurface(aHighOrderPairObject->Surface()); + Handle(StepGeom_RectangularTrimmedSurface) aRangeOnPairSurface = Handle(StepGeom_RectangularTrimmedSurface)::DownCast(aMakerSurface.Value()); + theKinematicPair = new StepKinematics_PointOnSurfacePairWithRange; + Handle(StepKinematics_PointOnSurfacePairWithRange) aPointOnSurfacePairWithRange = Handle(StepKinematics_PointOnSurfacePairWithRange)::DownCast(theKinematicPair); + aPointOnSurfacePairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPairSurface,aRangeOnPairSurface, Standard_True, aLowerLimitYaw, Standard_True, aUpperLimitYaw, Standard_True, + aLowerLimitPitch, Standard_True, aUpperLimitPitch, Standard_True, aLowerLimitRoll, Standard_True, aUpperLimitRoll); + } + else + { + theKinematicPair = new StepKinematics_PointOnSurfacePair; + Handle(StepKinematics_PointOnSurfacePair) aPointOnSurface = Handle(StepKinematics_PointOnSurfacePair)::DownCast(theKinematicPair); + aPointOnSurface->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPairSurface); } + break; + } + case(XCAFKinematics_PairType_SlidingSurface): + { + theKinematicPair = new StepKinematics_SlidingSurfacePair; + GeomToStep_MakeSurface aMaker(aHighOrderPairObject->FirstSurface()); + Handle(StepGeom_Surface) aPairSurfac1 = aMaker.Value(); + GeomToStep_MakeSurface aMaker2(aHighOrderPairObject->SecondSurface()); + Handle(StepGeom_Surface) aPairSurface2 = aMaker2.Value(); + Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); + Handle(StepKinematics_SlidingSurfacePair) aSlidingSurfacePair = Handle(StepKinematics_SlidingSurfacePair)::DownCast(theKinematicPair); + aSlidingSurfacePair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPairSurfac1, aPairSurface2, anOrientation); + break; } - else if(kind<50) { //tolerance - if(kind<35) { // tolerance with datum system - TDF_LabelSequence DatumLabels; - DGTTool->GetDatumOfTolerLabels(DimTolL,DatumLabels); - Standard_Integer NbDR = DatumLabels.Length(); - Handle(StepDimTol_HArray1OfDatumReference) HADR = new StepDimTol_HArray1OfDatumReference(1,NbDR); - for(Standard_Integer j=1; j<=NbDR; j++) { - Handle(XCAFDoc_Datum) DatumAttr; - TDF_Label DatumL = DatumLabels.Value(j); - if(!DatumL.FindAttribute(XCAFDoc_Datum::GetID(),DatumAttr)) continue; - Handle(TCollection_HAsciiString) aNameD = DatumAttr->GetName(); - Handle(TCollection_HAsciiString) aDescriptionD = DatumAttr->GetDescription(); - Handle(TCollection_HAsciiString) anIdentificationD = DatumAttr->GetIdentification(); - TCollection_AsciiString stmp(aNameD->ToCString()); - stmp.AssignCat(aDescriptionD->ToCString()); - stmp.AssignCat(anIdentificationD->ToCString()); - if(DatumMap.IsBound(stmp)) { - Handle(StepDimTol_Datum) aDatum = - Handle(StepDimTol_Datum)::DownCast(DatumMap.Find(stmp)); - Handle(StepDimTol_DatumReference) DR = new StepDimTol_DatumReference; - DR->Init(j,aDatum); - Model->AddWithRefs(DR); - HADR->SetValue(j,DR); - } - } - // create LengthMeasureWithUnit - Handle(StepBasic_MeasureValueMember) MVM = new StepBasic_MeasureValueMember; - MVM->SetName("LENGTH_MEASURE"); - MVM->SetReal(aVal->Value(1)); - Handle(StepBasic_LengthMeasureWithUnit) LMWU = new StepBasic_LengthMeasureWithUnit; - LMWU->Init(MVM,aUnit); - // create tolerance by it's type - if(kind<24) { - Handle(StepDimTol_GeometricToleranceWithDatumReference) GTWDR = - new StepDimTol_GeometricToleranceWithDatumReference; - GTWDR->SetDatumSystem(HADR); - Handle(StepDimTol_ModifiedGeometricTolerance) MGT = - new StepDimTol_ModifiedGeometricTolerance; - if(kind==21) MGT->SetModifier(StepDimTol_MaximumMaterialCondition); - else if(kind==22) MGT->SetModifier(StepDimTol_LeastMaterialCondition); - else if(kind==23) MGT->SetModifier(StepDimTol_RegardlessOfFeatureSize); - Handle(StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol) GTComplex = - new StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol; - GTComplex->Init(aName,aDescription,LMWU,SA,GTWDR,MGT); - Model->AddWithRefs(GTComplex); - } - else if(kind==24) { - Handle(StepDimTol_AngularityTolerance) aToler = - new StepDimTol_AngularityTolerance; - aToler->Init(aName,aDescription,LMWU,SA,HADR); - Model->AddWithRefs(aToler); - } - else if(kind==25) { - Handle(StepDimTol_CircularRunoutTolerance) aToler = - new StepDimTol_CircularRunoutTolerance; - aToler->Init(aName,aDescription,LMWU,SA,HADR); - Model->AddWithRefs(aToler); - } - else if(kind==26) { - Handle(StepDimTol_CoaxialityTolerance) aToler = - new StepDimTol_CoaxialityTolerance; - aToler->Init(aName,aDescription,LMWU,SA,HADR); - Model->AddWithRefs(aToler); - } - else if(kind==27) { - Handle(StepDimTol_ConcentricityTolerance) aToler = - new StepDimTol_ConcentricityTolerance; - aToler->Init(aName,aDescription,LMWU,SA,HADR); - Model->AddWithRefs(aToler); - } - else if(kind==28) { - Handle(StepDimTol_ParallelismTolerance) aToler = - new StepDimTol_ParallelismTolerance; - aToler->Init(aName,aDescription,LMWU,SA,HADR); - Model->AddWithRefs(aToler); - } - else if(kind==29) { - Handle(StepDimTol_PerpendicularityTolerance) aToler = - new StepDimTol_PerpendicularityTolerance; - aToler->Init(aName,aDescription,LMWU,SA,HADR); - Model->AddWithRefs(aToler); - } - else if(kind==30) { - Handle(StepDimTol_SymmetryTolerance) aToler = - new StepDimTol_SymmetryTolerance; - aToler->Init(aName,aDescription,LMWU,SA,HADR); - Model->AddWithRefs(aToler); - } - else if(kind==31) { - Handle(StepDimTol_TotalRunoutTolerance) aToler = - new StepDimTol_TotalRunoutTolerance; - aToler->Init(aName,aDescription,LMWU,SA,HADR); - Model->AddWithRefs(aToler); - } + case(XCAFKinematics_PairType_RollingSurface): + { + theKinematicPair = new StepKinematics_RollingSurfacePair; + GeomToStep_MakeSurface aMaker(aHighOrderPairObject->FirstSurface()); + Handle(StepGeom_Surface) aPairSurfac1 = aMaker.Value(); + GeomToStep_MakeSurface aMaker2(aHighOrderPairObject->SecondSurface()); + Handle(StepGeom_Surface) aPairSurface2 = aMaker2.Value(); + Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); + Handle(StepKinematics_RollingSurfacePair) aRollingSurfacePair = Handle(StepKinematics_RollingSurfacePair)::DownCast(theKinematicPair); + aRollingSurfacePair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPairSurfac1, aPairSurface2, anOrientation); + break; + } + case(XCAFKinematics_PairType_PointOnPlanarCurve): + { + GeomToStep_MakeCurve aMaker(aHighOrderPairObject->Curve()); + Handle(StepGeom_Curve) aPairCurve = aMaker.Value(); + Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); + if (isRanged && !aPairCurve.IsNull() && + aPairCurve->IsKind(STANDARD_TYPE(StepGeom_TrimmedCurve))) + { + Standard_Real aLowerLimitYaw = aHighOrderPairObject->LowLimitYaw(); + Standard_Real aUpperLimitYaw = aHighOrderPairObject->UpperLimitYaw(); + Standard_Real aLowerLimitPitch = aHighOrderPairObject->LowLimitPitch(); + Standard_Real aUpperLimitPitch = aHighOrderPairObject->UpperLimitPitch(); + Standard_Real aLowerLimitRoll = aHighOrderPairObject->LowLimitRoll(); + Standard_Real aUpperLimitRoll = aHighOrderPairObject->UpperLimitRoll(); + Handle(StepGeom_TrimmedCurve) aRangeOnPairCurve = Handle(StepGeom_TrimmedCurve)::DownCast(aPairCurve); + theKinematicPair = new StepKinematics_PointOnPlanarCurvePairWithRange; + Handle(StepKinematics_PointOnPlanarCurvePairWithRange) aPointOnPlanarCurvePairWithRange = Handle(StepKinematics_PointOnPlanarCurvePairWithRange)::DownCast(theKinematicPair); + aPointOnPlanarCurvePairWithRange->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPairCurve, anOrientation, aRangeOnPairCurve, Standard_True, aLowerLimitYaw, Standard_True, aUpperLimitYaw, Standard_True, + aLowerLimitPitch, Standard_True, aUpperLimitPitch, Standard_True, aLowerLimitRoll, Standard_True, aUpperLimitRoll); + } + else + { + theKinematicPair = new StepKinematics_PointOnPlanarCurvePair; + Handle(StepKinematics_PointOnPlanarCurvePair) aPointOnPlanarCurvePair = Handle(StepKinematics_PointOnPlanarCurvePair)::DownCast(theKinematicPair); + aPointOnPlanarCurvePair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPairCurve, anOrientation); } + break; + } + case(XCAFKinematics_PairType_SlidingCurve): + { + GeomToStep_MakeCurve aMaker(aHighOrderPairObject->FirstCurve()); + Handle(StepGeom_Curve) aPairCurve = aMaker.Value(); + Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); + GeomToStep_MakeCurve aMaker2(aHighOrderPairObject->SecondCurve()); + Handle(StepGeom_Curve) aPairCurve2 = aMaker2.Value(); + theKinematicPair = new StepKinematics_SlidingCurvePair; + Handle(StepKinematics_SlidingCurvePair) aSlidingCurvePair = Handle(StepKinematics_SlidingCurvePair)::DownCast(theKinematicPair); + aSlidingCurvePair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPairCurve, aPairCurve2, anOrientation); + break; + } + case(XCAFKinematics_PairType_RollingCurve): + { + GeomToStep_MakeCurve aMaker(aHighOrderPairObject->FirstCurve()); + Handle(StepGeom_Curve) aPairCurve = aMaker.Value(); + Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); + GeomToStep_MakeCurve aMaker2(aHighOrderPairObject->SecondCurve()); + Handle(StepGeom_Curve) aPairCurve2 = aMaker2.Value(); + theKinematicPair = new StepKinematics_RollingCurvePair; + Handle(StepKinematics_RollingCurvePair) aRollingCurvePair = Handle(StepKinematics_RollingCurvePair)::DownCast(theKinematicPair); + aRollingCurvePair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPairCurve, aPairCurve2, anOrientation); + break; + } + case(XCAFKinematics_PairType_LinearFlexibleAndPlanarCurve): + { + theKinematicPair = new StepKinematics_LinearFlexibleAndPlanarCurvePair; + GeomToStep_MakeCurve aMaker(aHighOrderPairObject->Curve()); + Handle(StepGeom_Curve) aPairCurve = aMaker.Value(); + Standard_Boolean anOrientation = aHighOrderPairObject->Orientation(); + Handle(StepKinematics_LinearFlexibleAndPlanarCurvePair) aLinearFlexibleAndPlanarCurvePair = Handle(StepKinematics_LinearFlexibleAndPlanarCurvePair)::DownCast(theKinematicPair); + aLinearFlexibleAndPlanarCurvePair->Init(aPairName, aPairName, hasDescription, + aDescription, aTransformItem1, aTransformItem2, theJoint, aPairCurve, anOrientation); + break; + } + default: + return Standard_False; } } - + + // Updating placements of the both link representations + theLinkRepr1->Items()->Resize(theLinkRepr1->Items()->Lower(), theLinkRepr1->Items()->Upper() + 1, Standard_True); + theLinkRepr1->Items()->ChangeLast() = aTransformItem1; + theLinkRepr2->Items()->Resize(theLinkRepr2->Items()->Lower(), theLinkRepr2->Items()->Upper() + 1, Standard_True); + theLinkRepr2->Items()->ChangeLast() = aTransformItem2; + + return Standard_True; +} + +//======================================================================= +//function : createKinematicPairValue +//purpose : +//======================================================================= +static Standard_Boolean createKinematicPairValue(const Handle(XCAFKinematics_PairValueObject)& theKinPairValueObj, + const Handle(StepKinematics_PairRepresentationRelationship)& thePairReprRelationship, + Handle(StepKinematics_PairValue)& thePairValue) +{ + if (theKinPairValueObj->Type() == XCAFKinematics_PairType_NoType) + return Standard_False; + + switch (theKinPairValueObj->Type()) + { + case(XCAFKinematics_PairType_Revolute): + { + thePairValue = new StepKinematics_RevolutePairValue; + Handle(StepKinematics_RevolutePairValue) aRevolutePairValue = + Handle(StepKinematics_RevolutePairValue)::DownCast(thePairValue); + aRevolutePairValue->SetActualRotation(theKinPairValueObj->GetRotation()); + break; + } + case(XCAFKinematics_PairType_Prismatic): + { + thePairValue = new StepKinematics_PrismaticPairValue; + Handle(StepKinematics_PrismaticPairValue) aPrismaticPairValue = + Handle(StepKinematics_PrismaticPairValue)::DownCast(thePairValue); + aPrismaticPairValue->SetActualTranslation(theKinPairValueObj->GetTranslation()); + break; + } + case(XCAFKinematics_PairType_Cylindrical): + { + thePairValue = new StepKinematics_CylindricalPairValue; + Handle(StepKinematics_CylindricalPairValue) aCylindricalPairValue = + Handle(StepKinematics_CylindricalPairValue)::DownCast(thePairValue); + aCylindricalPairValue->SetActualTranslation(theKinPairValueObj->GetTranslation()); + aCylindricalPairValue->SetActualRotation(theKinPairValueObj->GetRotation()); + break; + } + case(XCAFKinematics_PairType_Universal): + case(XCAFKinematics_PairType_Homokinetic): + { + thePairValue = new StepKinematics_UniversalPairValue; + Handle(StepKinematics_UniversalPairValue) aUniversalPairValue = + Handle(StepKinematics_UniversalPairValue)::DownCast(thePairValue); + aUniversalPairValue->SetFirstRotationAngle(theKinPairValueObj->GetFirstRotation()); + aUniversalPairValue->SetSecondRotationAngle(theKinPairValueObj->GetSecondRotation()); + break; + } + case(XCAFKinematics_PairType_Spherical): + case(XCAFKinematics_PairType_SphericalWithPin): + { + thePairValue = new StepKinematics_SphericalPairValue; + Handle(StepKinematics_SphericalPairValue) aSphericalPairValue = + Handle(StepKinematics_SphericalPairValue)::DownCast(thePairValue); + StepKinematics_SpatialRotation InputRotation; + InputRotation.SetValue(theKinPairValueObj->GetAllValues()); + aSphericalPairValue->SetInputOrientation(InputRotation); + break; + } + case(XCAFKinematics_PairType_Planar): + { + thePairValue = new StepKinematics_PlanarPairValue; + Handle(StepKinematics_PlanarPairValue) aPlanarPairValue = + Handle(StepKinematics_PlanarPairValue)::DownCast(thePairValue); + aPlanarPairValue->SetActualRotation(theKinPairValueObj->GetRotation()); + aPlanarPairValue->SetActualTranslationX(theKinPairValueObj->GetFirstTranslation()); + aPlanarPairValue->SetActualTranslationY(theKinPairValueObj->GetSecondTranslation()); + break; + } + case(XCAFKinematics_PairType_Unconstrained): + { + thePairValue = new StepKinematics_UnconstrainedPairValue; + Handle(StepKinematics_UnconstrainedPairValue) anUnconstrainedPairValue = + Handle(StepKinematics_UnconstrainedPairValue)::DownCast(thePairValue); + GeomToStep_MakeAxis2Placement3d anActualPlacement(theKinPairValueObj->GetTransformation()); + anUnconstrainedPairValue->SetActualPlacement(anActualPlacement.Value()); + break; + } + case(XCAFKinematics_PairType_Screw): + { + thePairValue = new StepKinematics_ScrewPairValue; + Handle(StepKinematics_ScrewPairValue) aScrewPairValue = + Handle(StepKinematics_ScrewPairValue)::DownCast(thePairValue); + aScrewPairValue->SetActualRotation(theKinPairValueObj->GetRotation()); + break; + } + case(XCAFKinematics_PairType_RackAndPinion): + { + thePairValue = new StepKinematics_RackAndPinionPairValue; + Handle(StepKinematics_RackAndPinionPairValue) aRackAndPinionPairValue = + Handle(StepKinematics_RackAndPinionPairValue)::DownCast(thePairValue); + aRackAndPinionPairValue->SetActualDisplacement(theKinPairValueObj->GetTranslation()); + break; + } + case(XCAFKinematics_PairType_Gear): + { + thePairValue = new StepKinematics_GearPairValue; + Handle(StepKinematics_GearPairValue) aGearPairValue = + Handle(StepKinematics_GearPairValue)::DownCast(thePairValue); + aGearPairValue->SetActualRotation1(theKinPairValueObj->GetRotation()); + break; + } + case(XCAFKinematics_PairType_PointOnSurface): + { + thePairValue = new StepKinematics_PointOnSurfacePairValue; + Handle(StepKinematics_PointOnSurfacePairValue) aPointOnSurfacePairValue = + Handle(StepKinematics_PointOnSurfacePairValue)::DownCast(thePairValue); + Handle(StepGeom_PointOnSurface) aActualPointOnSurface = new StepGeom_PointOnSurface; + Handle(StepKinematics_PointOnSurfacePair) aPointOnSurfacePair = + Handle(StepKinematics_PointOnSurfacePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); + Standard_Real theU; + Standard_Real theV; + theKinPairValueObj->GetPointOnSurface(theU, theV); + aActualPointOnSurface->Init(new TCollection_HAsciiString, aPointOnSurfacePair->PairSurface(), theU, theV); + aPointOnSurfacePairValue->SetActualPointOnSurface(aActualPointOnSurface); + StepKinematics_SpatialRotation aYRP; + Handle(TColStd_HArray1OfReal) anArrayYRP = new TColStd_HArray1OfReal(1,3); + Standard_Real aYaw; + Standard_Real aPitch; + Standard_Real aRoll; + theKinPairValueObj->GetYPR(aYaw, aPitch, aRoll); + anArrayYRP->SetValue(1, aYaw); + anArrayYRP->SetValue(2, aPitch); + anArrayYRP->SetValue(3, aRoll); + aYRP.SetValue(anArrayYRP); + aPointOnSurfacePairValue->SetInputOrientation(aYRP); + break; + } + case(XCAFKinematics_PairType_SlidingSurface): + { + thePairValue = new StepKinematics_SlidingSurfacePairValue; + Handle(StepKinematics_SlidingSurfacePairValue) aSlidingSurfacePairValue = + Handle(StepKinematics_SlidingSurfacePairValue)::DownCast(thePairValue); + Handle(StepGeom_PointOnSurface) aActualPointOnSurface1 = new StepGeom_PointOnSurface; + Handle(StepKinematics_SlidingSurfacePair) SlidingSurfacePair = + Handle(StepKinematics_SlidingSurfacePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); + Standard_Real theU1; + Standard_Real theV1; + theKinPairValueObj->GetFirstPointOnSurface(theU1, theV1); + aActualPointOnSurface1->Init(new TCollection_HAsciiString, SlidingSurfacePair->Surface1(), theU1, theV1); + aSlidingSurfacePairValue->SetActualPointOnSurface1(aActualPointOnSurface1); + Handle(StepGeom_PointOnSurface) aActualPointOnSurface2 = new StepGeom_PointOnSurface; + Standard_Real theU2; + Standard_Real theV2; + theKinPairValueObj->GetSecondPointOnSurface(theU2, theV2); + aActualPointOnSurface2->Init(new TCollection_HAsciiString, SlidingSurfacePair->Surface2(), theU2, theV2); + aSlidingSurfacePairValue->SetActualPointOnSurface2(aActualPointOnSurface2); + aSlidingSurfacePairValue->SetActualRotation(theKinPairValueObj->GetRotation()); + break; + } + case(XCAFKinematics_PairType_RollingSurface): + { + thePairValue = new StepKinematics_RollingSurfacePairValue; + Handle(StepKinematics_RollingSurfacePairValue) aRollingSurfacePairValue = + Handle(StepKinematics_RollingSurfacePairValue)::DownCast(thePairValue); + aRollingSurfacePairValue->SetActualRotation(theKinPairValueObj->GetRotation()); + Handle(StepGeom_PointOnSurface) aActualPointOnSurface = new StepGeom_PointOnSurface; + Handle(StepKinematics_RollingSurfacePair) aRollingSurfacePair = + Handle(StepKinematics_RollingSurfacePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); + Standard_Real theU; + Standard_Real theV; + theKinPairValueObj->GetPointOnSurface(theU, theV); + aActualPointOnSurface->Init(new TCollection_HAsciiString, aRollingSurfacePair->Surface1(), theU, theV); + aRollingSurfacePairValue->SetActualPointOnSurface(aActualPointOnSurface); + break; + } + case(XCAFKinematics_PairType_PointOnPlanarCurve): + { + thePairValue = new StepKinematics_PointOnPlanarCurvePairValue; + Handle(StepKinematics_PointOnPlanarCurvePairValue) aPointOnPlanarCurvePairValue = + Handle(StepKinematics_PointOnPlanarCurvePairValue)::DownCast(thePairValue); + StepKinematics_SpatialRotation aYRP; + Handle(TColStd_HArray1OfReal) anArrayYRP = new TColStd_HArray1OfReal(1, 3); + Standard_Real aYaw; + Standard_Real aPitch; + Standard_Real aRoll; + theKinPairValueObj->GetYPR(aYaw, aPitch, aRoll); + anArrayYRP->SetValue(1, aYaw); + anArrayYRP->SetValue(2, aPitch); + anArrayYRP->SetValue(3, aRoll); + aYRP.SetValue(anArrayYRP); + aPointOnPlanarCurvePairValue->SetInputOrientation(aYRP); + Handle(StepGeom_PointOnCurve) anActualPointOnCurve = new StepGeom_PointOnCurve; + Handle(StepKinematics_PointOnPlanarCurvePair) aPointOnPlanarCurvePair = + Handle(StepKinematics_PointOnPlanarCurvePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); + Standard_Real aParametr = theKinPairValueObj->GetPointOnCurve(); + anActualPointOnCurve->Init(aPointOnPlanarCurvePair->Name(), aPointOnPlanarCurvePair->PairCurve(), aParametr); + aPointOnPlanarCurvePairValue->SetActualPointOnCurve(anActualPointOnCurve); + break; + } + case(XCAFKinematics_PairType_SlidingCurve): + { + thePairValue = new StepKinematics_SlidingCurvePairValue; + Handle(StepKinematics_SlidingCurvePairValue) aSlidingCurvePairValue = + Handle(StepKinematics_SlidingCurvePairValue)::DownCast(thePairValue); + Handle(StepGeom_PointOnCurve) anActualPointOnCurve1 = new StepGeom_PointOnCurve; + Handle(StepKinematics_SlidingCurvePair) aSlidingCurvePair = + Handle(StepKinematics_SlidingCurvePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); + Standard_Real aParametr1 = theKinPairValueObj->GetFirstPointOnCurve(); + anActualPointOnCurve1->Init(aSlidingCurvePair->Name(), aSlidingCurvePair->Curve1(), aParametr1); + aSlidingCurvePairValue->SetActualPointOnCurve1(anActualPointOnCurve1); + Handle(StepGeom_PointOnCurve) anActualPointOnCurve2 = new StepGeom_PointOnCurve; + Standard_Real aParametr2 = theKinPairValueObj->GetSecondPointOnCurve(); + anActualPointOnCurve2->Init(aSlidingCurvePair->Name(), aSlidingCurvePair->Curve2(), aParametr2); + aSlidingCurvePairValue->SetActualPointOnCurve2(anActualPointOnCurve2); + break; + } + case(XCAFKinematics_PairType_RollingCurve): + { + thePairValue = new StepKinematics_RollingCurvePairValue; + Handle(StepKinematics_RollingCurvePairValue) aRollingCurvePairValue = + Handle(StepKinematics_RollingCurvePairValue)::DownCast(thePairValue); + Handle(StepGeom_PointOnCurve) anActualPointOnCurve = new StepGeom_PointOnCurve; + Handle(StepKinematics_RollingCurvePair) aRollingCurvePair = + Handle(StepKinematics_RollingCurvePair)::DownCast(thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair()); + Standard_Real aParametr = theKinPairValueObj->GetPointOnCurve(); + anActualPointOnCurve->Init(aRollingCurvePair->Name(), aRollingCurvePair->Curve1(), aParametr); + aRollingCurvePairValue->SetActualPointOnCurve1(anActualPointOnCurve); + break; + } + default: + return Standard_False; + break; + } + Handle(StepKinematics_KinematicPair) aAppliesToPair = + thePairReprRelationship->RepresentationRelationshipWithTransformation()->TransformationOperator().KinematicPair(); + thePairValue->SetAppliesToPair(aAppliesToPair); + thePairValue->SetName(aAppliesToPair->Name()); return Standard_True; } //======================================================================= -//function : WriteDGTsAP242 +//function : WriteKinematics //purpose : //======================================================================= - -Standard_Boolean STEPCAFControl_Writer::WriteDGTsAP242 (const Handle(XSControl_WorkSession) &WS, - const TDF_LabelSequence &labels ) +Standard_EXPORT Standard_Boolean STEPCAFControl_Writer::WriteKinematics(const Handle(XSControl_WorkSession)& theWS, const TDF_LabelSequence& theLabels) { - // Get working data - const Handle(Interface_InterfaceModel) &aModel = WS->Model(); - const Handle(Interface_HGraph) aHGraph = WS->HGraph(); - if(aHGraph.IsNull()) + if (theLabels.Length() <= 0) return Standard_False; + + // Get working data + const Handle(Interface_InterfaceModel)& Model = theWS->Model(); + const Handle(Interface_HGraph) aHGraph = theWS->HGraph(); + if (aHGraph.IsNull()) return Standard_False; Interface_Graph aGraph = aHGraph->Graph(); - Handle(XCAFDoc_DimTolTool) DGTTool = XCAFDoc_DocumentTool::DimTolTool(labels(1)); - if(DGTTool.IsNull()) + Handle(XCAFDoc_KinematicTool) aKTool = XCAFDoc_DocumentTool::KinematicTool(theLabels(1)); + if (aKTool.IsNull()) return Standard_False; - // Common entities for presentation - STEPConstruct_Styles aStyles (WS); - Handle(StepVisual_Colour) aCurvColor = aStyles.EncodeColor(Quantity_NOC_WHITE); - Handle(StepRepr_RepresentationItem) anItem = NULL; - myGDTPrsCurveStyle->SetValue(1, aStyles.MakeColorPSA(anItem, aCurvColor, aCurvColor, aCurvColor, 0.0)); - Interface_EntityIterator aModelIter = aModel->Entities(); - for (; aModelIter.More() && myGDTCommonPDS.IsNull(); aModelIter.Next()) - myGDTCommonPDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(aModelIter.Value()); - - TDF_LabelSequence aDGTLabels; - STEPConstruct_DataMapOfAsciiStringTransient aDatumMap; - Handle(StepRepr_RepresentationContext) aRC; - - //------------- // - // write Datums // - //--------------// - DGTTool->GetDatumLabels(aDGTLabels); - // Find all shapes with datums - TColStd_MapOfAsciiString aNameIdMap; - for(Standard_Integer i = 1; i <= aDGTLabels.Length(); i++) { - TDF_Label aDatumL = aDGTLabels.Value(i); - TDF_LabelSequence aShapeL, aNullSeq; - DGTTool->GetRefShapeLabel(aDatumL, aShapeL, aNullSeq); - Handle(XCAFDoc_Datum) aDatumAttr; - aDatumL.FindAttribute(XCAFDoc_Datum::GetID(), aDatumAttr); - Handle(XCAFDimTolObjects_DatumObject) anObject = aDatumAttr->GetObject(); - TCollection_AsciiString aDatumName = anObject->GetName()->String(); - TCollection_AsciiString aDatumTargetId = TCollection_AsciiString(anObject->GetDatumTargetNumber()); - if (!aNameIdMap.Add(aDatumName.Cat(aDatumTargetId))) - continue; - Handle(Standard_Transient) aWrittenDatum; - Standard_Boolean isFirstDT = !aDatumMap.Find(aDatumName, aWrittenDatum); - Handle(StepDimTol_Datum) aDatum = WriteDatumAP242(WS, aShapeL, aDatumL, isFirstDT, - Handle(StepDimTol_Datum)::DownCast (aWrittenDatum)); - // Add created Datum into Map - aDatumMap.Bind(aDatumName, aDatum); - } - - //----------------- // - // write Dimensions // - //------------------// - aDGTLabels.Clear(); - DGTTool->GetDimensionLabels(aDGTLabels); - // Auxiliary entities for derived geometry - Handle(StepRepr_ConstructiveGeometryRepresentation) aCGRepr = - new StepRepr_ConstructiveGeometryRepresentation(); - Handle(StepRepr_ConstructiveGeometryRepresentationRelationship) aCGReprRel = - new StepRepr_ConstructiveGeometryRepresentationRelationship(); - NCollection_Vector aConnectionPnts; - Handle(StepRepr_RepresentationContext) dummyRC; - Handle(StepAP242_GeometricItemSpecificUsage) dummyGISU; - for (Standard_Integer i = 1; i <= aDGTLabels.Length(); i++) { - TDF_Label aDimensionL = aDGTLabels.Value(i); - TDF_LabelSequence aFirstShapeL, aSecondShapeL; - Handle(XCAFDoc_Dimension) aDimAttr; - if (!aDimensionL.FindAttribute(XCAFDoc_Dimension::GetID(),aDimAttr)) - continue; - Handle(XCAFDimTolObjects_DimensionObject) anObject = aDimAttr->GetObject(); - if (anObject.IsNull()) - continue; - if (anObject->GetType() == XCAFDimTolObjects_DimensionType_CommonLabel) - { - Handle(StepRepr_ShapeAspect) aSA = new StepRepr_ShapeAspect(); - aSA->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), myGDTCommonPDS, StepData_LTrue); - aModel->AddWithRefs(aSA); - WritePresentation(WS, anObject->GetPresentation(), anObject->GetPresentationName(), anObject->HasPlane(), - Standard_False, anObject->GetPlane(), anObject->GetPointTextAttach(), aSA); - } + TDF_LabelSequence aMechanismsL; + aMechanismsL = aKTool->GetMechanisms(); + if (aMechanismsL.Length() <= 0) return Standard_False; - if (!DGTTool->GetRefShapeLabel(aDimensionL, aFirstShapeL, aSecondShapeL)) + for (TDF_LabelSequence::Iterator anItMech(aMechanismsL); anItMech.More(); anItMech.Next()) + { + TDF_LabelSequence aSeqOfJointsL = aKTool->GetJoints(anItMech.Value()); + if (aSeqOfJointsL.Length() <= 0) continue; - // Write links with shapes - Handle(StepRepr_ShapeAspect) aFirstSA, aSecondSA; - if (aFirstShapeL.Length() == 1) { - TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(aFirstShapeL.Value(1)); - aFirstSA = WriteShapeAspect(WS, aDimensionL, aShape, dummyRC, dummyGISU); - if (aRC.IsNull() && !dummyRC.IsNull()) - aRC = dummyRC; - } - else if (aFirstShapeL.Length() > 1) { - Handle(StepRepr_CompositeShapeAspect) aCSA; - for (Standard_Integer shIt = 1; shIt <= aFirstShapeL.Length(); shIt++) { - TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(aFirstShapeL.Value(shIt)); - Handle(StepRepr_ShapeAspect) aSA = WriteShapeAspect(WS, aDimensionL, aShape, dummyRC, dummyGISU); - if (aSA.IsNull()) - continue; - if (aCSA.IsNull()) { - aCSA = new StepRepr_CompositeShapeAspect(); - aCSA->Init(aSA->Name(), aSA->Description(), aSA->OfShape(), aSA->ProductDefinitional()); - aModel->AddWithRefs(aCSA); - } - Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); - aSAR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aCSA, aSA); - aModel->AddWithRefs(aSAR); - if (aRC.IsNull() && !dummyRC.IsNull()) - aRC = dummyRC; - } - aFirstSA = aCSA; - } - if (aSecondShapeL.Length() == 1) { - TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(aSecondShapeL.Value(1)); - aSecondSA = WriteShapeAspect(WS, aDimensionL, aShape, dummyRC, dummyGISU); - if (aRC.IsNull() && !dummyRC.IsNull()) - aRC = dummyRC; - } - else if (aSecondShapeL.Length() > 1) { - Handle(StepRepr_CompositeShapeAspect) aCSA; - for (Standard_Integer shIt = 1; shIt <= aSecondShapeL.Length(); shIt++) { - TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(aSecondShapeL.Value(shIt)); - Handle(StepRepr_ShapeAspect) aSA = WriteShapeAspect(WS, aDimensionL, aShape, dummyRC, dummyGISU); - if (aCSA.IsNull() && !aSA.IsNull()) - { - aCSA = new StepRepr_CompositeShapeAspect(); - } - aCSA->Init(aSA->Name(), aSA->Description(), aSA->OfShape(), aSA->ProductDefinitional()); - if (!aSA.IsNull()) { - Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship(); - aSAR->Init(new TCollection_HAsciiString(), Standard_False, new TCollection_HAsciiString(), aCSA, aSA); - aModel->AddWithRefs(aSAR); - } - if (aRC.IsNull() && !dummyRC.IsNull()) - aRC = dummyRC; - } - aSecondSA = aCSA; - } + Handle(StepKinematics_RigidLinkRepresentation) aBaseLinkOfMech; + Handle(StepRepr_PropertyDefinition) aGeneralDefinition; + NCollection_IndexedDataMap aMapOfLinks; + NCollection_IndexedDataMap aMapofJoints; + Handle(StepRepr_HSequenceOfRepresentationItem) aSeqOfPairs = new StepRepr_HSequenceOfRepresentationItem; + Handle(StepKinematics_KinematicPropertyMechanismRepresentation) aPropertyMechanismRepr = new StepKinematics_KinematicPropertyMechanismRepresentation; + Handle(StepKinematics_ProductDefinitionKinematics) aProductDefKin = new StepKinematics_ProductDefinitionKinematics; + Handle(StepKinematics_MechanismRepresentation) aMechanism = new StepKinematics_MechanismRepresentation; + Handle(StepKinematics_KinematicTopologyStructure) aKTopoStruct = new StepKinematics_KinematicTopologyStructure; - if (anObject->GetType() == XCAFDimTolObjects_DimensionType_DimensionPresentation) + for (TDF_LabelSequence::Iterator anItJoint(aSeqOfJointsL); anItJoint.More(); anItJoint.Next()) { - WritePresentation(WS, anObject->GetPresentation(), anObject->GetPresentationName(), anObject->HasPlane(), - Standard_False, anObject->GetPlane(), anObject->GetPointTextAttach(), aFirstSA); - continue; - } + TDF_Label aJointL = anItJoint.Value(); + Handle(StepKinematics_KinematicJoint) aJoint; + Handle(XCAFDoc_KinematicPair) aKPairAttr; + Handle(StepKinematics_KinematicPair) aKinematicPair; + if (!aJointL.FindAttribute(XCAFDoc_KinematicPair::GetID(), aKPairAttr)) + continue; + Handle(XCAFKinematics_PairObject) aPairObject = aKPairAttr->GetObject(); + TDF_Label aStartLink, aEndLink; + aKTool->GetLinksOfJoint(aJointL, aStartLink, aEndLink); + if (aStartLink.IsNull() || aEndLink.IsNull()) + continue; - // Write dimensions - StepShape_DimensionalCharacteristic aDimension; - if (anObject->HasPoint() || anObject->HasPoint2()) - WriteDerivedGeometry(WS, anObject, aCGRepr, aFirstSA, aSecondSA, aConnectionPnts); - XCAFDimTolObjects_DimensionType aDimType = anObject->GetType(); - if (STEPCAFControl_GDTProperty::IsDimensionalLocation(aDimType)) { - // Dimensional_Location - Handle(StepShape_DimensionalLocation) aDim = new StepShape_DimensionalLocation(); - aDim->Init(STEPCAFControl_GDTProperty::GetDimTypeName(aDimType), Standard_False, NULL, aFirstSA, aSecondSA); - aDimension.SetValue(aDim); - } - else if (aDimType == XCAFDimTolObjects_DimensionType_Location_Angular) { - // Angular_Location - Handle(StepShape_AngularLocation) aDim = new StepShape_AngularLocation(); - StepShape_AngleRelator aRelator = StepShape_Equal; - if (anObject->HasQualifier()) { - XCAFDimTolObjects_DimensionQualifier aQualifier = anObject->GetQualifier(); - switch (aQualifier) { - case XCAFDimTolObjects_DimensionQualifier_Min: aRelator = StepShape_Small; - break; - case XCAFDimTolObjects_DimensionQualifier_Max: aRelator = StepShape_Large; - break; - default: aRelator = StepShape_Equal; - } - } - aDim->Init(new TCollection_HAsciiString(), Standard_False, NULL, aFirstSA, aSecondSA, aRelator); - aDimension.SetValue(aDim); - } - else if (aDimType == XCAFDimTolObjects_DimensionType_Location_WithPath) { - // Dimensional_Location_With_Path - Handle(StepShape_DimensionalLocationWithPath) aDim = new StepShape_DimensionalLocationWithPath(); - Handle(StepRepr_ShapeAspect) aPathSA = WriteShapeAspect(WS, aDimensionL, anObject->GetPath(), dummyRC, dummyGISU); - aDim->Init(new TCollection_HAsciiString(), Standard_False, NULL, aFirstSA, aSecondSA, aPathSA); - aDimension.SetValue(aDim); - } - else if (STEPCAFControl_GDTProperty::IsDimensionalSize(aDimType)) { - // Dimensional_Size - Handle(StepShape_DimensionalSize) aDim = new StepShape_DimensionalSize(); - aDim->Init(aFirstSA, STEPCAFControl_GDTProperty::GetDimTypeName(aDimType)); - aDimension.SetValue(aDim); - } - else if (aDimType == XCAFDimTolObjects_DimensionType_Size_Angular) { - // Angular_Size - Handle(StepShape_AngularSize) aDim = new StepShape_AngularSize(); - StepShape_AngleRelator aRelator = StepShape_Equal; - if (anObject->HasQualifier()) { - XCAFDimTolObjects_DimensionQualifier aQualifier = anObject->GetQualifier(); - switch (aQualifier) { - case XCAFDimTolObjects_DimensionQualifier_Min: aRelator = StepShape_Small; - break; - case XCAFDimTolObjects_DimensionQualifier_Max: aRelator = StepShape_Large; - break; - default: aRelator = StepShape_Equal; - } - } - aDim->Init(aFirstSA, new TCollection_HAsciiString(), aRelator); - aDimension.SetValue(aDim); - } - else if (aDimType == XCAFDimTolObjects_DimensionType_Size_WithPath) { - // Dimensional_Size_With_Path - Handle(StepShape_DimensionalSizeWithPath) aDim = new StepShape_DimensionalSizeWithPath(); - Handle(StepRepr_ShapeAspect) aPathSA = WriteShapeAspect(WS, aDimensionL, anObject->GetPath(), dummyRC, dummyGISU); - aDim->Init(aFirstSA, new TCollection_HAsciiString(), aPathSA); - aDimension.SetValue(aDim); - } + Handle(StepKinematics_KinematicLinkRepresentation) aLinkRepr1; + Handle(StepKinematics_KinematicLinkRepresentation) aLinkRepr2; + Handle(TColStd_HSequenceOfTransient) aSeqOfContexLink = new TColStd_HSequenceOfTransient; + if (!createKinematicLink(theWS,aKTool, aStartLink,aMapOfLinks, aLinkRepr1, aSeqOfContexLink,aBaseLinkOfMech,aGeneralDefinition)) + continue; + if (!createKinematicLink(theWS, aKTool, aEndLink, aMapOfLinks, aLinkRepr2, aSeqOfContexLink, aBaseLinkOfMech, aGeneralDefinition)) + continue; + if (!createKinematicJoint(aPairObject, aLinkRepr1, aLinkRepr2, aJoint)) + continue; + if (!createKinematicPair(aPairObject, aJoint, aLinkRepr1, aLinkRepr2, aKinematicPair)) + continue; + aMapofJoints.Add(anItJoint.Value(), aJoint); + Handle(StepKinematics_PairRepresentationRelationship) aPairReprRelationship = new StepKinematics_PairRepresentationRelationship; + StepRepr_RepresentationOrRepresentationReference aDataLinkStart; + aDataLinkStart.SetValue(aLinkRepr1); + StepRepr_RepresentationOrRepresentationReference aDataLinkEnd; + aDataLinkEnd.SetValue(aLinkRepr2); + StepRepr_Transformation aPair; + aPair.SetValue(aKinematicPair); + Handle(TCollection_HAsciiString) aDescription; + aPairReprRelationship->Init(aKinematicPair->Name(), aKinematicPair->Name(), Standard_False, aDescription, aDataLinkStart, aDataLinkEnd, aPair); + aSeqOfPairs->Append(aPairReprRelationship); - // Write values - WriteDimValues(WS, anObject, aRC, aDimension); - //Annotation plane and Presentation - WritePresentation(WS, anObject->GetPresentation(), anObject->GetPresentationName(), Standard_True, anObject->HasPlane(), - anObject->GetPlane(), anObject->GetPointTextAttach(), aDimension.Value()); - } - // Write Derived geometry - if (aConnectionPnts.Length() > 0) { - Handle(StepRepr_HArray1OfRepresentationItem) anItems = new StepRepr_HArray1OfRepresentationItem(1, aConnectionPnts.Length()); - for (Standard_Integer i = 0; i < aConnectionPnts.Length(); i++) - anItems->SetValue(i + 1, aConnectionPnts(i)); - aCGRepr->Init(new TCollection_HAsciiString(), anItems, dummyRC); - aCGReprRel->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), dummyGISU->UsedRepresentation(), aCGRepr); - aModel->AddWithRefs(aCGReprRel); - } + // Write all entities describe mechanism kinematics + for (TColStd_HSequenceOfTransient::Iterator anItLinks(aSeqOfContexLink->Sequence()); anItLinks.More(); anItLinks.Next()) + Model->AddWithRefs(anItLinks.Value()); + Model->AddEntity(aJoint); + Model->AddWithRefs(aPairReprRelationship); + } - //----------------------------// - // write Geometric Tolerances // - //----------------------------// - aDGTLabels.Clear(); - DGTTool->GetGeomToleranceLabels(aDGTLabels); - for (Standard_Integer i = 1; i <= aDGTLabels.Length(); i++) { - TDF_Label aGeomTolL = aDGTLabels.Value(i); - TDF_LabelSequence aFirstShapeL, aNullSeqL; - if (!DGTTool->GetRefShapeLabel(aGeomTolL, aFirstShapeL, aNullSeqL)) + if (aBaseLinkOfMech.IsNull() || aSeqOfPairs->IsEmpty()) continue; - TDF_LabelSequence aDatumSeq; - DGTTool->GetDatumWithObjectOfTolerLabels(aGeomTolL, aDatumSeq); - Handle(StepDimTol_HArray1OfDatumSystemOrReference) aDatumSystem; - if (aDatumSeq.Length() > 0) - aDatumSystem = WriteDatumSystem(WS, aGeomTolL, aDatumSeq, aDatumMap, aRC); - WriteGeomTolerance(WS, aFirstShapeL, aGeomTolL, aDatumSystem, aRC); - } - // Write Draughting model for Annotation Planes - if (myGDTAnnotations.Length() == 0) - return Standard_True; + Standard_Integer anPairInd = 1; + Handle(StepRepr_HArray1OfRepresentationItem) anArrayOfPairs = new StepRepr_HArray1OfRepresentationItem(1, aSeqOfPairs->Length()); + for (StepRepr_HSequenceOfRepresentationItem::Iterator anPairIt(aSeqOfPairs->Sequence()); anPairIt.More();anPairIt.Next()) + anArrayOfPairs->SetValue(anPairInd++,anPairIt.Value()); - Handle(StepRepr_HArray1OfRepresentationItem) aItems = - new StepRepr_HArray1OfRepresentationItem(1, myGDTAnnotations.Length()); - for (Standard_Integer i = 1; i <= aItems->Length(); i++) { - aItems->SetValue(i, myGDTAnnotations.Value(i - 1)); + // Write mechanism + aProductDefKin->Init(new TCollection_HAsciiString, Standard_False, new TCollection_HAsciiString, aGeneralDefinition->Definition()); + aKTopoStruct->Init(new TCollection_HAsciiString, anArrayOfPairs, aBaseLinkOfMech->ContextOfItems()); + StepKinematics_KinematicTopologyRepresentationSelect aTopoSelect; + aTopoSelect.SetValue(aKTopoStruct); + Handle(TDataStd_Name) aAttrName; + Handle(TCollection_HAsciiString) aHNameMechanism; + if (anItMech.Value().FindAttribute(TDataStd_Name::GetID(), aAttrName)) + aHNameMechanism = new TCollection_HAsciiString(aAttrName->Get()); + else + aHNameMechanism = new TCollection_HAsciiString(""); + StepRepr_RepresentedDefinition aPDK; + aPDK.SetValue(aProductDefKin); + aMechanism->Init(aHNameMechanism, anArrayOfPairs, aBaseLinkOfMech->ContextOfItems(), aTopoSelect); + aPropertyMechanismRepr->Init(aPDK, aMechanism, aBaseLinkOfMech); + Model->AddWithRefs(aPropertyMechanismRepr); + + // (Optional) write states + TDF_LabelSequence aSeqOfStates = aKTool->GetStates(anItMech.Value()); + for (TDF_LabelSequence::Iterator anItState(aSeqOfStates); anItState.More(); anItState.Next()) + { + Handle(StepKinematics_MechanismStateRepresentation) aStateRepr = new StepKinematics_MechanismStateRepresentation; + TDF_LabelSequence aSeqOfValues = aKTool->GetValuesOfState(anItState.Value()); + if (aSeqOfValues.IsEmpty()) + continue; + Handle(StepRepr_HArray1OfRepresentationItem) aItems = new StepRepr_HArray1OfRepresentationItem(1, aSeqOfValues.Length()); + Standard_Integer aValueInd = 1; + for (TDF_LabelSequence::Iterator anItValue(aSeqOfValues); anItValue.More(); anItValue.Next()) + { + TDF_Label aJointL = aKTool->GetJointOfValue(anItValue.Value()); + Handle(StepKinematics_KinematicJoint) aJoint; + Handle(StepKinematics_PairRepresentationRelationship) aPairReprRelationship; + if (!aMapofJoints.FindFromKey(aJointL, aJoint)) + continue; + aPairReprRelationship = Handle(StepKinematics_PairRepresentationRelationship)::DownCast(anArrayOfPairs->Value(aMapofJoints.FindIndex(aJointL))); + if (aPairReprRelationship.IsNull()) + continue; + Handle(XCAFDoc_KinematicPairValue) aKPairValueAttr; + if (!anItValue.Value().FindAttribute(XCAFDoc_KinematicPairValue::GetID(), aKPairValueAttr)) + continue; + Handle(TCollection_HAsciiString) aNameOfValue; + Handle(TDataStd_Name) aNameAttr; + if (anItValue.Value().FindAttribute(TDataStd_Name::GetID(), aNameAttr)) + aNameOfValue = new TCollection_HAsciiString(aNameAttr->Get()); + else + aNameOfValue = new TCollection_HAsciiString(""); + Handle(XCAFKinematics_PairValueObject) aPairValueObject = aKPairValueAttr->GetObject(); + Handle(StepKinematics_PairValue) aPairValue; + if (!createKinematicPairValue(aPairValueObject, aPairReprRelationship, aPairValue)) + continue; + aPairValue->SetName(aNameOfValue); + aItems->SetValue(aValueInd++, aPairValue); + } + if (aValueInd == 1) + continue; + Handle(TCollection_HAsciiString) aNameOfState; + Handle(TDataStd_Name) aNameAttr; + if (anItState.Value().FindAttribute(TDataStd_Name::GetID(), aNameAttr)) + aNameOfState = new TCollection_HAsciiString(aNameAttr->Get()); + else + aNameOfState = new TCollection_HAsciiString(""); + aStateRepr->Init(aNameOfState, aItems, aMechanism->ContextOfItems(), aMechanism); + Model->AddWithRefs(aStateRepr); + } } - myGDTPresentationDM->Init(new TCollection_HAsciiString(), aItems, aRC); - aModel->AddWithRefs(myGDTPresentationDM); return Standard_True; } diff --git a/src/XCAFKinematics/XCAFKinematics_HighOrderPairObject.cxx b/src/XCAFKinematics/XCAFKinematics_HighOrderPairObject.cxx index 8fa2944547..abcda5eb29 100644 --- a/src/XCAFKinematics/XCAFKinematics_HighOrderPairObject.cxx +++ b/src/XCAFKinematics/XCAFKinematics_HighOrderPairObject.cxx @@ -63,12 +63,12 @@ void XCAFKinematics_HighOrderPairObject::SetType(const XCAFKinematics_PairType t break; } case XCAFKinematics_PairType_SlidingSurface: { - myLimits = NULL; + myLimits = new TColStd_HArray1OfReal(1, 2); myGeom = NCollection_Array1(1, 2); break; } case XCAFKinematics_PairType_RollingSurface: { - myLimits = NULL; + myLimits = new TColStd_HArray1OfReal(1, 2); myGeom = NCollection_Array1(1, 2); break; }