@@ -299,6 +299,23 @@ void TextWindow::ScreenChangeGroupScale(int link, uint32_t v) {
299299 SS.TW .edit .meaning = Edit::GROUP_SCALE;
300300 SS.TW .edit .group .v = v;
301301}
302+ void TextWindow::ScreenChangeHelixPitch (int link, uint32_t v) {
303+ Group *g = SK.GetGroup (SS.TW .shown .group );
304+ double pitch = g->valB /SS.MmPerUnit ();
305+ SS.TW .ShowEditControl (3 , ssprintf (" %.8f" , pitch));
306+ SS.TW .edit .meaning = Edit::HELIX_PITCH;
307+ SS.TW .edit .group .v = v;
308+ }
309+ void TextWindow::ScreenChangePitchOption (int link, uint32_t v) {
310+ Group *g = SK.GetGroup (SS.TW .shown .group );
311+ if (g->valB == 0.0 ) {
312+ g->valB = SK.GetParam (g->h .param (7 ))->val * PI /
313+ (SK.GetParam (g->h .param (3 ))->val );
314+ } else {
315+ g->valB = 0.0 ;
316+ }
317+ SS.GW .Invalidate ();
318+ }
302319void TextWindow::ScreenDeleteGroup (int link, uint32_t v) {
303320 SS.UndoRemember ();
304321
@@ -398,6 +415,26 @@ void TextWindow::ShowGroupInfo() {
398415 }
399416 Printf (false , " " );
400417
418+ if (g->type == Group::Type::HELIX) {
419+ Printf (false , " %Ft pitch - length per turn%E" );
420+
421+ if (fabs (g->valB ) != 0.0 ) {
422+ Printf (false , " %Ba %# %Fl%Ll%f%D[change]%E" ,
423+ g->valB / SS.MmPerUnit (),
424+ &TextWindow::ScreenChangeHelixPitch, g->h .v );
425+ } else {
426+ Printf (false , " %Ba %# %E" ,
427+ SK.GetParam (g->h .param (7 ))->val * PI /
428+ ( (SK.GetParam (g->h .param (3 ))->val ) * SS.MmPerUnit () ),
429+ &TextWindow::ScreenChangeHelixPitch, g->h .v );
430+ }
431+ Printf (false , " %Fd%f%LP%s fixed" ,
432+ &TextWindow::ScreenChangePitchOption,
433+ g->valB != 0 ? CHECK_TRUE : CHECK_FALSE);
434+
435+ Printf (false , " " ); // blank line
436+ }
437+
401438 if (g->type == Group::Type::EXTRUDE || g->type == Group::Type::LATHE ||
402439 g->type == Group::Type::REVOLVE || g->type == Group::Type::LINKED ||
403440 g->type == Group::Type::HELIX) {
@@ -789,6 +826,15 @@ void TextWindow::EditControlDone(std::string s) {
789826 }
790827 break ;
791828
829+ case Edit::HELIX_PITCH: // stored in valB
830+ if (Expr *e = Expr::From (s, /* popUpError=*/ true )) {
831+ double ev = e->Eval ();
832+ Group *g = SK.GetGroup (edit.group );
833+ g->valB = ev * SS.MmPerUnit ();
834+ SS.MarkGroupDirty (g->h );
835+ }
836+ break ;
837+
792838 case Edit::GROUP_COLOR: {
793839 Vector rgb;
794840 if (sscanf (s.c_str (), " %lf, %lf, %lf" , &rgb.x , &rgb.y , &rgb.z )==3 ) {
0 commit comments