1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-29 14:00:49 +03:00

Compare commits

..

1 Commits

Author SHA1 Message Date
kgv
3a0ab2bfb1 0032819: Data Exchange - VrmlAPI_Writer does not write all colors
VrmlData_ShapeConvert::addShape() - fixed handling of colors assigned to Compound instead of a Face.
RWMesh_FaceIterator is now used to dispatch colors and skip Faces without triangulation.
2022-02-09 23:33:47 +03:00
5 changed files with 102 additions and 211 deletions

View File

@@ -148,15 +148,14 @@ void BRepCheck_Edge::Minimum()
BRepCheck::Add(lst,BRepCheck_InvalidRange); BRepCheck::Add(lst,BRepCheck_InvalidRange);
} }
else { else {
IsCurve3D = myCref->IsCurve3D(); if (myCref->IsCurve3D()) {
if (IsCurve3D) {
// eap 6 Jun 2002 occ332 // eap 6 Jun 2002 occ332
// better transform C3d instead of transforming Surf upto C3d initial location, // better transform C3d instead of transforming Surf upto C3d initial location,
// on transformed BSpline surface 'same parameter' may seem wrong // on transformed BSpline surface 'same parameter' may seem wrong
TopLoc_Location L = myShape.Location() * myCref->Location(); TopLoc_Location L = myShape.Location() * myCref->Location();
Handle(Geom_Curve) C3d = Handle(Geom_Curve)::DownCast Handle(Geom_Curve) C3d = Handle(Geom_Curve)::DownCast
(myCref->Curve3D()->Transformed (myCref->Curve3D()->Transformed
(/*myCref->Location()*/L.Transformation())); (/*myCref->Location()*/L.Transformation()));
Standard_Boolean IsPeriodic = C3d->IsPeriodic(); Standard_Boolean IsPeriodic = C3d->IsPeriodic();
Standard_Real aPeriod = RealLast(); Standard_Real aPeriod = RealLast();
if(IsPeriodic) if(IsPeriodic)
@@ -187,8 +186,9 @@ void BRepCheck_Edge::Minimum()
} }
else else
{ {
TopoDS_Shape aShape; GeomAdaptor_Curve GAC3d(C3d, C3d->TransformedParameter(First, L.Transformation()),
myHCurve = GetEdgeCurve(aShape); C3d->TransformedParameter(Last, L.Transformation()));
myHCurve = new GeomAdaptor_Curve(GAC3d);
} }
} }
else { // curve on surface else { // curve on surface
@@ -226,8 +226,11 @@ void BRepCheck_Edge::Minimum()
} }
else else
{ {
TopoDS_Shape aShape; Handle(GeomAdaptor_Surface) GAHSref = new GeomAdaptor_Surface(Sref);
myHCurve = GetEdgeCurve(aShape); Handle(Geom2dAdaptor_Curve) GHPCref =
new Geom2dAdaptor_Curve(PCref,First,Last);
Adaptor3d_CurveOnSurface ACSref(GHPCref,GAHSref);
myHCurve = new Adaptor3d_CurveOnSurface(ACSref);
} }
} }
} }
@@ -298,7 +301,6 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
return; return;
} }
// Modified by skv - Tue Apr 27 11:48:14 2004 End // Modified by skv - Tue Apr 27 11:48:14 2004 End
myHCurve = GetEdgeCurve(S);
Standard_Real First = myHCurve->FirstParameter(); Standard_Real First = myHCurve->FirstParameter();
Standard_Real Last = myHCurve->LastParameter(); Standard_Real Last = myHCurve->LastParameter();
@@ -370,7 +372,7 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
Handle(Geom_Surface) Sb = cr->Surface(); Handle(Geom_Surface) Sb = cr->Surface();
Sb = Handle(Geom_Surface)::DownCast Sb = Handle(Geom_Surface)::DownCast
// (Su->Transformed(L.Transformation())); // (Su->Transformed(L.Transformation()));
(Su->Transformed(/*L*/TFloc.Transformation())); (Su->Transformed(/*L*/(Floc * TFloc).Transformation()));
Handle(Geom2d_Curve) PC = cr->PCurve(); Handle(Geom2d_Curve) PC = cr->PCurve();
Handle(GeomAdaptor_Surface) GAHS = new GeomAdaptor_Surface(Sb); Handle(GeomAdaptor_Surface) GAHS = new GeomAdaptor_Surface(Sb);
Handle(Geom2dAdaptor_Curve) GHPC = new Geom2dAdaptor_Curve(PC,f,l); Handle(Geom2dAdaptor_Curve) GHPC = new Geom2dAdaptor_Curve(PC,f,l);
@@ -438,7 +440,7 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
// plan en position // plan en position
if (myGctrl) { if (myGctrl) {
P = Handle(Geom_Plane):: P = Handle(Geom_Plane)::
DownCast(P->Transformed(/*L*/TFloc.Transformation()));// eap occ332 DownCast(P->Transformed(/*L*/(Floc * TFloc).Transformation()));// eap occ332
//on projette Cref sur ce plan //on projette Cref sur ce plan
Handle(GeomAdaptor_Surface) GAHS = new GeomAdaptor_Surface(P); Handle(GeomAdaptor_Surface) GAHS = new GeomAdaptor_Surface(P);
@@ -546,64 +548,6 @@ Standard_Boolean BRepCheck_Edge::GeometricControls() const
return myGctrl; return myGctrl;
} }
//=======================================================================
//function : GetEdgeCurve
//purpose :
//=======================================================================
Handle(Adaptor3d_Curve) BRepCheck_Edge::GetEdgeCurve(const TopoDS_Shape& theShape)
{
Handle(Adaptor3d_Curve) aLocalCurve;
Handle(BRep_GCurve) GCref(Handle(BRep_GCurve)::DownCast(myCref));
Standard_Real First, Last;
GCref->Range(First, Last);
if (IsCurve3D)
{
TopLoc_Location L = myShape.Location() * myCref->Location();
Handle(Geom_Curve) C3d;
if (!theShape.IsNull())
{
C3d = Handle(Geom_Curve)::DownCast
(myCref->Curve3D()->Transformed
(/*myCref->Location()*/L.Predivided(theShape.Location()).Transformation()));
}
else
{
C3d = Handle(Geom_Curve)::DownCast
(myCref->Curve3D()->Transformed
(/*myCref->Location()*/L.Transformation()));
}
GeomAdaptor_Curve GAC3d(C3d, C3d->TransformedParameter(First, L.Transformation()),
C3d->TransformedParameter(Last, L.Transformation()));
aLocalCurve = new GeomAdaptor_Curve(GAC3d);
}
else
{
Handle(Geom_Surface) Sref = myCref->Surface();
if (!theShape.IsNull())
{
Sref = Handle(Geom_Surface)::DownCast
(Sref->Transformed(myCref->Location().Predivided(theShape.Location()).Transformation()));
}
else
{
Sref = Handle(Geom_Surface)::DownCast
(Sref->Transformed(myCref->Location().Transformation()));
}
const Handle(Geom2d_Curve)& PCref = myCref->PCurve();
Handle(GeomAdaptor_Surface) GAHSref = new GeomAdaptor_Surface(Sref);
Handle(Geom2dAdaptor_Curve) GHPCref =
new Geom2dAdaptor_Curve(PCref, First, Last);
Adaptor3d_CurveOnSurface ACSref(GHPCref, GAHSref);
aLocalCurve = new Adaptor3d_CurveOnSurface(ACSref);
}
return aLocalCurve;
}
//======================================================================= //=======================================================================
//function : SetStatus //function : SetStatus
//purpose : //purpose :

View File

@@ -45,11 +45,6 @@ public:
Standard_EXPORT Standard_Boolean GeometricControls() const; Standard_EXPORT Standard_Boolean GeometricControls() const;
//! Creates a 3d curve or surface on a curve by subtracting the location of the face
//! @param[in] theShape input shape to get the location from it
//! @return a 3d curve or curve on a surface
Standard_EXPORT Handle(Adaptor3d_Curve) GetEdgeCurve(const TopoDS_Shape& theShape);
Standard_EXPORT void GeometricControls (const Standard_Boolean B); Standard_EXPORT void GeometricControls (const Standard_Boolean B);
Standard_EXPORT Standard_Real Tolerance(); Standard_EXPORT Standard_Real Tolerance();
@@ -86,7 +81,6 @@ private:
Handle(Adaptor3d_Curve) myHCurve; Handle(Adaptor3d_Curve) myHCurve;
Standard_Boolean myGctrl; Standard_Boolean myGctrl;
Standard_Boolean myIsExactMethod; Standard_Boolean myIsExactMethod;
Standard_Boolean IsCurve3D;
}; };
#endif // _BRepCheck_Edge_HeaderFile #endif // _BRepCheck_Edge_HeaderFile

View File

@@ -13,3 +13,4 @@ TKGeomAlgo
TKV3d TKV3d
TKLCAF TKLCAF
TKXCAF TKXCAF
TKRWMesh

View File

@@ -14,15 +14,21 @@
// commercial license or contractual agreement. // commercial license or contractual agreement.
#include <VrmlData_ShapeConvert.hxx> #include <VrmlData_ShapeConvert.hxx>
#include <VrmlData_Scene.hxx>
#include <VrmlData_Group.hxx> #include <VrmlData_Appearance.hxx>
#include <VrmlData_Coordinate.hxx> #include <VrmlData_Coordinate.hxx>
#include <VrmlData_Group.hxx>
#include <VrmlData_IndexedFaceSet.hxx> #include <VrmlData_IndexedFaceSet.hxx>
#include <VrmlData_IndexedLineSet.hxx> #include <VrmlData_IndexedLineSet.hxx>
#include <VrmlData_Scene.hxx>
#include <VrmlData_ShapeNode.hxx> #include <VrmlData_ShapeNode.hxx>
#include <BRep_Builder.hxx> #include <BRep_Builder.hxx>
#include <BRep_Tool.hxx> #include <BRep_Tool.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <Geom_Surface.hxx> #include <Geom_Surface.hxx>
#include <GeomLib.hxx>
#include <GCPnts_TangentialDeflection.hxx>
#include <NCollection_DataMap.hxx> #include <NCollection_DataMap.hxx>
#include <Poly_Triangulation.hxx> #include <Poly_Triangulation.hxx>
#include <Poly_Connect.hxx> #include <Poly_Connect.hxx>
@@ -33,7 +39,6 @@
#include <TColgp_Array1OfPnt2d.hxx> #include <TColgp_Array1OfPnt2d.hxx>
#include <TDataStd_Name.hxx> #include <TDataStd_Name.hxx>
#include <TDF_Label.hxx> #include <TDF_Label.hxx>
//#include <TDF_LabelSequence.hxx>
#include <TDocStd_Document.hxx> #include <TDocStd_Document.hxx>
#include <TopExp_Explorer.hxx> #include <TopExp_Explorer.hxx>
#include <TopoDS.hxx> #include <TopoDS.hxx>
@@ -41,14 +46,11 @@
#include <TopoDS_Face.hxx> #include <TopoDS_Face.hxx>
#include <TopoDS_Shape.hxx> #include <TopoDS_Shape.hxx>
#include <TopoDS_Wire.hxx> #include <TopoDS_Wire.hxx>
#include <GCPnts_TangentialDeflection.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <TColStd_Array1OfReal.hxx> #include <TColStd_Array1OfReal.hxx>
#include <TColStd_HArray1OfReal.hxx> #include <TColStd_HArray1OfReal.hxx>
#include <TShort_Array1OfShortReal.hxx> #include <TShort_Array1OfShortReal.hxx>
#include <GeomLib.hxx>
#include <TShort_HArray1OfShortReal.hxx> #include <TShort_HArray1OfShortReal.hxx>
#include <VrmlData_Appearance.hxx> #include <RWMesh_FaceIterator.hxx>
#include <XCAFDoc_ColorTool.hxx> #include <XCAFDoc_ColorTool.hxx>
#include <XCAFDoc_DocumentTool.hxx> #include <XCAFDoc_DocumentTool.hxx>
#include <XCAFDoc_ShapeTool.hxx> #include <XCAFDoc_ShapeTool.hxx>
@@ -575,7 +577,6 @@ Handle(VrmlData_Appearance) VrmlData_ShapeConvert::defaultMaterialEdge () const
return anAppearance; return anAppearance;
} }
//======================================================================= //=======================================================================
//function : addShape //function : addShape
//purpose : Adds the shape from the document //purpose : Adds the shape from the document
@@ -584,33 +585,18 @@ void VrmlData_ShapeConvert::addShape (const Handle(VrmlData_Group)& theParent,
const TDF_Label& theLabel, const TDF_Label& theLabel,
const Handle(TDocStd_Document)& theDoc) const Handle(TDocStd_Document)& theDoc)
{ {
Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool(theDoc->Main()); const TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(theLabel);
Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool(theDoc->Main()); Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool(theDoc->Main());
Handle(XCAFDoc_VisMaterialTool) aMatTool = XCAFDoc_DocumentTool::VisMaterialTool(theDoc->Main()); Handle(VrmlData_Group) aGroup;
Standard_Integer aNbFaces = 0;
NCollection_DataMap<TopoDS_Shape, TDF_Label> aChildShapeToLabels; for (RWMesh_FaceIterator aFaceIter (theLabel, TopLoc_Location(), true); aFaceIter.More(); aFaceIter.Next())
TDF_LabelSequence aChildLabels;
aShapeTool->GetSubShapes(theLabel, aChildLabels);
for (TDF_LabelSequence::Iterator aChildIter(aChildLabels); aChildIter.More(); aChildIter.Next())
{ {
const TDF_Label& aChildLabel = aChildIter.Value(); ++aNbFaces;
TopoDS_Shape aChildShape;
if (aShapeTool->GetShape(aChildLabel, aChildShape))
{
aChildShapeToLabels.Bind(aChildShape, aChildLabel);
}
} }
const TopoDS_Shape aShape = aShapeTool->GetShape(theLabel);
Handle(VrmlData_Group) aGroup = 0L;
TopExp_Explorer anExp(aShape, TopAbs_FACE);
Standard_Integer nbFaces = 0;
for (; anExp.More(); anExp.Next()) {
nbFaces++;
}
Handle(TDataStd_Name) aNameAttribute; Handle(TDataStd_Name) aNameAttribute;
theLabel.FindAttribute(TDataStd_Name::GetID(), aNameAttribute); theLabel.FindAttribute(TDataStd_Name::GetID(), aNameAttribute);
if (nbFaces > 1) if (aNbFaces > 1)
{ {
if (!aNameAttribute.IsNull()) if (!aNameAttribute.IsNull())
{ {
@@ -630,112 +616,88 @@ void VrmlData_ShapeConvert::addShape (const Handle(VrmlData_Group)& theParent,
} }
} }
anExp.Init(aShape, TopAbs_FACE); for (RWMesh_FaceIterator aFaceIter (theLabel, TopLoc_Location(), true); aFaceIter.More(); aFaceIter.Next())
for (; anExp.More(); anExp.Next()) { {
TopLoc_Location aLoc; TopLoc_Location aLoc;
Handle(VrmlData_Geometry) aTShapeNode = const TopoDS_Face& aFace = aFaceIter.Face();
makeTShapeNode(anExp.Current(), TopAbs_FACE, aLoc); Handle(VrmlData_Geometry) aTShapeNode = makeTShapeNode (aFace, TopAbs_FACE, aLoc);
if (!aTShapeNode.IsNull()) if (aTShapeNode.IsNull())
{ {
Handle(VrmlData_ShapeNode) aShapeNode = 0L; continue;
if (aGroup.IsNull() && !aNameAttribute.IsNull()) }
{
TCollection_AsciiString aName = aNameAttribute->Get();
aName.ChangeAll(' ', '_');
aName.ChangeAll('#', '_');
aShapeNode = new VrmlData_ShapeNode(myScene, aName.ToCString());
}
else
{
aShapeNode = new VrmlData_ShapeNode(myScene, 0L);
}
// set color Handle(VrmlData_ShapeNode) aShapeNode = 0L;
XCAFPrs_Style aStyle; if (aGroup.IsNull() && !aNameAttribute.IsNull())
Quantity_ColorRGBA aColor; {
TDF_Label aLabel, anAttribLab; TCollection_AsciiString aName = aNameAttribute->Get();
if (aChildShapeToLabels.Find (anExp.Current(), aLabel)) aName.ChangeAll(' ', '_');
{ aName.ChangeAll('#', '_');
Handle(XCAFDoc_VisMaterial) aVisMat = aMatTool->GetShapeMaterial (aLabel); aShapeNode = new VrmlData_ShapeNode(myScene, aName.ToCString());
if (!aVisMat.IsNull() }
&& !aVisMat->IsEmpty()) else
{ {
anAttribLab = aVisMat->Label(); aShapeNode = new VrmlData_ShapeNode(myScene, 0L);
aStyle.SetMaterial (aVisMat); }
}
else if (aColorTool->GetColor (aLabel, XCAFDoc_ColorSurf, anAttribLab)
|| aColorTool->GetColor (aLabel, XCAFDoc_ColorGen, anAttribLab))
{
aColorTool->GetColor (anAttribLab, aColor);
aStyle.SetColorSurf (aColor);
}
}
if (!aStyle.IsSetColorSurf()
&& aStyle.Material().IsNull())
{
Handle(XCAFDoc_VisMaterial) aVisMat = aMatTool->GetShapeMaterial (theLabel);
if (!aVisMat.IsNull()
&& !aVisMat->IsEmpty())
{
anAttribLab = aVisMat->Label();
aStyle.SetMaterial (aVisMat);
}
if (aColorTool->GetColor (theLabel, XCAFDoc_ColorSurf, anAttribLab)
|| aColorTool->GetColor (theLabel, XCAFDoc_ColorGen, anAttribLab))
{
aColorTool->GetColor (anAttribLab, aColor);
aStyle.SetColorSurf (aColor);
}
}
if (!aStyle.IsSetColorSurf()
&& aStyle.Material().IsNull())
{
aShapeNode->SetAppearance(defaultMaterialFace());
}
else
{
aShapeNode->SetAppearance (makeMaterialFromStyle (aStyle, anAttribLab));
}
myScene.AddNode(aShapeNode, theParent.IsNull() && aGroup.IsNull()); // set color
aShapeNode->SetGeometry(aTShapeNode); const XCAFPrs_Style& aStyle = aFaceIter.FaceStyle();
if (aLoc.IsIdentity()) TDF_Label anAttribLab;
if (!aStyle.Material().IsNull()
&& !aStyle.Material()->IsEmpty())
{
anAttribLab = aStyle.Material()->Label();
}
else if (aStyle.IsSetColorSurf())
{
aColorTool->FindColor (aStyle.GetColorSurfRGBA(), anAttribLab);
}
if (!aStyle.IsSetColorSurf()
&& aStyle.Material().IsNull())
{
aShapeNode->SetAppearance (defaultMaterialFace());
}
else
{
aShapeNode->SetAppearance (makeMaterialFromStyle (aStyle, anAttribLab));
}
myScene.AddNode(aShapeNode, theParent.IsNull() && aGroup.IsNull());
aShapeNode->SetGeometry(aTShapeNode);
if (aLoc.IsIdentity())
{
// Store the shape node directly into the main Group.
if (!aGroup.IsNull())
{ {
// Store the shape node directly into the main Group. aGroup->AddNode(aShapeNode);
if (!aGroup.IsNull())
{
aGroup->AddNode(aShapeNode);
}
else if (!theParent.IsNull())
{
theParent->AddNode(aShapeNode);
}
} }
else else if (!theParent.IsNull())
{ {
// Create a Transform grouping node theParent->AddNode(aShapeNode);
Handle(VrmlData_Group) aTrans = new VrmlData_Group(myScene, 0L,
Standard_True);
gp_Trsf aTrsf(aLoc);
if (fabs(myScale - 1.) > Precision::Confusion())
{
const gp_XYZ aTransl = aTrsf.TranslationPart() * myScale;
aTrsf.SetTranslationPart(aTransl);
}
aTrans->SetTransform(aTrsf);
myScene.AddNode(aTrans, theParent.IsNull() && aGroup.IsNull());
if (!aGroup.IsNull())
{
aGroup->AddNode(aTrans);
}
else if (!theParent.IsNull())
{
theParent->AddNode(aTrans);
}
// Store the shape node under the transform.
aTrans->AddNode(aShapeNode);
} }
} }
else
{
// Create a Transform grouping node
Handle(VrmlData_Group) aTrans = new VrmlData_Group (myScene, 0L, Standard_True);
gp_Trsf aTrsf(aLoc);
if (fabs(myScale - 1.) > Precision::Confusion())
{
const gp_XYZ aTransl = aTrsf.TranslationPart() * myScale;
aTrsf.SetTranslationPart(aTransl);
}
aTrans->SetTransform(aTrsf);
myScene.AddNode(aTrans, theParent.IsNull() && aGroup.IsNull());
if (!aGroup.IsNull())
{
aGroup->AddNode(aTrans);
}
else if (!theParent.IsNull())
{
theParent->AddNode(aTrans);
}
// Store the shape node under the transform.
aTrans->AddNode(aShapeNode);
}
} }
} }

View File

@@ -1,10 +0,0 @@
puts "============"
puts "0027170: Reading STEP files produces invalid shapes"
puts "============"
restore [locate_data_file bug27170_f.brep] f
fixshape result f
ttranslate result 9.68119149294e-13 217.938944319 299.700009766
checkshape result