ME10マクロのページです
(文 字)

2002.03.09 更新 



リスト


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

   1.要素の指定
   2.文字・整列・列 2000.04.22
   3.文字・整列・行 2000.04.22
   4.ライン入力・既存文字利用2000.05.21
   5.文字列の連結 2000.05.21
      (パラメータが必要です。引用する文字列を [0]で複写連結/[1]で移動連結します。)
   6.規定値ライン 2000.07.02
   7.黄色線 2000.07.02  
   8.水 平アンダーライン2000.07.02
   9.引き出し線の描画 2000.07.02
   10.水平引き出し線 2000.07.02
 ** ファイルデータの書き込み **
   11.方向判断2 002.04.24 2002.03.022
   12.テキスト・ファイルデータの1列書き込み 2002.03.02
   13.ファイルデータ利用の書き込みの使い方2002.03.02
   14.テキスト・ファイルデータの書き込み2002.03.09 2002.03.02
 ** 表ファイルデータの書き込み **
   15.表への文字列の書き込みの使い方2002.03.09
      (図内のパーツリストの文字データを表計算ソフトで作成し、書き込むことが出来ます。)
   16.普通列データの取得2002.03.09
   17.コンマ内包データの取得2002.03.09
   18.残りのデータを得る2002.03.09
   19.データの切り出し 2>002.03.09
   20.テキスト・CSVファイルデータの書き込み 2002.03.09



文字・要素の指定
 1999.06.06}

DEFINE Ma_text_designate
  LOCAL Point_temp


  LOOP
    READ PNT '** テキストを指示して下さい。 **' Point_temp
    INQ_ELEM Point_temp                           {要素情報の取得}
  EXIT_IF ((INQ 403) = TEXT)
  END_LOOP


END_DEFINE



文字・整列・列
 1999.05.09-1999.09.27}

DEFINE Ma_text_row_up
  LOCAL Point_00                                  {移動する位置}
  LOCAL Point_01                                  {BOX角位置}
  LOCAL Point_02                                  {BOX角位置}
  LOCAL Point_03                                  {揃える位置}
  LOCAL Point_03X                                 {揃える位置 X}
  LOCAL KAZ                                       {要素の数}


  LOOP
    LOOP
      READ PNT '** 位置を揃える、文字列を箱指定して下さい。[ESC]キーで終了 **' Point_01
      READ PNT '** 位置を揃える、文字列を箱指定して下さい。[ESC]キーで終了 **' RUBBER_BOX Point_01 Point_02

      INQ_SELECTED_ELEM BOX Point_01 Point_02
      LET KAZ (INQ 14)                            {要素の数}
      LOOP
      EXIT_IF (((INQ 403) = TEXT) OR (KAZ = 0))
        LET KAZ (KAZ - 1)
        INQ_NEXT_ELEM                             {次の要素}
      END_LOOP

    EXIT_IF ((INQ 403) = TEXT)                    {テキストが有るなら次へ}
    END_LOOP


    READ PNT '** 揃える鉛直位置を指定して下さい。(文字の原点を基準に揃えます。)[ESC]キーで終了 **' Point_03
    LET Point_03X (X_OF Point_03)

    INQ_SELECTED_ELEM BOX Point_01 Point_02
    LET KAZ (INQ 14)                              {要素の数}
    LOOP
      IF ((INQ 403) = TEXT)
        LET Point_00 (PNT_XY Point_03X (Y_OF (INQ 101)))  {移動位置}
        MODIFY (INQ 101) DEL_OLD MOVE TWO_PTS (INQ 101) Point_00
      END_IF

      LET KAZ (KAZ - 1)
    EXIT_IF (KAZ = 0)
      INQ_NEXT_ELEM                               {次の要素}
    END_LOOP

  END_LOOP


END_DEFINE



文字・整列・行
 1999.05.09-1999.09.27}

DEFINE Ma_text_rank_up
  LOCAL Point_00                                  {移動する位置}
  LOCAL Point_01                                  {BOX角位置}
  LOCAL Point_02                                  {BOX角位置}
  LOCAL Point_03                                  {揃える位置}
  LOCAL Point_03Y                                 {揃える位置 Y}
  LOCAL KAZ                                       {要素の数}


  LOOP
    LOOP
      READ PNT '** 位置を揃える、文字列を箱指定して下さい。[ESC]キーで終了 **' Point_01
      READ PNT '** 位置を揃える、文字列を箱指定して下さい。[ESC]キーで終了 **' RUBBER_BOX Point_01 Point_02

      INQ_SELECTED_ELEM BOX Point_01 Point_02
      LET KAZ (INQ 14)                            {要素の数}
      LOOP
      EXIT_IF (((INQ 403) = TEXT) OR (KAZ = 0))
        LET KAZ (KAZ - 1)
        INQ_NEXT_ELEM                             {次の要素}
      END_LOOP

    EXIT_IF ((INQ 403) = TEXT)                    {テキストが有るなら次へ}
    END_LOOP


    READ PNT '** 揃える水平位置を指定して下さい。(文字の原点を基準に揃えます。)[ESC]キーで終了 **' Point_03
    LET Point_03Y (Y_OF Point_03)

    INQ_SELECTED_ELEM BOX Point_01 Point_02
    LET KAZ (INQ 14)                              {要素の数}
    LOOP
      IF ((INQ 403) = TEXT)
        LET Point_00 (PNT_XY (X_OF (INQ 101)) Point_03Y)  {移動位置}
        MODIFY (INQ 101) DEL_OLD MOVE TWO_PTS (INQ 101) Point_00
      END_IF

      LET KAZ (KAZ - 1)
    EXIT_IF (KAZ = 0)
      INQ_NEXT_ELEM                               {次の要素}
    END_LOOP


  END_LOOP


END_DEFINE



ライン入力・既存文字利用
  1999.06.06}

DEFINE Ma_text_in_edit
  LOCAL Word00
  LOCAL Word01
  LOCAL Position


  Ma_text_designate                             {テキストの指定}
  LET Word00 (INQ 902)                          {文字列の取得}
  READ STRING '** 文字列を編集して下さい。 **' DEFAULT Word00 Word01
  READ PNT '** 記入位置を指示して下さい。 **' Position
  TEXT Word01 Position ASSIST                   {記入}

END_DEFINE



文字列の連結
  2000.05.14-2000.05.19}

DEFINE Ma_unite
  PARAMETER Erase                                 {引用文字の削除=1}

  LOCAL Txet_modify_point                         {変更文字列の指示位置}
  LOCAL Txet_modify_text                          {変更する文字列}
  LOCAL Txet_modify_locate                        {変更文字列の位置}
  LOCAL Txet_modify_angle                         {文字列の角度}

  LOCAL Txet_quotation                            {引用する文字列}
  LOCAL Txet_quotation_locate                     {引用文字列の位置}
  LOCAL Txet_write                                {取り替える文字}

  LOCAL F_or_r_locate                             {文字の付加位置用}
  LOCAL F_or_r_angle                              {原点からの方向}
  LOCAL Write_locate                              {書き込む位置}

{現在の環境用}
  LOCAL Txet_color_standard                       {文字列の色}
  LOCAL Txet_origin_standard                      {文字列原点位置}
  LOCAL Txet_pace_standard                        {文字列の行間隔}
  LOCAL Txet_ratio_standard                       {比率(幅/高さ)}
  LOCAL Txet_size_standard                        {文字列の高さ}
  LOCAL Txet_inclination_standard                 {文字列の傾斜角}
  LOCAL Txet_angle_standard                       {文字列の角度}
  LOCAL Txet_font1_standard                       {1バイト書体名}
  LOCAL Txet_font2_standard                       {2バイト書体名}
  LOCAL Txet_frame_standard                       {文字列の枠}
  LOCAL Txet_paint_standard                       {塗りつぶし}
  LOCAL Angle_unit                                {ラディアンへの変換値}


{ 現在の環境の記憶}
  INQ_ENV 3
  LET Txet_color_standard (INQ 203)               {文字列の色}

  INQ_ENV 12
  LET Txet_origin_standard (INQ 3)                {文字列原点位置}
  LET Txet_pace_standard (INQ 4)                  {文字列の行間隔}
  LET Txet_ratio_standard (INQ 5)                 {比率(幅/高さ)}
  LET Txet_size_standard (INQ 6)                  {文字列の高さ}
  LET Txet_inclination_standard (INQ 7)           {文字列の傾斜角}
  LET Txet_angle_standard (INQ 8)                 {文字列の角度}
  LET Txet_font1_standard (INQ 302)               {1バイト書体名}
  LET Txet_font2_standard (INQ 303)               {2バイト書体名}
  LET Txet_frame_standard (INQ 601)               {文字列の枠}
  LET Txet_paint_standard (INQ 602)               {塗りつぶし}

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

  LOOP
    READ PNT '** 連結変更する文字列を指示して下さい。 **' Txet_modify_point
    INQ_ELEM Txet_modify_point                    {要素情報の取得}
  EXIT_IF ((INQ 403) = TEXT)                      {文字列なら}
  END_LOOP

  LET Txet_modify_locate (INQ 101)                {変更文字列の位置}
  LET Txet_modify_text (INQ 902)                  {変更する文字列}
  LET Txet_modify_angle ((INQ 8) * Angle_unit)    {文字列の角度}
  IF (Txet_modify_angle < 0)
    LET Txet_modify_angle (2 * PI + Txet_modify_angle)
  END_IF


  IF (Erase = 1)
    LOOP
      READ PNT '** 移動してくる文字列を指示して下さい。 **' Txet_quotation_locate
      INQ_ELEM Txet_quotation_locate              {要素情報の取得}
    EXIT_IF ((INQ 403) = TEXT)                    {文字列なら}
    END_LOOP

  ELSE
    LOOP
      READ PNT '** コビーしてくる文字列を指示して下さい。 **' Txet_quotation_locate
      INQ_ELEM Txet_quotation_locate              {要素情報の取得}
    EXIT_IF ((INQ 403) = TEXT)                    {文字列なら}
    END_LOOP

  END_IF

  LET Txet_quotation (INQ 902)                    {引用する文字列}

  READ PNT '** 連結する方向を指示して下さい。(文字列の前方指示で先頭、後方指示で後方に連結します。) **' F_or_r_locate
  LET F_or_r_angle ((ANG (F_or_r_locate - Txet_modify_locate)) * Angle_unit)  {ラディアン表示}
  IF (F_or_r_angle < 0)
    LET F_or_r_angle (2 * PI + F_or_r_angle)
  END_IF


  LET F_or_r_angle (F_or_r_angle - Txet_modify_angle - (PI / 2))  {文字列の傾きを基準にする}
  IF (F_or_r_angle < 0)
    LET F_or_r_angle (2 * PI + F_or_r_angle)
  END_IF


{ 書き込み文字列の作成}
  IF (F_or_r_angle < PI)                          {先頭なら}
    LET Txet_write (Txet_quotation + Txet_modify_text)
  ELSE                                            {後方なら}
    LET Txet_write (Txet_modify_text + Txet_quotation)
  END_IF


  READ PNT '** 書き込む位置を指示して下さい。 **' Write_locate

{ 変更文字列と同じ位置ですか}
  INQ_ELEM Write_locate                           {要素情報の取得}

  IF ((INQ 14) = 1)                               {1要素なら}
    IF (((INQ 403) = TEXT) AND ((INQ 101) = Txet_modify_locate))
      LET Write_locate Txet_modify_locate
    END_IF

  ELSE_IF ((INQ 14) > 1)                          {多要素なら}
    LOOP
      IF (((INQ 403) = TEXT) AND ((INQ 101) = Txet_modify_locate))  {同じなら}
        LET Write_locate Txet_modify_locate
      END_IF

    EXIT_IF (((INQ 403) = TEXT) AND ((INQ 101) = Txet_modify_locate) OR ((INQ 14) = 1))
      INQ_NEXT_ELEM
    END_LOOP

  END_IF


  GET_PROPERTIES Txet_modify_point                {要素の特性の取得変更}
  IF (Write_locate = Txet_modify_locate)          {上書きなら}
    DELETE Txet_modify_point END                  {前の文字列を削除}
  END_IF

  TEXT Txet_write Write_locate END                {書き込み}
  IF (Erase = 1)                                  {引用文字の削除なら}
    DELETE Txet_quotation_locate END              {引用文字列を削除}
  END_IF


{ 復元}
  TEXT COLOR Txet_color_standard END              {文字列の色}
  CURRENT_FONT Txet_font1_standard                {1バイト書体名}
  TEXT_ADJUST Txet_origin_standard                {文字列原点位置}
  TEXT_ANGLE Txet_inclination_standard            {文字列の傾斜角}
  TEXT_FILL Txet_paint_standard                   {塗りつぶし}
  TEXT_FRAME Txet_frame_standard                  {文字列の枠}
  TEXT_LINESPACE Txet_pace_standard               {文字列の行間隔}
  TEXT_RATIO Txet_ratio_standard                  {比率(幅/高さ)}
  TEXT_SIZE Txet_size_standard                    {文字列の高さ}
  TEXT_SLANT Txet_inclination_standard            {文字列の傾斜角}

END_DEFINE



規定値ライン、文字 Text.macから移動 1998.12.27
}
DEFINE Ma_standard_line
  END
  COLOR WHITE END
  TEXT CYAN END
END_DEFINE



黄色線
 1998.12.27}

DEFINE Ma_yellow_line
  END
  END
  COLOR YELLOW
  LINEPATTERN SOLID
END_DEFINE



水平アンダーライン
 1998.12.27-1999.01.28}

DEFINE Ma_underline
  LOCAL Lo_scale                                  {尺度}
  LOCAL Lo_point1                                 {要素指定点}
  LOCAL Lo_form                                   {要素タイプ}
  LOCAL Lo_center                                 {原点番号}
  LOCAL Lo_ratio                                  {比率}
  LOCAL Lo_height                                 {文字高さ}
  LOCAL Lo_address                                {原点位置}
  LOCAL Lo_address_x
  LOCAL Lo_address_y
  LOCAL Lo_word                                   {文字列}
  LOCAL Lo_word_len                               {文字列の長さ}
  LOCAL Lo_point_l_x                              {左下}
  LOCAL Lo_point_l_y
  LOCAL Lo_point_r_x                              {右下}
  LOCAL Lo_point_r_y
  LOCAL Lo_line_start                             {開始点}
  LOCAL Lo_line_end                               {終了点}
  LOCAL Lo_sirusi
  LOCAL Lo_point2                                 {始点}
  LOCAL Lo_point2_x
  LOCAL Lo_point3                                 {終点}
  LOCAL Lo_point3_x


  INQ_ENV 6
  LET Lo_scale (INQ 4)                            {尺度}

  {文字列の取得}
  LET Lo_sirusi 0
  LOOP
    READ PNT '** アンダーラインを引く文字を指定指定して下さい。 **' Lo_point1
    INQ_SELECTED_ELEM Lo_point1                   {要素データを取得}
    LET Lo_form (INQ 403)                         {要素タイプ}
    IF (Lo_form = TEXT)
      LET  Lo_sirusi 1
    ELSE_IF ((INQ 14) = 0)                        {無くなれば}
    ELSE
      LOOP
        INQ_NEXT_ELEM                             {次}
        LET Lo_form (INQ 403)
        IF (Lo_form = TEXT)
          LET Lo_sirusi 1
        END_IF

      EXIT_IF (Lo_sirusi = 1)
      EXIT_IF ((INQ 14) = 0)
      END_LOOP

    END_IF

  EXIT_IF (Lo_sirusi = 1)
  END_LOOP


  {データの取得}
  LET Lo_center (INQ 3)                           {原点番号}
  LET Lo_ratio (INQ 5)                            {比率}
  LET Lo_height (INQ 6)                           {文字高さ}
  LET Lo_address (INQ 101)                        {原点位置}
  LET Lo_word (INQ 902)                           {文字列}
  LET Lo_word_len (LEN Lo_word)                   {文字列の長さ}

  LET Lo_address_x (X_OF Lo_address)
  LET Lo_address_y (Y_OF Lo_address)

  {X方向}
  IF ((Lo_center = 1) OR (Lo_center = 4) OR (Lo_center = 7))          {左なら}
    LET Lo_point_l_x Lo_address_x
    LET Lo_point_r_x (Lo_address_x + (Lo_height * Lo_ratio * Lo_word_len) / Lo_scale)
  ELSE_IF ((Lo_center = 2) OR (Lo_center = 5) OR (Lo_center = 8))     {中なら}
    LET Lo_point_l_x (Lo_address_x - ((Lo_height * Lo_ratio * Lo_word_len) / 2  ) / Lo_scale)
    LET Lo_point_r_x (Lo_address_x + ((Lo_height * Lo_ratio * Lo_word_len) / 2  ) / Lo_scale)
  ELSE                                                                {右なら}
    LET Lo_point_l_x (Lo_address_x - (Lo_height * Lo_ratio * Lo_word_len) / Lo_scale)
    LET Lo_point_r_x Lo_address_x
  END_IF


  {Y方向}
  IF ((Lo_center = 7) OR (Lo_center = 8) OR (Lo_center = 9))          {上なら}
    LET Lo_point_l_y (Lo_address_y - Lo_height)
  ELSE_IF ((Lo_center = 4) OR (Lo_center = 5) OR (Lo_center = 6))     {中なら}
    LET Lo_point_l_y (Lo_address_y - Lo_height / 2)
  ELSE                                                                {下なら}
    LET Lo_point_l_y Lo_address_y
  END_IF

  LET Lo_point_r_y Lo_point_l_y

  {ラインのデータ取得}
  READ PNT '** アンダーラインの始まる位置を、クリックしてください。**' Lo_point2
  LET Lo_point2_x (X_OF Lo_point2)
  LET Lo_line_start (PNT_XY (Lo_point2_x) (Lo_point_l_y - (3 / Lo_scale)))   {開始点・文字芯から3o下}

  READ PNT '** アンダーラインの終わる位置を、クリックしてください。**' RUBBER_LINE_HORIZONTAL Lo_line_start Lo_point3
  LET Lo_point3_x (X_OF Lo_point3)
  LET Lo_line_end (PNT_XY (Lo_point3_x) (Lo_point_r_y - (3 / Lo_scale)))     {終了点・文字芯から3o下}

  Ma_yellow_line                                  {黄色線}
  LINE HORIZONTAL Lo_line_start Lo_line_end
  Ma_standard_line                                {規定値ライン}

  END
END_DEFINE



引き出し線の描画  Leader.macから移動
 1998.12.25-1999.01.13}

DEFINE Leader_draw
  PARAMETER P1
  PARAMETER P2
  PARAMETER Length
  PARAMETER Direction

  UNITS DEG
  UNITS MM
  COLOR
  YELLOW
  LINEPATTERN SOLID
  ADD_CURRENT_INFO 'Leaders'
  LEADER_LINE (P2 + (PNT_RA Length (90 * (Direction - 1)))) P2 P1 END
  CHANGE_CURRENT_INFO 'Leaders' ''
  TEXT CYAN END
END_DEFINE



水平引き出し線 Leader.macから移動
 1998.12.25-1999.01.13}

DEFINE Leader_input
  LOCAL P1
  LOCAL P2
  LOCAL P3
  LOCAL P4
  LOCAL Length                                    {ライン長}
  LOCAL Direction                                 {描画方向}


  LINEPATTERN SOLID
  READ PNT '引き出し点を指示してください.' P1
  READ PNT '文字の始まる位置をピックしてください.' RUBBER_LINE P1 P2
  READ PNT '文字の終わる位置をピックしてください.' RUBBER_LINE_HORIZONTAL P2 P4
  LET Length (ABS (X_OF P4 - X_OF P2))
  IF ((X_OF P4) > (X_OF P2))
    LET Direction 1
  ELSE
    LET Direction 3
  END_IF

  Leader_draw P1 P2 Length Direction
  TEXT_ADJUST 5
  END
END_DEFINE



方向判断2
  2002.03.01-2002.04.24
}
DEFINE Ma_text_direction
{ 角度はラディアンで指定すること。360°を8分割しています。
 この判断マクロは、0を跨ぎません。
}
  PARAMETER Direction

  LET Direction (Direction MOD (PI * 2))          {一周以内にする}
{ 符号の調整}
  IF (Direction > PI)
    LET Direction (Direction - (PI * 2))
  ELSE_IF (Direction < -PI)
    LET Direction (Direction + (PI * 2))
  END_IF


  IF ((Direction >= 0) AND (Direction < (PI / 4))) {右上}
    LET Gl_fruit 1
  ELSE_IF ((Direction >= (PI / 4)) AND (Direction < (PI / 2))) {上右}
    LET Gl_fruit 2
  ELSE_IF ((Direction >= (PI / 2)) AND (Direction < (PI * (3 / 4)))) {上左}
    LET Gl_fruit 3
  ELSE_IF ((Direction >= (PI * (3 / 4))) AND (Direction < PI)) {左上}
    LET Gl_fruit 4
  ELSE_IF ((Direction >= PI) OR (Direction < (-PI * (3 / 4)))) {左下}
    LET Gl_fruit 5
  ELSE_IF ((Direction >= (-PI * (3 / 4))) AND (Direction < (-PI / 2))) {左下}
    LET Gl_fruit 6
  ELSE_IF ((Direction >= (-PI / 2)) AND (Direction < (-PI / 4))) {下左}
    LET Gl_fruit 7
  ELSE_IF ((Direction <= (-PI / 4)) AND (Direction < 0)) {右下}
    LET Gl_fruit 8
  END_IF


END_DEFINE



テキスト・ファイルデータの1列書き込み
  2002.03.01
}
DEFINE Ma_text_continue_write
  PARAMETER File_id                               {オープンファイルのID}
  PARAMETER Course                                {書き込み方向 H=水平 V=鉛直}
  PARAMETER Start_point                           {書き込み開始位置}
  PARAMETER Pitch                                 {書き込み間隔}

  LOCAL Point_x
  LOCAL Point_y
  LOCAL Point                                     {書き込み位置}
  LOCAL Word                                      {書き込み文字}


  LET Point Start_point
  LOOP
    READ_FILE File_id Word                        {一行取得}
  EXIT_IF (Word = 'END-OF-FILE')
    IF (Word <> '')
      TEXT Word Point END                         {書き込み}
    END_IF

    LET Point_x (X_OF Point)
    LET Point_y (Y_OF Point)
{   次の書き込みポイント}
    IF (Course = 'V')                             {鉛直方向なら}
      LET Point_y (Point_y + Pitch)
    ELSE
      LET Point_x (Point_x + Pitch)
    END_IF

    LET Point (PNT_XY Point_x Point_y)
  END_LOOP


END_DEFINE



ファイルデータ利用の書き込みの使い方
 2002.03.02

1.データファイルの作り方
  1行ずつ、文字列を書いた、ファイルを作って下さい。
  ファイル名は適当でOKです。

2.必要なマクロをME10に読み込んで下さい。(下記の3個です。)
   方向判断 2(Ma_text_direction)
   テ キスト・ファイルデータの1列書き込み(Ma_text_continue_write)
   テ キスト・ファイルデータの書き込み(Ma_text_write_data)

3.Ma_text_write_data を実行して下さい。
  ファィルリストが開きますので、指示して下さい。
  指示した位置から、指示した間隔で、ファィルから1行ずつ読み込んで、書いてくれます。
  方向は、4方向です。(上方向、下方向、左方向、右方向)間隔の入力を0にしても書けますが、重なってしまいます。



テキスト・ファイルデータの書き込み
  2002.03.01-2002.03.09
}
DEFINE Ma_text_write_data
  LOCAL Env_dir                                   {現在のカレントパス}
  LOCAL File_id                                   {ファイルのID番号}
  LOCAL File_name                                 {データファイル名}
  LOCAL Pitch                                     {間隔}
  LOCAL Start_point                               {開始位置}
  LOCAL Course_select                             {判断用入力点}
  LOCAL Course                                    {書き込み方向}
  LOCAL Angle_unit                                {ラディアンへの変換値}

  LET File_id 1

{ 現在の環境の記憶}
  INQ_ENV 0
  LET Env_dir (INQ 302)                           {現在のカレントパス}

  Fbt_dtabs_all_on 0                              {ファイルディレクトリーリストの表示}
  READ STRING '** データの入ったファイルを指示して下さい。**' File_name
  READ NUMBER '** 文字の間隔を入力して下さい。**' Pitch
  READ PNT '** スタートの位置を指示して下さい。**' Start_point
  READ PNT '** 書き込みの方向を指示して下さい。(上向き、下向き、左向き、右向き)**' RUBBER_LINE Start_point Course_select

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

  LET Course (ANG (Course_select - Start_point))
  LET Course (Course * Angle_unit)                {ラディアンへ変換}
  Ma_text_direction Course                        {方向判断}

{ 方向判断}
  IF ((Gl_fruit = 1) OR (Gl_fruit = 4) OR (Gl_fruit = 5) OR (Gl_fruit = 8))  {横きなら}
    LET Course 'H'
  ELSE
    LET Course 'V'
  END_IF


{ 方向によるピッチの符号}
  IF ((Gl_fruit >= 4) AND (Gl_fruit <= 7))        {左又は下向きなら}
    LET Pitch (-(ABS Pitch))
  ELSE
    LET Pitch (ABS Pitch)
  END_IF


  OPEN_INFILE File_id File_name                   {データファイルを読み込みで開く}
  CURRENT_DIRECTORY Env_dir                       {カレントパスの復帰}

  Ma_text_continue_write File_id Course Start_point Pitch  {書き込み}
  CLOSE_FILE File_id                              {データファイルを閉じる}

END_DEFINE



表への文字列の書き込みの使い方
 2002.03.09

1.どの様なマクロ?
  外部で作成した、ファイルからデータを読み込んで、表の状態に書き込みます。

2.データファイルの作り方
  a.表計算のソフトで作ります。CSV(コンマ区切り)の形式で保存してください。
  b.2行目の1列目は、間隔のデータを図面の尺度に合わせる/合わせ無いを指示します。
    合わせる場合は半角文字の S で、合わせないで現尺にする場合は半角文字の A を入れて下さい。
  c.2行目の2列目は、
  d.3行目は今後に使う予定です。(いつになるやら?)
  f.4行目の1列目は、行間隔を、半角文字の数値で入れて下さい。
    g.4行目の2列目以降は、前の列からの間隔を、半角文字の数値で入れて下さい。
    (入力されていないセルは、後からの入力となります。)
  h.5行目からはデータを入れていきます。
    注:ファイル名は、内容が合えば、何でもOK。

3.必要なマクロ
   Ma_text_fruit_letter_normal          普通列データの取得
   Ma_text_fruit_letter_comma           コンマ内包データの取得
   Ma_data_line_jump                    データの頭出し
   Ma_text_fruit_word_leftover          残りのデータを得る
   Ma_text_fruit_word_piece             データの切り出し
   Ma_text_direction                    方向判断
   Ma_text_write_data_csv               テキスト・ファイルデータの書き込み

4.使い方
  a.データファイルを作って下さい。
  b.必 要なマクロをME10に読み込んで下さい。
    c.マクロの Ma_text_write_data_csv を実行して下さい。
  d.データファイルを指示して下さい。
  e.間隔データが不足していると入力を求められるので、指示に従って下さい。
  f.書き込む位置を求められますので、位置を指示して下さい。
  g.書き込む方向は、鉛直で上の方向と、下の方向に書き込みます。
     求められれば、マウスでおおよその方向になるように指示をして下さい。
  h.カレントパーツに書き込まれます。

4.見本
  ME10:部品表(me10sample01)
  データファイル:part.csv
   部品表をME10に読み込んで、マクロを動かして下さい。
   データファイルは、part.csv を指定して下 さい。
   表の左上の角を指定の位置として下さい。
   方向は、下向きです。



普通列データの取得
 2002.03.04
}
DEFINE Ma_text_fruit_letter_normal
  PARAMETER flag_re_data                          {必要データの区別 0=切り出しデータ 1=残データ}
  PARAMETER Data00

  LOCAL Data01                                    {処理中データ}
  LOCAL Point                                     {確認の位置}
  LOCAL Out_flag                                  {抜けだし用 0=処理中 1=処理完 2=エラー}


  LET Data01 Data00                               {移す}
  LET Gl_fruit ''
  LET Out_flag 0

  LET Point (POS Data00 ',')                      {次の , を探す}

  IF (Point = 0)                                  {無ければ}
    LET Gl_fruit (Gl_fruit + Data01)
    LET Data01 ''
  ELSE
    LET Gl_fruit (Gl_fruit + (SUBSTR Data01 1 (Point - 1)))  {データを移す}
    LET Data01 (SUBSTR Data01 (Point + 1) ((LEN Data01) - Point))
  END_IF


  IF (flag_re_data = 1)                           {残りデーの要求なら}
    LET Gl_fruit Data01
  END_IF


END_DEFINE



コンマ内包データの取得
 2002.03.04
}
DEFINE Ma_text_fruit_letter_comma
{ データが異常なら、戻り値は、-1 です。}
  PARAMETER flag_re_data                          {必要データの区別 0=切り出しデータ 1=残データ}
  PARAMETER Data00

  LOCAL Data01                                    {処理中データ}
  LOCAL Point                                     {確認の位置}
  LOCAL Out_flag                                  {抜けだし用 0=処理中 1=処理完 2=エラー}


  LET Data01 Data00                               {移す}

  LET Gl_fruit '"'
  LET Data01 (SUBSTR Data01 2 ((LEN Data01) - 1)) {先頭を取り除く}

  LET Out_flag 0
  LOOP
    LET Point (POS Data01 '"')                    {次の " を探す}
    IF (Point = 0)                                {無ければ}
      LET Gl_fruit -1
      LET Out_flag 2                              {エラーフラグ}
    END_IF

  EXIT_IF (Out_flag = 2)

    LET Gl_fruit (Gl_fruit + (SUBSTR Data01 1 Point))  {データを移す}
    LET Data01 (SUBSTR Data01 (Point + 1) ((LEN Data01) - Point))

{   次のデータチェック}
    IF ((num Data01) = (NUM '"'))                 {内部の " なら}
      LET Gl_fruit (Gl_fruit + '"')               {データを移す}
      LET Data01 (SUBSTR Data01 2 ((LEN Data01) - 1))

    ELSE_IF ((num Data01) = (NUM ','))            {区切りなら}
      LET Data01 (SUBSTR Data01 2 ((LEN Data01) - 1))
      LET Out_flag 1                              {OKフラグ}

    ELSE_IF ((LEN Data01) = 0)                    {最後なら}
      LET Out_flag 1                              {OKフラグ}

    END_IF


  EXIT_IF (Out_flag = 1)
  END_LOOP


  IF (Out_flag = 1)                               {OKなら}
    IF (flag_re_data = 1)                         {残りデーの要求なら}
      LET Gl_fruit Data01
    ELSE
      LET Gl_fruit (SUBSTR Gl_fruit 2 ((LEN Gl_fruit) - 2)) {" を除く}
    END_IF

  ELSE                                            {エラーなら}
    LET Gl_fruit -1
  END_IF


END_DEFINE



残りのデータを得る
 2002.03.04
}
DEFINE Ma_text_fruit_word_leftover
  PARAMETER Data00

  IF ((num Data00) = (NUM '"'))                   {コンマ内包データなら}
    Ma_text_fruit_letter_comma 1 Data00           {コンマ内包データの取得}
  ELSE
    Ma_text_fruit_letter_normal 1 Data00          {普通列データの取得}
  END_IF


END_DEFINE



データの切り出し
 2002.03.04
}
DEFINE Ma_text_fruit_word_piece
{ エラーなら -1 で戻る}
  PARAMETER Data00

  IF ((num Data00) = (NUM '"'))                   {コンマ内包データなら}
    Ma_text_fruit_letter_comma 0 Data00           {コンマ内包データの取得}
  ELSE
    Ma_text_fruit_letter_normal 0 Data00          {普通データの取得}
  END_IF


END_DEFINE



テキスト・CSVファイルデータの書き 込み
 2002.03.09
}
DEFINE Ma_text_write_data_csv
  LOCAL Env_dir                                   {現在のディレクトリー}
  LOCAL File_id                                   {ファイルのID番号}
  LOCAL File_name                                 {データファイル名}
  LOCAL Data_line                                 {ファイルの1行データ}
  LOCAL Scale                                     {カレントパーツの尺度}
  LOCAL Offset_len                                {指示開始位置からのずれ量}
  LOCAL Kioku                   {仮の記憶}
  LOCAL Pitch_v                                   {行の間隔 -=エラー 0=後で入力}
  LOCAL Pitch_h                                   {列間隔データ}
  LOCAL Table_inside01                            {列格納テーブル名}
  LOCAL Pointer                                   {文字の内部位置}
  LOCAL Point                                     {書き込み位置}
  LOCAL Point_x
  LOCAL Point_x0                                  {基準位置}
  LOCAL Point_y
  LOCAL Course_select                             {書き込み方向指示点}
  LOCAL Course_select                             {方向判断用入力点}
  LOCAL Course                                    {書き込み方向}
  LOCAL Angle_unit                                {ラディアンへ変換}
  LOCAL Word                                      {書き込みデータ}
  LOCAL Message                                   {ブロムブトのメッセージ}

  LET File_id 1                                   {開くファイルのID}
  LET Table_inside01 '##Gap_row##'                {列の間隔のデーべース}

{ 現在の環境の記憶}
  INQ_ENV 0
  LET Env_dir (INQ 302)                           {現在のカレントパス}
  INQ_ENV 19
  LET Scale (INQ 4)                               {カレントパーツの尺度}

  Fbt_dtabs_all_on 0                              {ファイルディレクトリーリストの表示}
  READ STRING '** データの入ったファイルを指示して下さい。**' File_name

  OPEN_INFILE File_id File_name
  CURRENT_DIRECTORY Env_dir                       {カレントパスの復帰}

  Ma_data_line_jump File_id 1                     {データの頭出し}
{ 描画尺度方法・2行,1列目}
  READ_FILE File_id Data_line                     {一行取得}
  IF (((SUBSTR Data_line 1 1) = 's') OR ((SUBSTR Data_line 1 1) = 'S') OR ((SUBSTR Data_line 1 2) = 's') OR ((SUBSTR Data_line 1 2) = 'S'))
                                                  {スケール指示なら}
    LET Scale 1
  END_IF


{ スタート位置のオフセット値・2行,2列目}
  Ma_text_fruit_word_leftover Data_line
  LET Data_line Gl_fruit                          {一行データの更新}

  Ma_text_fruit_word_piece Data_line              {データの切り出し}
 LET Offset_len (PNT_XY 0 0)
 LET Kioku ' '

  IF ((POS Gl_fruit ' ') <> 0)          {区切りを探す}
  LET Kioku (SUBSTR Gl_fruit 1 ((POS Gl_fruit ' ') - 1))
 END_IF


 IF ((TYPE (VAL Kioku)) = NUMBER)        {X方向のデータが有れば}
  LET Gl_fruit (SUBSTR Gl_fruit ((LEN Kioku) + 2) ((LEN Gl_fruit) - (LEN Kioku) - 1))
  IF ((TYPE (VAL Gl_fruit)) = NUMBER)      {Y方向のデータが有れば}
   LET Offset_len (PNT_XY (VAL Kioku) (VAL Gl_fruit))
   DISPLAY ('** 開始点のオフセット値は X方向 ' + (STR (X_OF Offset_len)) + '、Y方向 ' + (STR (Y_OF Offset_len)) + ' です。**')
  END_IF

 END_IF


  Ma_data_line_jump File_id 1                     {データの頭出し}
{ 間隔の取得・4行目}
  READ_FILE File_id Data_line                     {一行取得}

{ 行間隔の取得・4行,1列目}
  Ma_text_fruit_word_piece Data_line              {データの切り出し}

  IF (Gl_fruit = '')                              {無ければ}
    LET Pitch_v 0                                 {後で入力とする}
  ELSE_IF (Gl_fruit = -1)                         {エラーなら}
    LET Pitch_v -1
  ELSE
    IF ((TYPE (VAL Gl_fruit)) = NUMBER)           {数値なら}
      LET Pitch_v ((ABS (VAL Gl_fruit)) / Scale)  {絶対値を取得}
    ELSE
      LET Pitch_v -1
    END_IF

  END_IF


  IF (Pitch_v = 0)
    LOOP
      READ NUMBER '** 行間隔の数値を入力して下さい。(終了は、[ESC]キーを押して下さい。) **' Pitch_v
      LET Pitch_v ((ABS (VAL Gl_fruit)) / Scale)  {絶対値を取得}
    EXIT_IF (Pitch_v > 0)
    END_LOOP

  ELSE_IF (Pitch_v = -1)
    LOOP
      READ NUMBER '** セルデータから行間隔の数値が取得できません。数値を入力して下さい。(終了は、[ESC]キーを押して下さい。) **' Pitch_v
      LET Pitch_v ((ABS Pitch_v) / Scale)      {絶対値を取得}
    EXIT_IF (Pitch_v > 0)
    END_LOOP

  END_IF


  Ma_text_fruit_word_leftover Data_line
  LET Data_line Gl_fruit                          {一行データの更新}

  CREATE_LTAB 10 1 Table_inside01                 {列間隔格納テーブル}
  LET Pointer 1

{ 列の間隔の取得}
 IF (Data_line <> '')                             {データが有れば}
   LOOP
     Ma_text_fruit_word_piece Data_line           {データの切り出し}

   LET Pitch_h 0
   IF (Gl_fruit = '')                             {データが無ければ}
    LET Pitch_h -1
     ELSE_IF ((TYPE Gl_fruit) = STRING)           {文字列で有れば}
    IF ((TYPE (VAL Gl_fruit) <> NUMBER))   {数値列以外なら}
     LET Pitch_h -1
      END_IF

   ELSE                                           {エラーの戻りなら}
    LET Pitch_h -1
     END_IF


   IF (Pitch_h >= 0)                              {エラーで無ければ}
       LET Pitch_h ((ABS (VAL Gl_fruit)) / Scale)    {絶対値を取得}
     END_IF


   IF (Pitch_h <= 0)
       DISPLAY ('** 列 ' + (STR Pointer) + ' と ' + (STR (Pointer + 1)) + ' の間隔データは後から入力します。終了なら [ESC]キーを入力 **')
   ELSE
      WRITE_LTAB Table_inside01 Pointer 1 Pitch_h   {記憶}
   END_IF


     Ma_text_fruit_word_leftover Data_line
     LET Data_line Gl_fruit                       {行データの更新}

   EXIT_IF ((LEN Data_line) = 0)                  {一行データが無くなれば}
     LET Pointer (Pointer + 1)
   END_LOOP

 END_IF


  READ PNT '** 書き出しの、位置を指示して下さい。**' Point  { 位置の入力}
{ 方向判断}
  READ PNT '** 書き込む方向を指示して下さい。上方向と下方向が選択できます。**' RUBBER_LINE Point Course_select  {方向指示の入力}

  INQ_ENV 6
  LET Angle_unit (INQ 3)                          {ラディアンへの変換値}
  LET Course (ANG (Course_select - Point))
  LET Course (Course * Angle_unit)                {ラディアンへ変換}
  Ma_text_direction Course                        {方向判断}

  IF ((Gl_fruit > 4) AND (Gl_fruit <= 8))         {下方向なら}
    LET Pitch_v (- Pitch_v)
  END_IF


  LET Point (Point + Offset_len)
  LET Point_x0 (X_OF Point)
  LET Point_x Point_x0
  LET Point_y (Y_OF Point)

{ 書き込み}
  LOOP
    READ_FILE File_id Data_line                   {一行取得}
  EXIT_IF (Data_line = 'END-OF- FILE')             {データが終了なら}

    LET Pointer 0
{   一行の書き込み}
    LOOP
    EXIT_IF ((LEN Data_line) = 0)                 {無くなれば}
      Ma_text_fruit_word_piece Data_line          {データの切り出し}
      LET Word Gl_fruit
      Ma_text_fruit_word_leftover Data_line       {残りのデータ}
      LET Data_line Gl_fruit

      IF (Pointer <> 0)                           {最初の列以外なら}
        LET Pitch_h (READ_LTAB Table_inside01 Pointer 1)
        IF ((TYPE Pitch_h) = STRING)              {空なら}
          LET Pitch_h -1
        END_IF

        IF (Pitch_h < 0)                          {後入力なら}
          LOOP
            READ NUMBER '** 次の文字列までの距離値を入力して下さい。(終了は、[ESC]キーを押して下さい。) **' Pitch_h
            LET Pitch_h (ABS (Pitch_h))           {絶対値を取得}
          EXIT_IF (Pitch_h > 0)
          END_LOOP

          WRITE_LTAB Table_inside01 Pointer 1 Pitch_h  {入力値を記憶}
        END_IF


        LET Point_x (Point_x + Pitch_h)
        LET Point (PNT_XY Point_x Point_y)        {次の位置}
      END_IF


      LET Pointer (Pointer + 1)                   {カウントUP}

      IF (Word <> '')
        TEXT Word Point END                       {書き込み}
      END_IF

    END_LOOP


    LET Point_y (Point_y + Pitch_v)
    LET Point_x Point_x0
    LET Point (PNT_XY Point_x Point_y)            {次の位置}

  END_LOOP


  DELETE_LTAB Table_inside01                      {行間隔のテーブルを閉じる}
  CLOSE_FILE File_id                              {データファイルを閉じる}

END_DEFINE



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