DEFINE Inquire_bspline { B-Spline-Analy.INQ } LOCAL Spl_pnt Make1viewport Spline_tab WHILE (1) READ PNT 'Pick a point on the spline' Spl_pnt INQ_ELEM Spl_pnt END_WHILE end_define DEFINE Analyze_bspl { B-Spline-Analyse } LOCAL Zoom LET Zoom 4 SPLITTING OFF Analyzespline Zoom Make1viewport Analyze_bspline_tab WHITE end_define define Analyze_bspline_tab TRAP_ERROR Calc_table_height TABLE_LAYOUT 'Spline_analysis' 'BSpline_analyze_table' IF (NOT CHECK_ERROR) Colo1 Bcol0 WIDTH ((Window_x_size - Menu_width)/Font_width) HEIGHT Bspline_table_height FRAME_WIDTH 1 ROWS 6 SCROLL_BAR (Font_width*2) TITLE_LAYOUT (Headline_height+1) ' \ | ' (Headline_height+1) ' || || || \ || ' (Headline_height+1) ' | || || | || \ || ' END COLUMN_LAYOUT (Text_slot_height+1) ' | || || | || \ || ' END TABLE_TITLE 'Spline_analysis' IF (NOT Pe_look) Bcol0 Colo5 'SPLINE ANALYSIS (@s1 analyze points)' '' 1 1 ELSE Colo5 'SPLINE ANALYSIS (@s1 analyze points)' '' 1 1 END_IF Colo5 Bcol2 ' OFF' 'DELETE_TABLE "Spline_analysis"' 1 2 Colo5 ' Analyze Points' '' 2 1 Colo5 ' Tangents ' '' 2 3 Colo5 ' Normal vectors' '' 2 5 Colo5 ' Curvatures' '' 2 7 Colo5 ' 1 ipol pnt' '' 2 9 Colo5 ' 0 calc pnt' '' 3 11 Colo5 ' x' '' 3 1 Colo5 ' y' '' 3 2 Colo5 ' angle' '' 3 4 Colo5 ' x' '' 3 6 Colo5 ' y' '' 3 7 Colo5 ' 1/rad' '' 3 9 END TABLE_COLUMN 'Spline_analysis' COLUMN 1 Colo5 FORMAT '.23' CENTER '(PNT_XY @v1 @v2)' 1 COLUMN 2 Colo5 FORMAT '.23' CENTER '(PNT_XY @v1 @v2)' 2 COLUMN 3 Bcol0 Bcol0 '' COLUMN 4 Colo5 FORMAT '1.23' CENTER '@v3' 3 COLUMN 5 Bcol0 Bcol0 '' COLUMN 6 Colo5 FORMAT '.23' CENTER '(PNT_XY @v5 @v6)' 5 COLUMN 7 Colo5 FORMAT '.23' CENTER '(PNT_XY @v5 @v6)' 6 COLUMN 8 Bcol0 Bcol0 '' COLUMN 9 Colo5 FORMAT '.23' CENTER '@v7' 7 COLUMN 10 Bcol0 Bcol0 '' COLUMN 11 Colo5 CENTER '@v8' 8 END SHOW_TABLE ON 'Spline_analysis' END MOVE_TABLE 'Spline_analysis' UPPER LEFT END END_IF end_define define Calc_table_height LOCAL Cv INQ_ENV 10 IF ((INQ 3)=0) INQ_ENV 1 LET Cv (INQ 1) CURRENT_VIEWPORT 4 INQ_ENV 1 LET Bspline_table_height (((Y_OF (INQ 102)) - (Y_OF (INQ 101)))/ Font_height) CURRENT_VIEWPORT Cv ELSE LET Bspline_table_height 10 END_IF end_define define Spline_tab TRAP_ERROR Calc_table_height TABLE_LAYOUT 'Spline_overview' 'BSpline_basic_table' IF (NOT CHECK_ERROR) Colo1 Bcol0 WIDTH ((Window_x_size - Menu_width)/Font_width) HEIGHT Bspline_table_height FRAME_WIDTH 1 ROWS 5 SCROLL_BAR (Font_width*2) TITLE_LAYOUT (Headline_height+1) ' | | | ' (Headline_height+1) ' || || \ ' (Headline_height+1) ' | || | || \ ' END COLUMN_LAYOUT (Text_slot_height+1) ' | || | || \ ' END TABLE_TITLE 'Spline_overview' IF (NOT Pe_look) Bcol0 Colo5 'SPLINE VALUES ' '' 1 1 ELSE Colo5 'SPLINE VALUES ' '' 1 1 END_IF Colo5 'Order: @s1' '' 1 2 Colo5 'Length: @s2' '' 1 3 Colo5 Bcol2 ' OFF' 'DELETE_TABLE "Spline_overview"' 1 4 Colo5 ' Contrl Points (# = @s3)' '' 2 1 Colo5 ' Intpol Points (# = @s4)' '' 2 3 Colo5 ' Knot vector (# = @s5)' '' 2 5 Colo5 ' x' '' 3 1 Colo5 ' y' '' 3 2 Colo5 ' x' '' 3 4 Colo5 ' y' '' 3 5 Colo5 '' '' 3 7 END TABLE_COLUMN 'Spline_overview' COLUMN 1 Colo5 FORMAT '1.23' CENTER '(PNT_XY @v1 @v2)' 1 COLUMN 2 Colo5 FORMAT '1.23' CENTER '(PNT_XY @v1 @v2)' 2 COLUMN 3 Bcol0 Bcol0 '' COLUMN 4 Colo5 FORMAT '1.23' CENTER '(PNT_XY @v3 @v4)' 3 COLUMN 5 Colo5 FORMAT '1.23' CENTER '(PNT_XY @v3 @v4)' 4 COLUMN 6 Bcol0 Bcol0 '' COLUMN 7 Colo5 FORMAT '1.23' CENTER '@v5' 5 END SHOW_TABLE ON 'Spline_overview' END MOVE_TABLE 'Spline_overview' UPPER LEFT END END_IF end_define define Analyzespline PARAMETER Zoom LOCAL N LOCAL I LOCAL P1 LOCAL P2 LOCAL P3 LOCAL P4 LOCAL Pos LOCAL Tang LOCAL Norm LOCAL Acc LOCAL Curv LOCAL Keep LOCAL Eps LOCAL Tabname LOCAL Closed LOCAL Whole_spline LOCAL Consider_ipoints LOCAL Point_on_spline LOCAL Current_catch_range LET Tabname 'BSpline_analyze_table' LET Eps 1e-09 INQ_ENV 3 LET Current_catch_range (INQ 3) READ PNT 'Pick a spline to analyze' Point_on_spline READ NUMBER 'Analyze whole spline (1=yes, 0=no)' Whole_spline IF (NOT Whole_spline) READ PNT 'Pick a point where to start the analysis' P1 READ PNT 'Pick a point where to end the analysis' P2 IF (P1=P2) LET Whole_spline 1 END_IF INQ_ELEM Point_on_spline LET Closed (READ_LTAB 'BSpline_basic_table' TITLE 6) IF (Closed=-1) INQ_ELEM Point_on_spline IF (((INQ 101)=(INQ 102)) AND (NOT (P1=P2))) READ PNT 'Identify the part of the spline you want to analyze' P4 ELSE LET Closed 0 END_IF END_IF END_IF READ NUMBER 'Enter the accuracy' Acc READ NUMBER 'Consider interpolation points (1=yes, 0=no)' Consider_ipoints IF (Consider_ipoints=1) define Cmd_tail KEEP_POINTS end_define ELSE define Cmd_tail END end_define END_IF IF (Whole_spline) ANALYZE_BSPLINE Point_on_spline Acc Cmd_tail ELSE IF (Closed=-1) ANALYZE_BSPLINE Point_on_spline P1 P2 P4 Acc Cmd_tail ELSE ANALYZE_BSPLINE Point_on_spline P1 P2 Acc Cmd_tail END_IF END_IF LET I 1 LET N (READ_LTAB Tabname TITLE 1) CATCH NO_VIEWPORT_RANGE 0 WHILE (I<=N) LET Pos (PNT_XY (READ_LTAB Tabname I 1) (READ_LTAB Tabname I 2)) LET Tang (READ_LTAB Tabname I 3) LET Norm (PNT_XY (READ_LTAB Tabname I 5) (READ_LTAB Tabname I 6)) LET Curv (READ_LTAB Tabname I 7) LET Curv (Curv*20) LET Keep (READ_LTAB Tabname I 8) LET Norm (Curv*Zoom*Norm) LET Tang (Zoom*Tang) LET P3 (Pos+Norm) IF (Keep=1) MAGENTA ELSE GREEN END_IF IF ((ABS (LEN (Pos - P3)))>Eps) LINE Pos P3 END END_IF LET I (I+1) END_WHILE CATCH NO_VIEWPORT_RANGE Current_catch_range end_define define Make1viewport INQ_ENV 10 IF ((INQ 3)=0) Four_viewports ELSE DELETE_VIEWPORT ALL LET X_length (Window_x_size - Menu_width) LET Window_1_ll Graphic_area_low_left LET Window_1_ur (PNT_XY X_length ((Y_OF Graphic_area_up_right) - 3*( Headline_height+1) - 5*(Text_slot_height+1) - 2*Headline_height)) CREATE_VIEWPORT Window_1_ll Window_1_ur WINDOW FIT END_IF end_define