NPAL15298: KindOfShape(). For all cases.

This commit is contained in:
jfa 2007-04-06 12:55:09 +00:00
parent 52a39bebf3
commit 53a38614c4
4 changed files with 645 additions and 366 deletions

View File

@ -2127,32 +2127,33 @@ module GEOM
SHELL, SHELL,
WIRE, WIRE,
// SOLIDs // SOLIDs
SPHERE, SPHERE, // full sphere
CYLINDER, CYLINDER, // cylinder
BOX, BOX, // box with faces, parallel to global coordinate planes
ROTATED_BOX, ROTATED_BOX, // other box
TORUS, TORUS, // full torus
CONE, CONE, // cone
POLYHEDRON, POLYHEDRON, // solid, bounded by polygons
SOLID, SOLID, // other solid
// FACEs // FACEs
SPHERE2D, SPHERE2D, // spherical face (closed)
CYLINDER2D, CYLINDER2D, // cylindrical face with defined height
TORUS2D, TORUS2D, // toroidal face (closed)
CONE2D, CONE2D, // conical face with defined height
DISK, DISK_CIRCLE, // planar, bounded by circle
ELLIPSE2D, DISK_ELLIPSE, // planar, bounded by ellipse
POLYGON, POLYGON, // planar, bounded by segments
PLANAR, PLANE, // infinite planar
FACE, PLANAR, // other planar
FACE, // other face
// EDGEs // EDGEs
CIRCLE, CIRCLE, // full circle
ARC, ARC_CIRCLE, // arc of circle
ELLIPSE, ELLIPSE, // full ellipse
ARC_ELLIPSE, ARC_ELLIPSE, // arc of ellipse
LINE, // infinite segment LINE, // infinite segment
SEGMENT, SEGMENT, // segment
EDGE, EDGE, // other edge
// VERTEX // VERTEX
VERTEX VERTEX
}; };

View File

@ -25,10 +25,13 @@
#include <GEOMImpl_MeasureDriver.hxx> #include <GEOMImpl_MeasureDriver.hxx>
#include <GEOMImpl_IMeasure.hxx> #include <GEOMImpl_IMeasure.hxx>
#include <GEOMAlgo_ShapeInfo.hxx>
#include <GEOMAlgo_ShapeInfoFiller.hxx>
#include <GEOM_Function.hxx> #include <GEOM_Function.hxx>
#include <GEOM_PythonDump.hxx> #include <GEOM_PythonDump.hxx>
#include "utilities.h" #include <utilities.h>
#include <OpUtil.hxx> #include <OpUtil.hxx>
#include <Utils_ExceptHandlers.hxx> #include <Utils_ExceptHandlers.hxx>
@ -132,318 +135,587 @@ GEOMImpl_IMeasureOperations::ShapeKind GEOMImpl_IMeasureOperations::KindOfShape
TopoDS_Shape aShape = aRefShape->GetValue(); TopoDS_Shape aShape = aRefShape->GetValue();
if (aShape.IsNull()) return aKind; if (aShape.IsNull()) return aKind;
TopAbs_ShapeEnum aType = aShape.ShapeType(); // Call algorithm
GEOMAlgo_ShapeInfoFiller aSF;
aSF.SetShape(aShape);
aSF.Perform();
Standard_Integer iErr = aSF.ErrorStatus();
if (iErr) {
SetErrorCode("Error in GEOMAlgo_ShapeInfoFiller");
return SK_NO_SHAPE;
}
const GEOMAlgo_ShapeInfo& anInfo = aSF.Info();
// Interprete results
TopAbs_ShapeEnum aType = anInfo.Type();
switch (aType) switch (aType)
{ {
//??? geompy.kind.compound nb_solids nb_faces nb_edges nb_vertices case TopAbs_COMPOUND:
//??? geompy.kind.compsolid nb_solids nb_faces nb_edges nb_vertices case TopAbs_COMPSOLID:
//? "nb_faces" - all faces or only 'standalone' faces? {
case TopAbs_COMPOUND: // (+) geompy.kind.COMPOUND nb_solids nb_faces nb_edges nb_vertices
aKind = SK_COMPOUND; // (+) geompy.kind.COMPSOLID nb_solids nb_faces nb_edges nb_vertices
// // ??? "nb_faces" - all faces or only 'standalone' faces?
break; if (aType == TopAbs_COMPOUND)
case TopAbs_COMPSOLID: aKind = SK_COMPOUND;
aKind = SK_COMPSOLID; else
// aKind = SK_COMPSOLID;
break;
case TopAbs_SHELL: //theIntegers->Append(anInfo.NbSubShapes(TopAbs_COMPOUND));
//geompy.kind.shell geompy.info.closed nb_faces nb_edges nb_vertices //theIntegers->Append(anInfo.NbSubShapes(TopAbs_COMPSOLID));
//geompy.kind.shell geompy.info.unclosed nb_faces nb_edges nb_vertices theIntegers->Append(anInfo.NbSubShapes(TopAbs_SOLID));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_FACE));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX));
}
break;
case TopAbs_SHELL:
{
// (+) geompy.kind.SHELL geompy.info.closed nb_faces nb_edges nb_vertices
// (+) geompy.kind.SHELL geompy.info.unclosed nb_faces nb_edges nb_vertices
aKind = SK_SHELL; aKind = SK_SHELL;
//
break; theIntegers->Append((int)anInfo.KindOfClosed());
case TopAbs_WIRE:
//geompy.kind.wire geompy.info.closed nb_edges nb_vertices theIntegers->Append(anInfo.NbSubShapes(TopAbs_FACE));
//geompy.kind.wire geompy.info.unclosed nb_edges nb_vertices theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX));
}
break;
case TopAbs_WIRE:
{
// (+) geompy.kind.WIRE geompy.info.closed nb_edges nb_vertices
// (+) geompy.kind.WIRE geompy.info.unclosed nb_edges nb_vertices
aKind = SK_WIRE; aKind = SK_WIRE;
//
break; theIntegers->Append((int)anInfo.KindOfClosed());
case TopAbs_SOLID:
//geompy.kind.sphere xc yc zc R theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE));
//geompy.kind.cylinder xb yb zb dx dy dz R H theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX));
//geompy.kind.box xc yc zc dx dy dz }
//geompy.kind.rotated_box xo yo zo zx zy zz xx xy xz dx dy dz break;
//geompy.kind.torus xc yc zc dx dy dz R_1 R_2
//geompy.kind.cone xb yb zb dx dy dz H R_1 R_2 case TopAbs_SOLID:
//geompy.kind.polyhedron nb_faces nb_edges nb_vertices {
//geompy.kind.solid nb_faces nb_edges nb_vertices
aKind = SK_SOLID; aKind = SK_SOLID;
//if () {
// aKind = SK_SPHERE; GEOMAlgo_KindOfName aKN = anInfo.KindOfName();
// aKind = SK_CYLINDER; switch (aKN)
// aKind = SK_BOX;
// aKind = SK_ROTATED_BOX;
// aKind = SK_TORUS;
// aKind = SK_CONE;
// aKind = SK_POLYHEDRON;
//}
break;
case TopAbs_FACE:
// geompy.kind.sphere2d xc yc zc R
// + geompy.kind.cylinder2d xb yb zb dx dy dz R H
// geompy.kind.torus2d xc yc zc dx dy dz R_1 R_2
// geompy.kind.cone2d xc yc zc dx dy dz R_1 R_2
// geompy.kind.disk xc yc zc dx dy dz R
// geompy.kind.ellipse2d xc yc zc dx dy dz R_1 R_2
// geompy.kind.polygon xo yo zo dx dy dz nb_edges nb_vertices
// + geompy.kind.planar xo yo zo dx dy dz nb_edges nb_vertices
// + geompy.kind.face nb_edges nb_vertices _surface_type_id_
aKind = SK_FACE;
{ {
TopoDS_Face aF = TopoDS::Face(aShape); case GEOMAlgo_KN_SPHERE:
// (+) geompy.kind.SPHERE xc yc zc R
{
aKind = SK_SPHERE;
int nbWires = 0, nbEdges = 0, nbVertices = 0; gp_Pnt aC = anInfo.Location();
theDoubles->Append(aC.X());
theDoubles->Append(aC.Y());
theDoubles->Append(aC.Z());
TopTools_MapOfShape mapShape; theDoubles->Append(anInfo.Radius1());
TopExp_Explorer expw (aF, TopAbs_WIRE);
for (; expw.More(); expw.Next()) {
if (mapShape.Add(expw.Current())) {
//listShape.Append(expw.Current());
nbWires++;
}
} }
break;
case GEOMAlgo_KN_CYLINDER:
// (+) geompy.kind.CYLINDER xb yb zb dx dy dz R H
{
aKind = SK_CYLINDER;
mapShape.Clear(); gp_Pnt aC = anInfo.Location();
TopExp_Explorer expe (aF, TopAbs_EDGE); theDoubles->Append(aC.X());
for (; expe.More(); expe.Next()) { theDoubles->Append(aC.Y());
if (mapShape.Add(expe.Current())) { theDoubles->Append(aC.Z());
//listShape.Append(expe.Current());
nbEdges++; gp_Ax3 anAx3 = anInfo.Position();
} gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
theDoubles->Append(anInfo.Height());
} }
break;
case GEOMAlgo_KN_BOX:
// (+) geompy.kind.BOX xc yc zc ax ay az
{
aKind = SK_BOX;
mapShape.Clear(); gp_Pnt aC = anInfo.Location();
TopExp_Explorer expf (aF, TopAbs_VERTEX); theDoubles->Append(aC.X());
for (; expf.More(); expf.Next()) { theDoubles->Append(aC.Y());
if (mapShape.Add(expf.Current())) { theDoubles->Append(aC.Z());
//listShape.Append(expf.Current());
nbVertices++; gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
gp_Dir aX = anAx3.XDirection();
// ax ay az
if (aD.IsParallel(gp::DZ(), Precision::Angular()) &&
aX.IsParallel(gp::DX(), Precision::Angular())) {
theDoubles->Append(anInfo.Length()); // ax'
theDoubles->Append(anInfo.Width()); // ay'
theDoubles->Append(anInfo.Height()); // az'
} }
} else if (aD.IsParallel(gp::DZ(), Precision::Angular()) &&
aX.IsParallel(gp::DY(), Precision::Angular())) {
// Geometry theDoubles->Append(anInfo.Width()); // ay'
Handle(Geom_Surface) aGS = BRep_Tool::Surface(aF); theDoubles->Append(anInfo.Length()); // ax'
if (!aGS.IsNull()) { theDoubles->Append(anInfo.Height()); // az'
BRepAdaptor_Surface aBAS (aF);
if (aGS->IsKind(STANDARD_TYPE(Geom_Plane))) {
// planar
aKind = SK_PLANAR;
Handle(Geom_Plane) aGPlane = Handle(Geom_Plane)::DownCast(aGS);
gp_Pln aPln = aGPlane->Pln();
gp_Ax3 aPos = aPln.Position();
gp_Pnt anOri = aPos.Location();
gp_Dir aDirZ = aPos.Direction();
//gp_Dir aDirX = aPos.XDirection();
// xo yo zo
theDoubles->Append(anOri.X());
theDoubles->Append(anOri.Y());
theDoubles->Append(anOri.Z());
// dx dy dz
theDoubles->Append(aDirZ.X());
theDoubles->Append(aDirZ.Y());
theDoubles->Append(aDirZ.Z());
// nb_edges nb_vertices (for planar only)
theIntegers->Append(nbEdges);
theIntegers->Append(nbVertices);
//if () {
// aKind = SK_DISK;
// aKind = SK_ELLIPSE2D;
// aKind = SK_POLYGON;
//}
} }
else if (aGS->IsKind(STANDARD_TYPE(Geom_SphericalSurface))) { else if (aD.IsParallel(gp::DX(), Precision::Angular()) &&
//if (/*isSphere*/false) { aX.IsParallel(gp::DZ(), Precision::Angular())) {
if (aBAS.IsUClosed() && aBAS.IsVClosed()) { // does not work theDoubles->Append(anInfo.Height()); // az'
Handle(Geom_SphericalSurface) aGSph = Handle(Geom_SphericalSurface)::DownCast(aGS); theDoubles->Append(anInfo.Width()); // ay'
theDoubles->Append(anInfo.Length()); // ax'
// parameters
gp_Pnt aLoc = aGSph->Location();
Standard_Real rr = aGSph->Radius();
// xc yc zc
theDoubles->Append(aLoc.X());
theDoubles->Append(aLoc.Y());
theDoubles->Append(aLoc.Z());
// R
theDoubles->Append(rr);
aKind = SK_SPHERE2D;
}
else {
// nb_edges nb_vertices (for spherical only)
theIntegers->Append(nbEdges);
theIntegers->Append(nbVertices);
theIntegers->Append((Standard_Integer)GeomAbs_Sphere);
}
} }
else if (aGS->IsKind(STANDARD_TYPE(Geom_CylindricalSurface))) { else if (aD.IsParallel(gp::DX(), Precision::Angular()) &&
// Pure cylinder or just a piece of cylindric surface aX.IsParallel(gp::DY(), Precision::Angular())) {
TopLoc_Location aL; theDoubles->Append(anInfo.Height()); // az'
Handle(Geom_Surface) aGSLoc = BRep_Tool::Surface(aF, aL); theDoubles->Append(anInfo.Length()); // ax'
theDoubles->Append(anInfo.Width()); // ay'
//aF.Orientation(TopAbs_FORWARD);
TopExp_Explorer ex (aF, TopAbs_EDGE);
Standard_Real uMin, uMax, vMin, vMax;
bool isCylinder = true;
for (; ex.More(); ex.Next()) {
// check all edges: pure cylinder has only one seam edge
// and two edges with const v parameter
TopoDS_Edge E = TopoDS::Edge(ex.Current());
if (BRep_Tool::IsClosed(E, aGSLoc, aL)) {
// seam edge
//TopoDS_Edge ERevr = E;
//ERevr.Reverse();
//Handle(Geom2d_Curve) pcRepl1 = BRep_Tool::CurveOnSurface(E , aF, f,l);
//Handle(Geom2d_Curve) pcRepl2 = BRep_Tool::CurveOnSurface(ERevr, aF, f,l);
}
else {
BRepTools::UVBounds(aF, E, uMin, uMax, vMin, vMax);
if (Abs(vMin - vMax) > Precision::Confusion())
// neither seam, nor v-constant
isCylinder = false;
}
}
if (isCylinder) {
aKind = SK_CYLINDER2D;
Handle(Geom_CylindricalSurface) aGCyl = Handle(Geom_CylindricalSurface)::DownCast(aGS);
// parameters
gp_Pnt aLoc = aGCyl->Location();
gp_Ax1 anAx = aGCyl->Axis();
gp_Dir aDir = anAx.Direction();
Standard_Real rr = aGCyl->Radius();
// xb yb zb
theDoubles->Append(aLoc.X());
theDoubles->Append(aLoc.Y());
theDoubles->Append(aLoc.Z());
// dx dy dz
theDoubles->Append(aDir.X());
theDoubles->Append(aDir.Y());
theDoubles->Append(aDir.Z());
// R
theDoubles->Append(rr);
// H
Standard_Real hh = Abs(aBAS.FirstVParameter() - aBAS.LastVParameter());
theDoubles->Append(hh);
}
else {
// nb_edges nb_vertices (for cylinrical only)
theIntegers->Append(nbEdges);
theIntegers->Append(nbVertices);
theIntegers->Append((Standard_Integer)GeomAbs_Cylinder);
}
} }
else if (aGS->IsKind(STANDARD_TYPE(Geom_ToroidalSurface))) { else if (aD.IsParallel(gp::DY(), Precision::Angular()) &&
// aKind = SK_TORUS2D; aX.IsParallel(gp::DZ(), Precision::Angular())) {
theIntegers->Append(nbEdges); theDoubles->Append(anInfo.Width()); // ay'
theIntegers->Append(nbVertices); theDoubles->Append(anInfo.Height()); // az'
theDoubles->Append(anInfo.Length()); // ax'
theIntegers->Append((Standard_Integer)GeomAbs_Torus);
} }
else if (aGS->IsKind(STANDARD_TYPE(Geom_ConicalSurface))) { else if (aD.IsParallel(gp::DY(), Precision::Angular()) &&
// aKind = SK_CONE2D; aX.IsParallel(gp::DX(), Precision::Angular())) {
theIntegers->Append(nbEdges); theDoubles->Append(anInfo.Length()); // ax'
theIntegers->Append(nbVertices); theDoubles->Append(anInfo.Height()); // az'
theDoubles->Append(anInfo.Width()); // ay'
theIntegers->Append((Standard_Integer)GeomAbs_Cone);
}
else if (aGS->IsKind(STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion))) {
//
theIntegers->Append(nbEdges);
theIntegers->Append(nbVertices);
theIntegers->Append((Standard_Integer)GeomAbs_SurfaceOfExtrusion);
}
else if (aGS->IsKind(STANDARD_TYPE(Geom_SurfaceOfRevolution))) {
//
theIntegers->Append(nbEdges);
theIntegers->Append(nbVertices);
theIntegers->Append((Standard_Integer)GeomAbs_SurfaceOfRevolution);
}
else if (aGS->IsKind(STANDARD_TYPE(Geom_BezierSurface))) {
//
theIntegers->Append(nbEdges);
theIntegers->Append(nbVertices);
theIntegers->Append((Standard_Integer)GeomAbs_BezierSurface);
}
else if (aGS->IsKind(STANDARD_TYPE(Geom_BSplineSurface))) {
//
theIntegers->Append(nbEdges);
theIntegers->Append(nbVertices);
theIntegers->Append((Standard_Integer)GeomAbs_BSplineSurface);
}
else if (aGS->IsKind(STANDARD_TYPE(Geom_OffsetSurface))) {
//
theIntegers->Append(nbEdges);
theIntegers->Append(nbVertices);
theIntegers->Append((Standard_Integer)GeomAbs_OffsetSurface);
}
else if (aGS->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) {
//
theIntegers->Append(nbEdges);
theIntegers->Append(nbVertices);
theIntegers->Append((Standard_Integer)GeomAbs_OtherSurface);
} }
else { else {
// ??? // (+) geompy.kind.ROTATED_BOX xo yo zo zx zy zz xx xy xz ax ay az
theIntegers->Append(nbEdges); aKind = SK_ROTATED_BOX;
theIntegers->Append(nbVertices);
theIntegers->Append((Standard_Integer)GeomAbs_OtherSurface); // Direction and XDirection
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(aX.X());
theDoubles->Append(aX.Y());
theDoubles->Append(aX.Z());
// ax ay az
theDoubles->Append(anInfo.Length());
theDoubles->Append(anInfo.Width());
theDoubles->Append(anInfo.Height());
} }
} }
break;
case GEOMAlgo_KN_TORUS:
// (+) geompy.kind.TORUS xc yc zc dx dy dz R_1 R_2
{
aKind = SK_TORUS;
gp_Pnt aO = anInfo.Location();
theDoubles->Append(aO.X());
theDoubles->Append(aO.Y());
theDoubles->Append(aO.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
theDoubles->Append(anInfo.Radius2());
}
break;
case GEOMAlgo_KN_CONE:
// (+) geompy.kind.CONE xb yb zb dx dy dz R_1 R_2 H
{
aKind = SK_CONE;
gp_Pnt aO = anInfo.Location();
theDoubles->Append(aO.X());
theDoubles->Append(aO.Y());
theDoubles->Append(aO.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
theDoubles->Append(anInfo.Radius2());
theDoubles->Append(anInfo.Height());
}
break;
case GEOMAlgo_KN_POLYHEDRON:
// (+) geompy.kind.POLYHEDRON nb_faces nb_edges nb_vertices
{
aKind = SK_POLYHEDRON;
theIntegers->Append(anInfo.NbSubShapes(TopAbs_FACE));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX));
}
break;
default:
// (+) geompy.kind.SOLID nb_faces nb_edges nb_vertices
{
theIntegers->Append(anInfo.NbSubShapes(TopAbs_FACE));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX));
}
} }
break; }
case TopAbs_EDGE: break;
//geompy.kind.circle xc yc zc dx dy dz R
//geompy.kind.arc xc yc zc dx dy dz R x1 y1 z1 x2 y2 z2 case TopAbs_FACE:
//geompy.kind.ellipse xc yc zc dx dy dz R_1 R_2 {
//geompy.kind.arcEllipse xc yc zc dx dy dz R_1 R_2 x1 y1 z1 x2 y2 z2 aKind = SK_FACE;
//geompy.kind.line x1 y1 z1 x2 y2 z2
//geompy.kind.segment x1 y1 z1 x2 y2 z2 GEOMAlgo_KindOfName aKN = anInfo.KindOfName();
//geompy.kind.edge nb_vertices _curve_type_id_ switch (aKN) {
case GEOMAlgo_KN_SPHERE:
// (+) geompy.kind.SPHERE2D xc yc zc R
{
aKind = SK_SPHERE2D;
gp_Pnt aC = anInfo.Location();
theDoubles->Append(aC.X());
theDoubles->Append(aC.Y());
theDoubles->Append(aC.Z());
theDoubles->Append(anInfo.Radius1());
}
break;
case GEOMAlgo_KN_CYLINDER:
// (+) geompy.kind.CYLINDER2D xb yb zb dx dy dz R H
{
aKind = SK_CYLINDER2D;
gp_Pnt aO = anInfo.Location();
theDoubles->Append(aO.X());
theDoubles->Append(aO.Y());
theDoubles->Append(aO.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
theDoubles->Append(anInfo.Height());
}
break;
case GEOMAlgo_KN_TORUS:
// (+) geompy.kind.TORUS2D xc yc zc dx dy dz R_1 R_2
{
aKind = SK_TORUS2D;
gp_Pnt aO = anInfo.Location();
theDoubles->Append(aO.X());
theDoubles->Append(aO.Y());
theDoubles->Append(aO.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
theDoubles->Append(anInfo.Radius2());
}
break;
case GEOMAlgo_KN_CONE:
// (+) geompy.kind.CONE2D xc yc zc dx dy dz R_1 R_2 H
{
aKind = SK_CONE2D;
gp_Pnt aO = anInfo.Location();
theDoubles->Append(aO.X());
theDoubles->Append(aO.Y());
theDoubles->Append(aO.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
theDoubles->Append(anInfo.Radius2());
theDoubles->Append(anInfo.Height());
}
break;
case GEOMAlgo_KN_DISKCIRCLE:
// (+) geompy.kind.DISK_CIRCLE xc yc zc dx dy dz R
{
aKind = SK_DISK_CIRCLE;
gp_Pnt aC = anInfo.Location();
theDoubles->Append(aC.X());
theDoubles->Append(aC.Y());
theDoubles->Append(aC.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
}
break;
case GEOMAlgo_KN_DISKELLIPSE:
// (+) geompy.kind.DISK_ELLIPSE xc yc zc dx dy dz R_1 R_2
{
aKind = SK_DISK_ELLIPSE;
gp_Pnt aC = anInfo.Location();
theDoubles->Append(aC.X());
theDoubles->Append(aC.Y());
theDoubles->Append(aC.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
theDoubles->Append(anInfo.Radius2());
}
break;
case GEOMAlgo_KN_RECTANGLE:
case GEOMAlgo_KN_TRIANGLE:
case GEOMAlgo_KN_QUADRANGLE:
case GEOMAlgo_KN_POLYGON:
// (+) geompy.kind.POLYGON xo yo zo dx dy dz nb_edges nb_vertices
{
aKind = SK_POLYGON;
gp_Pnt aO = anInfo.Location();
theDoubles->Append(aO.X());
theDoubles->Append(aO.Y());
theDoubles->Append(aO.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX));
}
break;
case GEOMAlgo_KN_PLANE: // infinite
// (+) geompy.kind.PLANE xo yo zo dx dy dz
{
aKind = SK_PLANE;
gp_Pnt aC = anInfo.Location();
theDoubles->Append(aC.X());
theDoubles->Append(aC.Y());
theDoubles->Append(aC.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
}
break;
default:
if (anInfo.KindOfShape() == GEOMAlgo_KS_PLANE) {
// (+) geompy.kind.PLANAR xo yo zo dx dy dz nb_edges nb_vertices
aKind = SK_PLANAR;
gp_Pnt aC = anInfo.Location();
theDoubles->Append(aC.X());
theDoubles->Append(aC.Y());
theDoubles->Append(aC.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX));
}
else {
// ??? geompy.kind.FACE nb_edges nb_vertices _surface_type_id_
// (+) geompy.kind.FACE nb_edges nb_vertices
theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE));
theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX));
}
}
}
break;
case TopAbs_EDGE:
{
aKind = SK_EDGE; aKind = SK_EDGE;
//if () {
// aKind = SK_CIRCLE; GEOMAlgo_KindOfName aKN = anInfo.KindOfName();
// aKind = SK_ARC; switch (aKN) {
// aKind = SK_ELLIPSE; case GEOMAlgo_KN_CIRCLE:
// aKind = SK_ARC_ELLIPSE; {
// aKind = SK_LINE; // (+) geompy.kind.CIRCLE xc yc zc dx dy dz R
// aKind = SK_SEGMENT; aKind = SK_CIRCLE;
//}
break; gp_Pnt aC = anInfo.Location();
case TopAbs_VERTEX: theDoubles->Append(aC.X());
//geompy.kind.VERTEX x y z theDoubles->Append(aC.Y());
aKind = SK_VERTEX; theDoubles->Append(aC.Z());
{
TopoDS_Vertex aV = TopoDS::Vertex(aShape); gp_Ax3 anAx3 = anInfo.Position();
gp_Pnt aP = BRep_Tool::Pnt(aV); gp_Dir aD = anAx3.Direction();
theDoubles->Append(aP.X()); theDoubles->Append(aD.X());
theDoubles->Append(aP.Y()); theDoubles->Append(aD.Y());
theDoubles->Append(aP.Z()); theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
}
break;
case GEOMAlgo_KN_ARCCIRCLE:
{
// (+) geompy.kind.ARC_CIRCLE xc yc zc dx dy dz R x1 y1 z1 x2 y2 z2
aKind = SK_ARC_CIRCLE;
gp_Pnt aC = anInfo.Location();
theDoubles->Append(aC.X());
theDoubles->Append(aC.Y());
theDoubles->Append(aC.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
gp_Pnt aP1 = anInfo.Pnt1();
theDoubles->Append(aP1.X());
theDoubles->Append(aP1.Y());
theDoubles->Append(aP1.Z());
gp_Pnt aP2 = anInfo.Pnt2();
theDoubles->Append(aP2.X());
theDoubles->Append(aP2.Y());
theDoubles->Append(aP2.Z());
}
break;
case GEOMAlgo_KN_ELLIPSE:
{
// (+) geompy.kind.ELLIPSE xc yc zc dx dy dz R_1 R_2
aKind = SK_ELLIPSE;
gp_Pnt aC = anInfo.Location();
theDoubles->Append(aC.X());
theDoubles->Append(aC.Y());
theDoubles->Append(aC.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
theDoubles->Append(anInfo.Radius2());
}
break;
case GEOMAlgo_KN_ARCELLIPSE:
{
// (+) geompy.kind.ARC_ELLIPSE xc yc zc dx dy dz R_1 R_2 x1 y1 z1 x2 y2 z2
aKind = SK_ARC_ELLIPSE;
gp_Pnt aC = anInfo.Location();
theDoubles->Append(aC.X());
theDoubles->Append(aC.Y());
theDoubles->Append(aC.Z());
gp_Ax3 anAx3 = anInfo.Position();
gp_Dir aD = anAx3.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
theDoubles->Append(anInfo.Radius1());
theDoubles->Append(anInfo.Radius2());
gp_Pnt aP1 = anInfo.Pnt1();
theDoubles->Append(aP1.X());
theDoubles->Append(aP1.Y());
theDoubles->Append(aP1.Z());
gp_Pnt aP2 = anInfo.Pnt2();
theDoubles->Append(aP2.X());
theDoubles->Append(aP2.Y());
theDoubles->Append(aP2.Z());
}
break;
case GEOMAlgo_KN_LINE:
{
// ??? geompy.kind.LINE x1 y1 z1 x2 y2 z2
// (+) geompy.kind.LINE x1 y1 z1 dx dy dz
aKind = SK_LINE;
gp_Pnt aO = anInfo.Location();
theDoubles->Append(aO.X());
theDoubles->Append(aO.Y());
theDoubles->Append(aO.Z());
gp_Dir aD = anInfo.Direction();
theDoubles->Append(aD.X());
theDoubles->Append(aD.Y());
theDoubles->Append(aD.Z());
}
break;
case GEOMAlgo_KN_SEGMENT:
{
// (+) geompy.kind.SEGMENT x1 y1 z1 x2 y2 z2
aKind = SK_SEGMENT;
gp_Pnt aP1 = anInfo.Pnt1();
theDoubles->Append(aP1.X());
theDoubles->Append(aP1.Y());
theDoubles->Append(aP1.Z());
gp_Pnt aP2 = anInfo.Pnt2();
theDoubles->Append(aP2.X());
theDoubles->Append(aP2.Y());
theDoubles->Append(aP2.Z());
}
break;
default:
// ??? geompy.kind.EDGE nb_vertices _curve_type_id_
// (+) geompy.kind.EDGE nb_vertices
theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX));
} }
break; }
break;
case TopAbs_VERTEX:
{
// (+) geompy.kind.VERTEX x y z
aKind = SK_VERTEX;
gp_Pnt aP = anInfo.Location();
theDoubles->Append(aP.X());
theDoubles->Append(aP.Y());
theDoubles->Append(aP.Z());
}
break;
} }
SetErrorCode(OK); SetErrorCode(OK);

View File

@ -48,32 +48,33 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations {
SK_SHELL, SK_SHELL,
SK_WIRE, SK_WIRE,
// SOLIDs // SOLIDs
SK_SPHERE, SK_SPHERE, // full sphere
SK_CYLINDER, SK_CYLINDER, // cylinder
SK_BOX, SK_BOX, // box with faces, parallel to global coordinate planes
SK_ROTATED_BOX, SK_ROTATED_BOX, // other box
SK_TORUS, SK_TORUS, // full torus
SK_CONE, SK_CONE, // cone
SK_POLYHEDRON, SK_POLYHEDRON, // solid, bounded by polygons
SK_SOLID, SK_SOLID, // other solid
// FACEs // FACEs
SK_SPHERE2D, SK_SPHERE2D, // spherical face (closed)
SK_CYLINDER2D, SK_CYLINDER2D, // cylindrical face with defined height
SK_TORUS2D, SK_TORUS2D, // toroidal face (closed)
SK_CONE2D, SK_CONE2D, // conical face with defined height
SK_DISK, SK_DISK_CIRCLE, // planar, bounded by circle
SK_ELLIPSE2D, SK_DISK_ELLIPSE, // planar, bounded by ellipse
SK_POLYGON, SK_POLYGON, // planar, bounded by segments
SK_PLANAR, SK_PLANE, // infinite planar
SK_FACE, SK_PLANAR, // other planar
SK_FACE, // other face
// EDGEs // EDGEs
SK_CIRCLE, SK_CIRCLE, // full circle
SK_ARC, SK_ARC_CIRCLE, // arc of circle
SK_ELLIPSE, SK_ELLIPSE, // full ellipse
SK_ARC_ELLIPSE, SK_ARC_ELLIPSE, // arc of ellipse
SK_LINE, // infinite segment SK_LINE, // infinite segment
SK_SEGMENT, SK_SEGMENT, // segment
SK_EDGE, SK_EDGE, // other edge
// VERTEX // VERTEX
SK_VERTEX SK_VERTEX
}; };

View File

@ -149,6 +149,11 @@ ShapeType = {"COMPOUND":0, "COMPSOLID":1, "SOLID":2, "SHELL":3, "FACE":4, "WIRE"
kind = GEOM.GEOM_IKindOfShape kind = GEOM.GEOM_IKindOfShape
class info:
UNKNOWN = 0
CLOSED = 1
UNCLOSED = 2
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Basic primitives # Basic primitives
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@ -1978,45 +1983,45 @@ def GetPosition(theShape):
# @note Concrete meaning of each value, returned via \a theIntegers # @note Concrete meaning of each value, returned via \a theIntegers
# or \a theDoubles list depends on the kind of the shape. # or \a theDoubles list depends on the kind of the shape.
# The full list of possible outputs is: # The full list of possible outputs is:
# Currently implemented cases are marked with '+' sign:
# #
# geompy.kind.COMPOUND nb_solids nb_faces nb_edges nb_vertices # geompy.kind.COMPOUND nb_solids nb_faces nb_edges nb_vertices
# geompy.kind.COMPSOLID nb_solids nb_faces nb_edges nb_vertices # geompy.kind.COMPSOLID nb_solids nb_faces nb_edges nb_vertices
# #
# geompy.kind.SHELL geompy.info.closed nb_faces nb_edges nb_vertices # geompy.kind.SHELL geompy.info.CLOSED nb_faces nb_edges nb_vertices
# geompy.kind.SHELL geompy.info.unclosed nb_faces nb_edges nb_vertices # geompy.kind.SHELL geompy.info.UNCLOSED nb_faces nb_edges nb_vertices
# #
# geompy.kind.WIRE geompy.info.closed nb_edges nb_vertices # geompy.kind.WIRE geompy.info.CLOSED nb_edges nb_vertices
# geompy.kind.WIRE geompy.info.unclosed nb_edges nb_vertices # geompy.kind.WIRE geompy.info.UNCLOSED nb_edges nb_vertices
# #
# geompy.kind.SPHERE xc yc zc R # geompy.kind.SPHERE xc yc zc R
# geompy.kind.CYLINDER xb yb zb dx dy dz R H # geompy.kind.CYLINDER xb yb zb dx dy dz R H
# geompy.kind.BOX xc yc zc dx dy dz # geompy.kind.BOX xc yc zc ax ay az
# geompy.kind.ROTATED_BOX xo yo zo zx zy zz xx xy xz dx dy dz # geompy.kind.ROTATED_BOX xc yc zc zx zy zz xx xy xz ax ay az
# geompy.kind.TORUS xc yc zc dx dy dz R_1 R_2 # geompy.kind.TORUS xc yc zc dx dy dz R_1 R_2
# geompy.kind.CONE xb yb zb dx dy dz H R_1 R_2 # geompy.kind.CONE xb yb zb dx dy dz R_1 R_2 H
# geompy.kind.POLYHEDRON nb_faces nb_edges nb_vertices # geompy.kind.POLYHEDRON nb_faces nb_edges nb_vertices
# geompy.kind.SOLID nb_faces nb_edges nb_vertices # geompy.kind.SOLID nb_faces nb_edges nb_vertices
# #
# geompy.kind.SPHERE2D xc yc zc R # geompy.kind.SPHERE2D xc yc zc R
# + geompy.kind.CYLINDER2D xb yb zb dx dy dz R H # geompy.kind.CYLINDER2D xb yb zb dx dy dz R H
# geompy.kind.TORUS2D xc yc zc dx dy dz R_1 R_2 # geompy.kind.TORUS2D xc yc zc dx dy dz R_1 R_2
# geompy.kind.CONE2D xc yc zc dx dy dz R_1 R_2 # geompy.kind.CONE2D xc yc zc dx dy dz R_1 R_2 H
# geompy.kind.DISK xc yc zc dx dy dz R # geompy.kind.DISK_CIRCLE xc yc zc dx dy dz R
# geompy.kind.ELLIPSE2D xc yc zc dx dy dz R_1 R_2 # geompy.kind.DISK_ELLIPSE xc yc zc dx dy dz R_1 R_2
# geompy.kind.POLYGON xo yo zo dx dy dz nb_edges nb_vertices # geompy.kind.POLYGON xo yo zo dx dy dz nb_edges nb_vertices
# + geompy.kind.PLANAR xo yo zo dx dy dz nb_edges nb_vertices # geompy.kind.PLANE xo yo zo dx dy dz
# + geompy.kind.FACE nb_edges nb_vertices _surface_type_id_ # geompy.kind.PLANAR xo yo zo dx dy dz nb_edges nb_vertices
# geompy.kind.FACE nb_edges nb_vertices
# #
# geompy.kind.CIRCLE xc yc zc dx dy dz R # geompy.kind.CIRCLE xc yc zc dx dy dz R
# geompy.kind.ARC xc yc zc dx dy dz R x1 y1 z1 x2 y2 z2 # geompy.kind.ARC_CIRCLE xc yc zc dx dy dz R x1 y1 z1 x2 y2 z2
# geompy.kind.ELLIPSE xc yc zc dx dy dz R_1 R_2 # geompy.kind.ELLIPSE xc yc zc dx dy dz R_1 R_2
# geompy.kind.ARC_ELLIPSE xc yc zc dx dy dz R_1 R_2 x1 y1 z1 x2 y2 z2 # geompy.kind.ARC_ELLIPSE xc yc zc dx dy dz R_1 R_2 x1 y1 z1 x2 y2 z2
# geompy.kind.LINE x1 y1 z1 x2 y2 z2 # geompy.kind.LINE xo yo zo dx dy dz
# geompy.kind.SEGMENT x1 y1 z1 x2 y2 z2 # geompy.kind.SEGMENT x1 y1 z1 x2 y2 z2
# geompy.kind.EDGE nb_vertices _curve_ # geompy.kind.EDGE nb_vertices
# #
# + geompy.kind.VERTEX x y z # geompy.kind.VERTEX x y z
# #
# Example: see GEOM_TestMeasures.py # Example: see GEOM_TestMeasures.py
def KindOfShape(theShape): def KindOfShape(theShape):