Commit 38eace84 authored by David Thompson's avatar David Thompson

Add cone widget (and cylinder as a special case).

parent ac536743
......@@ -7,3 +7,14 @@ specifying an axis-aligned bounding box or a GroupItem
containing multiple DoubleItems that configure a bounding box
in different ways depending on how they are used.
See the pqSMTKBoxItemWidget header for details.
There is now an infinite cylinder widget, which can be bound to a Group
item containing 3 Double children that serve as a center point,
a direction vector, and a radius.
Note that the widget models a cylinder of infinite length cut
by a bounding box whose size is not currently specified.
There is now a cone-frustum widget which can be bound to a Group
item containing 3 or 4 Double children that server as endpoints
and endpoint radii. The cone has a special case for cylinders where
only 1 radius value is provided.
......@@ -654,8 +654,11 @@ wish to customize.
- The name of a widget you would like the application to use to present the
item (and potentially its children as well) to users.
SMTK provides "Box" (for showing a 3-D bounding box widget), "Point" (for
showing a 3-D handle widget), "Line", "Plane", "Sphere", "Spline".
These types usually only make sense for Group items.
showing a 3-D handle widget), "Line", "Plane", "Sphere", "Cylinder", "Spline".
These types usually only make sense for Group items, although "Box" can also
be used for a Double item with 6 required values (xmin, xmax, ymin, ymax, zmin, zmax).
Items may also have custom views provided by the application or external libraries;
in that case, the Type specifier will be the string used to register the custom view.
* - ItemMemberIcon, ItemNonMemberIcon
- These attributes are only used for ReferenceItem, ResourceItem, and ComponentItem
......
......@@ -24,7 +24,6 @@ add_paraview_plugin(
GUI_SOURCES ${OUTSRCS} ${MOC_SRCS} ${UI_SRCS}
${OpenCVSrc}
CS_KITS
vtkSMTKWidgetsExt
vtkSMTKOpenCVExt
)
......
......@@ -82,8 +82,6 @@ add_paraview_plugin(
smtkPQOperationViewsPlugin "1.0"
GUI_INTERFACES ${viewInterfaces}
GUI_SOURCES ${viewSources}
CS_KITS
vtkSMTKWidgetsExt
)
set_property(GLOBAL APPEND PROPERTY SMTK_PLUGINS "smtkPQOperationViewsPlugin")
enable_smtk_plugin_by_default(smtkPQOperationViewsPlugin TRUE)
......
......@@ -52,6 +52,8 @@ set(serverWrappedHdrs
# library for this module (vtkSMTKReaderExtCS).
set(serverModules
vtkSMTKReaderExt
vtkSMTKSourceExt
vtkSMTKWidgetsExt
)
set(serverModuleCSLibs)
......
......@@ -21,9 +21,9 @@
<InputProperty command="SetSelectedPort" label="Selected Port" name="SelectedPort">
<Documentation>
This property specifies the dataset which has most
recently had a user specify a selection.
recently had a user specify a selection.
When a JSON request is issued to transfer the ParaView selection
to SMTK, it is this data that the vtkSelection refers to.
to SMTK, it is this data that the vtkSelection refers to.
</Documentation>
<ProxyGroupDomain name="groups">
<Group name="sources" />
......@@ -37,7 +37,7 @@
<Documentation>
This property specifies the selection a user most recently made.
When a JSON request is issued to transfer the ParaView selection
to SMTK, it is this vtkSelection that is used.
to SMTK, it is this vtkSelection that is used.
</Documentation>
<ProxyGroupDomain name="groups">
<Group name="sources" />
......@@ -1125,6 +1125,154 @@
</SourceProxy>
</ProxyGroup>
<!-- ====================================================================== -->
<ProxyGroup name="3d_widget_representations">
<Proxy
class="vtkConeRepresentation"
name="ConeRepresentation">
<IntVectorProperty
animateable="1"
command="SetVisibility"
default_values="0"
name="Visibility"
number_of_elements="1">
<BooleanDomain name="bool" />
</IntVectorProperty>
<DoubleVectorProperty
argument_is_array="1"
command="SetBottomPoint"
default_values="0 0 0"
information_property="BottomPointInfo"
name="BottomPoint"
number_of_elements="3">
<DoubleRangeDomain name="range" />
</DoubleVectorProperty>
<DoubleVectorProperty
command="GetBottomPoint"
information_only="1"
name="BottomPointInfo">
<SimpleDoubleInformationHelper />
</DoubleVectorProperty>
<DoubleVectorProperty
argument_is_array="1"
command="SetTopPoint"
default_values="0 0 0"
information_property="TopPointInfo"
name="TopPoint"
number_of_elements="3">
<DoubleRangeDomain name="range" />
</DoubleVectorProperty>
<DoubleVectorProperty
command="GetTopPoint"
information_only="1"
name="TopPointInfo">
<SimpleDoubleInformationHelper />
</DoubleVectorProperty>
<DoubleVectorProperty
command="SetBottomRadius"
default_values="1"
information_property="BottomRadiusInfo"
name="BottomRadius"
number_of_elements="1">
<DoubleRangeDomain name="range" />
</DoubleVectorProperty>
<DoubleVectorProperty
command="GetBottomRadius"
information_only="1"
name="BottomRadiusInfo">
<SimpleDoubleInformationHelper />
</DoubleVectorProperty>
<DoubleVectorProperty
command="SetTopRadius"
default_values="0.5"
information_property="TopRadiusInfo"
name="TopRadius"
number_of_elements="1">
<DoubleRangeDomain name="range" />
</DoubleVectorProperty>
<DoubleVectorProperty
command="GetTopRadius"
information_only="1"
name="TopRadiusInfo">
<SimpleDoubleInformationHelper />
</DoubleVectorProperty>
<IntVectorProperty
command="SetCylindrical"
information_property="CylindricalInfo"
default_values="0"
name="Cylindrical"
>
<BooleanDomain name="bool" />
</IntVectorProperty>
<IntVectorProperty
name="CylindricalInfo"
command="GetCylindrical"
default_values="0"
number_of_elements="1"
information_only="1">
<SimpleIntInformationHelper />
<BooleanDomain name="bool"/>
</IntVectorProperty>
</Proxy>
</ProxyGroup>
<!-- ====================================================================== -->
<ProxyGroup name="3d_widgets">
<Proxy
base_proxygroup="3d_widgets"
base_proxyname="WidgetBase"
class="vtkConeWidget"
name="ConeWidget">
</Proxy>
</ProxyGroup>
<!-- ====================================================================== -->
<ProxyGroup name="implicit_functions">
<Proxy
name="ImplicitConeFrustum"
class="vtkImplicitConeFrustum"
>
<DoubleVectorProperty
name="BottomPoint"
command="SetBottomPoint"
default_values="0 0 0"
number_of_elements="3">
<DoubleRangeDomain name="range"/>
</DoubleVectorProperty>
<DoubleVectorProperty
name="TopPoint"
command="SetTopPoint"
default_values="0 0 1"
number_of_elements="3">
<DoubleRangeDomain name="range"/>
</DoubleVectorProperty>
<DoubleVectorProperty
name="BottomRadius"
command="SetBottomRadius"
default_values="0.5"
number_of_elements="1">
<DoubleRangeDomain name="range" min="0.0"/>
</DoubleVectorProperty>
<DoubleVectorProperty
name="TopRadius"
command="SetTopRadius"
default_values="0.1"
number_of_elements="1">
<DoubleRangeDomain name="range" min="0.0"/>
</DoubleVectorProperty>
<PropertyGroup label="Cone Frustum Parameters" panel_widget="InteractiveCone">
<Property function="BottomPoint" name="BottomPoint" />
<Property function="BottomRadius" name="BottomRadius" />
<Property function="TopPoint" name="TopPoint" />
<Property function="TopRadius" name="TopRadius" />
</PropertyGroup>
</Proxy>
</ProxyGroup>
<!-- ====================================================================== -->
<ProxyGroup name="representations">
<RepresentationProxy name="SMTKModelRepresentation"
......@@ -1726,6 +1874,47 @@
</ShareProperties>
</SubProxy>
</SMTKModelRepresentationProxy>
<!-- Widget representations -->
<!-- Cone widget -->
<NewWidgetRepresentationProxy
class="vtk3DWidgetRepresentation"
name="ConeWidgetRepresentation">
<IntVectorProperty
command="SetEnabled"
default_values="0"
name="Enabled"
number_of_elements="1">
<BooleanDomain name="bool" />
<Documentation>Enable/Disable widget interaction.</Documentation>
</IntVectorProperty>
<SubProxy>
<Proxy
name="Prop"
proxygroup="3d_widget_representations"
proxyname="ConeRepresentation"></Proxy>
<ExposedProperties>
<Property name="Visibility" />
<Property name="BottomPointInfo" />
<Property name="BottomPoint" />
<Property name="TopPointInfo" />
<Property name="TopPoint" />
<Property name="BottomRadiusInfo" />
<Property name="BottomRadius" />
<Property name="TopRadiusInfo" />
<Property name="TopRadius" />
<Property name="CylindricalInfo" />
<Property name="Cylindrical" />
</ExposedProperties>
</SubProxy>
<SubProxy>
<Proxy
name="Widget"
proxygroup="3d_widgets"
proxyname="ConeWidget"></Proxy>
</SubProxy>
</NewWidgetRepresentationProxy>
</ProxyGroup>
<!-- Expose user preferences -->
......@@ -2006,6 +2195,6 @@
<Property name="HighlightOnHover" />
</PropertyGroup>
</ProxyGroup>
</ProxyGroup>
</ServerManagerConfiguration>
......@@ -9,9 +9,12 @@ set(viewHdrs
)
# set up sources to build
set(PQWidgetsSrcs
pqConePropertyWidget.cxx
pqGenerateContoursDialog.cxx
pqSMTKAttributeItemWidget.cxx
pqSMTKBoxItemWidget.cxx
pqSMTKConeItemWidget.cxx
pqSMTKInfiniteCylinderItemWidget.cxx
pqSMTKLineItemWidget.cxx
pqSMTKPlaneItemWidget.cxx
pqSMTKPointItemWidget.cxx
......@@ -25,12 +28,16 @@ set(PQWidgetsSrcs
set(PQWidgetsUIs
qtArcWidget.ui
qtGenerateContoursDialog.ui
resources/pqConePropertyWidget.ui
)
set(PQWidgetsMocHeaders
pqConePropertyWidget.h
pqGenerateContoursDialog.h
pqSMTKAttributeItemWidget.h
pqSMTKBoxItemWidget.h
pqSMTKConeItemWidget.h
pqSMTKInfiniteCylinderItemWidget.h
pqSMTKLineItemWidget.h
pqSMTKPlaneItemWidget.h
pqSMTKPointItemWidget.h
......@@ -128,7 +135,7 @@ add_paraview_plugin(
${PLUGIN_PROXY_IFACE_SRCS}
${PLUGIN_DOCK_IFACES_SRCS}
${viewSources}
CS_KITS
CS_KITS
vtkSMTKWidgetsExt
)
set_property(GLOBAL APPEND PROPERTY SMTK_PLUGINS "smtkPQWidgetsPlugin")
......
//=========================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
//
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//=========================================================================
#include "smtk/extension/paraview/widgets/pqConePropertyWidget.h"
#include "smtk/extension/paraview/widgets/ui_pqConePropertyWidget.h"
#include "pqCoreUtilities.h"
#include "pqPointPickingHelper.h"
#include "vtkSMNewWidgetRepresentationProxy.h"
#include "vtkSMProperty.h"
#include "vtkSMPropertyGroup.h"
#include "vtkSMPropertyHelper.h"
#include "vtkCommand.h"
#include "vtkMath.h"
#include "vtkVector.h"
#include "vtkVectorOperators.h"
class pqConePropertyWidget::Internals
{
public:
Internals()
: PickPoint1(true)
, BottomRadiusName("Bottom radius")
{
}
Ui::ConePropertyWidget Ui;
bool PickPoint1;
std::string BottomRadiusName;
};
pqConePropertyWidget::pqConePropertyWidget(
vtkSMProxy* smproxy, vtkSMPropertyGroup* smgroup, QWidget* parentObj)
: Superclass("representations", "ConeWidgetRepresentation", smproxy, smgroup, parentObj)
, m_p(new pqConePropertyWidget::Internals())
{
Ui::ConePropertyWidget& ui = m_p->Ui;
ui.setupUi(this);
auto topRad = smgroup->GetProperty("TopRadius");
if (!topRad)
{
// Only show a single radius when both must be identical.
ui.radius2->hide();
ui.labelRadius2->hide();
ui.labelRadius1->setText("Radius");
ui.show3DWidget->setText("Show cylinder");
ui.cylindrical->hide(); // We are forced into cylinder model
auto cyl = smgroup->GetProperty("Cylindrical");
if (cyl)
{
int on = 1;
vtkSMPropertyHelper(cyl).Set(&on, 1);
}
}
// link show3DWidget checkbox
this->connect(ui.show3DWidget, SIGNAL(toggled(bool)), SLOT(setWidgetVisible(bool)));
ui.show3DWidget->connect(this, SIGNAL(widgetVisibilityToggled(bool)), SLOT(setChecked(bool)));
this->setWidgetVisible(ui.show3DWidget->isChecked());
// link show3DWidget checkbox
this->connect(ui.cylindrical, SIGNAL(toggled(bool)), SLOT(setCylindrical(bool)));
// ui.cylindrical->connect(this, SIGNAL(widgetVisibilityToggled(bool)), SLOT(setChecked(bool)));
this->setCylindrical(ui.cylindrical->isChecked());
#ifdef Q_OS_MAC
ui.pickLabel->setText(ui.pickLabel->text().replace("Ctrl", "Cmd"));
#endif
if (vtkSMProperty* p1 = smgroup->GetProperty("BottomPoint"))
{
ui.labelPoint1->setText(tr(p1->GetXMLLabel()));
this->addPropertyLink(
ui.point1X, "fullPrecisionText", SIGNAL(fullPrecisionTextChangedAndEditingFinished()), p1, 0);
this->addPropertyLink(
ui.point1Y, "fullPrecisionText", SIGNAL(fullPrecisionTextChangedAndEditingFinished()), p1, 1);
this->addPropertyLink(
ui.point1Z, "fullPrecisionText", SIGNAL(fullPrecisionTextChangedAndEditingFinished()), p1, 2);
ui.labelPoint1->setText(p1->GetXMLLabel());
}
else
{
qCritical("Missing required property for function 'BottomPoint'.");
}
if (vtkSMProperty* p2 = smgroup->GetProperty("TopPoint"))
{
ui.labelPoint2->setText(tr(p2->GetXMLLabel()));
this->addPropertyLink(
ui.point2X, "fullPrecisionText", SIGNAL(fullPrecisionTextChangedAndEditingFinished()), p2, 0);
this->addPropertyLink(
ui.point2Y, "fullPrecisionText", SIGNAL(fullPrecisionTextChangedAndEditingFinished()), p2, 1);
this->addPropertyLink(
ui.point2Z, "fullPrecisionText", SIGNAL(fullPrecisionTextChangedAndEditingFinished()), p2, 2);
ui.labelPoint2->setText(p2->GetXMLLabel());
}
else
{
qCritical("Missing required property for function 'TopPoint'.");
}
if (vtkSMProperty* r1 = smgroup->GetProperty("BottomRadius"))
{
ui.labelRadius1->setText(tr(r1->GetXMLLabel()));
this->addPropertyLink(
ui.radius1, "fullPrecisionText", SIGNAL(fullPrecisionTextChangedAndEditingFinished()), r1, 0);
}
else
{
qCritical("Missing required property for function 'BottomRadius'.");
}
if (vtkSMProperty* r2 = smgroup->GetProperty("TopRadius"))
{
ui.labelRadius2->setText(tr(r2->GetXMLLabel()));
this->addPropertyLink(
ui.radius2, "fullPrecisionText", SIGNAL(fullPrecisionTextChangedAndEditingFinished()), r2, 0);
}
else
{
qCritical("Missing required property for function 'TopRadius'.");
}
pqPointPickingHelper* pickHelper = new pqPointPickingHelper(QKeySequence(tr("P")), false, this);
pickHelper->connect(this, SIGNAL(viewChanged(pqView*)), SLOT(setView(pqView*)));
pickHelper->connect(this, SIGNAL(widgetVisibilityUpdated(bool)), SLOT(setShortcutEnabled(bool)));
this->connect(
pickHelper, SIGNAL(pick(double, double, double)), SLOT(pick(double, double, double)));
pqPointPickingHelper* pickHelper2 =
new pqPointPickingHelper(QKeySequence(tr("Ctrl+P")), true, this);
pickHelper2->connect(this, SIGNAL(viewChanged(pqView*)), SLOT(setView(pqView*)));
pickHelper2->connect(this, SIGNAL(widgetVisibilityUpdated(bool)), SLOT(setShortcutEnabled(bool)));
this->connect(
pickHelper2, SIGNAL(pick(double, double, double)), SLOT(pick(double, double, double)));
pqPointPickingHelper* pickHelper3 = new pqPointPickingHelper(QKeySequence(tr("1")), false, this);
pickHelper3->connect(this, SIGNAL(viewChanged(pqView*)), SLOT(setView(pqView*)));
pickHelper3->connect(this, SIGNAL(widgetVisibilityUpdated(bool)), SLOT(setShortcutEnabled(bool)));
this->connect(
pickHelper3, SIGNAL(pick(double, double, double)), SLOT(pickPoint1(double, double, double)));
pqPointPickingHelper* pickHelper4 =
new pqPointPickingHelper(QKeySequence(tr("Ctrl+1")), true, this);
pickHelper4->connect(this, SIGNAL(viewChanged(pqView*)), SLOT(setView(pqView*)));
pickHelper4->connect(this, SIGNAL(widgetVisibilityUpdated(bool)), SLOT(setShortcutEnabled(bool)));
this->connect(
pickHelper4, SIGNAL(pick(double, double, double)), SLOT(pickPoint1(double, double, double)));
pqPointPickingHelper* pickHelper5 = new pqPointPickingHelper(QKeySequence(tr("2")), false, this);
pickHelper5->connect(this, SIGNAL(viewChanged(pqView*)), SLOT(setView(pqView*)));
pickHelper5->connect(this, SIGNAL(widgetVisibilityUpdated(bool)), SLOT(setShortcutEnabled(bool)));
this->connect(
pickHelper5, SIGNAL(pick(double, double, double)), SLOT(pickPoint2(double, double, double)));
pqPointPickingHelper* pickHelper6 =
new pqPointPickingHelper(QKeySequence(tr("Ctrl+2")), true, this);
pickHelper6->connect(this, SIGNAL(viewChanged(pqView*)), SLOT(setView(pqView*)));
pickHelper6->connect(this, SIGNAL(widgetVisibilityUpdated(bool)), SLOT(setShortcutEnabled(bool)));
this->connect(
pickHelper6, SIGNAL(pick(double, double, double)), SLOT(pickPoint2(double, double, double)));
pqCoreUtilities::connect(
this->widgetProxy(), vtkCommand::PropertyModifiedEvent, this, SLOT(updateInformationLabels()));
this->updateInformationLabels();
}
pqConePropertyWidget::~pqConePropertyWidget()
{
}
void pqConePropertyWidget::pick(double wx, double wy, double wz)
{
if (m_p->PickPoint1)
{
this->pickPoint1(wx, wy, wz);
}
else
{
this->pickPoint2(wx, wy, wz);
}
m_p->PickPoint1 = !m_p->PickPoint1;
}
void pqConePropertyWidget::pickPoint1(double wx, double wy, double wz)
{
double position[3] = { wx, wy, wz };
vtkSMNewWidgetRepresentationProxy* wdgProxy = this->widgetProxy();
vtkSMPropertyHelper(wdgProxy, "BottomPoint").Set(position, 3);
wdgProxy->UpdateVTKObjects();
emit this->changeAvailable();
this->render();
}
void pqConePropertyWidget::pickPoint2(double wx, double wy, double wz)
{
double position[3] = { wx, wy, wz };
vtkSMNewWidgetRepresentationProxy* wdgProxy = this->widgetProxy();
vtkSMPropertyHelper(wdgProxy, "TopPoint").Set(position, 3);
wdgProxy->UpdateVTKObjects();
emit this->changeAvailable();
this->render();
}
void pqConePropertyWidget::setCylindrical(bool isCylinder)
{
int cyl = isCylinder ? 1 : 0;
vtkSMNewWidgetRepresentationProxy* wdgProxy = this->widgetProxy();
vtkSMPropertyHelper(wdgProxy, "Cylindrical").Set(&cyl, 1);
if (isCylinder)
{
m_p->BottomRadiusName = m_p->Ui.labelRadius1->text().toStdString();
m_p->Ui.radius2->hide();
m_p->Ui.labelRadius2->hide();
m_p->Ui.labelRadius1->setText("Radius");
m_p->Ui.show3DWidget->setText("Show cylinder");
}
else
{
m_p->Ui.radius2->show();
m_p->Ui.labelRadius2->show();
m_p->Ui.labelRadius1->setText(m_p->BottomRadiusName.c_str());
m_p->Ui.show3DWidget->setText("Show cone");
}
wdgProxy->UpdateVTKObjects();
emit this->changeAvailable();
this->render();
}
void pqConePropertyWidget::setForceCylindrical(bool isCylinder)
{
m_p->Ui.cylindrical->setChecked(isCylinder);
if (isCylinder)
{
m_p->Ui.cylindrical->hide();
}
else
{
m_p->Ui.cylindrical->show();
}
this->setCylindrical(isCylinder);
}
void pqConePropertyWidget::updateInformationLabels()
{
Ui::ConePropertyWidget& ui = m_p->Ui;
vtkVector3d p1, p2;
vtkSMProxy* wproxy = this->widgetProxy();
vtkSMPropertyHelper(wproxy, "BottomPoint").Get(p1.GetData(), 3);
vtkSMPropertyHelper(wproxy, "TopPoint").Get(p2.GetData(), 3);
double distance = (p2 - p1).Norm();
ui.labelLength->setText(QString("<b>Length:</b> <i>%1</i> ").arg(distance));
}
void pqConePropertyWidget::placeWidget()
{
// Nothing to do?
}
//=========================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
//
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//=========================================================================
#ifndef smtk_extension_paraview_widgets_pqConePropertyWidget_h
#define smtk_extension_paraview_widgets_pqConePropertyWidget_h
#include "pqInteractivePropertyWidget.h"
#include "smtk/extension/paraview/widgets/Exports.h"
class SMTKPQWIDGETSEXT_EXPORT pqConePropertyWidget : public pqInteractivePropertyWidget
{
Q_OBJECT
using Superclass = pqInteractivePropertyWidget;
public:
pqConePropertyWidget(vtkSMProxy* proxy, vtkSMPropertyGroup* smgroup, QWidget* parent = nullptr);
~pqConePropertyWidget() override;
public slots:
void pick(double, double, double);
void pickPoint1(double, double, double);
void pickPoint2(double, double, double);
/// Force the widget to accept a single, positive radius (when true).
void setCylindrical(bool);
/// The same as setCylindrical, but also hide the checkbox that
/// allows user control of whether the cone is a cylinder (when true).
void setForceCylindrical(bool);
protected slots:
void updateInformationLabels();
void placeWidget() override;
protected:
class Internals;
Internals* m_p;
private:
Q_DISABLE_COPY(pqConePropertyWidget);
};
#endif // smtk_extension_paraview_widgets_pqConePropertyWidget_h
......@@ -255,7 +255,7 @@ void pqSMTKBoxItemWidget::updateItemFromWidget()
break;
case ItemBindings::Invalid:
default:
smtkErrorMacro(smtk::io::Logger::instance(), "Grrk");
smtkErrorMacro(smtk::io::Logger::instance(), "Unable to determine item binding.");
break;
}
......
//=========================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
//
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//=========================================================================
#include "smtk/extension/paraview/widgets/pqSMTKConeItemWidget.h"
#include "smtk/extension/paraview/widgets/pqConePropertyWidget.h"
#include "smtk/extension/paraview/widgets/pqSMTKAttributeItemWidgetP.h"
#include "smtk/attribute/DoubleItem.h"
#include "smtk/attribute/GroupItem.h"
#include "smtk/io/Logger.h"
#include "pqActiveObjects.h"
#include "pqApplicationCore.h"
#include "pqDataRepresentation.h"
#include "pqImplicitPlanePropertyWidget.h"
#include "pqObjectBuilder.h"
#include "pqPipelineSource.h"
#include "pqServer.h"
#include "pqSpherePropertyWidget.h"
#include "vtkMath.h"
#include "vtkPVXMLElement.h"
#include "vtkSMNewWidgetRepresentationProxy.h"
#include "vtkSMProperty.h"
#include "vtkSMPropertyGroup.h"
#include "vtkSMPropertyHelper.h"
#include "vtkSMProxy.h"
#include "vtkVector.h"
#include "vtkVectorOperators.h"
using qtItem = smtk::extension::qtItem;
using AttributeItemInfo = smtk::extension::AttributeItemInfo;
pqSMTKConeItemWidget::pqSMTKConeItemWidget(