2000.10.15 更新
新規 1.指定点の要素は同じか? 2000.10.15
新規 2.交点の位置
2000.10.15
新規 3.直線の交点 2000.10.15
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
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
条件:同じ要素でないこと
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
気をつけて作りました、使用してのトラブルに責任は持てませんが、
自由にお使い下さい。(伏 見 表)