Skip to content

Commit c4de851

Browse files
authored
Merge pull request #311 from JieGou/dev
Add visualization dialogs for CurveLoop
2 parents ffaae53 + 4c2804b commit c4de851

File tree

13 files changed

+1020
-15
lines changed

13 files changed

+1020
-15
lines changed

source/RevitLookup.Abstractions/Models/Settings/VisualizationSettings.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Text.Json.Serialization;
1+
using System.Text.Json.Serialization;
22
using System.Windows.Media;
33

44
namespace RevitLookup.Abstractions.Models.Settings;
@@ -13,6 +13,7 @@ public sealed class VisualizationSettings
1313
[JsonPropertyName("FaceSettings")] public required FaceVisualizationSettings FaceSettings { get; set; }
1414
[JsonPropertyName("MeshSettings")] public required MeshVisualizationSettings MeshSettings { get; set; }
1515
[JsonPropertyName("PolylineSettings")] public required PolylineVisualizationSettings PolylineSettings { get; set; }
16+
[JsonPropertyName("CurveLoopSettings")] public required CurveLoopVisualizationSettings CurveLoopSettings { get; set; }
1617
[JsonPropertyName("SolidSettings")] public required SolidVisualizationSettings SolidSettings { get; set; }
1718
[JsonPropertyName("XyzSettings")] public required XyzVisualizationSettings XyzSettings { get; set; }
1819
}
@@ -91,6 +92,25 @@ public class PolylineVisualizationSettings
9192
[JsonPropertyName("ShowDirection")] public bool ShowDirection { get; set; }
9293
}
9394

95+
/// <summary>
96+
/// Schema for CurveLoop visualization settings.
97+
/// </summary>
98+
[Serializable]
99+
public class CurveLoopVisualizationSettings
100+
{
101+
[JsonPropertyName("Transparency")] public double Transparency { get; set; }
102+
[JsonPropertyName("Diameter")] public double Diameter { get; set; }
103+
[JsonPropertyName("MinThickness")] public double MinThickness { get; set; }
104+
105+
[JsonPropertyName("SurfaceColor")] public Color SurfaceColor { get; set; }
106+
[JsonPropertyName("CurveColor")] public Color CurveColor { get; set; }
107+
[JsonPropertyName("DirectionColor")] public Color DirectionColor { get; set; }
108+
109+
[JsonPropertyName("ShowSurface")] public bool ShowSurface { get; set; }
110+
[JsonPropertyName("ShowCurve")] public bool ShowCurve { get; set; }
111+
[JsonPropertyName("ShowDirection")] public bool ShowDirection { get; set; }
112+
}
113+
94114
/// <summary>
95115
/// Schema for solid visualization settings.
96116
/// </summary>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.Windows.Media;
2+
3+
namespace RevitLookup.Abstractions.ViewModels.Visualization
4+
{
5+
public interface ICurveLoopVisualizationViewModel
6+
{
7+
double MinThickness { get; }
8+
double Diameter { get; set; }
9+
double Transparency { get; set; }
10+
Color SurfaceColor { get; set; }
11+
Color CurveColor { get; set; }
12+
Color DirectionColor { get; set; }
13+
bool ShowSurface { get; set; }
14+
bool ShowCurve { get; set; }
15+
bool ShowDirection { get; set; }
16+
17+
void RegisterServer(object curveLoop);
18+
void UnregisterServer();
19+
}
20+
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<ui:ContentDialog
2+
x:Class="RevitLookup.UI.Framework.Views.Visualization.CurveLoopVisualizationDialog"
3+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7+
xmlns:ui="http://lookupengine.com/xaml"
8+
xmlns:colorPicker="clr-namespace:RevitLookup.UI.Framework.Controls.ColorPicker"
9+
xmlns:local="clr-namespace:RevitLookup.UI.Framework.Views.Visualization"
10+
xmlns:visualization="clr-namespace:RevitLookup.Abstractions.ViewModels.Visualization;assembly=RevitLookup.Abstractions"
11+
Title="Visualization settings"
12+
DialogMaxWidth="470"
13+
VerticalContentAlignment="Center"
14+
mc:Ignorable="d"
15+
d:DesignHeight="540"
16+
d:DesignWidth="600"
17+
d:DataContext="{d:DesignInstance visualization:ICurveLoopVisualizationViewModel}">
18+
19+
<ui:ContentDialog.Resources>
20+
<ResourceDictionary>
21+
<ResourceDictionary.MergedDictionaries>
22+
<ui:ControlsDictionary />
23+
</ResourceDictionary.MergedDictionaries>
24+
<!-- ReSharper disable once Xaml.StaticResourceNotResolved -->
25+
<Style
26+
BasedOn="{StaticResource DefaultContentDialogStyle}"
27+
TargetType="{x:Type local:CurveLoopVisualizationDialog}" />
28+
</ResourceDictionary>
29+
</ui:ContentDialog.Resources>
30+
31+
<StackPanel>
32+
<DockPanel>
33+
<ui:SymbolIcon
34+
DockPanel.Dock="Right"
35+
Margin="8 0 0 0"
36+
FontSize="20"
37+
Symbol="Eyedropper20" />
38+
<colorPicker:ColorPickerControl
39+
DockPanel.Dock="Right"
40+
SelectedColor="{Binding SurfaceColor}" />
41+
<CheckBox
42+
TabIndex="0"
43+
IsChecked="{Binding ShowSurface}"
44+
Content="Surface" />
45+
</DockPanel>
46+
<StackPanel
47+
Margin="0 8 0 0">
48+
<DockPanel>
49+
<TextBlock
50+
Text="Diameter" />
51+
<TextBlock
52+
HorizontalAlignment="Right"
53+
Text="{Binding Diameter,
54+
StringFormat={}{0:F1} inch,
55+
Mode=OneWay,
56+
FallbackValue='12 inch'}" />
57+
</DockPanel>
58+
<Slider
59+
Margin="0 4 0 0"
60+
Minimum="{Binding MinThickness, Mode=OneTime}"
61+
Maximum="6"
62+
TickFrequency="0.2"
63+
IsSnapToTickEnabled="True"
64+
TickPlacement="BottomRight"
65+
Value="{Binding Diameter}" />
66+
</StackPanel>
67+
<StackPanel
68+
Margin="0 8 0 0">
69+
<DockPanel>
70+
<TextBlock
71+
Text="Transparency" />
72+
<TextBlock
73+
HorizontalAlignment="Right"
74+
Text="{Binding Transparency,
75+
StringFormat={}{0} %,
76+
Mode=OneWay,
77+
FallbackValue='12 %'}" />
78+
</DockPanel>
79+
<Slider
80+
Margin="0 4 0 0"
81+
Minimum="0"
82+
Maximum="100"
83+
TickFrequency="10"
84+
IsSnapToTickEnabled="True"
85+
TickPlacement="BottomRight"
86+
Value="{Binding Transparency}" />
87+
</StackPanel>
88+
<DockPanel
89+
Margin="0 8 0 0">
90+
<ui:SymbolIcon
91+
DockPanel.Dock="Right"
92+
Margin="8 0 0 0"
93+
FontSize="20"
94+
Symbol="Eyedropper20" />
95+
<colorPicker:ColorPickerControl
96+
DockPanel.Dock="Right"
97+
SelectedColor="{Binding CurveColor}" />
98+
<CheckBox
99+
TabIndex="1"
100+
IsChecked="{Binding ShowCurve}"
101+
Content="Curve Loop" />
102+
</DockPanel>
103+
<DockPanel
104+
Margin="0 8 0 0">
105+
<ui:SymbolIcon
106+
DockPanel.Dock="Right"
107+
Margin="8 0 0 0"
108+
FontSize="20"
109+
Symbol="Eyedropper20" />
110+
<colorPicker:ColorPickerControl
111+
DockPanel.Dock="Right"
112+
SelectedColor="{Binding DirectionColor}" />
113+
<CheckBox
114+
TabIndex="2"
115+
IsChecked="{Binding ShowDirection}"
116+
Content="Direction" />
117+
</DockPanel>
118+
</StackPanel>
119+
120+
</ui:ContentDialog>
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright 2003-2024 by Autodesk, Inc.
2+
//
3+
// Permission to use, copy, modify, and distribute this software in
4+
// object code form for any purpose and without fee is hereby granted,
5+
// provided that the above copyright notice appears in all copies and
6+
// that both that copyright notice and the limited warranty and
7+
// restricted rights notice below appear in all supporting
8+
// documentation.
9+
//
10+
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
11+
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
12+
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
13+
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
14+
// UNINTERRUPTED OR ERROR FREE.
15+
//
16+
// Use, duplication, or disclosure by the U.S. Government is subject to
17+
// restrictions set forth in FAR 52.227-19 (Commercial Computer
18+
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
19+
// (Rights in Technical Data and Computer Software), as applicable.
20+
21+
using RevitLookup.Abstractions.Services.Appearance;
22+
using RevitLookup.Abstractions.ViewModels.Visualization;
23+
using Wpf.Ui;
24+
25+
namespace RevitLookup.UI.Framework.Views.Visualization
26+
{
27+
public sealed partial class CurveLoopVisualizationDialog
28+
{
29+
private readonly ICurveLoopVisualizationViewModel _viewModel;
30+
31+
public CurveLoopVisualizationDialog(
32+
IContentDialogService dialogService,
33+
ICurveLoopVisualizationViewModel viewModel,
34+
IThemeWatcherService themeWatcherService)
35+
: base(dialogService.GetDialogHost())
36+
{
37+
_viewModel = viewModel;
38+
39+
DataContext = _viewModel;
40+
InitializeComponent();
41+
42+
themeWatcherService.Watch(this);
43+
}
44+
45+
public async Task ShowDialogAsync(object curveLoop)
46+
{
47+
_viewModel.RegisterServer(curveLoop);
48+
MonitorServerConnection();
49+
50+
await ShowAsync();
51+
}
52+
53+
private void MonitorServerConnection()
54+
{
55+
Unloaded += (_, _) => _viewModel.UnregisterServer();
56+
}
57+
}
58+
}

source/RevitLookup.UI.Playground/Client/ViewModels/Pages/DialogsViewModel.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Bogus;
1+
using Bogus;
22
using CommunityToolkit.Mvvm.ComponentModel;
33
using CommunityToolkit.Mvvm.Input;
44
using JetBrains.Annotations;
@@ -111,6 +111,13 @@ private async Task ShowPolylineVisualizationDialogAsync()
111111
await dialog.ShowDialogAsync("polyline");
112112
}
113113

114+
[RelayCommand]
115+
private async Task ShowCurveLoopVisualizationDialogAsync()
116+
{
117+
var dialog = serviceProvider.GetRequiredService<CurveLoopVisualizationDialog>();
118+
await dialog.ShowDialogAsync("curveLoop");
119+
}
120+
114121
[RelayCommand]
115122
private async Task ShowSolidVisualizationDialogAsync()
116123
{

source/RevitLookup.UI.Playground/Client/Views/Pages/DialogsPage.xaml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Page
1+
<Page
22
x:Class="RevitLookup.UI.Playground.Client.Views.Pages.DialogsPage"
33
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
44
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
@@ -77,6 +77,11 @@
7777
Icon="{ui:SymbolIcon Wallpaper24}"
7878
Content="Polyline visualization dialog"
7979
Command="{Binding ViewModel.ShowPolylineVisualizationDialogCommand}" />
80+
<ui:CardAction
81+
Margin="0 4 0 0"
82+
Icon="{ui:SymbolIcon Wallpaper24}"
83+
Content="CurveLoop visualization dialog"
84+
Command="{Binding ViewModel.ShowCurveLoopVisualizationDialogCommand}" />
8085
<ui:CardAction
8186
Margin="0 4 0 0"
8287
Icon="{ui:SymbolIcon Wallpaper24}"
@@ -108,5 +113,4 @@
108113
Content="Create INI entry dialog"
109114
Command="{Binding ViewModel.ShowCreateIniEntryDialogCommand}" />
110115
</StackPanel>
111-
112116
</Page>

source/RevitLookup.UI.Playground/Mockups/Services/Settings/MockSettingsService.cs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ public sealed class MockSettingsService(
2222
private DecompositionSettings? _decompositionSettings;
2323
private VisualizationSettings? _visualizationSettings;
2424

25-
public ApplicationSettings ApplicationSettings => _applicationSettings ?? throw new InvalidOperationException("Settings is not loaded.");
26-
public DecompositionSettings DecompositionSettings => _decompositionSettings ?? throw new InvalidOperationException("Settings is not loaded.");
27-
public VisualizationSettings VisualizationSettings => _visualizationSettings ?? throw new InvalidOperationException("Settings is not loaded.");
25+
public ApplicationSettings ApplicationSettings => _applicationSettings ?? throw new InvalidOperationException("Application settings is not loaded.");
26+
public DecompositionSettings DecompositionSettings => _decompositionSettings ?? throw new InvalidOperationException("Decomposition settings is not loaded.");
27+
public VisualizationSettings VisualizationSettings => _visualizationSettings ?? throw new InvalidOperationException("Visualization settings is not loaded.");
2828

2929
public void SaveSettings()
3030
{
@@ -67,7 +67,7 @@ private void SaveVisualizationSettings()
6767
File.WriteAllText(path, json);
6868
}
6969

70-
private void LoadApplicationSettings()
70+
private void LoadApplicationSettings()
7171
{
7272
var path = foldersOptions.Value.ApplicationSettingsPath;
7373
if (!File.Exists(path))
@@ -85,6 +85,11 @@ private void LoadApplicationSettings()
8585
{
8686
logger.LogError(exception, "Application settings loading error");
8787
}
88+
89+
if (_applicationSettings is null)
90+
{
91+
ResetApplicationSettings();
92+
}
8893
}
8994

9095
private void LoadDecompositionSettings()
@@ -105,6 +110,11 @@ private void LoadDecompositionSettings()
105110
{
106111
logger.LogError(exception, "Decomposition settings loading error");
107112
}
113+
114+
if (_decompositionSettings is null)
115+
{
116+
ResetDecompositionSettings();
117+
}
108118
}
109119

110120
private void LoadVisualizationSettings()
@@ -125,6 +135,11 @@ private void LoadVisualizationSettings()
125135
{
126136
logger.LogError(exception, "Application settings loading error");
127137
}
138+
139+
if (_visualizationSettings is null)
140+
{
141+
ResetVisualizationSettings();
142+
}
128143
}
129144

130145
public void ResetApplicationSettings()
@@ -198,6 +213,18 @@ public void ResetVisualizationSettings()
198213
ShowCurve = true,
199214
ShowDirection = true
200215
},
216+
CurveLoopSettings = new CurveLoopVisualizationSettings
217+
{
218+
Transparency = 20,
219+
Diameter = 2,
220+
MinThickness = 0.1,
221+
SurfaceColor = Colors.DodgerBlue,
222+
CurveColor = Color.FromArgb(255, 30, 81, 255),
223+
DirectionColor = Color.FromArgb(255, 255, 89, 30),
224+
ShowSurface = true,
225+
ShowCurve = true,
226+
ShowDirection = true
227+
},
201228
SolidSettings = new SolidVisualizationSettings
202229
{
203230
Transparency = 20,

0 commit comments

Comments
 (0)