;;;   CADDPAK   2003    General Macro Package for General CADD Pro
;;;   OFFSETLI.MCR      linear offset macro
;;;   Copyright 2003 by Bjorn R Holmgren; all rights reserved.
;;; 
;;;   THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. 
;;;   ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF 
;;;   MERCHANTABILITY ARE HEREBY DISCLAIMED.
;;;
/MSP,++,/XMD,++;
/VLC,;
;
.INITIALISE;
MO,RB,--,OD,--;
OR,??,/VIN,13,$VAL,OR,--;
/VST,18,'',/VST,1,'',/VST,2,'';
TO,!,/VRL,12,$VAL,TO,.5;
/VST,5,O,/VST,6,0;
/VRL,14,$S(6);
;
.MODE;
/PMT,1,'^^^GSelect Offset Mode^^ ...                     <ENTER> for : ^G',$S(5),'^^',#;
/PMT,2,'^^Single_^MO^^ffset          ^MT^^hrough', %55,'^MU^^ndo  ^MQ^^uit',#,|;
        '^^Multi_O^MF^^FSET     Multi_T^MH^^rough',%49,'^MZ^^oom',%59,'^MR^^edo        ',#,/CIN,/PMT,2,#,/PMT,3,#;
/VST,18,$STR;
/IF,$VAL[EQ]0,/GTO,MODE;    
/IF,$VAL[EQ]-1,/IF,$S(5)[EQ]T,/VST,18,T,/VST,1,'';
/IF,$VAL[EQ]-1,/IF,$S(5)[EQ]O,/VST,18,O,/VST,1,'';
/IF,$VAL[EQ]-1,/IF,$S(5)[EQ]MULTITHR,/VST,18,T,/VST,1,$S(5);
/IF,$VAL[EQ]-1,/IF,$S(5)[EQ]MULTIOFF,/VST,18,O,/VST,1,$S(5);
/IF,$VAL[EQ]-2,/GTO,EXIT;
/IF,$STR[EQ]O,/VST,5,$S(18),/VST,1,'';
/IF,$STR[EQ]T,/VST,5,$S(18),/VST,1,'';
/IF,$STR[EQ]F,/VST,18,O,/VST,1,MULTIOFF,/VST,5,$S(1);
/IF,$STR[EQ]H,/VST,18,T,/VST,1,MULTITHR,/VST,5,$S(1);
/IF,$STR[EQ]Q,/GTO,EXIT;
/IF,$STR[EQ]U,OO,/GTO,MODE;
/IF,$STR[EQ]R,UU,/GTO,MODE;
/IF,$STR[EQ]Z,/GTO,ZOOM;
;
.DISTANCE;
/IF,$S(18)[EQ]T,/GTO,SELECT;
RB,++;
/PMT,1,'^^^GEnter Distance to Offset^^ ... <ENTER> for : ^G',$R(14),'^^       New :_',#;
/VRL,4,~;                                                   OFFSET DISTANCE 
/IF,$DERR[EQ]-1,/VRL,4,$R(14);
/IF,$DERR[EQ]-2,/GTO,EXIT; 
/VRL,14,$R(4);
;
.SELECT;
RB,--;
/IF,$S(2)[EQ]CHANGEMODE,/VST,2,'',/GTO,PICKSIDE;
SE,!;
/PMT,3,#,/PMT,2,#;
/PMT,1,'^^^GPick Object to Offset^^ ...               <ESC> to set Mode ...',#;
/IF,$S(1)[NE]'',/PMT,2,'Offset Mode at next Prompt ...          <ENTER> to Undo Last ...',#;
/VPT,0,@;
/IF,$DERR[EQ]-2,/GTO,MODE; 
/IF,$DERR[EQ]-1,OO,/GTO,SELECT;
/IF,$DERR[NE]0,/GTO,EXIT;
/VPT,0,TK,L,PU;
/CEL,O,$X(0),$Y(0),!;
/IF,$VAL[EQ]0,/DEL,/PMT,3,'No Object found ... Pick again ...',#,/GTO,SELECT;
;
/EEX,1,E,/VIN,0,$VAL;
/EEX,1,P,1,A,!,/VPT,0,$PNTX,$PNTY;
/EEX,1,P,2,A,!,/VPT,1,$PNTX,$PNTY;
/EEX,1,P,3,A,!,/VPT,4,$PNTX,$PNTY;
/DEL;
/IF,$I(0)[EQ]11,/VPT,1,$X(4),$Y(4);
ME,2,$X(0),$Y(0),$X(1),$Y(1),/VRL,0,$VAL;              $R(0) OBJECT ANGLE
;
/PMT,2,#,/PMT,3,#;
/IF,$I(0)[EQ]11,/PMT,2,'^^^GFor ARC^^ ... Ref Point is chord through end points ...',#;
/IF,$S(18)[EQ]T,/GTO,THROUGH;
;
.PICKSIDE;
/PMT,1,'^^^GPick Side for Offset^^ ...                  <ESC> abort ...',#;
/GTO,PICKEDSIDE;
;
.THROUGH;
/PMT,1,'^^^GPick Offset Through Point^^ ...             <ESC> abort ...',#;
;
.PICKEDSIDE;
/PMT,3,'<ENTER> to change offset mode or offset distance  ... ',$S(18),' ',$S(1),#;
/VPT,2,@;   
/IF,$DERR[EQ]-1,/VST,2,CHANGEMODE,/GTO,MODE;
/IF,$DERR[EQ]-2,/GTO,SELECT;       
/IF,$DERR[NE]0,/GTO,EXIT;
/IF,$I(0)[EQ]10,/GTO,CIRCLE;
/VPT,2,TK,L,PU;
ME,2,$X(0),$Y(0),$X(2),$Y(2),/VRL,1,$VAL;              R1 POINT ANGLE
;
.CALCOFFSET;
/VRL,2,$SQT($SQR($X(0)-$X(2))+$SQR($Y(2)-$Y(0)));      R2 POINT DISTANCE
/VRL,3,$R(2)*$COS($R(0)+90-$R(1));                     R3 OFFSET DISTANCE
/IF,$S(18)[EQ]O,/IF,$R(3)[LT]0,/VRL,3,(-1*$R(4));       R3 OFFSET O MODE
/IF,$S(18)[EQ]O,/IF,$R(3)[GE]0,/VRL,3,$R(4);            R3 OFFSET O MODE
;
.NEWPOINT;
/VPT,3,$X(0)-($R(3)*$COS(360+90-$R(0))),$Y(0)+($R(3)*$SIN(360+90-$R(0)));
/GTO,OFFSET;
;
.OFFSET;
CO,L,!,$X(0),$Y(0),$X(3),$Y(3),1; 
/IF,$S(1)[EQ]MULTIOFF,/GTO,SELECT;
/IF,$S(1)[EQ]MULTITHR,/GTO,SELECT;
/GTO,MODE;
;
.CIRCLE;
/IF,$S(18)[EQ]T,/VPT,3,$X(2),$Y(2),/GTO,OFFSET;
ME,D,$X(0),$Y(0),$X(1),$Y(1),PU,/VRL,5,$VAL;
/VPT,3,$X(0)+$R(4),$Y(0);
/IF,$X(2)[LT]$X(0),/IF,$Y(2)[LT]$Y(0)+$R(5),/IF,$Y(2)[GT]$Y(0)-$R(5),/VPT,3,$X(0)-$R(4),$Y(0);
/IF,$X(2)[GT]$X(0),/IF,$Y(2)[LT]$Y(0)+$R(5),/IF,$Y(2)[GT]$Y(0)-$R(5),/VPT,3,$X(0)+$R(4),$Y(0);
/IF,$Y(2)[GT]$Y(0)+$R(5),/IF,$X(2)[LT]$X(0)+$R(5),/IF,$X(2)[GT]$X(0)-$R(5),/VPT,3,$X(0),$Y(0)+$R(4);
/IF,$Y(2)[LT]$Y(0)-$R(5),/IF,$X(2)[LT]$X(0)+$R(5),/IF,$X(2)[GT]$X(0)-$R(5),/VPT,3,$X(0),$Y(0)-$R(4);
;
.OFFSET;
CO,L,!,$X(0),$Y(0),$X(3),$Y(3),1;
/GTO,SELECT;
;
.ZOOM;
/PMT,3,#,/PMT,1,'Select Zoom Mode ...',%45,'<ESC> to abort ...',#;
/PMT,2,'^^^MW^^indow  ^MP^^revious  ^MI^^n  ^MO^^ut  ^MA^^ll   PA^MN^^   A^MB^^ort',#,/CIN;
/IF,$STR[EQ]W,/PMT,2,#,/PMT,1,'Enter Window ... ',#,ZW,@,@,/GTO,LEAVEZOOM;
/IF,$STR[EQ]P,ZP,/GTO,LEAVEZOOM;
/IF,$STR[EQ]I,/PMT,2,#,/PMT,1,'Enter Centre of View ... ',#,ZI,@,/GTO,LEAVEZOOM;
/IF,$STR[EQ]O,/PMT,2,#,/PMT,1,'Enter Centre of View ... ',#,ZO,@,/GTO,LEAVEZOOM;
/IF,$STR[EQ]A,ZA,/GTO,LEAVEZOOM;
/IF,$STR[EQ]N,/PMT,2,#,/PMT,1,'Enter Centre of View ... ',#,PA,@,/GTO,LEAVEZOOM;
/IF,$STR[EQ]B,/GTO,LEAVEZOOM;
/IF,$VAL[EQ]-2,/GTO,LEAVEZOOM;
/IF,$VAL[LE]0,/GTO,ZOOM;
.LEAVEZOOM;
/GTO,MODE;
;
.EXIT;
OD,++,RB,++;
TO,$R(12);
/IF,$I(13)[EQ]1,OR,++;
MR;
/XMD,--,/MSP,--,PU;

