1 // Copyright (C) 2014-2020 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "XGUI_InspectionPanel.h"
21 #include "XGUI_Workshop.h"
22 #include "XGUI_SelectionMgr.h"
23 #include "XGUI_Selection.h"
24 #include "XGUI_Tools.h"
25 #include "XGUI_ModuleConnector.h"
27 #include <ModuleBase_ViewerPrs.h>
28 #include <ModuleBase_Tools.h>
29 #include <ModuleBase_OperationDescription.h>
30 #include <ModuleBase_WidgetFactory.h>
31 #include <ModuleBase_IModule.h>
32 #include <ModuleBase_PageWidget.h>
34 #include <ModelAPI_ResultField.h>
36 #include <ModelAPI_Result.h>
38 #include <GeomAPI_Ax3.h>
39 #include <GeomAPI_Box.h>
40 #include <GeomAPI_Circ.h>
41 #include <GeomAPI_Cone.h>
42 #include <GeomAPI_Cylinder.h>
43 #include <GeomAPI_Edge.h>
44 #include <GeomAPI_Ellipse.h>
45 #include <GeomAPI_Face.h>
46 #include <GeomAPI_Pln.h>
47 #include <GeomAPI_Pnt.h>
48 #include <GeomAPI_Shell.h>
49 #include <GeomAPI_Solid.h>
50 #include <GeomAPI_Sphere.h>
51 #include <GeomAPI_Torus.h>
52 #include <GeomAPI_Vertex.h>
53 #include <GeomAPI_Wire.h>
56 #include <QScrollArea>
59 #include <QTableWidget>
60 #include <QHeaderView>
61 #include <QTextBrowser>
62 #include <QResizeEvent>
64 #include <QStackedWidget>
66 #include <BRepBndLib.hxx>
67 #include <TopoDS_Iterator.hxx>
68 #include <TopTools_MapOfShape.hxx>
69 #include <TopTools_ListOfShape.hxx>
70 #include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic
73 // ================ Auxiliary functions ================
74 #define TITLE(val) ("<b>" + (val) + "</b>")
76 static void appendPointToParameters(const QString& thePointTitle,
77 const GeomPointPtr& theCoord,
80 theParams += TITLE(thePointTitle) +
81 "<br> X: " + QString::number(theCoord->x()) +
82 "<br> Y: " + QString::number(theCoord->y()) +
83 "<br> Z: " + QString::number(theCoord->z()) +
87 static void appendDirToParameters(const QString& theDirTitle,
88 const GeomDirPtr& theDirection,
91 theParams += TITLE(theDirTitle) +
92 "<br> DX: " + QString::number(theDirection->x()) +
93 "<br> DY: " + QString::number(theDirection->y()) +
94 "<br> DZ: " + QString::number(theDirection->z()) +
98 static void appendGroupNameToParameters(const QString& theGroupTitle, QString& theParams)
100 theParams += TITLE(theGroupTitle) + "<br>";
103 static void appendNamedValueToParameters(const QString& theName,
104 const double theValue,
107 theParams += theName + ": " + QString::number(theValue) + "<br>";
110 static void appendNamedValueToParameters(const QString& theName,
114 theParams += theName + ": " + (theValue ? "True" : "False") + "<br>";
118 // ================ XGUI_InspectionPanel ================
120 XGUI_InspectionPanel::XGUI_InspectionPanel(QWidget* theParent, XGUI_Workshop* theWorkshop)
121 : QDockWidget(theParent),
122 myWorkshop(theWorkshop)
124 setWindowTitle(tr("Inspection Panel"));
125 setObjectName(INSPECTION_PANEL);
126 setStyleSheet("::title { position: relative; padding-left: 5px; text-align: left center }");
128 myStackWgt = new QStackedWidget(this);
130 // Create shape selection page
131 QSplitter* aSplitter = new QSplitter(Qt::Vertical, myStackWgt);
133 // Create an internal widget
134 QWidget* aNameWgt = new QWidget(aSplitter);
135 QHBoxLayout* aNameLayout = new QHBoxLayout(aNameWgt);
136 aNameLayout->setContentsMargins(3, 0, 3, 0);
137 aNameLayout->addWidget(new QLabel(tr("Object"), aNameWgt));
138 myNameEdt = new QLineEdit(aNameWgt);
139 myNameEdt->setReadOnly(true);
140 aNameLayout->addWidget(myNameEdt);
142 aSplitter->addWidget(aNameWgt);
144 // Table with sub-shapes
145 mySubShapesTab = new QTableWidget(9, 2, aSplitter);
146 mySubShapesTab->setFocusPolicy(Qt::NoFocus);
147 mySubShapesTab->verticalHeader()->hide();
149 aTitles << tr("Sub-shapes") << tr("Number");
150 mySubShapesTab->setHorizontalHeaderLabels(aTitles);
152 QStringList aSubShapes;
153 aSubShapes << tr("SHAPE") << tr("COMPOUND") << tr("COMPSOLID") <<
154 tr("SOLID") << tr("SHELL") << tr("FACE") << tr("WIRE") << tr("EDGE") << tr("VERTEX");
156 foreach(QString aType, aSubShapes) {
157 QTableWidgetItem* aItem = new QTableWidgetItem(aType);
158 aItem->setFlags(Qt::ItemIsEnabled);
159 mySubShapesTab->setItem(i++, 0, aItem);
161 for (i = 0; i < 9; i++) {
162 QTableWidgetItem* aItem = new QTableWidgetItem("");
163 aItem->setFlags(Qt::ItemIsEnabled);
164 aItem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
165 mySubShapesTab->setItem(i, 1, aItem);
167 mySubShapesTab->setColumnWidth(0, 90);
168 mySubShapesTab->setColumnWidth(1, 70);
170 aSplitter->addWidget(mySubShapesTab);
173 QWidget* aTypeWgt = new QWidget(aSplitter);
174 QHBoxLayout* aTypeLayout = new QHBoxLayout(aTypeWgt);
175 aTypeLayout->setContentsMargins(3, 0, 3, 0);
177 aTypeLayout->addWidget(new QLabel(tr("Type:"), aTypeWgt));
178 myTypeLbl = new QLabel("", aTypeWgt);
179 aTypeLayout->addWidget(myTypeLbl);
181 aSplitter->addWidget(aTypeWgt);
183 myTypeParams = new QTextBrowser(aSplitter);
184 myTypeParams->setReadOnly(true);
185 myTypeParams->setFocusPolicy(Qt::NoFocus);
186 myTypeParams->viewport()->setBackgroundRole(QPalette::Window);
188 aSplitter->addWidget(myTypeParams);
190 aSplitter->setCollapsible(0, false);
191 aSplitter->setCollapsible(1, false);
192 aSplitter->setCollapsible(2, false);
193 aSplitter->setCollapsible(3, false);
196 aSizes << 10 << 140 << 10;
197 aSplitter->setSizes(aSizes);
199 myShapePanelId = myStackWgt->addWidget(aSplitter);
201 // Create feature selection page
202 QScrollArea* aScroll = new QScrollArea(myStackWgt);
203 aScroll->setWidgetResizable(true);
204 aScroll->setFrameStyle(QFrame::NoFrame);
206 myFeaturePane = new ModuleBase_PageWidget(aScroll);
207 myFeatureLayout = new QGridLayout(myFeaturePane);
208 myFeatureLayout->setContentsMargins(3, 3, 3, 3);
209 aScroll->setWidget(myFeaturePane);
210 //myFeaturePane->setEnabled(false);
212 myFeaturePanelId = myStackWgt->addWidget(aScroll);
214 setWidget(myStackWgt);
215 connect(myWorkshop->selector(), SIGNAL(selectionChanged()), SLOT(onSelectionChanged()));
218 //********************************************************************
219 XGUI_InspectionPanel::~XGUI_InspectionPanel()
223 //********************************************************************
224 void XGUI_InspectionPanel::setSubShapeValue(SudShape theId, int theVal)
226 mySubShapesTab->item(theId, 1)->setText(QString::number(theVal));
229 //********************************************************************
230 void XGUI_InspectionPanel::clearContent()
232 myStackWgt->setCurrentIndex(myFeaturePanelId);
234 for (int i = 0; i <= VertexId; i++) {
235 mySubShapesTab->item((SudShape)i, 1)->setText("");
237 myTypeLbl->setText("");
240 myFeaturePane->clearPage();
243 //********************************************************************
244 void XGUI_InspectionPanel::onSelectionChanged()
251 XGUI_Selection* aSelection = myWorkshop->selector()->selection();
252 QList<ModuleBase_ViewerPrsPtr> aSelectedList =
253 aSelection->getSelected(myWorkshop->selector()->placeOfSelection());
255 if (aSelectedList.count() > 0) {
256 ModuleBase_ViewerPrsPtr aPrs = aSelectedList.first();
258 std::dynamic_pointer_cast<ModelAPI_ResultField::ModelAPI_FieldStep>(aPrs->object());
261 FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aPrs->object());
262 if (aFeature.get()) {
263 myStackWgt->setCurrentIndex(myFeaturePanelId);
264 buildFeaturePane(aFeature);
267 TopoDS_Shape aShape = ModuleBase_Tools::getSelectedShape(aPrs);
268 if (aShape.IsNull()) {
269 ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(aPrs->object());
271 GeomShapePtr aShpPtr = aRes->shape();
273 aShape = aShpPtr->impl<TopoDS_Shape>();
277 if (aShape.IsNull()) {
278 myStackWgt->setCurrentIndex(myFeaturePanelId);
281 myStackWgt->setCurrentIndex(myShapePanelId);
282 GeomShapePtr aShapePtr(new GeomAPI_Shape());
283 aShapePtr->setImpl(new TopoDS_Shape(aShape));
285 ModuleBase_ViewerPrsPtr aPrsCopy(new ModuleBase_ViewerPrs(aPrs->object(), aShapePtr));
286 setName(XGUI_Tools::generateName(aPrsCopy));
287 setShapeContent(aShape);
288 setShapeParams(aShape);
293 //********************************************************************
294 void XGUI_InspectionPanel::setName(const QString& theName)
296 myNameEdt->setText(theName);
299 //********************************************************************
300 void XGUI_InspectionPanel::setShapeContent(const TopoDS_Shape& theShape)
304 int iType, nbTypes[TopAbs_SHAPE];
305 for (iType = 0; iType < TopAbs_SHAPE; ++iType) {
308 nbTypes[theShape.ShapeType()]++;
310 TopTools_MapOfShape aMapOfShape;
311 aMapOfShape.Add(theShape);
312 TopTools_ListOfShape aListOfShape;
313 aListOfShape.Append(theShape);
315 TopTools_ListIteratorOfListOfShape itL(aListOfShape);
316 for (; itL.More(); itL.Next()) {
317 TopoDS_Shape sp = itL.Value();
318 TopoDS_Iterator it(sp);
319 for (; it.More(); it.Next()) {
320 TopoDS_Shape s = it.Value();
321 if (aMapOfShape.Add(s)) {
322 aListOfShape.Append(s);
323 nbTypes[s.ShapeType()]++;
327 setSubShapeValue(VertexId, nbTypes[TopAbs_VERTEX]);
328 setSubShapeValue(EdgeId, nbTypes[TopAbs_EDGE]);
329 setSubShapeValue(WireId, nbTypes[TopAbs_WIRE]);
330 setSubShapeValue(FaceId, nbTypes[TopAbs_FACE]);
331 setSubShapeValue(ShellId, nbTypes[TopAbs_SHELL]);
332 setSubShapeValue(SolidId, nbTypes[TopAbs_SOLID]);
333 setSubShapeValue(CompsolidId, nbTypes[TopAbs_COMPSOLID]);
334 setSubShapeValue(CompoundId, nbTypes[TopAbs_COMPOUND]);
335 setSubShapeValue(ShapeId, aMapOfShape.Extent());
337 catch (Standard_Failure) {
341 //********************************************************************
342 void XGUI_InspectionPanel::setShapeParams(const TopoDS_Shape& theShape)
344 GeomShapePtr aShape(new GeomAPI_Shape);
345 aShape->setImpl(new TopoDS_Shape(theShape));
347 switch (aShape->shapeType()) {
348 case GeomAPI_Shape::VERTEX:
349 fillVertex(aShape->vertex());
351 case GeomAPI_Shape::EDGE:
352 fillEdge(aShape->edge());
354 case GeomAPI_Shape::FACE:
355 fillFace(aShape->face());
357 case GeomAPI_Shape::SOLID:
358 fillSolid(aShape->solid());
360 case GeomAPI_Shape::WIRE:
361 fillWire(aShape->wire());
363 case GeomAPI_Shape::SHELL:
364 fillShell(aShape->shell());
366 case GeomAPI_Shape::COMPSOLID:
367 case GeomAPI_Shape::COMPOUND:
368 fillContainer(aShape);
370 default: // [to avoid compilation warning]
375 //********************************************************************
376 void XGUI_InspectionPanel::fillVertex(const GeomVertexPtr& theVertex)
378 GeomPointPtr aPoint = theVertex->point();
380 myTypeLbl->setText(tr("Vertex"));
383 appendPointToParameters(tr("Coordinates"), aPoint, aParams);
384 setParamsText(aParams);
387 //********************************************************************
388 void XGUI_InspectionPanel::fillEdge(const GeomEdgePtr& theEdge)
391 if (theEdge->isDegenerated())
392 appendNamedValueToParameters(tr("Degenerated"), true, aParams);
394 GeomPointPtr aStartPnt = theEdge->firstPoint();
395 GeomPointPtr aEndPnt = theEdge->lastPoint();
396 bool addStartEndPoints = false;
398 if (theEdge->isLine()) {
399 myTypeLbl->setText(tr("Line segment"));
400 addStartEndPoints = true;
403 GeomCirclePtr aCircle = theEdge->circle();
405 addStartEndPoints = aStartPnt->distance(aEndPnt) >= Precision::Confusion();
406 if (addStartEndPoints)
407 myTypeLbl->setText("Arc of circle");
409 myTypeLbl->setText("Circle");
411 appendPointToParameters(tr("Center"), aCircle->center(), aParams);
412 appendDirToParameters(tr("Normal"), aCircle->normal(), aParams);
413 appendGroupNameToParameters(tr("Dimensions"), aParams);
414 appendNamedValueToParameters(tr("Radius"), aCircle->radius(), aParams);
417 GeomEllipsePtr anEllipse = theEdge->ellipse();
419 addStartEndPoints = aStartPnt->distance(aEndPnt) >= Precision::Confusion();
420 if (addStartEndPoints)
421 myTypeLbl->setText("Arc of ellipse");
423 myTypeLbl->setText("Ellipse");
425 appendPointToParameters(tr("Center"), anEllipse->center(), aParams);
426 appendDirToParameters(tr("Normal"), anEllipse->normal(), aParams);
427 appendGroupNameToParameters(tr("Dimensions"), aParams);
428 appendNamedValueToParameters(tr("Major radius"), anEllipse->majorRadius(), aParams);
429 appendNamedValueToParameters(tr("Minor radius"), anEllipse->minorRadius(), aParams);
433 myTypeLbl->setText(tr("Edge"));
437 if (addStartEndPoints) {
438 appendPointToParameters(tr("Start point"), aStartPnt, aParams);
439 appendPointToParameters(tr("End point"), aEndPnt, aParams);
441 setParamsText(aParams);
444 //********************************************************************
445 void XGUI_InspectionPanel::fillWire(const GeomWirePtr& theWire)
448 appendNamedValueToParameters(tr("Closed"), theWire->isClosed(), aParams);
450 // check the wire is a polygon
451 std::list<GeomPointPtr> aPolygonPoints;
452 if (theWire->isPolygon(aPolygonPoints)) {
453 myTypeLbl->setText(tr("Polygon"));
454 int aCornerIndex = 0;
455 for (std::list<GeomPointPtr>::const_iterator aPtIt = aPolygonPoints.begin();
456 aPtIt != aPolygonPoints.end(); ++aPtIt)
457 appendPointToParameters(tr("Point") + " " + QString::number(++aCornerIndex),
461 myTypeLbl->setText(tr("Wire"));
463 setParamsText(aParams);
466 //********************************************************************
467 void XGUI_InspectionPanel::fillFace(const GeomFacePtr& theFace)
470 // 1. Plane and planar faces
471 GeomPlanePtr aPlane = theFace->getPlane();
473 bool isCommonCase = true;
474 // Check face bounded by circle or ellipse
475 std::list<GeomShapePtr> aSubs = theFace->subShapes(GeomAPI_Shape::EDGE);
476 if (aSubs.size() == 1) {
477 GeomEdgePtr anEdge = aSubs.front()->edge();
478 if (anEdge->isCircle() || anEdge->isEllipse()) {
480 isCommonCase = false;
484 // Check face bounded by a single wire which is rectangle
485 aSubs = theFace->subShapes(GeomAPI_Shape::WIRE);
486 if (aSubs.size() == 1) {
487 GeomWirePtr aWire = aSubs.front()->wire();
488 std::list<GeomPointPtr> aCorners;
489 if (aWire->isRectangle(aCorners)) {
490 GeomPointPtr aBaseCorner = aCorners.front();
491 aCorners.pop_front();
493 double aWidth = aBaseCorner->distance(aCorners.front());
494 double aHeight = aBaseCorner->distance(aCorners.back());
496 myTypeLbl->setText(tr("Rectangle"));
497 appendPointToParameters(tr("Corner"), aBaseCorner, aParams);
498 appendDirToParameters(tr("Normal"), aPlane->direction(), aParams);
499 appendGroupNameToParameters(tr("Dimensions"), aParams);
500 appendNamedValueToParameters(tr("Width"), aWidth, aParams);
501 appendNamedValueToParameters(tr("Height"), aHeight, aParams);
502 setParamsText(aParams);
504 isCommonCase = false;
510 setPlaneType(tr("Plane"), aPlane);
514 GeomSpherePtr aSphere = theFace->getSphere();
516 setSphereType(tr("Sphere"), aSphere);
519 GeomCylinderPtr aCylinder = theFace->getCylinder();
521 setCylinderType(tr("Cylinder"), aCylinder);
524 GeomConePtr aCone = theFace->getCone();
526 setConeType(tr("Cone"), aCone);
529 GeomTorusPtr aTorus = theFace->getTorus();
531 setTorusType(tr("Torus"), aTorus);
534 myTypeLbl->setText(tr("Face"));
541 //********************************************************************
542 void XGUI_InspectionPanel::fillShell(const GeomShellPtr& theShell)
545 GeomSpherePtr aSphere = theShell->getSphere();
547 setSphereType(tr("Sphere"), aSphere);
550 GeomCylinderPtr aCylinder = theShell->getCylinder();
552 setCylinderType(tr("Cylinder"), aCylinder);
555 GeomConePtr aCone = theShell->getCone();
557 setConeType(tr("Cone"), aCone);
560 GeomTorusPtr aTorus = theShell->getTorus();
562 setTorusType(tr("Torus"), aTorus);
564 // 5. Axis-aligned/Rotated Box
565 GeomBoxPtr aBox = theShell->getParallelepiped();
567 if (aBox->isAxesAligned())
568 setBoxType(tr("Box"), aBox);
570 setRotatedBoxType(tr("Rotated Box"), aBox);
574 myTypeLbl->setText(tr("Shell"));
581 //********************************************************************
582 void XGUI_InspectionPanel::fillSolid(const GeomSolidPtr& theSolid)
585 GeomSpherePtr aSphere = theSolid->getSphere();
587 setSphereType(tr("Sphere"), aSphere);
590 GeomCylinderPtr aCylinder = theSolid->getCylinder();
592 setCylinderType(tr("Cylinder"), aCylinder);
595 GeomConePtr aCone = theSolid->getCone();
597 setConeType(tr("Cone"), aCone);
600 GeomTorusPtr aTorus = theSolid->getTorus();
602 setTorusType(tr("Torus"), aTorus);
604 // 5. Axis-aligned/Rotated Box
605 GeomBoxPtr aBox = theSolid->getParallelepiped();
607 if (aBox->isAxesAligned())
608 setBoxType(tr("Box"), aBox);
610 setRotatedBoxType(tr("Rotated Box"), aBox);
614 myTypeLbl->setText(tr("Solid"));
621 //********************************************************************
622 void XGUI_InspectionPanel::fillContainer(const GeomShapePtr& theShape)
624 if (theShape->shapeType() == GeomAPI_Shape::COMPSOLID)
625 myTypeLbl->setText("CompSolid");
626 else if (theShape->shapeType() == GeomAPI_Shape::COMPOUND)
627 myTypeLbl->setText("Compound");
630 TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
632 BRepBndLib::Add(aShape, aBB);
637 gp_Pnt aMinPnt = aBB.CornerMin();
638 GeomPointPtr aMinPoint(new GeomAPI_Pnt(aMinPnt.X(), aMinPnt.Y(), aMinPnt.Z()));
640 gp_Pnt aMaxPnt = aBB.CornerMax();
641 GeomPointPtr aMaxPoint(new GeomAPI_Pnt(aMaxPnt.X(), aMaxPnt.Y(), aMaxPnt.Z()));
644 appendGroupNameToParameters(tr("Bounding box"), aParams);
645 appendPointToParameters(tr("Minimal corner"), aMinPoint, aParams);
646 appendPointToParameters(tr("Maximal corner"), aMaxPoint, aParams);
649 //********************************************************************
650 void XGUI_InspectionPanel::setPlaneType(const QString& theTitle,
651 const std::shared_ptr<GeomAPI_Pln>& thePlane)
653 myTypeLbl->setText(theTitle);
655 appendPointToParameters(tr("Origin"), thePlane->location(), aParams);
656 appendDirToParameters(tr("Normal"), thePlane->direction(), aParams);
657 setParamsText(aParams);
660 //********************************************************************
661 void XGUI_InspectionPanel::setSphereType(const QString& theTitle,
662 const std::shared_ptr<GeomAPI_Sphere>& theSphere)
664 myTypeLbl->setText(theTitle);
666 appendPointToParameters(tr("Center"), theSphere->center(), aParams);
667 appendGroupNameToParameters(tr("Dimensions"), aParams);
668 appendNamedValueToParameters(tr("Radius"), theSphere->radius(), aParams);
669 setParamsText(aParams);
672 //********************************************************************
673 void XGUI_InspectionPanel::setCylinderType(const QString& theTitle,
674 const std::shared_ptr<GeomAPI_Cylinder>& theCyl)
676 myTypeLbl->setText(theTitle);
678 appendPointToParameters(tr("Position"), theCyl->location(), aParams);
679 appendDirToParameters(tr("Axis"), theCyl->axis(), aParams);
680 appendGroupNameToParameters(tr("Dimensions"), aParams);
681 appendNamedValueToParameters(tr("Radius"), theCyl->radius(), aParams);
682 appendNamedValueToParameters(tr("Height"), theCyl->height(), aParams);
683 setParamsText(aParams);
686 //********************************************************************
687 void XGUI_InspectionPanel::setConeType(const QString& theTitle,
688 const std::shared_ptr<GeomAPI_Cone>& theCone)
690 myTypeLbl->setText(theTitle);
692 appendPointToParameters(tr("Position"), theCone->location(), aParams);
693 appendDirToParameters(tr("Axis"), theCone->axis(), aParams);
694 appendGroupNameToParameters(tr("Dimensions"), aParams);
695 appendNamedValueToParameters(tr("Radius 1"), theCone->radius1(), aParams);
696 appendNamedValueToParameters(tr("Radius 2"), theCone->radius2(), aParams);
697 appendNamedValueToParameters(tr("Height"), theCone->height(), aParams);
698 setParamsText(aParams);
701 //********************************************************************
702 void XGUI_InspectionPanel::setTorusType(const QString& theTitle,
703 const std::shared_ptr<GeomAPI_Torus>& theTorus)
705 myTypeLbl->setText(theTitle);
707 appendPointToParameters(tr("Center"), theTorus->center(), aParams);
708 appendDirToParameters(tr("Axis"), theTorus->direction(), aParams);
709 appendGroupNameToParameters(tr("Dimensions"), aParams);
710 appendNamedValueToParameters(tr("Major radius"), theTorus->majorRadius(), aParams);
711 appendNamedValueToParameters(tr("Minor radius"), theTorus->minorRadius(), aParams);
712 setParamsText(aParams);
715 //********************************************************************
716 void XGUI_InspectionPanel::setBoxType(const QString& theTitle,
717 const std::shared_ptr<GeomAPI_Box>& theBox)
719 myTypeLbl->setText(theTitle);
721 appendPointToParameters(tr("Position"), theBox->axes()->origin(), aParams);
722 appendGroupNameToParameters(tr("Dimensions"), aParams);
723 appendNamedValueToParameters(tr("Width"), theBox->width(), aParams);
724 appendNamedValueToParameters(tr("Depth"), theBox->depth(), aParams);
725 appendNamedValueToParameters(tr("Height"), theBox->height(), aParams);
726 setParamsText(aParams);
729 //********************************************************************
730 void XGUI_InspectionPanel::setRotatedBoxType(const QString& theTitle,
731 const std::shared_ptr<GeomAPI_Box>& theBox)
733 myTypeLbl->setText(theTitle);
735 std::shared_ptr<GeomAPI_Ax3> anAxes = theBox->axes();
736 appendPointToParameters(tr("Position"), anAxes->origin(), aParams);
737 appendDirToParameters(tr("Z axis"), anAxes->normal(), aParams);
738 appendDirToParameters(tr("X axis"), anAxes->dirX(), aParams);
739 appendGroupNameToParameters(tr("Dimensions"), aParams);
740 appendNamedValueToParameters(tr("Width"), theBox->width(), aParams);
741 appendNamedValueToParameters(tr("Depth"), theBox->depth(), aParams);
742 appendNamedValueToParameters(tr("Height"), theBox->height(), aParams);
743 setParamsText(aParams);
747 //********************************************************************
748 void XGUI_InspectionPanel::setParamsText(const QString& theText)
750 myTypeParams->setText(theText);
753 //********************************************************************
754 void XGUI_InspectionPanel::buildFeaturePane(const FeaturePtr& theFeature)
756 std::string aXmlCfg, aDescription;
757 myWorkshop->module()->getXMLRepresentation(theFeature->getKind(), aXmlCfg, aDescription);
758 if (!aXmlCfg.empty()) {
759 QList<ModuleBase_ModelWidget*> aWidgets;
760 if (!myWorkshop->module()->createWidgets(theFeature, aXmlCfg.c_str(), aWidgets)) {
761 ModuleBase_WidgetFactory aFactory(aXmlCfg, myWorkshop->moduleConnector());
762 aFactory.createWidget(myFeaturePane);
763 aWidgets = aFactory.getModelWidgets();
765 foreach(ModuleBase_ModelWidget* aWgt, aWidgets) {
766 if (aWgt->isInformative()) {
767 aWgt->setFeature(theFeature, false, false);
768 aWgt->setReadOnly(true);
769 aWgt->setEditingMode(true);
770 aWgt->restoreValue();
771 aWgt->showInformativePage();
774 aWgt->setFeature(theFeature, false, false);
775 aWgt->setEditingMode(true);
782 void XGUI_InspectionPanel::showEvent(QShowEvent* theEvent)
784 QDockWidget::showEvent(theEvent);
785 onSelectionChanged();