前言
这一部分的内容放在如何生成大恒相机的参数,但其实难点并不在我接下去写的部分。难点在于你获得了这个节点的Name,Attribute,你该如何根据节点的类型,从而得到对于的Item,也就是这个节点是Number型你就该生成一个Number型的Item,QString类型就生成QString类型的Item。这才是难点,不过,这篇文章并不打算讲这个,这篇文章涉及到的内容主要是你该如何生成那个节点而已,以后关于那个有机会再出一篇文章,但那是后话了。
正文
初始化配置信息
首先,先让整个函数,然后再慢慢解析,你可以先瞄个大概:
//初始化配置信息
void MConfigureDahengG3UC::InitConfigure(QString index,MDeviceAbstract *pDev)
{
m_cCameraID = index;
m_pDevice = dynamic_cast<MDeviceDahengG3UC*>(pDev);
m_pNodeMap = new MNodeMap();
m_pNodeMap->SetDeviceId(m_cCameraID);
m_pNodeMap->SetConfigureObject(this);
m_pSimplyNodeMap = new MNodeMap();
m_pSimplyNodeMap->SetDeviceId(m_cCameraID);
CreateDocXml(); //创建doc
CreateSimplyDocXml(); //创建simply_doc
}
开始解析
m_pNodeMap = new MNodeMap();
整个语句是创建出整个节点。m_pNodeMap->SetConfigureObject(this);
整个是创建出那个配置对象。- 至于这里的Simply的类你们就不要管了 ,那个其实在把配置参数分成两个部分,一种是较为完整的,一种是除去一部分不常用的。
创建Xml节点
先给出完整的函数:
//创建doc
bool MConfigureDahengG3UC::CreateDocXml()
{
bool ret = false;
#ifdef WIN32_DAHENG_GEV
if((Q_NULLPTR == m_pNodeMap))
{
qDebug()<<"MConfigureDahengG3UC::CreateDocXml m_pNodeMap is null";
return ret;
}
if(m_pDevice->m_objDevicePtr.IsNull())
{
qDebug()<<"MConfigureDahengG3UC::CreateDocXml m_pDevice->m_objDevicePtr.IsNull";
return ret;
}
GxIAPICPP::gxstring_vector featureNameList;
GxIAPICPP::gxstring_vector featureRemoteNameList;
CGXFeatureControlPointer featureControl = m_pDevice->m_objDevicePtr->GetFeatureControl();
if(!featureControl.IsNull())
featureControl->GetFeatureNameList(featureNameList);//获取第一个属性参数集合featureNameList
CGXFeatureControlPointer featureControl2 = m_pDevice->m_objDevicePtr->GetRemoteFeatureControl();
if(!featureControl2.IsNull())
featureControl2->GetFeatureNameList(featureRemoteNameList);//获取第二个属性参数集合featureRemoteNameList
//开始创建xml文件
QDomDocument *m_doc = new QDomDocument();
QDomProcessingInstruction instruction;
instruction = m_doc->createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
m_doc->appendChild(instruction);
//create root element
QDomElement root = m_doc->createElement(XML_TAG_CONFIGUR);
m_doc->appendChild(root);
//包含一些本地属性,不同类型的设备具备的功能也不一样
for(size_t i=0;i<featureNameList.size();i++)
{
GxIAPICPP::gxstring name = featureNameList.at(i);
QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);
if(CreateElement(name,m_pNodeMap,param,featureControl))
{
root.appendChild(param);
}
}
//包含主要设备信息,比如宽高、曝光增益等,一般用户主要使用此属性控制器即可。
for(size_t i=0;i<featureRemoteNameList.size();i++)
{
GxIAPICPP::gxstring name = featureRemoteNameList.at(i);
QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);
if(CreateElement(name,m_pNodeMap,param,featureControl2))
{
root.appendChild(param);
}
}
ret = m_pNodeMap->SetDocument(m_doc);
#endif
return ret;
}
- 这个函数的作用是生成xml文件的头部的一些信息和root节点,然后递归求接下去的所有节点。然后节点里面的
attribute
再采用另一个属性去进行设置。 - 首先,我们先获取它的属性集合:
featureControl->GetFeatureNameList(featureNameList);//获取第一个属性参数集合
- 创建xml文件的头部信息;
QDomDocument *m_doc = new QDomDocument();
QDomProcessingInstruction instruction;
instruction = m_doc->createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
m_doc->appendChild(instruction);
- 接下来就是递归创建一些节点了,虽然之前的有些节点有group类型的,但我这里就统一将所有节点都归为Parameter节点进行创建。注意,它有两个属性节点集合,所以用了两个循环,具体函数如下:
//包含一些本地属性,不同类型的设备具备的功能也不一样
for(size_t i=0;i<featureNameList.size();i++)
{
GxIAPICPP::gxstring name = featureNameList.at(i);
QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);
if(CreateElement(name,m_pNodeMap,param,featureControl))
{
root.appendChild(param);
}
}
//包含主要设备信息,比如宽高、曝光增益等,一般用户主要使用此属性控制器即可。
for(size_t i=0;i<featureRemoteNameList.size();i++)
{
GxIAPICPP::gxstring name = featureRemoteNameList.at(i);
QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);
if(CreateElement(name,m_pNodeMap,param,featureControl2))
{
root.appendChild(param);
}
}
创建节点下面的Attribute
xml文件的基本结构是这样的:
<Parameter Visibility="Beginner" Enable="1" Hide="0" Type="Combo" Id="Standbystate" Combo="Disable;Enable" Value="Disable" Name="Standby state" Step="1"/>
</Group>
这里的难点其实是你要理清楚这之前的关系,从而把参数往底下传。我们看一下完整的函数,但我只列出一部分就好,不然太长了。
//创建doc树下的元素
bool MConfigureDahengG3UC::CreateElement(GxIAPICPP::gxstring gxName,MNodeMap *nodeMap,QDomElement &element,CGXFeatureControlPointer featureControl)
{
bool ret = false;
#ifdef WIN32_DAHENG_GEV
qint32 iVisibility = 0;
QString name = QString::fromStdString(gxName.c_str());
QString displayName= name;
bool enable = false;
bool hide = false;
GX_XML_InterfaceType eType;
GX_FEATURE_TYPE gxType = featureControl->GetFeatureType(gxName);
Mc::VisibilityEnums visb = (Mc::VisibilityEnums)iVisibility;
QString visbStr = MEnumToString<Mc::VisibilityEnums>(visb);
element.setAttribute(XML_KEY_NAME,name);
element.setAttribute(XML_KEY_DISPLAYNAME,displayName);
element.setAttribute(XML_KEY_STEP,1);
element.setAttribute(XML_KEY_HIDE,hide);
element.setAttribute(XML_KEY_VISIBILITY,visbStr);
try
{
if(gxType==GX_FEATURE_INT)
{
bool gxIsWriteable = featureControl->IsWritable(gxName);
bool bIsReadable = featureControl->IsReadable(gxName);//查询是否可读
if(gxIsWriteable)
enable = true;
CIntFeaturePointer objIntPtr = featureControl->GetIntFeature(gxName);
int64_t valueInt;
int64_t valueMinInt;
int64_t valueMaxInt;
if(bIsReadable)
{
valueInt = objIntPtr->GetValue();
valueMinInt = objIntPtr->GetMin();
valueMaxInt = objIntPtr->GetMax();
element.setAttribute(XML_KEY_MIN,QString::number(valueMinInt,10));
element.setAttribute(XML_KEY_MAX,QString::number(valueMaxInt,10));
element.setAttribute(XML_KEY_VALUE,QString::number(valueInt,10));
}
element.setAttribute(XML_KEY_ENABLE,enable);
element.setAttribute(XML_KEY_TYPE,XML_TYPE_NUMBER);
element.setAttribute(XML_KEY_DECIMALS,0);
element.setAttribute(XML_KEY_UNIT,"");
eType = IFT_IInteger;
ret = true;
}
else if(gxType == GX_FEATURE_FLOAT)
{
bool gxIsWriteable = featureControl->IsWritable(gxName);//查询是否可写
bool bIsReadable = featureControl->IsReadable(gxName);//查询是否可读
if(gxIsWriteable)
enable = true;
CFloatFeaturePointer objFloatPtr = featureControl->GetFloatFeature(gxName);
double valueFloat;
double valueMinFloat;
double valueMaxFloat;
if(bIsReadable)
{
valueFloat = objFloatPtr->GetValue();
valueMinFloat = objFloatPtr->GetMin();
valueMaxFloat = objFloatPtr->GetMax();
element.setAttribute(XML_KEY_MIN,valueMinFloat);
element.setAttribute(XML_KEY_MAX,valueMaxFloat);
element.setAttribute(XML_KEY_VALUE,valueFloat);
}
element.setAttribute(XML_KEY_ENABLE,enable);
element.setAttribute(XML_KEY_TYPE,XML_TYPE_NUMBER);
element.setAttribute(XML_KEY_DECIMALS,3);
element.setAttribute(XML_KEY_UNIT,"");
eType = IFT_IFloat;
ret = true;
}
}
catch(...)
{
qDebug()<< "-->Error CreateElement: "<<name;
ret = false;
}
if(ret)
{
MNode *temp;
nodeMap->CreateNode(&temp,Mc::NodeEnums(eType));
if(temp)
{
temp->SetElement(element,false);
nodeMap->Insert(name,temp);
}
}
#endif
return ret;
}
上面只列举了两种类型的数据,所以但其他数据就基本上是依照这个去写的。难度也不大,我觉得也没必要详细讲,主要就是你要分清函数的形参代表的意思是什么,应该就可以写出来了。
上面已经成功讲了如何创建了,但其实还得有更新的函数,就是当你每次修改参数时,要能让参数自动射下去。这样就是比较完整的功能实现。但其实是跟上面上不多的,换汤不换药,我这里就懒得赘述了,没啥必要。
总结
参数的创建基本就讲到这里,这样,相机的三大功能就基本完成了:实时采图,回调采图,参数设置。如果有需要可以去看看我的另外两篇文章。感谢您的观看~
若有错误,欢迎指出,感谢~