本文整理汇总了C++中TopLoc_Location::IsIdentity方法的典型用法代码示例。如果您正苦于以下问题:C++ TopLoc_Location::IsIdentity方法的具体用法?C++ TopLoc_Location::IsIdentity怎么用?C++ TopLoc_Location::IsIdentity使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TopLoc_Location
的用法示例。
在下文中一共展示了TopLoc_Location::IsIdentity方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Handle
void
GEOM_ShadingFace::
OCC2VTK(const TopoDS_Face& theFace,
vtkPolyData* thePolyData,
vtkPoints* thePts)
{
TopLoc_Location aLoc;
Handle(Poly_Triangulation) aPoly = BRep_Tool::Triangulation(theFace,aLoc);
if(aPoly.IsNull())
return;
else{
gp_Trsf myTransf;
Standard_Boolean identity = true;
if(!aLoc.IsIdentity()){
identity = false;
myTransf = aLoc.Transformation();
}
Standard_Integer i;
int aNbOfNodes = thePts->GetNumberOfPoints();
const TColgp_Array1OfPnt& Nodes = aPoly->Nodes();
Standard_Integer nbNodesInFace = aPoly->NbNodes();
for(i = 1; i <= nbNodesInFace; i++) {
gp_Pnt P = Nodes(i);
if(!identity)
P.Transform(myTransf);
thePts->InsertNextPoint(P.X(),P.Y(),P.Z());
}
const Poly_Array1OfTriangle& Triangles = aPoly->Triangles();
Standard_Integer nbTriInFace = aPoly->NbTriangles();
for(i = 1; i <= nbTriInFace; i++){
// Get the triangle
Standard_Integer N1,N2,N3;
Triangles(i).Get(N1,N2,N3);
N1 += aNbOfNodes - 1;
N2 += aNbOfNodes - 1;
N3 += aNbOfNodes - 1;
vtkIdType anIds[3] = {N1, N2, N3};
thePolyData->InsertNextCell(VTK_TRIANGLE,3,anIds);
}
}
}
示例2: edgeConstruct
void ShapeGeometryBuilder::edgeConstruct(const TopoDS_Edge &edgeIn)
{
TopoDS_Face face = TopoDS::Face(edgeToFace.FindFromKey(edgeIn).First());
if (face.IsNull())
throw std::runtime_error("face is null in edge construction");
TopLoc_Location location;
Handle(Poly_Triangulation) triangulation;
triangulation = BRep_Tool::Triangulation(face, location);
const Handle(Poly_PolygonOnTriangulation) &segments =
BRep_Tool::PolygonOnTriangulation(edgeIn, triangulation, location);
if (segments.IsNull())
throw std::runtime_error("edge triangulation is null in edge construction");
gp_Trsf transformation;
bool identity = true;
if(!location.IsIdentity())
{
identity = false;
transformation = location.Transformation();
}
const TColStd_Array1OfInteger& indexes = segments->Nodes();
const TColgp_Array1OfPnt& nodes = triangulation->Nodes();
osg::Vec3Array *vertices = dynamic_cast<osg::Vec3Array *>(edgeGeometry->getVertexArray());
osg::Vec4Array *colors = dynamic_cast<osg::Vec4Array *>(edgeGeometry->getColorArray());
osg::ref_ptr<osg::DrawElementsUInt> indices = new osg::DrawElementsUInt
(GL_LINE_STRIP, indexes.Length());
osg::BoundingSphere bSphere;
for (int index(indexes.Lower()); index < indexes.Upper() + 1; ++index)
{
gp_Pnt point = nodes(indexes(index));
if(!identity)
point.Transform(transformation);
vertices->push_back(osg::Vec3(point.X(), point.Y(), point.Z()));
colors->push_back(edgeGeometry->getColor());
(*indices)[index - 1] = vertices->size() - 1;
if (!bSphere.valid()) //for first one.
{
bSphere.center() = vertices->back();
bSphere.radius() = 0.0;
}
else
bSphere.expandBy(vertices->back());
}
edgeGeometry->addPrimitiveSet(indices.get());
boost::uuids::uuid id = seerShape->findShapeIdRecord(edgeIn).id;
std::size_t lastPrimitiveIndex = edgeGeometry->getNumPrimitiveSets() - 1;
if (!idPSetWrapperEdge->hasId(id))
{
IdPSetRecord record;
record.id = id;
record.primitiveSetIndex = lastPrimitiveIndex;
record.bSphere = bSphere;
idPSetWrapperEdge->idPSetContainer.insert(record);
}
else
//ensure that edges have the same primitive index between lod calls.
//asserts here prior to having lod implemented is probably duplicate ids
//for different geometry.
assert(lastPrimitiveIndex == idPSetWrapperEdge->findPSetFromId(id));
}
示例3: faceConstruct
void ShapeGeometryBuilder::faceConstruct(const TopoDS_Face &faceIn)
{
TopLoc_Location location;
Handle(Poly_Triangulation) triangulation;
triangulation = BRep_Tool::Triangulation(faceIn, location);
if (triangulation.IsNull())
throw std::runtime_error("null triangulation in face construction");
bool signalOrientation(false);
if (faceIn.Orientation() == TopAbs_FORWARD)
signalOrientation = true;
gp_Trsf transformation;
bool identity = true;
if(!location.IsIdentity())
{
identity = false;
transformation = location.Transformation();
}
//vertices.
const TColgp_Array1OfPnt& nodes = triangulation->Nodes();
osg::Vec3Array *vertices = dynamic_cast<osg::Vec3Array *>(faceGeometry->getVertexArray());
osg::Vec3Array *normals = dynamic_cast<osg::Vec3Array *>(faceGeometry->getNormalArray());
osg::Vec4Array *colors = dynamic_cast<osg::Vec4Array *>(faceGeometry->getColorArray());
std::size_t offset = vertices->size();
for (int index(nodes.Lower()); index < nodes.Upper() + 1; ++index)
{
gp_Pnt point = nodes.Value(index);
if(!identity)
point.Transform(transformation);
vertices->push_back(osg::Vec3(point.X(), point.Y(), point.Z()));
normals->push_back(osg::Vec3(0.0, 0.0, 0.0));
colors->push_back(faceGeometry->getColor());
}
const Poly_Array1OfTriangle& triangles = triangulation->Triangles();
osg::ref_ptr<osg::DrawElementsUInt> indices = new osg::DrawElementsUInt
(GL_TRIANGLES, triangulation->NbTriangles() * 3);
for (int index(triangles.Lower()); index < triangles.Upper() + 1; ++index)
{
int N1, N2, N3;
triangles(index).Get(N1, N2, N3);
int factor = (index - 1) * 3;
if (!signalOrientation)
{
(*indices)[factor] = N3 - 1 + offset;
(*indices)[factor + 1] = N2 - 1 + offset;
(*indices)[factor + 2] = N1 - 1 + offset;
}
else
{
(*indices)[factor] = N1 - 1 + offset;
(*indices)[factor + 1] = N2 - 1 + offset;
(*indices)[factor + 2] = N3 - 1 + offset;
}
//store primitiveset index and vertex indes into map.
PSetVertexRecord record;
record.primitiveSetIndex = faceGeometry->getNumPrimitiveSets();
record.vertexIndex = (*indices)[factor];
pSetTriangleWrapper->pSetVertexContainer.insert(record);
record.vertexIndex = (*indices)[factor + 1];
pSetTriangleWrapper->pSetVertexContainer.insert(record);
record.vertexIndex = (*indices)[factor + 2];
pSetTriangleWrapper->pSetVertexContainer.insert(record);
//now that we are combining faces into one geometry, osgUtil SmoothingVisitor
//wants to 'average' out normals across faces. so we go back to manual calculation
//of surface normals.
osg::Vec3 pointOne(vertices->at((*indices)[factor]));
osg::Vec3 pointTwo(vertices->at((*indices)[factor + 1]));
osg::Vec3 pointThree(vertices->at((*indices)[factor + 2]));
osg::Vec3 axisOne(pointTwo - pointOne);
osg::Vec3 axisTwo(pointThree - pointOne);
osg::Vec3 currentNormal(axisOne ^ axisTwo);
if (currentNormal.isNaN())
continue;
currentNormal.normalize();
osg::Vec3 tempNormal;
tempNormal = (*normals)[(*indices)[factor]];
tempNormal += currentNormal;
tempNormal.normalize();
(*normals)[(*indices)[factor]] = tempNormal;
tempNormal = (*normals)[(*indices)[factor + 1]];
tempNormal += currentNormal;
tempNormal.normalize();
(*normals)[(*indices)[factor + 1]] = tempNormal;
//.........这里部分代码省略.........
示例4: recomputeFeature
//.........这里部分代码省略.........
nbrTriangles += mesh->NbTriangles();
nbrNodes += mesh->NbNodes();
}
}
// create memory for the nodes and indexes
SoCoordinate3* rejectedCoords = new SoCoordinate3();
rejectedCoords ->point .setNum(nbrNodes);
SoNormal* rejectedNorms = new SoNormal();
rejectedNorms ->vector .setNum(nbrNodes);
SoIndexedFaceSet* rejectedFaceSet = new SoIndexedFaceSet();
rejectedFaceSet ->coordIndex .setNum(nbrTriangles*4);
// get the raw memory for fast fill up
SbVec3f* verts = rejectedCoords ->point .startEditing();
SbVec3f* norms = rejectedNorms ->vector .startEditing();
int32_t* index = rejectedFaceSet ->coordIndex .startEditing();
// preset the normal vector with null vector
for (int i=0; i < nbrNodes; i++)
norms[i]= SbVec3f(0.0,0.0,0.0);
int ii = 0,FaceNodeOffset=0,FaceTriaOffset=0;
for (Ex.Init(cShape, TopAbs_FACE); Ex.More(); Ex.Next(),ii++) {
TopLoc_Location aLoc;
const TopoDS_Face &actFace = TopoDS::Face(Ex.Current());
// get the mesh of the shape
Handle (Poly_Triangulation) mesh = BRep_Tool::Triangulation(actFace,aLoc);
if (mesh.IsNull()) continue;
// getting the transformation of the shape/face
gp_Trsf myTransf;
Standard_Boolean identity = true;
if (!aLoc.IsIdentity()) {
identity = false;
myTransf = aLoc.Transformation();
}
// getting size of node and triangle array of this face
int nbNodesInFace = mesh->NbNodes();
int nbTriInFace = mesh->NbTriangles();
// check orientation
TopAbs_Orientation orient = actFace.Orientation();
// cycling through the poly mesh
const Poly_Array1OfTriangle& Triangles = mesh->Triangles();
const TColgp_Array1OfPnt& Nodes = mesh->Nodes();
for (int g=1; g <= nbTriInFace; g++) {
// Get the triangle
Standard_Integer N1,N2,N3;
Triangles(g).Get(N1,N2,N3);
// change orientation of the triangle if the face is reversed
if ( orient != TopAbs_FORWARD ) {
Standard_Integer tmp = N1;
N1 = N2;
N2 = tmp;
}
// get the 3 points of this triangle
gp_Pnt V1(Nodes(N1)), V2(Nodes(N2)), V3(Nodes(N3));
// transform the vertices to the place of the face
if (!identity) {
V1.Transform(myTransf);
V2.Transform(myTransf);
示例5: transferToArray
void PovTools::transferToArray(const TopoDS_Face& aFace,gp_Vec** vertices,gp_Vec** vertexnormals, long** cons,int &nbNodesInFace,int &nbTriInFace )
{
TopLoc_Location aLoc;
// doing the meshing and checking the result
//BRepMesh_IncrementalMesh MESH(aFace,fDeflection);
Handle(Poly_Triangulation) aPoly = BRep_Tool::Triangulation(aFace,aLoc);
if (aPoly.IsNull()) {
Base::Console().Log("Empty face trianglutaion\n");
nbNodesInFace =0;
nbTriInFace = 0;
vertices = 0l;
cons = 0l;
return;
}
// getting the transformation of the shape/face
gp_Trsf myTransf;
Standard_Boolean identity = true;
if (!aLoc.IsIdentity()) {
identity = false;
myTransf = aLoc.Transformation();
}
Standard_Integer i;
// getting size and create the array
nbNodesInFace = aPoly->NbNodes();
nbTriInFace = aPoly->NbTriangles();
*vertices = new gp_Vec[nbNodesInFace];
*vertexnormals = new gp_Vec[nbNodesInFace];
for (i=0; i < nbNodesInFace; i++) {
(*vertexnormals)[i]= gp_Vec(0.0,0.0,0.0);
}
*cons = new long[3*(nbTriInFace)+1];
// check orientation
TopAbs_Orientation orient = aFace.Orientation();
// cycling through the poly mesh
const Poly_Array1OfTriangle& Triangles = aPoly->Triangles();
const TColgp_Array1OfPnt& Nodes = aPoly->Nodes();
for (i=1; i<=nbTriInFace; i++) {
// Get the triangle
Standard_Integer N1,N2,N3;
Triangles(i).Get(N1,N2,N3);
// change orientation of the triangles
if ( orient != TopAbs_FORWARD )
{
Standard_Integer tmp = N1;
N1 = N2;
N2 = tmp;
}
gp_Pnt V1 = Nodes(N1);
gp_Pnt V2 = Nodes(N2);
gp_Pnt V3 = Nodes(N3);
// transform the vertices to the place of the face
if (!identity) {
V1.Transform(myTransf);
V2.Transform(myTransf);
V3.Transform(myTransf);
}
// Calculate triangle normal
gp_Vec v1(V1.X(),V1.Y(),V1.Z()),v2(V2.X(),V2.Y(),V2.Z()),v3(V3.X(),V3.Y(),V3.Z());
gp_Vec Normal = (v2-v1)^(v3-v1);
//Standard_Real Area = 0.5 * Normal.Magnitude();
// add the triangle normal to the vertex normal for all points of this triangle
(*vertexnormals)[N1-1] += gp_Vec(Normal.X(),Normal.Y(),Normal.Z());
(*vertexnormals)[N2-1] += gp_Vec(Normal.X(),Normal.Y(),Normal.Z());
(*vertexnormals)[N3-1] += gp_Vec(Normal.X(),Normal.Y(),Normal.Z());
(*vertices)[N1-1].SetX((float)(V1.X()));
(*vertices)[N1-1].SetY((float)(V1.Y()));
(*vertices)[N1-1].SetZ((float)(V1.Z()));
(*vertices)[N2-1].SetX((float)(V2.X()));
(*vertices)[N2-1].SetY((float)(V2.Y()));
(*vertices)[N2-1].SetZ((float)(V2.Z()));
(*vertices)[N3-1].SetX((float)(V3.X()));
(*vertices)[N3-1].SetY((float)(V3.Y()));
(*vertices)[N3-1].SetZ((float)(V3.Z()));
int j = i - 1;
N1--;
N2--;
N3--;
(*cons)[3*j] = N1;
(*cons)[3*j+1] = N2;
(*cons)[3*j+2] = N3;
}
// normalize all vertex normals
for (i=0; i < nbNodesInFace; i++) {
gp_Dir clNormal;
//.........这里部分代码省略.........
示例6: DocumentObjectExecReturn
App::DocumentObjectExecReturn *RuledSurface::execute(void)
{
try {
App::DocumentObjectExecReturn* ret;
// get the first input shape
TopoDS_Shape S1;
ret = getShape(Curve1, S1);
if (ret) return ret;
// get the second input shape
TopoDS_Shape S2;
ret = getShape(Curve2, S2);
if (ret) return ret;
// check for expected type
if (S1.IsNull() || S2.IsNull())
return new App::DocumentObjectExecReturn("Linked shapes are empty.");
if (S1.ShapeType() != TopAbs_EDGE && S1.ShapeType() != TopAbs_WIRE)
return new App::DocumentObjectExecReturn("Linked shape is neither edge nor wire.");
if (S2.ShapeType() != TopAbs_EDGE && S2.ShapeType() != TopAbs_WIRE)
return new App::DocumentObjectExecReturn("Linked shape is neither edge nor wire.");
// https://forum.freecadweb.org/viewtopic.php?f=8&t=24052
//
// if both shapes are sub-elements of one common shape then the fill algorithm
// leads to problems if the shape has set a placement
// The workaround is to reset the placement before calling BRepFill and then
// applying the placement to the output shape
TopLoc_Location Loc;
if (Curve1.getValue() == Curve2.getValue()) {
Loc = S1.Location();
if (!Loc.IsIdentity() && Loc == S2.Location()) {
S1.Location(TopLoc_Location());
S2.Location(TopLoc_Location());
}
}
// make both shapes to have the same type
Standard_Boolean isWire = Standard_False;
if (S1.ShapeType() == TopAbs_WIRE)
isWire = Standard_True;
if (isWire) {
if (S2.ShapeType() == TopAbs_EDGE)
S2 = BRepLib_MakeWire(TopoDS::Edge(S2));
}
else {
// S1 is an edge, if S2 is a wire convert S1 to a wire, too
if (S2.ShapeType() == TopAbs_WIRE) {
S1 = BRepLib_MakeWire(TopoDS::Edge(S1));
isWire = Standard_True;
}
}
if (Orientation.getValue() == 0) {
// Automatic
Handle(Adaptor3d_HCurve) a1;
Handle(Adaptor3d_HCurve) a2;
if (!isWire) {
BRepAdaptor_Curve adapt1(TopoDS::Edge(S1));
BRepAdaptor_Curve adapt2(TopoDS::Edge(S2));
a1 = new BRepAdaptor_HCurve(adapt1);
a2 = new BRepAdaptor_HCurve(adapt2);
}
else {
BRepAdaptor_CompCurve adapt1(TopoDS::Wire(S1));
BRepAdaptor_CompCurve adapt2(TopoDS::Wire(S2));
a1 = new BRepAdaptor_HCompCurve(adapt1);
a2 = new BRepAdaptor_HCompCurve(adapt2);
}
if (!a1.IsNull() && !a2.IsNull()) {
// get end points of 1st curve
Standard_Real first, last;
first = a1->FirstParameter();
last = a1->LastParameter();
if (S1.Closed())
last = (first + last)/2;
gp_Pnt p1 = a1->Value(first);
gp_Pnt p2 = a1->Value(last);
if (S1.Orientation() == TopAbs_REVERSED) {
std::swap(p1, p2);
}
// get end points of 2nd curve
first = a2->FirstParameter();
last = a2->LastParameter();
if (S2.Closed())
last = (first + last)/2;
gp_Pnt p3 = a2->Value(first);
gp_Pnt p4 = a2->Value(last);
if (S2.Orientation() == TopAbs_REVERSED) {
std::swap(p3, p4);
}
// Form two triangles (P1,P2,P3) and (P4,P3,P2) and check their normals.
// If the dot product is negative then it's assumed that the resulting face
//.........这里部分代码省略.........
示例7: updateVisual
//.........这里部分代码省略.........
indxVector.reserve(nbrEdges*8);
// handling of the vertices
TopTools_IndexedMapOfShape V;
TopExp::MapShapes(cShape, TopAbs_VERTEX, V);
nbrNodes += V.Extent();
// create memory for the nodes and indexes
coords ->point .setNum(nbrNodes);
norm ->vector .setNum(nbrNorms);
faceset ->coordIndex .setNum(nbrTriangles*4);
faceset ->partIndex .setNum(nbrFaces);
// get the raw memory for fast fill up
SbVec3f* verts = coords ->point .startEditing();
SbVec3f* norms = norm ->vector .startEditing();
int32_t* index = faceset ->coordIndex .startEditing();
int32_t* parts = faceset ->partIndex .startEditing();
// preset the normal vector with null vector
for (int i=0;i < nbrNorms;i++)
norms[i]= SbVec3f(0.0,0.0,0.0);
int ii = 0,FaceNodeOffset=0,FaceTriaOffset=0;
for (Ex.Init(cShape, TopAbs_FACE); Ex.More(); Ex.Next(),ii++) {
TopLoc_Location aLoc;
const TopoDS_Face &actFace = TopoDS::Face(Ex.Current());
// get the mesh of the shape
Handle (Poly_Triangulation) mesh = BRep_Tool::Triangulation(actFace,aLoc);
if (mesh.IsNull()) continue;
// getting the transformation of the shape/face
gp_Trsf myTransf;
Standard_Boolean identity = true;
if (!aLoc.IsIdentity()) {
identity = false;
myTransf = aLoc.Transformation();
}
// getting size of node and triangle array of this face
int nbNodesInFace = mesh->NbNodes();
int nbTriInFace = mesh->NbTriangles();
// check orientation
TopAbs_Orientation orient = actFace.Orientation();
// cycling through the poly mesh
const Poly_Array1OfTriangle& Triangles = mesh->Triangles();
const TColgp_Array1OfPnt& Nodes = mesh->Nodes();
for (int g=1;g<=nbTriInFace;g++) {
// Get the triangle
Standard_Integer N1,N2,N3;
Triangles(g).Get(N1,N2,N3);
// change orientation of the triangle if the face is reversed
if ( orient != TopAbs_FORWARD ) {
Standard_Integer tmp = N1;
N1 = N2;
N2 = tmp;
}
// get the 3 points of this triangle
gp_Pnt V1(Nodes(N1)), V2(Nodes(N2)), V3(Nodes(N3));
// transform the vertices to the place of the face
if (!identity) {
V1.Transform(myTransf);
示例8: DummyHP
//.........这里部分代码省略.........
}
case circle :
{
Standard_Boolean sense = Standard_True;
if (radius < 0) {
radius = -radius;
sense = !sense;
dx = -dx;
dy = -dy;
}
gp_Ax2d ax(gp_Pnt2d(x-radius*dy,y+radius*dx),gp_Dir2d(dy,-dx));
if (angle < 0) {
angle = -angle;
sense = !sense;
}
Handle(Geom2d_Circle) c = new Geom2d_Circle(ax,radius,sense);
BRepBuilderAPI_MakeEdge ME (GeomAPI::To3d(c,P),0,angle);
if (!ME.IsDone())
return;
MW.Add(ME);
gp_Pnt2d p;
gp_Vec2d v;
c->D1(angle,p,v);
x = p.X();
y = p.Y();
dx = v.X() / radius;
dy = v.Y() / radius;
break;
}
case point:
{
MP = BRepBuilderAPI_MakeVertex(gp_Pnt(x, y, 0.0));
break;
}
case none:
{
i = n - 1;
break;
}
}
// update first
first = stayfirst;
stayfirst = Standard_False;
if(!(dx == 0 && dy == 0))
myLastDir.SetCoord(dx, dy, 0.0);
else
return;
myLastPoint.SetX(x);
myLastPoint.SetY(y);
// next segment....
i++;
if ((i == n) && close) {
// the closing segment
dx = x0 - x;
dy = y0 - y;
length = Sqrt(dx * dx + dy * dy);
move = line;
if (length > Precision::Confusion()) {
dx = dx / length;
dy = dy / length;
goto again;
}
}
}
// get the result, face or wire
if (move == none) {
return;
} else if (move == point) {
S = MP;
} else if (face) {
if (!MW.IsDone()) {
return;
}
BRepBuilderAPI_MakeFace MF (P, MW.Wire());
if (!MF.IsDone()) {
return;
}
S = MF;
} else {
if (!MW.IsDone()) {
return;
}
S = MW;
}
if(!TheLocation.IsIdentity())
S.Move(TheLocation);
myShape = S;
myOK = true;
return;
badargs :
MESSAGE("profile : bad number of arguments");
return;
}