/***************************************************************
Title: Gearing Simulation
Purpose: Showing the Power of TCL Programming
Author: Kang, Hsin-min
Copyright @1993 By TCAM Development House, Taipei.
Revised: Mar 1, 1997 for TwinCAD
****************************************************************/
#define division 2
COMMAND Gearing()
{
// double r, b, c;
#define r v2
#define b v3
#define c v4

// POINT wcen, wrot, crot, fcen;
#define wcen p3
#define wrot p4
#define crot p5
#define fcen p6
SLIST gear1, gear2;
int cnt,i;

if ( version()<=101 ) {
printf("\nNeed TCL V1.02+ Runtime Library!");
exit();
}
if ( !uservar("GEAR1CEN") ) {
s1=fsearch("GEARING.WRK");
if ( s1 == "" ) {
printf("\nThis program requires the GEARING.WRK.");
exit();
}
command("NEW L @!s1");
if ( !uservar("GEAR1CEN") ) {
printf("\nThis GEARING.WRK is not mine!");
exit();
}
}
@cmdecho = 0; // Turn off command echo
userbrk(0); // Disable user break

wcen = @gear1cen; // Read predefined centers
fcen = @gear2cen;
r = @gearratio;

@selmask = 0; // Enable all entities
@snapflag |= 0x2000; // Enable Mask

set_mask(0,"",0); // Clear all Layer Mask
set_mask(0,"GEAR1",1); // Enable GEAR1 layer
gear1 = getesel(-2); // Select All ...

set_mask(0,"",0);
set_mask(0,"GEAR2",1);
gear2 = getesel(-2); // Select All ...
command("ze"); // Zoom to Drawing Extent

layer("GEAR1","",-1,1); // Turn off layers...
layer("GEAR2","",-1,1);
regen();

keyin(); // Add for TwinCAD to start regeneration
regen_count(); // Reset regeneration count
redraw_count(); // Reset redraw count

set_mask(0,"",0); // Clear all layer mask

set_map(0,wcen); plotent(gear1); set_map(-1);
set_map(1,fcen); plotent(gear2); set_map(-1);

crot = wrot = cos(0),sin(0);
setplot(0x8a,0,0,0);
v1=0;
for(;;v1+=division) {
set_map(-5,crot); put_map(1,fcen);
set_map(-5,wrot); put_map(0,wcen);
v1 %= 360;
wrot = cos(v1),sin(v1);
p2 = cos(v1*r),sin(v1*r);
if ( userbrk(-1) )
break;
//
// Add addtional 'if' block to consider the case when
// the operator has scrolled the display or changed
// the size of the drawing area under Windows.
// Mar 01, 1997 by Kang, Hsin-Min
//
if ( identify("regen_count") ) {
if ( regen_count() || redraw_count() ) { // Have screen refresh
redraw_count(); // Reset redraw count
set_map(0,wcen); plotent(gear1); set_map(-1);
set_map(1,fcen); plotent(gear2); set_map(-1);
crot = p2;
set_map(-5,crot); // Reset to last state
continue;
}
}
put_map(0,wcen);
set_map(-5,crot); put_map(1,fcen);
crot = p2;
}
@cmdecho = 1;
userbrk(1);
layer("GEAR1","",-1,0); // Turn ON layers...
layer("GEAR2","",-1,0);
exit();
}
¡@