/*#TITLE# 慣性モーメント(3次元)を求めるマクロ */ /* INERTIA3.MAC 2005.1.18 kita */ /* 2005.1.26 同一形状の部品を1クラスにまとめる */ clear(); s = menu(1); ERROR/OFF MENU/OFF LIST/OFF /*--------------------------------------*/ /* クラスの部品数カウント */ /*--------------------------------------*/ nb_max = 0; nb = array(255); for(i=1; i<=3; i+=1){ PIC [i] ZOOM/ALL LFT/SEL REL 4 /* 2点鎖線を排除 */ CLS/SEL ALL for(k=1; k<255; k+=1){ n_itm = getitm(2,k);if (n_itm == 0) {continue;} ACT/REL nb_tmp = 0; CLS/SEL [k] ACT/ALL n = #CURACTCNT; /* Act List 内の要素数 */ for(j=1; j<=n; j+=1){ VER [actlst(j)] if (#VERITMTYPE == 5 || #VERITMTYPE == 3){ /* ストリング or 円弧 */ nb_tmp = nb_tmp + 1; } } if(nb[k] < nb_tmp) { nb[k] = nb_tmp; } if(nb_max < nb_tmp) {nb_max = nb_tmp;} /* echo (nb[k]); s = getany(1); */ } LFT/SEL ALL } CLS/SEL ALL ACT/REL /*------------------------------*/ /* 変数宣言 */ /*------------------------------*/ kei = array(255); /* 1:立方体 2:x円筒 3:y円筒 4:z円筒 */ xl = array(255,2); yl = array(255,2); zl = array(255,2); x0 = array(255,nb_max+1); y0 = array(255,nb_max+1); z0 = array(255,nb_max+1); /* 重心 */ tmp_x0 = array(nb_max+1); tmp_y0 = array(nb_max+1); tmp_z0 = array(nb_max+1); /* 仮重心 */ state = array(255,nb_max+1); /* x0,y0,z0 の代入状態 (1 - 8) */ low = array(255); mas = array(255); gm_x = array(255,nb_max+1); gm_y = array(255,nb_max+1); gm_z = array(255,nb_max+1); /* 一次モーメント */ jm_x0 = array(255); jm_y0 = array(255); jm_z0 = array(255); /* 部品単体の J */ jm_x = array(255,nb_max+1); jm_y = array(255,nb_max+1); jm_z = array(255,nb_max+1); /* 座標軸基準の J */ e = 0.05; /* 許容誤差 */ gm_x_ttl = 0; gm_y_ttl = 0; gm_z_ttl = 0; jm_x_ttl = 0; jm_y_ttl = 0; jm_z_ttl = 0; mas_ttl = 0; x0_ttl =0; y0_ttl =0; z0_ttl =0; er_class = array(255); LFT 1 /*--------------------------------------*/ /* 図形 data 読み込み Pic 1 */ /*--------------------------------------*/ PIC 1 ZOOM/ALL for (class = 1; class < 255; class += 1) { if (class == 100 ) {continue;} /* class 100 なら飛ぶ */ n_itm = getitm(2,class);if (n_itm == 0) {continue;} /* クラスが空なら飛ぶ */ ACT/REL CLS/SEL ALL CLS [class] CLS/SEL [class] ITM/SEL REL MPNT /* 点排除 */ LFT/SEL 1 /* 実線 */ ACT/ALL n = #CURACTCNT; for(i=1; i<=n; i+=1){ VER [actlst(i)] MES/AREA [actlst(i)] if ( #VERITMTYPE == 5){ /* 実線ストリング */ if(kei[class] < 2) {kei[class] = 1;} if(xl[class][0] == 0){ xl[class][0] = +(#VERMAXX-#VERMINX);} if(yl[class][0] == 0){ yl[class][0] = +(#VERMAXY-#VERMINY);} tmp_x0[i] = #MESX; tmp_y0[i] = #MESY; } else if (#VERITMTYPE == 3){ /* 実円線 */ kei[class] = 4; if(xl[class][0] == 0){ xl[class][0] = #VERRAD*2;} if(yl[class][0] == 0){ yl[class][0] = #VERRAD*2;} tmp_x0[i] = #MESX; tmp_y0[i] = #MESY; } } for(j=i; j<=nb[class]; j+=1){ /* 空tmp埋める */ tmp_x0[j] = tmp_x0[1]; tmp_y0[j] = tmp_y0[1]; } for(i=1; i<=nb[class]; i+=1){ if(state[class][i] < 2){ /* x0,y0 が 0 ならそのまま代入 */ x0[class][i] = tmp_x0[i]; y0[class][i] = tmp_y0[i]; state[class][i] = state[class][i] + 6;if(state[class][i] > 7){ state[class][i] = 7;} } else if(state[class][i] == 2 || state[class][i] == 3){ /* x0 空 y0 有*/ for(j=1; j<=nb[class]; j+=1){ if(+(y0[class][i]-tmp_y0[j]) <= e){ x0[class][i] = tmp_x0[j]; state[class][i] = state[class][i] + 4;if(state[class][i] > 7){ state[class][i] = 7;} } } } else if(state[class][i] == 4 || state[class][i] == 5){ /* x0 有 y0 空 */ for(j=1; j<=nb[class]; j+=1){ if(+(x0[class][i]-tmp_x0[j]) <= e){ y0[class][i] = tmp_y0[j]; state[class][i] = state[class][i] + 2;if(state[class][i] > 7){ state[class][i] = 7;} } } } } } /* end of for(class) */ ACT/REL CLS/SEL ALL ITM/SEL ALL ITM/SEL MPNT DEL CURPIC MSKONN /* 点を削除 */ ITM/SEL ALL /*--------------------------------------*/ /* 図形 data 読み込み Pic 2 */ /*--------------------------------------*/ PIC 2 ZOOM/ALL for (class = 1; class < 255; class += 1) { if (class == 100 ) {continue;} /* class 100 なら飛ぶ */ n_itm = getitm(2,class);if (n_itm == 0) {continue;} /* クラスが空なら飛ぶ */ ACT/REL CLS/SEL ALL CLS [class] CLS/SEL [class] ITM/SEL REL MPNT /* 点排除 */ LFT/SEL 1 /* 実線 */ ACT/ALL n = #CURACTCNT; for(i=1; i<=n; i+=1){ VER [actlst(i)] MES/AREA [actlst(i)] if ( #VERITMTYPE == 5){ /* 実線ストリング */ if(kei[class] < 2) {kei[class] = 1;} if(xl[class][0] == 0){ xl[class][0] = +(#VERMAXX-#VERMINX);} if(zl[class][0] == 0){ zl[class][0] = +(#VERMAXY-#VERMINY);} tmp_x0[i] = #MESX; tmp_z0[i] = #MESY; } else if (#VERITMTYPE == 3){ /* 実円線 */ kei[class] = 3; if(xl[class][0] == 0){ xl[class][0] = #VERRAD*2;} if(zl[class][0] == 0){ zl[class][0] = #VERRAD*2;} tmp_x0[i] = #MESX; tmp_z0[i] = #MESY; } } /* echo "i = " i; s=getany(1); */ for(j=i; j<=nb[class]; j+=1){ /* 空tmp埋める */ tmp_x0[j] = tmp_x0[1]; tmp_z0[j] = tmp_z0[1]; /* echo j " : " (tmp_z0[j]); s=getany(1); */ } for(i=1; i<=nb[class]; i+=1){ if(state[class][i] == 0 || state[class][i] == 2){ /* x0,z0 が 0 ならそのまま代入 */ x0[class][i] = tmp_x0[i]; z0[class][i] = tmp_z0[i]; state[class][i] = state[class][i] + 5;if(state[class][i] > 7){ state[class][i] = 7;} } else if(state[class][i] == 1 || state[class][i] == 3){ /* x0 空 z0 有 */ for(j=1; j<=nb[class]; j+=1){ if(+(z0[class][i]-tmp_z0[j]) <= e){ x0[class][i] = tmp_x0[j]; state[class][i] = state[class][i] + 4;if(state[class][i] > 7){ state[class][i] = 7;} } } } else if(state[class][i] == 4 || state[class][i] == 6){ /* x0 有 z0 空 */ for(j=1; j<=nb[class]; j+=1){ /* echo "i=" i " j=" j " " (x0[class][i]) " " (tmp_x0[j]); s=getany(1); */ if(+(x0[class][i]-tmp_x0[j]) <= e){ z0[class][i] = tmp_z0[j]; state[class][i] = state[class][i] + 1;if(state[class][i] > 7){ state[class][i] = 7;} } } } } } /* end of for(class) */ ACT/REL CLS/SEL ALL ITM/SEL ALL ITM/SEL MPNT DEL CURPIC MSKONN /* 点を削除 */ ITM/SEL ALL /*--------------------------------------*/ /* 図形 data 読み込み Pic 3 */ /*--------------------------------------*/ PIC 3 ZOOM/ALL for (class = 1; class < 255; class += 1) { if (class == 100 ) {continue;} /* class 100 なら飛ぶ */ n_itm = getitm(2,class);if (n_itm == 0) {continue;} /* クラスが空なら飛ぶ */ ACT/REL CLS/SEL ALL CLS [class] CLS/SEL [class] ITM/SEL REL MPNT /* 点排除 */ LFT/SEL 1 /* 実線 */ ACT/ALL n = #CURACTCNT; for(i=1; i<=n; i+=1){ VER [actlst(i)] MES/AREA [actlst(i)] if ( #VERITMTYPE == 5){ /* 実線ストリング */ if(kei[class] < 2) {kei[class] = 1;} if(yl[class][0] == 0){ yl[class][0] = +(#VERMAXX-#VERMINX);} if(zl[class][0] == 0){ zl[class][0] = +(#VERMAXY-#VERMINY);} tmp_y0[i] = #MESX; tmp_z0[i] = #MESY; } else if (#VERITMTYPE == 3){ /* 実円線 */ kei[class] = 2; if(yl[class][0] == 0){ yl[class][0] = #VERRAD*2;} if(zl[class][0] == 0){ zl[class][0] = #VERRAD*2;} tmp_y0[i] = #MESX; tmp_z0[i] = #MESY; } } for(j=i; j<=nb[class]; j+=1){ /* 空tmp埋める */ tmp_y0[j] = tmp_y0[1]; tmp_z0[j] = tmp_z0[1]; } for(i=1; i<=nb[class]; i+=1){ if(state[class][i] == 0 || state[class][i] == 4){ /* y0,z0 が 0 ならそのまま代入 */ y0[class][i] = tmp_y0[i]; z0[class][i] = tmp_z0[i]; state[class][i] = state[class][i] + 3;if(state[class][i] > 7){ state[class][i] = 7;} } else if(state[class][i] == 1 || state[class][i] == 5){ /* y0 空 z0 有 */ for(j=1; j<=nb[class]; j+=1){ if(+(z0[class][i]-tmp_z0[j]) <= e){ y0[class][i] = tmp_y0[j]; state[class][i] = state[class][i] + 2;if(state[class][i] > 7){ state[class][i] = 7;} } } } else if(state[class][i] == 2 || state[class][i] == 6){ /* y0 有 z0 空 */ for(j=1; j<=nb[class]; j+=1){ /* echo "i=" i " j=" j " " (y0[class][i]) " " (tmp_y0[j]); s=getany(1); */ if(+(y0[class][i]-tmp_y0[j]) <= e){ z0[class][i] = tmp_z0[j]; state[class][i] = state[class][i] + 2;if(state[class][i] > 7){ state[class][i] = 7;} } } } } } /* end of for(class) */ ACT/REL CLS/SEL ALL ITM/SEL ALL ITM/SEL MPNT DEL CURPIC MSKONN /* 点を削除 */ ITM/SEL ALL LFT/SEL ALL /* Debug */ /* nl = 0; PIC 12 ss_tmp = "Class 形状No xl yl zl x0 y0 z0 state"; GNT [ss_tmp] <0,7> for(i = 1;i < 255; i += 1){ if (nb[i] == 0) {continue;} /* クラスが空なら飛ぶ */ for(j=1;j <= nb[i]; j+=1){ nl = nl + 1; ss_tmp = sprint("%3d-%3d %1d %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %d" ,i,j,kei[i],xl[i][0],yl[i][0],zl[i][0],x0[i][j],y0[i][j],z0[i][j],state[i][j]); GNT [ss_tmp] <0,[-nl*5]> } } */ /*--------------------------------------*/ /* 単位体積質量の読み込み */ /*--------------------------------------*/ PIC 10 ZOOM/ALL ACT/ALL n = #CURACTCNT; /* Act List 内の要素数 */ for(i=1; i<=n; i+=1){ VER [actlst(i)] if (#VERITMTYPE == 11){ /* 文字 */ str = #VERTXT; tmp = sscan(str,"%d %f %f"); type_tmp = vtype(tmp); if(type_tmp == 5) { continue;} l_tmp = length(tmp); if(tmp[1] < 0 && l_tmp ==3){ for(j=tmp[0]; j<=-tmp[1]; j+=1) { low[j] = tmp[2]; } } else { class = tmp[0]; low[class] = tmp[1]; } } } for(i=1; i<255; i+=1){ if(low[i] == 0){ low[i] = low[0]; } } /*--------------------------------------*/ /* 間違い検出 */ /*--------------------------------------*/ ner = 0; nl = 0; for(i=1; i<255; i+=1){ if(nb[i] == 0) { continue;} for(j=1; j<=nb[i]; j+=1){ if(state[i][j] != 7){ ner = ner + 1; er_class[i] = 1; } } } if(ner != 0){ PIC 13 ss_tmp0 = sprint("以下の %d ヶのクラスの絵がおかしいです",ner); GNT [ss_tmp0] <0,0> for(i=1; i<255; i+=1){ if(er_class[i] == 1){ nl = nl + 1; ss_tmp1 = sprint("%3d",i); GNT [ss_tmp1] <5,[-nl*5]> } } exit; } /*--------------------------------------*/ /* 単位変換(mm->cm) */ /*--------------------------------------*/ for(i=1; i<255; i+=1){ xl[i][0] = xl[i][0]/10; xl[i][1] = xl[i][1]/10; yl[i][0] = yl[i][0]/10; yl[i][1] = yl[i][1]/10; zl[i][0] = zl[i][0]/10; zl[i][1] = zl[i][1]/10; for(j=1; j<=nb[i]; j+=1){ x0[i][j] = x0[i][j]/10; y0[i][j] = y0[i][j]/10; z0[i][j] = z0[i][j]/10; } } /*--------------------------------------*/ /* 慣性モーメントの計算 */ /*--------------------------------------*/ for(i=1; i < 255; i+=1){ if(xl[i][0] == 0 || yl[i][0] == 0 || zl[i][0] == 0) { continue;} if(kei[i] == 1){ /* 立方体 */ mas0 = low[i] * (xl[i][0] * yl[i][0] * zl[i][0])/1000; mas1 = low[i] * (xl[i][1] * yl[i][1] * zl[i][1])/1000; mas[i] = mas0 - mas1; jm_x0[i] = (mas0*(yl[i][0]**2 + zl[i][0]**2) - mas1*(yl[i][1]**2 + zl[i][1]**2))/12; jm_y0[i] = (mas0*(zl[i][0]**2 + xl[i][0]**2) - mas1*(zl[i][1]**2 + xl[i][1]**2))/12; jm_z0[i] = (mas0*(xl[i][0]**2 + yl[i][0]**2) - mas1*(xl[i][1]**2 + yl[i][1]**2))/12; } else if(kei[i] == 2){ /* 円筒 x */ mas0 = low[i] * xl[i][0] * pi * yl[i][0]**2 / 4/1000; mas1 = low[i] * xl[i][1] * pi * yl[i][1]**2 / 4/1000; mas[i] = mas0 - mas1; jm_x0[i] = (mas0*yl[i][0]**2 - mas1*yl[i][1]**2)/8; jm_y0[i] = (mas0*(4*xl[i][0]+3*yl[i][0]**2) - mas1*(4*xl[i][1]+3*yl[i][1]**2))/48; jm_z0[i] = jm_y0[i]; } else if(kei[i] == 3){ /* 円筒 y */ mas0 = low[i] * yl[i][0] * pi * zl[i][0]**2 / 4/1000; mas1 = low[i] * yl[i][1] * pi * zl[i][1]**2 / 4/1000; mas[i] = mas0 - mas1; jm_y0[i] = (mas0*zl[i][0]**2 - mas1*zl[i][1]**2)/8; jm_z0[i] = (mas0*(4*yl[i][0]+3*zl[i][0]**2) - mas1*(4*yl[i][1]+3*zl[i][1]**2))/48; jm_x0[i] = jm_z0[i]; } else if(kei[i] == 4){ /* 円筒 z */ mas0 = low[i] * zl[i][0] * pi * xl[i][0]**2 / 4/1000; mas1 = low[i] * zl[i][1] * pi * xl[i][1]**2 / 4/1000; mas[i] = mas0 - mas1; jm_z0[i] = (mas0*xl[i][0]**2 - mas1*xl[i][1]**2)/8; jm_x0[i] = (mas0*(4*zl[i][0]+3*xl[i][0]**2) - mas1*(4*zl[i][1]+3*xl[i][1]**2))/48; jm_y0[i] = jm_x0[i]; } for(j=1; j<=nb[i]; j+=1){ jm_x[i][j] = jm_x0[i] + mas[i] * (y0[i][j]**2 + z0[i][j]**2); jm_y[i][j] = jm_y0[i] + mas[i] * (z0[i][j]**2 + x0[i][j]**2); jm_z[i][j] = jm_z0[i] + mas[i] * (x0[i][j]**2 + y0[i][j]**2); gm_x[i][j] = mas[i] * x0[i][j]; gm_y[i][j] = mas[i] * y0[i][j]; gm_z[i][j] = mas[i] * z0[i][j]; gm_x_ttl = gm_x_ttl + gm_x[i][j]; gm_y_ttl = gm_y_ttl + gm_y[i][j]; gm_z_ttl = gm_z_ttl + gm_z[i][j]; jm_x_ttl = jm_x_ttl + jm_x[i][j]; jm_y_ttl = jm_y_ttl + jm_y[i][j]; jm_z_ttl = jm_z_ttl + jm_z[i][j]; } mas_ttl = mas_ttl + mas[i]*nb[i]; }/* end for */ gm_x = gm_x_ttl / mas_ttl; gm_y = gm_y_ttl / mas_ttl; gm_z = gm_z_ttl / mas_ttl; /* 重心まわりの J */ jm_x0_ttl = jm_x_ttl - mas_ttl*(gm_y**2 + gm_z**2); jm_y0_ttl = jm_y_ttl - mas_ttl*(gm_z**2 + gm_x**2); jm_z0_ttl = jm_z_ttl - mas_ttl*(gm_x**2 + gm_y**2); /* Debug */ /* nl = 0; PIC 12 ss_tmp = "Class 形状No state xl yl zl mas"; GNT [ss_tmp] <0,7> for(i = 1;i < 255; i += 1){ if(nb[i] == 0) { continue;} for(j=1; j<=nb[i]; j+=1){ nl = nl + 1; ss_tmp = sprint("%3d %1d %1d %7.2f %7.2f %7.2f %7.2f" ,i,kei[i],state[i][j],xl[i][0],yl[i][0],zl[i][0],mas[i]); GNT [ss_tmp] <0,[-nl*5]> } } */ /*--------------------------------------*/ /* Print Out */ /*--------------------------------------*/ PIC 11 ZOOM/ALL ss_tmp0 = "Class 形状No 比重 質量 重心 慣性モーメント(単体,座標軸)"; ss_tmp1 = " [g] [kg] x y z [cm] Jx0 Jy0 Jz0 Jx Jy Jz [kg.cm^2]"; nl = -1; for(i=1; i<255; i+=1){ if(nb[i] == 0) { continue;} for(j=1; j<=nb[i]; j+=1){ nl = nl + 1; if(j == 1){ ss_tmp = sprint("%3d-%2d %3d %5.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %10.2f %10.2f %10.2f" ,i,j,kei[i],low[i],mas[i],x0[i][j],y0[i][j],z0[i][j],jm_x0[i],jm_y0[i],jm_z0[i],jm_x[i][j],jm_y[i][j],jm_z[i][j]); } else{ ss_tmp = sprint(" %2d %7.2f %7.2f %7.2f %10.2f %10.2f %10.2f" ,j,x0[i][j],y0[i][j],z0[i][j],jm_x[i][j],jm_y[i][j],jm_z[i][j]); } loc_x = int(nl/50) * 300; loc_y = -(nl % 50)*3.5; if( (nl % 50) == 0){ GNT [ss_tmp0] TSIZE 2.5 <[loc_x],8.5> GNT [ss_tmp1] TSIZE 2.5 <[loc_x],5> } GNT [ss_tmp] TSIZE 2.5 <[loc_x],[loc_y]> } } ss_tmp0 = sprint(" 合計 %10.2f %7.2f %7.2f %7.2f %10.2f %10.2f %10.2f" ,mas_ttl,gm_x,gm_y,gm_z,jm_x_ttl,jm_y_ttl,jm_z_ttl); ss_tmp1 = sprint(" 重心まわりの慣性モーメント %10.2f %10.2f %10.2f" ,jm_x0_ttl,jm_y0_ttl,jm_z0_ttl); nl = nl + 2; loc_y = -(nl % 50)*3.5; GNT [ss_tmp0] TSIZE 2.5 <[loc_x],[loc_y]> nl = nl + 2; loc_y = -(nl % 50)*3.5; GNT [ss_tmp1] TSIZE 2.5 <[loc_x],[loc_y]> ERROR/ONN s = menu(3); exit;