1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-16 10:08:36 +03:00
occt/src/TDataXtd/TDataXtd_Triangulation.cxx

323 lines
12 KiB
C++

// Created on: 2016-11-10
// Created by: Anton KOZULIN
// Copyright (c) 2016 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 <TDataXtd_Triangulation.hxx>
#include <Standard_GUID.hxx>
#include <Standard_Type.hxx>
#include <TDF_Attribute.hxx>
#include <TDF_Label.hxx>
#include <TDF_RelocationTable.hxx>
//=======================================================================
//function : GetID
//purpose : Returns the ID of the triangulation attribute.
//=======================================================================
const Standard_GUID& TDataXtd_Triangulation::GetID()
{
static Standard_GUID TDataXtd_TriangulationID ("27AE2C44-60B0-41AE-AC18-BA3FDA538D03");
return TDataXtd_TriangulationID;
}
//=======================================================================
//function : Set
//purpose : Finds or creates a triangulation attribute.
//=======================================================================
Handle(TDataXtd_Triangulation) TDataXtd_Triangulation::Set(const TDF_Label& theLabel)
{
Handle(TDataXtd_Triangulation) A;
if (!theLabel.FindAttribute (TDataXtd_Triangulation::GetID(), A))
{
A = new TDataXtd_Triangulation;
theLabel.AddAttribute(A);
}
return A;
}
//=======================================================================
//function : Set
//purpose : Finds or creates a triangulation attribute.
// Initializes the attribute by a Poly_Triangulation object.
//=======================================================================
Handle(TDataXtd_Triangulation) TDataXtd_Triangulation::Set(const TDF_Label& theLabel, const Handle(Poly_Triangulation)& theMesh)
{
Handle(TDataXtd_Triangulation) M = TDataXtd_Triangulation::Set(theLabel);
M->Set(theMesh);
return M;
}
//=======================================================================
//function : TDataXtd_Triangulation
//purpose : A constructor.
// Don't use it directly,
// use please the static method Set(),
// which returns the attribute attached to a label.
//=======================================================================
TDataXtd_Triangulation::TDataXtd_Triangulation()
{
}
//=======================================================================
//function : TDataXtd_Triangulation
//purpose : Sets the triangulation.
//=======================================================================
void TDataXtd_Triangulation::Set(const Handle(Poly_Triangulation)& theTriangulation)
{
Backup();
myTriangulation = theTriangulation;
}
//=======================================================================
//function : TDataXtd_Triangulation
//purpose : Returns the underlying mesh.
//=======================================================================
const Handle(Poly_Triangulation)& TDataXtd_Triangulation::Get() const
{
return myTriangulation;
}
// Poly_Triangulation methods
// The methods are "covered" by this attribute to prevent direct modification of the mesh.
// There is no performance problem to call Poly_Triangulation method through this attribute.
// The most of the methods are considered as "inline" by the compiler in release mode.
//=======================================================================
//function : Deflection
//purpose : Returns the deflection of this triangulation.
//=======================================================================
Standard_Real TDataXtd_Triangulation::Deflection() const
{
return myTriangulation->Deflection();
}
//=======================================================================
//function : Deflection
//purpose : Sets the deflection of this triangulation to theDeflection.
// See more on deflection in Polygon2D
//=======================================================================
void TDataXtd_Triangulation::Deflection (const Standard_Real theDeflection)
{
Backup();
myTriangulation->Deflection(theDeflection);
}
//=======================================================================
//function : RemoveUVNodes
//purpose : Deallocates the UV nodes.
//=======================================================================
void TDataXtd_Triangulation::RemoveUVNodes()
{
Backup();
myTriangulation->RemoveUVNodes();
}
//=======================================================================
//function : NbNodes
//purpose : return the number of nodes for this triangulation.
//=======================================================================
Standard_Integer TDataXtd_Triangulation::NbNodes() const
{
return myTriangulation->NbNodes();
}
//=======================================================================
//function : NbTriangles
//purpose : return the number of triangles for this triangulation.
//=======================================================================
Standard_Integer TDataXtd_Triangulation::NbTriangles() const
{
return myTriangulation->NbTriangles();
}
//=======================================================================
//function : HasUVNodes
//purpose : return Standard_True if 2D nodes are associated with 3D nodes for this triangulation.
//=======================================================================
Standard_Boolean TDataXtd_Triangulation::HasUVNodes() const
{
return myTriangulation->HasUVNodes();
}
//=======================================================================
//function : Node
//purpose : return node at the given index.
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
//=======================================================================
const gp_Pnt& TDataXtd_Triangulation::Node (const Standard_Integer theIndex) const
{
return myTriangulation->Node(theIndex);
}
//=======================================================================
//function : SetNode
//purpose : The method differs from Poly_Triangulation
// Sets a node at the given index.
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
//=======================================================================
void TDataXtd_Triangulation::SetNode (const Standard_Integer theIndex, const gp_Pnt& theNode)
{
Backup();
myTriangulation->ChangeNode(theIndex) = theNode;
}
//=======================================================================
//function : UVNode
//purpose : return UVNode at the given index.
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
//=======================================================================
const gp_Pnt2d& TDataXtd_Triangulation::UVNode (const Standard_Integer theIndex) const
{
return myTriangulation->UVNode(theIndex);
}
//=======================================================================
//function : SetUVNode
//purpose : The method differs from Poly_Triangulation
// Sets a UVNode at the given index.
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
//=======================================================================
void TDataXtd_Triangulation::SetUVNode (const Standard_Integer theIndex, const gp_Pnt2d& theUVNode)
{
Backup();
myTriangulation->ChangeUVNode(theIndex) = theUVNode;
}
//=======================================================================
//function : Triangle
//purpose : return triangle at the given index.
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
//=======================================================================
const Poly_Triangle& TDataXtd_Triangulation::Triangle (const Standard_Integer theIndex) const
{
return myTriangulation->Triangle(theIndex);
}
//=======================================================================
//function : SetTriangle
//purpose : The method differs from Poly_Triangulation
// Sets a triangle at the given index.
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
//=======================================================================
void TDataXtd_Triangulation::SetTriangle (const Standard_Integer theIndex, const Poly_Triangle& theTriangle)
{
Backup();
myTriangulation->ChangeTriangle(theIndex) = theTriangle;
}
//=======================================================================
//function : SetNormals
//purpose : Sets the table of node normals.
// Raises exception if length of theNormals = 3 * NbNodes
//=======================================================================
void TDataXtd_Triangulation::SetNormals (const Handle(TShort_HArray1OfShortReal)& theNormals)
{
Backup();
myTriangulation->SetNormals(theNormals);
}
//=======================================================================
//function : SetNormal
//purpose : Changes normal at the given index.
// Raises Standard_OutOfRange exception.
//=======================================================================
void TDataXtd_Triangulation::SetNormal (const Standard_Integer theIndex,
const gp_Dir& theNormal)
{
Backup();
myTriangulation->SetNormal(theIndex, theNormal);
}
//=======================================================================
//function : HasNormals
//purpose : Returns Standard_True if nodal normals are defined.
//=======================================================================
Standard_Boolean TDataXtd_Triangulation::HasNormals() const
{
return myTriangulation->HasNormals();
}
//=======================================================================
//function : Normal
//purpose : return normal at the given index.
// Raises Standard_OutOfRange exception.
//=======================================================================
const gp_Dir TDataXtd_Triangulation::Normal (const Standard_Integer theIndex) const
{
return myTriangulation->Normal(theIndex);
}
//=======================================================================
//function : ID
//purpose :
//=======================================================================
const Standard_GUID& TDataXtd_Triangulation::ID () const
{
return GetID();
}
//=======================================================================
//function : NewEmpty
//purpose :
//=======================================================================
Handle(TDF_Attribute) TDataXtd_Triangulation::NewEmpty () const
{
return new TDataXtd_Triangulation();
}
//=======================================================================
//function : Restore
//purpose :
//=======================================================================
void TDataXtd_Triangulation::Restore(const Handle(TDF_Attribute)& theAttribute)
{
myTriangulation.Nullify();
Handle(TDataXtd_Triangulation) M = Handle(TDataXtd_Triangulation)::DownCast(theAttribute);
if (!M->myTriangulation.IsNull())
{
Handle(Poly_Triangulation) T = M->myTriangulation->Copy();
if (!T.IsNull())
myTriangulation = T;
}
}
//=======================================================================
//function : Paste
//purpose :
//=======================================================================
void TDataXtd_Triangulation::Paste (const Handle(TDF_Attribute)& theIntoAttribute,
const Handle(TDF_RelocationTable)& ) const
{
Handle(TDataXtd_Triangulation) M = Handle(TDataXtd_Triangulation)::DownCast(theIntoAttribute);
M->myTriangulation.Nullify();
if (!myTriangulation.IsNull())
{
Handle(Poly_Triangulation) T = myTriangulation->Copy();
if (!T.IsNull())
M->myTriangulation = T;
}
}
//=======================================================================
//function : Dump
//purpose :
//=======================================================================
Standard_OStream& TDataXtd_Triangulation::Dump (Standard_OStream& anOS) const
{
anOS << "Triangulation";
//TODO: Make a good dump.
return anOS;
}