Diff
checker
文本
文本
图像
文档
Excel
文件夹
Legal
Enterprise
桌面版
定价
登录
下载 Diffchecker 桌面版
比较文本
查找两个文本文件之间的差异
工具
历史
实时编辑器
隐藏空白更改
折叠未更改行
关闭换行
视图
拆分
统一
比对精度
智能
单词
字符
文本样式
更改外观
语法高亮
选择语法
忽略
文本转换
转到第一个差异
编辑输入
Diffchecker Desktop
运行Diffchecker最安全的方式。获取Diffchecker桌面应用:您的差异永远不会离开您的电脑!
获取桌面版
autocomplete vs manual
创建于
去年
差异永不过期
清除
导出
分享
解释
13 删除
行
总计
删除
字符
总计
删除
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
39 行
全部复制
63 添加
行
总计
添加
字符
总计
添加
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
87 行
全部复制
复制
已复制
复制
已复制
internal static List<GraphLayout.Graph> DoGraphAutoLayout
(this WorkspaceModel workspace
)
/// <summary>
/// This function wraps a few methods on the workspace model layer
/// to set up and run the graph layout algorithm.
/// </summary>
/// <param name="workspace">Workspace on which graph layout will be performed.</param>
/// <param name="originalNodeGUID"></param>
/// <param name="newNodes"></param>
/// <param name="misplacedNodes"></param>
/// <param name="portType"></param>
internal static List<GraphLayout.Graph> DoGraphAutoLayout
Autocomplete
(this WorkspaceModel workspace
,
Guid originalNodeGUID,
IEnumerable<NodeModel> newNodes,
IEnumerable<NodeModel> misplacedNodes, PortType portType)
{
{
if (workspace.Nodes.Count() < 2) return null;
if (workspace.Nodes.Count() < 2) return null;
复制
已复制
复制
已复制
var selection = DynamoSelection.Instance.Selection;
const bool isGroupLayout = false;
// Check if all the selected models are groups
bool isGroupLayout = selection.Count > 0 &&
selection.All(x => x is AnnotationModel ||
selection.OfType<AnnotationModel>().Any(g => g.Nodes.Contains(x)));
List<GraphLayout.Graph> layoutSubgraphs;
List<GraphLayout.Graph> layoutSubgraphs;
List<List<GraphLayout.Node>> subgraphClusters;
List<List<GraphLayout.Node>> subgraphClusters;
GenerateCombinedGraph(workspace, isGroupLayout, out layoutSubgraphs, out subgraphClusters);
GenerateCombinedGraph(workspace, isGroupLayout, out layoutSubgraphs, out subgraphClusters);
复制
已复制
复制
已复制
//only record graph layout undo when it is not node autocomplete
var misplacedGuidSet = misplacedNodes.Select(x => x.GUID).ToHashSet();
RecordUndoGraphLayout(workspace, isGroupLayout, false);
foreach (var node in layoutSubgraphs.First().Nodes)
{
//this is a virtual IsSelected - it doesnt change the workspace node models but marks it as touchable to the algorithm
node.IsSelected = node.Id == originalNodeGUID || misplacedGuidSet.Contains(node.Id);
}
// Generate subgraphs separately for each cluster
// Generate subgraphs separately for each cluster
subgraphClusters.ForEach(
subgraphClusters.ForEach(
x => GenerateSeparateSubgraphs(new HashSet<GraphLayout.Node>(x), layoutSubgraphs));
x => GenerateSeparateSubgraphs(new HashSet<GraphLayout.Node>(x), layoutSubgraphs));
// Deselect all nodes
// Deselect all nodes
subgraphClusters.ForEach(c => c.ForEach(x => x.IsSelected = false));
subgraphClusters.ForEach(c => c.ForEach(x => x.IsSelected = false));
var activeComponents = layoutSubgraphs.Skip(1).ToList();
var activeComponents = layoutSubgraphs.Skip(1).ToList();
复制
已复制
复制
已复制
var targetSubgraph = activeComponents.FirstOrDefault(x => x.Nodes.Any(x => x.Id == originalNodeGUID));
var targetNode = targetSubgraph.Nodes.First(x => x.Id == originalNodeGUID);
// Run layout algorithm for each subgraph
// Run layout algorithm for each subgraph
activeComponents.ForEach(g => RunLayoutSubgraph(g, isGroupLayout));
activeComponents.ForEach(g => RunLayoutSubgraph(g, isGroupLayout));
复制
已复制
复制
已复制
AvoidSubgraphOverlap(layoutSubgraphs);
//original node shouldn't move: move others around
var diffX = targetNode.X - targetNode.InitialX;
var diffY = targetNode.Y - targetNode.InitialY;
foreach (var relatedNode in targetSubgraph.Nodes)
{
relatedNode.X -= diffX;
relatedNode.Y -= diffY;
}
复制
已复制
复制
已复制
SaveLayoutGraph(workspace, layoutSubgraphs);
if (portType == PortType.Output)
{
double minX = double.MaxValue;
foreach (var relatedNode in targetSubgraph.Nodes)
{
if (newNodes.Any(x => x.GUID == relatedNode.Id))
{
minX = Math.Min(minX, relatedNode.X);
}
}
double targetMinX = targetNode.X + targetNode.Width + GraphLayout.Graph.HorizontalNodeDistance;
var displacement = minX == double.MaxValue ? 0 : targetMinX - minX;
复制
已复制
复制
已复制
// Restore the workspace model selection information
foreach (var relatedNode in targetSubgraph.Nodes)
selection.ToList().ForEach(x => x.Select());
{
if (newNodes.Any(x => x.GUID == relatedNode.Id))
{
relatedNode.X += displacement;
}
}
}
// right now cluster nodes only work on outputs, single nodes dont need to be relayouted as above
AvoidSubgraphOverlap(layoutSubgraphs, originalNodeGUID);
var maybeUpdateSet = workspace.Nodes.Any(x => x.IsTransient) ?
workspace.Nodes.Where(x => x.GUID == originalNodeGUID || misplacedGuidSet.Contains(x.GUID)) :
workspace.Nodes;
SaveLayoutGraphForNodeAutoComplete(workspace, maybeUpdateSet.ToList(), layoutSubgraphs, originalNodeGUID);
return layoutSubgraphs;
return layoutSubgraphs;
}
}
已保存差异
原始文本
打开文件
internal static List<GraphLayout.Graph> DoGraphAutoLayout(this WorkspaceModel workspace) { if (workspace.Nodes.Count() < 2) return null; var selection = DynamoSelection.Instance.Selection; // Check if all the selected models are groups bool isGroupLayout = selection.Count > 0 && selection.All(x => x is AnnotationModel || selection.OfType<AnnotationModel>().Any(g => g.Nodes.Contains(x))); List<GraphLayout.Graph> layoutSubgraphs; List<List<GraphLayout.Node>> subgraphClusters; GenerateCombinedGraph(workspace, isGroupLayout, out layoutSubgraphs, out subgraphClusters); //only record graph layout undo when it is not node autocomplete RecordUndoGraphLayout(workspace, isGroupLayout, false); // Generate subgraphs separately for each cluster subgraphClusters.ForEach( x => GenerateSeparateSubgraphs(new HashSet<GraphLayout.Node>(x), layoutSubgraphs)); // Deselect all nodes subgraphClusters.ForEach(c => c.ForEach(x => x.IsSelected = false)); var activeComponents = layoutSubgraphs.Skip(1).ToList(); // Run layout algorithm for each subgraph activeComponents.ForEach(g => RunLayoutSubgraph(g, isGroupLayout)); AvoidSubgraphOverlap(layoutSubgraphs); SaveLayoutGraph(workspace, layoutSubgraphs); // Restore the workspace model selection information selection.ToList().ForEach(x => x.Select()); return layoutSubgraphs; }
更改后文本
打开文件
/// <summary> /// This function wraps a few methods on the workspace model layer /// to set up and run the graph layout algorithm. /// </summary> /// <param name="workspace">Workspace on which graph layout will be performed.</param> /// <param name="originalNodeGUID"></param> /// <param name="newNodes"></param> /// <param name="misplacedNodes"></param> /// <param name="portType"></param> internal static List<GraphLayout.Graph> DoGraphAutoLayoutAutocomplete(this WorkspaceModel workspace, Guid originalNodeGUID, IEnumerable<NodeModel> newNodes, IEnumerable<NodeModel> misplacedNodes, PortType portType) { if (workspace.Nodes.Count() < 2) return null; const bool isGroupLayout = false; List<GraphLayout.Graph> layoutSubgraphs; List<List<GraphLayout.Node>> subgraphClusters; GenerateCombinedGraph(workspace, isGroupLayout, out layoutSubgraphs, out subgraphClusters); var misplacedGuidSet = misplacedNodes.Select(x => x.GUID).ToHashSet(); foreach (var node in layoutSubgraphs.First().Nodes) { //this is a virtual IsSelected - it doesnt change the workspace node models but marks it as touchable to the algorithm node.IsSelected = node.Id == originalNodeGUID || misplacedGuidSet.Contains(node.Id); } // Generate subgraphs separately for each cluster subgraphClusters.ForEach( x => GenerateSeparateSubgraphs(new HashSet<GraphLayout.Node>(x), layoutSubgraphs)); // Deselect all nodes subgraphClusters.ForEach(c => c.ForEach(x => x.IsSelected = false)); var activeComponents = layoutSubgraphs.Skip(1).ToList(); var targetSubgraph = activeComponents.FirstOrDefault(x => x.Nodes.Any(x => x.Id == originalNodeGUID)); var targetNode = targetSubgraph.Nodes.First(x => x.Id == originalNodeGUID); // Run layout algorithm for each subgraph activeComponents.ForEach(g => RunLayoutSubgraph(g, isGroupLayout)); //original node shouldn't move: move others around var diffX = targetNode.X - targetNode.InitialX; var diffY = targetNode.Y - targetNode.InitialY; foreach (var relatedNode in targetSubgraph.Nodes) { relatedNode.X -= diffX; relatedNode.Y -= diffY; } if (portType == PortType.Output) { double minX = double.MaxValue; foreach (var relatedNode in targetSubgraph.Nodes) { if (newNodes.Any(x => x.GUID == relatedNode.Id)) { minX = Math.Min(minX, relatedNode.X); } } double targetMinX = targetNode.X + targetNode.Width + GraphLayout.Graph.HorizontalNodeDistance; var displacement = minX == double.MaxValue ? 0 : targetMinX - minX; foreach (var relatedNode in targetSubgraph.Nodes) { if (newNodes.Any(x => x.GUID == relatedNode.Id)) { relatedNode.X += displacement; } } } // right now cluster nodes only work on outputs, single nodes dont need to be relayouted as above AvoidSubgraphOverlap(layoutSubgraphs, originalNodeGUID); var maybeUpdateSet = workspace.Nodes.Any(x => x.IsTransient) ? workspace.Nodes.Where(x => x.GUID == originalNodeGUID || misplacedGuidSet.Contains(x.GUID)) : workspace.Nodes; SaveLayoutGraphForNodeAutoComplete(workspace, maybeUpdateSet.ToList(), layoutSubgraphs, originalNodeGUID); return layoutSubgraphs; }
查找差异