#include "tools/attributes/worker/dm_attributesscalart.h" #include "dm_guimanager.h" #include "scene/permanentitemscenebymodel.h" #include "tools/pointcloudattributesprovider.h" #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #include #else #include #endif template DM_AttributesScalarT::DM_AttributesScalarT(bool local) : DM_AbstractAttributesScalar(local) { m_as = nullptr; m_autoAdjust = true; m_manualMin = 0; m_manualMax = 1; m_useSharedGradient = false; connect(&m_watcher, SIGNAL(progressRangeChanged(int,int)), this, SLOT(setProgressRanged(int,int)), Qt::DirectConnection); connect(&m_watcher, SIGNAL(progressValueChanged(int)), this, SLOT(setProgress(int)), Qt::DirectConnection); connect(this, SIGNAL(canceled()), &m_watcher, SLOT(cancel())); } template DM_AttributesScalarT::~DM_AttributesScalarT() { } template void DM_AttributesScalarT::setAutoAdjust(bool automatic) { m_autoAdjust = automatic; if(m_autoAdjust) autoAdjustMinMax(); } template void DM_AttributesScalarT::setMin(double min) { m_manualMin = min; setAutoAdjust(false); } template void DM_AttributesScalarT::setMax(double max) { m_manualMax = max; setAutoAdjust(false); } template void DM_AttributesScalarT::setGradient(const QLinearGradient &gradient) { m_gradient = gradient; } template void DM_AttributesScalarT::setUseSharedGradient(bool val) { m_useSharedGradient = val; } template bool DM_AttributesScalarT::setTypeAttributes(const Type *ta, const CT_AbstractAttributesScalar *as) { if(ta != dynamic_cast(as)) return false; setAttributes(ta); m_as = const_cast(as); if(m_autoAdjust) autoAdjustMinMax(); return true; } template bool DM_AttributesScalarT::isUsedSharedGradient() const { return m_useSharedGradient; } template bool DM_AttributesScalarT::isAutoAdjust() const { return m_autoAdjust; } template bool DM_AttributesScalarT::autoAdjust() const { return m_autoAdjust; } template double DM_AttributesScalarT::min() const { return m_manualMin; } template double DM_AttributesScalarT::max() const { return m_manualMax; } template QLinearGradient DM_AttributesScalarT::gradient() const { return m_gradient; } template bool DM_AttributesScalarT::process(GDocumentViewForGraphics *doc) { if(m_as == nullptr) return false; PermanentItemScene* scene = doc->getPermanentSceneToRender()->getPermanentItemSceneForModel(nullptr); if(scene == nullptr) return false; double range = m_manualMax-m_manualMin; if(qFuzzyIsNull(range)) range = 1; DM_ColorLinearInterpolator interpolator; interpolator.constructFromQGradient(m_gradient); AMKgl::GlobalColorCloud* colorArray = scene->getPointCloudAttributesProvider()->createOrGetColorCloud(); if(colorArray == nullptr) return false; ConcurrentMapInfo info; info.m_interpolator = &interpolator; info.m_as = m_as; info.m_cc = colorArray; info.m_fAccess = &m_fAccess; info.m_eAccess = &m_eAccess; info.m_manualMin = m_manualMin; info.m_range = range; info.mApplyLocal = mustApplyToLocalIndex(); staticApply(&info); doc->dirtyColorsOfPoints(); return true; } template void DM_AttributesScalarT::attributesDeleted() { m_as = nullptr; } template CT_AbstractAttributesScalar* DM_AttributesScalarT::scalarAttributes() const { return m_as; } template Type* DM_AttributesScalarT::abstractTypeAttributes() const { return dynamic_cast(abstractAttributes()); } template void DM_AttributesScalarT::autoAdjustMinMax() { if(mustApplyToLocalIndex()) { m_manualMin = m_as->minLocalScalarAsDouble(); m_manualMax = m_as->maxLocalScalarAsDouble(); } else { m_manualMin = m_as->minScalarAsDouble(); m_manualMax = m_as->maxScalarAsDouble(); } }