DrGraph - SVG模块之二:脚本修改

DrGraph - SVG模块之二:脚本修改

手动修改

为了能明确修改对象,在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节点的关联处理。多几句话的事。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值