コード例 #1
0
        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;
                        }
                    }
                }
            }
        }