libvisiontransfer  10.8.0
parameter.h
1 /*******************************************************************************
2  * Copyright (c) 2024 Allied Vision Technologies GmbH
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *******************************************************************************/
14 
15 #ifndef VISIONTRANSFER_PARAMETER_H
16 #define VISIONTRANSFER_PARAMETER_H
17 
18 #include <string>
19 #include <vector>
20 #include <map>
21 
22 #include <cstring>
23 #include <sstream>
24 #include <iomanip>
25 #include <limits>
26 #include <memory>
27 
28 #include <visiontransfer/common.h>
29 #include <visiontransfer/parametervalue.h>
30 #include <visiontransfer/internal/conversionhelpers.h>
31 
32 namespace visiontransfer {
33 namespace param {
34 
47 class Parameter {
48 
49 private:
50  // We follow the pimpl idiom
51  class Pimpl;
52  Pimpl* pimpl;
53 
54 public:
55  enum GovernorType {
56  GOVERNOR_NONE = 0,
57  GOVERNOR_SHELL = 1,
58  GOVERNOR_DBUS = 2
59  };
60 
61  enum ParameterAccessMode {
62  ACCESS_NONE = 0,
63  ACCESS_READONLY = 1,
64  ACCESS_READWRITE = 2
65  };
66 
67  enum ParameterInteractionHint {
68  INTERACTION_INVISIBLE = -1,
69  INTERACTION_INACTIVE = 0,
70  INTERACTION_ACTIVE = 1
71  };
72 
73  enum GovernorFunction {
74  GOVERNOR_FN_CHANGE_VALUE = 0,
75  GOVERNOR_FN_POLL = 1
76  };
77 
79  VT_EXPORT Parameter();
81  VT_EXPORT Parameter(const std::string& uid);
83  VT_EXPORT Parameter(const Parameter& other);
85  VT_EXPORT ~Parameter();
87  VT_EXPORT Parameter& operator= (const Parameter& other);
89  VT_EXPORT std::string getUid() const;
91  VT_EXPORT std::string getName() const;
93  VT_EXPORT std::string getModuleName() const;
95  VT_EXPORT std::string getCategoryName() const;
97  VT_EXPORT std::string getDescription() const;
99  VT_EXPORT std::string getUnit() const;
101  VT_EXPORT ParameterValue::ParameterType getType() const;
103  VT_EXPORT ParameterAccessMode getAccessForConfig() const;
105  VT_EXPORT ParameterAccessMode getAccessForApi() const;
107  VT_EXPORT Parameter& setAccessForConfig(ParameterAccessMode mode);
109  VT_EXPORT Parameter& setAccessForApi(ParameterAccessMode mode);
111  VT_EXPORT ParameterInteractionHint getInteractionHint() const;
113  VT_EXPORT Parameter& setInteractionHint(ParameterInteractionHint hint);
115  VT_EXPORT bool getIsModified() const;
117  VT_EXPORT bool getIsPolled() const;
119  VT_EXPORT Parameter& setIsPolled(bool mod);
121  VT_EXPORT Parameter& setIsModified(bool mod);
123  VT_EXPORT GovernorType getGovernorType() const;
125  VT_EXPORT std::string getGovernorString() const;
127  VT_EXPORT Parameter& setGovernor(GovernorType govType, const std::string& govStr);
129  VT_EXPORT Parameter& setGovernorPollString(const std::string& govStr);
131  VT_EXPORT bool getInvokeGovernorOnInit() const;
133  VT_EXPORT Parameter& setInvokeGovernorOnInit(bool invoke);
137  VT_EXPORT std::string interpolateCommandLine(const ParameterValue& newVal, GovernorFunction fn = GOVERNOR_FN_CHANGE_VALUE);
139  VT_EXPORT bool isTensor() const;
141  VT_EXPORT bool isScalar() const;
143  VT_EXPORT bool isCommand() const;
145  VT_EXPORT unsigned int getTensorDimension() const;
147  VT_EXPORT std::vector<unsigned int> getTensorShape() const;
149  VT_EXPORT unsigned int getTensorNumElements() const;
151  VT_EXPORT std::vector<double> getTensorData() const;
153  VT_EXPORT std::vector<double> getTensorDefaultData() const;
155  VT_EXPORT std::vector<double>& getTensorDataReference();
157  VT_EXPORT std::vector<double>& getTensorDefaultDataReference();
159  VT_EXPORT Parameter& setTensorData(const std::vector<double>& data);
161  VT_EXPORT Parameter& setTensorDefaultData(const std::vector<double>& data);
163  VT_EXPORT Parameter& setName(const std::string& name);
165  VT_EXPORT Parameter& setModuleName(const std::string& n);
167  VT_EXPORT Parameter& setCategoryName(const std::string& n);
169  VT_EXPORT Parameter& setDescription(const std::string& d);
171  VT_EXPORT Parameter& setUnit(const std::string& d);
173  VT_EXPORT Parameter& setType(ParameterValue::ParameterType t);
175  VT_EXPORT Parameter& setAsTensor(const std::vector<unsigned int>& shape);
177  template<typename T>
178  VT_EXPORT bool isValidNewValue(T t) const;
180  VT_EXPORT bool ensureValidDefault();
182  VT_EXPORT bool ensureValidCurrent();
184  template<typename T>
185  VT_EXPORT T enforceIncrement(T t);
187  template<typename T>
188  VT_EXPORT Parameter& setDefault(T t);
190  template<typename T>
191  VT_EXPORT Parameter& setRange(T mn, T mx);
193  VT_EXPORT Parameter& unsetRange();
195  template<typename T>
196  VT_EXPORT Parameter& setIncrement(T t);
198  template<typename T>
199  VT_EXPORT Parameter& setCurrent(T t);
201  VT_EXPORT Parameter& setCurrentFrom(const Parameter& from);
203  VT_EXPORT Parameter& setCurrentFromDefault();
205  template<typename T>
206  VT_EXPORT Parameter& setOptions(const std::vector<T>& opts, const std::vector<std::string>& descriptions);
208  template<typename T>
209  VT_EXPORT Parameter& setOptions(std::initializer_list<T> opts, std::initializer_list<std::string> descriptions);
211  template<typename T>
212  VT_EXPORT std::vector<T> getOptions() const;
214  VT_EXPORT std::vector<std::string> getOptionDescriptions() const;
216  VT_EXPORT ParameterValue getCurrentParameterValue();
218  template<typename T>
219  VT_EXPORT T getCurrent() const;
220  VT_EXPORT ParameterValue getDefaultParameterValue();
222  template<typename T>
223  VT_EXPORT T getDefault() const;
225  template<typename T>
226  VT_EXPORT T getMin() const;
228  template<typename T>
229  VT_EXPORT T getMax() const;
231  template<typename T>
232  VT_EXPORT T getIncrement() const;
234  VT_EXPORT bool hasOptions() const;
236  VT_EXPORT bool hasCurrent() const;
238  VT_EXPORT bool hasDefault() const;
240  VT_EXPORT bool hasRange() const;
242  VT_EXPORT bool hasIncrement() const;
244  VT_EXPORT double at(unsigned int x);
246  VT_EXPORT double at(unsigned int y, unsigned int x);
248  VT_EXPORT double at(unsigned int z, unsigned int y, unsigned int x);
249  // Header-only OpenCV glue:
250 #ifdef CV_MAJOR_VERSION
251 
252  VT_EXPORT Parameter& setTensorFromCvSize(const cv::Size& cvSize) {
253  if ((getType()!=ParameterValue::TYPE_UNDEFINED) && !isTensor()) {
254  throw std::runtime_error("Parameter::setTensorFromCvSize(): refused to overwrite existing non-tensor type");
255  }
256  if (isTensor() && (getTensorNumElements()!=0)) {
257  // Already a tensor; only allow replacement with Size if prior size was 2
258  if (getTensorNumElements() != 2) throw std::runtime_error("Parameter::setTensorFromSize(): refused to overwrite tensor with size != 2");
259  } else {
260  // Newly defined as a Tensor, set as two-element vector
261  setAsTensor({2});
262  }
263  std::vector<double> data = { (double) cvSize.width, (double) cvSize.height };
264  setTensorData(data);
265  setTensorDefaultData(data);
266  return *this;
267  }
269  VT_EXPORT void setCvSizeFromTensor(cv::Size& cvSize) {
270  if (getTensorNumElements() != 2) throw std::runtime_error("Parameter::setCvSizeFromTensor(): refused to export Tensor of size!=2 to cv::Size");
271  cvSize = cv::Size((int) at(0), (int) at(1));
272  }
274  template<typename T>
275  VT_EXPORT Parameter& setTensorFromCvMat(const cv::Mat_<T>& cvMat) {
276  if ((getType()!=ParameterValue::TYPE_UNDEFINED) && !isTensor()) {
277  throw std::runtime_error("Parameter::setTensorFromCvMat(): refused to overwrite existing non-tensor type");
278  }
279  std::vector<unsigned int> dims = { (unsigned int) cvMat.rows, (unsigned int) cvMat.cols };
280  if (isTensor() && (getTensorNumElements()!=0)) {
281  // Already a tensor; only allow replacement with Mat data of matching size
282  if (getTensorNumElements() != dims[0]*dims[1]) throw std::runtime_error("Parameter::setTensorFromCvMat(): refused to overwrite tensor with cv::Mat of mismatching total size");
283  } else {
284  // Newly defined as a Tensor, copy the Cv shape
285  setAsTensor(dims);
286  }
287  // Not the fastest way, but less hassle than coping with array casts
288  std::vector<double> data;
289  for (unsigned int r=0; r<(unsigned int) cvMat.rows; ++r)
290  for (unsigned int c=0; c<(unsigned int) cvMat.cols; ++c) {
291  data.push_back((double) cvMat(r, c));
292  }
293  setTensorData(data);
294  setTensorDefaultData(data);
295  return *this;
296  }
298  template<typename T>
299  VT_EXPORT void setCvMatFromTensor(cv::Mat_<T>& cvMat) {
300  if (getTensorDimension() != 2) {
301  std::ostringstream ss;
302  ss << "{";
303  for (unsigned int i=0; i<getTensorDimension(); ++i) {
304  ss << getTensorShape()[i] << ", ";
305  }
306  ss << "}";
307  ss << " " << getUid() << " " << ((int)getType());
308  throw std::runtime_error(std::string("Parameter::Pimpl::setCvMatFromTensor(): refused to export non-2D Tensor to cv::Mat, offending shape is: ")+ss.str());
309  }
310  auto& refData = getTensorDataReference();
311  cv::Mat_<T>(getTensorShape()[0], getTensorShape()[1], (T*)&refData[0]).copyTo(cvMat);
312  }
313 #endif // CV_MAJOR_VERSION
314 };
315 
316 } // namespace param
317 } // namespace visiontransfer
318 
319 #endif
320 
321 
visiontransfer::param::Parameter::setModuleName
VT_EXPORT Parameter & setModuleName(const std::string &n)
Definition: parameter.cpp:858
visiontransfer::param::Parameter::getIncrement
VT_EXPORT T getIncrement() const
visiontransfer::param::Parameter::getInvokeGovernorOnInit
VT_EXPORT bool getInvokeGovernorOnInit() const
Definition: parameter.cpp:805
visiontransfer::param::Parameter::getType
VT_EXPORT ParameterValue::ParameterType getType() const
Definition: parameter.cpp:752
visiontransfer::param::Parameter::setCurrentFromDefault
VT_EXPORT Parameter & setCurrentFromDefault()
Definition: parameter.cpp:934
visiontransfer::param::Parameter::getTensorDimension
VT_EXPORT unsigned int getTensorDimension() const
Definition: parameter.cpp:824
visiontransfer::param::Parameter::getInteractionHint
VT_EXPORT ParameterInteractionHint getInteractionHint() const
Definition: parameter.cpp:770
visiontransfer::param::Parameter::isTensor
VT_EXPORT bool isTensor() const
Definition: parameter.cpp:815
visiontransfer::param::Parameter::setCvSizeFromTensor
VT_EXPORT void setCvSizeFromTensor(cv::Size &cvSize)
Definition: parameter.h:305
visiontransfer::param::Parameter::getTensorNumElements
VT_EXPORT unsigned int getTensorNumElements() const
Definition: parameter.cpp:830
visiontransfer::param::Parameter::getCurrentParameterValue
VT_EXPORT ParameterValue getCurrentParameterValue()
Definition: parameter.cpp:961
visiontransfer::param::Parameter::hasRange
VT_EXPORT bool hasRange() const
Definition: parameter.cpp:1003
visiontransfer::param::Parameter::getDefault
VT_EXPORT T getDefault() const
visiontransfer::param::Parameter::hasIncrement
VT_EXPORT bool hasIncrement() const
Definition: parameter.cpp:1006
visiontransfer::param::Parameter::getTensorDefaultData
VT_EXPORT std::vector< double > getTensorDefaultData() const
Definition: parameter.cpp:836
visiontransfer::param::Parameter::getTensorDataReference
VT_EXPORT std::vector< double > & getTensorDataReference()
Definition: parameter.cpp:839
visiontransfer::param::Parameter::getName
VT_EXPORT std::string getName() const
Definition: parameter.cpp:737
visiontransfer::param::Parameter::operator=
VT_EXPORT Parameter & operator=(const Parameter &other)
Definition: parameter.cpp:729
visiontransfer::param::Parameter::setInteractionHint
VT_EXPORT Parameter & setInteractionHint(ParameterInteractionHint hint)
Definition: parameter.cpp:773
visiontransfer::param::Parameter::isScalar
VT_EXPORT bool isScalar() const
Definition: parameter.cpp:818
visiontransfer::param::Parameter::getAccessForApi
VT_EXPORT ParameterAccessMode getAccessForApi() const
Definition: parameter.cpp:758
visiontransfer::param::Parameter::getOptionDescriptions
VT_EXPORT std::vector< std::string > getOptionDescriptions() const
Definition: parameter.cpp:957
visiontransfer::param::Parameter::setCurrentFrom
VT_EXPORT Parameter & setCurrentFrom(const Parameter &from)
Definition: parameter.cpp:930
visiontransfer::param::Parameter::isCommand
VT_EXPORT bool isCommand() const
Definition: parameter.cpp:821
visiontransfer::param::Parameter::getAccessForConfig
VT_EXPORT ParameterAccessMode getAccessForConfig() const
Definition: parameter.cpp:755
visiontransfer::param::Parameter::setName
VT_EXPORT Parameter & setName(const std::string &name)
Definition: parameter.cpp:854
visiontransfer::param::Parameter::setCvMatFromTensor
VT_EXPORT void setCvMatFromTensor(cv::Mat_< T > &cvMat)
Definition: parameter.h:335
visiontransfer::param::Parameter::setDefault
VT_EXPORT Parameter & setDefault(T t)
visiontransfer::param::Parameter::hasDefault
VT_EXPORT bool hasDefault() const
Definition: parameter.cpp:1000
visiontransfer::param::Parameter::setOptions
VT_EXPORT Parameter & setOptions(const std::vector< T > &opts, const std::vector< std::string > &descriptions)
visiontransfer::param::Parameter::getTensorData
VT_EXPORT std::vector< double > getTensorData() const
Definition: parameter.cpp:833
visiontransfer::param::Parameter::getMin
VT_EXPORT T getMin() const
visiontransfer::param::Parameter::setTensorFromCvMat
VT_EXPORT Parameter & setTensorFromCvMat(const cv::Mat_< T > &cvMat)
Definition: parameter.h:311
visiontransfer::param::Parameter::setTensorDefaultData
VT_EXPORT Parameter & setTensorDefaultData(const std::vector< double > &data)
Definition: parameter.cpp:849
visiontransfer::param::Parameter::setAsTensor
VT_EXPORT Parameter & setAsTensor(const std::vector< unsigned int > &shape)
Definition: parameter.cpp:878
visiontransfer::param::Parameter::setAccessForConfig
VT_EXPORT Parameter & setAccessForConfig(ParameterAccessMode mode)
Definition: parameter.cpp:762
visiontransfer::param::Parameter::setCurrent
VT_EXPORT Parameter & setCurrent(T t)
visiontransfer::param::Parameter::setRange
VT_EXPORT Parameter & setRange(T mn, T mx)
visiontransfer::param::Parameter::getIsModified
VT_EXPORT bool getIsModified() const
Definition: parameter.cpp:777
visiontransfer::param::Parameter::isValidNewValue
VT_EXPORT bool isValidNewValue(T t) const
visiontransfer::param::Parameter::interpolateCommandLine
VT_EXPORT std::string interpolateCommandLine(const ParameterValue &newVal, GovernorFunction fn=GOVERNOR_FN_CHANGE_VALUE)
Definition: parameter.cpp:812
visiontransfer::param::Parameter::setType
VT_EXPORT Parameter & setType(ParameterValue::ParameterType t)
Definition: parameter.cpp:874
visiontransfer::param::Parameter::getDescription
VT_EXPORT std::string getDescription() const
Definition: parameter.cpp:746
visiontransfer::param::Parameter::setGovernor
VT_EXPORT Parameter & setGovernor(GovernorType govType, const std::string &govStr)
Definition: parameter.cpp:797
visiontransfer::param::Parameter::setIsPolled
VT_EXPORT Parameter & setIsPolled(bool mod)
Definition: parameter.cpp:783
visiontransfer::param::Parameter::getMax
VT_EXPORT T getMax() const
visiontransfer::param::Parameter::getTensorShape
VT_EXPORT std::vector< unsigned int > getTensorShape() const
Definition: parameter.cpp:827
visiontransfer::param::Parameter::at
VT_EXPORT double at(unsigned int x)
Definition: parameter.cpp:1010
visiontransfer::param::Parameter::setIsModified
VT_EXPORT Parameter & setIsModified(bool mod)
Definition: parameter.cpp:787
visiontransfer::param::Parameter::enforceIncrement
VT_EXPORT T enforceIncrement(T t)
visiontransfer::param::Parameter::getOptions
VT_EXPORT std::vector< T > getOptions() const
visiontransfer::param::Parameter::setTensorData
VT_EXPORT Parameter & setTensorData(const std::vector< double > &data)
Definition: parameter.cpp:845
visiontransfer::param::Parameter::setIncrement
VT_EXPORT Parameter & setIncrement(T t)
visiontransfer::param::Parameter::getGovernorString
VT_EXPORT std::string getGovernorString() const
Definition: parameter.cpp:794
visiontransfer::param::Parameter::setInvokeGovernorOnInit
VT_EXPORT Parameter & setInvokeGovernorOnInit(bool invoke)
Definition: parameter.cpp:808
visiontransfer::param::Parameter::getCategoryName
VT_EXPORT std::string getCategoryName() const
Definition: parameter.cpp:743
visiontransfer::param::Parameter::getTensorDefaultDataReference
VT_EXPORT std::vector< double > & getTensorDefaultDataReference()
Definition: parameter.cpp:842
visiontransfer::param::Parameter::getModuleName
VT_EXPORT std::string getModuleName() const
Definition: parameter.cpp:740
visiontransfer::param::Parameter::hasOptions
VT_EXPORT bool hasOptions() const
Definition: parameter.cpp:994
visiontransfer::param::Parameter::getCurrent
VT_EXPORT T getCurrent() const
visiontransfer::param::Parameter::getUnit
VT_EXPORT std::string getUnit() const
Definition: parameter.cpp:749
visiontransfer::param::Parameter::getUid
VT_EXPORT std::string getUid() const
Definition: parameter.cpp:734
visiontransfer::param::Parameter::setUnit
VT_EXPORT Parameter & setUnit(const std::string &d)
Definition: parameter.cpp:870
visiontransfer::param::Parameter::Parameter
VT_EXPORT Parameter()
Definition: parameter.cpp:716
visiontransfer::param::Parameter::setCategoryName
VT_EXPORT Parameter & setCategoryName(const std::string &n)
Definition: parameter.cpp:862
visiontransfer::param::Parameter::getGovernorType
VT_EXPORT GovernorType getGovernorType() const
Definition: parameter.cpp:791
visiontransfer::param::Parameter::ensureValidCurrent
VT_EXPORT bool ensureValidCurrent()
Definition: parameter.cpp:885
visiontransfer::param::Parameter::ensureValidDefault
VT_EXPORT bool ensureValidDefault()
Definition: parameter.cpp:882
visiontransfer::param::Parameter::hasCurrent
VT_EXPORT bool hasCurrent() const
Definition: parameter.cpp:997
visiontransfer::param::Parameter::setAccessForApi
VT_EXPORT Parameter & setAccessForApi(ParameterAccessMode mode)
Definition: parameter.cpp:766
visiontransfer::param::Parameter::~Parameter
VT_EXPORT ~Parameter()
Definition: parameter.cpp:726
visiontransfer::param::Parameter::setTensorFromCvSize
VT_EXPORT Parameter & setTensorFromCvSize(const cv::Size &cvSize)
Definition: parameter.h:288
visiontransfer::param::Parameter::setDescription
VT_EXPORT Parameter & setDescription(const std::string &d)
Definition: parameter.cpp:866
visiontransfer::param::Parameter::setGovernorPollString
VT_EXPORT Parameter & setGovernorPollString(const std::string &govStr)
Definition: parameter.cpp:801
visiontransfer::param::Parameter::unsetRange
VT_EXPORT Parameter & unsetRange()
Definition: parameter.cpp:913
visiontransfer::param::Parameter::getIsPolled
VT_EXPORT bool getIsPolled() const
Definition: parameter.cpp:780
Allied Vision