现在我们写一个自由添加节点的程序。内容还是承接上面几章节。
首先我们先从最底层的NodeTS类入手,建造一个构造函数:
NodeTS::NodeTS(double argNormalizedIntensity, double argOpacity, QColor argEmission, QObject * parent):CommonXML(parent){ this->NormalizedIntensity = argNormalizedIntensity; this->Opacity = argOpacity; this->Emission = argEmission; }我们最后的计划是实现这样的函数:
TsfunGroup tg; tg.readXML(""); NodeTS nts(0.01923,0.1023,QColor(123,32,67)); tg.addNodeToItem("maxMode",nts); tg.writeXML();首先读取文件,然后再新建一个NodeTS对象,之后把节点加到id为maxMode的 tsfunItem 里面。之后我们再把设置好的节点写入到xml文件里面。
为了实现这样的函数,主要是要先能够在TsfunItem类里面的NodeTsList TsNodes;成员里加入新建的节点。程序如下:
void TsfunItem::addNode(NodeTS nts) { double temp1,temp2; for (int i = 0;i < TsNodes.count()-1;i++) { temp1 = TsNodes[i].returnNormalizedIntensity(); temp2 = TsNodes[i+1].returnNormalizedIntensity(); if(nts.returnNormalizedIntensity()>temp1){ if (nts.returnNormalizedIntensity() < temp2) { //可以插在这里了。 TsNodes.insert(i,nts); break; } } } }注意这里面的顺序,我们需要根据 NormalizedIntensity 的值来定位节点应该在第几个插入,然后直接插入就行了。
之后在TsfunGroup类里面,定义函数:
void TsfunGroup::addNodeToItem(QString itemName, NodeTS nts) { for (int i = 0;i < tsfitmlist.count();i++) { if (itemName == tsfitmlist[i].returnNameID()) { tsfitmlist[i].addNode(nts); } } }根据itemName来找到我们要插入的节点,把节点插入。
最后生成的显示效果如下:
<Nodes> <Node> <NormalizedIntensity Value="0.01923"/> <Opacity Value="0.1023"/> <Emission R="123" B="67" G="32"/> </Node> <Node> <NormalizedIntensity Value="0"/> <Opacity Value="0"/> <Emission R="0" B="0" G="0"/> </Node> <Node> <NormalizedIntensity Value="0.13597"/> <Opacity Value="0"/> <Emission R="0" B="0" G="0"/> </Node> <Node> <NormalizedIntensity Value="0.188538"/> <Opacity Value="0.0279028"/> <Emission R="0" B="0" G="0"/> </Node> <Node> <NormalizedIntensity Value="0.288578"/> <Opacity Value="0.363502"/> <Emission R="0" B="0" G="0"/> </Node> <Node> <NormalizedIntensity Value="0.45417"/> <Opacity Value="1"/> <Emission R="0" B="0" G="0"/> </Node> <Node> <NormalizedIntensity Value="1"/> <Opacity Value="1"/> <Emission R="0" B="0" G="0"/> </Node> </Nodes>可以看到子节点从以前的6个变成了7个,说明我们加入的是正确的。