ME10マクロのページです
(調査、確認)

2000.10.15 更新 



リスト


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

新規 1.指定点の要素は同じか? 2000.10.15
新規 2.交点の位置 2000.10.15
新規 3.直線の交点  2000.10.15



指定点の要素は同じか?
  2000.06.18
  下書き線、スプライン、寸法線は除く
  テキストは最初から2段目までで比較
  戻り値(Gl_fruit)  0=同じ
                    1=異なる
                    2=別要素が重複
                    3=サポート外
}

DEFINE Ma_element_redundance
  PARAMETER Point01
  PARAMETER Point02

  LOCAL Data403
  LOCAL Data3
  LOCAL Data4
  LOCAL Data5
  LOCAL Data6
  LOCAL Data7
  LOCAL Data8
  LOCAL Data8
  LOCAL Data101
  LOCAL Data102
  LOCAL Data103
  LOCAL Data104
  LOCAL Data105
  LOCAL Data601
  LOCAL Data602
  LOCAL Data902
  LOCAL Data903

  INQ_ELEM Point01
  LET Gl_fruit 2                                  {取りあえず別要素が重複}
  IF ((INQ 14) = 1)                               {要素が重なっていなければ}
    LET Gl_fruit 2
    IF ((INQ 403) = POINT)                        {点なら}
      IF (Point01 = Point02)
        LET Gl_fruit 0
      ELSE
        LET Gl_fruit 1
      END_IF

    ELSE_IF ((INQ 403) = LINE)                    {線なら}
      LET Data101 (INQ 101)
      LET Data102 (INQ 102)
      INQ_ELEM Point02                            {次の要素}
      IF (((INQ 403) = LINE) AND (Data101 = (INQ 101)) AND (Data102 = (INQ 102)))  {同じなら}
        LET Gl_fruit 0
      ELSE_IF ((INQ 14) = 1)
        LET Gl_fruit 1
      END_IF

    ELSE_IF ((INQ 403) = CIRCLE)                  {円なら}
      LET Data3 (INQ 3)
      LET Data101 (INQ 101)
      LET Data102 (INQ 102)
      INQ_ELEM Point02                            {次の要素}
      IF (((INQ 403) = CIRCLE) AND (Data3 = (INQ 3)) AND (Data101 = (INQ 101)) AND (Data102 = (INQ 102)))  {同じなら}
        LET Gl_fruit 0
      ELSE_IF ((INQ 14) = 1)
        LET Gl_fruit 1
      END_IF

    ELSE_IF (((INQ 403) = ARC) OR ((INQ 403) = FILLET))  {弧又はフィレットなら}
      LET Data3 (INQ 3)
      LET Data4 (INQ 4)
      LET Data5 (INQ 5)
      LET Data101 (INQ 101)
      INQ_ELEM Point02                            {次の要素}
      IF ((((INQ 403) = ARC) OR ((INQ 403) = FILLET)) AND (Data3 = (INQ 3)) AND (Data4 = (INQ 4)) AND (Data5 = (INQ 5)) AND (Data101 = (INQ 101)))  {同じなら}
        LET Gl_fruit 0
      ELSE_IF ((INQ 14) = 1)
        LET Gl_fruit 1
      END_IF

    ELSE_IF ((INQ 403) = TEXT)                    {テキストなら}
      LET Data3 (INQ 3)
      LET Data4 (INQ 4)
      LET Data5 (INQ 5)
      LET Data6 (INQ 6)
      LET Data7 (INQ 7)
      LET Data8 (INQ 8)
      LET Data101 (INQ 101)
      LET Data302 (INQ 302)
      LET Data601 (INQ 601)
      LET Data602 (INQ 602)
      LET Data902 (INQ 902)
      LET Data903 (INQ 903)
      INQ_ELEM Point02                            {次の要素}
      IF (((INQ 403) = TEXT) AND (Data3 = (INQ 3)) AND (Data4 = (INQ 4)) AND (Data5 = (INQ 5)) AND (Data6 = (INQ 6)) AND (Data7 = (INQ 7)) AND (Data8 = (INQ 8)) AND (Data101 = (INQ 101)) AND (Data302 = (INQ 302)) AND (Data601 = (INQ 601)) AND (Data602 = (INQ 602)) AND (Data902 = (INQ 902)) AND (Data903 = (INQ 903)))  {同じなら}
        LET Gl_fruit 0
      ELSE_IF ((INQ 14) = 1)
        LET Gl_fruit 1
      END_IF

    ELSE_IF ((INQ 403) = CENTERLINE)              {円の中心線なら}
      LET Data101 (INQ 101)
      LET Data102 (INQ 102)
      LET Data103 (INQ 103)
      LET Data104 (INQ 104)
      LET Data105 (INQ 105)
      INQ_ELEM Point02                            {次の要素}
      IF (((INQ 403) = CENTERLINE) AND (Data101 = (INQ 101)) AND (Data102 = (INQ 102)) AND (Data103 = (INQ 103)) AND (Data104 = (INQ 104)) AND (Data105 = (INQ 105)))  {同じなら}
        LET Gl_fruit 0
      ELSE_IF ((INQ 14) = 1)
        LET Gl_fruit 1
      END_IF

    ELSE_IF (((INQ 403) = SYMLINE) AND ((INQ 6) = 0))  {線分の対称線なら}
      LET Data101 (INQ 101)
      LET Data102 (INQ 102)
      INQ_ELEM Point02                            {次の要素}
      IF (((INQ 403) = SYMLINE) AND ((INQ 6) = 0) AND (Data101 = (INQ 101)) AND (Data102 = (INQ 102)))  {同じなら}
        LET Gl_fruit 0
      ELSE_IF ((INQ 14) = 1)
        LET Gl_fruit 1
      END_IF

    ELSE_IF (((INQ 403) = SYMLINE) AND ((INQ 6) = 1))  {円の対称線なら}
      LET Data3 (INQ 3)
      LET Data4 (INQ 4)
      LET Data5 (INQ 5)
      LET Data101 (INQ 101)
      LET Data302 (INQ 102)
      LET Data601 (INQ 103)
      INQ_ELEM Point02                            {次の要素}
      IF (((INQ 403) = SYMLINE) AND ((INQ 6) = 1) AND (Data3 = (INQ 3)) AND (Data4 = (INQ 4)) AND (Data5 = (INQ 5)) AND (Data101 = (INQ 101)) AND (Data302 = (INQ 102)) AND (Data601 = (INQ 103)))  {同じなら}
        LET Gl_fruit 0
      ELSE_IF ((INQ 14) = 1)
        LET Gl_fruit 1
      END_IF

    ELSE
      LET Gl_fruit 3
    END_IF
 

  ELSE
    LET Gl_fruit 2                                {要素が重なっている}
  END_IF

END_DEFINE



交点の位置
  2000.06.25
  条件:Gl_fruit の戻り値は[数値]又は[位置]なので [TYPE トークン ===> 修飾子] を使い確認すること
      戻り値(Gl_fruit)  0=指定要素の平行エラー
                          1=要素は線ではない
                          2=別要素が重複
                          3=サポート外
        数値精度は 10^-14 に丸めています。
}

DEFINE Ma_element_intersection_point
  LOCAL Point01
  LOCAL Point02

  READ PNT '** 最初の要素を指定してください。 **' Point01
  READ PNT '** 次の要素を指定してください。 **' Point02

  Ma_element_redundance Point01 Point02
  IF (Gl_fruit = 1)                               {違う要素指定なら}
    Ma_element_intersection Point01 Point02
  END_IF

END_DEFINE



直線の交点
  2000.06.25

  条件:同じ要素でないこと
        Gl_fruit の戻り値は[数値]又は[位置]なので [TYPE トークン ===> 修飾子] を使い確認すること
      戻り値(Gl_fruit)  0=指定要素の平行エラー
                          1=要素は線ではない
                          2=別要素が重複
                          3=サポート外
        数値精度は 10^-14 に丸めています。
}

DEFINE Ma_element_intersection
  PARAMETER Point01                               {最初の線}
  PARAMETER Point02                               {次の線}

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

  LOCAL F_point                                   {最初の線の中点}
  LOCAL F_angle                                   {線の角度}
  LOCAL F_angle_t
  LOCAL F_length                                  {交点までの距離}

  LOCAL S_point                                   {次の線の中点}
  LOCAL S_angle                                   {次の角度}
  LOCAL S_angle_t

  LOCAL D_length
  LOCAL D_length                                  {仮線長}
  LOCAL D_angle                                   {仮線の角度}
  LOCAL D_judge                                   {左右の判断}
  LOCAL D_gap_angle                               {交点の侠角}

  LET Gl_fruit 1                                  {取りあえず線では無い}

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

  INQ_ELEM Point01
  IF (((INQ 403) = LINE))
    LET F_point (((INQ 101) + (INQ 102)) / 2)     {中点の算出}
{   角度の算出}
    LET F_angle ((ANG ((INQ 102) - (INQ 101))) * Angle_unit)
    INQ_ELEM Point02
    IF (((INQ 403) = LINE))
      LET S_point (((INQ 101) + (INQ 102)) / 2)   {中点の算出}
{     角度の算出}
      LET S_angle ((ANG ((INQ 102) - (INQ 101))) * Angle_unit)
      IF (F_angle = S_angle)                      {平行線なら}
        LET Gl_fruit 0
      ELSE
        LET D_length (ABS (LEN (S_point - F_point)))  {仮線の長さ}
        LET D_angle  ((ANG (S_point - F_point)) * Angle_unit)
        IF ((X_OF (ROT S_point (D_angle / Angle_unit))) > (X_OF F_point))  {最初の点が左なら}
          LET D_judge 'F'
        ELSE
          LET D_judge 'S'
        END_IF

{       指定線の角度(仮線基準)の算出}
        LET F_angle_t (F_angle - D_angle)
        IF (F_angle_t < 0)                        {−なら}
          LET F_angle_t (PI + F_angle_t)
        END_IF
 

        IF (F_angle_t >= PI)                      {180度を超えるなら}
          LET F_angle_t (F_angle_t MOD PI)
        END_IF
 

        LET S_angle_t (S_angle - D_angle)
        IF (S_angle_t < 0)                        {−なら}
          LET S_angle_t (PI + S_angle_t)
        END_IF
 
        IF (S_angle_t >= PI)                      {180度を超えるなら}
          LET S_angle_t (S_angle_t MOD PI)
        END_IF
 

        LET D_gap_angle (ABS (S_angle_t - F_angle_t))  {交点の侠角}
{       S線の外角を内角に変更とF線の角度補正}
        IF ((D_judge = 'F') AND (F_angle_t < S_angle_t))  {上域}
          LET S_angle_t (PI - S_angle_t)
        ELSE_IF ((D_judge = 'F') AND (F_angle_t > S_angle_t))
          LET F_angle_t (F_angle_t + PI)
        ELSE_IF ((D_judge = 'S') AND (F_angle_t > S_angle_t))  {上域}
          LET F_angle_t (F_angle_t + PI)
        ELSE_IF ((D_judge = 'S') AND (F_angle_t < S_angle_t))
          LET S_angle_t (PI - S_angle_t)
        END_IF

        LET F_length ((SIN (S_angle_t / Angle_unit)) * D_length / (SIN (D_gap_angle / Angle_unit)))  {F線の中点から交点までの距離}
        LET Gl_fruit ((ROT (PNT_XY F_length 0) ((F_angle_t + D_angle) / Angle_unit)) + F_point)  {交点の位置}
      END_IF
 

    END_IF
 

  END_IF

END_DEFINE



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