home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
MACRO
/
DISP.M
< prev
next >
Wrap
Text File
|
1996-07-02
|
16KB
|
773 lines
var private const MIN_ZOOM_SIZE = -10;
var private const MAX_ZOOM_SIZE = 200;
//
// 現在のカーソルを画面中央に
//
function DispCenter()
{
var temp_vec, temp;
var win = WIN_PERS;
temp = Position(Cursor())*pers_mat;
temp_vec = temp-vector(abs(temp),0,0);
pers_mat = pers_mat*move(UNIT_MATRIX, -temp_vec);
SetPers( pers_mat );
if( Cursor() != Center())
{
Center( Cursor());
win = win | WIN_XY | WIN_YZ | WIN_ZX;
}
Update( CLEAR, win );
}
//
// フィット
//
function Fit()
{
var prev_sel, temp_mat;
var pos[2], range[3], size, len;
var temp, width, height, win_type;
prev_sel = Select();
if(( ShiftStat() & 1 ) != 1 )
SelectAll( TRUE );
if( SelectPolygons() == 0 )
{
Warning();
if( MESSAGE == ON )
Message( "面がないので表示範囲を設定できません" );
return;
}
else
{
SelectBox( pos );
Center( (pos[0]+pos[1])*scale(UNIT_MATRIX, 0.5, 0.5, 0.5 ));
}
len = abs(Position(pos[1])-Position(pos[0]))/2;
width = ViewWidth( WIN_PERS );
height = ViewWidth( WIN_PERS );
if( width > height )
len = 1.5*(0.0+width)*len/(height*tan((0.0+pers_deg/2)*PI/180));
else
len = 1.5*len/tan((0.0+pers_deg/2)*PI/180 );
temp = Position(Center())*pers_mat-vector(len,0,0);
pers_mat = pers_mat*move(UNIT_MATRIX, -temp);
win_type = Window();
if( win_type == WIN_ALL )
win_type = WIN_XY;
width = ViewWidth( win_type );
height = ViewHeight( win_type );
if( width > height )
len = height;
else
len = width;
element(Position(pos[1])-Position(pos[0]), range );
if( range[0] > range[1] )
{
if( range[0] > range[2] )
size = range[0];
else
size = range[2];
}
else
{
if( range[1] > range[2] )
size = range[1];
else
size = range[2];
}
size = size*3/2;
if( zoomsize > 0 )
temp = (0.0+zoomsize)*size/len;
else
temp = size/((0.0-zoomsize)*len);
if( temp < 1 )
temp = (-1.0)/temp;
zoomsize = 0+temp;
if( zoomsize > MAX_ZOOM_SIZE )
{
zoomsize = MAX_ZOOM_SIZE;
ButtonEnable( zoomdown_id, BUTTON_DISABLE );
UpdateButton( zoomdown_id );
}
if( zoomsize < MIN_ZOOM_SIZE )
zoomsize = MIN_ZOOM_SIZE;
if( zoomsize == 0 )
zoomsize = 1;
if( zoomsize > 1 )
{
ButtonEnable( zoomup_id, BUTTON_ENABLE );
UpdateButton( zoomup_id );
}
else
{
ButtonEnable( zoomup_id, BUTTON_DISABLE );
UpdateButton( zoomup_id );
}
if( zoomsize < MAX_ZOOM_SIZE )
{
ButtonEnable( zoomdown_id, BUTTON_ENABLE );
UpdateButton( zoomdown_id );
}
SetZoom( -zoomsize );
StatusZoom();
Select( prev_sel );
SetPers( pers_mat );
Update( CLEAR , WIN_XY | WIN_YZ | WIN_ZX );
}
//
// 表示範囲指定
//
function SelectZoom()
{
var width_size, height_size;
var cur0, cur1;
var key, pos_temp[3], pos0[3], pos1[3], size, temp, len;
var draw_flag = ON, pick;
var ver, i, j;
PushMenu();
MenuPosition( Menu( " 表示範囲指定中",
"指定中止 ESC", MenuQuit ), Menu_Title );
quit_flag = FALSE;
ver = 0;
temp = 0;
cur = Cursor();
cur0 = cur;
pick = cur;
input_flag = OFF;
while( TRUE )
{
if( draw_flag == ON )
{
if( ver != 0 )
DrawBox( cur0, cur );
}
key = WaitEvent();
if( key )
input_flag = ON;
cur = Cursor();
key = KeyCode();
if( input_flag | key == INPUT_KEY )
{
if( ver == 0 )
{
cur0 = cur;
ver++;
}
else
{
cur1 = cur;
break;
}
}
else if( key == ESC | quit_flag == TRUE )
{
PopandClear( OVERWRITE );
return;
}
else if( key == BS )
{
if( ver == 0 )
{
PopandClear( OVERWRITE );
return;
}
else
{
ver--;
DrawBox( pick, cur0 );
}
}
else
temp = KeyProcess( key );
if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
{
draw_flag = ON;
if( ver != 0 )
DrawBox( cur0, pick );
}
else
draw_flag = OFF;
pick = Cursor();
input_flag = OFF;
}
Clear( OVERWRITE );
if( cur0 == cur1 )
Center( cur0 );
else
{
temp = MouseWindow();
if( temp == WIN_PERS )
temp = WIN_XY;
width_size = ViewWidth( temp );
height_size = ViewHeight( temp );
Position( cur0, pos0 );
Position( cur1, pos1 );
Center(( cur0 + cur1 )*scale(UNIT_MATRIX, 0.5, 0.5, 0.5 ));
pos0[0] = 0.0+abs( pos0[0] - pos1[0] );
pos0[1] = 0.0+abs( pos0[1] - pos1[1] );
pos0[2] = 0.0+abs( pos0[2] - pos1[2] );
if( temp == WIN_XY )
{
i = 0;
j = 1;
}
else if( temp == WIN_YZ )
{
i = 1;
j = 2;
}
else
{
i = 0;
j = 2;
}
if( pos0[i] == 0 & pos0[j] == 0 )
{
Update( CLEAR, WIN_XY | WIN_YZ | WIN_ZX );
PopandClear( OVERWRITE );
return;
}
if( pos0[i] * height_size / width_size > pos0[j] )
{
size = pos0[i];
len = width_size;
}
else
{
size = pos0[j];
len = height_size;
}
if( ShiftStat() & 1 )
{
if( zoomsize > 0 )
temp = (0.0+zoomsize)*len/size;
else
temp = ((0.0+len)/(size))/(-zoomsize);
if( temp < 1 )
{
temp = (-1.0)/temp;
if( temp < MIN_ZOOM_SIZE )
temp = MIN_ZOOM_SIZE;
}
}
else
{
if( zoomsize > 0 )
temp = (0.0+zoomsize) * size / len;
else
temp = size/((0.0-zoomsize)*len);
if( temp < 1 )
temp = (-1.0)/temp;
}
zoomsize = 0+temp;
}
if( zoomsize > MAX_ZOOM_SIZE )
{
zoomsize = MAX_ZOOM_SIZE;
ButtonEnable( zoomdown_id, BUTTON_DISABLE );
UpdateButton( zoomdown_id );
}
if( zoomsize < MIN_ZOOM_SIZE )
zoomsize = MIN_ZOOM_SIZE;
if( zoomsize == 0 )
zoomsize = 1;
if( zoomsize > 1 )
{
ButtonEnable( zoomup_id, BUTTON_ENABLE );
UpdateButton( zoomup_id );
}
else
{
ButtonEnable( zoomup_id, BUTTON_DISABLE );
UpdateButton( zoomup_id );
}
if( zoomsize < MAX_ZOOM_SIZE )
{
ButtonEnable( zoomdown_id, BUTTON_ENABLE );
UpdateButton( zoomdown_id );
}
SetZoom( -zoomsize );
StatusZoom();
Update( CLEAR, WIN_XY | WIN_YZ | WIN_ZX );
PopMenu();
}
function WindowChange()
{
var win;
var num;
var msg0[5];
win = Window();
if( win == WIN_ALL )
num = 0;
else if( win == WIN_XY )
num = 1;
else if( win == WIN_YZ )
num = 2;
else if( win == WIN_ZX )
num = 3;
else
num = 4;
DlogOpen( " 表示図面変更", 1 );
msg0[0] = " 四面図 ";
msg0[1] = "XY図面";
msg0[2] = "YZ図面";
msg0[3] = "ZX図面";
msg0[4] = " 透視図 ";
DlogSelect( 0, "表示図面", msg0, num );
if( DlogWait() )
{
win = DlogAnswer( 0 );
if( win == 0 )
Window( WIN_ALL );
else if( win == 1 )
Window( WIN_XY );
else if( win == 2 )
Window( WIN_YZ );
else if( win == 3 )
Window( WIN_ZX );
else
Window( WIN_PERS );
}
}
function Invisible()
{
var temp;
// if ( SelectPolygons() > 0 )
{
temp = Select();
SelectAll( TRUE, SELECT_XOR );
if( SelectPolygons() == 0 )
{
Select( temp );
Warning();
if( MESSAGE == ON )
Message( "非表示にする面が存在しません" );
}
else
{
Select( temp );
invisible_flag = TRUE ;
PolyInvisible( TRUE );
Update( TRUE );
prevnext_flag = FALSE;
pers_rotation_flag = FALSE;
}
}
/*
else
{
Warning();
if( MESSAGE == ON )
{
SelectAll( TRUE );
if( SelectPolygons() != 0 )
Message( "すべての面を非表示にすることはできません" );
else
Message( "非表示にする面が存在しません" );
SelectAll( FALSE );
}
}
*/
}
function Visible()
{
if( invisible_flag == TRUE )
{
invisible_flag = FALSE ;
PolyInvisible( FALSE );
Update( TRUE );
pers_rotation_flag = FALSE;
prevnext_flag = FALSE;
}
else
{
Warning();
if( MESSAGE == ON )
Message( "非表示されている面は存在しません" );
}
}
function ZoomDown()
{
var i;
for( i = 0;i<MAX_ZOOM_NUM;i++ )
{
if( zoom_number[i] > zoomsize )
break;
else if( zoom_number[i] == zoomsize )
{
i++;
break;
}
}
if( i >= MAX_ZOOM_NUM )
{
i = MAX_ZOOM_NUM - 1;
Warning();
}
if( i == ( MAX_ZOOM_NUM - 1 ))
{
ButtonEnable( zoomdown_id, BUTTON_DISABLE );
UpdateButton( zoomdown_id );
}
else if( i == 1 )
{
ButtonEnable( zoomup_id, BUTTON_ENABLE );
UpdateButton( zoomup_id );
}
zoomsize = zoom_number[i];
SetZoom( -zoomsize );
StatusZoom();
Update( CLEAR, WIN_XY | WIN_YZ | WIN_ZX );
}
function ZoomUp()
{
var i;
for( i = 0;i<MAX_ZOOM_NUM;i++ )
{
if( zoom_number[i] >= zoomsize )
break;
}
i--;
if( i < 0 )
{
i = 0;
Warning();
}
if( i == 0 )
{
ButtonEnable( zoomup_id, BUTTON_DISABLE );
UpdateButton( zoomup_id );
}
else if( i == (MAX_ZOOM_NUM -2 ))
{
ButtonEnable( zoomdown_id, BUTTON_ENABLE );
UpdateButton( zoomdown_id );
}
zoomsize = zoom_number[i];
SetZoom( -zoomsize );
StatusZoom();
Update( CLEAR, WIN_XY | WIN_YZ | WIN_ZX );
}
function InvisibleDisp()
{
if( DrawInvisible() == FALSE )
{
DrawInvisible( TRUE );
Update( OVERWRITE );
}
else
{
DrawInvisible( FALSE );
Update( CLEAR );
}
// if( InvisibleFlag == TRUE )
// Update( CLEAR );
}
function MeshDisp()
{
if( meshdisp_flag == ON )
{
meshdisp_flag = OFF;
SetGrid( 0, mouse_grid );
}
else
{
meshdisp_flag = ON;
SetGrid( mesh_grid, mouse_grid );
}
Update( CLEAR, WIN_XY | WIN_YZ | WIN_ZX );
}
function HousenDisp()
{
if( housendisp_flag == ON )
{
housendisp_flag = OFF;
VisibleVector( 0 );
}
else
{
housendisp_flag = ON;
VisibleVector( vecvisible_len );
}
Update( CLEAR, WIN_PERS );
}
function HoukouDisp()
{
if( houkoudisp_flag == ON )
{
houkoudisp_flag = OFF;
VisiblePolyVector( 0 );
}
else
{
houkoudisp_flag = ON;
VisiblePolyVector( houkouvisible_len );
}
Update( CLEAR, WIN_PERS );
}
function TenDisp()
{
if( tendisp_flag == ON )
{
tendisp_flag = OFF;
VisibleVertex( 0 );
}
else
{
tendisp_flag = ON;
VisibleVertex( 1 );
}
Update( CLEAR );
}
function PersUraDisp()
{
if( uradisp_flag == ON )
{
uradisp_flag = OFF;
DrawFrontOnly( uradisp_flag );
}
else
{
uradisp_flag = ON;
DrawFrontOnly( uradisp_flag );
}
Update( CLEAR, WIN_PERS );
}
function private Check_flag()
{
var temp;
temp = MenuFunction();
if( temp == MeshDisp )
{
if( meshdisp_flag == ON )
MenuEnable( MENU_CHECK );
else
MenuEnable( MENU_NOCHECK );
}
else if( temp == HousenDisp )
{
if( housendisp_flag == ON )
MenuEnable( MENU_CHECK );
else
MenuEnable( MENU_NOCHECK );
}
else if( temp == HoukouDisp )
{
if( houkoudisp_flag == ON )
MenuEnable( MENU_CHECK );
else
MenuEnable( MENU_NOCHECK );
}
else if( temp == TenDisp )
{
if( tendisp_flag == ON )
MenuEnable( MENU_CHECK );
else
MenuEnable( MENU_NOCHECK );
}
else if( temp == PersUraDisp )
{
if( uradisp_flag == ON )
MenuEnable( MENU_CHECK );
else
MenuEnable( MENU_NOCHECK );
}
}
function private InvisibleCheck()
{
var sel, temp;
if( SelectPolygons() == 0 )
temp = MENU_DISABLE;
else
{
sel = Select();
SelectAll( TRUE, SELECT_XOR );
if( SelectPolygons() != 0 )
temp = MENU_ENABLE;
else
temp = MENU_DISABLE;
Select( sel );
}
MenuEnable( temp );
}
function private VisibleCheck()
{
if( invisible_flag == OFF )
MenuEnable( MENU_DISABLE );
else
MenuEnable( MENU_ENABLE );
}
function private InvisibleDispCheck()
{
if( DrawInvisible() == FALSE )
MenuEnable( MENU_NOCHECK );
else
MenuEnable( MENU_CHECK );
}
function MeshSetup()
{
var dispgrid;
dispgrid = sliderconv2( mesh_grid );
DlogOpen( "メッシュ幅設定", 1 );
DlogSlider( 0, "メッシュ幅", SLIDER_HABA, MAX_SLIDER_NUM2, dispgrid, gridconv2 );
if ( DlogWait() )
{
dispgrid = DlogAnswer( 0 );
mesh_grid = gridconv2( dispgrid );
if( meshdisp_flag == ON )
{
SetGrid( mesh_grid, mouse_grid );
Update( CLEAR, WIN_XY | WIN_YZ | WIN_ZX );
}
StatusMesh();
}
}
function HousenSetup()
{
var dispvec;
dispvec = sliderconv1( vecvisible_len );
DlogOpen( "法線の長さ設定", 1 );
DlogSlider( 0, "法線の長さ", SLIDER_HABA, MAX_SLIDER_NUM1, dispvec, gridconv1 );
if ( DlogWait() )
{
dispvec = DlogAnswer( 0 );
vecvisible_len = gridconv1( dispvec );
if( housendisp_flag == ON )
{
VisibleVector( vecvisible_len );
Update( CLEAR, WIN_PERS );
}
}
}
function HoukouSetup()
{
var dispvec;
dispvec = sliderconv1( houkouvisible_len );
DlogOpen( "面の方向表示線の長さ設定", 1 );
DlogSlider( 0, "表示線の長さ", SLIDER_HABA, MAX_SLIDER_NUM1, dispvec, gridconv1 );
if ( DlogWait() )
{
dispvec = DlogAnswer( 0 );
houkouvisible_len = gridconv1( dispvec );
if( houkoudisp_flag == ON )
{
VisiblePolyVector( houkouvisible_len );
Update( CLEAR, WIN_PERS );
}
}
}
function PersInit()
{
DefaultPers();
Update( CLEAR, WIN_PERS );
}
if( MACHINE == "WINDOWS" )
{
MenuPosition(
Menu( " 表示(&D)",
"作画(&R)", Rend,PolyCheck,
"作画設定...(&O)", RendSetup,
"FXGA表示(&F)", Fxga,PolyCheck,
"-------------------", SEPARATE_MENU,
"選択面のみ表示(&I) I", Invisible,InvisibleCheck,
"全ての面を表示(&A) シフト+I", Visible,VisibleCheck,
"非表示面を薄く表示(&T)", InvisibleDisp,InvisibleDispCheck,
"-------------------", SEPARATE_MENU,
"表示範囲指定(&Z) Z", SelectZoom,
"表示範囲拡大(&D)", ZoomDown,
"表示範囲縮小(&U)", ZoomUp,
"-------------------", SEPARATE_MENU,
"表示図面変更...(&W)", WindowChange,
"-------------------", SEPARATE_MENU,
"点を表示(&V)", TenDisp,Check_flag,
"-------------------", SEPARATE_MENU,
"表の面のみ表示(&B)", PersUraDisp,Check_flag,
"-------------------", SEPARATE_MENU,
"メッシュを表示(&M)", MeshDisp,Check_flag,
"メッシュ幅設定...(&O)", MeshSetup,
"-------------------", SEPARATE_MENU,
"法線を表示(&N)", HousenDisp,Check_flag,
"法線表示長さ設定...(&O)", HousenSetup,
"-------------------", SEPARATE_MENU,
"面の方向表示(&P)", HoukouDisp,Check_flag,
"方向表示長さ設定...(&O)", HoukouSetup,
"-------------------", SEPARATE_MENU,
"透視図初期化(&I) HOME", PersInit,
"表示初期化(&I) シフト+HOME", AllInit
), Menu_disp
);
}
else
{
MenuPosition(
Menu( " 表示(&D)",
"作画 ", Rend,PolyCheck,
"作画設定... ", RendSetup,
"-------------------", SEPARATE_MENU,
"選択面のみ表示 I", Invisible,InvisibleCheck,
"全ての面を表示 シフト+I", Visible,VisibleCheck,
"非表示面を薄く表示 ", InvisibleDisp,InvisibleDispCheck,
"-------------------", SEPARATE_MENU,
"表示範囲指定 Z", SelectZoom,
"表示範囲拡大 ", ZoomDown,
"表示範囲縮小 ", ZoomUp,
"-------------------", SEPARATE_MENU,
"表示図面変更... ", WindowChange,
"-------------------", SEPARATE_MENU,
"点を表示 ", TenDisp,Check_flag,
"-------------------", SEPARATE_MENU,
"表の面のみ表示 ", PersUraDisp,Check_flag,
"-------------------", SEPARATE_MENU,
"メッシュを表示 ", MeshDisp,Check_flag,
"メッシュ幅設定... ", MeshSetup,
"-------------------", SEPARATE_MENU,
"法線を表示 ", HousenDisp,Check_flag,
"法線表示長さ設定...", HousenSetup,
"-------------------", SEPARATE_MENU,
"面の方向表示 ", HoukouDisp,Check_flag,
"方向表示長さ設定...", HoukouSetup,
"-------------------", SEPARATE_MENU,
"透視図初期化 HOME", PersInit,
"表示初期化 シフト+HOME", AllInit
), Menu_disp
);
}