adding check geometry command

This commit is contained in:
tanderson 2012-09-08 12:29:49 -04:00 committed by wmayer
parent ded5b893a8
commit 67fab9cf39
7 changed files with 1280 additions and 51 deletions

View File

@ -42,6 +42,7 @@ set(PartGui_MOC_HDRS
TaskShapeBuilder.h
TaskLoft.h
TaskSweep.h
TaskCheckGeometry.h
)
fc_wrap_cpp(PartGui_MOC_SRCS ${PartGui_MOC_HDRS})
SOURCE_GROUP("Moc" FILES ${PartGui_MOC_SRCS})
@ -160,6 +161,8 @@ SET(PartGui_SRCS
TaskSweep.cpp
TaskSweep.h
TaskSweep.ui
TaskCheckGeometry.cpp
TaskCheckGeometry.h
)
SET(PartGui_Scripts

View File

@ -62,6 +62,7 @@
#include "TaskShapeBuilder.h"
#include "TaskLoft.h"
#include "TaskSweep.h"
#include "TaskCheckGeometry.h"
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@ -1199,6 +1200,39 @@ bool CmdPartRuledSurface::isActive(void)
return getActiveGuiDocument();
}
//===========================================================================
// Part_CheckGeometry
//===========================================================================
DEF_STD_CMD_A(CmdCheckGeometry);
CmdCheckGeometry::CmdCheckGeometry()
: Command("Part_CheckGeometry")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Check Geometry");
sToolTipText = QT_TR_NOOP("Analyzes Geometry For Errors");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_CheckGeometry";
}
void CmdCheckGeometry::activated(int iMsg)
{
Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
if (!dlg)
dlg = new PartGui::TaskCheckGeometryDialog();
Gui::Control().showDialog(dlg);
}
bool CmdCheckGeometry::isActive(void)
{
Base::Type partid = Base::Type::fromName("Part::Feature");
bool objectsSelected = Gui::Selection().countObjectsOfType(partid) > 0;
return (hasActiveDocument() && !Gui::Control().activeDialog() && objectsSelected);
}
void CreatePartCommands(void)
{
@ -1230,5 +1264,5 @@ void CreatePartCommands(void)
rcCmdMgr.addCommand(new CmdPartBuilder());
rcCmdMgr.addCommand(new CmdPartLoft());
rcCmdMgr.addCommand(new CmdPartSweep());
rcCmdMgr.addCommand(new CmdCheckGeometry());
}

View File

@ -1,48 +1,49 @@
<RCC>
<qresource>
<file>icons/PartFeature.svg</file>
<file>icons/PartFeature.xpm</file>
<file>icons/PartFeatureImport.xpm</file>
<file>icons/Part_Booleans.svg</file>
<file>icons/Part_Box.svg</file>
<file>icons/Part_Chamfer.svg</file>
<file>icons/Part_Common.svg</file>
<file>icons/Part_Cone.svg</file>
<file>icons/Part_Cut.svg</file>
<file>icons/Part_CreatePrimitives.png</file>
<file>icons/Part_CreatePrimitives.svg</file>
<file>icons/Part_Cylinder.svg</file>
<file>icons/Part_Extrude.svg</file>
<file>icons/Part_Fillet.svg</file>
<file>icons/Part_Fuse.svg</file>
<file>icons/Part_Import.svg</file>
<file>icons/Part_Loft.svg</file>
<file>icons/Part_Mirror.svg</file>
<file>icons/Part_MirrorPNG.png</file>
<file>icons/Part_Revolve.svg</file>
<file>icons/Part_RuledSurface.svg</file>
<file>icons/Part_Section.svg</file>
<file>icons/Part_Shapebuilder.png</file>
<file>icons/Part_ShapeInfo.svg</file>
<file>icons/Part_Sphere.svg</file>
<file>icons/Part_Sweep.svg</file>
<file>icons/Part_Torus.svg</file>
<file>icons/preferences-part_design.svg</file>
<file>icons/Tree_Part.svg</file>
<file>translations/Part_af.qm</file>
<file>translations/Part_de.qm</file>
<file>translations/Part_es.qm</file>
<file>translations/Part_fi.qm</file>
<file>translations/Part_fr.qm</file>
<file>translations/Part_hr.qm</file>
<file>translations/Part_it.qm</file>
<file>translations/Part_nl.qm</file>
<file>translations/Part_no.qm</file>
<file>translations/Part_pl.qm</file>
<file>translations/Part_pt.qm</file>
<file>translations/Part_ru.qm</file>
<file>translations/Part_se.qm</file>
<file>translations/Part_uk.qm</file>
<file>translations/Part_zh.qm</file>
</qresource>
</RCC>
<RCC>
<qresource>
<file>icons/PartFeature.svg</file>
<file>icons/PartFeature.xpm</file>
<file>icons/PartFeatureImport.xpm</file>
<file>icons/Part_Booleans.svg</file>
<file>icons/Part_Box.svg</file>
<file>icons/Part_Chamfer.svg</file>
<file>icons/Part_Common.svg</file>
<file>icons/Part_Cone.svg</file>
<file>icons/Part_Cut.svg</file>
<file>icons/Part_CreatePrimitives.png</file>
<file>icons/Part_CreatePrimitives.svg</file>
<file>icons/Part_Cylinder.svg</file>
<file>icons/Part_Extrude.svg</file>
<file>icons/Part_Fillet.svg</file>
<file>icons/Part_Fuse.svg</file>
<file>icons/Part_Import.svg</file>
<file>icons/Part_Loft.svg</file>
<file>icons/Part_Mirror.svg</file>
<file>icons/Part_MirrorPNG.png</file>
<file>icons/Part_Revolve.svg</file>
<file>icons/Part_RuledSurface.svg</file>
<file>icons/Part_Section.svg</file>
<file>icons/Part_Shapebuilder.png</file>
<file>icons/Part_ShapeInfo.svg</file>
<file>icons/Part_Sphere.svg</file>
<file>icons/Part_Sweep.svg</file>
<file>icons/Part_Torus.svg</file>
<file>icons/preferences-part_design.svg</file>
<file>icons/Tree_Part.svg</file>
<file>icons/Part_CheckGeometry.svg</file>
<file>translations/Part_af.qm</file>
<file>translations/Part_de.qm</file>
<file>translations/Part_es.qm</file>
<file>translations/Part_fi.qm</file>
<file>translations/Part_fr.qm</file>
<file>translations/Part_hr.qm</file>
<file>translations/Part_it.qm</file>
<file>translations/Part_nl.qm</file>
<file>translations/Part_no.qm</file>
<file>translations/Part_pl.qm</file>
<file>translations/Part_pt.qm</file>
<file>translations/Part_ru.qm</file>
<file>translations/Part_se.qm</file>
<file>translations/Part_uk.qm</file>
<file>translations/Part_zh.qm</file>
</qresource>
</RCC>

View File

@ -0,0 +1,286 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64px"
height="64px"
id="svg2943"
sodipodi:version="0.32"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="Part_CheckGeometry.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1">
<defs
id="defs2945">
<linearGradient
id="linearGradient4349">
<stop
style="stop-color:#898709;stop-opacity:1;"
offset="0"
id="stop4351" />
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop4353" />
</linearGradient>
<linearGradient
id="linearGradient5241">
<stop
style="stop-color:#212c45;stop-opacity:1;"
offset="0"
id="stop5243" />
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop5245" />
</linearGradient>
<linearGradient
id="linearGradient5227"
osb:paint="solid">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop5229" />
</linearGradient>
<linearGradient
id="linearGradient3902">
<stop
style="stop-color:#000000;stop-opacity:0.58823532;"
offset="0"
id="stop3904" />
<stop
style="stop-color:#000000;stop-opacity:0.39215687;"
offset="1"
id="stop3906" />
</linearGradient>
<linearGradient
id="linearGradient3894">
<stop
style="stop-color:#45351d;stop-opacity:1;"
offset="0"
id="stop3896" />
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop3898" />
</linearGradient>
<linearGradient
id="linearGradient3886">
<stop
style="stop-color:#45351d;stop-opacity:1;"
offset="0"
id="stop3888" />
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop3890" />
</linearGradient>
<linearGradient
id="linearGradient3792">
<stop
style="stop-color:#aaaaaa;stop-opacity:1;"
offset="0"
id="stop3794" />
<stop
style="stop-color:#d2d2d2;stop-opacity:1;"
offset="1"
id="stop3796" />
</linearGradient>
<linearGradient
id="linearGradient3784">
<stop
style="stop-color:#bebebe;stop-opacity:1;"
offset="0"
id="stop3786" />
<stop
style="stop-color:#ffffff;stop-opacity:0.39215687;"
offset="1"
id="stop3788" />
</linearGradient>
<linearGradient
id="linearGradient3377">
<stop
id="stop3379"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop3381"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective2951" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3845"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.9271142,0.3747789,-0.74483377,1.8425424,-158.31046,-253.71678)"
cx="271.96695"
cy="103.54697"
fx="271.96695"
fy="103.54697"
r="19.467436" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3792"
id="linearGradient3858"
gradientUnits="userSpaceOnUse"
x1="16.53011"
y1="16.515057"
x2="41.610496"
y2="16.515057" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3876"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.2248105,0.4951204,-0.9839998,2.4341825,39.005699,-275.81551)"
cx="271.96695"
cy="103.54697"
fx="271.96695"
fy="103.54697"
r="19.467436" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3886"
id="linearGradient3892"
x1="17.115427"
y1="16.515057"
x2="41.025179"
y2="16.515057"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3894"
id="linearGradient3900"
x1="17.115427"
y1="16.515057"
x2="41.025179"
y2="16.515057"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5241"
id="linearGradient5247"
x1="295.12671"
y1="91.464584"
x2="314.73236"
y2="106.06027"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4349"
id="linearGradient4355"
x1="6.6594167"
y1="3.8183174"
x2="61.419407"
y2="48.560249"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.3309305"
inkscape:cx="59.095911"
inkscape:cy="32.00629"
inkscape:current-layer="g3629"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1366"
inkscape:window-height="688"
inkscape:window-x="-3"
inkscape:window-y="-3"
inkscape:window-maximized="1" />
<metadata
id="metadata2948">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<g
id="g3629"
transform="translate(-256.70919,-66.886588)">
<path
sodipodi:nodetypes="cscccc"
id="path3603"
d="m 278.77789,128.54149 c 0,0 17.36408,1.73323 29.84809,-1.25 7.926,-1.89403 8.5863,-5.11389 8.5863,-5.11389 l 1.26269,-6.7554 -30.92477,-0.0359 -8.77231,13.15519 z"
style="opacity:0.66523605;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.07586193;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:connector-curvature="0" />
<path
style="fill:url(#radialGradient3845);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4355);stroke-width:2.20000004999999987;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 20.1875 24.09375 L 5.03125 54.65625 L 5.4375 54.65625 C 5.4114 54.77255 5.40625 54.9132 5.40625 55.03125 C 5.40625 58.19955 14.92499 60.75 26.65625 60.75 C 38.38752 60.75 47.90624 58.19955 47.90625 55.03125 C 47.90625 54.30224 46.982 53.05086 46.46875 52.125 L 33.3125 24.40625 C 31.489287 25.510263 29.330366 26.15625 27 26.15625 C 24.454997 26.15625 22.106905 25.391029 20.1875 24.09375 z "
transform="translate(256.70919,66.886588)"
id="path3596" />
<path
style="fill:url(#radialGradient3876);fill-opacity:1;fill-rule:evenodd;stroke:#7b5600;stroke-width:2.306;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 283.56864,73.508963 -8.96997,18.127594 c 2.45967,1.993759 5.65411,3.190156 9.15763,3.190156 3.2436,0 6.21751,-1.041853 8.59466,-2.777313 l -8.78232,-18.540437 z"
id="path3800"
inkscape:connector-curvature="0" />
<path
transform="matrix(1,0,0,0.89212864,254.70604,69.32031)"
d="m 40.760496,16.515057 c 0,6.799128 -5.233878,12.310911 -11.690193,12.310911 -6.456315,0 -11.690193,-5.511783 -11.690193,-12.310911 0,-6.7991289 5.233878,-12.3109116 11.690193,-12.3109116 6.456315,0 11.690193,5.5117827 11.690193,12.3109116 z"
sodipodi:ry="12.310911"
sodipodi:rx="11.690193"
sodipodi:cy="16.515057"
sodipodi:cx="29.070303"
id="path3848"
style="fill:#ffffff;fill-opacity:0.58823532000000001;fill-rule:nonzero;stroke:url(#linearGradient3858);stroke-width:3.50016976;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
sodipodi:type="arc" />
<path
style="fill:none;stroke:url(#linearGradient5247);stroke-width:2.906;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 295.07922,91.367461 9.38258,6.945102 10.04523,7.435607"
id="path3880"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
sodipodi:type="arc"
style="fill:none;stroke:url(#linearGradient3900);stroke-width:0.90616274;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3882"
sodipodi:cx="29.070303"
sodipodi:cy="16.515057"
sodipodi:rx="11.690193"
sodipodi:ry="12.310911"
d="m 40.760496,16.515057 c 0,6.799128 -5.233878,12.310911 -11.690193,12.310911 -6.456315,0 -11.690193,-5.511783 -11.690193,-12.310911 0,-6.7991289 5.233878,-12.3109116 11.690193,-12.3109116 6.456315,0 11.690193,5.5117827 11.690193,12.3109116 z"
transform="matrix(1.168369,0,0,1.0423356,249.81151,66.839637)" />
<path
transform="matrix(0.8906974,0,0,0.79461695,257.88348,70.930724)"
d="m 40.760496,16.515057 c 0,6.799128 -5.233878,12.310911 -11.690193,12.310911 -6.456315,0 -11.690193,-5.511783 -11.690193,-12.310911 0,-6.7991289 5.233878,-12.3109116 11.690193,-12.3109116 6.456315,0 11.690193,5.5117827 11.690193,12.3109116 z"
sodipodi:ry="12.310911"
sodipodi:rx="11.690193"
sodipodi:cy="16.515057"
sodipodi:cx="29.070303"
id="path3884"
style="fill:none;stroke:url(#linearGradient3892);stroke-width:1.18865548;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
sodipodi:type="arc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,687 @@
/***************************************************************************
* Copyright (c) 2012 Thomas Anderson <blobfish[at]gmx.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#include "PreCompiled.h"
#include <BRepCheck_Analyzer.hxx>
#include <BRepCheck_Result.hxx>
#include <BRepCheck_ListIteratorOfListOfStatus.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Compound.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <Bnd_Box.hxx>
#include <BRepBndLib.hxx>
#include <ShapeAnalysis_FreeBounds.hxx>
#include <gp_Trsf.hxx>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoSwitch.h>
#include <Inventor/nodes/SoDrawStyle.h>
#include <Inventor/nodes/SoCube.h>
#include <Inventor/nodes/SoMaterial.h>
#include <Inventor/nodes/SoTransform.h>
#include "../App/PartFeature.h"
#include <Gui/BitmapFactory.h>
#include <Gui/Selection.h>
#include <Gui/Document.h>
#include <Gui/Application.h>
#include <Gui/ViewProvider.h>
#include <Gui/WaitCursor.h>
#include "TaskCheckGeometry.h"
using namespace PartGui;
QVector<QString> buildShapeEnumVector()
{
QVector<QString>names;
names.push_back(QObject::tr("Compound")); //TopAbs_COMPOUND
names.push_back(QObject::tr("Compound Solid")); //TopAbs_COMPSOLID
names.push_back(QObject::tr("Solid")); //TopAbs_SOLID
names.push_back(QObject::tr("Shell")); //TopAbs_SHELL
names.push_back(QObject::tr("Face")); //TopAbs_FACE
names.push_back(QObject::tr("Wire")); //TopAbs_WIRE
names.push_back(QObject::tr("Edge")); //TopAbs_EDGE
names.push_back(QObject::tr("Vertex")); //TopAbs_VERTEX
names.push_back(QObject::tr("Shape")); //TopAbs_SHAPE
return names;
}
QString shapeEnumToString(const int &index)
{
static QVector<QString> names = buildShapeEnumVector();
if (index < 0 || index > TopAbs_SHAPE)
return names.at(8);
return names.at(index);
}
QVector<QString> buildCheckStatusStringVector()
{
QVector<QString>names;
names.push_back(QObject::tr("No Error")); // BRepCheck_NoError
names.push_back(QObject::tr("Invalid Point On Curve")); // BRepCheck_InvalidPointOnCurve
names.push_back(QObject::tr("Invalid Point On Curve On Surface")); // BRepCheck_InvalidPointOnCurveOnSurface
names.push_back(QObject::tr("Invalid Point On Surface")); // BRepCheck_InvalidPointOnSurface
names.push_back(QObject::tr("No 3D Curve")); // BRepCheck_No3DCurve
names.push_back(QObject::tr("Multiple 3D Curve")); // BRepCheck_Multiple3DCurve
names.push_back(QObject::tr("Invalid 3D Curve")); // BRepCheck_Invalid3DCurve
names.push_back(QObject::tr("No Curve On Surface")); // BRepCheck_NoCurveOnSurface
names.push_back(QObject::tr("Invalid Curve On Surface")); // BRepCheck_InvalidCurveOnSurface
names.push_back(QObject::tr("Invalid Curve On Closed Surface")); // BRepCheck_InvalidCurveOnClosedSurface
names.push_back(QObject::tr("Invalid Same Range Flag")); // BRepCheck_InvalidSameRangeFlag
names.push_back(QObject::tr("Invalid Same Parameter Flag")); // BRepCheck_InvalidSameParameterFlag
names.push_back(QObject::tr("Invalid Degenerated Flag")); // BRepCheck_InvalidDegeneratedFlag
names.push_back(QObject::tr("Free Edge")); // BRepCheck_FreeEdge
names.push_back(QObject::tr("Invalid MultiConnexity")); // BRepCheck_InvalidMultiConnexity
names.push_back(QObject::tr("Invalid Range")); // BRepCheck_InvalidRange
names.push_back(QObject::tr("Empty Wire")); // BRepCheck_EmptyWire
names.push_back(QObject::tr("Redundant Edge")); // BRepCheck_RedundantEdge
names.push_back(QObject::tr("Self Intersecting Wire")); // BRepCheck_SelfIntersectingWire
names.push_back(QObject::tr("No Surface")); // BRepCheck_NoSurface
names.push_back(QObject::tr("Invalid Wire")); // BRepCheck_InvalidWire
names.push_back(QObject::tr("Redundant Wire")); // BRepCheck_RedundantWire
names.push_back(QObject::tr("Intersecting Wires")); // BRepCheck_IntersectingWires
names.push_back(QObject::tr("Invalid Imbrication Of Wires")); // BRepCheck_InvalidImbricationOfWires
names.push_back(QObject::tr("Empty Shell")); // BRepCheck_EmptyShell
names.push_back(QObject::tr("Redundant Face")); // BRepCheck_RedundantFace
names.push_back(QObject::tr("Unorientable Shape")); // BRepCheck_UnorientableShape
names.push_back(QObject::tr("Not Closed")); // BRepCheck_NotClosed
names.push_back(QObject::tr("Not Connected")); // BRepCheck_NotConnected
names.push_back(QObject::tr("Sub Shape Not In Shape")); // BRepCheck_SubshapeNotInShape
names.push_back(QObject::tr("Bad Orientation")); // BRepCheck_BadOrientation
names.push_back(QObject::tr("Bad Orientation Of Sub Shape")); // BRepCheck_BadOrientationOfSubshape
names.push_back(QObject::tr("Invalid Tolerance Value")); // BRepCheck_InvalidToleranceValue
names.push_back(QObject::tr("Check Failed")); // BRepCheck_CheckFail
return names;
}
QString checkStatusToString(const int &index)
{
static QVector<QString> names = buildCheckStatusStringVector();
if (index == -1)
{
return QString(QObject::tr("No Result"));
}
if (index > 33 || index < 0)
{
QString message(QObject::tr("Out Of Enum Range: "));
QString number;
number.setNum(index);
message += number;
return message;
}
return names.at(index);
}
ResultEntry::ResultEntry()
{
viewProvider = 0;
boxSep = 0;
boxSwitch = 0;
parent = 0;
children.clear();
selectionStrings.clear();
}
ResultEntry::~ResultEntry()
{
if (boxSep)
viewProvider->getRoot()->removeChild(boxSep);
qDeleteAll(children);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
ResultModel::ResultModel(QObject *parent) : QAbstractItemModel(parent)
{
root = 0;
}
ResultModel::~ResultModel()
{
if (root)
delete root;
}
QModelIndex ResultModel::index(int row, int column, const QModelIndex &parent) const
{
if (!root)
return QModelIndex();
ResultEntry *parentNode = nodeFromIndex(parent);
if (!parentNode)
return QModelIndex();
return createIndex(row, column, parentNode->children.at(row));
}
QModelIndex ResultModel::parent(const QModelIndex &child) const
{
ResultEntry *childNode = nodeFromIndex(child);
if (!childNode)
return QModelIndex();
ResultEntry *parentNode = childNode->parent;
if (!parentNode)
return QModelIndex();
ResultEntry *grandParentNode = parentNode->parent;
if (!grandParentNode)
return QModelIndex();
int row = grandParentNode->children.indexOf(parentNode);
return createIndex(row, 0, parentNode);
}
int ResultModel::rowCount(const QModelIndex &parent) const
{
ResultEntry *parentNode = nodeFromIndex(parent);
if (!parentNode)
return 0;
return parentNode->children.size();
}
int ResultModel::columnCount(const QModelIndex &parent) const
{
return 3;
}
QVariant ResultModel::data(const QModelIndex &index, int role) const
{
if (role != Qt::DisplayRole)
return QVariant();
ResultEntry *node = nodeFromIndex(index);
if (!node)
return QVariant();
switch (index.column())
{
case 0:
return QVariant(node->name);
case 1:
return QVariant(node->type);
case 2:
return QVariant(node->error);
}
return QVariant();
}
QVariant ResultModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (orientation != Qt::Horizontal || role != Qt::DisplayRole)
return QVariant();
switch (section)
{
case 0:
return QVariant(QString(tr("Name")));
case 1:
return QVariant(QString(tr("Type")));
case 2:
return QVariant(QString(tr("Error")));
}
return QVariant();
}
void ResultModel::setResults(ResultEntry *resultsIn)
{
this->beginResetModel();
if (root)
delete root;
root = resultsIn;
this->endResetModel();
}
ResultEntry* ResultModel::getEntry(const QModelIndex &index)
{
return nodeFromIndex(index);
}
ResultEntry* ResultModel::nodeFromIndex(const QModelIndex &index) const
{
if (index.isValid())
return static_cast<ResultEntry *>(index.internalPointer());
else
return root;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
TaskCheckGeometryResults::TaskCheckGeometryResults(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle(tr("Check Geometry"));
setupInterface();
setupFunctionMap();
goCheck();
}
TaskCheckGeometryResults::~TaskCheckGeometryResults()
{
Gui::Selection().clearSelection();
}
void TaskCheckGeometryResults::setupInterface()
{
message = new QLabel(this);
model = new ResultModel(this);
treeView = new QTreeView(this);
treeView->setModel(model);
treeView->setSelectionMode(QAbstractItemView::SingleSelection);
treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
connect(treeView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
this, SLOT(currentRowChanged(QModelIndex,QModelIndex)));
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(message);
layout->addWidget(treeView);
this->setLayout(layout);
}
void TaskCheckGeometryResults::goCheck()
{
Gui::WaitCursor wc;
int selectedCount(0), checkedCount(0), invalidShapes(0);
std::vector<Gui::SelectionSingleton::SelObj> selection = Gui::Selection().getSelection();
std::vector<Gui::SelectionSingleton::SelObj>::iterator it;
ResultEntry *theRoot = new ResultEntry();
for (it = selection.begin(); it != selection.end(); ++it)
{
selectedCount++;
Part::Feature *feature = dynamic_cast<Part::Feature *>((*it).pObject);
if (!feature)
continue;
currentProvider = Gui::Application::Instance->activeDocument()->getViewProvider(feature);
if (!currentProvider)
continue;
TopoDS_Shape shape = feature->Shape.getValue();
QString baseName;
QTextStream baseStream(&baseName);
baseStream << (*it).DocName;
baseStream << "." << (*it).FeatName;
if (strlen((*it).SubName) > 0)
{
shape = feature->Shape.getShape().getSubShape((*it).SubName);
baseStream << "." << (*it).SubName;
}
if (shape.IsNull())
continue;
checkedCount++;
checkedMap.Clear();
BRepCheck_Analyzer shapeCheck(shape);
if (!shapeCheck.IsValid())
{
invalidShapes++;
ResultEntry *entry = new ResultEntry();
entry->parent = theRoot;
entry->shape = shape;
entry->name = baseName;
entry->type = shapeEnumToString(shape.ShapeType());
entry->error = QObject::tr("Invalid");
entry->viewProvider = currentProvider;
getSetupResultBoundingBoxObject().go(entry);
theRoot->children.push_back(entry);
recursiveCheck(shapeCheck, shape, entry);
}
}
model->setResults(theRoot);
treeView->expandAll();
treeView->header()->resizeSections(QHeaderView::ResizeToContents);
QString aMessage;
QTextStream aStream(&aMessage);
aStream << checkedCount << " processed out of " << selectedCount << " selected\n";
aStream << invalidShapes << " invalid shapes.";
message->setText(aMessage);
Gui::Selection().clearSelection();
}
void TaskCheckGeometryResults::recursiveCheck(const BRepCheck_Analyzer &shapeCheck, const TopoDS_Shape &shape,
ResultEntry *parent)
{
ResultEntry *branchNode = parent;
BRepCheck_ListIteratorOfListOfStatus listIt;
if (!shapeCheck.Result(shape).IsNull() && !checkedMap.Contains(shape))
{
listIt.Initialize(shapeCheck.Result(shape)->Status());
if (listIt.Value() != BRepCheck_NoError)
{
ResultEntry *entry = new ResultEntry();
entry->parent = parent;
entry->shape = shape;
entry->type = shapeEnumToString(shape.ShapeType());
entry->error = checkStatusToString(listIt.Value());
entry->viewProvider = currentProvider;
dispatchError(entry, listIt.Value());
parent->children.push_back(entry);
branchNode = entry;
}
}
checkedMap.Add(shape);
if (shape.ShapeType() == TopAbs_SOLID)
checkSub(shapeCheck, shape, TopAbs_SHELL, branchNode);
if (shape.ShapeType() == TopAbs_EDGE)
checkSub(shapeCheck, shape, TopAbs_VERTEX, branchNode);
if (shape.ShapeType() == TopAbs_FACE)
{
checkSub(shapeCheck, shape, TopAbs_WIRE, branchNode);
checkSub(shapeCheck, shape, TopAbs_EDGE, branchNode);
checkSub(shapeCheck, shape, TopAbs_VERTEX, branchNode);
}
for (TopoDS_Iterator it(shape); it.More(); it.Next())
recursiveCheck(shapeCheck, it.Value(), branchNode);
}
void TaskCheckGeometryResults::checkSub(const BRepCheck_Analyzer &shapeCheck, const TopoDS_Shape &shape,
const TopAbs_ShapeEnum subType, ResultEntry *parent)
{
BRepCheck_ListIteratorOfListOfStatus itl;
TopExp_Explorer exp;
for (exp.Init(shape,subType); exp.More(); exp.Next())
{
const Handle(BRepCheck_Result)& res = shapeCheck.Result(exp.Current());
const TopoDS_Shape& sub = exp.Current();
for (res->InitContextIterator(); res->MoreShapeInContext(); res->NextShapeInContext())
{
if (res->ContextualShape().IsSame(shape))
{
for (itl.Initialize(res->StatusOnShape()); itl.More(); itl.Next())
{
if (itl.Value() == BRepCheck_NoError)
break;
checkedMap.Add(sub);
ResultEntry *entry = new ResultEntry();
entry->parent = parent;
entry->shape = sub;
entry->type = shapeEnumToString(sub.ShapeType());
entry->error = checkStatusToString(itl.Value());
entry->viewProvider = currentProvider;
dispatchError(entry, itl.Value());
parent->children.push_back(entry);
}
}
}
}
}
void TaskCheckGeometryResults::dispatchError(ResultEntry *entry, const BRepCheck_Status &stat)
{
std::vector<FunctionMapType>::iterator mapIt;
for (mapIt = functionMap.begin(); mapIt != functionMap.end(); ++mapIt)
{
if ((*mapIt).get<0>() == entry->shape.ShapeType() && (*mapIt).get<1>() == stat)
{
((*mapIt).get<2>())->go(entry);
return;
}
}
getSetupResultBoundingBoxObject().go(entry);
}
void TaskCheckGeometryResults::setupFunctionMap()
{
functionMap.push_back(FunctionMapType(TopAbs_SHELL, BRepCheck_NotClosed, &getSetupResultShellNotClosedObject()));
functionMap.push_back(FunctionMapType(TopAbs_WIRE, BRepCheck_NotClosed, &getSetupResultWireNotClosedObject()));
functionMap.push_back(FunctionMapType(TopAbs_VERTEX, BRepCheck_InvalidPointOnCurve, &getSetupResultInvalidPointCurveObject()));
functionMap.push_back(FunctionMapType(TopAbs_FACE, BRepCheck_IntersectingWires, &getSetupResultIntersectingWiresObject()));
functionMap.push_back(FunctionMapType(TopAbs_EDGE, BRepCheck_InvalidCurveOnSurface, &getSetupResultInvalidCurveSurfaceObject()));
functionMap.push_back(FunctionMapType(TopAbs_EDGE, BRepCheck_InvalidSameParameterFlag, &getSetupResultInvalidSameParameterFlagObject()));
functionMap.push_back(FunctionMapType(TopAbs_FACE, BRepCheck_UnorientableShape, &getSetupResultUnorientableShapeFaceObject()));
}
void TaskCheckGeometryResults::currentRowChanged (const QModelIndex &current, const QModelIndex &previous)
{
Gui::Selection().clearSelection();
if (previous.isValid())
{
ResultEntry *entry = model->getEntry(previous);
if (entry)
{
if (entry->boxSwitch)
entry->boxSwitch->whichChild.setValue(SO_SWITCH_NONE);
}
}
if (current.isValid())
{
ResultEntry *entry = model->getEntry(current);
if (entry)
{
if (entry->boxSwitch)
entry->boxSwitch->whichChild.setValue(0);
QStringList::Iterator stringIt;
for (stringIt = entry->selectionStrings.begin(); stringIt != entry->selectionStrings.end(); ++stringIt)
{
//need unique delimiter.
QString doc, object, sub;
if (!this->split((*stringIt), doc, object, sub))
continue;
Gui::Selection().addSelection(doc.toAscii(), object.toAscii(), sub.toAscii());
}
}
}
}
bool TaskCheckGeometryResults::split(QString &input, QString &doc, QString &object, QString &sub)
{
QStringList strings = input.split(QString::fromAscii("."));
if (strings.size() != 3)
return false;
doc = strings.at(0);
object = strings.at(1);
sub = strings.at(2);
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////////
QString SetupResultBase::selectionName(ResultEntry *entry, const TopoDS_Shape &shape)
{
ResultEntry *parentEntry = entry;
while(parentEntry->name.isEmpty())
parentEntry = parentEntry->parent;
QString stringOut;
QTextStream stream(&stringOut);
stream << parentEntry->name;
stream << '.';
TopTools_IndexedMapOfShape shapeMap;
int index(-1);
switch (shape.ShapeType())
{
case TopAbs_FACE:
TopExp::MapShapes(parentEntry->shape, TopAbs_FACE, shapeMap);
stream << "Face";
break;
case TopAbs_EDGE:
TopExp::MapShapes(parentEntry->shape, TopAbs_EDGE, shapeMap);
stream << "Edge";
break;
case TopAbs_VERTEX:
TopExp::MapShapes(parentEntry->shape, TopAbs_VERTEX, shapeMap);
stream << "Vertex";
break;
}
index = shapeMap.FindIndex(shape);
stream << index;
return stringOut;
}
void SetupResultBase::addTypedSelection(ResultEntry *entry, const TopoDS_Shape &shape, TopAbs_ShapeEnum type)
{
TopExp_Explorer it;
for (it.Init(shape, type); it.More(); it.Next())
{
QString name = selectionName(entry, (it.Current()));
if (!name.isEmpty())
entry->selectionStrings.append(name);
}
}
void SetupResultBoundingBox::go(ResultEntry *entry)
{
entry->boxSep = new SoSeparator();
entry->viewProvider->getRoot()->addChild(entry->boxSep);
entry->boxSwitch = new SoSwitch();
entry->boxSep->addChild(entry->boxSwitch);
SoGroup *group = new SoGroup();
entry->boxSwitch->addChild(group);
entry->boxSwitch->whichChild.setValue(SO_SWITCH_NONE);
SoDrawStyle *dStyle = new SoDrawStyle();
dStyle->style.setValue(SoDrawStyle::LINES);
dStyle->linePattern.setValue(0xc0c0);
group->addChild(dStyle);
SoMaterial *material = new SoMaterial();
material->diffuseColor.setValue(255.0, 255.0, 255.0);
material->ambientColor.setValue(255.0, 255.0, 255.0);
group->addChild(material);
Bnd_Box boundingBox;
BRepBndLib::Add(entry->shape, boundingBox);
Standard_Real xmin, ymin, zmin, xmax, ymax, zmax;
boundingBox.Get(xmin, ymin, zmin, xmax, ymax, zmax);
double xCenter, yCenter, zCenter;
xCenter = (xmax - xmin)/2 + xmin;
yCenter = (ymax - ymin)/2 + ymin;
zCenter = (zmax - zmin)/2 + zmin;
SbVec3f boundCenter(xCenter, yCenter, zCenter);
Standard_Real x, y, z;
entry->shape.Location().Transformation().TranslationPart().Coord(x, y, z);
boundCenter -= SbVec3f(x, y, z);
SoTransform *position = new SoTransform();
position->translation.setValue(boundCenter);
group->addChild(position);
SoCube *cube = new SoCube();
cube->width.setValue(xmax - xmin);
cube->height.setValue(ymax - ymin);
cube->depth.setValue(zmax - zmin);
group->addChild(cube);
}
SetupResultBoundingBox& PartGui::getSetupResultBoundingBoxObject()
{
static SetupResultBoundingBox object;
return object;
}
void SetupResultShellNotClosed::go(ResultEntry *entry)
{
ShapeAnalysis_FreeBounds shellCheck(entry->shape);
TopoDS_Compound closedWires = shellCheck.GetClosedWires();
TopoDS_Compound openWires = shellCheck.GetOpenWires();
addTypedSelection(entry, closedWires, TopAbs_EDGE);
addTypedSelection(entry, openWires, TopAbs_EDGE);
}
SetupResultShellNotClosed& PartGui::getSetupResultShellNotClosedObject()
{
static SetupResultShellNotClosed object;
return object;
}
void SetupResultWireNotClosed::go(ResultEntry *entry)
{
addTypedSelection(entry, entry->shape, TopAbs_EDGE);
}
SetupResultWireNotClosed& PartGui::getSetupResultWireNotClosedObject()
{
static SetupResultWireNotClosed object;
return object;
}
void SetupResultInvalidPointCurve::go(ResultEntry *entry)
{
addTypedSelection(entry, entry->shape, TopAbs_VERTEX);
}
SetupResultInvalidPointCurve& PartGui::getSetupResultInvalidPointCurveObject()
{
static SetupResultInvalidPointCurve object;
return object;
}
void SetupResultIntersectingWires::go(ResultEntry *entry)
{
addTypedSelection(entry, entry->shape, TopAbs_FACE);
}
SetupResultIntersectingWires& PartGui::getSetupResultIntersectingWiresObject()
{
static SetupResultIntersectingWires object;
return object;
}
void SetupResultInvalidCurveSurface::go(ResultEntry *entry)
{
addTypedSelection(entry, entry->shape, TopAbs_EDGE);
}
SetupResultInvalidCurveSurface& PartGui::getSetupResultInvalidCurveSurfaceObject()
{
static SetupResultInvalidCurveSurface object;
return object;
}
void SetupResultInvalidSameParameterFlag::go(ResultEntry *entry)
{
addTypedSelection(entry, entry->shape, TopAbs_EDGE);
}
SetupResultInvalidSameParameterFlag& PartGui::getSetupResultInvalidSameParameterFlagObject()
{
static SetupResultInvalidSameParameterFlag object;
return object;
}
void SetupResultUnorientableShapeFace::go(ResultEntry *entry)
{
addTypedSelection(entry, entry->shape, TopAbs_FACE);
getSetupResultBoundingBoxObject().go(entry);
}
SetupResultUnorientableShapeFace& PartGui::getSetupResultUnorientableShapeFaceObject()
{
static SetupResultUnorientableShapeFace object;
return object;
}
////////////////////////////////////////////////////////////////////////////////////////////////
TaskCheckGeometryDialog::TaskCheckGeometryDialog()
{
this->setButtonPosition(TaskDialog::South);
widget = new TaskCheckGeometryResults();
taskbox = new Gui::TaskView::TaskBox(
Gui::BitmapFactory().pixmap("Part_CheckGeometry"),
widget->windowTitle(), false, 0);
taskbox->groupLayout()->addWidget(widget);
Content.push_back(taskbox);
}
TaskCheckGeometryDialog::~TaskCheckGeometryDialog()
{
}
#include "moc_TaskCheckGeometry.cpp"

View File

@ -0,0 +1,218 @@
/***************************************************************************
* Copyright (c) 2012 Thomas Anderson <blobfish[at]gmx.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef TASKCHECKGEOMETRY_H
#define TASKCHECKGEOMETRY_H
#include <boost/tuple/tuple.hpp>
#include <BRepCheck_Analyzer.hxx>
#include <BRepCheck_Status.hxx>
#include <TopTools_MapOfShape.hxx>
#include <Gui/TaskView/TaskDialog.h>
#include <Gui/TaskView/TaskView.h>
class SoSeparator;
class SoSwitch;
namespace PartGui {
class ResultEntry
{
public:
ResultEntry();
~ResultEntry();
TopoDS_Shape shape;//invisible
QString name;
QString type;
QString error;
Gui::ViewProvider *viewProvider;
SoSeparator *boxSep;
SoSwitch *boxSwitch;
ResultEntry *parent;
QList<ResultEntry *> children;
QStringList selectionStrings;
};
class SetupResultBase
{
protected:
SetupResultBase(){}
public:
virtual void go(ResultEntry *entry) = 0;
protected:
QString selectionName(ResultEntry *entry, const TopoDS_Shape &shape);
void addTypedSelection(ResultEntry *entry, const TopoDS_Shape &shape, TopAbs_ShapeEnum type);
};
class SetupResultBoundingBox : public SetupResultBase
{
private:
SetupResultBoundingBox(){}
public:
virtual void go(ResultEntry *entry);
friend SetupResultBoundingBox& getSetupResultBoundingBoxObject();
};
SetupResultBoundingBox& getSetupResultBoundingBoxObject();
class SetupResultShellNotClosed : public SetupResultBase
{
private:
SetupResultShellNotClosed(){}
public:
virtual void go(ResultEntry *entry);
friend SetupResultShellNotClosed& getSetupResultShellNotClosedObject();
};
SetupResultShellNotClosed& getSetupResultShellNotClosedObject();
class SetupResultWireNotClosed : public SetupResultBase
{
private:
SetupResultWireNotClosed(){}
public:
virtual void go(ResultEntry *entry);
friend SetupResultWireNotClosed& getSetupResultWireNotClosedObject();
};
SetupResultWireNotClosed& getSetupResultWireNotClosedObject();
class SetupResultInvalidPointCurve : public SetupResultBase
{
private:
SetupResultInvalidPointCurve(){}
public:
virtual void go(ResultEntry *entry);
friend SetupResultInvalidPointCurve& getSetupResultInvalidPointCurveObject();
};
SetupResultInvalidPointCurve& getSetupResultInvalidPointCurveObject();
class SetupResultIntersectingWires : public SetupResultBase
{
private:
SetupResultIntersectingWires(){}
public:
virtual void go(ResultEntry *entry);
friend SetupResultIntersectingWires& getSetupResultIntersectingWiresObject();
};
SetupResultIntersectingWires& getSetupResultIntersectingWiresObject();
class SetupResultInvalidCurveSurface : public SetupResultBase
{
private:
SetupResultInvalidCurveSurface(){}
public:
virtual void go(ResultEntry *entry);
friend SetupResultInvalidCurveSurface& getSetupResultInvalidCurveSurfaceObject();
};
SetupResultInvalidCurveSurface& getSetupResultInvalidCurveSurfaceObject();
class SetupResultInvalidSameParameterFlag : public SetupResultBase
{
private:
SetupResultInvalidSameParameterFlag(){}
public:
virtual void go(ResultEntry *entry);
friend SetupResultInvalidSameParameterFlag& getSetupResultInvalidSameParameterFlagObject();
};
SetupResultInvalidSameParameterFlag& getSetupResultInvalidSameParameterFlagObject();
class SetupResultUnorientableShapeFace : public SetupResultBase
{
private:
SetupResultUnorientableShapeFace(){}
public:
virtual void go(ResultEntry *entry);
friend SetupResultUnorientableShapeFace& getSetupResultUnorientableShapeFaceObject();
};
SetupResultUnorientableShapeFace& getSetupResultUnorientableShapeFaceObject();
typedef boost::tuple<TopAbs_ShapeEnum, BRepCheck_Status, SetupResultBase*> FunctionMapType;
class ResultModel : public QAbstractItemModel
{
Q_OBJECT
public:
ResultModel(QObject *parent = 0);
~ResultModel();
QModelIndex index(int row, int column, const QModelIndex &parent) const;
QModelIndex parent(const QModelIndex &child) const;
virtual int rowCount(const QModelIndex &parent) const;
virtual int columnCount(const QModelIndex &parent) const;
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
// virtual Qt::ItemFlags flags (const QModelIndex &index) const;
void setResults(ResultEntry *resultsIn);
ResultEntry* getEntry(const QModelIndex &index);
private:
ResultEntry* nodeFromIndex(const QModelIndex &index) const;
ResultEntry *root;
};
class TaskCheckGeometryResults : public QWidget
{
Q_OBJECT
public:
TaskCheckGeometryResults(QWidget *parent = 0);
~TaskCheckGeometryResults();
private slots:
void currentRowChanged (const QModelIndex &current, const QModelIndex &previous);
private:
void setupInterface();
void goCheck();
void recursiveCheck(const BRepCheck_Analyzer &shapeCheck, const TopoDS_Shape &shape,
ResultEntry *parent);
void checkSub(const BRepCheck_Analyzer &shapeCheck, const TopoDS_Shape &shape,
const TopAbs_ShapeEnum subType, ResultEntry *parent);
void dispatchError(ResultEntry *entry, const BRepCheck_Status &stat);
bool split(QString &input, QString &doc, QString &object, QString &sub);
void setupFunctionMap();
ResultModel *model;
QTreeView *treeView;
QLabel *message;
TopTools_MapOfShape checkedMap;
Gui::ViewProvider *currentProvider;
std::vector<FunctionMapType> functionMap;
};
class TaskCheckGeometryDialog : public Gui::TaskView::TaskDialog
{
Q_OBJECT
public:
TaskCheckGeometryDialog();
~TaskCheckGeometryDialog();
virtual QDialogButtonBox::StandardButtons getStandardButtons() const
{return QDialogButtonBox::Close;}
virtual bool isAllowedAlterDocument(void) const
{return false;}
virtual bool needsFullSpace() const {return true;}
private:
TaskCheckGeometryResults* widget;
Gui::TaskView::TaskBox* taskbox;
};
}
#endif // TASKCHECKGEOMETRY_H

View File

@ -69,7 +69,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const
*part << "Part_Import" << "Part_Export" << "Separator";
*part << prim << "Part_Primitives" << "Part_Builder" << "Separator"
<< "Part_ShapeFromMesh" << "Part_MakeSolid" << "Part_ReverseShape"
<< "Part_SimpleCopy" << "Part_RefineShape" << "Separator"
<< "Part_SimpleCopy" << "Part_RefineShape" << "Part_CheckGeometry" << "Separator"
<< "Part_Boolean" << "Part_CrossSections" << "Part_Extrude"
<< "Part_Revolve" << "Part_Mirror" << "Part_Fillet" << "Part_Chamfer"
<< "Part_RuledSurface" << "Part_Loft" << "Part_Sweep";
@ -94,7 +94,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const
Gui::ToolBarItem* boolop = new Gui::ToolBarItem(root);
boolop->setCommand("Boolean");
*boolop << "Part_Boolean" << "Part_Cut" << "Part_Fuse" << "Part_Common"
<< "Part_Section" << "Part_CrossSections";
<< "Part_CheckGeometry" << "Part_Section" << "Part_CrossSections";
return root;
}