Add optional helix pitch constraint.
parent
f6bb0a2d35
commit
06a1f8031d
|
@ -813,6 +813,12 @@ void Group::GenerateEquations(IdList<Equation,hEquation> *l) {
|
||||||
AddEq(l, (EC(axis.z))->Minus(EP(6)), 5);
|
AddEq(l, (EC(axis.z))->Minus(EP(6)), 5);
|
||||||
#undef EC
|
#undef EC
|
||||||
#undef EP
|
#undef EP
|
||||||
|
if(type == Type::HELIX) {
|
||||||
|
if(valB != 0.0) {
|
||||||
|
AddEq(l, Expr::From(h.param(7))->Times(Expr::From(PI))->
|
||||||
|
Minus(Expr::From(h.param(3))->Times(Expr::From(valB))), 6);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if(type == Type::EXTRUDE) {
|
} else if(type == Type::EXTRUDE) {
|
||||||
if(predef.entityB != Entity::FREE_IN_3D) {
|
if(predef.entityB != Entity::FREE_IN_3D) {
|
||||||
// The extrusion path is locked along a line, normal to the
|
// The extrusion path is locked along a line, normal to the
|
||||||
|
|
|
@ -299,6 +299,23 @@ void TextWindow::ScreenChangeGroupScale(int link, uint32_t v) {
|
||||||
SS.TW.edit.meaning = Edit::GROUP_SCALE;
|
SS.TW.edit.meaning = Edit::GROUP_SCALE;
|
||||||
SS.TW.edit.group.v = v;
|
SS.TW.edit.group.v = v;
|
||||||
}
|
}
|
||||||
|
void TextWindow::ScreenChangeHelixPitch(int link, uint32_t v) {
|
||||||
|
Group *g = SK.GetGroup(SS.TW.shown.group);
|
||||||
|
double pitch = g->valB/SS.MmPerUnit();
|
||||||
|
SS.TW.ShowEditControl(3, ssprintf("%.8f", pitch));
|
||||||
|
SS.TW.edit.meaning = Edit::HELIX_PITCH;
|
||||||
|
SS.TW.edit.group.v = v;
|
||||||
|
}
|
||||||
|
void TextWindow::ScreenChangePitchOption(int link, uint32_t v) {
|
||||||
|
Group *g = SK.GetGroup(SS.TW.shown.group);
|
||||||
|
if(g->valB == 0.0) {
|
||||||
|
g->valB = SK.GetParam(g->h.param(7))->val * PI /
|
||||||
|
(SK.GetParam(g->h.param(3))->val);
|
||||||
|
} else {
|
||||||
|
g->valB = 0.0;
|
||||||
|
}
|
||||||
|
SS.GW.Invalidate();
|
||||||
|
}
|
||||||
void TextWindow::ScreenDeleteGroup(int link, uint32_t v) {
|
void TextWindow::ScreenDeleteGroup(int link, uint32_t v) {
|
||||||
SS.UndoRemember();
|
SS.UndoRemember();
|
||||||
|
|
||||||
|
@ -398,6 +415,26 @@ void TextWindow::ShowGroupInfo() {
|
||||||
}
|
}
|
||||||
Printf(false, "");
|
Printf(false, "");
|
||||||
|
|
||||||
|
if(g->type == Group::Type::HELIX) {
|
||||||
|
Printf(false, "%Ft pitch - length per turn%E");
|
||||||
|
|
||||||
|
if (fabs(g->valB) != 0.0) {
|
||||||
|
Printf(false, " %Ba %# %Fl%Ll%f%D[change]%E",
|
||||||
|
g->valB / SS.MmPerUnit(),
|
||||||
|
&TextWindow::ScreenChangeHelixPitch, g->h.v);
|
||||||
|
} else {
|
||||||
|
Printf(false, " %Ba %# %E",
|
||||||
|
SK.GetParam(g->h.param(7))->val * PI /
|
||||||
|
( (SK.GetParam(g->h.param(3))->val) * SS.MmPerUnit() ),
|
||||||
|
&TextWindow::ScreenChangeHelixPitch, g->h.v);
|
||||||
|
}
|
||||||
|
Printf(false, " %Fd%f%LP%s fixed",
|
||||||
|
&TextWindow::ScreenChangePitchOption,
|
||||||
|
g->valB != 0 ? CHECK_TRUE : CHECK_FALSE);
|
||||||
|
|
||||||
|
Printf(false, ""); // blank line
|
||||||
|
}
|
||||||
|
|
||||||
if(g->type == Group::Type::EXTRUDE || g->type == Group::Type::LATHE ||
|
if(g->type == Group::Type::EXTRUDE || g->type == Group::Type::LATHE ||
|
||||||
g->type == Group::Type::REVOLVE || g->type == Group::Type::LINKED ||
|
g->type == Group::Type::REVOLVE || g->type == Group::Type::LINKED ||
|
||||||
g->type == Group::Type::HELIX) {
|
g->type == Group::Type::HELIX) {
|
||||||
|
@ -789,6 +826,15 @@ void TextWindow::EditControlDone(std::string s) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Edit::HELIX_PITCH: // stored in valB
|
||||||
|
if(Expr *e = Expr::From(s, /*popUpError=*/true)) {
|
||||||
|
double ev = e->Eval();
|
||||||
|
Group *g = SK.GetGroup(edit.group);
|
||||||
|
g->valB = ev * SS.MmPerUnit();
|
||||||
|
SS.MarkGroupDirty(g->h);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case Edit::GROUP_COLOR: {
|
case Edit::GROUP_COLOR: {
|
||||||
Vector rgb;
|
Vector rgb;
|
||||||
if(sscanf(s.c_str(), "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) {
|
if(sscanf(s.c_str(), "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) {
|
||||||
|
|
6
src/ui.h
6
src/ui.h
|
@ -342,7 +342,9 @@ public:
|
||||||
VIEW_PROJ_RIGHT = 702,
|
VIEW_PROJ_RIGHT = 702,
|
||||||
VIEW_PROJ_UP = 703,
|
VIEW_PROJ_UP = 703,
|
||||||
// For tangent arc
|
// For tangent arc
|
||||||
TANGENT_ARC_RADIUS = 800
|
TANGENT_ARC_RADIUS = 800,
|
||||||
|
// For helix pitch
|
||||||
|
HELIX_PITCH = 802
|
||||||
};
|
};
|
||||||
struct {
|
struct {
|
||||||
bool showAgain;
|
bool showAgain;
|
||||||
|
@ -473,6 +475,8 @@ public:
|
||||||
static void ScreenChangeExprA(int link, uint32_t v);
|
static void ScreenChangeExprA(int link, uint32_t v);
|
||||||
static void ScreenChangeGroupName(int link, uint32_t v);
|
static void ScreenChangeGroupName(int link, uint32_t v);
|
||||||
static void ScreenChangeGroupScale(int link, uint32_t v);
|
static void ScreenChangeGroupScale(int link, uint32_t v);
|
||||||
|
static void ScreenChangeHelixPitch(int link, uint32_t v);
|
||||||
|
static void ScreenChangePitchOption(int link, uint32_t v);
|
||||||
static void ScreenChangeLightDirection(int link, uint32_t v);
|
static void ScreenChangeLightDirection(int link, uint32_t v);
|
||||||
static void ScreenChangeLightIntensity(int link, uint32_t v);
|
static void ScreenChangeLightIntensity(int link, uint32_t v);
|
||||||
static void ScreenChangeLightAmbient(int link, uint32_t v);
|
static void ScreenChangeLightAmbient(int link, uint32_t v);
|
||||||
|
|
Loading…
Reference in New Issue