-// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2019 CEA/DEN, EDF R&D
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include "XGUI_InspectionPanel.h"
+#include "XGUI_Workshop.h"
#include "XGUI_SelectionMgr.h"
#include "XGUI_Selection.h"
#include "XGUI_Tools.h"
+#include "XGUI_ModuleConnector.h"
#include <ModuleBase_ViewerPrs.h>
#include <ModuleBase_Tools.h>
+#include <ModuleBase_OperationDescription.h>
+#include <ModuleBase_WidgetFactory.h>
+#include <ModuleBase_IModule.h>
+#include <ModuleBase_PageWidget.h>
+
+#include <ModelAPI_ResultField.h>
#include <ModelAPI_Result.h>
+#include <GeomAPI_Ax3.h>
+#include <GeomAPI_Box.h>
+#include <GeomAPI_Circ.h>
+#include <GeomAPI_Cone.h>
+#include <GeomAPI_Cylinder.h>
+#include <GeomAPI_Edge.h>
+#include <GeomAPI_Ellipse.h>
+#include <GeomAPI_Face.h>
+#include <GeomAPI_Pln.h>
+#include <GeomAPI_Pnt.h>
+#include <GeomAPI_Shell.h>
+#include <GeomAPI_Solid.h>
+#include <GeomAPI_Sphere.h>
+#include <GeomAPI_Torus.h>
+#include <GeomAPI_Vertex.h>
+#include <GeomAPI_Wire.h>
+
#include <QLayout>
#include <QScrollArea>
#include <QLabel>
#include <QTableWidget>
#include <QHeaderView>
#include <QTextBrowser>
+#include <QResizeEvent>
+#include <QSplitter>
+#include <QStackedWidget>
-#include <BRep_Tool.hxx>
-#include <BRepTools.hxx>
-#include <BRepGProp.hxx>
-#include <GeomAbs_CurveType.hxx>
-#include <GeomAbs_SurfaceType.hxx>
-#include <GeomAdaptor_Curve.hxx>
-#include <GeomAdaptor_Surface.hxx>
-#include <Geom_BSplineCurve.hxx>
-#include <GProp_GProps.hxx>
-#include <gp_Circ.hxx>
-#include <gp_Elips.hxx>
-#include <gp_Sphere.hxx>
-#include <gp_Cylinder.hxx>
-#include <gp_Cone.hxx>
-#include <gp_Torus.hxx>
+#include <BRepBndLib.hxx>
+#include <TopoDS_Iterator.hxx>
#include <TopTools_MapOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
-#include <TopExp.hxx>
-#include <TopExp_Explorer.hxx>
-#include <TopoDS_Iterator.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS_Face.hxx>
-#include <TopoDS_Wire.hxx>
#include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic
-XGUI_InspectionPanel::XGUI_InspectionPanel(QWidget* theParent, XGUI_SelectionMgr* theMgr)
+
+// ================ Auxiliary functions ================
+#define TITLE(val) ("<b>" + (val) + "</b>")
+
+static void appendPointToParameters(const QString& thePointTitle,
+ const GeomPointPtr& theCoord,
+ QString& theParams)
+{
+ theParams += TITLE(thePointTitle) +
+ "<br> X: " + QString::number(theCoord->x()) +
+ "<br> Y: " + QString::number(theCoord->y()) +
+ "<br> Z: " + QString::number(theCoord->z()) +
+ "<br>";
+}
+
+static void appendDirToParameters(const QString& theDirTitle,
+ const GeomDirPtr& theDirection,
+ QString& theParams)
+{
+ theParams += TITLE(theDirTitle) +
+ "<br> DX: " + QString::number(theDirection->x()) +
+ "<br> DY: " + QString::number(theDirection->y()) +
+ "<br> DZ: " + QString::number(theDirection->z()) +
+ "<br>";
+}
+
+static void appendGroupNameToParameters(const QString& theGroupTitle, QString& theParams)
+{
+ theParams += TITLE(theGroupTitle) + "<br>";
+}
+
+static void appendNamedValueToParameters(const QString& theName,
+ const double theValue,
+ QString& theParams)
+{
+ theParams += theName + ": " + QString::number(theValue) + "<br>";
+}
+
+static void appendNamedValueToParameters(const QString& theName,
+ const bool theValue,
+ QString& theParams)
+{
+ theParams += theName + ": " + (theValue ? "True" : "False") + "<br>";
+}
+
+
+// ================ XGUI_InspectionPanel ================
+
+XGUI_InspectionPanel::XGUI_InspectionPanel(QWidget* theParent, XGUI_Workshop* theWorkshop)
: QDockWidget(theParent),
- mySelectionMgr(theMgr)
+ myWorkshop(theWorkshop)
{
setWindowTitle(tr("Inspection Panel"));
setObjectName(INSPECTION_PANEL);
setStyleSheet("::title { position: relative; padding-left: 5px; text-align: left center }");
- QScrollArea* aScrollArea = new QScrollArea(this);
- setWidget(aScrollArea);
-
- // Create an internal widget
- QWidget* aMainWidget = new QWidget(aScrollArea);
+ myStackWgt = new QStackedWidget(this);
- QVBoxLayout* aMainLayout = new QVBoxLayout(aMainWidget);
- aMainLayout->setContentsMargins(5, 5, 5, 5);
+ // Create shape selection page
+ QSplitter* aSplitter = new QSplitter(Qt::Vertical, myStackWgt);
- QWidget* aNameWgt = new QWidget(aMainWidget);
+ // Create an internal widget
+ QWidget* aNameWgt = new QWidget(aSplitter);
QHBoxLayout* aNameLayout = new QHBoxLayout(aNameWgt);
- aNameLayout->setContentsMargins(0, 0, 0, 0);
+ aNameLayout->setContentsMargins(3, 0, 3, 0);
aNameLayout->addWidget(new QLabel(tr("Object"), aNameWgt));
myNameEdt = new QLineEdit(aNameWgt);
myNameEdt->setReadOnly(true);
aNameLayout->addWidget(myNameEdt);
- aMainLayout->addWidget(aNameWgt);
+ aSplitter->addWidget(aNameWgt);
// Table with sub-shapes
- mySubShapesTab = new QTableWidget(9, 2, aMainWidget);
+ mySubShapesTab = new QTableWidget(9, 2, aSplitter);
mySubShapesTab->setFocusPolicy(Qt::NoFocus);
mySubShapesTab->verticalHeader()->hide();
QStringList aTitles;
mySubShapesTab->setHorizontalHeaderLabels(aTitles);
QStringList aSubShapes;
- aSubShapes << "SHAPE" << "COMPOUND" << "COMPSOLID" <<
- "SOLID" << "SHELL" << "FACE" << "WIRE" << "EDGE" << "VERTEX";
+ aSubShapes << tr("SHAPE") << tr("COMPOUND") << tr("COMPSOLID") <<
+ tr("SOLID") << tr("SHELL") << tr("FACE") << tr("WIRE") << tr("EDGE") << tr("VERTEX");
int i = 0;
foreach(QString aType, aSubShapes) {
QTableWidgetItem* aItem = new QTableWidgetItem(aType);
mySubShapesTab->setColumnWidth(0, 90);
mySubShapesTab->setColumnWidth(1, 70);
- mySubShapesTab->setMaximumWidth(170);
- mySubShapesTab->setMinimumHeight(300);
-
- aMainLayout->addWidget(mySubShapesTab);
+ aSplitter->addWidget(mySubShapesTab);
// Type of object
- QWidget* aTypeWgt = new QWidget(aMainWidget);
+ QWidget* aTypeWgt = new QWidget(aSplitter);
QHBoxLayout* aTypeLayout = new QHBoxLayout(aTypeWgt);
- aTypeLayout->setContentsMargins(0, 0, 0, 0);
+ aTypeLayout->setContentsMargins(3, 0, 3, 0);
aTypeLayout->addWidget(new QLabel(tr("Type:"), aTypeWgt));
myTypeLbl = new QLabel("", aTypeWgt);
aTypeLayout->addWidget(myTypeLbl);
- aMainLayout->addWidget(aTypeWgt);
+ aSplitter->addWidget(aTypeWgt);
- myTypeParams = new QTextBrowser(aMainWidget);
- myTypeParams->setMaximumWidth(170);
- myTypeParams->setMaximumHeight(160);
+ myTypeParams = new QTextBrowser(aSplitter);
myTypeParams->setReadOnly(true);
myTypeParams->setFocusPolicy(Qt::NoFocus);
- myTypeParams->setFrameStyle(QFrame::NoFrame);
myTypeParams->viewport()->setBackgroundRole(QPalette::Window);
- aMainLayout->addWidget(myTypeParams);
+ aSplitter->addWidget(myTypeParams);
- aScrollArea->setWidget(aMainWidget);
+ aSplitter->setCollapsible(0, false);
+ aSplitter->setCollapsible(1, false);
+ aSplitter->setCollapsible(2, false);
+ aSplitter->setCollapsible(3, false);
- connect(mySelectionMgr, SIGNAL(selectionChanged()), SLOT(onSelectionChanged()));
+ QList<int> aSizes;
+ aSizes << 10 << 140 << 10;
+ aSplitter->setSizes(aSizes);
+
+ myShapePanelId = myStackWgt->addWidget(aSplitter);
+
+ // Create feature selection page
+ QScrollArea* aScroll = new QScrollArea(myStackWgt);
+ aScroll->setWidgetResizable(true);
+ aScroll->setFrameStyle(QFrame::NoFrame);
+
+ myFeaturePane = new ModuleBase_PageWidget(aScroll);
+ myFeatureLayout = new QGridLayout(myFeaturePane);
+ myFeatureLayout->setContentsMargins(3, 3, 3, 3);
+ aScroll->setWidget(myFeaturePane);
+ //myFeaturePane->setEnabled(false);
+
+ myFeaturePanelId = myStackWgt->addWidget(aScroll);
+
+ setWidget(myStackWgt);
+ connect(myWorkshop->selector(), SIGNAL(selectionChanged()), SLOT(onSelectionChanged()));
}
//********************************************************************
//********************************************************************
void XGUI_InspectionPanel::clearContent()
{
+ myStackWgt->setCurrentIndex(myFeaturePanelId);
setName("");
for (int i = 0; i <= VertexId; i++) {
mySubShapesTab->item((SudShape)i, 1)->setText("");
}
myTypeLbl->setText("");
- myTypeParams->setText("");
+ setParamsText("");
+
+ myFeaturePane->clearPage();
}
//********************************************************************
void XGUI_InspectionPanel::onSelectionChanged()
{
+ if (!isVisible())
+ return;
+
clearContent();
- XGUI_Selection* aSelection = mySelectionMgr->selection();
+
+ XGUI_Selection* aSelection = myWorkshop->selector()->selection();
QList<ModuleBase_ViewerPrsPtr> aSelectedList =
- aSelection->getSelected(ModuleBase_ISelection::Viewer);
+ aSelection->getSelected(myWorkshop->selector()->placeOfSelection());
+
if (aSelectedList.count() > 0) {
ModuleBase_ViewerPrsPtr aPrs = aSelectedList.first();
- TopoDS_Shape aShape = ModuleBase_Tools::getSelectedShape(aPrs);
- if (aShape.IsNull())
+ FieldStepPtr aStep =
+ std::dynamic_pointer_cast<ModelAPI_ResultField::ModelAPI_FieldStep>(aPrs->object());
+ if (aStep)
return;
- setName(XGUI_Tools::generateName(aPrs));
- setShapeContent(aShape);
- setShapeParams(aShape);
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aPrs->object());
+ if (aFeature.get()) {
+ myStackWgt->setCurrentIndex(myFeaturePanelId);
+ buildFeaturePane(aFeature);
+ }
+ else {
+ TopoDS_Shape aShape = ModuleBase_Tools::getSelectedShape(aPrs);
+ if (aShape.IsNull()) {
+ ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(aPrs->object());
+ if (aRes.get()) {
+ GeomShapePtr aShpPtr = aRes->shape();
+ if (aShpPtr.get()) {
+ aShape = aShpPtr->impl<TopoDS_Shape>();
+ }
+ }
+ }
+ if (aShape.IsNull()) {
+ myStackWgt->setCurrentIndex(myFeaturePanelId);
+ return;
+ }
+ myStackWgt->setCurrentIndex(myShapePanelId);
+ GeomShapePtr aShapePtr(new GeomAPI_Shape());
+ aShapePtr->setImpl(new TopoDS_Shape(aShape));
+
+ ModuleBase_ViewerPrsPtr aPrsCopy(new ModuleBase_ViewerPrs(aPrs->object(), aShapePtr));
+ setName(XGUI_Tools::generateName(aPrsCopy));
+ setShapeContent(aShape);
+ setShapeParams(aShape);
+ }
}
}
setSubShapeValue(ShapeId, aMapOfShape.Extent());
}
catch (Standard_Failure) {
- Handle(Standard_Failure) aFail = Standard_Failure::Caught();
- //SetErrorCode(aFail->GetMessageString());
}
}
//********************************************************************
void XGUI_InspectionPanel::setShapeParams(const TopoDS_Shape& theShape)
{
- switch (theShape.ShapeType()) {
- case TopAbs_VERTEX:
- fillVertex(theShape);
+ GeomShapePtr aShape(new GeomAPI_Shape);
+ aShape->setImpl(new TopoDS_Shape(theShape));
+
+ switch (aShape->shapeType()) {
+ case GeomAPI_Shape::VERTEX:
+ fillVertex(aShape->vertex());
+ break;
+ case GeomAPI_Shape::EDGE:
+ fillEdge(aShape->edge());
+ break;
+ case GeomAPI_Shape::FACE:
+ fillFace(aShape->face());
break;
- case TopAbs_EDGE:
- fillEdge(theShape);
+ case GeomAPI_Shape::SOLID:
+ fillSolid(aShape->solid());
break;
- case TopAbs_FACE:
- fillFace(theShape);
+ case GeomAPI_Shape::WIRE:
+ fillWire(aShape->wire());
break;
- case TopAbs_SOLID:
- fillSolid(theShape);
+ case GeomAPI_Shape::SHELL:
+ fillShell(aShape->shell());
break;
- case TopAbs_WIRE:
- case TopAbs_SHELL:
- case TopAbs_COMPSOLID:
- case TopAbs_COMPOUND:
- fillContainer(theShape);
+ case GeomAPI_Shape::COMPSOLID:
+ case GeomAPI_Shape::COMPOUND:
+ fillContainer(aShape);
break;
}
}
//********************************************************************
-void XGUI_InspectionPanel::fillVertex(const TopoDS_Shape& theShape)
+void XGUI_InspectionPanel::fillVertex(const GeomVertexPtr& theVertex)
{
- TopoDS_Vertex aV = TopoDS::Vertex(theShape);
- gp_Pnt aP = BRep_Tool::Pnt(aV);
- setVertexType(aP.XYZ());
-}
+ GeomPointPtr aPoint = theVertex->point();
-//********************************************************************
-void XGUI_InspectionPanel::fillEdge(const TopoDS_Shape& theShape)
-{
- TopoDS_Edge aE = TopoDS::Edge(theShape);
-
- bool bDegenerated = BRep_Tool::Degenerated(aE);
-
- double aT1, aT2;
- Handle(Geom_Curve) aC3D = BRep_Tool::Curve(aE, aT1, aT2);
- GeomAdaptor_Curve aGAC(aC3D);
- GeomAbs_CurveType aCT = aGAC.GetType();
-
- if (aCT == GeomAbs_Line) { // Line
- gp_Pnt aP1, aP2;
- aGAC.D0(aT1, aP1);
- aGAC.D0(aT2, aP2);
- setLineType(aP1.XYZ(), aP2.XYZ());
-
- } else if (aCT == GeomAbs_Circle) {
- gp_Circ aCirc = aGAC.Circle();
- gp_Pnt aP = aCirc.Location();
- gp_Ax2 aAx2 = aCirc.Position();
- double aR1 = aCirc.Radius();
- gp_Dir aDir = aAx2.Axis().Direction();
-
- bool isArc = (Abs(aT2 - aT1 - aC3D->Period()) >= Precision::PConfusion());
- if (isArc) {
- gp_Pnt aP1, aP2;
- aGAC.D0(aT1, aP1);
- aGAC.D0(aT2, aP2);
- setArcType(aP.XYZ(), aDir.XYZ(), aR1, aP1.XYZ(), aP2.XYZ());
- } else
- setCircleType(aP.XYZ(), aDir.XYZ(), aR1);
-
- } else if (aCT == GeomAbs_Ellipse) {
- gp_Elips aElips = aGAC.Ellipse();
- gp_Pnt aP = aElips.Location();
- gp_Ax2 aAx2 = aElips.Position();
- double aR1 = aElips.MajorRadius();
- double aR2 = aElips.MinorRadius();
- gp_Dir aDir = aAx2.Axis().Direction();
- gp_Pnt aP1, aP2;
- aGAC.D0(aT1, aP1);
- aGAC.D0(aT2, aP2);
- bool isArc = aP1.Distance(aP2) > Precision::Confusion();
- if (isArc)
- setEllipseArcType(aP.XYZ(), aDir.XYZ(), aR1, aR2, aP1.XYZ(), aP2.XYZ());
- else
- setEllipseType(aP.XYZ(), aDir.XYZ(), aR1, aR2);
- }
+ myTypeLbl->setText(tr("Vertex"));
+
+ QString aParams;
+ appendPointToParameters(tr("Coordinates"), aPoint, aParams);
+ setParamsText(aParams);
}
//********************************************************************
-void XGUI_InspectionPanel::fillFace(const TopoDS_Shape& theShape)
+void XGUI_InspectionPanel::fillEdge(const GeomEdgePtr& theEdge)
{
- TopoDS_Face aF = TopoDS::Face(theShape);
- //
- Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aF);
- GeomAdaptor_Surface aGAS(aSurf);
- GeomAbs_SurfaceType aST = aGAS.GetType();
-
- // 1. Plane
- if (aST == GeomAbs_Plane) {
- gp_Pln aPln = aGAS.Plane();
- gp_Pnt aP0 = aPln.Location();
- gp_Ax3 aAx3 = aPln.Position();
-
- setPlaneType(aP0.XYZ(), aAx3.Direction().XYZ());
- }
- // 2. Sphere
- else if (aST == GeomAbs_Sphere) {
- gp_Sphere aSphere = aGAS.Sphere();
- gp_Pnt aP0 = aSphere.Location();
- double aR1 = aSphere.Radius();
+ QString aParams;
+ if (theEdge->isDegenerated())
+ appendNamedValueToParameters(tr("Degenerated"), true, aParams);
- setSphereType(aP0.XYZ(), aR1);
- }
- // 3. Cylinder
- else if (aST == GeomAbs_Cylinder) {
- gp_Cylinder aCyl = aGAS.Cylinder();
- gp_Pnt aP0 = aCyl.Location();
- gp_Ax3 aAx3 = aCyl.Position();
- double aR1 = aCyl.Radius();
-
- double aUMin, aUMax, aVMin, aVMax;
- BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax);
- double dV = aVMax - aVMin;
-
- setCylinderType(aP0.XYZ(), aAx3.Direction().XYZ(), aR1, dV);
- }
- // 4. Cone
- else if (aST == GeomAbs_Cone) {
- gp_Cone aCone = aGAS.Cone();
- gp_Pnt aP0 = aCone.Location();
- gp_Ax3 aAx3 = aCone.Position();
- double aR1 = aCone.RefRadius();
-
- double aUMin, aUMax, aVMin, aVMax;
- BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax);
- double aSemiAngle = fabs(aCone.SemiAngle());
- double dV = (aVMax - aVMin)*cos(aSemiAngle);
- double aR2 = aR1 - (aVMax - aVMin)*sin(aSemiAngle);
-
- setConeType(aP0.XYZ(), aAx3.Direction().XYZ(), aR1, aR2, dV);
+ GeomPointPtr aStartPnt = theEdge->firstPoint();
+ GeomPointPtr aEndPnt = theEdge->lastPoint();
+ bool addStartEndPoints = false;
+
+ if (theEdge->isLine()) {
+ myTypeLbl->setText(tr("Line segment"));
+ addStartEndPoints = true;
}
- // 5. Torus
- else if (aST == GeomAbs_Torus) {
- gp_Torus aTorus = aGAS.Torus();
- gp_Pnt aP0 = aTorus.Location();
- gp_Ax3 aAx3 = aTorus.Position();
- double aR1 = aTorus.MajorRadius();
- double aR2 = aTorus.MinorRadius();
-
- setTorusType(aP0.XYZ(), aAx3.Direction().XYZ(), aR1, aR2);
+ else {
+ GeomCirclePtr aCircle = theEdge->circle();
+ if (aCircle) {
+ addStartEndPoints = aStartPnt->distance(aEndPnt) >= Precision::Confusion();
+ if (addStartEndPoints)
+ myTypeLbl->setText("Arc of circle");
+ else
+ myTypeLbl->setText("Circle");
+
+ appendPointToParameters(tr("Center"), aCircle->center(), aParams);
+ appendDirToParameters(tr("Normal"), aCircle->normal(), aParams);
+ appendGroupNameToParameters(tr("Dimensions"), aParams);
+ appendNamedValueToParameters(tr("Radius"), aCircle->radius(), aParams);
+ }
+ else {
+ GeomEllipsePtr anEllipse = theEdge->ellipse();
+ if (anEllipse) {
+ addStartEndPoints = aStartPnt->distance(aEndPnt) >= Precision::Confusion();
+ if (addStartEndPoints)
+ myTypeLbl->setText("Arc of ellipse");
+ else
+ myTypeLbl->setText("Ellipse");
+
+ appendPointToParameters(tr("Center"), anEllipse->center(), aParams);
+ appendDirToParameters(tr("Normal"), anEllipse->normal(), aParams);
+ appendGroupNameToParameters(tr("Dimensions"), aParams);
+ appendNamedValueToParameters(tr("Major radius"), anEllipse->majorRadius(), aParams);
+ appendNamedValueToParameters(tr("Minor radius"), anEllipse->minorRadius(), aParams);
+ }
+ else
+ // Common case
+ myTypeLbl->setText(tr("Edge"));
+ }
}
-}
-//********************************************************************
-void XGUI_InspectionPanel::fillSolid(const TopoDS_Shape& theShape)
-{
- myTypeLbl->setText(tr("Solid"));
- TopoDS_Solid aSd = TopoDS::Solid(theShape);
- processSphere(aSd);
+ if (addStartEndPoints) {
+ appendPointToParameters(tr("Start point"), aStartPnt, aParams);
+ appendPointToParameters(tr("End point"), aEndPnt, aParams);
+ }
+ setParamsText(aParams);
}
-
-
//********************************************************************
-bool IsEqual(const gp_Sphere& aSp1, const gp_Sphere& aSp2, const Standard_Real aTolLin)
+void XGUI_InspectionPanel::fillWire(const GeomWirePtr& theWire)
{
- double aR1 = aSp1.Radius();
- double aR2 = aSp2.Radius();
- if (fabs(aR1 - aR2) > aTolLin) {
- return false;
+ QString aParams;
+ appendNamedValueToParameters(tr("Closed"), theWire->isClosed(), aParams);
+
+ // check the wire is a polygon
+ std::list<GeomPointPtr> aPolygonPoints;
+ if (theWire->isPolygon(aPolygonPoints)) {
+ myTypeLbl->setText(tr("Polygon"));
+ int aCornerIndex = 0;
+ for (std::list<GeomPointPtr>::const_iterator aPtIt = aPolygonPoints.begin();
+ aPtIt != aPolygonPoints.end(); ++aPtIt)
+ appendPointToParameters(tr("Point") + " " + QString::number(++aCornerIndex),
+ *aPtIt, aParams);
}
- const gp_Pnt& aPC1 = aSp1.Position().Location();
- const gp_Pnt& aPC2 = aSp2.Position().Location();
- double aD2 = aPC1.SquareDistance(aPC2);
- return (aD2 < (aTolLin*aTolLin));
-}
+ else
+ myTypeLbl->setText(tr("Wire"));
+ setParamsText(aParams);
+}
-bool XGUI_InspectionPanel::processSphere(const TopoDS_Solid& theSolid)
+//********************************************************************
+void XGUI_InspectionPanel::fillFace(const GeomFacePtr& theFace)
{
- gp_Sphere aSphere[2];
- GeomAbs_SurfaceType aST;
- Handle(Geom_Surface) aS;
- GeomAdaptor_Surface aGAS;
-
- double aTol = Precision::Confusion();
- double aTolAng = Precision::Angular();
-
- TopExp_Explorer aExp(theSolid, TopAbs_FACE);
- int j;
- for (j = 0; aExp.More(); aExp.Next(), ++j) {
- const TopoDS_Face& aF = *((TopoDS_Face*)&aExp.Current());
- aS = BRep_Tool::Surface(aF);
- aGAS.Load(aS);
- aST = aGAS.GetType();
- if (aST != GeomAbs_Sphere) {
- return false;
+ QString aParams;
+ // 1. Plane and planar faces
+ GeomPlanePtr aPlane = theFace->getPlane();
+ if (aPlane) {
+ bool isCommonCase = true;
+ // Check face bounded by circle or ellipse
+ std::list<GeomShapePtr> aSubs = theFace->subShapes(GeomAPI_Shape::EDGE);
+ if (aSubs.size() == 1) {
+ GeomEdgePtr anEdge = aSubs.front()->edge();
+ if (anEdge->isCircle() || anEdge->isEllipse()) {
+ fillEdge(anEdge);
+ isCommonCase = false;
+ }
}
- aSphere[j] = aGAS.Sphere();
- }
- bool bIsEqual = IsEqual(aSphere[0], aSphere[1], aTol);
- if (!bIsEqual) {
- return false;
- }
- GProp_GProps aGProps;
- bool bOnlyClosed = false;
- double aVolume = aSphere[0].Volume();
- BRepGProp::VolumeProperties(theSolid, aGProps, aTol, bOnlyClosed);
-
- double aVolumeS = aGProps.Mass();
- if (aVolumeS < 0.) {
- aVolumeS = -aVolumeS;
- }
- double dV = fabs(aVolumeS - aVolume);
- if (dV > aTol) {
- return false;
+ else {
+ // Check face bounded by a single wire which is rectangle
+ aSubs = theFace->subShapes(GeomAPI_Shape::WIRE);
+ if (aSubs.size() == 1) {
+ GeomWirePtr aWire = aSubs.front()->wire();
+ std::list<GeomPointPtr> aCorners;
+ if (aWire->isRectangle(aCorners)) {
+ GeomPointPtr aBaseCorner = aCorners.front();
+ aCorners.pop_front();
+
+ double aWidth = aBaseCorner->distance(aCorners.front());
+ double aHeight = aBaseCorner->distance(aCorners.back());
+
+ myTypeLbl->setText(tr("Rectangle"));
+ appendPointToParameters(tr("Corner"), aBaseCorner, aParams);
+ appendDirToParameters(tr("Normal"), aPlane->direction(), aParams);
+ appendGroupNameToParameters(tr("Dimensions"), aParams);
+ appendNamedValueToParameters(tr("Width"), aWidth, aParams);
+ appendNamedValueToParameters(tr("Height"), aHeight, aParams);
+ setParamsText(aParams);
+
+ isCommonCase = false;
+ }
+ }
+ }
+
+ if (isCommonCase)
+ setPlaneType(tr("Plane"), aPlane);
}
- double aArea = aSphere[0].Area();
- BRepGProp::SurfaceProperties(theSolid, aGProps, aTol);
- double aAreaS = aGProps.Mass();
- double dA = fabs(aAreaS - aArea);
- if (dA > aTol) {
- return false;
+ else {
+ // 2. Sphere
+ GeomSpherePtr aSphere = theFace->getSphere();
+ if (aSphere)
+ setSphereType(tr("Sphere"), aSphere);
+ else {
+ // 3. Cylinder
+ GeomCylinderPtr aCylinder = theFace->getCylinder();
+ if (aCylinder)
+ setCylinderType(tr("Cylinder"), aCylinder);
+ else {
+ // 4. Cone
+ GeomConePtr aCone = theFace->getCone();
+ if (aCone)
+ setConeType(tr("Cone"), aCone);
+ else {
+ // 5. Torus
+ GeomTorusPtr aTorus = theFace->getTorus();
+ if (aTorus)
+ setTorusType(tr("Torus"), aTorus);
+ else
+ // 6. Common case
+ myTypeLbl->setText(tr("Face"));
+ }
+ }
+ }
}
- gp_Pnt aP0 = aSphere[0].Location();
- double aR1 = aSphere[0].Radius();
-
- setSphereType(aP0.XYZ(), aR1);
-
- return true;
}
-
//********************************************************************
-void XGUI_InspectionPanel::fillContainer(const TopoDS_Shape& theShape)
+void XGUI_InspectionPanel::fillShell(const GeomShellPtr& theShell)
{
- TopAbs_ShapeEnum aType = theShape.ShapeType();
- if (aType == TopAbs_SHELL) {
- bool aIsClosed = BRep_Tool::IsClosed(theShape);
- myTypeLbl->setText(tr("Shell"));
- myTypeParams->setText(aIsClosed? tr("Closed") : tr("Non-closed"));
- } else if (aType == TopAbs_WIRE) {
- TopoDS_Wire aW = TopoDS::Wire(theShape);
- bool isClosed = aW.Closed();
- myTypeLbl->setText(tr("Wire"));
- myTypeParams->setText(isClosed ? tr("Closed") : tr("Non-closed"));
+ // 1. Sphere
+ GeomSpherePtr aSphere = theShell->getSphere();
+ if (aSphere)
+ setSphereType(tr("Sphere"), aSphere);
+ else {
+ // 2. Cylinder
+ GeomCylinderPtr aCylinder = theShell->getCylinder();
+ if (aCylinder)
+ setCylinderType(tr("Cylinder"), aCylinder);
+ else {
+ // 3. Cone
+ GeomConePtr aCone = theShell->getCone();
+ if (aCone)
+ setConeType(tr("Cone"), aCone);
+ else {
+ // 4. Torus
+ GeomTorusPtr aTorus = theShell->getTorus();
+ if (aTorus)
+ setTorusType(tr("Torus"), aTorus);
+ else {
+ // 5. Axis-aligned/Rotated Box
+ GeomBoxPtr aBox = theShell->getParallelepiped();
+ if (aBox) {
+ if (aBox->isAxesAligned())
+ setBoxType(tr("Box"), aBox);
+ else
+ setRotatedBoxType(tr("Rotated Box"), aBox);
+ }
+ else
+ // 6. Common case
+ myTypeLbl->setText(tr("Shell"));
+ }
+ }
+ }
}
}
//********************************************************************
-#define TITLE(val) ("<b>" + val + "</b>")
-
-void XGUI_InspectionPanel::setCylinderType(const gp_XYZ& theLoc,
- const gp_XYZ& theDir, double theRadius, double theHeight)
+void XGUI_InspectionPanel::fillSolid(const GeomSolidPtr& theSolid)
{
- myTypeLbl->setText(tr("Cylinder"));
- QString aParams = TITLE(tr("Center")) +
- "<br> X: " + QString::number(theLoc.X()) +
- "<br> Y: " + QString::number(theLoc.Y()) +
- "<br> Z: " + QString::number(theLoc.Z()) +
- "<br>" + TITLE(tr("Axis")) +
- "<br> DX: " + QString::number(theDir.X()) +
- "<br> DY: " + QString::number(theDir.Y()) +
- "<br> DZ: " + QString::number(theDir.Z()) +
- "<br>" + TITLE(tr("Dimensions")) +
- "<br>" + tr("Radius: ") + QString::number(theRadius) +
- "<br>" + tr("Height: ") + QString::number(theHeight);
-
- myTypeParams->setText(aParams);
+ // 1. Sphere
+ GeomSpherePtr aSphere = theSolid->getSphere();
+ if (aSphere)
+ setSphereType(tr("Sphere"), aSphere);
+ else {
+ // 2. Cylinder
+ GeomCylinderPtr aCylinder = theSolid->getCylinder();
+ if (aCylinder)
+ setCylinderType(tr("Cylinder"), aCylinder);
+ else {
+ // 3. Cone
+ GeomConePtr aCone = theSolid->getCone();
+ if (aCone)
+ setConeType(tr("Cone"), aCone);
+ else {
+ // 4. Torus
+ GeomTorusPtr aTorus = theSolid->getTorus();
+ if (aTorus)
+ setTorusType(tr("Torus"), aTorus);
+ else {
+ // 5. Axis-aligned/Rotated Box
+ GeomBoxPtr aBox = theSolid->getParallelepiped();
+ if (aBox) {
+ if (aBox->isAxesAligned())
+ setBoxType(tr("Box"), aBox);
+ else
+ setRotatedBoxType(tr("Rotated Box"), aBox);
+ }
+ else
+ // 6. Common case
+ myTypeLbl->setText(tr("Solid"));
+ }
+ }
+ }
+ }
}
//********************************************************************
-void XGUI_InspectionPanel::setSphereType(const gp_XYZ& theLoc, double theRadius)
+void XGUI_InspectionPanel::fillContainer(const GeomShapePtr& theShape)
{
- myTypeLbl->setText(tr("Sphere"));
- QString aParams = TITLE(tr("Center")) +
- "<br> X: " + QString::number(theLoc.X()) +
- "<br> Y: " + QString::number(theLoc.Y()) +
- "<br> Z: " + QString::number(theLoc.Z()) +
- "<br>" + TITLE(tr("Dimensions")) +
- "<br>" + tr("Radius: ") + QString::number(theRadius);
- myTypeParams->setText(aParams);
-}
+ if (theShape->shapeType() == GeomAPI_Shape::COMPSOLID)
+ myTypeLbl->setText("CompSolid");
+ else if (theShape->shapeType() == GeomAPI_Shape::COMPOUND)
+ myTypeLbl->setText("Compound");
-//********************************************************************
-void XGUI_InspectionPanel::setBoxType(double theX, double theY, double theZ,
- double theXsize, double theYsize, double theZsize)
-{
- myTypeLbl->setText(tr("Box"));
- QString aParams = TITLE(tr("Position")) +
- "<br> X: " + QString::number(theX) +
- "<br> Y: " + QString::number(theY) +
- "<br> Z: " + QString::number(theZ) +
- "<br>" + TITLE(tr("Dimensions")) +
- "<br>" + "Ax :" + QString::number(theXsize) +
- "<br>" + "Ay :" + QString::number(theYsize) +
- "<br>" + "Az :" + QString::number(theZsize);
- myTypeParams->setText(aParams);
+ // fill bounding box
+ TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
+ Bnd_Box aBB;
+ BRepBndLib::Add(aShape, aBB);
+
+ if (aBB.IsVoid())
+ return;
+
+ gp_Pnt aMinPnt = aBB.CornerMin();
+ GeomPointPtr aMinPoint(new GeomAPI_Pnt(aMinPnt.X(), aMinPnt.Y(), aMinPnt.Z()));
+
+ gp_Pnt aMaxPnt = aBB.CornerMax();
+ GeomPointPtr aMaxPoint(new GeomAPI_Pnt(aMaxPnt.X(), aMaxPnt.Y(), aMaxPnt.Z()));
+
+ QString aParams;
+ appendGroupNameToParameters(tr("Bounding box"), aParams);
+ appendPointToParameters(tr("Minimal corner"), aMinPoint, aParams);
+ appendPointToParameters(tr("Maximal corner"), aMaxPoint, aParams);
}
//********************************************************************
-void XGUI_InspectionPanel::setRotatedBoxType(double theX, double theY, double theZ,
- double theZaxisX, double theZaxisY, double theZaxisZ,
- double theXaxisX, double theXaxisY, double theXaxisZ,
- double theXsize, double theYsize, double theZsize)
+void XGUI_InspectionPanel::setPlaneType(const QString& theTitle,
+ const std::shared_ptr<GeomAPI_Pln>& thePlane)
{
- myTypeLbl->setText(tr("Box"));
- QString aParams = TITLE(tr("Position")) +
- "<br> X: " + QString::number(theX) +
- "<br> Y: " + QString::number(theY) +
- "<br> Z: " + QString::number(theZ) +
- "<br>" + TITLE(tr("Z axis")) +
- "<br> DX: " + QString::number(theZaxisX) +
- "<br> DY: " + QString::number(theZaxisY) +
- "<br> DZ: " + QString::number(theZaxisZ) +
- "<br>" + TITLE(tr("X axis")) +
- "<br> DX: " + QString::number(theXaxisX) +
- "<br> DY: " + QString::number(theXaxisY) +
- "<br> DZ: " + QString::number(theXaxisZ) +
- "<br>" + TITLE(tr("Dimensions")) +
- "<br>" + "Ax :" + QString::number(theXsize) +
- "<br>" + "Ay :" + QString::number(theYsize) +
- "<br>" + "Az :" + QString::number(theZsize);
- myTypeParams->setText(aParams);
+ myTypeLbl->setText(theTitle);
+ QString aParams;
+ appendPointToParameters(tr("Origin"), thePlane->location(), aParams);
+ appendDirToParameters(tr("Normal"), thePlane->direction(), aParams);
+ setParamsText(aParams);
}
//********************************************************************
-void XGUI_InspectionPanel::setPlaneType(const gp_XYZ& theLoc, const gp_XYZ& theDir)
+void XGUI_InspectionPanel::setSphereType(const QString& theTitle,
+ const std::shared_ptr<GeomAPI_Sphere>& theSphere)
{
- myTypeLbl->setText(tr("Plane"));
- QString aParams = TITLE(tr("Center")) +
- "<br> X: " + QString::number(theLoc.X()) +
- "<br> Y: " + QString::number(theLoc.Y()) +
- "<br> Z: " + QString::number(theLoc.Z()) +
- "<br>" + TITLE(tr("Normal")) +
- "<br> DX: " + QString::number(theDir.X()) +
- "<br> DY: " + QString::number(theDir.Y()) +
- "<br> DZ: " + QString::number(theDir.Z());
- myTypeParams->setText(aParams);
+ myTypeLbl->setText(theTitle);
+ QString aParams;
+ appendPointToParameters(tr("Center"), theSphere->center(), aParams);
+ appendGroupNameToParameters(tr("Dimensions"), aParams);
+ appendNamedValueToParameters(tr("Radius"), theSphere->radius(), aParams);
+ setParamsText(aParams);
}
//********************************************************************
-void XGUI_InspectionPanel::setVertexType(const gp_XYZ& theLoc)
+void XGUI_InspectionPanel::setCylinderType(const QString& theTitle,
+ const std::shared_ptr<GeomAPI_Cylinder>& theCyl)
{
- myTypeLbl->setText(tr("Vertex"));
- QString aParams = TITLE(tr("Coordinates")) +
- "<br> X: " + QString::number(theLoc.X()) +
- "<br> Y: " + QString::number(theLoc.Y()) +
- "<br> Z: " + QString::number(theLoc.Z());
- myTypeParams->setText(aParams);
+ myTypeLbl->setText(theTitle);
+ QString aParams;
+ appendPointToParameters(tr("Position"), theCyl->location(), aParams);
+ appendDirToParameters(tr("Axis"), theCyl->axis(), aParams);
+ appendGroupNameToParameters(tr("Dimensions"), aParams);
+ appendNamedValueToParameters(tr("Radius"), theCyl->radius(), aParams);
+ appendNamedValueToParameters(tr("Height"), theCyl->height(), aParams);
+ setParamsText(aParams);
}
//********************************************************************
-void XGUI_InspectionPanel::setCircleType(const gp_XYZ& theLoc, const gp_XYZ& theDir,
- double theRadius)
+void XGUI_InspectionPanel::setConeType(const QString& theTitle,
+ const std::shared_ptr<GeomAPI_Cone>& theCone)
{
- myTypeLbl->setText(tr("Circle"));
- QString aParams = TITLE(tr("Center")) +
- "<br> X: " + QString::number(theLoc.X()) +
- "<br> Y: " + QString::number(theLoc.Y()) +
- "<br> Z: " + QString::number(theLoc.Z()) +
- "<br>" + TITLE(tr("Normal")) +
- "<br> DX: " + QString::number(theDir.X()) +
- "<br> DY: " + QString::number(theDir.Y()) +
- "<br> DZ: " + QString::number(theDir.Z()) +
- "<br>" + TITLE(tr("Dimensions")) +
- "<br>" + tr("Radius: ") + QString::number(theRadius);
- myTypeParams->setText(aParams);
+ myTypeLbl->setText(theTitle);
+ QString aParams;
+ appendPointToParameters(tr("Position"), theCone->location(), aParams);
+ appendDirToParameters(tr("Axis"), theCone->axis(), aParams);
+ appendGroupNameToParameters(tr("Dimensions"), aParams);
+ appendNamedValueToParameters(tr("Radius 1"), theCone->radius1(), aParams);
+ appendNamedValueToParameters(tr("Radius 2"), theCone->radius2(), aParams);
+ appendNamedValueToParameters(tr("Height"), theCone->height(), aParams);
+ setParamsText(aParams);
}
//********************************************************************
-void XGUI_InspectionPanel::setArcType(const gp_XYZ& theLoc, const gp_XYZ& theDir,
- double theRadius, const gp_XYZ& theP1, const gp_XYZ& theP2)
+void XGUI_InspectionPanel::setTorusType(const QString& theTitle,
+ const std::shared_ptr<GeomAPI_Torus>& theTorus)
{
- myTypeLbl->setText(tr("Arc"));
- QString aParams = TITLE(tr("Center")) +
- "<br> X: " + QString::number(theLoc.X()) +
- "<br> Y: " + QString::number(theLoc.Y()) +
- "<br> Z: " + QString::number(theLoc.Z()) +
- "<br>" + TITLE(tr("Normal")) +
- "<br> DX: " + QString::number(theDir.X()) +
- "<br> DY: " + QString::number(theDir.Y()) +
- "<br> DZ: " + QString::number(theDir.Z()) +
- "<br>" + TITLE(tr("Dimensions")) +
- "<br>" + tr("Radius:") + QString::number(theRadius) +
- "<br>" + TITLE(tr("Point 1")) +
- "<br> X: " + QString::number(theP1.X()) +
- "<br> Y: " + QString::number(theP1.Y()) +
- "<br> Z: " + QString::number(theP1.Z()) +
- "<br>" + TITLE(tr("Point 2")) +
- "<br> X: " + QString::number(theP2.X()) +
- "<br> Y: " + QString::number(theP2.Y()) +
- "<br> Z: " + QString::number(theP2.Z());
- myTypeParams->setText(aParams);
+ myTypeLbl->setText(theTitle);
+ QString aParams;
+ appendPointToParameters(tr("Center"), theTorus->center(), aParams);
+ appendDirToParameters(tr("Axis"), theTorus->direction(), aParams);
+ appendGroupNameToParameters(tr("Dimensions"), aParams);
+ appendNamedValueToParameters(tr("Major radius"), theTorus->majorRadius(), aParams);
+ appendNamedValueToParameters(tr("Minor radius"), theTorus->minorRadius(), aParams);
+ setParamsText(aParams);
}
//********************************************************************
-void XGUI_InspectionPanel::setEllipseType(const gp_XYZ& theLoc, const gp_XYZ& theDir,
- double theMajorRad, double theMinorRad)
+void XGUI_InspectionPanel::setBoxType(const QString& theTitle,
+ const std::shared_ptr<GeomAPI_Box>& theBox)
{
- myTypeLbl->setText(tr("Ellipse"));
- QString aParams = TITLE(tr("Center")) +
- "<br> X: " + QString::number(theLoc.X()) +
- "<br> Y: " + QString::number(theLoc.Y()) +
- "<br> Z: " + QString::number(theLoc.Z()) +
- "<br>" + TITLE(tr("Normal")) +
- "<br> DX: " + QString::number(theDir.X()) +
- "<br> DY: " + QString::number(theDir.Y()) +
- "<br> DZ: " + QString::number(theDir.Z()) +
- "<br>" + TITLE(tr("Dimensions")) +
- "<br>" + tr("Major radius: ") + QString::number(theMajorRad) +
- "<br>" + tr("Minor radius: ") + QString::number(theMinorRad);
- myTypeParams->setText(aParams);
+ myTypeLbl->setText(theTitle);
+ QString aParams;
+ appendPointToParameters(tr("Position"), theBox->axes()->origin(), aParams);
+ appendGroupNameToParameters(tr("Dimensions"), aParams);
+ appendNamedValueToParameters(tr("Width"), theBox->width(), aParams);
+ appendNamedValueToParameters(tr("Depth"), theBox->depth(), aParams);
+ appendNamedValueToParameters(tr("Height"), theBox->height(), aParams);
+ setParamsText(aParams);
}
//********************************************************************
-void XGUI_InspectionPanel::setEllipseArcType(const gp_XYZ& theLoc, const gp_XYZ& theDir,
- double theMajorRad, double theMinorRad, const gp_XYZ& theP1, const gp_XYZ& theP2)
+void XGUI_InspectionPanel::setRotatedBoxType(const QString& theTitle,
+ const std::shared_ptr<GeomAPI_Box>& theBox)
{
- myTypeLbl->setText(tr("Elliptical arc"));
- QString aParams = TITLE(tr("Center")) +
- "<br> X: " + QString::number(theLoc.X()) +
- "<br> Y: " + QString::number(theLoc.Y()) +
- "<br> Z: " + QString::number(theLoc.Z()) +
- "<br>" + TITLE(tr("Normal")) +
- "<br> DX: " + QString::number(theDir.X()) +
- "<br> DY: " + QString::number(theDir.Y()) +
- "<br> DZ: " + QString::number(theDir.Z()) +
- "<br>" + TITLE(tr("Dimensions")) +
- "<br>" + tr("Major radius:") + QString::number(theMajorRad) +
- "<br>" + tr("Minor radius:") + QString::number(theMinorRad) +
- "<br>" + TITLE(tr("Point 1")) +
- "<br> X: " + QString::number(theP1.X()) +
- "<br> Y: " + QString::number(theP1.Y()) +
- "<br> Z: " + QString::number(theP1.Z()) +
- "<br>" + TITLE(tr("Point 2")) +
- "<br> X: " + QString::number(theP2.X()) +
- "<br> Y: " + QString::number(theP2.Y()) +
- "<br> Z: " + QString::number(theP2.Z());
- myTypeParams->setText(aParams);
+ myTypeLbl->setText(theTitle);
+ QString aParams;
+ std::shared_ptr<GeomAPI_Ax3> anAxes = theBox->axes();
+ appendPointToParameters(tr("Position"), anAxes->origin(), aParams);
+ appendDirToParameters(tr("Z axis"), anAxes->normal(), aParams);
+ appendDirToParameters(tr("X axis"), anAxes->dirX(), aParams);
+ appendGroupNameToParameters(tr("Dimensions"), aParams);
+ appendNamedValueToParameters(tr("Width"), theBox->width(), aParams);
+ appendNamedValueToParameters(tr("Depth"), theBox->depth(), aParams);
+ appendNamedValueToParameters(tr("Height"), theBox->height(), aParams);
+ setParamsText(aParams);
}
-void XGUI_InspectionPanel::setLineType(const gp_XYZ& theP1, const gp_XYZ& theP2)
+
+//********************************************************************
+void XGUI_InspectionPanel::setParamsText(const QString& theText)
{
- myTypeLbl->setText(tr("Line"));
- QString aParams = TITLE(tr("Point 1")) +
- "<br> X: " + QString::number(theP1.X()) +
- "<br> Y: " + QString::number(theP1.Y()) +
- "<br> Z: " + QString::number(theP1.Z()) +
- "<br>" + TITLE(tr("Point 2")) +
- "<br> X: " + QString::number(theP2.X()) +
- "<br> Y: " + QString::number(theP2.Y()) +
- "<br> Z: " + QString::number(theP2.Z());
- myTypeParams->setText(aParams);
+ myTypeParams->setText(theText);
}
-void XGUI_InspectionPanel::setConeType(const gp_XYZ& theLoc, const gp_XYZ& theDir,
- double theRad1, double theRad2, double theHeight)
+//********************************************************************
+void XGUI_InspectionPanel::buildFeaturePane(const FeaturePtr& theFeature)
{
- myTypeLbl->setText(tr("Cone"));
- QString aParams = TITLE(tr("Center")) +
- "<br> X: " + QString::number(theLoc.X()) +
- "<br> Y: " + QString::number(theLoc.Y()) +
- "<br> Z: " + QString::number(theLoc.Z()) +
- "<br>" + TITLE(tr("Axis")) +
- "<br> DX: " + QString::number(theDir.X()) +
- "<br> DY: " + QString::number(theDir.Y()) +
- "<br> DZ: " + QString::number(theDir.Z()) +
- "<br>" + TITLE(tr("Dimensions")) +
- "<br>" + tr("Radius 1: ") + QString::number(theRad1) +
- "<br>" + tr("Radius 2: ") + QString::number(theRad2) +
- "<br>" + tr("Height: ") + QString::number(theHeight);
-
- myTypeParams->setText(aParams);
+ std::string aXmlCfg, aDescription;
+ myWorkshop->module()->getXMLRepresentation(theFeature->getKind(), aXmlCfg, aDescription);
+ if (!aXmlCfg.empty()) {
+ QList<ModuleBase_ModelWidget*> aWidgets;
+ if (!myWorkshop->module()->createWidgets(theFeature, aXmlCfg.c_str(), aWidgets)) {
+ ModuleBase_WidgetFactory aFactory(aXmlCfg, myWorkshop->moduleConnector());
+ aFactory.createWidget(myFeaturePane);
+ aWidgets = aFactory.getModelWidgets();
+ }
+ foreach(ModuleBase_ModelWidget* aWgt, aWidgets) {
+ if (aWgt->isInformative()) {
+ aWgt->setFeature(theFeature, false, false);
+ aWgt->setReadOnly(true);
+ aWgt->setEditingMode(true);
+ aWgt->restoreValue();
+ aWgt->showInformativePage();
+ }
+ else {
+ aWgt->setFeature(theFeature, false, false);
+ aWgt->setEditingMode(true);
+ aWgt->hide();
+ }
+ }
+ }
}
-void XGUI_InspectionPanel::setTorusType(const gp_XYZ& theLoc, const gp_XYZ& theDir,
- double theRad1, double theRad2)
+void XGUI_InspectionPanel::showEvent(QShowEvent* theEvent)
{
- myTypeLbl->setText(tr("Torus"));
- QString aParams = TITLE(tr("Center")) +
- "<br> X: " + QString::number(theLoc.X()) +
- "<br> Y: " + QString::number(theLoc.Y()) +
- "<br> Z: " + QString::number(theLoc.Z()) +
- "<br>" + TITLE(tr("Axis")) +
- "<br> DX: " + QString::number(theDir.X()) +
- "<br> DY: " + QString::number(theDir.Y()) +
- "<br> DZ: " + QString::number(theDir.Z()) +
- "<br>" + TITLE(tr("Dimensions")) +
- "<br>" + tr("Radius 1: ") + QString::number(theRad1) +
- "<br>" + tr("Radius 2: ") + QString::number(theRad2);
-
- myTypeParams->setText(aParams);
+ QDockWidget::showEvent(theEvent);
+ onSelectionChanged();
}