Provide dumping itself and selection of sub-shapes by the given point.
#include <ExchangePlugin_Dump.h>
+#include <ModelAPI_AttributeBoolean.h>
#include <ModelAPI_AttributeString.h>
#include <ModelAPI_Document.h>
#include <ModelAPI_Session.h>
void ExchangePlugin_Dump::initAttributes()
{
- data()->addAttribute(ExchangePlugin_Dump::FILE_PATH_ID(), ModelAPI_AttributeString::typeId());
- data()->addAttribute(ExchangePlugin_Dump::FILE_FORMAT_ID(), ModelAPI_AttributeString::typeId());
+ data()->addAttribute(FILE_PATH_ID(), ModelAPI_AttributeString::typeId());
+ data()->addAttribute(FILE_FORMAT_ID(), ModelAPI_AttributeString::typeId());
+
+ data()->addAttribute(GEOMETRIC_DUMP_ID(), ModelAPI_AttributeBoolean::typeId());
+ boolean(GEOMETRIC_DUMP_ID())->setValue(false);
}
void ExchangePlugin_Dump::execute()
ModelHighAPI_Dumper* aDumper = ModelHighAPI_Dumper::getInstance();
aDumper->clear();
+ aDumper->setSelectionByGeometry(boolean(GEOMETRIC_DUMP_ID())->value());
+
DocumentPtr aDoc = ModelAPI_Session::get()->moduleDocument();
int aFeaturesNb = aDoc->size(ModelAPI_Feature::group());
static const std::string MY_FILE_FORMAT_ID("file_format");
return MY_FILE_FORMAT_ID;
}
+ /// attribute name of flag dumping by geometric selection (not by naming)
+ inline static const std::string& GEOMETRIC_DUMP_ID()
+ {
+ static const std::string MY_GEOM_DUMP_ID("geometric_dump");
+ return MY_GEOM_DUMP_ID;
+ }
/// Default constructor
EXCHANGEPLUGIN_EXPORT ExchangePlugin_Dump();
<validator id="ExchangePlugin_ExportFormat"
parameters="py:Python" />
</export_file_selector>
+ <boolvalue id="geometric_dump" label="By geometric selection"/>
</feature>
</group>
</workbench>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <ElCLib.hxx>
+#include <GCPnts_UniformAbscissa.hxx>
#include <Geom_Curve.hxx>
#include <Geom_Line.hxx>
#include <Geom_Circle.hxx>
TopExp::Vertices(anEdge, aVFirst, aVLast);
BRep_Builder().UpdateVertex(aVLast, theTolerance);
}
+
+GeomPointPtr GeomAPI_Edge::middlePoint() const
+{
+ GeomPointPtr aMiddlePoint;
+
+ const TopoDS_Edge& anEdge = impl<TopoDS_Edge>();
+ if (anEdge.IsNull())
+ return aMiddlePoint;
+ double aFirst, aLast;
+ Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aFirst, aLast);
+ if (aCurve.IsNull())
+ return aMiddlePoint;
+
+ static const int NB_POINTS = 3;
+ GeomAdaptor_Curve aCurveAdaptor(aCurve, aFirst, aLast);
+ GCPnts_UniformAbscissa anAlgo(aCurveAdaptor, NB_POINTS);
+ if (anAlgo.IsDone()) {
+ gp_Pnt aPnt = aCurveAdaptor.Value(anAlgo.Parameter(2));
+ aMiddlePoint = GeomPointPtr(new GeomAPI_Pnt(aPnt.X(), aPnt.Y(), aPnt.Z()));
+ }
+ return aMiddlePoint;
+}
GEOMAPI_EXPORT
void setLastPointTolerance(const double theTolerance);
+
+ /// Return middle point on the edge
+ GEOMAPI_EXPORT
+ virtual std::shared_ptr<GeomAPI_Pnt> middlePoint() const;
};
//! Pointer on attribute object
#include <BOPTools_AlgoTools.hxx>
#include <BRep_Tool.hxx>
#include <BRepAdaptor_Surface.hxx>
+#include <BRepGProp_Face.hxx>
#include <BRepTools.hxx>
#include <Geom_Surface.hxx>
#include <Geom_SphericalSurface.hxx>
}
return aTorus;
}
+
+GeomPointPtr GeomAPI_Face::middlePoint() const
+{
+ GeomPointPtr anInnerPoint;
+
+ const TopoDS_Face& aFace = impl<TopoDS_Face>();
+ if (aFace.IsNull())
+ return anInnerPoint;
+
+ BRepGProp_Face aProp(aFace);
+ double aUMin, aUMax, aVMin, aVMax;
+ aProp.Bounds(aUMin, aUMax, aVMin, aVMax);
+
+ Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace);
+ if (aSurf.IsNull())
+ return anInnerPoint;
+
+ gp_Pnt aPnt = aSurf->Value((aUMin + aUMax) * 0.5, (aVMin + aVMax) * 0.5);
+ anInnerPoint = GeomPointPtr(new GeomAPI_Pnt(aPnt.X(), aPnt.Y(), aPnt.Z()));
+ return anInnerPoint;
+}
/// Returns torus if the face is based on the toroidal surface
GEOMAPI_EXPORT std::shared_ptr<GeomAPI_Torus> getTorus() const;
+
+ /// Return inner point in the face
+ GEOMAPI_EXPORT virtual std::shared_ptr<GeomAPI_Pnt> middlePoint() const;
};
//! Pointer on attribute object
#include "GeomAPI_Shape.h"
+#include <GeomAPI_Pnt.h>
#include <GeomAPI_Vertex.h>
#include <GeomAPI_Edge.h>
#include <GeomAPI_Wire.h>
return true;
}
+GeomPointPtr GeomAPI_Shape::middlePoint() const
+{
+ GeomPointPtr aMiddlePoint;
+
+ switch (shapeType()) {
+ case VERTEX:
+ aMiddlePoint = vertex()->point();
+ break;
+ case EDGE:
+ aMiddlePoint = edge()->middlePoint();
+ break;
+ case WIRE:
+ aMiddlePoint = wire()->middlePoint();
+ break;
+ case FACE:
+ aMiddlePoint = face()->middlePoint();
+ break;
+ case SHELL:
+ aMiddlePoint = shell()->middlePoint();
+ break;
+ case SOLID:
+ aMiddlePoint = solid()->middlePoint();
+ break;
+ default: {
+ // get middle point as center of the bounding box
+ double aMinX, aMinY, aMinZ, aMaxX, aMaxY, aMaxZ;
+ computeSize(aMinX, aMinY, aMinZ, aMaxX, aMaxY, aMaxZ);
+ aMiddlePoint = GeomPointPtr(new GeomAPI_Pnt(
+ (aMinX + aMaxX) * 0.5, (aMinY + aMaxY) * 0.5, (aMinZ + aMaxZ) * 0.5));
+ }
+ }
+
+ return aMiddlePoint;
+}
+
std::string GeomAPI_Shape::getShapeStream() const
{
std::ostringstream aStream;
#include <memory>
#include <list>
+class GeomAPI_Pnt;
class GeomAPI_Vertex;
class GeomAPI_Edge;
class GeomAPI_Wire;
bool computeSize(double& theXmin, double& theYmin, double& theZmin,
double& theXmax, double& theYmax, double& theZmax) const;
+ /// Return middle point on the shape
+ GEOMAPI_EXPORT
+ virtual std::shared_ptr<GeomAPI_Pnt> middlePoint() const;
+
/// Returns the shape as BRep stream
GEOMAPI_EXPORT
std::string getShapeStream() const;
#include "GeomAPI_XYZ.h"
#include <BRep_Builder.hxx>
+#include <BRepGProp.hxx>
+#include <GProp_GProps.hxx>
#include <Precision.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
aPlanes[anIndex].myHeight));
return aBox;
}
+
+//=================================================================================================
+GeomPointPtr GeomAPI_Shell::middlePoint() const
+{
+ GeomPointPtr anInnerPoint;
+
+ const TopoDS_Shell& aShell = impl<TopoDS_Shell>();
+ if (aShell.IsNull())
+ return anInnerPoint;
+
+ GProp_GProps aProps;
+ BRepGProp::SurfaceProperties(aShell, aProps, 1.e-4);
+
+ gp_Pnt aPnt = aProps.CentreOfMass();
+ anInnerPoint = GeomPointPtr(new GeomAPI_Pnt(aPnt.X(), aPnt.Y(), aPnt.Z()));
+ return anInnerPoint;
+}
/// Returns box if the shell consists of 6 rectangular faces composing a box
GEOMAPI_EXPORT std::shared_ptr<GeomAPI_Box> getParallelepiped() const;
+
+ /// Return middle point on the shell
+ GEOMAPI_EXPORT virtual std::shared_ptr<GeomAPI_Pnt> middlePoint() const;
};
typedef std::shared_ptr<GeomAPI_Shell> GeomShellPtr;
#include "GeomAPI_XYZ.h"
#include <BRep_Builder.hxx>
+#include <BRepGProp.hxx>
+#include <GProp_GProps.hxx>
#include <Precision.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS_Wire.hxx>
aBox = aShells.front()->shell()->getParallelepiped();
return aBox;
}
+
+//==================================================================================================
+GeomPointPtr GeomAPI_Solid::middlePoint() const
+{
+ GeomPointPtr anInnerPoint;
+
+ const TopoDS_Solid& aSolid = impl<TopoDS_Solid>();
+ if (aSolid.IsNull())
+ return anInnerPoint;
+
+ GProp_GProps aProps;
+ BRepGProp::SurfaceProperties(aSolid, aProps, 1.e-4);
+
+ gp_Pnt aPnt = aProps.CentreOfMass();
+ anInnerPoint = GeomPointPtr(new GeomAPI_Pnt(aPnt.X(), aPnt.Y(), aPnt.Z()));
+ return anInnerPoint;
+}
/// Returns box if the solid is bounded by 6 rectangular faces composing a box
GEOMAPI_EXPORT std::shared_ptr<GeomAPI_Box> getParallelepiped() const;
+
+ /// Return inner point in the solid
+ GEOMAPI_EXPORT virtual std::shared_ptr<GeomAPI_Pnt> middlePoint() const;
};
typedef std::shared_ptr<GeomAPI_Solid> GeomSolidPtr;
}
return true;
}
+
+//==================================================================================================
+GeomPointPtr GeomAPI_Wire::middlePoint() const
+{
+ // find middle edge in the wire
+ std::list<GeomShapePtr> aSubs = subShapes(EDGE);
+ size_t aNbSubs = aSubs.size();
+ if (aNbSubs == 0)
+ return GeomPointPtr();
+
+ aNbSubs /= 2;
+ for (; aNbSubs > 0; --aNbSubs)
+ aSubs.pop_front();
+
+ // compute middle point on the middle edge
+ return aSubs.front()->middlePoint();
+}
/// Returns \c true if the wire is a rectangle
/// \param[out] thePoints corners of the rectangle
GEOMAPI_EXPORT bool isRectangle(std::list<std::shared_ptr<GeomAPI_Pnt> >& thePoints) const;
+
+ /// Return middle point on the wire
+ GEOMAPI_EXPORT virtual std::shared_ptr<GeomAPI_Pnt> middlePoint() const;
};
typedef std::shared_ptr<GeomAPI_Wire> GeomWirePtr;
#include <ModelAPI_Validator.h>
#include <Events_InfoMessage.h>
#include <GeomAPI_Edge.h>
+#include <GeomAPI_Pnt.h>
#include <GeomAPI_Vertex.h>
#include <GeomAlgoAPI_CompoundBuilder.h>
reset();
}
+
+// Check the point is within shape's bounding box
+static bool isPointWithinBB(const GeomPointPtr& thePoint, const GeomShapePtr& theShape)
+{
+ double aXMin, aXMax, aYMin, aYMax, aZMin, aZMax;
+ theShape->computeSize(aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
+ return thePoint->x() >= aXMin - Precision::Confusion() &&
+ thePoint->x() <= aXMax + Precision::Confusion() &&
+ thePoint->y() >= aYMin - Precision::Confusion() &&
+ thePoint->y() <= aYMax + Precision::Confusion() &&
+ thePoint->z() >= aZMin - Precision::Confusion() &&
+ thePoint->z() <= aZMax + Precision::Confusion();
+}
+
+// Select sub-shape of the given type, which contains the given point
+static GeomShapePtr findSubShape(const GeomShapePtr& theShape,
+ const GeomAPI_Shape::ShapeType& theType,
+ const GeomPointPtr& thePoint)
+{
+ std::list<GeomShapePtr> aSubs = theShape->subShapes(theType);
+ for (std::list<GeomShapePtr>::const_iterator aSubIt = aSubs.begin();
+ aSubIt != aSubs.end(); ++aSubIt) {
+ if ((*aSubIt)->middlePoint()->distance(thePoint) < Precision::Confusion())
+ return *aSubIt;
+ }
+
+ // not found
+ return GeomShapePtr();
+}
+
+void Model_AttributeSelection::selectSubShape(const std::string& theType,
+ const GeomPointPtr& thePoint)
+{
+ if (theType.empty() || !thePoint)
+ return;
+
+ GeomAPI_Shape::ShapeType aType = GeomAPI_Shape::shapeTypeByStr(theType);
+ GeomShapePtr aFoundSubShape;
+
+ std::list<FeaturePtr> aFeatures = owner()->document()->allFeatures();
+ // Process results of all features from the last to the first
+ // to find appropriate sub-shape
+ for (std::list<FeaturePtr>::const_reverse_iterator anIt = aFeatures.rbegin();
+ anIt != aFeatures.rend(); ++anIt) {
+ const std::list<ResultPtr>& aResults = (*anIt)->results();
+ for (std::list<ResultPtr>::const_iterator aResIt = aResults.begin();
+ aResIt != aResults.end(); ++aResIt) {
+ GeomShapePtr aCurShape = (*aResIt)->shape();
+ // first of all, check the point is within bounding box of the result
+ if (!isPointWithinBB(thePoint, aCurShape))
+ continue;
+ // now, process all sub-shapes of the given type and check their inner points
+ aFoundSubShape = findSubShape(aCurShape, aType, thePoint);
+ if (aFoundSubShape) {
+ setValue(*aResIt, aFoundSubShape);
+ return;
+ }
+
+ // special case for ResultConstruction if the FACE is selected
+ ResultConstructionPtr aResConstr =
+ std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(*aResIt);
+ if (aResConstr && aType >= GeomAPI_Shape::FACE) {
+ int aNbFaces = aResConstr->facesNum();
+ for (int aFaceInd = 0; aFaceInd < aNbFaces; ++aFaceInd) {
+ GeomFacePtr aCurFace = aResConstr->face(aFaceInd);
+ // check the point is within bounding box of the face
+ if (!isPointWithinBB(thePoint, aCurFace))
+ continue;
+ aFoundSubShape = findSubShape(aCurFace, aType, thePoint);
+ if (aFoundSubShape) {
+ setValue(*aResIt, aFoundSubShape);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ TDF_Label aSelLab = selectionLabel();
+ setInvalidIfFalse(aSelLab, false);
+ reset();
+}
+
int Model_AttributeSelection::Id()
{
int anID = 0;
MODEL_EXPORT virtual void selectSubShape(const std::string& theType,
const std::string& theSubShapeName);
+ /// Selects sub-shape by its inner point
+ MODEL_EXPORT virtual void selectSubShape(const std::string& theType,
+ const std::shared_ptr<GeomAPI_Pnt>& thePoint);
+
/// Returns true if attribute was initialized by some value
MODEL_EXPORT virtual bool isInitialized();
#include "Model_Events.h"
#include "Model_Data.h"
+#include <GeomAPI_Pnt.h>
#include <GeomAPI_Shape.h>
#include <TDF_AttributeIterator.hxx>
}
void Model_AttributeSelectionList::append(
- const std::string theNamingName, const std::string& theType)
+ const std::string& theNamingName, const std::string& theType)
{
int aNewTag = mySize->Get() + 1;
TDF_Label aNewLab = mySize->Label().FindChild(aNewTag);
owner()->data()->sendAttributeUpdated(this);
}
+void Model_AttributeSelectionList::append(const GeomPointPtr& thePoint, const std::string& theType)
+{
+ int aNewTag = mySize->Get() + 1;
+ TDF_Label aNewLab = mySize->Label().FindChild(aNewTag);
+
+ std::shared_ptr<Model_AttributeSelection> aNewAttr =
+ std::shared_ptr<Model_AttributeSelection>(new Model_AttributeSelection(aNewLab));
+ if (owner()) {
+ aNewAttr->setObject(owner());
+ aNewAttr->setParent(this);
+ }
+ aNewAttr->setID(id());
+ mySize->Set(aNewTag);
+ aNewAttr->selectSubShape(theType, thePoint);
+ owner()->data()->sendAttributeUpdated(this);
+}
+
void Model_AttributeSelectionList::removeTemporaryValues()
{
if (myTmpAttr.get()) {
/// Adds the new reference to the end of the list by the naming name of the selected shape
/// The type of shape is taken from the current selection type if the given is empty
- MODEL_EXPORT virtual void append(const std::string theNamingName, const std::string& theType="");
+ MODEL_EXPORT virtual void append(const std::string& theNamingName, const std::string& theType="");
+
+ /// Adds the new reference to the end of the list by inner point on the selected shape
+ MODEL_EXPORT virtual void append(const std::shared_ptr<GeomAPI_Pnt>& thePoint,
+ const std::string& theType);
/// Reset temporary stored values
virtual void removeTemporaryValues();
#include <ModelAPI_Result.h>
class GeomAPI_Edge;
+class GeomAPI_Pnt;
/**\class ModelAPI_AttributeSelection
* \ingroup DataModel
/// Selects sub-shape by the textual Name
virtual void selectSubShape(const std::string& theType, const std::string& theSubShapeName) = 0;
+ /// Selects sub-shape by its inner point
+ virtual void selectSubShape(const std::string& theType,
+ const std::shared_ptr<GeomAPI_Pnt>& thePoint) = 0;
+
/// Returns true if recompute of selection become impossible
virtual bool isInvalid() = 0;
#include "ModelAPI_AttributeSelection.h"
#include <ModelAPI_Result.h>
+class GeomAPI_Pnt;
class GeomAPI_Shape;
/**\class ModelAPI_AttributeSelectionList
/// Adds the new reference to the end of the list by the naming name of the selected shape
/// The type of shape is taken from the current selection type if the given is empty
- virtual void append(const std::string theNamingName, const std::string& theType = "") = 0;
+ virtual void append(const std::string& theNamingName, const std::string& theType = "") = 0;
+
+ /// Adds the new reference to the end of the list by inner point on the selected shape
+ virtual void append(const std::shared_ptr<GeomAPI_Pnt>& thePoint,
+ const std::string& theType) = 0;
/// Reset temporary stored values
virtual void removeTemporaryValues() = 0;
ModelHighAPI_Dumper* ModelHighAPI_Dumper::mySelf = 0;
ModelHighAPI_Dumper::ModelHighAPI_Dumper()
+ : myGeometricalSelection(false)
{
clear();
}
return *this;
}
- myDumpBuffer << "\"" << aShape->shapeTypeStr() << "\", \"" <<
- theAttrSelect->namingName() << "\")";
+ myDumpBuffer << "\"" << aShape->shapeTypeStr() << "\", ";
+ if (myGeometricalSelection)
+ *this << aShape->middlePoint();
+ else
+ myDumpBuffer << "\"" << theAttrSelect->namingName() << "\"";
+ myDumpBuffer << ")";
return *this;
}
} else {
isAdded = true;
}
- myDumpBuffer << "model.selection(\"" <<
- aShape->shapeTypeStr() << "\", \"" << anAttribute->namingName() << "\")";
+ *this << anAttribute;
}
myDumpBuffer << "]";
/// Destructor
virtual ~ModelHighAPI_Dumper() {}
+ /// Set/unset flag to dump selection attributes by geometrical properties:
+ /// inner point in the selected shape
+ void setSelectionByGeometry(bool theDumpByGeom = true)
+ { myGeometricalSelection = theDumpByGeom; }
+
/// Dump given document into the file
/// \return \c true, if succeed
MODELHIGHAPI_EXPORT
std::list<EntityPtr> myPostponed; ///< list of postponed entities (sketch constraints or folders)
bool myDumpPostponedInProgress; ///< processing postponed is in progress
+ bool myGeometricalSelection; ///< dump selection not by naming, but by coordinates of inner point
+
protected:
/// list of entities, used by other features but not dumped yet
std::set<EntityPtr> myNotDumpedEntities;
#include <ModelAPI_Feature.h>
#include <ModelAPI_ResultBody.h>
+
+#include <GeomAPI_Pnt.h>
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------
{
}
+ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
+ const GeomPointPtr& theSubShapeInnerPoint)
+: myVariantType(VT_TypeInnerPointPair)
+, myTypeInnerPointPair(theType, theSubShapeInnerPoint)
+{
+}
+
ModelHighAPI_Selection::~ModelHighAPI_Selection()
{
}
return;
case VT_TypeSubShapeNamePair:
theAttribute->selectSubShape(myTypeSubShapeNamePair.first, myTypeSubShapeNamePair.second);
- if(theAttribute->isInvalid()) {
- FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner());
- aFeature->setError(
- std::string("Error: attribute \"") + theAttribute->id() + std::string("\" is invalid."));
- }
+ break;
+ case VT_TypeInnerPointPair:
+ theAttribute->selectSubShape(myTypeInnerPointPair.first, myTypeInnerPointPair.second);
return;
}
+
+ if (theAttribute->isInvalid()) {
+ FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner());
+ aFeature->setError(
+ std::string("Error: attribute \"") + theAttribute->id() + std::string("\" is invalid."));
+ }
}
//--------------------------------------------------------------------------------------
// Note: the reverse order (first - type, second - sub-shape name)
theAttribute->append(myTypeSubShapeNamePair.second, myTypeSubShapeNamePair.first);
return;
+ case VT_TypeInnerPointPair:
+ // Note: the reverse order (first - type, second - selected point)
+ theAttribute->append(myTypeInnerPointPair.second, myTypeInnerPointPair.first);
+ return;
}
}
return myTypeSubShapeNamePair;
}
+//==================================================================================================
+TypeInnerPointPair ModelHighAPI_Selection::typeInnerPointPair() const
+{
+ return myTypeInnerPointPair;
+}
+
//==================================================================================================
std::string ModelHighAPI_Selection::shapeType() const
{
return myResultSubShapePair.second.get() ? myResultSubShapePair.second->shapeTypeStr() :
myResultSubShapePair.first->shape()->shapeTypeStr();
case VT_TypeSubShapeNamePair: return myTypeSubShapeNamePair.first;
+ case VT_TypeInnerPointPair: return myTypeInnerPointPair.first;
}
return "SHAPE";
#include <string>
#include <utility>
//--------------------------------------------------------------------------------------
+class GeomAPI_Pnt;
class GeomAPI_Shape;
class ModelAPI_AttributeSelection;
class ModelAPI_AttributeSelectionList;
typedef std::pair<std::shared_ptr<ModelAPI_Result>, std::shared_ptr<GeomAPI_Shape> >
ResultSubShapePair;
typedef std::pair<std::string, std::string> TypeSubShapeNamePair;
+typedef std::pair<std::string, std::shared_ptr<GeomAPI_Pnt> > TypeInnerPointPair;
//--------------------------------------------------------------------------------------
/**\class ModelHighAPI_Selection
* \ingroup CPPHighAPI
enum VariantType {
VT_Empty,
VT_ResultSubShapePair,
- VT_TypeSubShapeNamePair
+ VT_TypeSubShapeNamePair,
+ VT_TypeInnerPointPair
};
public:
MODELHIGHAPI_EXPORT
ModelHighAPI_Selection(const std::string& theType,
const std::string& theSubShapeName);
+
+ /// Constructor for sub-shape by inner point coordinates
+ MODELHIGHAPI_EXPORT
+ ModelHighAPI_Selection(const std::string& theType,
+ const std::shared_ptr<GeomAPI_Pnt>& theSubShapeInnerPoint);
+
/// Destructor
MODELHIGHAPI_EXPORT
virtual ~ModelHighAPI_Selection();
MODELHIGHAPI_EXPORT
virtual TypeSubShapeNamePair typeSubShapeNamePair() const;
+ /// \return pair of sub-shape type and inner point to identify sub-shape.
+ MODELHIGHAPI_EXPORT
+ virtual TypeInnerPointPair typeInnerPointPair() const;
+
/// \return shape type.
MODELHIGHAPI_EXPORT
virtual std::string shapeType() const;
VariantType myVariantType;
ResultSubShapePair myResultSubShapePair;
TypeSubShapeNamePair myTypeSubShapeNamePair;
+ TypeInnerPointPair myTypeInnerPointPair;
};
//--------------------------------------------------------------------------------------