#include <tclcad.h>
/***************************************************************
Title: Roller/CAM Motion 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 CAMDemo()
{
// double r, b, c;
#define r v2
#define b v3
#define c v4
double rad;
// POINT wcen, wrot, crot, rcen;
#define wcen p3
#define wrot p4
#define crot p5
#define rcen p6
SLIST cam, roller;
// ENTITY camplate;
#define camplate e1

int cnt,i;

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

wcen = @camcenter; // Read predefined centers
rcen = @rollercen;
rad = @rollerdia/2;
b = rcen,wcen;

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

set_mask(0,"",0);
set_mask(0,"ROLLER",1);
roller = getesel(-2); // Select All ...

set_mask(0,"",0); // Clear all Layer Mask
set_mask(0,"CAM",1);
cam = getesel(-2); // Select All ...

camplate = ent_null();
cnt = ent_count(cam);
for(i=0;i<cnt;i++) {
if ( ent_type(cam[i]) == T_POLY ) {
camplate = cam[i];
break;
}
}
if ( !ent_ok(camplate) ) {
printf("\nNo Valid CAM Plate Found in memory.");
exit();
}
layer("CAM","",-1,0); // Turn on layers...
command("ze"); // Zoom to Drawing Extent
layer("CAM","",-1,1); // Turn off layers...
e2 = ent_pnext(camplate);
command("offset \@rad e2 p6 ");
camplate = ent_last();

layer("CAM","",-1,1); // Turn off layers...
layer("ROLLER","",-1,1);

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


set_map(0,wcen); plotent(cam); set_map(-1);
set_map(1,rcen); plotent(roller); set_map(-1);

crot = wrot = cos(0),sin(0);

setplot(0x8a,0,0,0);
v1=0;
set_map(-5,0,0);
for(;;v1+=division) {
put_map(1,rcen);
set_map(-5,wrot); put_map(0,wcen);
v1 %= 360;
wrot = cos(v1),sin(v1);
l1 = wcen,b,(90-v1)A;
ent_intsc(l1,camplate,&p2,0);
p2.y = V(p2,wcen)+wcen.y;
p2.x = rcen.x;
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
rcen = @rollercen;
set_map(0,wcen); plotent(cam); set_map(-1);
set_map(1,rcen); plotent(roller); set_map(-1);
rcen = p2;
set_map(-5,0,0); // Reset to last state
continue;
}
}
put_map(0,wcen);
set_map(-5,0,0); put_map(1,rcen);
rcen = p2;
}
@cmdecho = 1;
userbrk(1);
layer("CAM","",-1,0); // Turn ON layers...
layer("ROLLER","",-1,0);
ent_erase(camplate);
set_mask(0,"",0); // Clear all layer mask
exit();
}
¡@