ME10マクロのページです
(作 図)

2000.07.02 更新



リスト


macro.lzh#(マクロファィルです。)

   1.描画・円と径 2000.07.02
     (0=半径 1=直径 をバラメータで指定してください。)
   2.コーナー処理時点の元線処理法の登録 2000.07.02
   3.面取り線の取り消しについて 2000.07.02
   4.面 取りの取り消し 2000.07.02
     (面取り線を除去する/しないをMa_corner_keep_memoryで指定してください。)
   5.連続平行線 2000.07.02
     (等間隔に平行線を引きま す。)
   6.線種コマンド 2001.07.22
   7.線色コマンド 2001.07.22
   8.描画・曲線・インボリュート 2002.04.26



描 画・円と径
  1999.03.20-1999.03.22}

DEFINE Ma_circle_draw
  PARAMETER Sitei                                 {0=半径 1=直径}


  LOCAL Iti
  LOCAL Atai


  READ '** 円の中心を指定して下さい。**' Iti
  LOOP
    IF (Sitei = 1)                                {直径の指定なら}
      READ '** 直径の値又は、円周上の位置を指定して下さい。 **' RUBBER_CIRCLE_CEN Iti Atai
      IF ((TYPE Atai) = PNT)                      {点ならそのまま}
        CIRCLE Iti Atai END
      ELSE
        CIRCLE Iti (Atai / 2) END
      END_IF
    ELSE                                          {半径の指定なら}
      READ '** 半径の値又は、円周上の位置を指定して下さい。 **' RUBBER_CIRCLE_CEN Iti Atai
      CIRCLE Iti Atai END
    END_IF
  END_LOOP
END_DEFINE



コー ナー処理時点の元線処理法の登録
  1999.01.24-1999.02.02

 custom.macの最後に次の2行を加えてください。


  KEEP_CORNER OFF                                 {コーナー処理の元線は残さない}
  LET Gl_corner_keep OFF
}

DEFINE Ma_corner_keep_memory


  IF (Gl_corner_keep = ON)
    KEEP_CORNER OFF
    LET Gl_corner_keep OFF
  ELSE_IF (Gl_corner_keep = OFF)
    KEEP_CORNER ON
    LET Gl_corner_keep ON
  END_IF
END_DEFINE



取り線の取り消しについて
 ツールボックス等に入れる場合の例
    Ma_corner_keep_memory {コーナー線の残す/残さないの処理}
    Ma_chamfer_out
 
 コマンド入力の場合
  残す/残さないを変更する場合
   Ma_corner_keep_memory
  Ma_chamfer_out



面取りの取り消し
  1999.02.11
  (線の存続は、元線処理の値による Gl_corner_keep)}

DEFINE Ma_chamfer_out
  LOCAL Point_temp
  LOCAL Line_pnt1
  LOCAL Line_pnt2
  LOCAL Kioku
  LOCAL Kazu


  LOOP
    LET Kazu 0
    LOOP
      READ PNT '** 面取り線を指示して下さい。 **' Point_temp
      INQ_ELEM Point_temp                         {要素情報の取得}
    EXIT_IF (((INQ 403) = LINE) AND ((INQ 14) = 1))   {線なら}
      IF (0Kazu < 10)
        LET Kazu (Kazu + 1)
      ELSE
        DISPLAY '** 面取り線が判りません。ご免! **'
      END_IF
    END_LOOP


    LET Line_pnt1 (INQ 101)                       {端の位置1}
    LET Line_pnt2 (INQ 102)                       {端の位置2}


    LET Kioku 0
{   要素の確定1}
    INQ_SELECTED_ELEM Line_pnt1
    IF ((INQ 14) = 2)                             {繋がっている要素があるなら}
      IF ((INQ 403) = LINE)                       {線なら}
        IF ((((INQ 101) = Line_pnt1) AND ((INQ 102) = Line_pnt2)) OR (((INQ 101) = Line_pnt2) AND ((INQ 102) = Line_pnt1)))   {面取り線なら}
          INQ_NEXT_ELEM
        END_IF
      END_IF
      LET Kioku (Kioku + 1)                       {カウントUP}
    END_IF
{   要素の確定2}
    INQ_SELECTED_ELEM Line_pnt2
    IF ((INQ 14) = 2)                             {繋がっている要素があるなら}
      IF ((INQ 403) = LINE)                       {線なら}
        IF ((((INQ 101) = Line_pnt1) AND ((INQ 102) = Line_pnt2)) OR (((INQ 101) = Line_pnt2) AND ((INQ 102) = Line_pnt1)))   {面取り線なら}
          INQ_NEXT_ELEM
        END_IF
      END_IF
      LET Kioku (Kioku + 1)                       {カウントUP}
    END_IF
  EXIT_IF (Kioku = 2)
    DISPLAY '** 母線が判りませんので取り消しが出来ません。ご免! **'
  END_LOOP


  IF (Gl_corner_keep = OFF)                       {面取り線を無くすなら}
    DELETE Point_temp END
  END_IF
  TRIM_TWO Line_pnt1 Line_pnt2 END
END_DEFINE



連続平行線
 2000.06.03}

DEFINE Ma_parallel_serial
  LOCAL Angle_unit                                {ラディアンへの変換値}


  LOCAL Point_temp                                {指定点}


  LOCAL Line_pnt1                                 {線の端位置1}
  LOCAL Line_pnt2                                 {線の端位置2}
  LOCAL Line_pntm                                 {線の中点位置}
  LOCAL Line_length                               {線長}
  LOCAL Line_angle                                {線の角度}
  LOCAL Line_angle_r                              {線の角度}


  LOCAL Interval                                  {平行の間隔}


  LOCAL Rudder_angle                              {側指示の方向角度}
  LOCAL Line_pnt_next                             {平行線の端位置}


  INQ_ENV 6
  LET Angle_unit (INQ 3)                          {ラディアンへの変換値}


{ 基準線}
  LOOP
    READ PNT '** 基準の線を指示して下さい。 **' Point_temp
    INQ_ELEM Point_temp                           {要素情報の取得}
  EXIT_IF ((INQ 403) = LINE)                      {線なら}
  END_LOOP
  LET Line_pnt1 (INQ 101)                         {端位置1}
  LET Line_pnt2 (INQ 102)                         {端位置2}
  LET Line_pntm ((Line_pnt1 + Line_pnt2) / 2)     {線の中点位置}
  LET Line_length (LEN (ABS (Line_pnt2 - Line_pnt1)))  {線長}
  LET Line_angle (ANG (Line_pnt2 - Line_pnt1))    {線の角度}
  LET Line_angle_r (Line_angle * Angle_unit)      {線の角度(ラディアン)}
  IF (Line_angle_r < 0)
    LET Line_angle_r (2 * PI + Line_angle_r)
  END_IF
  IF (Line_angle_r >= PI)
    LET Line_angle_r (Line_angle_r - PI)
  END_IF


  READ NUMBER '** 平行線の間隔を入力して下さい。 **' Interval


  LOOP
    READ PNT '** 平行線を描く側をクリックして下さい。(終了なら [ESC] キーを押して下さい。) **' Point_temp
    LET Rudder_angle ((ANG (Point_temp - Line_pntm)) * Angle_unit)
    IF (Rudder_angle < 0)
      LET Rudder_angle (2 * PI + Rudder_angle)
    END_IF


{   次の線の描画位置}
    IF ((Rudder_angle > Line_angle_r) AND (Rudder_angle < (Line_angle_r + PI)))  {領域1なら}
      LET Line_pnt_next (Line_pnt1 + (PNT_RA Interval ((Line_angle_r + PI / 2) / Angle_unit)))
    ELSE_IF ((Rudder_angle = Line_angle_r) AND (Rudder_angle = (Line_angle_r + PI)))  {同一線上なら無視}
    ELSE                                          {領域2なら}
      LET Line_pnt_next (Line_pnt1 + PNT_RA Interval ((Line_angle_r - PI / 2) / Angle_unit))
    END_IF


{   線引き}
    LINE PT_ANG_DIST Line_pnt_next Line_angle Line_length


{   データの更新}
    LET Line_pnt1 Line_pnt_next                   {端位置1}
    LET Line_pntm (Line_pnt1 + (PNT_RA (Line_length / 2) (Line_angle_r / Angle_unit))) {線の中点位置}
  END_LOOP


END_DEFINE



線種コマンド
 2001.05.27}

DEFINE Ma_line_Pattern
  PARAMETER Pattern


  IF ((Pattern = '11111111111111111111111111111111') OR (Pattern = 'SOLID'))  {実線}
    SOLID
  ELSE_IF ((Pattern = '11111111000000001111111100000000') OR (Pattern = 'DASHED'))  {破線}
    DASHED
  ELSE_IF ((Pattern = '11111111111000001111111111100000') OR (Pattern = 'LONG_DASHED')) {長破線}
    LONG_DASHED
  ELSE_IF ((Pattern = '11111111111110101111111111111010') OR (Pattern = 'DOT_CENTER'))  {一点鎖線}
    DOT_CENTER
  ELSE_IF ((Pattern = '11111111111101101111111111110110') OR (Pattern = 'DASH_CENTER')) {長一点鎖線}
    DASH_CENTER
  ELSE_IF ((Pattern = '11111111111010101111111111101010') OR (Pattern = 'PHANTOM')) {二点鎖線}
    PHANTOM
  ELSE_IF ((Pattern = '11111111110101101111111111010110') OR (Pattern = 'CENTER_DASH_DASH'))  {長二点鎖線}
    CENTER_DASH_DASH
  ELSE_IF ((Pattern = '10101010101010101010101010101010') OR (Pattern = 'DOTTED'))  {点線}
    DOTTED
  END_IF


END_DEFINE



線色コマンド
 2001.05.27}

DEFINE Ma_color_component
  PARAMETER Component


  IF (Component = 'BLACK')                        {黒}
    BLACK
  ELSE_IF (Component = 'RED')                     {赤}
    RED
  ELSE_IF (Component = 'GREEN')                   {緑}
    GREEN
  ELSE_IF (Component = 'YELLOW')                  {黄}
    YELLOW
  ELSE_IF (Component = 'BLUE')                    {青}
    BLUE
  ELSE_IF (Component = 'MAGENTA')                 {紫}
    MAGENTA
  ELSE_IF (Component = 'CYAN')                    {水}
    CYAN
  ELSE_IF (Component = 'WHITE')                   {白}
    WHITE
  ELSE
    RGB_COLOR Component
  END_IF


END_DEFINE



描画・曲線・イ ンボリュート 2002.04.24
}
DEFINE Ma_draw_curve_involute
{Ma_text_directionは、 2002.04.24 以降のバージョンを使用して下さい。}

  LOCAL Angle_unit                                {ラディアンへの変換値}
  LOCAL Ring_mark_point                           {開始の指示点}
  LOCAL Ring_center                               {基準円の中心点}
  LOCAL Ring_radius                               {基準円の半径}
  LOCAL Ring_start_angle                          {開始角}
  LOCAL Ring_start_point                          {開始点}
  LOCAL Direction_point                           {描画方向指示用点}
  LOCAL Direction_angle                           {描画方向指示用点}
  LOCAL Direction                                 {描画方向}
  LOCAL Quantity                                  {描画量}
  LOCAL Angle_step                                {増加角}
  LOCAL Step_number_max                           {描画数}
  LOCAL Step                                      {カウント}
  LOCAL Fraction                                  {余り}
  LOCAL Confirm                                   {同じか?}


  INQ_ENV 6
  LET Angle_unit (INQ 3)                          {ラディアンへの変換値}
  INQ_ENV 3


  LET Direction 0                                 {描画方向はまだ未定}
  LET Quantity 0                                  {ライン長の初期化}
  LET Angle_step (PI / 36)                        {増加角 5°(ラディアン)}


  LOOP
    IF (Direction = 0)                            {描画が初回}
      LOOP
        READ PNT '** インボリュート曲線を描く、基準円の位置を指示して下さい。**' Ring_mark_point
        INQ_ELEM Ring_mark_point
      EXIT_IF (((INQ 403) = CIRCLE) OR ((INQ 403) = ARC)) {円又は円弧なら}
      END_LOOP
      LET Ring_center (INQ 101)                   {基準円の中心点}
      LET Ring_radius (INQ 3)                     {基準円の半径}


      LET Ring_start_angle (ANG (Ring_mark_point - Ring_center))  {開始角}
      LET Ring_start_point ((PNT_RA Ring_radius Ring_start_angle) + Ring_center)  {開始点}


      READ PNT '** 曲線を描く方向を指示して下さい。**' RUBBER_LINE Ring_start_point Direction_point
      LET Direction_angle ((ANG (Direction_point - Ring_center)) - Ring_start_angle)  {判断用角度}
      LET Direction_angle (Direction_angle * Angle_unit)  {ラディアンへ変換}


      Ma_text_direction Direction_angle           {方向判断}
      IF (Gl_fruit <= 4)                          {左回りなら}
        LET Direction 1
      ELSE
        LET Direction -1
      END_IF


      READ NUMBER '** 描くラインの長さを入力して下さい。(基準円の一周を1とします。) **' DEFAULT 0.25 Quantity
      LET Step_number_max ((Quantity * 2 * PI) / Angle_step)  {補間点数}
      LET Fraction (FRACT Step_number_max)        {端数の確認}
      IF (Step_number_max < 3)                    {描画ライン長が短ければ}
        LET Step_number_max 3
        LET Angle_step ((Quantity * 2 * PI) / 3)
      END_IF


    ELSE
      LET Confirm 1
      LOOP
        READ PNT '** 同じ基準円上の、インボリュート曲線を描く位置を指示して下さい。[ESC]キーで終了 **' Ring_mark_point
        INQ_ELEM Ring_mark_point


        IF (((INQ 403) = CIRCLE) OR ((INQ 403) = ARC)) {円又は円弧なら}
          IF ((Ring_center = (INQ 101)) AND (Ring_radius = (INQ 3)))  {同じ円又は円弧なら}
            LET Confirm 0
          END_IF
        END_IF

      EXIT_IF (Confirm = 0)                       {同じ円又は円弧なら}
      END_LOOP


      LET Ring_start_angle (ANG (Ring_mark_point - Ring_center))  {開始角}
      LET Ring_start_point ((PNT_RA Ring_radius Ring_start_angle) + Ring_center)  {開始点}


    END_IF


    BSPLINE ORDER 4
    Ring_start_point                              {開始点と開始角}
    (Ring_center + (ROT (PNT_XY Ring_radius (Ring_radius * Angle_step / 10 * (- Direction)))((Ring_start_angle + (((Angle_step / 10) * Direction) / Angle_unit)))))  {1/10ピッチの点}


    LET Step 0                                    {カウント}
    REPEAT
      LET Step (Step + 1)
      (Ring_center + (ROT (PNT_XY Ring_radius (Ring_radius * Angle_step * Step * (- Direction)))((Ring_start_angle + (((Angle_step * Step) * Direction) / Angle_unit)))))
    UNTIL (Step >= Step_number_max)
    IF (Fraction > 0)                             {端数があるなら}
      (Ring_center + (ROT (PNT_XY Ring_radius (Ring_radius * Angle_step * Step_number_max * (- Direction)))((Ring_start_angle + (((Angle_step * Step_number_max) * Direction) / Angle_unit)))))
    END_IF
    END

  END_LOOP

END_DEFINE



気をつけて作りました、使用してのトラブルに責任は持てませんが、
自由にお使い下さい。(伏 見 表