// April 14, 1978 4:06 PM *** overlay C ***
get "zpDefs.bcpl"
get "zpPressDf.bcpl"
// outgoing procedures:
external [
WritePieceObject
]
// incoming procedures:
external [
FLD; FLDI; FST // FLOAT
FTR; FML; FDV
FAD; FNEG; FSB; FCM; FSN
FSTDP; FLDDP; DPAD
ComputeNormal // ZPPIECE
MakeCubic
PrintFpValues // ZPPRESS
PutObjectInELtable
PutsLine // ZPPUTS
PutsMove
PutsCurve
PutsRoundTip
]
// incoming statics:
external [
@showValues // ZPPRESS
]
// local floating point registers
manifest [
t0=0; t1=1; t2=2; t3=3
]
let WritePieceObject(pressFile, thickness, X0, Y0, dX0, dY0, X1, Y1, dX1, dY1, pec0, pec1) =
valof [WritePieceObject
// PIECE OBJECT (pec0 & pec1 are end conditions at points 0 & 1)
if showValues then PrintFpValues("WPO: ", X0, Y0, dX0, dY0, X1, Y1, dX1, dY1)
let objectWordCount=0
// scaled normals
let nX0=vec 2; let nY0=vec 2
let nX1=vec 2; let nY1=vec 2
// scaled tangents
let tX0=vec 2; let tY0=vec 2
let tX1=vec 2; let tY1=vec 2
unless ComputeNormal(thickness, dX0, dY0, nX0, nY0, tX0, tY0) then
resultis PutObjectInELtable(0)
unless ComputeNormal(thickness, dX1, dY1, nX1, nY1, tX1, tY1) then
resultis PutObjectInELtable(0)
// side points & derivatives
let sX0=vec 2; let sY0=vec 2
let cX0=vec 2; let cY0=vec 2
let sX1=vec 2; let sY1=vec 2
let cX1=vec 2; let cY1=vec 2
let sX00tr,sY00tr=nil,nil
let sX0tr,sY0tr=nil,nil
let sX1tr,sY1tr=nil,nil
// cubic coefs
let aX0=vec 2; let aY0=vec 2
let bX0=vec 2; let bY0=vec 2
// SIDE 1
// move to beginning of piece (remember this point: sX00tr, sY00tr)
sX00tr=FTR(FST(FAD(FLD(t0,X0),nX0),sX0))
sY00tr=FTR(FST(FAD(FLD(t1,Y0),nY0),sY0))
sX1tr=FTR(FST(FAD(FLD(t2,X1),nX1),sX1))
sY1tr=FTR(FST(FAD(FLD(t3,Y1),nY1),sY1))
FST(FLD(t0,dX0),cX0); FST(FLD(t1,dY0),cY0)
FST(FLD(t2,dX1),cX1); FST(FLD(t3,dY1),cY1)
PutsMove(pressFile, lv objectWordCount, sX00tr, sY00tr)
// curve for side 1
MakeCubic(sX0, sX1, cX0, cX1, aX0, bX0)
MakeCubic(sY0, sY1, cY0, cY1, aY0, bY0)
PutsCurve(pressFile,lv objectWordCount, cX0, cY0, bX0, bY0, aX0, aY0)
// connect to true end point, in order to avoid round off errors
PutsLine(pressFile, lv objectWordCount, sX1tr, sY1tr)
// SIDE 2
sX0tr=FTR(FST(FSB(FLD(t2,X1),nX1),sX0))
sY0tr=FTR(FST(FSB(FLD(t3,Y1),nY1),sY0))
// after side 1, end condition 1 (flat/square/round):
if pec1 eq fPEC then PutsLine(pressFile, lv objectWordCount, sX0tr, sY0tr)
if pec1 eq sPEC then [
FAD(FAD(FLD(t0, X1), nX1), tX1)
FAD(FAD(FLD(t1, Y1), nY1), tY1)
PutsLine(pressFile, lv objectWordCount, FTR(t0), FTR(t1))
PutsLine(pressFile, lv objectWordCount, FTR(FAD(t2, tX1)), FTR(FAD(t3, tY1)))
PutsLine(pressFile, lv objectWordCount, sX0tr, sY0tr)
]
if pec1 eq rPEC then
PutsRoundTip(pressFile, lv objectWordCount, sX1tr, sY1tr, sX0tr, sY0tr)
sX1tr=FTR(FST(FSB(FLD(t0,X0),nX0),sX1))
sY1tr=FTR(FST(FSB(FLD(t1,Y0),nY0),sY1))
FST(FNEG(FLD(t0,dX0)),cX1)
FST(FNEG(FLD(t1,dY0)),cY1)
FST(FNEG(FLD(t2,dX1)),cX0)
FST(FNEG(FLD(t3,dY1)),cY0)
// curve for side 2
MakeCubic(sX0, sX1, cX0, cX1, aX0, bX0)
MakeCubic(sY0, sY1, cY0, cY1, aY0, bY0)
PutsCurve(pressFile,lv objectWordCount, cX0, cY0, bX0, bY0, aX0, aY0)
// connect to true end point, in order to avoid round off errors
PutsLine(pressFile, lv objectWordCount, sX1tr, sY1tr)
// after side 2, end condition 0 (flat/square/round):
if pec0 eq fPEC then PutsLine(pressFile, lv objectWordCount, sX00tr, sY00tr)
if pec0 eq sPEC then [
FSB(FSB(FLD(t0, X0), nX0), tX0)
FSB(FSB(FLD(t1, Y0), nY0), tY0)
PutsLine(pressFile, lv objectWordCount, FTR(t0), FTR(t1))
FSB(FAD(FLD(t2, X0), nX0), tX0)
FSB(FAD(FLD(t3, Y0), nY0), tY0)
PutsLine(pressFile, lv objectWordCount, FTR(t2), FTR(t3))
PutsLine(pressFile, lv objectWordCount, sX00tr, sY00tr)
]
if pec0 eq rPEC then
PutsRoundTip(pressFile, lv objectWordCount, sX1tr, sY1tr, sX00tr, sY00tr)
resultis PutObjectInELtable(objectWordCount)
]WritePieceObject