跳转至

代码片段

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;
}

  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;

}