diff --git a/.gitattributes b/.gitattributes index 412eeda78d..4ac7d04eca 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,5 @@ # Auto detect text files and perform LF normalization * text=auto - # Custom for Visual Studio *.cs diff=csharp *.sln merge=union @@ -8,7 +7,6 @@ *.vbproj merge=union *.fsproj merge=union *.dbproj merge=union - # Standard to msysgit *.doc diff=astextplain *.DOC diff=astextplain @@ -20,3 +18,4 @@ *.PDF diff=astextplain *.rtf diff=astextplain *.RTF diff=astextplain +test/System/Samples/Snowdon[[:space:]]Towers[[:space:]]Sample[[:space:]]Architectural.rvt filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 93d7e05bba..875e04fe65 100644 --- a/.gitignore +++ b/.gitignore @@ -224,4 +224,4 @@ test/**/*.addin test/SystemInJson # Icon resources -/src/DynamoRevitIcons/*.resources +/src/DynamoRevitIcons/*.resources \ No newline at end of file diff --git a/doc/distrib/Samples/cs-CZ/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/cs-CZ/Revit/Revit Import Solid.dyn index 568fa12601..75c05adebd 100644 --- a/doc/distrib/Samples/cs-CZ/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/cs-CZ/Revit/Revit Import Solid.dyn @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "Umožňuje přímé vytváření kódu DesignScript.", - "Code": "\"Pracovní rovina\";" + "Code": "\"Úroveň\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/de-DE/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/de-DE/Revit/Revit Import Solid.dyn index 56490227c1..2400a86883 100644 --- a/doc/distrib/Samples/de-DE/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/de-DE/Revit/Revit Import Solid.dyn @@ -1195,7 +1195,7 @@ { "Id": "642fda9615c84dd3acf612b2cc1bd1c8", "Name": "string", - "Description": "\"Arbeitsebene\"", + "Description": "\"Ebene\"", "UsingDefaultValue": false, "Level": 2, "UseLevels": false, @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "Ermöglicht die direkte Erstellung von DesignScript-Code.", - "Code": "\"Arbeitsebene\";" + "Code": "\"Ebene\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/en-GB/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/en-GB/Revit/Revit Import Solid.dyn index edcfd68952..4c94d1da8e 100644 --- a/doc/distrib/Samples/en-GB/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/en-GB/Revit/Revit Import Solid.dyn @@ -1195,7 +1195,7 @@ { "Id": "642fda9615c84dd3acf612b2cc1bd1c8", "Name": "string", - "Description": "\"Work Plane\"", + "Description": "\"Level\"", "UsingDefaultValue": false, "Level": 2, "UseLevels": false, @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "Allows for DesignScript code to be authored directly", - "Code": "\"Work Plane\";" + "Code": "\"Level\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/en-US/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/en-US/Revit/Revit Import Solid.dyn index edcfd68952..6612a77408 100644 --- a/doc/distrib/Samples/en-US/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/en-US/Revit/Revit Import Solid.dyn @@ -1195,7 +1195,7 @@ { "Id": "642fda9615c84dd3acf612b2cc1bd1c8", "Name": "string", - "Description": "\"Work Plane\"", + "Description": "\"Level\"", "UsingDefaultValue": false, "Level": 2, "UseLevels": false, @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "Allows for DesignScript code to be authored directly", - "Code": "\"Work Plane\";" + "Code": "\"Level\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", @@ -3567,7 +3567,7 @@ }, { "Id": "3384eaf2af26445291a1584055510725", - "Title": "Correct the height of the placed Import Instance by setting the Work Plane parameter to the Level which elevation matches the Internal Origin position.", + "Title": "Correct the height of the placed Import Instance by setting the Level parameter to the Level which elevation matches the Internal Origin position.", "DescriptionText": null, "IsExpanded": true, "WidthAdjustment": 0.0, diff --git a/doc/distrib/Samples/es-ES/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/es-ES/Revit/Revit Import Solid.dyn index 04ac57f067..ac7c89dafa 100644 --- a/doc/distrib/Samples/es-ES/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/es-ES/Revit/Revit Import Solid.dyn @@ -1195,7 +1195,7 @@ { "Id": "642fda9615c84dd3acf612b2cc1bd1c8", "Name": "string", - "Description": "\"Plano de trabajo\"", + "Description": "\"Nivel\"", "UsingDefaultValue": false, "Level": 2, "UseLevels": false, @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "Permite creación directa de código de DesignScript", - "Code": "\"Plano de trabajo\";" + "Code": "\"Nivel\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/fr-FR/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/fr-FR/Revit/Revit Import Solid.dyn index bfefa265ce..b9e5318ada 100644 --- a/doc/distrib/Samples/fr-FR/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/fr-FR/Revit/Revit Import Solid.dyn @@ -1195,7 +1195,7 @@ { "Id": "642fda9615c84dd3acf612b2cc1bd1c8", "Name": "string", - "Description": "\"Plan de construction\"", + "Description": "\"Niveau\"", "UsingDefaultValue": false, "Level": 2, "UseLevels": false, @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "Permet de créer le code DesignScript directement", - "Code": "\"Plan de construction\";" + "Code": "\"Niveau\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/it-IT/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/it-IT/Revit/Revit Import Solid.dyn index 8bc5cca76d..911949a1bc 100644 --- a/doc/distrib/Samples/it-IT/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/it-IT/Revit/Revit Import Solid.dyn @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "Consente la creazione diretta di codice DesignScript", - "Code": "\"Piano di lavoro\";" + "Code": "\"Livello\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/ja-JP/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/ja-JP/Revit/Revit Import Solid.dyn index c861dbfe9f..4719a45dff 100644 --- a/doc/distrib/Samples/ja-JP/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/ja-JP/Revit/Revit Import Solid.dyn @@ -1195,7 +1195,7 @@ { "Id": "642fda9615c84dd3acf612b2cc1bd1c8", "Name": "string", - "Description": "\"作業面\"", + "Description": "\"レベル\"", "UsingDefaultValue": false, "Level": 2, "UseLevels": false, @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "DesignScript のコードを直接作成することができます。", - "Code": "\"作業面\";" + "Code": "\"レベル\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/ko-KR/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/ko-KR/Revit/Revit Import Solid.dyn index 82759b6f35..a03fe57767 100644 --- a/doc/distrib/Samples/ko-KR/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/ko-KR/Revit/Revit Import Solid.dyn @@ -1195,7 +1195,7 @@ { "Id": "642fda9615c84dd3acf612b2cc1bd1c8", "Name": "string", - "Description": "\"작업 기준면\"", + "Description": "\"레벨\"", "UsingDefaultValue": false, "Level": 2, "UseLevels": false, @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "DesignScript 코드를 직접 작성할 수 있습니다", - "Code": "\"작업 기준면\";" + "Code": "\"레벨\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/pl-PL/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/pl-PL/Revit/Revit Import Solid.dyn index c32ed645f7..92fb2c1fca 100644 --- a/doc/distrib/Samples/pl-PL/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/pl-PL/Revit/Revit Import Solid.dyn @@ -1195,7 +1195,7 @@ { "Id": "642fda9615c84dd3acf612b2cc1bd1c8", "Name": "string", - "Description": "\"Płaszczyzna robocza\"", + "Description": "\"Poziom\"", "UsingDefaultValue": false, "Level": 2, "UseLevels": false, @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "Umożliwia bezpośrednie utworzenie kodu DesignScript.", - "Code": "\"Płaszczyzna robocza\";" + "Code": "\"Poziom\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/pt-BR/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/pt-BR/Revit/Revit Import Solid.dyn index 15214944bf..9dd4e222c5 100644 --- a/doc/distrib/Samples/pt-BR/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/pt-BR/Revit/Revit Import Solid.dyn @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "Permite que o código DesignScript seja criado diretamente", - "Code": "\"Plano de trabalho\";" + "Code": "\"Nível\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/ru-RU/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/ru-RU/Revit/Revit Import Solid.dyn index 0c5f9b8762..73d3d9ff77 100644 --- a/doc/distrib/Samples/ru-RU/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/ru-RU/Revit/Revit Import Solid.dyn @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "Обеспечивает возможность непосредственного авторства кода DesignScript", - "Code": "\"Рабочая плоскость\";" + "Code": "\"Уровень\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/zh-CN/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/zh-CN/Revit/Revit Import Solid.dyn index ab72ef116a..499f7642fd 100644 --- a/doc/distrib/Samples/zh-CN/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/zh-CN/Revit/Revit Import Solid.dyn @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "允许直接编写 DesignScript 代码", - "Code": "\"工作平面\";" + "Code": "\"标高\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/doc/distrib/Samples/zh-TW/Revit/Revit Import Solid.dyn b/doc/distrib/Samples/zh-TW/Revit/Revit Import Solid.dyn index 403c4e27a3..320d1f6cd3 100644 --- a/doc/distrib/Samples/zh-TW/Revit/Revit Import Solid.dyn +++ b/doc/distrib/Samples/zh-TW/Revit/Revit Import Solid.dyn @@ -1195,7 +1195,7 @@ { "Id": "642fda9615c84dd3acf612b2cc1bd1c8", "Name": "string", - "Description": "\"工作平面\"", + "Description": "\"樓層\"", "UsingDefaultValue": false, "Level": 2, "UseLevels": false, @@ -1204,7 +1204,7 @@ ], "Replication": "Disabled", "Description": "允許直接編寫 DesignScript 程式碼", - "Code": "\"工作平面\";" + "Code": "\"樓層\";" }, { "ConcreteType": "DSRevitNodesUI.Levels, DSRevitNodesUI", diff --git a/test/Libraries/RevitIntegrationTests/OOTB_D4R_SampleTests.cs b/test/Libraries/RevitIntegrationTests/OOTB_D4R_SampleTests.cs new file mode 100644 index 0000000000..a0ed6e4115 --- /dev/null +++ b/test/Libraries/RevitIntegrationTests/OOTB_D4R_SampleTests.cs @@ -0,0 +1,129 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using Dynamo.Graph.Nodes; +using NUnit.Framework; +using RevitTestServices; +using RTF.Framework; + +namespace RevitSystemTests +{ + [TestFixture] + class OOTB_D4R_SampleTests : RevitSystemTestBase + { + private static string ResolveSamplePath(string scriptFileName) + { + string assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + string parentDir = Path.GetDirectoryName(assemblyDir); + string resolved = Path.Combine(parentDir, "samples", "en-US", "Revit", scriptFileName); + if (File.Exists(resolved)) + return resolved; + + throw new FileNotFoundException( + $"Cannot locate OOTB D4R sample script '{scriptFileName}' under {Path.Combine(parentDir, "samples")}."); + } + + private void OpenAndRunSample(string scriptFileName) + { + string testPath = Path.GetFullPath(ResolveSamplePath(scriptFileName)); + + ViewModel.OpenCommand.Execute(testPath); + + Assert.IsTrue( + ViewModel.Model.CurrentWorkspace.Nodes.Any(), + $"Graph '{scriptFileName}' opened but contains no nodes — file may not have loaded correctly."); + + AssertNoDummyNodes(); + + var brokenConnectors = ViewModel.Model.CurrentWorkspace.Connectors + .Where(c => c.Start == null || c.End == null).ToList(); + Assert.IsFalse(brokenConnectors.Any(), + $"Graph '{scriptFileName}' has {brokenConnectors.Count} broken connector(s)."); + + RunCurrentModel(); + + var errorNodes = ViewModel.Model.CurrentWorkspace.Nodes + .Where(n => n.State == ElementState.Error || n.State == ElementState.Warning).ToList(); + if (errorNodes.Any()) + { + var first = errorNodes[0]; + var msg = first.NodeInfos + .FirstOrDefault(i => i.State == ElementState.Error || i.State == ElementState.Warning)?.Message; + Assert.Fail( + $"After RunCurrentModel(), {errorNodes.Count} node(s) in error/warning in '{scriptFileName}'. " + + $"First: [{first.State}] {first.Name}" + (msg != null ? $": {msg}" : string.Empty)); + } + } + + [Test, Category("SmokeTests")] + [TestModel(@".\AdaptiveComponents.rfa")] + public void Revit_Geometry_Creation_Points() + { + OpenAndRunSample("Revit Geometry Creation Points.dyn"); + } + + [Test, Category("SmokeTests")] + [TestModel(@".\Snowdon Towers Sample Architectural.rvt")] + public void Revit_Geometry_Creation_Curves() + { + OpenAndRunSample("Revit Geometry Creation Curves.dyn"); + } + + [Test, Category("SmokeTests")] + [TestModel(@".\empty.rfa")] + public void Revit_Geometry_Creation_Solids() + { + OpenAndRunSample("Revit Geometry Creation Solids.dyn"); + } + + [Test, Category("SmokeTests")] + [TestModel(@".\empty.rfa")] + public void Revit_Geometry_Creation_Surfaces() + { + OpenAndRunSample("Revit Geometry Creation Surfaces.dyn"); + } + + [Test, Category("SmokeTests")] + [TestModel(@".\DynamoSample_2021.rvt")] + public void OOTB_Revit_Adaptive_Component_Placement() + { + OpenAndRunSample("Revit Adaptive Component Placement.dyn"); + } + + [Test, Category("SmokeTests")] + [TestModel(@".\Snowdon Towers Sample Architectural.rvt")] + public void OOTB_Revit_Color() + { + OpenAndRunSample("Revit Color.dyn"); + } + + [Test, Category("SmokeTests")] + [TestModel(@".\Snowdon Towers Sample Architectural.rvt")] + public void OOTB_Revit_Floors_and_Framing() + { + OpenAndRunSample("Revit Floors and Framing.dyn"); + } + + [Test, Category("SmokeTests")] + [TestModel(@".\Snowdon Towers Sample Architectural.rvt")] + public void Revit_Import_Solid() + { + OpenAndRunSample("Revit Import Solid.dyn"); + } + + [Test, Category("SmokeTests")] + [TestModel(@".\Snowdon Towers Sample Architectural.rvt")] + public void Revit_Place_Families_By_Level_Set_Parameters() + { + OpenAndRunSample("Revit Place Families By Level Set Parameters.dyn"); + } + + [Test, Category("SmokeTests")] + [TestModel(@".\Snowdon Towers Sample Architectural.rvt")] + public void Revit_Structural_Framing() + { + OpenAndRunSample("Revit Structural Framing.dyn"); + } + } +} diff --git a/test/System/Samples/Snowdon Towers Sample Architectural.rvt b/test/System/Samples/Snowdon Towers Sample Architectural.rvt new file mode 100644 index 0000000000..f4791d1473 --- /dev/null +++ b/test/System/Samples/Snowdon Towers Sample Architectural.rvt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:931eeef58311d87ad5b15eb2622a4a7cd2737091d295c24e625c67e445ad65d1 +size 97615872