Skip to content

Commit 868e1b6

Browse files
committed
gui: add manual offset option, add option open output folder after finished
1 parent 0a551d6 commit 868e1b6

File tree

5 files changed

+175
-26
lines changed

5 files changed

+175
-26
lines changed

App.config

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,21 @@
106106
<setting name="customintensityrange" serializeAs="String">
107107
<value>False</value>
108108
</setting>
109+
<setting name="openOutputFolder" serializeAs="String">
110+
<value>False</value>
111+
</setting>
112+
<setting name="useManualOffset" serializeAs="String">
113+
<value>False</value>
114+
</setting>
115+
<setting name="manualOffsetX" serializeAs="String">
116+
<value>0</value>
117+
</setting>
118+
<setting name="manualOffsetY" serializeAs="String">
119+
<value>0</value>
120+
</setting>
121+
<setting name="manualOffsetZ" serializeAs="String">
122+
<value>0</value>
123+
</setting>
109124
</PointCloudConverter.Properties.Settings>
110125
</userSettings>
111126
</configuration>

MainWindow.xaml

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
66
xmlns:local="clr-namespace:PointCloudConverter"
77
mc:Ignorable="d"
8-
Title="PointCloudConverter" Height="640" Width="907" Background="#FF252222" Closing="Window_Closing" Loaded="Window_Loaded">
8+
Title="PointCloudConverter" Height="680" Width="907" Background="#FF252222" Closing="Window_Closing" Loaded="Window_Loaded">
99
<Grid Margin="0,0,2,0">
1010
<Button x:Name="btnBrowseInput" Content="..." HorizontalAlignment="Left" Margin="636,48,0,0" VerticalAlignment="Top" Width="32" Height="23" Click="btnBrowseInput_Click" ToolTip="Browse for input file"/>
1111
<TextBox x:Name="txtInputFile" HorizontalAlignment="Left" AllowDrop="True" Height="23" Margin="20,48,0,0" VerticalAlignment="Top" Width="611" PreviewDrop="txtInputFile_Drop" PreviewDragOver="txtInputFile_DragEnter"/>
1212
<Label x:Name="label" Content="Input file or folder:&#xD;&#xA;" HorizontalAlignment="Left" Margin="20,22,0,0" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" Height="26"/>
13-
<Button x:Name="btnConvert" Content="Convert" HorizontalAlignment="Left" Margin="516,441,0,0" VerticalAlignment="Top" Width="371" Height="58" Click="btnConvert_Click"/>
13+
<Button x:Name="btnConvert" Content="Convert" HorizontalAlignment="Left" Margin="516,463,0,0" VerticalAlignment="Top" Width="371" Height="58" Click="btnConvert_Click"/>
1414
<Button x:Name="btnBrowseOutput" Content="..." HorizontalAlignment="Left" Margin="636,114,0,0" VerticalAlignment="Top" Width="32" Height="23" Click="btnBrowseOutput_Click" ToolTip="Browse for output file"/>
1515
<TextBox x:Name="txtOutput" HorizontalAlignment="Left" Height="23" Margin="20,114,0,0" VerticalAlignment="Top" Width="611"/>
1616
<Label x:Name="label_Copy" Content="Output:" HorizontalAlignment="Left" Margin="20,88,0,0" VerticalAlignment="Top" Foreground="{DynamicResource MainText}"/>
@@ -19,12 +19,23 @@
1919
<ComboBox x:Name="cmbImportFormat" HorizontalAlignment="Left" Margin="719,48,0,0" VerticalAlignment="Top" Width="163" IsReadOnly="True"/>
2020
<Label x:Name="label_Copy2" Content="Import format:&#xA;" HorizontalAlignment="Left" Margin="719,22,0,0" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" Height="26"/>
2121

22-
<StackPanel HorizontalAlignment="Left" Height="238" Margin="20,198,0,0" VerticalAlignment="Top" Width="277">
22+
<StackPanel HorizontalAlignment="Left" Height="250" Margin="20,174,0,0" VerticalAlignment="Top" Width="277">
2323
<StackPanel Orientation="Horizontal">
2424
<CheckBox x:Name="chkImportRGB" Content="Read RGB" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" IsChecked="True" ToolTip="Reads RGB color values" Checked="chkImportRGB_Checked" Unchecked="chkImportRGB_Unchecked"/>
2525
<CheckBox x:Name="chkImportIntensity" Content="Read Intensity" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" IsChecked="False" ToolTip="Reads Intensity as Color value" Checked="chkImportIntensity_Checked" Unchecked="chkImportIntensity_Unchecked"/>
2626
</StackPanel>
27-
<CheckBox x:Name="chkAutoOffset" Content="Auto-Offset" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" IsChecked="True" ToolTip="Auto-offsets cloud near 0,0,0 by using the first point as offset value"/>
27+
<CheckBox x:Name="chkAutoOffset" Content="Auto-Offset" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" IsChecked="True" ToolTip="Auto-offsets cloud near 0,0,0 by using bounds min. as offset" Checked="chkAutoOffset_Checked"/>
28+
<StackPanel Orientation="Vertical">
29+
<CheckBox x:Name="chkManualOffset" Content="Manual Offset" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" IsChecked="True" ToolTip="Add offset to all points (After Auto-Offset and Flip, if those are enabled)" Checked="chkManualOffset_Checked"/>
30+
<StackPanel Orientation="Horizontal" Margin="18,0,0,0">
31+
<Label x:Name="label_CopyX" Content="X:" HorizontalAlignment="Left" Margin="0,0,0,0" Foreground="{DynamicResource MainText}" Height="22" VerticalAlignment="Top" Padding="2,0,0,0"/>
32+
<TextBox x:Name="txtOffsetX" HorizontalAlignment="Left" Margin="0" TextWrapping="Wrap" VerticalAlignment="Top" Width="75" Text="0" MaxLines="1" />
33+
<Label x:Name="label_CopyY" Content="Y:" HorizontalAlignment="Left" Margin="0,0,0,0" Foreground="{DynamicResource MainText}" Height="22" VerticalAlignment="Top" Padding="3,0,0,0"/>
34+
<TextBox x:Name="txtOffsetY" HorizontalAlignment="Left" Margin="0" TextWrapping="Wrap" VerticalAlignment="Top" Width="75" Text="0" MaxLines="1" />
35+
<Label x:Name="label_CopyZ" Content="Z:" HorizontalAlignment="Left" Margin="0,0,0,0" Foreground="{DynamicResource MainText}" Height="22" VerticalAlignment="Top" Padding="3,0,0,0"/>
36+
<TextBox x:Name="txtOffsetZ" HorizontalAlignment="Left" Margin="0" TextWrapping="Wrap" VerticalAlignment="Top" Width="73" Text="0" MaxLines="1" />
37+
</StackPanel>
38+
</StackPanel>
2839
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal"/>
2940
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal"/>
3041
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal">
@@ -54,35 +65,27 @@
5465
<TextBox x:Name="txtMaxFileCount" HorizontalAlignment="Left" Margin="0" TextWrapping="Wrap" VerticalAlignment="Top" Width="92"/>
5566
</StackPanel>
5667
<CheckBox x:Name="chkRandomize" Content="Randomize" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" IsChecked="True" ToolTip="Randomize point indexes, to use Dynamic resolution\tDefault is true (Always enabled for v3)"/>
57-
<!--<CheckBox x:Name="chkOpenOutput" Content="Open output folder" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" IsChecked="False" ToolTip="Open Explorer to Output folder after finished processing"/>-->
68+
<CheckBox x:Name="chkOpenOutputFolder" Content="Open output folder" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" IsChecked="False" ToolTip="Open Explorer to Output folder after finished processing"/>
5869
<!--<CheckBox x:Name="chkReadMetaData" Content="Import metadata" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" IsChecked="True" ToolTip="Reads LAs/LAZ metadata and saves into file"/>-->
5970
</StackPanel>
60-
<Label x:Name="label_Copy6" Content="Global Options" HorizontalAlignment="Left" Margin="20,167,0,0" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" FontWeight="Bold"/>
61-
<StatusBar Margin="0" VerticalAlignment="Bottom" Background="{x:Null}">
62-
<StatusBarItem>
63-
<ProgressBar x:Name="progressBarFiles" Height="10" Width="190" Background="{x:Null}" HorizontalAlignment="Left" Maximum="1" Foreground="Lime" ToolTip="Files to process"/>
64-
</StatusBarItem>
65-
<StatusBarItem>
66-
<ProgressBar x:Name="progressBarPoints" Height="10" Width="490" Background="{x:Null}" HorizontalAlignment="Left" Maximum="1" Foreground="Lime" ToolTip="Points to process (in current file)"/>
67-
</StatusBarItem>
68-
<StatusBarItem>
69-
<Label x:Name="lblStatus" Foreground="{DynamicResource MainText}">Status</Label>
70-
</StatusBarItem>
71-
</StatusBar>
72-
<TextBox x:Name="txtConsole" HorizontalAlignment="Left" Height="53" Margin="10,526,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="877" IsReadOnly="True" UndoLimit="1" Background="#FF404040" BorderBrush="{x:Null}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>
73-
<Label x:Name="label_Copy5" Content="Generated commandline parameters:" HorizontalAlignment="Left" Margin="5,503,0,0" VerticalAlignment="Top" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" FontWeight="Bold"/>
74-
<Button x:Name="btnGetParams" Content="Get Commandline params" HorizontalAlignment="Left" Margin="10,440,0,0" VerticalAlignment="Top" Width="214" Height="58" Click="btnGetParams_Click"/>
75-
<StackPanel HorizontalAlignment="Left" Height="149" Margin="320,198,0,0" VerticalAlignment="Top" Width="234">
71+
<Label x:Name="label_Copy6" Content="Global Options" HorizontalAlignment="Left" Margin="20,143,0,0" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" FontWeight="Bold"/>
72+
73+
<TextBox x:Name="txtConsole" HorizontalAlignment="Left" Height="53" Margin="10,552,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="877" IsReadOnly="True" UndoLimit="1" Background="#FF404040" BorderBrush="{x:Null}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>
74+
<Label x:Name="label_Copy5" Content="Generated commandline parameters:" HorizontalAlignment="Left" Margin="10,526,0,0" VerticalAlignment="Top" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" FontWeight="Bold"/>
75+
<Button x:Name="btnGetParams" Content="Get Commandline params" HorizontalAlignment="Left" Margin="12,463,0,0" VerticalAlignment="Top" Width="214" Height="58" Click="btnGetParams_Click"/>
76+
<StackPanel HorizontalAlignment="Left" Height="149" Margin="320,174,0,0" VerticalAlignment="Top" Width="234">
7677
<CheckBox x:Name="chkPackColors" Content="Pack Colors" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" ToolTip="Packs color values, improves performance in viewer (but can cause lower precision positions and colors). Requires using special packed material&amp;shader in viewer"/>
7778
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal">
7879
<CheckBox x:Name="chkUsePackMagic" Content="PackMagic:" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" ToolTip="Optional packing adjustment MagicInteger. Increase this value is you have large tiles and notice precision or color issues with packed data"/>
7980
<TextBox x:Name="txtPackMagic" HorizontalAlignment="Left" Margin="0" TextWrapping="Wrap" VerticalAlignment="Top" Width="40" Text="64"/>
8081
</StackPanel>
8182
<CheckBox x:Name="chkCustomIntensityRange" Content="Custom intensity range (0-65535)" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" ToolTip="Expected default range is 0-255, but often it can be 0-65535"/>
8283
</StackPanel>
83-
<Label x:Name="label_Copy9" Content="V2 (.ucpc) &amp; V3 (.pcroot) Options" HorizontalAlignment="Left" Margin="318,167,0,0" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" FontWeight="Bold"/>
84-
<Label x:Name="label_Copy10" Content="V3 (.pcroot) Options" HorizontalAlignment="Left" Margin="623,167,0,0" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" FontWeight="Bold"/>
85-
<StackPanel HorizontalAlignment="Left" Height="238" Margin="624,198,-111,0" VerticalAlignment="Top" Width="277">
84+
<Label x:Name="label_Copy9" Content="V2 (.ucpc) &amp; V3 (.pcroot) Options" HorizontalAlignment="Left" Margin="318,143,0,0" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" FontWeight="Bold"/>
85+
<Label x:Name="label_Copy10" Content="V3 (.pcroot) Options" HorizontalAlignment="Left" Margin="623,143,0,0" VerticalAlignment="Top" Foreground="{DynamicResource MainText}" FontWeight="Bold"/>
86+
87+
<!--v3 options-->
88+
<StackPanel HorizontalAlignment="Left" Height="238" Margin="624,174,0,0" VerticalAlignment="Top" Width="277">
8689
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal">
8790
<Label x:Name="label_Copy11" Content="Grid size:" HorizontalAlignment="Left" Margin="0" VerticalAlignment="Top" Foreground="{DynamicResource MainText}"/>
8891
<TextBox x:Name="txtGridSize" HorizontalAlignment="Left" Margin="0" TextWrapping="Wrap" VerticalAlignment="Top" Width="40" Text="10" ToolTip="Gridsize in meters, splits cloud into tiles with this size. v3 only!"/>
@@ -97,6 +100,18 @@
97100
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal"/>
98101
</StackPanel>
99102

103+
<StatusBar Margin="8,0,0,0" VerticalAlignment="Bottom" Background="{x:Null}">
104+
<StatusBarItem>
105+
<ProgressBar x:Name="progressBarFiles" Height="10" Width="190" Background="{x:Null}" HorizontalAlignment="Left" Maximum="1" Foreground="Lime" ToolTip="Files to process"/>
106+
</StatusBarItem>
107+
<StatusBarItem>
108+
<ProgressBar x:Name="progressBarPoints" Height="10" Width="490" Background="{x:Null}" HorizontalAlignment="Left" Maximum="1" Foreground="Lime" ToolTip="Points to process (in current file)"/>
109+
</StatusBarItem>
110+
<StatusBarItem>
111+
<Label x:Name="lblStatus" Foreground="{DynamicResource MainText}">Status</Label>
112+
</StatusBarItem>
113+
</StatusBar>
114+
100115
<!--progress panel-->
101116
<Grid x:Name="gridProcessingPanel" Background="#A3000000" Visibility="Hidden">
102117
<Button x:Name="btnCancel" Content="Stop processing!" HorizontalAlignment="Center" Margin="0" VerticalAlignment="Center" Width="214" Height="58" Click="BtnCancel_Click"/>

MainWindow.xaml.cs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace PointCloudConverter
1818
{
1919
public partial class MainWindow : Window
2020
{
21-
static string appname = "PointCloud Converter - 22.11.2023";
21+
static string appname = "PointCloud Converter - 23.11.2023";
2222
static readonly string rootFolder = AppDomain.CurrentDomain.BaseDirectory;
2323

2424
// allow console output from WPF application https://stackoverflow.com/a/7559336/5452781
@@ -309,6 +309,17 @@ static void ParseFile(ImportSettings importSettings, int fileIndex)
309309
Console.ForegroundColor = ConsoleColor.Green;
310310
Console.WriteLine("Finished!");
311311
Console.ForegroundColor = ConsoleColor.White;
312+
mainWindowStatic.Dispatcher.Invoke(() =>
313+
{
314+
if ((bool)mainWindowStatic.chkOpenOutputFolder.IsChecked)
315+
{
316+
var dir = Path.GetDirectoryName(importSettings.outputFile);
317+
if (Directory.Exists(dir))
318+
{
319+
Process.Start(dir);
320+
}
321+
}
322+
});
312323
}
313324
} // ParseFile
314325

@@ -354,6 +365,7 @@ void StartProcess(bool doProcess = true)
354365
if ((bool)chkUseSkip.IsChecked) args.Add("-skip=" + txtSkipEvery.Text);
355366
if ((bool)chkUseKeep.IsChecked) args.Add("-keep=" + txtKeepEvery.Text);
356367
if ((bool)chkUseMaxFileCount.IsChecked) args.Add("-maxfiles=" + txtMaxFileCount.Text);
368+
if ((bool)chkManualOffset.IsChecked) args.Add("-offset=" + txtOffsetX.Text + "," + txtOffsetY.Text + "," + txtOffsetZ.Text);
357369
args.Add("-randomize=" + (bool)chkRandomize.IsChecked);
358370

359371
if (((bool)chkImportIntensity.IsChecked) && ((bool)chkCustomIntensityRange.IsChecked)) args.Add("-customintensityrange=True");
@@ -539,6 +551,11 @@ private void LoadSettings()
539551
txtMaxFileCount.Text = Properties.Settings.Default.maxFileCount.ToString();
540552
chkRandomize.IsChecked = Properties.Settings.Default.randomize;
541553
chkCustomIntensityRange.IsChecked = Properties.Settings.Default.customintensityrange;
554+
chkOpenOutputFolder.IsChecked = Properties.Settings.Default.openOutputFolder;
555+
chkManualOffset.IsChecked = Properties.Settings.Default.useManualOffset;
556+
txtOffsetX.Text = Properties.Settings.Default.manualOffsetX.ToString();
557+
txtOffsetY.Text = Properties.Settings.Default.manualOffsetY.ToString();
558+
txtOffsetZ.Text = Properties.Settings.Default.manualOffsetZ.ToString();
542559

543560
isInitialiazing = false;
544561
}
@@ -571,7 +588,14 @@ void SaveSettings()
571588
Properties.Settings.Default.maxFileCount = Tools.ParseInt(txtMaxFileCount.Text);
572589
Properties.Settings.Default.randomize = (bool)chkRandomize.IsChecked;
573590
Properties.Settings.Default.customintensityrange = (bool)chkCustomIntensityRange.IsChecked;
574-
Properties.Settings.Default.Save();
591+
Properties.Settings.Default.openOutputFolder = (bool)chkOpenOutputFolder.IsChecked;
592+
Properties.Settings.Default.useManualOffset = (bool)chkManualOffset.IsChecked;
593+
float.TryParse(txtOffsetX.Text, out float offsetX);
594+
Properties.Settings.Default.manualOffsetX = offsetX;
595+
float.TryParse(txtOffsetY.Text, out float offsetY);
596+
Properties.Settings.Default.manualOffsetY = offsetY;
597+
float.TryParse(txtOffsetZ.Text, out float offsetZ);
598+
Properties.Settings.Default.manualOffsetZ = offsetZ; Properties.Settings.Default.Save();
575599
}
576600

577601
private void btnGetParams_Click(object sender, RoutedEventArgs e)
@@ -667,5 +691,25 @@ private void btnHelp_Click(object sender, RoutedEventArgs e)
667691
{
668692
Process.Start("https://github.com/unitycoder/PointCloudConverter/wiki");
669693
}
694+
695+
private void chkAutoOffset_Checked(object sender, RoutedEventArgs e)
696+
{
697+
if (isInitialiazing == true) return;
698+
699+
if (chkAutoOffset.IsChecked == true && chkManualOffset.IsChecked == true)
700+
{
701+
chkManualOffset.IsChecked = false;
702+
}
703+
}
704+
705+
private void chkManualOffset_Checked(object sender, RoutedEventArgs e)
706+
{
707+
if (isInitialiazing == true) return;
708+
709+
if (chkManualOffset.IsChecked == true && chkAutoOffset.IsChecked == true)
710+
{
711+
chkAutoOffset.IsChecked = false;
712+
}
713+
}
670714
} // class
671715
} // namespace

0 commit comments

Comments
 (0)