手动修改
为了能明确修改对象,在XML显示的基础上,完成相应的内容更新。
比如美工做了一个灯的SVG图,是红色的灯,现在希望将其改为绿色。
通过节点选择,选择目标界面对象所对应的XML节点
简单尝试一下,将目标节点的style属性修改为 fill:#00FF00,果然相应图元就成为绿色
是为手动。
脚本控制
当然,不能指望用户能用得这么深入,首先光培训就得N长时间,不划算;其次,也不好保存。
那就通过脚本方式,比较专业的用户编写一点代码,完成定制,最终用户就选选颜色、状态即可。
API
既然有脚本方式,那就需要为脚本提供一些API,方便使用。
比如颜色分量获取
if (SameText(funName, "GetRValue") || SameText(funName, "GetGValue") || SameText(funName, "GetBValue")) {
int value = cRealize->Parameters[paramIndex++]->Variable->Value;
int pos = SameText(funName, "GetRValue") ? 0 :
SameText(funName, "GetGValue") ? 1 : 2;
if (pos)
value >>= pos * 8;
value &= 0xFF;
Value = value;
}
又如xml操作处理
if (SameText(funName, "xmlFromFile")) {
UnicodeString fileName = cRealize->Parameters[paramIndex++]->Variable->Value;
if(FileExists(fileName) && InRunningMode) {
CbwXML * xml = new CbwXML(fileName, "DrGraphXml");
xml->Read();
Value = int(xml);
} else
Value = 0;
} else if (SameText(funName, "xmlToFile")) {
if(InRunningMode) {
TObject * destObject = ObjectAtParameter(this, paramIndex++);
UnicodeString fileName = cRealize->Parameters[paramIndex++]->Variable->Value;
CbwXML * xml = dynamic_cast<CbwXML *>(destObject);
if(xml)
xml->RootNode->SaveToFile(fileName);
}
} else if (SameText(funName, "xmlContent")) {
if(InRunningMode) {
TObject * destObject = ObjectAtParameter(this, paramIndex++);
CbwXML * xml = dynamic_cast<CbwXML *>(destObject);
if(xml)
Value = xml->RootNode->GetHint(L"\n", true);
}
} else if (SameText(funName, "xmlAttribute")) {
TObject * destObject = ObjectAtParameter(this, paramIndex++);
CbwXML * xml = dynamic_cast<CbwXML *>(destObject);
UnicodeString attributePath = cRealize->Parameters[paramIndex++]->Variable->Value;
TStrings * nodes = TTypeConvert::String2List(attributePath, L".");
if(xml) {
CbwXmlNode * currentNode = xml->RootNode;
for(int i = 0; currentNode && i < nodes->Count - 1; ++i) {
UnicodeString attr = nodes->Strings[i];
CbwXmlNode * destNode = currentNode->NodeByName(attr);
if(!destNode)
destNode = currentNode->NodeByAttribute("name", attr);
if(!destNode)
destNode = currentNode->NodeByAttribute("id", attr);
if(!destNode) {
UnicodeString indexString = THelper::String::GetRegMatchAt(attr, L"(-?)\\d+", 0);
if(indexString.Length()) {
int index = THelper::String::GetRegMatchAt_Int(attr, L"(-?)\\d+", 0);
DRGRAPH_MOD_IN(index, currentNode->ElementNumber);
if(IS_IN_RANGE(index, 0, currentNode->ElementNumber - 1))
destNode = currentNode->Elements(index);
}
}
currentNode = destNode;
}
if(currentNode) {
if (cRealize->Parameters.size() > 2 && InRunningMode) {
UnicodeString attributeValue = cRealize->Parameters[paramIndex++]->Variable->Value;
currentNode->AddAttribute(nodes->Strings[nodes->Count - 1], attributeValue);
}
Value = currentNode->AttributeValueByName(nodes->Strings[nodes->Count - 1]);
} else {
THelper::Loge(L"无法定位属性路径 %s, 请检查!!!", attributePath);
Value = "";
}
}
delete nodes;
}
或者是更新SVG图片
if (SameText(funName, "refreshSVG")) { // void refreshSVG(TCbwObject image, String fileName)
if(InRunningMode) {
TObject * destObject = ObjectAtParameter(this, paramIndex++);
TCbwImage * image = dynamic_cast<TCbwImage *>(destObject);
UnicodeString fileName = cRealize->Parameters[paramIndex++]->Variable->Value;
if(!FileExists(fileName)) {
UnicodeString digitalString = THelper::String::GetRegMatchAt(fileName, L"(-?)\\d+");
if(digitalString == fileName) {
CBW_CAST(CbwXML, xml, digitalString.ToInt());
if(xml) {
fileName = THelper::File::GetPath_Debug() + L"templateSvgFile.svg";
if(FileExists(fileName))
DeleteFile(fileName);
xml->RootNode->SaveToFile(fileName);
}
}
}
if(image)
image->RefreshSVG(fileName);
}
}
如此种种
脚本代码
在API的基础上,即可简单实现手动方式修改xml以改变SVG效果。
即每次调用xmlAttribute即可实现SVG某个xml节点的效果修改。如果需要协同处理效果,也就是多条xml节点的关联处理。多几句话的事。