/* CMD:Flatline
Line Simplifier 1.01 by GLYPH (11/06/1995)
E-Mail: y82s1@unb.ca
Removes useless points that lie in a straight line, like when you use TEXT
to make a block-letter 'L' and you get 50 points in a straight line up
the side of the 'L', you can use this to nuke them.
* ONLY WORKS ON 2-D POLYS ON THE Z-AXIS, NOT 3-D.
* WORKS BEST WHEN USED ON ONE POLY AT A TIME
* CAN HAVE FUNNY RESULTS IF POLYS HAVE LOTS OF HOLES
* AFFECTS ALL POLYS IN LAYER
**** CANNOT BE UNDONE ****
It's best when you're making logos with splines.
If you freeze a spline and you get too many points,
put it alone on a layer and run this macro.
*/
mxx="LWModelerARexx.port"
signal on error
signal on syntax
check = addlib("rexxmathlib.library",0,-30,0)
mxx_add = addlib(mxx,0)
call main
if (mxx_add) then call remlib(mxx)
exit
syntax:
error:
t=Notify(1,'!Rexx Script Error','@'ErrorText(rc),'Line 'SIGL)
if (mxx_add) then call remlib(mxx)
exit
main:
call req_begin "FLATLINE v1.0 by GLYPH"
id_ang = req_addcontrol("Flatten Angles Less Than (±°)", N, 0)
call req_setval id_ang, 2.0, 1.0
if (~req_post()) then return
flatang = req_getval(id_ang)
call req_end
call MERGEPOINTS()
tagged = 1
psofar = 0
pass = 1
do forever
call FLATTEN
psofar = psofar + flat - 1
pass = pass + 1
if tags < 2 then do
if psofar = 0 then call notify(1,"Already flat.")
if psofar > 0 then call notify(1,psofar' points removed.')
return
end
end
FLATTEN:
n = xfrm_begin()
if n<3 then do
call notify(1,"Must have at least 3 points.")
exit
end
call meter_begin (n+1-tagged), "Reading Points..."
do i = tagged to n
xyz = xfrm_getpos(i)
parse var xyz x.i y.i z.i
call meter_step
end
call meter_end
call xfrm_end
box = boundingbox()
parse var box zz x1 x2 y1 y2 z1 z2
outx = max(x1,x2) + 1
xlo = outx - 0.5
xhi = outx + 0.5
ylo = -1
yhi = 1
zlo = -1
zhi = 1
flat = 1
flatten.1 = 0
tags = 0
call meter_begin (n-tagged), "Flattening Lines (pass "pass")"
if n < (tagged+1) then return
do i = tagged+1 to n
h = i-1
j = i+1
if j>n then j = 1
if x.j ~= x.h then do
slopa = (y.j - y.h)/(x.j - x.h)
end
if x.j = x.h then do
slopa = 0
if (y.j - y.h) < 0 then slopa = -99999999
if (y.j - y.h) > 0 then slopa = 99999999
end
if x.i ~= x.h then do
slopb = (y.i - y.h)/(x.i - x.h)
end
if x.i = x.h then do
slopb = 999999999
if (y.i - y.h) < 0 then slopb = -99999999
if (y.i - y.h) > 0 then slopb = 99999999
end
actn = slopa
call ARCTAN
thetaa = th
actn = slopb
call ARCTAN
thetab = th
offang = abs(thetaa - thetab)
if offang <= flatang then do
oldflat = flat-1
if flatten.oldflat = (i-1) then do
tags = tags + 1
if tags = 1 then tagged = i
end
if flatten.oldflat ~= (i-1) then do
flatten.flat = i
flat = flat + 1
end
end
call meter_step
end
call meter_end
if flat = 1 then return
n = xfrm_begin()
call meter_begin (flat-1), "Flattening Lines..."
do f = 1 to (flat-1)
i = flatten.f
call xfrm_setpos i, outx 0 0
call meter_step
end
call xfrm_end
call SEL_MODE('USER')
call SEL_POINT('CLEAR')
call SEL_POINT('SET', 'VOLUME', xlo ylo zlo, xhi yhi zhi)
call CUT()
return
ARCTAN:
pi = 3.1415926385897932384626
actu = actn
if actu < -1 then th = 90+(atan(1/abs(actn)) * 180 / pi)
if (actu < 1.00001)&(actu > -1.00001) then th = atan(actn) * 180 / pi
if actu > 1 then th = 90-(atan(1/actn) * 180 / pi)
return
               (
geocities.com/g_fyffe)