ObjectPtr aObject = aObjects.front();
FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aObject);
bool anExternal = false;
- if (aSelectedFeature.get() != NULL) {
- std::shared_ptr<SketchPlugin_Feature> aSPFeature =
- std::dynamic_pointer_cast<SketchPlugin_Feature>(aSelectedFeature);
+ std::shared_ptr<SketchPlugin_Feature> aSPFeature;
+ if (aSelectedFeature.get() != NULL)
+ aSPFeature = std::dynamic_pointer_cast<SketchPlugin_Feature>(aSelectedFeature);
if ((!aSPFeature) && (!aShape.IsNull())) {
anExternal = true;
ResultPtr aFixedObject = PartSet_Tools::findFixedObjectByExternal(aShape, aObject, mySketch);
emit focusOutWidget(this);
}
}
- }
if (!anExternal) {
double aX, aY;
bool isProcessed = false;
#include <set>
+#define DEBUG_DELIVERY
+
XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop)
: myWorkshop(theWorkshop)
{
// the located method is called in the context to obtain the shape by the SelectedShape() method,
// so the shape is located by the same rules
TopoDS_Shape aShape = aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location());
+#ifndef DEBUG_DELIVERY
+ if (aShape.IsNull())
+ aShape = findAxisShape(anIO);
+#endif
if (!aShape.IsNull())
thePrs.setShape(aShape);
} else {
+#ifdef DEBUG_DELIVERY
// Fill by trihedron shapes
Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(anIO);
if (!aAxis.IsNull()) {
thePrs.setShape(aVertex);
}
}
+#endif
}
XGUI_Displayer* aDisplayer = myWorkshop->displayer();
for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
TopoDS_Shape aShape = aContext->SelectedShape();
+ if (aShape.IsNull()) {
+ aShape = findAxisShape(aContext->SelectedInteractive());
+ }
if (!aShape.IsNull()) {
theList.Append(aShape);
Handle(SelectMgr_EntityOwner) aEO = aContext->SelectedOwner();
}
}
}
+
+//**************************************************************
+TopoDS_Shape XGUI_Selection::findAxisShape(Handle(AIS_InteractiveObject) theIO) const
+{
+ TopoDS_Shape aShape;
+ // Fill by trihedron shapes
+ Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(theIO);
+ if (!aAxis.IsNull()) {
+ // an Axis from Trihedron
+ Handle(Geom_Line) aLine = aAxis->Component();
+ Handle(Prs3d_DatumAspect) DA = aAxis->Attributes()->DatumAspect();
+ Handle(Geom_TrimmedCurve) aTLine = new Geom_TrimmedCurve(aLine, 0, DA->FirstAxisLength());
+
+ BRep_Builder aBuilder;
+ TopoDS_Edge aEdge;
+ aBuilder.MakeEdge(aEdge, aTLine, Precision::Confusion());
+ if (!aEdge.IsNull())
+ aShape = aEdge;
+ } else {
+ Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast(theIO);
+ if (!aPoint.IsNull()) {
+ // A point from trihedron
+ Handle(Geom_Point) aPnt = aPoint->Component();
+ BRep_Builder aBuilder;
+ TopoDS_Vertex aVertex;
+ aBuilder.MakeVertex(aVertex, aPnt->Pnt(), Precision::Confusion());
+ if (!aVertex.IsNull())
+ aShape = aVertex;
+ }
+ }
+ return aShape;
+}
/// \param thePresentations an output list of presentation
void getSelectedInBrowser(QList<ModuleBase_ViewerPrs>& thePresentations) const;
+ /// Generates a vertex or edge by the give IO if it is an AIS created on trihedron
+ /// \param theIO a selected object
+ /// \return created shape or empty shape
+ TopoDS_Shape findAxisShape(Handle(AIS_InteractiveObject) theIO) const;
+
private:
XGUI_Workshop* myWorkshop;
};