Skip to content

Commit 2e882a5

Browse files
authored
Merge pull request #65 from klaussilveira/bug/6694
Added trim tool
2 parents b26970a + a494eed commit 2e882a5

12 files changed

Lines changed: 722 additions & 0 deletions

File tree

install/menu.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@
233233
<menuItem name="texturelock" caption="Texture lock" command="TogTexLock" />
234234
<menuSeparator />
235235
<menuItem name="createdecals" caption="Create Decal Patches" command="CreateDecalsForFaces" icon="create_decals.png" />
236+
<menuItem name="createtrim" caption="Create Trim..." command="CreateTrimDialog" />
236237
<menuItem name="makevisportal" caption="Make Visportal" command="MakeVisportal" icon="make_visportal.png" />
237238

238239
<menuSeparator />

radiant/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ add_executable(darkradiant
3030
ui/aas/RenderableAasFile.cpp
3131
ui/about/AboutDialog.cpp
3232
ui/array/ArrayDialog.cpp
33+
ui/brush/CreateTrimDialog.cpp
3334
ui/brush/FindBrush.cpp
3435
ui/brush/QuerySidesDialog.cpp
3536
ui/commandlist/CommandList.cpp

radiant/ui/UserInterfaceModule.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
#include "ui/terrain/TerrainGeneratorDialog.h"
6767
#include "ui/selectionset/SelectionSetToolmenu.h"
6868
#include "ui/brush/QuerySidesDialog.h"
69+
#include "ui/brush/CreateTrimDialog.h"
6970
#include "ui/brush/FindBrush.h"
7071
#include "ui/array/ArrayDialog.h"
7172
#include "ui/mousetool/RegistrationHelper.h"
@@ -543,6 +544,7 @@ void UserInterfaceModule::registerUICommands()
543544
GlobalCommandSystem().addCommand("ExportCollisionModelDialog", ExportCollisionModelDialog::Show);
544545
GlobalCommandSystem().addWithCheck("QueryBrushPrefabSidesDialog", QuerySidesDialog::Show,
545546
selection::pred::haveBrush, {cmd::ARGTYPE_INT});
547+
GlobalCommandSystem().addCommand("CreateTrimDialog", CreateTrimDialog::CreateTrimCmd);
546548

547549
// Set up the CloneSelection command to react on key up events only
548550
GlobalEventManager().addCommand("CloneSelection", "CloneSelection", true); // react on keyUp
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#include "CreateTrimDialog.h"
2+
3+
#include "i18n.h"
4+
#include "icommandsystem.h"
5+
#include "iselection.h"
6+
#include "string/convert.h"
7+
#include "selectionlib.h"
8+
#include "wxutil/dialog/MessageBox.h"
9+
10+
namespace
11+
{
12+
const char* WINDOW_TITLE = N_("Create Trim");
13+
const char* LABEL_HEIGHT = N_("Trim Height:");
14+
const char* LABEL_DEPTH = N_("Trim Depth:");
15+
const char* LABEL_FIT_TO = N_("Fit To:");
16+
const char* LABEL_MITERED = N_("45-degree mitered ends");
17+
18+
const double DEFAULT_HEIGHT = 16;
19+
const double DEFAULT_DEPTH = 1;
20+
21+
const char* FIT_BOTTOM = N_("Bottom");
22+
const char* FIT_TOP = N_("Top");
23+
const char* FIT_LEFT = N_("Left");
24+
const char* FIT_RIGHT = N_("Right");
25+
}
26+
27+
namespace ui {
28+
29+
CreateTrimDialog::CreateTrimDialog() :
30+
wxutil::Dialog(_(WINDOW_TITLE))
31+
{
32+
_heightHandle = addSpinButton(_(LABEL_HEIGHT), 1, 4096, 1, 0);
33+
_depthHandle = addSpinButton(_(LABEL_DEPTH), 1, 4096, 1, 0);
34+
35+
ui::IDialog::ComboBoxOptions fitOptions;
36+
fitOptions.push_back(_(FIT_BOTTOM));
37+
fitOptions.push_back(_(FIT_TOP));
38+
fitOptions.push_back(_(FIT_LEFT));
39+
fitOptions.push_back(_(FIT_RIGHT));
40+
_fitToHandle = addComboBox(_(LABEL_FIT_TO), fitOptions);
41+
42+
_miteredHandle = addCheckbox(_(LABEL_MITERED));
43+
44+
setElementValue(_heightHandle, string::to_string(DEFAULT_HEIGHT));
45+
setElementValue(_depthHandle, string::to_string(DEFAULT_DEPTH));
46+
setElementValue(_fitToHandle, _(FIT_BOTTOM));
47+
setElementValue(_miteredHandle, "0");
48+
}
49+
50+
bool CreateTrimDialog::QueryTrimParams(TrimParams& params)
51+
{
52+
auto* dialog = new CreateTrimDialog;
53+
54+
IDialog::Result result = dialog->run();
55+
56+
if (result == IDialog::RESULT_OK)
57+
{
58+
params.height = string::convert<double>(dialog->getElementValue(dialog->_heightHandle));
59+
params.depth = string::convert<double>(dialog->getElementValue(dialog->_depthHandle));
60+
61+
std::string fitToStr = dialog->getElementValue(dialog->_fitToHandle);
62+
63+
if (fitToStr == _(FIT_TOP))
64+
params.fitTo = FitTo::Top;
65+
else if (fitToStr == _(FIT_LEFT))
66+
params.fitTo = FitTo::Left;
67+
else if (fitToStr == _(FIT_RIGHT))
68+
params.fitTo = FitTo::Right;
69+
else
70+
params.fitTo = FitTo::Bottom;
71+
72+
params.mitered = (dialog->getElementValue(dialog->_miteredHandle) == "1");
73+
74+
return true;
75+
}
76+
77+
return false;
78+
}
79+
80+
void CreateTrimDialog::CreateTrimCmd(const cmd::ArgumentList& args)
81+
{
82+
if (GlobalSelectionSystem().getSelectionInfo().componentCount == 0)
83+
{
84+
wxutil::Messagebox::ShowError(_("Cannot create trim. No faces selected."));
85+
return;
86+
}
87+
88+
TrimParams params;
89+
90+
if (QueryTrimParams(params))
91+
{
92+
cmd::ArgumentList trimArgs;
93+
trimArgs.push_back(params.height);
94+
trimArgs.push_back(params.depth);
95+
trimArgs.push_back(static_cast<int>(params.fitTo));
96+
trimArgs.push_back(params.mitered ? 1 : 0);
97+
98+
GlobalCommandSystem().executeCommand("CreateTrimForFaces", trimArgs);
99+
}
100+
}
101+
102+
} // namespace
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#pragma once
2+
3+
#include "icommandsystem.h"
4+
#include "wxutil/dialog/Dialog.h"
5+
6+
namespace ui
7+
{
8+
9+
class CreateTrimDialog :
10+
public wxutil::Dialog
11+
{
12+
public:
13+
enum class FitTo { Bottom, Top, Left, Right };
14+
15+
struct TrimParams
16+
{
17+
double height;
18+
double depth;
19+
FitTo fitTo;
20+
bool mitered;
21+
};
22+
23+
private:
24+
Handle _heightHandle;
25+
Handle _depthHandle;
26+
Handle _fitToHandle;
27+
Handle _miteredHandle;
28+
29+
public:
30+
CreateTrimDialog();
31+
32+
static bool QueryTrimParams(TrimParams& params);
33+
34+
static void CreateTrimCmd(const cmd::ArgumentList& args);
35+
};
36+
37+
} // namespace ui

radiantcore/selection/algorithm/General.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,12 @@ void registerCommands()
10151015
[] { return !FaceInstance::Selection().empty(); }
10161016
);
10171017

1018+
GlobalCommandSystem().addWithCheck(
1019+
"CreateTrimForFaces", createTrimForSelectedFaces,
1020+
[] { return !FaceInstance::Selection().empty(); },
1021+
{ cmd::ARGTYPE_DOUBLE, cmd::ARGTYPE_DOUBLE, cmd::ARGTYPE_INT, cmd::ARGTYPE_INT }
1022+
);
1023+
10181024
GlobalCommandSystem().addCommand("Copy", clipboard::copy);
10191025
GlobalCommandSystem().addCommand("Cut", clipboard::cut);
10201026
GlobalCommandSystem().addCommand("Paste", clipboard::paste);

0 commit comments

Comments
 (0)