EXPERTCAD Macro file "I_R.mac"
99/10/25
modoru
/* アイソメの線分に対しRを付けるコマンドの [ FILB 1 ]に相当 */
/* */
/* アイソメ線分以外の線でも選択すると何かの楕円を描いてしまう欠点あり */
/* */
/* 現在の所,線分の調節がうまくない、現在は角落としで仮の線調整をしてる */
/* Rの半径は現在数字で入力するが、任意の座標点でも通過する楕円弧は描 */
/* くが線上点、交点などはとれない */
/* */
/* ver7.0以降での不具合 Epnt1〜Epnt10 変数において */
/* IF ((Epnt3.X > Epnt1.X) AND (Epnt3.X > Epnt2.X)) の様にX.Yを分けて */
/* 使用するとエラーがでることがあり、うまくて動かない */
/* Ver6.03 までは異常なく動作する */
/* ==================================================================== */
BEGIN;
#ELr = 0; /* 変数初期化 */
ENUM4 =0;
ENUM5 =0;
ENUM6 =0;
ENUM7 =0;
ENUM8 =0;
#ELPos=1;
/* 最終要素番号を得る*/
Enum4 = Gpnt((0,0)); /* 図形の要素番号を得る */
GERASE(Enum4); /* 図形b取得したら消す */
CMD(^S);
LOOP(20) /* 試しに20回繰り返し */
CALL (LIN); /* 線分情報の入力 */
CALL (XYZSEL); /* XYZ面の選択 */
CALL (RIN); /* 半径を入力する */
CALL (DWELP); /* 楕円を描く */
LEND;
END;
/* =============================================================== */
BEGIN RIN; /* 半径を入力する */
Estr10 ="";
Goto *Rin1;
/* --------------------------------------------------------------- */
*RINtest: /* 半径を2点間距離でいれる */
#Elr = ^$( D, "半径を入力して下さい。前回と同じ時は RETURN " );
/* 最終入力がキーボードかマウスの判定 "7"は"CR" */
IF (#_KEY==7) THEN GOTO *RIN2; ENDIF;
goto *MODORU2;
/* --------------------------------------------------------------- */
*RIN1:
/* Estr10 = ^$( T, "半径を入力して下さい。前回と同じ時は RETURN " ); */
Estr9 = str(#ELr);
Estr9 = link("半径を入力して下さい。前回(" , Estr9);
Estr9 = link(Estr9, " mm)と同じ時は RETURN ");
Estr10 = ^$(T, Estr9);
/* 最終入力がキーボードかマウスの判定 "7"は"CR" */
IF (#_KEY==7) THEN GOTO *RIN2; ENDIF;
/*マウスより入力の場合 H8 Oct.現在未完成 */
/*FILBの場合半径入力でマウスの場合2点または要素を指定するので*/
/*それと同じでもいいが ARC2T の様に数字または任意の点が入力できるとよいと思う*/
!Epnt5 = !_csr;
Enum5 = DISPL(!Epnt5, !Da1_P1 , !Da1_P2);
Enum6 = DISPL(!Epnt5, !Da2_P1 , !Da2_P2);
/* Rの計算 */
#ELr = (Enum5 + Enum6 + Enum5 * Sqrt(2 * Enum6 / Enum5)) * 2 / sqrt(3) ;
goto *MODORU2;
*RIN2:
IF ((Estr10 == "") AND ( #ELr <> 0)) THEN GOTO *MODORU2; ENDIF;
IF (Estr10 == "") THEN GOTO *RIN1; ENDIF;
#ELr=VAL(Estr10);
*MODORU2:
END;
/* =============================================================== */
BEGIN XYZSEL; /* 楕円のXYZの位置を決める */
#ELFace = 0; /* 面情報の初期化 */
IF (((Enum1==30) OR (Enum1==210)) AND ((Enum2==150) OR (Enum2==330))) THEN
#ELFace = 3; ECHO ("Z"); ENDIF;
IF (((Enum2==30) OR (Enum2==210)) AND ((Enum1==150) OR (Enum1==330))) THEN
#ELFace = 3; ECHO ("Z"); ENDIF;
IF (((Enum1==90) OR (Enum1==270)) AND ((Enum2==150) OR (Enum2==330))) THEN
#ELFace = 2; ECHO ("Y"); ENDIF;
IF (((Enum2==90) OR (Enum2==270)) AND ((Enum1==150) OR (Enum1==330))) THEN
#ELFace = 2; ECHO ("Y"); ENDIF;
IF (((Enum1==30) OR (Enum1==210)) AND ((Enum2== 90) OR (Enum2==270))) THEN
#ELFace = 1; ECHO ("X"); ENDIF;
IF (((Enum2==30) OR (Enum2==210)) AND ((Enum1== 90) OR (Enum1==270))) THEN
#ELFace = 1; ECHO ("X"); ENDIF;
IF (#ELFace==1) THEN GOTO *XPOS; ENDIF; /* 楕円面 X */
IF (#ELFace==2) THEN GOTO *YPOS; ENDIF; /* 楕円面 Y */
IF (#ELFace==3) THEN GOTO *ZPOS; ENDIF; /* 楕円面 Z */
GOTO *MODORU1;
/* --------------------------------------------------------------- */
/* 楕円のどの隅のものかを決める */
*ZPOS:
IF ((!Epnt3.X > !Epnt1.X) AND (!Epnt3.X > !Epnt2.X)) THEN
#ELPos = 1; ENDIF;
IF ((!Epnt3.Y > !Epnt1.Y) AND (!Epnt3.Y > !Epnt2.Y)) THEN
#ELPos = 2; ENDIF;
IF ((!Epnt3.X < !Epnt1.X) AND (!Epnt3.X < !Epnt2.X)) THEN
#ELPos = 3; ENDIF;
IF ((!Epnt3.Y < !Epnt1.Y) AND (!Epnt3.Y < !Epnt2.Y)) THEN
#ELPos = 4; ENDIF;
GOTO *MODORU1;
/* --------------------------------------------------------------- */
*YPOS:
IF ((Enum1==90) OR (Enum1==270)) THEN GOTO *YPOS1;
ENDIF;
IF ((!Epnt3.Y > !Epnt2.Y) AND (!Epnt3.Y > !Epnt1.Y)) THEN
#ELPos = 1; ENDIF;
IF ((!Epnt3.Y < !Epnt2.Y) AND (!Epnt3.Y > !Epnt1.Y)) THEN
#ELPos = 2; ENDIF;
IF ((!Epnt3.Y < !Epnt2.Y) AND (!Epnt3.Y < !Epnt1.Y)) THEN
#ELPos = 3; ENDIF;
IF ((!Epnt3.Y > !Epnt2.Y) AND (!Epnt3.Y < !Epnt1.Y)) THEN
#ELPos = 4; ENDIF;
GOTO *MODORU1;
/* --------------------------------------------------------------- */
*YPOS1:
IF ((!Epnt3.Y > !Epnt1.Y) AND (!Epnt3.Y > !Epnt2.Y)) THEN
#ELPos = 1; ENDIF;
IF ((!Epnt3.Y < !Epnt1.Y) AND (!Epnt3.Y > !Epnt2.Y)) THEN
#ELPos = 2; ENDIF;
IF ((!Epnt3.Y < !Epnt1.Y) AND (!Epnt3.Y < !Epnt2.Y)) THEN
#ELPos = 3; ENDIF;
IF ((!Epnt3.Y > !Epnt1.Y) AND (!Epnt3.Y < !Epnt2.Y)) THEN
#ELPos = 4; ENDIF;
GOTO *MODORU1;
/* --------------------------------------------------------------- */
*XPOS:
IF ((Enum1==90) OR (Enum1==270)) THEN GOTO *XPOS1;
ENDIF;
IF ((!Epnt3.Y > !Epnt2.Y) AND (!Epnt3.Y > !Epnt1.Y)) THEN
#ELPos = 1; ENDIF;
IF ((!Epnt3.Y > !Epnt2.Y) AND (!Epnt3.Y < !Epnt1.Y)) THEN
#ELPos = 2; ENDIF;
IF ((!Epnt3.Y < !Epnt2.Y) AND (!Epnt3.Y < !Epnt1.Y)) THEN
#ELPos = 3; ENDIF;
IF ((!Epnt3.Y < !Epnt2.Y) AND (!Epnt3.Y > !Epnt1.Y)) THEN
#ELPos = 4; ENDIF;
GOTO *MODORU1;
*XPOS1:
IF ((!Epnt3.Y > !Epnt1.Y) AND (!Epnt3.Y > !Epnt2.Y)) THEN
#ELPos = 1; ENDIF;
IF ((!Epnt3.Y > !Epnt1.Y) AND (!Epnt3.Y < !Epnt2.Y)) THEN
#ELPos = 2; ENDIF;
IF ((!Epnt3.Y < !Epnt1.Y) AND (!Epnt3.Y < !Epnt2.Y)) THEN
#ELPos = 3; ENDIF;
IF ((!Epnt3.Y < !Epnt1.Y) AND (!Epnt3.Y > !Epnt2.Y)) THEN
#ELPos = 4; ENDIF;
GOTO *MODORU1;
*MODORU1:
END;
/* =============================================================== */
BEGIN LIN; /* 線分情報の入力 */
*L1:
/* !Epnt10 = ^$( P, "線分1を指定して下さい" ); */
Enum4 = ^$( E, "線分1を指定して下さい" );
!Epnt10 = !_Csr;
/* Enum10 = SGETELMN( !Epnt10 );*/ /* 図形の要素番号を得る */
/* SINQ( Enum10, "Da1" ); */
SINQ( Enum4, "Da1" );
IF (#Da1_F1<>2) THEN GOTO *L1; ENDIF;
!Epnt1 = NRMP(!Epnt10 , !Da1_P1 , !Da1_P2);
*L2:
/* !Epnt10 = ^$( P, "線分2を指定して下さい" ); */
Enum4 = ^$( E, "線分2を指定して下さい" );
!Epnt10 = !_Csr;
/* Enum10 = SGETELMN( !Epnt10 );*/ /* 図形の要素番号を得る */
/* SINQ( Enum10, "Da2" ); */
SINQ( Enum4, "Da2" );
IF (#Da2_F1<>2) THEN GOTO *L2; ENDIF;
!Epnt2 = NRMP(!Epnt10 , !Da2_P1 , !Da2_P2); /* 線上の点座標を求めておく */
Enum1 = ANG2P(!Da1_P1 , !Da1_P2); /* 線分1の角度 */
Enum2 = ANG2P(!Da2_P1 , !Da2_P2); /* 線分2の角度 */
Enum3 = CRSP(!Da1_P1 , !Da1_P2, !Da2_P1 , !Da2_P2 , !Epnt3); /*線分の交点座標 */
END;
/* =============================================================== */
BEGIN DWELP; /* 楕円を描く */
/* #ELFace で楕円面を決める 1=X ,2=Y, 3=Z */
IF (#ELFace == 1) THEN Enum8 = 240;ENDIF;
IF (#ELFace == 2) THEN Enum8 = 300;ENDIF;
IF (#ELFace == 3) THEN Enum8 = 180;ENDIF;
/* 線の交点から楕円の中心への角度をポジションごとに算出 */
Enum8=MOD( Enum8 + (#ELPos-1) * 90 , 360);
/* #ELPosが 1,3 の時 3 を#ELr に乗じる 2,4 の時は #ELr のみ*/
!Epnt9 = DIRP(!Epnt3,(SQRT(3) * MOD(#ELPos,2) + MOD(#ELPos+1,2)) * #ELr,Enum8);
Enum4 = GELACP(!Epnt9,#ELr * SQRT(3/2),#ELr * SQRT(1/2),60 + (MOD(#ELFace,3)-1) * 60, (#ELPos-1) * 90-(MOD(#ELPos+1,2)+1) * 30 ,(#ELPos-1)*90+(MOD(#ELPos+1,2)+1)*30);
/* 楕円の場所によって開始角を変化させる*/
/* XYZ面の時は線の調整 */
IF (#ELFace <> 0) THEN
/*#Pnum = #Da1_F3;
CMD(PNSET 1 ^S); */
!z1 = !Epnt1; !z2 = !Epnt2;
Cmd(CHAMB 2 E !z1 !z2 #ELr #ELr ^S);
GERASE( Enum4 + 1); /* 角落としの線を消す */
/* CMD(PNSET #Pnum ^S); */
ENDIF;
END;
↑以上ここまで
前の部屋にもどります。