! ***************** lofted_sur **************************** ! ! +++ ! SUR_CONIC sample ! ! Start with as few limit/tangent curves as possible. Add curves and/or ! segments only as required to get the required shape and quality of the ! surface ! ! Use CUR_CONIC curves as limit and tangent curves. ! The CUR_SPLINE curve type easily oscillates. The spline curves ! need many, very well defined points in order to get a high ! quality curve. Such well-defined points cannot be defined ! manually (inteactively). Spline smoothing functions are ! needed in order to be able to use splines as input to ! surfaces. ! ! Generally favor use of P-value curves instead of ! midpoint curves to control the surface, since they are easier to alter when ! the shape and quality of the surface requires adjustment. ! ! It is recommended that the surface is defined in millimeters ! and the geometry calculation tolerances are trimmed for objects ! that are about a meter or two meters, i.e. point coordinates ! around 1000.0. ! ! ! 2006-03-02 John Hughes and Gunnar Liden ! ! --- !************************************************************ !sdesce SUR_CONIC sample !sdescs SUR_CONIC exempel GLOBAL GEOMETRY MODULE lofted_sur( INT graphic:=1 > "Graphic 0: Nothing 1: Surface 2: All"); ! Internal variables ! BLANK values for graphic INT bval_sur; INT bval_csy; INT bval_cur; INT bval_poi; REF int_id; ! Section curves REF sect_1_id; REF sect_2_id; REF sect_3_id; REF spine_id; REF lim_1_id; REF lim_2_id; REF tang_1_id; REF tang_2_id; REF pcur_id; VECTOR poi_l; BEGINMODULE ! +++ ! Initializations and check of input data ! --- IF graphic = 0 THEN bval_sur := 1; bval_csy := 1; bval_cur := 1; bval_poi := 1; ELIF graphic = 1 THEN bval_sur := 0; bval_csy := 1; bval_cur := 1; bval_poi := 1; ELIF graphic = 2 THEN bval_sur := 0; bval_csy := 0; bval_cur := 0; bval_poi := 0; ELSE EXIT("lofted_sur: graphic not 0, 1 or 2"); ENDIF; ! Initializations of local variables in order avoid crashes ! using unitialized variables int_id := #0; sect_1_id := #0; sect_2_id := #0; sect_3_id := #0; spine_id := #0; lim_1_id := #0; lim_2_id := #0; tang_1_id := #0; tang_2_id := #0; pcur_id := #0; ! +++ ! Generate local coord. systems in the GLOBAL (inherited) coord. system ! for the definition of section curves and the spine ! --- csys_1p(#3,"Stern", vec(0, 20, 0), 0.0, 0.0, 0.0:BLANK=bval_csy); csys_1p(#4,"Bow", vec(0, 20, 192), 0.0, 0.0, 0.0:BLANK=bval_csy); csys_1p(#5,"Near-Stern", vec(0, 20, 12), 0.0, 0.0, 0.0:BLANK=bval_csy); csys_1p(#6,"Near-Bow", vec(0, 20, 180), 0.0, 0.0, 0.0:BLANK=bval_csy); csys_1p(#7,"Mid-Ship", vec(0, 20, 96), 0.0, 0.0, 0.0:BLANK=bval_csy); ! +++ ! Create the spine curve. It is a straight line but sur_conic does ! not (yet) accept this type as input. ! --- ! Change to "Near-stern" coordinate system. mode_local(#5); cur_conic(#9,"FREE", vec(0, 0, 0), vec(0, 0, 168), 0.5, vec(0, 0, 168), vec(0, 0, 0):BLANK=bval_cur); spine_id := #9; ! +++ ! Create the points that will be used for the definition of the limit curves. ! --- ! Change to "Near-stern" coordinate system. mode_local(#5); ! Define points for "Near-stern" section curve poi_free(#10,vec(4.083581517166, 21.720943070165, 0.0):BLANK=bval_poi); poi_free(#11,vec(0.23613936746047, 0.25846526576975, 0.0):BLANK=bval_poi); poi_free(#12,vec(2.6216848117135, 8.3495976410652, 0.0):BLANK=bval_poi); poi_free(#13,vec(3.620285230238, 14.552799128792, 0.0):BLANK=bval_poi); poi_free(#14,vec(1.623084393189, 4.3040314534175, 0.0):BLANK=bval_poi); ! Change to "Mid-ship" coordinate system. mode_local(#7); ! Define points for "Mid-ship" section curve poi_free(#17,vec(21.376287262411, 12.086888404603, 0.0):BLANK=bval_poi); poi_free(#22,vec(9.7394376103902, 3.0714197177825, 0.0):BLANK=bval_poi); poi_free(#23,vec(17.570912343131, 6.824288804571, 0.0):BLANK=bval_poi); poi_free(#24,vec(4.5930399288751, 1.1677904708607, 0.0):BLANK=bval_poi); poi_free(#25,vec(13.93487050293, 5.0294383717591, 0.0):BLANK=bval_poi); poi_free(#26,vec(19.752537447251, 9.3262015290966, 0.0):BLANK=bval_poi); ! Change to "Near-bow" coordinate system. mode_local(#6); ! Define points for "Near-bow" section curve poi_free(#27,vec(0.17385061540016, 0.6782858073666, 0.0):BLANK=bval_poi); poi_free(#28,vec(1.4045109305451, 4.6487125223747, 0.0):BLANK=bval_poi); poi_free(#29,vec(2.2995366142868, 8.6735286444378, 0.0):BLANK=bval_poi); poi_free(#31,vec(3.2505014032625, 14.819531641642, 0.0):BLANK=bval_poi); poi_free(#32,vec(3.7539533503672, 18.409232507266, 0.0):BLANK=bval_poi); ! Change back to the GLOBAL coordinate system mode_global(); ! +++ ! Create the section curves Near-stern, Mid-ship and Near-bow ! --- cur_conic(#33,"FREE", on(#11), on(#14), on(#12), on(#13), on(#10) :BLANK=bval_cur,PEN=2); sect_1_id := #33; cur_conic(#34,"FREE", on(#27), on(#28), on(#29), on(#31), on(#32) :BLANK=bval_cur,PEN=2); sect_1_id := #34; cur_conic(#35,"FREE", on(#24), on(#22), on(#25), on(#26), on(#17) :BLANK=bval_cur,PEN=2); sect_1_id := #35; ! +++ ! Define tangent definition points for the limit curves ! --- POI_FREE(#201, VEC( 0.3916,20.2883, 13.9937):BLANK=bval_poi); POI_FREE(#202, VEC( 4.5923,21.1728, 98.0000):BLANK=bval_poi); POI_FREE(#203, VEC( 0.0169,20.6584,181.9937):BLANK=bval_poi); POI_FREE(#204, VEC( 1.9111,24.2585, 13.9786):BLANK=bval_poi); POI_FREE(#205, VEC( 9.7368,23.0755, 98.0000):BLANK=bval_poi); POI_FREE(#206, VEC( 1.1114,24.7024,181.9777):BLANK=bval_poi); POI_FREE(#207, VEC( 4.1736,34.3727, 13.9135):BLANK=bval_poi); POI_FREE(#208, VEC(19.7481,29.3294, 98.0000):BLANK=bval_poi); POI_FREE(#209, VEC( 2.9700,34.9125,180.9554):BLANK=bval_poi); POI_FREE(#210, VEC( 4.6684,41.4148, 13.8879):BLANK=bval_poi); POI_FREE(#211, VEC(21.3724,32.0475, 97.9996):BLANK=bval_poi); POI_FREE(#212, VEC( 3.1594,38.6419,181.8953):BLANK=bval_poi); ! +++ ! Create limit curves and tangent curves for the lofted surface ! The type of curve used for these curves are cur_conic curves ! ! --- ! Define 1st limit curve cur_conic(#36,"FREE", on(#11), on(#201), 0.5, on(#24), on(#202), 0.5, on(#27), on(#203) :BLANK=bval_cur,PEN=2); lim_1_id := #36; ! Define 1st tanget curve cur_conic(#37,"FREE", on(#14), on(#204), 0.5, on(#22), on(#205), 0.5, on(#28), on(#206) :BLANK=bval_cur,PEN=2); tang_1_id := #37; ! Define 2nd limit curve cur_conic(#40,"FREE", on(#13), on(#207), 0.5, on(#26), on(#208), 0.5, on(#31), on(#209) :BLANK=bval_cur,PEN=2); lim_2_id := #40; ! Define 2nd Tangent curve cur_conic(#41,"FREE", on(#10), on(#210), 0.5, on(#17), on(#211), 0.5, on(#32), on(#212) :BLANK=bval_cur,PEN=2); tang_2_id := #41; ! +++ ! Define P-curve. The curve must be defined in the BASIC coordinate system ! --- mode_basic(); cur_conic(#44,"FREE", vec( 0, 0.55, 0), vec(180, 0.45, 0), 0.5, vec(180, 0.45, 0), vec( 0, 0.55, 0):BLANK=1); mode_global(); pcur_id := #44; ! +++ ! Define the lofted surface ! --- sur_conic( #1, #9, lim_1_id, tang_1_id, "P", pcur_id, lim_2_id, tang_2_id :PEN=3, BLANK=bval_sur); ENDMODULE