ME10マクロのページです
(スタンプ)

2003.02.06 更新 



リスト


macro.lzh#(マクロファィルです。)
stamp.lzh#(スタンプのサンプルです。)
 

新規 1.スタンプの使い方 2003.02.06
新規 2.スタンプ/格納ファィルの仕様 2003.02.06

新規 3.スタンプ・描画・位置の処理 2003.02.06
新規 4.スタンプ・描画・数値の処理 2003.02.06
新規 5.スタンプ・描画・文字の処理 2003.02.06
新規 6.スタンプ・描画・1行データから頭データ除去 2003.02.06
新規 7.スタンプ・描画・本体 2003.02.06
新規 8.スタンプ・描画・位置、方向入力 2003.02.06
新規 9.スタンプ・描画 2003.02.06

新規 10.スタンプ・リスト枠の消去 2003.02.06
新規 11.スタンプ・合致する、スタンプ名の行位置 2003.02.06
新規 12.スタンプ・枠の内容定義 2003.02.06
新規 13.スタンプ・枠の定義 2003.02.06
新規 14.スタンプ・リスト枠の表示 2003.02.06
新規 15.スタンプ・リストデータの作成 2003.02.06
新規 16.スタンプ・保存・テキストデータを文字列データに変換 2003.02.06
新規 17.スタンプ・変換・線種データ→文字列 2003.02.06
新規 18.スタンプ・保存・文字列の置き換え 2003.02.06
新規 19.スタンプ・パス名からファイル名を切り出す 2003.02.06
新規 20.スタンプ・保存・要素データの作成 2003.02.06
新規 21.スタンプ・制作、格納 2003.02.06
 



スタンプの使い方


 1.スタンプは、毎回、同じ図を描画するのを、補助するマクロです。
   電気記号、フロー記号、配管竪図、ロゴ等の、サイズ、描画方向が違うだけの同じ図を保存して置いて、必要な場合に呼び出し、描画が出来ます。
 

 2.[スタンプ・制作、格納] から  [スタンプ・描画・位置の処理]までを、マ クロの使い方を参考にして、ME10にINPUTして下さい。
   ページ先頭の、マクロファイルが利用できます。(解凍する必要がありますが!)
 3.それ以外にも、下記のマクロをインプットして下さい。
   Ma_line_Pattern      作  図に有ります。
   Ma_figure_direction        部品描画に有ります。
   Ma_data_line_jump     部品描画に有ります。
 

 4.スタンプで描くためには、スタンプを作ります。
   サポートされている、描画コマンドは、スタンプファィルの仕様を見て下さい。これ以外の描画コマンドは、無視されます。
   つまり、下書き線は無視されますので、活用して下さい。
 5.アクティブパーツだけか、スタンプ変換されますので、スタンプにしたいパーツに移動して下さい。、
 6.{Ma_stamp_make}を実行して下さい。カレントディレクトリーのファイルに格納されます。
   スタンプの名前は、半角で40文字までです。大文字、小文字が区別されます。
   新規、追加、上書きをすることが出来ます。
 

 7.スタンプファィル内のスタンプデータを使い、描画が出来ます。
 8.[Ma_stamp_draw]を実行して下さい。
   拡大率が入力出来ますので、スタンプの大きさを描画時点で変更できます。
   描画方法の、絶対は、縮尺に関係なく描画しますので、縮尺1/2なら、2倍大きさで描画されます。相対は、縮尺を考えて描画されます。
 

 9.スタンプの格納ファィルは、アスキーデータなので、編集は可能です。



スタンプ/格納ファィルの仕様


1.行別のデータ仕様:
 1行目:タイトル(先頭の["スタンプデータのファイル"]をデータファイルの印のチェックに使っています。)
 2行目:メモ行(半角で、1023文字以内)
 3行目:メモ行(半角で、1023文字以内)
 4行目:色、線種、フォントの記述
 5行目:この行からスタンプのデータです。以下は、スタンプ名行とデータ行で構成されます。
    スタンプ名行:区別番号(0=スタンプ名行).スタンプ名称(文字は全角20文字以内)
    データ行  :区別番号(1=データ行).データ列
     ↓
    データ行  :区別番号(1=データ行).データ列
     ↓(以下繰り返し)
 終了行:区別番号(-1=スタンプデータの終了行)、メモ
 以降の行は、メモ行です。(各行は、半角で、1023文字以内)

 (区別番号)
  0=スタンプ名行 1=データ行 -1=スタンプの終了印行

2.スタンプ名称の仕様:
 同じスタンプ名が格納されている場合は、ファィルの先頭に近いスタンプが有効です。
 名前の長さは、半角で、40以内(越える分は、切り捨てられます。)

3.スタンプ内の文字長さの制限:
 1行は、半角で510文字以内です。

4.スタンプの使用コマンド(下書き線、ハッチ、参照線等は、無視されます。)
 (コマンド)
  POINT (共通) 点
  LINE (共通) TWO_PTS 始点 終点
  CIRCLE (共通) CENTER 中心点 円周上の点
  ARC (共通) CEN_BEG_END 中心点 始点 終点
  FILLET (共通) LITERAL 中心点 始点 終点
  TEXT (共通) (テキスト専用) 文字・・・ 位置
  BSPLINE (共通) 区別(OPEN又はCLOSED) ORDER 数値 補間点・・・ END

  (下記のコマンドは、LINE又ARC に直しています。)
  CENTERLINE   → LINE (共通) TWO_PTS 始点 終点 TWO_PTS 始点 終点
  SYMLINE(LINE)  → LINE (共通) TWO_PTS  始点 終点
  SYMLINE(CIRCLE)→ ARC (共通) CEN_BEG_END 中心点 始点 終点
 (共通)
   コマンドの次のデータ
     RGB_COLOR 数値 数値 数値 線種(SOLID DASHED LONG_DASHED DOT_CENTER DASH_CENTER PHANTOM CENTER_DASH_DASH DOTTED)
 (テキスト専用)
  TEXT_ADJUST 数値 TEXT_LINESPACE 数値 TEXT_RATIO 数値 TEXT_SIZE 数値 TEXT_SLANT 数値 TEXT_ANGLE 数値 TEXT_FRAME スイッチ(OFF BOX BALLOON) TEXT_FILL スイッチ(ON OFF)

5.点の格納様式
  (PNT_XY 数値 数値)



スタンプ・描画・位置の処理

 2003.01.31
}
DEFINE Ma_stamp_draw_process_point
  PARAMETER Count                                 {処理数}
  PARAMETER Center                                {描画中心}
  PARAMETER Size                                  {大きさ}
  PARAMETER Spin                                  {回転角度(その時の角度の単位)}
  PARAMETER Absolute                              {絶対値描画値}
  PARAMETER Basket                                {1行データ}
  PARAMETER Handler                               {使用ファイル番号}


  LOCAL Cotlocation                               {切断位置}
  LOCAL Piece                                     {処理データ}
  LOCAL Piece_x                                   {処理データ X}
  LOCAL Piece_y                                   {処理データ Y}
  LOCAL Sirui                                     {抜け出し記号}
  LOCAL Flag                                      {異常の印}


  LOOP
    LET Basket (TRIM Basket)                      {スペースカット}
    IF ((POS Basket '(PNT_XY ') = 1)              {点なら}
      LET Sirui 2                                 {2つの数値データ}
      Ma_stamp_draw_datacut_head Basket           {先頭データの除去}
      LET Basket Gl_fruit                         {残りの1行データ}
      LOOP
        LET Basket (TRIM Basket)                  {スペースカット}
        LET Cotlocation (POS Basket ' ')          {切断位置}

        IF ((Cotlocation = 0) AND (Count > 1) AND (Sirui > 1))
          display '*** データ異常です。終了します。***'
          CLOSE_FILE Handler                      {ファイルのクローズ}
          CANCEL
        ELSE_IF ((Cotlocation = 0) AND (Count = 1) AND (Sirui = 1))
          LET Piece Basket                        {切りだしデータ}
          LET Basket ''
        ELSE
          LET Piece (SUBSTR Basket 1 (Cotlocation - 1)) {切りだしデータ}
          LET Basket (SUBSTR Basket (Cotlocation + 1) ((LEN Basket) - Cotlocation))
        END_IF


        LET Flag 1                                {異常値をセット}
        IF ((((POS Piece ')') = 0) AND (Sirui = 2)) OR (((POS Piece ')') = (LEN Piece)) AND (Sirui = 1)))  {)のチェック}
          IF ((TYPE (VAL Piece)) = NUMBER)
            LET Flag 0
          END_IF
        END_IF


        IF (Flag = 0)
          IF (Sirui = 2)
            LET Piece_x (VAL Piece)
          ELSE
            LET Piece_y (VAL Piece)
          END_IF 


        ELSE

          display '*** データ異常です。終了します。***'
          CLOSE_FILE Handler                      {ファイルのクローズ}
          CANCEL
        END_IF 


      EXIT_IF (Sirui = 1)

        LET Sirui (Sirui - 1)
      END_LOOP


      ((ROT (((PNT_XY Piece_x Piece_y) * Size) / Absolute) Spin) + Center)
                                                  {書き込み}
    ELSE
      display '*** データ異常です。終了します。***'
      CLOSE_FILE Handler                          {ファイルのクローズ}
      CANCEL
    END_IF


  EXIT_IF (Count = 1)
    LET Count (Count - 1)
  END_LOOP


  LET Gl_fruit Basket                             {戻り値・1行データの残り}

END_DEFINE



スタンプ・描画・数値の処理

 2003.01.31
}
DEFINE Ma_stamp_draw_process_number
  PARAMETER Count                                 {処理数}
  PARAMETER Size                                  {大きさ}
  PARAMETER Spin                                  {回転角度(その時の角度の単位)}
  PARAMETER Angle_unit                            {ラディアンへの変換値}
  PARAMETER Absolute                              {絶対値描画値}
  PARAMETER Basket                                {1行データ}
  PARAMETER Handler                               {使用ファイル番号}


  LOCAL Cotlocation                               {切断位置}
  LOCAL Piece                                     {処理データ}


  LOOP
    LET Basket (TRIM Basket)                      {スペースカット}
    LET Cotlocation (POS Basket ' ')              {切断位置}
    IF (Cotlocation = 0)                          {1行データの最後なら}
      display '*** データ異常です。終了します。***'
      CLOSE_FILE Handler                          {ファイルのクローズ}
      CANCEL
    ELSE
      LET Piece (SUBSTR Basket 1 (Cotlocation - 1)) {切りだしデータ}
      LET Basket (SUBSTR Basket (Cotlocation + 1) ((LEN Basket) - Cotlocation))
    END_IF


    IF ((TYPE (VAL Piece)) = NUMBER)
      (((((VAL Piece) / Angle_unit) * Size) / Absolute) + Spin)  {書き込み}
    ELSE
      display '*** データ異常です。終了します。***'
      CLOSE_FILE Handler                          {ファイルのクローズ}
      CANCEL
    END_IF 


  EXIT_IF (Count = 1)

    LET Count (Count - 1)
  END_LOOP


  LET Gl_fruit Basket                             {戻り値・1行データの残り}

END_DEFINE



スタンプ・描画・文字の処理

 2003.01.31
}
DEFINE Ma_stamp_draw_process_text
  PARAMETER Basket                                {1行データ}
  PARAMETER Handler                               {使用ファイル番号}


  LOCAL Cotlocation                               {切断位置}
  LOCAL Piece                                     {処理データ}


  LET Piece ''
  LET Basket (SUBSTR Basket 2 ((LEN Basket) - 1)) {先頭1文字を削除}
  LOOP
    LET Cotlocation (POS Basket "'")              {後ろの'を探す}
    IF (Cotlocation = 0)                          {後に文字列がない}
      display '*** データ異常です。終了します。***'
      CLOSE_FILE Handler                          {ファイルのクローズ}
      CANCEL
    END_IF


  EXIT_IF (Cotlocation <> (POS Basket "''"))      {'を文字列に含ま無い場合}
    LET Piece (Piece + (SUBSTR Basket 1 (Cotlocation + 1)))
    LET Basket (SUBSTR Basket (Cotlocation + 2) ((LEN Basket) - (Cotlocation + 1)))
  END_LOOP


  LET Piece (Piece + (SUBSTR Basket 1 (Cotlocation - 1)))
  LET Basket (SUBSTR Basket (Cotlocation + 1) ((LEN Basket) - Cotlocation))

  Piece                                           {文字データ書き込み}

  LET Gl_fruit Basket                             {戻り値・1行データの残り}

END_DEFINE



スタンプ・描画・1行データから頭データ除去

2 003.01.31
}
DEFINE Ma_stamp_draw_datacut_head
  PARAMETER Basket                                {1行データ}


  LOCAL Cotlocation                               {切断位置}


  LET Basket (TRIM Basket)                        {スペースカット}
  LET Cotlocation (POS Basket ' ')                {切断位置}
  LET Gl_fruit (SUBSTR Basket (Cotlocation + 1) ((LEN Basket) - Cotlocation))
                                                  {戻り値・1行データの残り}

END_DEFINE



スタンプ・描画・本体

 2003.01.31
}
DEFINE Ma_stamp_draw_main
  PARAMETER Handler                               {使用ファイル番号}
  PARAMETER Line_number                           {スタンプ名の行位置}
  PARAMETER Center                                {描画中心}
  PARAMETER Size                                  {大きさ}
  PARAMETER Spin                                  {回転角度}
  PARAMETER Absolute                              {絶対値描画}


  LOCAL Env_color_figure                          {図形線色}
  LOCAL Env_color_text                            {文字線色}
  LOCAL Env_line_figure                           {図形線種}
  LOCAL Env_text_adjust                           {文字原点}
  LOCAL Env_text_linespace                        {文字間隔}
  LOCAL Env_text_ratio                            {文字幅比}
  LOCAL Env_text_size                             {文字高}
  LOCAL Env_text_srant                            {文字傾き}
  LOCAL Env_text_angle                            {文字列角}
  LOCAL Env_text_frame                            {文字囲枠}
  LOCAL Env_text_file                             {文字輪郭}

  LOCAL Angle_unit                                {ラディアンへの変換値}
  LOCAL Basket                                    {1行データ}
  LOCAL Name                                      {スタンプ名}
  LOCAL Sirui                                     {抜け出し記号}
  LOCAL Cotlocation                               {切断位置}
  LOCAL Piece                                     {処理データ}


{ 環境の取得・格納}
  INQ_ENV 3
  LET Env_color_figure (INQ 201)                  {図形線色}
  LET Env_color_text (INQ 203)                    {文字線色}
  LET Env_line_figure (INQ 301)                   {図形線種}
  Ma_stamp_convert_linetype_word Env_line_figure
  LET Env_line_figure Gl_fruit

  INQ_ENV 12
  LET Env_text_adjust (INQ 3)                     {文字原点}
  LET Env_text_linespace (INQ 4)                  {文字間隔}
  LET Env_text_ratio (INQ 5)                      {文字幅比}
  LET Env_text_size (INQ 6)                       {文字高}
  LET Env_text_srant (INQ 7)                      {文字傾斜}
  LET Env_text_angle (INQ 8)                      {文字列角}
  LET Env_text_frame (INQ 601)                    {文字囲枠}
  LET Env_text_file (INQ 602)                     {文字輪郭}

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

  Ma_data_line_jump Handler (Line_number - 1)     {データの頭出し}
  READ_FILE Handler Basket                        {データの1行取得}
  LET Name (SUBSTR Basket 3 ((LEN Basket) - 2))   {スタンプ名の切り出し}
  ADD_CURRENT_INFO ('stamp:' + Name)              {属性をセットする}

  LOOP
    READ_FILE Handler Basket                      {データの1行取得}
  EXIT_IF (((POS Basket '0,') = 1) OR ((POS Basket '-1') = 1)) {終了なら}
    LET Basket (TRIM Basket)                      {スペースカット}

    IF ((POS Basket '1,POINT') = 1)               {POINT なら}
      POINT
    ELSE_IF ((POS Basket '1,LINE') = 1)           {LINE なら}
      LINE
    ELSE_IF ((POS Basket '1,CIRCLE') = 1)         {CIRCLE なら}
      CIRCLE
    ELSE_IF ((POS Basket '1,ARC') = 1)            {ARC' なら}
      ARC
    ELSE_IF ((POS Basket '1,FILLET') = 1)         {FILLET なら}
      FILLET
    ELSE_IF ((POS Basket '1,TEXT') = 1)           {TEXT なら}
      TEXT
    ELSE_IF ((POS Basket '1,BSPLINE') = 1)        {BSPLINE なら}
      BSPLINE
    ELSE_IF ((POS Basket '1,CENTERLINE') = 1)     {CENTERLINE なら}
      CENTERLINE
    ELSE_IF ((POS Basket '1,') = 1)               {その他のデータ行なら}
    END_IF


    Ma_stamp_draw_datacut_head Basket             {頭のデータカット}
    LET Basket Gl_fruit
    LET Sirui 1
    LOOP
      LET Basket (TRIM Basket)                    {スペースカット}
      IF ((POS Basket "'") = 1)                   {テキスト文なら}
        Ma_stamp_draw_process_text Basket Handler {文字の処理}
        LET Basket Gl_fruit

      ELSE
        LET Cotlocation (POS Basket ' ')          {切断位置}
        IF (Cotlocation <> 0)                     {最後のデータなら}
          LET Piece (SUBSTR Basket 1 (Cotlocation - 1)) {切りだしデータ}
          LET Basket (SUBSTR Basket Cotlocation ((LEN Basket) - (Cotlocation - 1)))
        ELSE
          LET Piece Basket
          LET Basket ''
        END_IF


{       線色}
        IF (Piece = 'RGB_COLOR')
          RGB_COLOR
          Ma_stamp_draw_process_number 3 1 0 1 1 Basket Handler  {数値の処理}
          LET Basket Gl_fruit

{       線種}
        ELSE_IF (Piece = 'SOLID')
          SOLID
        ELSE_IF (Piece = 'DASHED')
          DASHED
        ELSE_IF (Piece = 'LONG_DASHED')
          LONG_DASHED
         ELSE_IF (Piece = 'DOT_CENTER')
          DOT_CENTER
        ELSE_IF (Piece = 'DASH_CENTER')
          DASH_CENTER
        ELSE_IF (Piece = 'PHANTOM')
          PHANTOM
        ELSE_IF (Piece = 'PHANTOM')
          PHANTOM
        ELSE_IF (Piece = 'CENTER_DASH_DASH')
          CENTER_DASH_DASH
        ELSE_IF (Piece = 'DOTTED')
          DOTTED

        ELSE_IF (Piece = 'TWO_PTS')
          TWO_PTS
          Ma_stamp_draw_process_point 2 Center Size Spin Absolute Basket Handler  {点の処理}
          LET Basket Gl_fruit
        ELSE_IF (Piece = 'CENTER')
          CENTER
          Ma_stamp_draw_process_point 2 Center Size Spin Absolute Basket Handler  {点の処理}
          LET Basket Gl_fruit
        ELSE_IF (Piece = 'CEN_BEG_END')
          CEN_BEG_END
          Ma_stamp_draw_process_point 3 Center Size Spin Absolute Basket Handler  {点の処理}
          LET Basket Gl_fruit
        ELSE_IF (Piece = 'LITERAL')
          LITERAL
          Ma_stamp_draw_process_point 3 Center Size Spin Absolute Basket Handler  {点の処理}
          LET Basket Gl_fruit

{       テキスト専用なら}
        ELSE_IF (Piece = 'TEXT_ADJUST')
          TEXT_ADJUST
          Ma_stamp_draw_process_number 1 1 0 1 1 Basket Handler  {数値の処理}
          LET Basket Gl_fruit
        ELSE_IF (Piece = 'TEXT_LINESPACE')
          TEXT_LINESPACE
          Ma_stamp_draw_process_number 1 Size 0 1 1 Basket Handler  {数値の処理}
          LET Basket Gl_fruit
        ELSE_IF (Piece = 'TEXT_RATIO')
          TEXT_RATIO
          Ma_stamp_draw_process_number 1 1 0 1 1 Basket Handler  {数値の処理}
          LET Basket Gl_fruit
        ELSE_IF (Piece = 'TEXT_SIZE')
          TEXT_SIZE
          Ma_stamp_draw_process_number 1 Size 0 1 Absolute Basket Handler  {数値の処理}
          LET Basket Gl_fruit
        ELSE_IF (Piece = 'TEXT_SLANT')
          TEXT_SLANT
          Ma_stamp_draw_process_number 1 1 0 Angle_unit 1 Basket Handler  {数値の処理}
          LET Basket Gl_fruit
        ELSE_IF (Piece = 'TEXT_ANGLE')
          TEXT_ANGLE
          Ma_stamp_draw_process_number 1 1 Spin Angle_unit 1 Basket Handler  {数値の処理}
          LET Basket Gl_fruit
        ELSE_IF (Piece = 'TEXT_FRAME')
          TEXT_FRAME
        ELSE_IF (Piece = 'TEXT_FILL')
          TEXT_FILL
        ELSE_IF (Piece = 'OFF')
          OFF
        ELSE_IF (Piece = 'BOX')
          BOX
        ELSE_IF (Piece = 'BALLOON')
          BALLOON
        ELSE_IF (Piece = 'ON')
          ON

{       BSPLINE関係}
        ELSE_IF (Piece = 'BSPLINE')
          BSPLINE
        ELSE_IF (Piece = 'OPEN')
          OPEN
        ELSE_IF (Piece = 'CLOSED')
          CLOSED
        ELSE_IF (Piece = 'ORDER')
          ORDER
          Ma_stamp_draw_process_number 1 1 0 1 1 Handler {数値の処理}

        ELSE_IF (Piece = '(PNT_XY')
          LET Basket ('(PNT_XY' + Basket)
          Ma_stamp_draw_process_point 1 Center Size Spin Absolute Basket Handler  {点の処理}
          LET Basket Gl_fruit

        ELSE_IF (Piece = 'END')
          END
        END_IF 


      END_IF


      IF (Basket = '')                            {1行完了なら}
        LET Sirui 0
      END_IF


    EXIT_IF (Sirui = 0)
    END_LOOP 


  END_LOOP


  CHANGE_CURRENT_INFO ('stamp:' + Name) ''        {属性のクリア}

{ 環境の復元}
  LINE
  RGB_COLOR Env_color_figure                      {図形線色}
  Ma_line_Pattern Env_line_figure                 {図形線種}

  TEXT
  RGB_COLOR Env_color_text                        {文字線色}
  TEXT_ADJUST Env_text_adjust                     {文字原点}
  TEXT_LINESPACE Env_text_linespace               {文字間隔}
  TEXT_RATIO Env_text_ratio                       {文字幅比}
  TEXT_SIZE Env_text_size                         {文字高}
  TEXT_SLANT Env_text_srant                       {文字傾斜}
  TEXT_ANGLE Env_text_angle                       {文字列角}
  TEXT_FRAME Env_text_frame                       {文字囲枠}
  TEXT_FILL Env_text_file                         {文字輪郭}

END_DEFINE



{  スタンプ・描画・位置、方向入力
 2003.01.31
}
DEFINE Ma_stamp_draw_pointin
  PARAMETER Point00                               {描画位置}

  LOCAL Angle_unit                                {ラディアンへの変換値}
  LOCAL Point01                                   {方向用指示位置}
  LOCAL Direction                                 {方向}
  LOCAL Angle                                     {描画角度 (平面の場合はダミーとなる)}
  LOCAL Sirusi                                    {再入力判断}


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

  LOOP
    LET Sirusi 0
    READ PNT '** スタンプの方向を入力します。上向きは上、左向きは左 下向きは下 右向きは右の位置をクリック。(斜め上は、数値入力/斜め下は位置指示) **' RUBBER_LINE Point00 Point01

    LET Direction (ANG (Point01 - Point00))
    LET Direction (Direction * Angle_unit)        {ラディアンへ変換}
    Ma_figure_direction Direction                 {方向判断}

{ 角度値入力(ラディアン)}
    IF (Gl_fruit = 1)                             {右向きなら}
      LET Angle (-PI / 2 / Angle_unit)
    ELSE_IF (Gl_fruit = 3)                        {上向きなら}
      LET Angle 0
    ELSE_IF (Gl_fruit = 5)                        {左向きなら}
      LET Angle (PI / 2 / Angle_unit)
    ELSE_IF (Gl_fruit = 7)                        {下向きなら}
      LET Angle (PI / Angle_unit)
    ELSE_IF ((Gl_fruit = 2) OR (Gl_fruit = 4))    {角度入力なら}
      READ NUMBER STRING "** 描画角度を入力して下さい。(入力方法変更なら '+++' を入力。) **" DEFAULT 0 Angle
      IF ((TYPE Angle) = STRING)
        LET Sirusi 1                              {入力方法変更なら}
      END_IF 


    ELSE

      READ PNT STRING "** 描画の基準指示線を入力します。(入力方法変更なら '+++' を入力。) **" RUBBER_LINE Point00 Point01
      IF ((TYPE Point01) = PNT)
        LET Angle (ANG (Point01 - Point00))
      ELSE
        LET Sirusi 1                              {入力方法変更なら}
      END_IF 


    END_IF

  EXIT_IF (Sirusi = 0)
  END_LOOP


  LET Gl_fruit Angle

END_DEFINE



スタンプ・描画

 2003.01.31
}
DEFINE Ma_stamp_draw
  LOCAL Env_dir                                   {現在のカレントパス}
  LOCAL File_name                                 {スタンプ収納ファイル名}
  LOCAL Volume_file                               {カレントバスのファイルの数}
  LOCAL Count                                     {カウント}
  LOCAL Stamp_name                                {スタンプ名}
  LOCAL Stampdata_line                            {スタンプデーの位置}
  LOCAL Line_number                               {スタンプ名の行位置}
  LOCAL Size                                      {大きさ}
  LOCAL Spin                                      {回転角度}
  LOCAL Absolute                                  {絶対値描画}
  LOCAL Center                                    {描画中心}


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

{スタンプファイルの指定}
  Fbt_dtabs_all_on 0                              {ファイル一覧の表示}

  READ STRING "** スタンプデータの'ファイル名'を入力して下さい。**" File_name
  LOOP
    Ma_stamp_get_filename File_name               {パス名からファイル名を切り出す}
    LET File_name Gl_fruit
    LET Volume_file (LTAB_ROWS 'FBT_FTAB')        {カレントバスのファイルの数}
    LET Count 1                                   {カウンターのセット}
    LOOP
    EXIT_IF ((LWC (READ_LTAB 'FBT_FTAB' Count 1)) = (LWC File_name))
    EXIT_IF (Count = Volume_file)                 {ファィルがなければ}
      LET Count (Count + 1)
    END_LOOP 


  EXIT_IF (Count <> Volume_file)                  {ファィルが有れば}

    READ STRING "** 指定のファイルが見つかりません。'ファイル名'を再入力して下さい。(終了は、'***'を入力。) **" DEFAULT '***' File_name
    IF (File_name = '***')
      FBROWSER UNMAP_ALL                          {ファイル一覧の消去}
      CANCEL
    END_IF

 
  END_LOOP 


  FBROWSER UNMAP_ALL                              {ファイル一覧の消去}

  Ma_stamp_list_data_up File_name 1               {リストデータの作成}
  Ma_stamp_list_frame_on                          {リストデータの表示}
  LET Stamp_name ''
{ スタンプの指定}
  READ STRING '** スタンプの名前を入力して下さい。(大文字、小文字は区別されます。) **' Stamp_name

  LET Stampdata_line -1                           {名称の合致位置を合致しないにセット}

  OPEN_INFILE 1 File_name                         {既存スタンプファィルのオープン}
  LOOP
    Ma_stamp_get_agree_title 1 Stamp_name         {同じ名称があるか?}
  EXIT_IF (Gl_fruit > 0)                          {合致の名称があるなら}
    READ STRING "** スタンプ名が見つかりません。別の名前を入力して下さい。(大文字、小文字は区別されます。終了は、'***'を入力。) **" DEFAULT Stamp_name Stamp_name
    IF (Stamp_name = '***')
      CLOSE_FILE 1                                {スタンプファィルのクローズ}
      CANCEL
    END_IF 


  END_LOOP

  LET Line_number Gl_fruit                        {名称の合致位置 0=合致しない}
  CLOSE_FILE 1                                    {スタンプファィルのクローズ}
  Ma_stamp_list_frame_off                         {リストデータの削除}

{ 倍率の指定}
  LOOP
    READ NUMBER '** スタンプの描画倍率を入力して下さい。終了は[ESC]キーを入力。) **' Size
  EXIT_IF (Size <> 0)
  END_LOOP


{ 描画方法・相対/絶対}
  READ NUMBER '** スタンプの描画方法を入力して下さい。(0=絶対サイズ 1=相対サイズ終了は[ESC]キーを入力。) **' Absolute

  IF (Absolute = 0)
    INQ_ENV 6
    LET Absolute (INQ 4)
  ELSE
    LET Absolute 1
  END_IF


{ 描画}
  LOOP
    READ PNT '** スタンプの描画位置を指示して下さい。(終了は[ESC]キーを入力。)  **' Center  {描画位置の取得}
    Ma_stamp_draw_pointin Center                  {描画角度の入力}
    LET Spin Gl_fruit
    OPEN_INFILE 1 File_name                       {スタンプファィルのオープン}
    CURRENT_DIRECTORY Env_dir                     {カレントパスの復元}
    Ma_stamp_draw_main 1 Line_number Center Size Spin Absolute  {スタンプの描画}
    CLOSE_FILE 1                                  {スタンプファィルのクローズ}
  END_LOOP


END_DEFINE



スタンプ・リスト枠の消去

 2003.02.05
}
DEFINE Ma_stamp_list_frame_off
  LOCAL Table_display                             {表示用データのテーブル名}
  LOCAL Table_name


  LET Table_display '##Stamp_display##'           {表示用データのテーブル名}
  LET Table_name 'layout_stamp_01'

  SHOW_TABLE OFF Table_name                       {枠の消去}
  DELETE_TABLE Table_name                         {枠のテーブル削除}
  DELETE_LTAB Table_display                       {表示用データのテーブル削除}

END_DEFINE



スタンプ・合致する、スタンプ名の行位置

 2003.01.31
}
DEFINE Ma_stamp_get_agree_title
{ 戻りデータ 有った=No 無かった=0
}
  PARAMETER Id                                    {ファィルのID}
  PARAMETER Stamp_name                            {スタンプの名前}


  LOCAL Line_number                               {データの行数}
  LOCAL Check_data                                {比較用データ}
  LOCAL Data00                                    {1行のデータ}
  LOCAL Data01                                    {行の区別番号}
  LOCAL Data02                                    {スタンプ名称}
  LOCAL Sirusi                                    {抜けだしの印}


  Ma_data_line_jump Id 4                          {データの頭出し}
  LET Line_number 4                               {データの行}

  LET Check_data ('0,' + Stamp_name)              {スタンプ名行のデータ}
  LET Sirusi 0

  LOOP
    READ_FILE 1 Data00                            {データの1行取得}
    LET Line_number (Line_number + 1)

    IF (Data00 = 'END-OF- FILE')                   {合う名称が無い}
      LET Sirusi 1
    ELSE_IF (Data00 = '')

    ELSE_IF ((POS Data00 '-1') = 1)               {最後なら}
      LET Sirusi 1
    ELSE_IF ((POS Data00 Check_data) = 1)         {合えば}
      LET Sirusi 2
    END_IF


  EXIT_IF (Sirusi > 0)
  END_LOOP


  IF (Sirusi = 1)
    LET Gl_fruit 0
  ELSE                                            {合えば}
    LET Gl_fruit Line_number
  END_IF


END_DEFINE



スタンプ・枠の内容定義

 2003.02.05
}
DEFINE Stamp_frame_display_01
  PARAMETER File_name                             {ファィル名}


  LOCAL Frame_name                                {パーツ検索枠のテーブル名}
  LOCAL Table_display                             {表示用データのテーブル名}
  LOCAL Table_select                              {検索データのテーブル名}


  LET Frame_name 'layout_stamp_01'                {表示テーブル名}
  LET Table_display '##Stamp_display##'           {表示用データのテーブル名}

{タイトル行部分}
  Table_control_icons Frame_name                  {タイトル行の記号枠内を記入}
  WRITE_LTAB Table_display TITLE 1 Menu_delete_icon {タイトル行の1番枠内に削除記号[0] を記入}

  TABLE_TITLE Frame_name
    Pbt_head_fg Pbt_head_bg CENTER 'スタンプリスト' '' 1 3
    Pbt_head_fg Pbt_title_bg1 CENTER '' '' 2 1    {二重線内の色付け}
    Pbt_title_fg Pbt_title_bg1 LEFT 'ファイル名' '' 3 1
    CENTER File_name '' 3 2  {ファィル名}
    Pbt_title_fg Pbt_title_bg1 CENTER '' '' 4 1   {二重線内の色付け}
    Pbt_title_fg Pbt_title_bg1 CENTER '番号' '' 5 1
    Pbt_title_fg Pbt_title_bg1 CENTER 'スタンプ名' '' 5 2
  END

{データ行部分}
  TABLE_COLUMN Frame_name
    COLUMN 1 1 Pbt_data_fg Pbt_data_bg CENTER '"@v3"'   {番号}
    COLUMN 2 3 Pbt_data_fg Pbt_data_bg LEFT '"@v3"'     {スタンプ名}
  END

END_DEFINE



スタンプ・枠の定義

2003.02.05
}
DEFINE Stamp_frame_layout_01
  LOCAL Table_display                             {表示用データのテーブル名}


  LET Table_display '##Stamp_display##'           {表示用データのテーブル名}
  TRAP_ERROR
  TABLE_LAYOUT 'layout_stamp_01' Table_display    {表示テーブル名/データテーブル名}
  IF (NOT CHECK_ERROR)
    Bcol1 Bcol0                                   {表示色・背景色}
    ROWS 15                                       {行数}
    FRAME_WIDTH 5
    HORIZONTAL SOLID WHITE                        {水平枠}
    VERTICAL SOLID WHITE                          {鉛直枠}
    SCROLL_BAR Bcol1 Bcol1                        {スクロールバー}

    TITLE_LAYOUT
      (Headline_height+1) ' | |タイト ル                                  | '
      4                  '                                                '
      (Headline_height+1) 'ファイル名|1234567890123456789012345678901234567'
      4                  '                                                '
      (Headline_height+1) '番号  |スタンプ 名                               ' END
    COLUMN_LAYOUT
      (Headline_height+1) '9999  |12345678901234567890123456789012345678901' END
  END_IF 


END_DEFINE



スタンプ・リスト枠の表示

 2003.02.05
}
DEFINE Ma_stamp_list_frame_on
  LOCAL Table_display                             {表示用データのテーブル名}
  LOCAL Table_name                                {表示枠の名前}


  LET Table_display '##Stamp_display##'           {表示用データのテーブル名}
  LET Table_name 'layout_stamp_01'                {表示枠の名前}
  Stamp_frame_layout_01                           {枠の内容定義}
  Stamp_frame_display_01 'SAMPLE'                 {表示データの作成}
  SHOW_TABLE ON Table_name                        {枠の表示}
  MOVE_TABLE Table_name LOWER LEFT END            {枠の表示位置/下の右}

END_DEFINE



スタンプ・リストデータの作成

 2003.02.05
}
DEFINE Ma_stamp_list_data_up
  PARAMETER File_name                             {スタンプファイル名}
  PARAMETER Handler                               {使用ファイル番号}


  LOCAL Table_display                             {表示用データのテーブル名}
  LOCAL Table_list                                {スタンプリストのテーブル名}
  LOCAL Sirusi                                    {抜け出しの印}
  LOCAL Row_max                                   {登録スタンプ数}
  LOCAL Data00                                    {処理データ}
  LOCAL Row_no                                    {テーブルの行位置}
  LOCAL Data01                                    {処理データ}


  LET Table_list '##Stamp_list##'                 {スタンプリストのテーブル名}
  LET Table_display '##Stamp_display##'           {表示用データのテーブル名}

{ 登録スタンプ数の算出}
  OPEN_INFILE Handler File_name                   {既存スタンプファィルのオープン}
  LET Row_max 0                                   {カウントの初期化}
  Ma_data_line_jump Handler 4                     {データの頭出し}
  LET Sirusi 0                                    {抜け出しの印}
  LOOP
    READ_FILE 1 Data00                            {データの1行取得}
    IF (Data00 = 'END-OF- FILE')                   {合う名称が無い}
      LET Sirusi 1
    ELSE_IF ((POS Data00 '-1') = 1)               {最後なら}
      LET Sirusi 1
    ELSE_IF ((POS Data00 '0,') = 1)               {合えば}
      LET Row_max (Row_max + 1)
    END_IF 


  EXIT_IF (Sirusi > 0)

  END_LOOP


  IF (Row_max <> 0)                               {データが有れば}
    CREATE_LTAB (Row_max + 1) 2 Table_list        {スタンプリストのテーブル確保}
    OPEN_INFILE Handler File_name                 {既存スタンプファィルのオープン}

    Ma_data_line_jump Handler 4                   {データの頭出し}
    LET Sirusi 0                                  {抜け出しの印}
    LET Row_no 1                                  {スタンプの数}
{   スタンプ名の処理}
    LOOP
      READ_FILE 1 Data00                          {データの1行取得}
      IF (Data00 = 'END-OF- FILE')                 {合う名称が無い}
        LET Sirusi 1
      ELSE_IF ((POS Data00 '-1') = 1)             {最後なら}
       LET Sirusi 1
      ELSE_IF ((POS Data00 '0,') = 1)             {合えば}
        WRITE_LTAB Table_list Row_no 1 Row_no     {番号}
        LET Data01 (SUBSTR Data00 3 ((LEN Data00) - 2))   {スタンプ名の取得}
        WRITE_LTAB Table_list Row_no 2 Data01     {書き込み}
        LET Row_no (Row_no + 1)
      END_IF 


    EXIT_IF (Sirusi= 1)

      DISPLAY_NO_WAIT Row_no                      {動作表示}
    END_LOOP 


    CLOSE_FILE Handler

    CREATE_LTAB 3 Row_max Table_display           {表示用データのテーブル確保}
    SORT_LTAB Table_list 2 CONFIRM                {リストのソート(名前基準)}

{   表示用テーブルのデータ作成}
    LET Row_no 1                                  {スタンプの数}
    LOOP
      WRITE_LTAB Table_display Row_no 1 Row_no    {行番号}
      WRITE_LTAB Table_display Row_no 2 (READ_LTAB Table_list Row_no 1)  {スタンプの番号}
      WRITE_LTAB Table_display Row_no 3 (READ_LTAB Table_list Row_no 2)  {スタンプ名}
    EXIT_IF (Row_no = Row_max)
      LET Row_no (Row_no + 1)
    END_LOOP 


  ELSE

    CREATE_LTAB 3 Row_max Table_display           {表示用データのテーブル確保}
    WRITE_LTAB Table_display 1 1 1                {行番号}
    WRITE_LTAB Table_display 1 2 0                {スタンプの番号}
    WRITE_LTAB Table_display 1 3 '** スタンプの登録は有りません。**'  {スタンプ名}
  END_IF


  DELETE_LTAB Table_list                          {スタンプリストテーブルの削除}

END_DEFINE



スタンプ・保存・テキスト データを文字列データに変換

 2003.01.31
}
DEFINE Ma_stamp_text_to_string
  PARAMETER Quotation                             {" 又は ' (含まれている引用符)}
  PARAMETER Data00                                {テキストデータ}


  LOCAL Position                                  {引用符の位置}


  IF (Quotation = '"')                            {" なら}
    LET Gl_fruit ''
  ELSE
    LET Gl_fruit ""
  END_IF


  LOOP
    LET Position (POS Data00 Quotation)
  EXIT_IF (Position = 0)                          {含まれていなければ}
    LET Gl_fruit (Gl_fruit + (SUBSTR Data00 1 Position))
    LET Data00 (SUBSTR Data00 (Position + 1) ((LEN Data00) - Position))
  END_LOOP


  LET Gl_fruit (Gl_fruit + Data00)                {残りを移す}

END_DEFINE



スタンプ・変換・線種データ→文字列

 2003.01.31
}
DEFINE Ma_stamp_convert_linetype_word
{ 線種データ
  SOLID             : '11111111111111111111111111111111' 実線
  DASHED            : '11111111000000001111111100000000' 短破線
  LONG_DASHED       : '11111111111000001111111111100000' 長破線
  DOT_CENTER        : '11111111111110101111111111111010' 短一点鎖線
  DASH_CENTER       : '11111111111101101111111111110110' 長一点鎖線
  PHANTOM           : '11111111111010101111111111101010' 短二点鎖線
  CENTER_DASH_DASH  : '11111111110101101111111111010110' 長二点鎖線
  DOTTED            : '10101010101010101010101010101010' 点線
}

  PARAMETER Linetype                              {線種}

  IF (Linetype = '11111111111111111111111111111111')
    LET Gl_fruit 'SOLID'
  ELSE_IF (Linetype = '11111111000000001111111100000000')
    LET Gl_fruit 'DASHED'
  ELSE_IF (Linetype = '11111111111000001111111111100000')
    LET Gl_fruit 'LONG_DASHED'
  ELSE_IF (Linetype = '11111111111110101111111111111010')
    LET Gl_fruit 'DOT_CENTER'
  ELSE_IF (Linetype = '11111111111101101111111111110110')
    LET Gl_fruit 'DASH_CENTER'
  ELSE_IF (Linetype = '11111111111010101111111111101010')
    LET Gl_fruit 'PHANTOM'
  ELSE_IF (Linetype = '11111111110101101111111111010110')
    LET Gl_fruit 'CENTER_DASH_DASH'
  ELSE_IF (Linetype = '10101010101010101010101010101010')
    LET Gl_fruit 'DOTTED'
  ELSE
    LET Gl_fruit ''
  END_IF


END_DEFINE



スタンプ・保存・文字列の置き換え

 2003.01.31
}
DEFINE Ma_stamp_string_data_change
  PARAMETER String_data                           {処理文字列}
  PARAMETER Letter00                              {変更文字列}
  PARAMETER Letter01                              {新文字列}


  LOCAL Position                                  {元の文字位置}
  LOCAL Length00                                  {処理文字長}
  LOCAL Length01                                  {変更文字長}


  LET Length00 (LEN String_data)                  {処理文字長}
  LET Length01 (LEN Letter00)                     {変更文字長}

  LET Gl_fruit ''                                 {初期化}

  LOOP
    LET Position (POS String_data Letter00)
  EXIT_IF (Position = 0)                          {含まれていなければ}
{   処理済みデータ分と新文字列を移す}
    IF (Position = 1)                             {最初に位置しているなら}
      LET Gl_fruit (Gl_fruit + Letter01)
    ELSE
      LET Gl_fruit (Gl_fruit + ((SUBSTR String_data 1 (Position - 1)) + Letter01))
    END_IF


{   残りのデータ}
    LET String_data (SUBSTR String_data (Position + Length01) ((LEN String_data) - Position - (Length01 - 1)))
  END_LOOP


  LET Gl_fruit (Gl_fruit + String_data)           {残りを移す}

END_DEFINE



スタンプ・パス名からファイル名を切り出す

 2003.01.31
}
DEFINE Ma_stamp_get_filename
  PARAMETER Passname 


  LOCAL Position                                  {位置}

  LOOP
    LET Position (POS Passname '/')
  EXIT_IF (Position = 0)
    LET Passname (SUBSTR Passname (Position + 1) ((LEN Passname) - Position))
  END_LOOP


  LET Gl_fruit Passname

END_DEFINE



スタンプ・保存・要素データの作成

 2003.01.31
}
DEFINE Ma_stamp_write_data_element
{ INQ_ELEMで、要素が決まってから、このルーチンを呼び出すこと。
  サポートしないコマンド
    C_LINE、C_CIRCLE(下書き線)
    DIM関係(寸法)
    CENTERLINE(中心線)/線でサポート
    LEADER_LINE(引き出し線)
    REFLINE(参照線)
    INIT_PART(子パーツ)
  角度の単位は、ラディアンです。
  TEXTとBSPLINEの戻り通函は、データベースです。(Gl_fruit_ltab)
  戻り値(Gl_fruit)には、戻り通函の名前'Gl_fruit_ltab'が入っています。
  それ以外の戻り値は、(Gl_fruit)です。
}

  PARAMETER Declination                           {スタンプ原点への偏差}
  PARAMETER Angle_unit                            {ラディアンへの変換値}


  LOCAL Declination_x                             {偏差のX値}
  LOCAL Declination_y                             {偏差のY値}
  LOCAL String_max                                {文字列の限界設定}
  LOCAL Bowl01                                    {線色}
  LOCAL Bowl02                                    {線種}
  LOCAL Bowl04                                    {加工中データ}
  LOCAL Bowl03                                    {加工中データ}
  LOCAL Number_row                                {データべーの行値}
  LOCAL After                                     {追加データを加える}
  LOCAL Number                                    {数}
  LOCAL Position                                  {位置}


  LET Declination_x (X_OF Declination)            {偏差のX値}
  LET Declination_y (Y_OF Declination)            {偏差のY値}

  LET String_max 200                              {文字列の限界設定}
  LET Bowl01 (INQ 201)                            {線色}
  LET Bowl01 (STR Bowl01)
  LET Bowl01 ('RGB_COLOR ' + Bowl01)

  Ma_stamp_string_data_change Bowl01 ',' ' '      {カンマをスペースに取り替え}
  LET Bowl01 Gl_fruit

  LET Bowl02 (INQ 301)                            {線種}
  Ma_stamp_convert_linetype_word Bowl02
  LET Bowl02 Gl_fruit

  IF ((INQ 403) = POINT)                          {点}
    LET Bowl04 ('POINT' + ' ' + Bowl01 + ' ' + Bowl02)

    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 101) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl04 (Bowl04 + ' END')

  ELSE_IF ((INQ 403) = LINE)                      {線}
    LET Bowl04 ('LINE' + ' ' + Bowl01 + ' ' + Bowl02)
    LET Bowl04 (Bowl04 + ' TWO_PTS')

    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 101) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 102) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl04 (Bowl04 + ' END')

  ELSE_IF ((INQ 403) = CIRCLE)                    {円}
    LET Bowl04 ('CIRCLE' + ' ' + Bowl01 + ' ' + Bowl02)
    LET Bowl04 (Bowl04 + ' CENTER')

    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 101) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 102) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl04 (Bowl04 + ' END')

  ELSE_IF ((INQ 403) = ARC)                       {円弧}
    LET Bowl04 ('ARC' + ' ' + Bowl01 + ' ' + Bowl02)
    LET Bowl04 (Bowl04 + ' CEN_BEG_END')

    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 101) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 102) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 103) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl04 (Bowl04 + ' END')

  ELSE_IF ((INQ 403) = FILLET)                    {フィレット}
    LET Bowl04 ('FILLET' + ' ' + Bowl01 + ' ' + Bowl02)
    LET Bowl04 (Bowl04 + ' LITERAL')

    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 101) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 102) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 103) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl04 (Bowl04 + ' END')

  ELSE_IF ((INQ 403) = TEXT)                      {テキスト}
{ 戻り通函のカラム1に格納
  最後は、カラム1のデータが無い
}
    CREATE_LTAB 10 1 'Gl_fruit_ltab'              {戻りテーブルの作成}
    LET Number_row 1
    LET Bowl04 ('TEXT' + ' ' + Bowl01 + ' ' + Bowl02)
    LET Bowl04 (Bowl04
 + ' TEXT_ADJUST ' + (STR (INQ 3))
 + ' TEXT_LINESPACE ' + (STR (INQ 4))
 + ' TEXT_RATIO ' + (STR (INQ 5))
 + ' TEXT_SIZE ' + (STR (INQ 6))
 + ' TEXT_SLANT ' + (STR ((INQ 7) * Angle_unit))
 + ' TEXT_ANGLE ' + (STR ((INQ 8) * Angle_unit))
 + ' TEXT_FRAME ' + (STR (INQ 601))
 + ' TEXT_FILL ' + (STR (INQ 602))
)

    WRITE_LTAB 'Gl_fruit_ltab' Number_row 1 Bowl04  {書き込み}
    LET Number_row (Number_row + 1)               {次}

    LET Bowl03 (INQ 902)
    IF ((LEN Bowl03) < 511)                       {長さが適切なら}
      Ma_stamp_text_to_string "'" Bowl03          {引用符の文字列化}
      LET Bowl04 (" '" + Gl_fruit)

      LOOP
      EXIT_IF ((LEN Bowl04) < 250)
        WRITE_LTAB 'Gl_fruit_ltab' Number_row 1 (SUBSTR Bowl04 1 250)
        LET Number_row (Number_row + 1)           {次}
        LET Bowl04 (SUBSTR Bowl04 251 ((LEN Bowl04) - 250))
      END_LOOP
 
    ELSE
      DISPLAY '** 一行の文字列の長さが、500(半角)を越えています。マクロを停止します。**'
      CANCEL                                      {マクロを停止}
    END_IF


    LOOP
      LET Bowl03 (INQ 903)                        {次の行データ}
    EXIT_IF (Bowl03 = 'END-OF-LIST')
      IF ((LEN Bowl03) < 511)                     {長さが適切なら}
        Ma_stamp_text_to_string "'" Bowl03        {引用符の文字列化}
        LET Bowl04 (Bowl04 + "' '" + Gl_fruit)

        LOOP
        EXIT_IF ((LEN Bowl04) < 250)
          WRITE_LTAB 'Gl_fruit_ltab' Number_row 1 (SUBSTR Bowl04 1 250)
          LET Number_row (Number_row + 1)         {次}
          LET Bowl04 (SUBSTR Bowl04 251 ((LEN Bowl04) - 250))
        END_LOOP
 
      ELSE
        DISPLAY '** 一行の文字列の長さが、500(半角)を越えています。マクロを停止します。**'
        CANCEL                                    {マクロを停止}
      END_IF 


    END_LOOP

    LOOP
    EXIT_IF ((LEN Bowl04) < 250)
      WRITE_LTAB 'Gl_fruit_ltab' Number_row 1 (SUBSTR Bowl04 1 250)
      LET Number_row (Number_row + 1)             {次}
      LET Bowl04 (SUBSTR Bowl04 251 ((LEN Bowl04) - 250))
    END_LOOP
 
    IF ((LEN Bowl04) > 0)                         {データが有れば}
      LET Bowl04 (Bowl04 + "'")
      WRITE_LTAB 'Gl_fruit_ltab' Number_row 1 Bowl04
      LET Number_row (Number_row + 1)             {次}
    END_IF


    LET Bowl04 (' (PNT_XY ' + (STR ((INQ 101) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl04 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Gl_fruit + ' END')
    WRITE_LTAB 'Gl_fruit_ltab' Number_row 1 Bowl04

    LET Bowl04 'Gl_fruit_ltab'

  ELSE_IF ((INQ 403) = BSPLINE)                   {Bスプライン}
{ 戻り通函のカラム1に格納
  最後は、カラム1のデータが無い
}

    CREATE_LTAB 10 1 'Gl_fruit_ltab'              {戻りテーブルの作成}
    LET Bowl03 ('BSPLINE' + ' ' + Bowl01 + ' ' + Bowl02)

    IF ((READ_LTAB 'BSpline_basic_table' TITLE 6) = 0)  {オープンなら}
      LET Bowl03 (Bowl03 + ' OPEN')
      LET After 0
    ELSE
      LET Bowl03 (Bowl03 + ' CLOSED')
      LET After 1                                 {原点データを加える}
    END_IF


    LET Bowl03 (Bowl03 + ' ORDER ' + (STR (READ_LTAB 'BSpline_basic_table' TITLE 1)))  {曲線の次数}
    LET Number (READ_LTAB 'BSpline_basic_table' TITLE 4)  {補間点の数}
    LET Position 1
    LET Number_row 1                              {戻りデータベースの行値}

    LOOP
      LOOP
        IF (Position <= Number)
          LET Bowl04 (' (PNT_XY'
 + ' ' + (STR ((READ_LTAB 'BSpline_basic_table' Position 3) - Declination_x))  {補間点のX座標}
 + ' ' + (STR ((READ_LTAB 'BSpline_basic_table' Position 4) - Declination_y))  {補間点のY座標}
 + ')'
 )
        ELSE                                      {原点への戻りデータの処理}
          LET Bowl04 (' (PNT_XY'
 + ' ' + (STR ((READ_LTAB 'BSpline_basic_table' 1 3) - Declination_x))  {補間点のX座標}
 + ' ' + (STR ((READ_LTAB 'BSpline_basic_table' 1 4) - Declination_y))  {補間点のY座標}
 + ')'
 )
          LET After 0
        END_IF


        LET Bowl03 (Bowl03 + Bowl04)
        LET Position (Position + 1)
      EXIT_IF (((Position > Number) AND (After = 0)) OR ((LEN Bowl03) > String_max))

      END_LOOP 


    EXIT_IF ((Position > Number) AND (After = 0))

      WRITE_LTAB 'Gl_fruit_ltab' Number_row 1 Bowl03  {書き込み}

      LET Bowl03 ''
      LET Number_row (Number_row + 1)             {次}
    END_LOOP


    LET Bowl03 (Bowl03 + ' END')
    WRITE_LTAB 'Gl_fruit_ltab' Number_row 1 Bowl03  {書き込み}
    LET Bowl04 'Gl_fruit_ltab'

  ELSE_IF ((INQ 403) = CENTERLINE)                {中心線}
    LET Bowl04 ('LINE' + ' ' + Bowl01 + ' ' + Bowl02)
    LET Bowl04 (Bowl04 + ' TWO_PTS')
{   センター線1}
    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 102) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 103) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
{   センター線2}
    LET Bowl03 (' TWO_PTS (PNT_XY ' + (STR ((INQ 104) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl03 (' (PNT_XY ' + (STR ((INQ 105) - Declination)) + ')')
    Ma_stamp_string_data_change Bowl03 ',' ' '    {カンマをスペースに取り替え}
    LET Bowl04 (Bowl04 + Gl_fruit)
    LET Bowl04 (Bowl04 + ' END')

  ELSE_IF ((INQ 403) = SYMLINE)                   {対称線}
    IF ((INQ 6) = 0)                              {線分の対称線なら}
      LET Bowl04 ('LINE' + ' ' + Bowl01 + ' ' + Bowl02)
      LET Bowl04 (Bowl04 + ' TWO_PTS')

      LET Bowl03 (' (PNT_XY ' + (STR ((INQ 101) - Declination)) + ')')
      Ma_stamp_string_data_change Bowl03 ',' ' '  {カンマをスペースに取り替え}
      LET Bowl04 (Bowl04 + Gl_fruit)
      LET Bowl03 (' (PNT_XY ' + (STR ((INQ 102) - Declination)) + ')')
      Ma_stamp_string_data_change Bowl03 ',' ' '  {カンマをスペースに取り替え}
      LET Bowl04 (Bowl04 + Gl_fruit)
      LET Bowl03 (Bowl04 + ' END')
    ELSE                                          {円の対称線なら}
      LET Bowl04 ('CIRCLE' + ' ' + Bowl01 + ' ' + Bowl02)
      LET Bowl04 (Bowl04 + ' CENTER')

      LET Bowl03 (' (PNT_XY ' + (STR ((INQ 101) - Declination)) + ')')
      Ma_stamp_string_data_change Bowl03 ',' ' '  {カンマをスペースに取り替え}
      LET Bowl04 (Bowl04 + Gl_fruit)
      LET Bowl03 (' (PNT_XY ' + (STR ((INQ 102) - Declination)) + ')')
      Ma_stamp_string_data_change Bowl03 ',' ' '  {カンマをスペースに取り替え}
      LET Bowl04 (Bowl04 + Gl_fruit)
      LET Bowl03 (Bowl04 + ' END')
    END_IF


  ELSE                                            {その他}
    LET Bowl04 ''
  END_IF


  LET Gl_fruit Bowl04                             {戻り値}

END_DEFINE



スタンプ・制作、格納

 2003.01.31-2003.02.01
}
DEFINE Ma_stamp_make
  LOCAL Env_dir                                   {現在のカレントパス}
  LOCAL Angle_unit                                {ラディアンへの変換値}
  LOCAL Content                                   {要素の有無 0=無し}
  LOCAL File_name                                 {格納ファイル名}
  LOCAL Volume_file                               {カレントバスのファイルの数}
  LOCAL Count                                     {既存スタンプファイルの行カウンタ}
  LOCAL Stock                                     {既存スタンプファイル 無=0 有=1}
  LOCAL Basket                                    {通いのデータ}
  LOCAL Stamp_name                                {スタンプの名前}
  LOCAL Stampdata_line                            {既存のスタンプデータの位置}
  LOCAL Change_name                               {スタンプの交換名}
  LOCAL Point_center                              {スタンプの中心位置}
  LOCAL Stampend                                  {スタンプデータの終わり}
  LOCAL Sirusi                                    {抜けだし用のデータ}
  LOCAL Endline                                   {終了記号行のデータ} 

  LOCAL Number_row                                {データべーの行値}


  DISPLAY '** スタンプデータを変換作成します。(カレント・パーツのデータを処理して、指定のファイルに格納します。)**'

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

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

  INQ_SELECTED_ELEM ALL                           {要素データの呼び出し}
  LET Content 0                                   {要素有無の確認をリセット}
{スタンプ用の要素が掻かれているか?}
  LOOP
    Ma_stamp_write_data_element (PNT_XY 0 0) Angle_unit  {要素データの作成}
  EXIT_IF (Gl_fruit <> '')                        {変換可能要素が存在}
    IF ((INQ 14) = 1)                             {変換可能要素が無ければ}
      DISPLAY '** カレントパーツに、スタンプに変換できる要素が有りません。 **'
      CANCEL                                      {終了}
    END_IF 


    INQ_NEXT_ELEM

  END_LOOP 


  Fbt_dtabs_all_on 0                              {ファイル一覧の表示}

  READ STRING "** スタンプを格納する'ファイル名'を入力して下さい。**" File_name
  Ma_stamp_get_filename File_name                 {パス名からファイル名を切り出す}
  LET File_name Gl_fruit
  LET Volume_file (LTAB_ROWS 'FBT_FTAB')          {カレントバスのファイルの数}

  LET Count 1                                     {カウンターのセット}
  LET Stock 0                                     {既存ファィルの有無}
  LOOP
    IF ((LWC (READ_LTAB 'FBT_FTAB' Count 1)) = (LWC File_name))  {ファイルが有るなら}
      OPEN_INFILE 1 File_name                     {既存スタンプファィルのオープン}
      READ_FILE 1 Basket                          {1行目を読み出し}
      IF ((POS Basket '"スタンプデータのファイル"') = 1)  {スタンプファイルなら}
        LET Stock 1                               {既存ファイル有りの印}
      ELSE
        CLOSE_FILE 1
        READ STRING "** 指示されたファイルは、スタンプファイルでは有りません。'ファイル名'を入力して下さい。**" File_name
        Ma_stamp_get_filename File_name           {パス名からファイル名を切り出す}
        LET File_name Gl_fruit
        LET Count 0                               {カウンターのセット}
      END_IF
 
    END_IF 


  EXIT_IF ((Count= Volume_file) OR (Stock = 1))

    LET Count (Count + 1)
  END_LOOP 


  FBROWSER UNMAP_ALL                              {ファイル一覧の消去}

  IF (Stock = 1)                                  {既存スタンプファイルが存在するなら}
    Ma_stamp_list_data_up File_name 1             {リストデータの作成}
    Ma_stamp_list_frame_on                        {リストデータの表示}
  END_IF


  READ STRING '** スタンプの名前を入力して下さい。(大文字、小文字は区別されます。) **' Stamp_name
  LET Stampdata_line -1                           {名称の合致位置を合致しないにセット}
  IF ((LEN Stamp_name) > 40)                      {40文字以上なら}
    LET Stamp_name (SUBSTR Stamp_name 1 40)
  END_IF


  IF (Stock = 1)                                  {既存スタンプファイルが存在するなら}
    LOOP
      OPEN_INFILE 1 File_name                     {既存スタンプファィルのオープン}
      Ma_stamp_get_agree_title 1 Stamp_name       {同じ名称があるか?}
    EXIT_IF (Gl_fruit = 0)                        {合致の名称が無いなら}
      READ STRING "** 同じスタンプの名称が使われています。次の動作を指示して下さい。(上書き作成は、'+++'を入力。別のスタンプの名前を入力。終了は[ESC]キー入力。**" DEFAULT Stamp_name Change_name
    EXIT_IF (Change_name = '+++')                 {スタンプの上書きなら}
      LET Stamp_name Change_name                  {新しいスタンプ名}
    END_LOOP


    LET Stampdata_line Gl_fruit                   {名称の合致位置 0=合致しない}
    Ma_stamp_list_frame_off                       {リストデータの削除}
    OPEN_INFILE 1 File_name                       {既存スタンプファィルのオープン}
  END_IF


  READ PNT '** スタンプの中心位置を指示して下さい。**' Point_center

  OPEN_OUTFILE 2 DEL_OLD 'Gl_fruit_file'          {仮ファィルを上書きでセット}
{ データのコピー}
  LET Count 1                                     {既存ファイルの行カウンターのセット}
  LET Stampend 0                                  {スタンプデータの終わりではない}
  LET Sirusi 0                                    {抜けだし用のデータ}
  LOOP
    IF (Stock = 1)                                {既存スタンプファイルが存在するなら}
      READ_FILE 1 Basket                          {1行の読み出し}

      IF (Basket = 'END-OF- FILE')                 {既存スタンプファイルの読み込み終了}
        LET Stock 0
        CLOSE_FILE 1                              {既存スタンプファイルを閉じる}
      ELSE_IF ((POS Basket '-1') = 1)             {スタンプの最後なら}
        LET Stampend 1                            {スタンプデータの終わり}
        LET Endline Basket                        {記憶}
      END_IF 


    END_IF


    IF ((Stampend = 1) OR (Stock = 0))            {既存スタンプファイルが無いか、スタンプデータが無いならなら}
      IF (Count = 1)
        LET Basket '"スタンプデータのファイル","内容の編集には充分に、気を付けて下さい。"'
      ELSE_IF (Count = 2)
        LET Basket '"メモの行です1。"'
      ELSE_IF (Count = 3)
        LET Basket '"メモの行です2。"'
      ELSE_IF (Count = 4)
        LET Basket '"今後の為に予約した行です。(いつになるやら)"'
      END_IF 


    END_IF


{   抜け出しデータの作成}
    IF ((Stock = 0) AND (Count > 4))              {ファイルデータが無いなら}
      LET Sirusi 1
    ELSE_IF ((Stock = 1) AND (Count >= 4))
      IF (Stampend = 1)                           {スタンプデータの終了なら}
        LET Sirusi 1
      ELSE_IF ((Count >= Stampdata_line) AND (Stampdata_line <> 0))
        LET Sirusi 1
      END_IF 


    END_IF
 


  EXIT_IF (Sirusi = 1)

    IF ((Basket <> '') OR ((Basket = '') AND (Stampend = 1)))
      WRITE_FILE 2 Basket
    END_IF


    LET Count (Count + 1)                         {次}
  END_LOOP


{ 要素データの書き込み}
  WRITE_FILE 2 ('0,' + Stamp_name)                {名称行の書き込み}
  INQ_SELECTED_ELEM ALL
  LOOP
    LET Sirusi (INQ 14)                           {要素の数}
    Ma_stamp_write_data_element Point_center Angle_unit {要素データの作成}

    IF (Gl_fruit = '')                            {サポート外要素なら}
    ELSE_IF (Gl_fruit = 'Gl_fruit_ltab')          {TEXTとBSPLINEなら}
      LET Number_row 1                            {呼び出しカウントのセット}
      LOOP
        LET Basket (READ_LTAB 'Gl_fruit_ltab' Number_row 1)
      EXIT_IF (Basket = '')                       {無くなれば}
        WRITE_FILE 2 ('1,' + Basket)
        LET Number_row (Number_row + 1)
      END_LOOP
      CREATE_LTAB 'Gl_fruit_ltab'                 {戻りテーブルの最小化}

    ELSE                                          {その他の変換可能要素なら}
      WRITE_FILE 2 ('1,' + Gl_fruit)
    END_IF


  EXIT_IF (Sirusi = 1)
    INQ_NEXT_ELEM                                 {次の要素}
  END_LOOP


{ 残りのデータコピー}
  IF (Stock = 1)                                  {移すデータが有るなら}
    IF (Stampdata_line <> 0)                      {上書きなら}
{     次のデータに移動}
      LOOP
        READ_FILE 1 Basket                        {1行の読み出し}
      EXIT_IF ((POS Basket '0,') = 1)             {次のデータ}
        IF ((POS Basket '-1') = 1)
          LET Stampend 1                          {終了記号有り 0=まだ}
          LET Endline Basket                      {記憶}
        END_IF 


      EXIT_IF ((POS Basket '-1') = 1)             {スタンプの最後なら}

      EXIT_IF (Basket = 'END-OF- FILE')            {終了なら}
      END_LOOP

 
    END_IF


    IF (Stampend = 1)                             {終了記号行なら}
      LET Basket Endline                          {写しを書き込み}
    END_IF


{   残りを移す}
    LOOP
    EXIT_IF (Basket = 'END-OF- FILE')              {終了なら}
      IF ((Basket <> '') OR ((Basket = '') AND (Stampend = 1)))
        WRITE_FILE 2 Basket                       {写しを書き込み}
        IF ((POS Basket '-1') = 1)
          LET Stampend 1                          {終了記号有り 0=まだ}
        END_IF 


      END_IF
 


      READ_FILE 1 Basket                          {1行の読み出し}

    END_LOOP 


    CLOSE_FILE 1

  END_IF


  IF (Stampend = 0)                               {データ終了記号の書き込み}
    WRITE_FILE 2 "-1"
  END_IF 


  CLOSE_FILE 2

  COPY_FILE 'Gl_fruit_file' DEL_OLD File_name     {上書きの書き戻し}
  PURGE_FILE 'Gl_fruit_file' CONFIRM              {仮ファイルを削除}

  CURRENT_DIRECTORY Env_dir                       {カレントパスの復元}

END_DEFINE



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