internal static void AuditUnits(RhinoDoc doc) { if (Command.InScriptRunnerCommand()) { return; } if (Revit.ActiveUIDocument?.Document is DB.Document revitDoc) { var units = revitDoc.GetUnits(); var lengthFormatoptions = units.GetFormatOptions(DB.UnitType.UT_Length); var RevitModelUnitSystem = lengthFormatoptions.DisplayUnits.ToUnitSystem(); var GrasshopperModelUnitSystem = GH.Guest.ModelUnitSystem != UnitSystem.Unset ? GH.Guest.ModelUnitSystem : doc.ModelUnitSystem; if (doc.ModelUnitSystem != RevitModelUnitSystem || doc.ModelUnitSystem != GrasshopperModelUnitSystem) { var hasUnits = doc.ModelUnitSystem != UnitSystem.Unset && doc.ModelUnitSystem != UnitSystem.None; var expandedContent = doc.IsOpening ? $"The Rhino model you are opening is in {doc.ModelUnitSystem}{Environment.NewLine}Revit document '{revitDoc.Title}' length units are {RevitModelUnitSystem}" : string.Empty; using ( var taskDialog = new TaskDialog("Units") { MainIcon = External.UI.TaskDialogIcons.IconInformation, TitleAutoPrefix = true, AllowCancellation = hasUnits, MainInstruction = hasUnits ? (doc.IsOpening ? "Model units mismatch." : "Model units mismatch warning.") : "Rhino model has no units.", MainContent = doc.IsOpening ? "What units do you want to use?" : $"Revit document '{revitDoc.Title}' length units are {RevitModelUnitSystem}." + (hasUnits ? $"{Environment.NewLine}Rhino is working in {doc.ModelUnitSystem}." : string.Empty), ExpandedContent = expandedContent, FooterText = "Current version: " + Addin.DisplayVersion } ) { if (!doc.IsOpening && hasUnits) { #if REVIT_2020 taskDialog.EnableDoNotShowAgain("RhinoInside.Revit.DocumentUnitsMismatch", true, "Do not show again"); #else // Without the ability of checking DoNotShowAgain this may be too anoying. return; #endif } else { taskDialog.AddCommandLink(Autodesk.Revit.UI.TaskDialogCommandLinkId.CommandLink2, $"Use {RevitModelUnitSystem} like Revit", $"Scale Rhino model by {UnitScale(doc.ModelUnitSystem, RevitModelUnitSystem)}"); taskDialog.DefaultButton = Autodesk.Revit.UI.TaskDialogResult.CommandLink2; } if (hasUnits) { if (doc.IsOpening) { taskDialog.AddCommandLink(Autodesk.Revit.UI.TaskDialogCommandLinkId.CommandLink1, $"Continue in {doc.ModelUnitSystem}", $"Rhino and Grasshopper will work in {doc.ModelUnitSystem}"); taskDialog.DefaultButton = Autodesk.Revit.UI.TaskDialogResult.CommandLink1; } else { taskDialog.CommonButtons = Autodesk.Revit.UI.TaskDialogCommonButtons.Ok; taskDialog.DefaultButton = Autodesk.Revit.UI.TaskDialogResult.Ok; } } if (GH.Guest.ModelUnitSystem != UnitSystem.Unset) { taskDialog.ExpandedContent += $"{Environment.NewLine}Documents opened in Grasshopper were working in {GH.Guest.ModelUnitSystem}"; if (GrasshopperModelUnitSystem != doc.ModelUnitSystem && GrasshopperModelUnitSystem != RevitModelUnitSystem) { taskDialog.AddCommandLink(Autodesk.Revit.UI.TaskDialogCommandLinkId.CommandLink3, $"Adjust Rhino model to {GH.Guest.ModelUnitSystem} like Grasshopper", $"Scale Rhino model by {UnitScale(doc.ModelUnitSystem, GH.Guest.ModelUnitSystem)}"); taskDialog.DefaultButton = Autodesk.Revit.UI.TaskDialogResult.CommandLink3; } } switch (taskDialog.Show()) { case Autodesk.Revit.UI.TaskDialogResult.CommandLink2: doc.ModelAngleToleranceRadians = Revit.AngleTolerance; doc.ModelDistanceDisplayPrecision = Clamp((int)-Log10(lengthFormatoptions.Accuracy), 0, 7); doc.ModelAbsoluteTolerance = Revit.VertexTolerance * UnitScale(UnitSystem.Feet, RevitModelUnitSystem); doc.AdjustModelUnitSystem(RevitModelUnitSystem, true); AdjustViewConstructionPlanes(doc); break; case Autodesk.Revit.UI.TaskDialogResult.CommandLink3: doc.ModelAngleToleranceRadians = Revit.AngleTolerance; doc.ModelDistanceDisplayPrecision = Clamp(Grasshopper.CentralSettings.FormatDecimalDigits, 0, 7); doc.ModelAbsoluteTolerance = Revit.VertexTolerance * UnitScale(UnitSystem.Feet, GH.Guest.ModelUnitSystem); doc.AdjustModelUnitSystem(GH.Guest.ModelUnitSystem, true); AdjustViewConstructionPlanes(doc); break; default: AuditTolerances(doc); break; } } } } }