1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/VrmlConverter/VrmlConverter_WFDeflectionShape.cxx
abv 42cf5bc1ca 0024002: Overall code and build procedure refactoring -- automatic
Automatic upgrade of OCCT code by command "occt_upgrade . -nocdl":
- WOK-generated header files from inc and sources from drv are moved to src
- CDL files removed
- All packages are converted to nocdlpack
2015-07-12 07:42:38 +03:00

298 lines
8.7 KiB
C++

// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <Bnd_Box.hxx>
#include <BRep_Tool.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepAdaptor_HSurface.hxx>
#include <BRepBndLib.hxx>
#include <gp_Pnt.hxx>
#include <Poly_PolygonOnTriangulation.hxx>
#include <Precision.hxx>
#include <Prs3d_ShapeTool.hxx>
#include <TColgp_HArray1OfVec.hxx>
#include <TopoDS_Shape.hxx>
#include <Vrml_Coordinate3.hxx>
#include <Vrml_Material.hxx>
#include <Vrml_PointSet.hxx>
#include <Vrml_Separator.hxx>
#include <VrmlConverter_DeflectionCurve.hxx>
#include <VrmlConverter_Drawer.hxx>
#include <VrmlConverter_IsoAspect.hxx>
#include <VrmlConverter_LineAspect.hxx>
#include <VrmlConverter_PointAspect.hxx>
#include <VrmlConverter_WFDeflectionRestrictedFace.hxx>
#include <VrmlConverter_WFDeflectionShape.hxx>
//=========================================================================
// function: Add
// purpose
//=========================================================================
void VrmlConverter_WFDeflectionShape::Add( Standard_OStream& anOStream,
const TopoDS_Shape& aShape,
const Handle (VrmlConverter_Drawer)& aDrawer)
{
Prs3d_ShapeTool Tool(aShape);
Standard_Real theRequestedDeflection;
if(aDrawer->TypeOfDeflection() == Aspect_TOD_RELATIVE) // TOD_RELATIVE, TOD_ABSOLUTE
{
Bnd_Box box;
BRepBndLib::AddClose(aShape, box);
Standard_Real Xmin, Xmax, Ymin, Ymax, Zmin, Zmax, diagonal;
box.Get( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax );
if (!(box.IsOpenXmin() || box.IsOpenXmax() ||
box.IsOpenYmin() || box.IsOpenYmax() ||
box.IsOpenZmin() || box.IsOpenZmax()))
{
diagonal = Sqrt ((Xmax - Xmin)*( Xmax - Xmin) + ( Ymax - Ymin)*( Ymax - Ymin) + ( Zmax - Zmin)*( Zmax - Zmin));
diagonal = Max(diagonal, Precision::Confusion());
theRequestedDeflection = aDrawer->DeviationCoefficient() * diagonal;
}
else
{
diagonal =1000000.;
theRequestedDeflection = aDrawer->DeviationCoefficient() * diagonal;
}
}
else
{
theRequestedDeflection = aDrawer->MaximalChordialDeviation();
}
//== Is not used to reach the same wireframe representation with VRML#2.0
/*if (aDrawer->UIsoAspect()->Number() != 0 ||
aDrawer->VIsoAspect()->Number() != 0 ) {
BRepAdaptor_Surface S;
Standard_Boolean isoU, isoV;
for(Tool.InitFace();Tool.MoreFace();Tool.NextFace()){
isoU = (aDrawer->UIsoAspect()->Number() != 0);
isoV = (aDrawer->VIsoAspect()->Number() != 0);
if (Tool.HasSurface()) {
if (Tool.IsPlanarFace()) {
isoU = (isoU && aDrawer->IsoOnPlane());
isoV = (isoV && aDrawer->IsoOnPlane());
}
if (isoU || isoV) {
S.Initialize(Tool.GetFace());
Handle(BRepAdaptor_HSurface) HS = new BRepAdaptor_HSurface(S);
VrmlConverter_WFDeflectionRestrictedFace::Add(anOStream, HS,
isoU, isoV,
theRequestedDeflection,
aDrawer->UIsoAspect()->Number(),
aDrawer->VIsoAspect()->Number(),
aDrawer);
}
}
}
}
else {
if (aDrawer->UIsoAspect()->Number() != 0) {
BRepAdaptor_Surface S;
for(Tool.InitFace();Tool.MoreFace();Tool.NextFace()){
Standard_Boolean isoU = Standard_True;
if (Tool.HasSurface()) {
if (Tool.IsPlanarFace()) isoU = aDrawer->IsoOnPlane();
if (isoU) {
S.Initialize(Tool.GetFace());
Handle(BRepAdaptor_HSurface) HS = new BRepAdaptor_HSurface(S);
VrmlConverter_WFDeflectionRestrictedFace::Add(anOStream, HS,
isoU, Standard_False,
theRequestedDeflection,
aDrawer->UIsoAspect()->Number(),
0,
aDrawer);
}
}
}
}
if (aDrawer->VIsoAspect()->Number() != 0) {
BRepAdaptor_Surface S;
for(Tool.InitFace();Tool.MoreFace();Tool.NextFace()){
Standard_Boolean isoV = Standard_True;
if (Tool.HasSurface()) {
if (Tool.IsPlanarFace()) isoV = aDrawer->IsoOnPlane();
if (isoV) {
S.Initialize(Tool.GetFace());
Handle(BRepAdaptor_HSurface) HS = new BRepAdaptor_HSurface(S);
VrmlConverter_WFDeflectionRestrictedFace::Add(anOStream, HS,
Standard_False, isoV,
theRequestedDeflection,
0,
aDrawer->VIsoAspect()->Number(),
aDrawer);
}
}
}
}
}*/
//====
Standard_Integer qnt=0;
for(Tool.InitCurve();Tool.MoreCurve();Tool.NextCurve())
{
qnt++;
}
Handle(Poly_PolygonOnTriangulation) aPT;
Handle(Poly_Triangulation) aT;
TopLoc_Location aL;
// cout << "Quantity of Curves = " << qnt << endl;
// Wire (without any neighbour)
if (aDrawer->WireDraw()) {
if (qnt != 0)
{
Handle(VrmlConverter_LineAspect) latmp = new VrmlConverter_LineAspect;
latmp->SetMaterial(aDrawer->LineAspect()->Material());
latmp->SetHasMaterial(aDrawer->LineAspect()->HasMaterial());
aDrawer->SetLineAspect(aDrawer->WireAspect());
for(Tool.InitCurve();Tool.MoreCurve();Tool.NextCurve()){
if (Tool.Neighbours() == 0) {
if (Tool.HasCurve()) {
BRepAdaptor_Curve C(Tool.GetCurve());
BRep_Tool::PolygonOnTriangulation(Tool.GetCurve(), aPT, aT, aL);
if (!aPT.IsNull() && !aT.IsNull() && aPT->HasParameters())
VrmlConverter_DeflectionCurve::Add(anOStream, C, aPT->Parameters(), aPT->NbNodes(), aDrawer);
else
VrmlConverter_DeflectionCurve::Add(anOStream, C, theRequestedDeflection, aDrawer);
}
}
}
aDrawer->SetLineAspect(latmp);
}
}
//end of wire
// Free boundaries;
if (aDrawer->FreeBoundaryDraw()) {
if (qnt != 0)
{
Handle(VrmlConverter_LineAspect) latmp = new VrmlConverter_LineAspect;
latmp->SetMaterial(aDrawer->LineAspect()->Material());
latmp->SetHasMaterial(aDrawer->LineAspect()->HasMaterial());
aDrawer->SetLineAspect(aDrawer->FreeBoundaryAspect());
for(Tool.InitCurve();Tool.MoreCurve();Tool.NextCurve()){
if (Tool.Neighbours() == 1) {
if (Tool.HasCurve()) {
BRepAdaptor_Curve C(Tool.GetCurve());
BRep_Tool::PolygonOnTriangulation(Tool.GetCurve(), aPT, aT, aL);
if (!aPT.IsNull() && !aT.IsNull() && aPT->HasParameters())
VrmlConverter_DeflectionCurve::Add(anOStream, C, aPT->Parameters(), aPT->NbNodes(), aDrawer);
else
VrmlConverter_DeflectionCurve::Add(anOStream, C, theRequestedDeflection, aDrawer);
}
}
}
aDrawer->SetLineAspect(latmp);
}
}
// end of Free boundaries
// Unfree boundaries;
if (aDrawer->UnFreeBoundaryDraw()) {
if (qnt != 0)
{
Handle(VrmlConverter_LineAspect) latmp = new VrmlConverter_LineAspect;
latmp->SetMaterial(aDrawer->LineAspect()->Material());
latmp->SetHasMaterial(aDrawer->LineAspect()->HasMaterial());
aDrawer->SetLineAspect(aDrawer->UnFreeBoundaryAspect());
for(Tool.InitCurve();Tool.MoreCurve();Tool.NextCurve()){
if (Tool.Neighbours() >= 2) {
if (Tool.HasCurve()) {
BRepAdaptor_Curve C(Tool.GetCurve());
BRep_Tool::PolygonOnTriangulation(Tool.GetCurve(), aPT, aT, aL);
if (!aPT.IsNull() && !aT.IsNull() && aPT->HasParameters())
VrmlConverter_DeflectionCurve::Add(anOStream, C, aPT->Parameters(), aPT->NbNodes(), aDrawer);
else
VrmlConverter_DeflectionCurve::Add(anOStream, C, theRequestedDeflection, aDrawer);
}
}
}
aDrawer->SetLineAspect(latmp);
}
}
// end of Unfree boundaries
// Points
qnt=0;
for(Tool.InitVertex();Tool.MoreVertex();Tool.NextVertex())
{
qnt++;
}
// cout << "Quantity of Vertexes = " << qnt << endl;
if (qnt != 0)
{
Handle(TColgp_HArray1OfVec) HAV = new TColgp_HArray1OfVec(1,qnt);
gp_Vec V;
gp_Pnt P;
Standard_Integer i=0;
for(Tool.InitVertex();Tool.MoreVertex();Tool.NextVertex())
{
i++;
P = BRep_Tool::Pnt(Tool.GetVertex());
V.SetX(P.X()); V.SetY(P.Y()); V.SetZ(P.Z());
HAV->SetValue (i,V);
}
Handle(VrmlConverter_PointAspect) PA = new VrmlConverter_PointAspect;
PA = aDrawer->PointAspect();
// Separator P {
Vrml_Separator SEP;
SEP.Print(anOStream);
// Material
if (PA->HasMaterial()){
Handle(Vrml_Material) MP;
MP = PA->Material();
MP->Print(anOStream);
}
// Coordinate3
Handle(Vrml_Coordinate3) C3 = new Vrml_Coordinate3(HAV);
C3->Print(anOStream);
// PointSet
Vrml_PointSet PS;
PS.Print(anOStream);
// Separator P }
SEP.Print(anOStream);
}
}