代码片段
IsInStartedSubtree
bool IsInStartedSubtree(IUANode node)
{
if (node.Status == NodeStatus.Detached)
{
return false;
}
while (node != null)
{
if (node.Status == NodeStatus.Started)
{
return true;
}
node = node.Owner;
}
return false;
}
获取动态链接的 NodePath
static class DynamicLinkPath{
public static string MakeAbsolutePath(IUANode target);
public static string MakeRelativePath(IUANode startNode, IUANode targetNode);
public static string MakePath(IUANode startNode, IUANode targetNode);
}
获取两个节点间的相对路径
private static string CreateRelativePath(IUANode source, IUANode target)
{
string result = "";
var srcPath = GetCurrentProjectBrowsePath(source);
var tarPath = GetCurrentProjectBrowsePath(target);
var srcArr = srcPath.Split("/");
var tarArr = tarPath.Split("/");
var max = Math.Max(srcPath.Count(), tarPath.Count());
int i = 0;
for (; i < max; i++)
{
result = "..";
if (srcArr[i] != tarArr[i])
{
break;
}
}
for (int j = srcArr.Count() - 1; j > i; j--)
{
result = result + "/..";
}
for (int k = i; k < tarArr.Count(); k++)
{
result = result + "/" + tarArr[k];
}
return result;
}
获取节点的BrowsePath
private static string GetCurrentProjectBrowsePath(IUANode node)
{
if (node.Owner == Project.Current || node.BrowseName == "Root")
return node.BrowseName;
return GetCurrentProjectBrowsePath(node.Owner) + "/" + node.BrowseName;
}
判断变量是否有dynamiclink
if (IUAVariable.Refs.GetNode(Optix.CoreBase.ReferenceTypes.HasDynamicLink) != null)
{
Log.Warning(item.BrowseName + " has a dynamic link");
}
判断变量是否有converter
if (IUAVariable.Refs.GetNode(FTOptix.CoreBase.ReferenceTypes.HasConverter) != null)
{
Log.Warning(item.BrowseName + " has a converter");
}
根据table 的列名创建 DataGrid的列
// Create columns based on the header
foreach (var columnName in header)
{
var newDataGridColumn = InformationModel.MakeObject<DataGridColumn>(columnName);
newDataGridColumn.Title = columnName;
newDataGridColumn.DataItemTemplate = InformationModel.MakeObject<DataGridLabelItemTemplate>("DataItemTemplate");
var dynamicLink = InformationModel.MakeVariable<DynamicLink>("DynamicLink", FTOptix.Core.DataTypes.NodePath);
dynamicLink.Value = "{Item}/" + NodePath.EscapeNodePathBrowseName(columnName);
newDataGridColumn.DataItemTemplate.GetVariable("Text").Refs.AddReference(FTOptix.CoreBase.ReferenceTypes.HasDynamicLink, dynamicLink);
newDataGridColumn.OrderBy = dynamicLink.Value;
dataGrid.Columns.Add(newDataGridColumn);
lastDynamicLink = dynamicLink;
}
string to resourceUri 转换
public ResourceUri StringToResourcUri(string value)
{
const string namespace_string = "ns=9;";
const string project_shortcut = "%PROJECTDIR%";
const string application_shortcut = "%APPLICATIONDIR%";
value = value.Trim();
if (value.StartsWith(namespace_string))
{
value = value.Substring(namespace_string.Length).Trim();
}
var pattern_folder = @"^%(.*?)%";
var match = Regex.Match(value, pattern_folder);
if (match.Success)
{
switch (match.Value.ToUpper())
{
case project_shortcut:
{
var subpath = value.Substring(project_shortcut.Length);
if (subpath.StartsWith("/") || subpath.StartsWith("\\"))
{
subpath = subpath.Substring(1);
}
return ResourceUri.FromProjectRelativePath(subpath);
}
break;
case application_shortcut:
{
var subpath = value.Substring(application_shortcut.Length);
if (subpath.StartsWith("/") || subpath.StartsWith("\\"))
{
subpath = subpath.Substring(1);
}
return ResourceUri.FromApplicationRelativePath(subpath);
}
break;
default:
var pattern_number = @"^%USB(\d+)%";
var usbMatch = Regex.Match(match.Value, pattern_number);
if (usbMatch.Success)
{
var g = usbMatch.Groups.GetValueOrDefault("1");
if (g != null)
{
var usb_number = uint.Parse(g.Value);
var subpath = value.Substring(match.Value.Length);
if (subpath.StartsWith("/") || subpath.StartsWith("\\"))
{
subpath = subpath.Substring(1);
}
return ResourceUri.FromUSBRelativePath(usb_number, subpath);
}
}
return null;
break;
}
}
else
{
var ext = Path.GetExtension(value).Trim();
return ResourceUri.FromAbsoluteFilePath(ext);
}
return null;
}