2000.07.02 更新
1.描画・円と径 2000.07.02
(0=半径 1=直径 をバラメータで指定してください。)
2.コーナー処理時点の元線処理法の登録 2000.07.02
3.面取り線の取り消しについて 2000.07.02
4.面
取りの取り消し 2000.07.02
(面取り線を除去する/しないをMa_corner_keep_memoryで指定してください。)
5.連続平行線 2000.07.02
(等間隔に平行線を引きま す。)
6.線種コマンド 2001.07.22
7.線色コマンド 2001.07.22
8.描画・曲線・インボリュート 2002.04.26
DEFINE Ma_circle_draw
PARAMETER
Sitei
{0=半径 1=直径}
LOCAL Iti
LOCAL Atai
READ '** 円の中心を指定して下さい。**' Iti
LOOP
IF (Sitei =
1)
{直径の指定なら}
READ '**
直径の値又は、円周上の位置を指定して下さい。 **' RUBBER_CIRCLE_CEN Iti Atai
IF ((TYPE Atai) =
PNT)
{点ならそのまま}
CIRCLE Iti Atai END
ELSE
CIRCLE Iti (Atai / 2) END
END_IF
ELSE
{半径の指定なら}
READ '**
半径の値又は、円周上の位置を指定して下さい。 **' RUBBER_CIRCLE_CEN Iti Atai
CIRCLE Iti Atai END
END_IF
END_LOOP
END_DEFINE
custom.macの最後に次の2行を加えてください。
KEEP_CORNER
OFF
{コーナー処理の元線は残さない}
LET Gl_corner_keep OFF
}
IF (Gl_corner_keep = ON)
KEEP_CORNER OFF
LET Gl_corner_keep OFF
ELSE_IF (Gl_corner_keep = OFF)
KEEP_CORNER ON
LET Gl_corner_keep ON
END_IF
END_DEFINE
DEFINE Ma_chamfer_out
LOCAL Point_temp
LOCAL Line_pnt1
LOCAL Line_pnt2
LOCAL Kioku
LOCAL Kazu
LOOP
LET Kazu 0
LOOP
READ PNT '** 面取り線を指示して下さい。
**' Point_temp
INQ_ELEM
Point_temp
{要素情報の取得}
EXIT_IF (((INQ 403) = LINE) AND ((INQ
14) = 1)) {線なら}
IF (0Kazu < 10)
LET Kazu (Kazu
+ 1)
ELSE
DISPLAY '**
面取り線が判りません。ご免! **'
END_IF
END_LOOP
LET Line_pnt1 (INQ
101)
{端の位置1}
LET Line_pnt2 (INQ
102)
{端の位置2}
LET Kioku 0
{ 要素の確定1}
INQ_SELECTED_ELEM Line_pnt1
IF ((INQ 14) =
2)
{繋がっている要素があるなら}
IF ((INQ 403) =
LINE)
{線なら}
IF ((((INQ 101)
= Line_pnt1) AND ((INQ 102) = Line_pnt2)) OR (((INQ 101) =
Line_pnt2) AND ((INQ 102) = Line_pnt1)))
{面取り線なら}
INQ_NEXT_ELEM
END_IF
END_IF
LET Kioku (Kioku +
1)
{カウントUP}
END_IF
{ 要素の確定2}
INQ_SELECTED_ELEM Line_pnt2
IF ((INQ 14) =
2)
{繋がっている要素があるなら}
IF ((INQ 403) =
LINE)
{線なら}
IF ((((INQ 101)
= Line_pnt1) AND ((INQ 102) = Line_pnt2)) OR (((INQ 101) =
Line_pnt2) AND ((INQ 102) = Line_pnt1)))
{面取り線なら}
INQ_NEXT_ELEM
END_IF
END_IF
LET Kioku (Kioku +
1)
{カウントUP}
END_IF
EXIT_IF (Kioku = 2)
DISPLAY '** 母線が判りませんので取り消しが出来ません。ご免!
**'
END_LOOP
IF (Gl_corner_keep =
OFF)
{面取り線を無くすなら}
DELETE Point_temp END
END_IF
TRIM_TWO Line_pnt1 Line_pnt2 END
END_DEFINE
DEFINE Ma_parallel_serial
LOCAL
Angle_unit
{ラディアンへの変換値}
LOCAL Point_temp {指定点}
LOCAL
Line_pnt1
{線の端位置1}
LOCAL
Line_pnt2
{線の端位置2}
LOCAL
Line_pntm
{線の中点位置}
LOCAL
Line_length
{線長}
LOCAL
Line_angle
{線の角度}
LOCAL
Line_angle_r
{線の角度}
LOCAL Interval {平行の間隔}
LOCAL
Rudder_angle
{側指示の方向角度}
LOCAL
Line_pnt_next
{平行線の端位置}
INQ_ENV 6
LET Angle_unit (INQ
3)
{ラディアンへの変換値}
{ 基準線}
LOOP
READ PNT '** 基準の線を指示して下さい。 **'
Point_temp
INQ_ELEM
Point_temp
{要素情報の取得}
EXIT_IF ((INQ 403) =
LINE)
{線なら}
END_LOOP
LET Line_pnt1 (INQ
101)
{端位置1}
LET Line_pnt2 (INQ
102)
{端位置2}
LET Line_pntm ((Line_pnt1 + Line_pnt2) /
2) {線の中点位置}
LET Line_length (LEN (ABS (Line_pnt2 -
Line_pnt1))) {線長}
LET Line_angle (ANG (Line_pnt2 -
Line_pnt1)) {線の角度}
LET Line_angle_r (Line_angle *
Angle_unit) {線の角度(ラディアン)}
IF (Line_angle_r < 0)
LET Line_angle_r (2 * PI +
Line_angle_r)
END_IF
IF (Line_angle_r >= PI)
LET Line_angle_r (Line_angle_r - PI)
END_IF
READ NUMBER '** 平行線の間隔を入力して下さい。 **' Interval
LOOP
READ PNT '** 平行線を描く側をクリックして下さい。(終了なら
[ESC] キーを押して下さい。) **' Point_temp
LET Rudder_angle ((ANG (Point_temp -
Line_pntm)) * Angle_unit)
IF (Rudder_angle < 0)
LET Rudder_angle (2 * PI +
Rudder_angle)
END_IF
{ 次の線の描画位置}
IF ((Rudder_angle > Line_angle_r)
AND (Rudder_angle < (Line_angle_r + PI))) {領域1なら}
LET Line_pnt_next
(Line_pnt1 + (PNT_RA Interval ((Line_angle_r + PI / 2) /
Angle_unit)))
ELSE_IF ((Rudder_angle = Line_angle_r)
AND (Rudder_angle = (Line_angle_r + PI))) {同一線上なら無視}
ELSE
{領域2なら}
LET Line_pnt_next
(Line_pnt1 + PNT_RA Interval ((Line_angle_r - PI / 2) /
Angle_unit))
END_IF
{ 線引き}
LINE PT_ANG_DIST Line_pnt_next
Line_angle Line_length
{ データの更新}
LET Line_pnt1
Line_pnt_next
{端位置1}
LET Line_pntm (Line_pnt1 + (PNT_RA
(Line_length / 2) (Line_angle_r / Angle_unit))) {線の中点位置}
END_LOOP
END_DEFINE
DEFINE Ma_line_Pattern
PARAMETER Pattern
IF ((Pattern = '11111111111111111111111111111111')
OR (Pattern = 'SOLID')) {実線}
SOLID
ELSE_IF ((Pattern =
'11111111000000001111111100000000') OR (Pattern =
'DASHED')) {破線}
DASHED
ELSE_IF ((Pattern =
'11111111111000001111111111100000') OR (Pattern =
'LONG_DASHED')) {長破線}
LONG_DASHED
ELSE_IF ((Pattern =
'11111111111110101111111111111010') OR (Pattern =
'DOT_CENTER')) {一点鎖線}
DOT_CENTER
ELSE_IF ((Pattern =
'11111111111101101111111111110110') OR (Pattern =
'DASH_CENTER')) {長一点鎖線}
DASH_CENTER
ELSE_IF ((Pattern =
'11111111111010101111111111101010') OR (Pattern =
'PHANTOM')) {二点鎖線}
PHANTOM
ELSE_IF ((Pattern =
'11111111110101101111111111010110') OR (Pattern =
'CENTER_DASH_DASH')) {長二点鎖線}
CENTER_DASH_DASH
ELSE_IF ((Pattern =
'10101010101010101010101010101010') OR (Pattern =
'DOTTED')) {点線}
DOTTED
END_IF
END_DEFINE
DEFINE Ma_color_component
PARAMETER Component
IF (Component =
'BLACK')
{黒}
BLACK
ELSE_IF (Component =
'RED')
{赤}
RED
ELSE_IF (Component =
'GREEN')
{緑}
GREEN
ELSE_IF (Component =
'YELLOW')
{黄}
YELLOW
ELSE_IF (Component =
'BLUE')
{青}
BLUE
ELSE_IF (Component =
'MAGENTA')
{紫}
MAGENTA
ELSE_IF (Component =
'CYAN')
{水}
CYAN
ELSE_IF (Component =
'WHITE')
{白}
WHITE
ELSE
RGB_COLOR Component
END_IF
END_DEFINE
LOCAL
Angle_unit
{ラディアンへの変換値}
LOCAL
Ring_mark_point
{開始の指示点}
LOCAL
Ring_center
{基準円の中心点}
LOCAL
Ring_radius
{基準円の半径}
LOCAL
Ring_start_angle
{開始角}
LOCAL
Ring_start_point
{開始点}
LOCAL
Direction_point
{描画方向指示用点}
LOCAL
Direction_angle
{描画方向指示用点}
LOCAL
Direction
{描画方向}
LOCAL
Quantity
{描画量}
LOCAL
Angle_step
{増加角}
LOCAL
Step_number_max
{描画数}
LOCAL
Step
{カウント}
LOCAL
Fraction
{余り}
LOCAL
Confirm
{同じか?}
INQ_ENV 6
LET Angle_unit (INQ
3)
{ラディアンへの変換値}
INQ_ENV 3
LET Direction
0
{描画方向はまだ未定}
LET Quantity
0
{ライン長の初期化}
LET Angle_step (PI /
36)
{増加角 5°(ラディアン)}
LOOP
IF (Direction =
0)
{描画が初回}
LOOP
READ PNT '**
インボリュート曲線を描く、基準円の位置を指示して下さい。**' Ring_mark_point
INQ_ELEM
Ring_mark_point
EXIT_IF (((INQ 403) =
CIRCLE) OR ((INQ 403) = ARC)) {円又は円弧なら}
END_LOOP
LET Ring_center (INQ
101)
{基準円の中心点}
LET Ring_radius (INQ
3)
{基準円の半径}
LET Ring_start_angle (ANG
(Ring_mark_point - Ring_center)) {開始角}
LET Ring_start_point
((PNT_RA Ring_radius Ring_start_angle) +
Ring_center) {開始点}
READ PNT '**
曲線を描く方向を指示して下さい。**' RUBBER_LINE Ring_start_point
Direction_point
LET Direction_angle ((ANG
(Direction_point - Ring_center)) - Ring_start_angle)
{判断用角度}
LET Direction_angle
(Direction_angle * Angle_unit) {ラディアンへ変換}
Ma_text_direction
Direction_angle
{方向判断}
IF (Gl_fruit <=
4)
{左回りなら}
LET Direction 1
ELSE
LET Direction
-1
END_IF
READ NUMBER '**
描くラインの長さを入力して下さい。(基準円の一周を1とします。) **' DEFAULT 0.25 Quantity
LET Step_number_max
((Quantity * 2 * PI) / Angle_step) {補間点数}
LET Fraction (FRACT
Step_number_max)
{端数の確認}
IF (Step_number_max <
3)
{描画ライン長が短ければ}
LET
Step_number_max 3
LET Angle_step
((Quantity * 2 * PI) / 3)
END_IF
ELSE
LET Confirm 1
LOOP
READ PNT '**
同じ基準円上の、インボリュート曲線を描く位置を指示して下さい。[ESC]キーで終了 **'
Ring_mark_point
INQ_ELEM
Ring_mark_point
IF (((INQ 403)
= CIRCLE) OR ((INQ 403) = ARC)) {円又は円弧なら}
IF
((Ring_center = (INQ 101)) AND (Ring_radius = (INQ
3))) {同じ円又は円弧なら}
LET
Confirm 0
END_IF
END_IF
EXIT_IF (Confirm =
0)
{同じ円又は円弧なら}
END_LOOP
LET Ring_start_angle (ANG
(Ring_mark_point - Ring_center)) {開始角}
LET Ring_start_point
((PNT_RA Ring_radius Ring_start_angle) +
Ring_center) {開始点}
END_IF
BSPLINE ORDER 4
Ring_start_point
{開始点と開始角}
(Ring_center + (ROT (PNT_XY Ring_radius
(Ring_radius * Angle_step / 10 * (-
Direction)))((Ring_start_angle + (((Angle_step / 10) *
Direction) / Angle_unit))))) {1/10ピッチの点}
LET Step
0
{カウント}
REPEAT
LET Step (Step + 1)
(Ring_center + (ROT (PNT_XY
Ring_radius (Ring_radius * Angle_step * Step * (-
Direction)))((Ring_start_angle + (((Angle_step * Step) *
Direction) / Angle_unit)))))
UNTIL (Step >= Step_number_max)
IF (Fraction >
0)
{端数があるなら}
(Ring_center + (ROT (PNT_XY
Ring_radius (Ring_radius * Angle_step * Step_number_max *
(- Direction)))((Ring_start_angle + (((Angle_step *
Step_number_max) * Direction) / Angle_unit)))))
END_IF
END
END_LOOP
END_DEFINE
気をつけて作りました、使用してのトラブルに責任は持てませんが、
自由にお使い下さい。(伏 見 表)