TpXpic = {} -- a table holding the class methods
-- constructor
function TpXpic:Create(Attr)
obj = {XmlOut = XmlOutput:Create(), Opened = true}
obj.XmlOut.EOL_Str = "\n\%"
obj.XmlOut:Write("\%")
obj.XmlOut:OpenTag("TpX")
obj.XmlOut:AddAttribute("v", "5")
obj.XmlOut:AddAttributes(Attr)
setmetatable(obj, {__index = self})
-- class methods are searched in TpXpic table
return obj
end
-- finish and write to file
function TpXpic:write(Filename)
if self.Opened then
self.XmlOut:CloseTag()
self.Opened = false
end
if Filename ~= nil then
io.output(Filename)
io.write(self.XmlOut:GetText())
io.close()
else
print(self.XmlOut:GetText())
end
end
-- set caption and/or label
function TpXpic:setCaption(s, label)
self.XmlOut:OpenTag("caption")
if label then self.XmlOut:AddAttribute("label", label) end
self.XmlOut:AddText(s)
self.XmlOut:CloseTag()
end
-- set comment
function TpXpic:setComment(s)
self.XmlOut:OpenTag("comment")
self.XmlOut.PreserveSpace = true
self.XmlOut:AddText(s)
self.XmlOut:CloseTag()
self.XmlOut.PreserveSpace = false
end
-- Common attributes
-- lc = set line color
-- lw = set line width
-- li = set line style: none, dot, dash or solid (default)
-- ha = set hatching: 1,...,6
-- hc = set hatching color
-- fill = set fill color
-- arr1 =
-- arr2 = add arrow-head:
-- none, h40, h41, h42, h43, h44, h45, h46, h47, h48,
-- t40, t43, t44, t45, h20, h21, h22, h23, h24,
-- t20, t21, t22, t23, hr10, hr11, hr12, tr10,
-- h10, h11, h12, h12c, t10, r0, r10, r11, r12,
-- r20, r20c, r21, r33, ts10, ts11, ts12, hs10, hs12,
-- ts20, ts21, ts23, hs20, hs23, o, oc, qq;"
-- arrs = set arrow-head size factor
-- rotdeg = set rotation angle
-- closed = make a curve closed: 1
-- halign = set text horizontal alignment:
-- l (left, default), c (center) or r (right)
-- s = set star shape:
-- circle (default), square, diamond, triup, tridown, penta,
-- star4, star5, star6, cross, dcross, flower5, flower4,
-- star4arc, maltese
-- d = set star size factor
-- keepaspectratio = keep bitmap aspect ratio
-- (0: do not keep, 1: default)
--
-- add line
function TpXpic:addLine(x1, y1, x2, y2, Attr)
self.XmlOut:OpenTag("line")
self.XmlOut:AddAttributes(
{x1 = x1, y1 = y1, x2 = x2, y2 = y2})
self.XmlOut:AddAttributes(Attr)
self.XmlOut:CloseTag()
end
-- add rectangle
function TpXpic:addRect(x, y, w, h, Attr)
self.XmlOut:OpenTag("rect")
self.XmlOut:AddAttributes(
{x = x, y = y, w = w, h = h})
self.XmlOut:AddAttributes(Attr)
self.XmlOut:CloseTag()
end
-- add circle
function TpXpic:addCircle(x, y, d, Attr)
self.XmlOut:OpenTag("circle")
self.XmlOut:AddAttributes(
{x = x, y = y, d = d})
self.XmlOut:AddAttributes(Attr)
self.XmlOut:CloseTag()
end
-- add ellipse
function TpXpic:addEllipse(x, y, dx, dy, Attr)
self.XmlOut:OpenTag("ellipse")
self.XmlOut:AddAttributes(
{x = x, y = y, dx = dx, dy = dy})
self.XmlOut:AddAttributes(Attr)
self.XmlOut:CloseTag()
end
-- add an object with points
function TpXpic:addPoints(Tag, pp, Attr)
self.XmlOut:OpenTag(Tag)
self.XmlOut:AddAttributes(Attr)
self.XmlOut.PreserveSpace = true
local tmpList = {}
for _,v in ipairs(pp) do
table.insert(tmpList, string.format("%g,%g", v[1], v[2]))
end
self.XmlOut:AddText(table.concat(tmpList, " "))
self.XmlOut:CloseTag()
self.XmlOut.PreserveSpace = false
end
-- add polyline
function TpXpic:addPolyline(pp, Attr)
self:addPoints("polyline", pp, Attr)
end
-- add polygon
function TpXpic:addPolygon(pp, Attr)
self:addPoints("polygon", pp, Attr)
end
-- add circular primitive
function TpXpic:addCircular(Tag, x, y, d, a1, a2, Attr)
self.XmlOut:OpenTag(Tag)
self.XmlOut:AddAttributes(
{x = x, y = y, d = d, a1 = a1, a2 = a2})
self.XmlOut:AddAttributes(Attr)
self.XmlOut:CloseTag()
end
-- add arc
function TpXpic:addArc(x, y, d, a1, a2, Attr)
self:addCircular('arc', x, y, d, a1, a2, Attr)
end
-- add segment
function TpXpic:addSegment(x, y, d, a1, a2, Attr)
self:addCircular('segment', x, y, d, a1, a2, Attr)
end
-- add sector
function TpXpic:addSector(x, y, d, a1, a2, Attr)
self:addCircular('sector', x, y, d, a1, a2, Attr)
end
-- add curve
function TpXpic:addCurve(pp, Attr)
self:addPoints("curve", pp, Attr)
end
-- add Bezier path
function TpXpic:addBezier(pp, Attr)
self:addPoints("bezier", pp, Attr)
end
-- add text label
function TpXpic:addText(x, y, h, t, tex, Attr)
self.XmlOut:OpenTag("text")
self.XmlOut:AddAttributes(
{x = x, y = y, h = h, t = t, a2 = a2})
self.XmlOut:AddAttribute("tex", tex)
self.XmlOut:AddAttributes(Attr)
self.XmlOut:CloseTag()
end
-- add star
function TpXpic:addStar(x, y, Attr)
self.XmlOut:OpenTag("star")
self.XmlOut:AddAttributes(
{x = x, y = y})
self.XmlOut:AddAttributes(Attr)
self.XmlOut:CloseTag()
end
-- add symbol
-- s = set symbol shape:
-- process, decision, input-output, preparation, punch-card,
-- manual-op, keyboard, punch-tape, document, documents,
-- display, terminal, keying, alt-process, online-storage,
-- magnetic-drum, magnetic-tape, hoarrow1, hoarrow1v,
-- hoarrow2, hoarrow3, hoarrow4, star5, diamond8, baloon1,
-- baloon2, cloud1, splash1, snowflake1
function TpXpic:addSymbol(x, y, d, s, Attr)
self.XmlOut:OpenTag("symbol")
self.XmlOut:AddAttributes(
{x = x, y = y, d = d, s = s})
self.XmlOut:AddAttributes(Attr)
self.XmlOut:CloseTag()
end
-- add bitmap
function TpXpic:addBitmap(x, y, w, h, link, Attr)
self.XmlOut:OpenTag("bitmap")
self.XmlOut:AddAttributes(
{x = x, y = y, w = w, h = h, link = link})
self.XmlOut:AddAttributes(Attr)
self.XmlOut:CloseTag()
end
-- * Make HTML color from RGB levels * --
function round(x)
return math.floor(x+0.5)
end
function HTML_color(r,g,b)
r = round(r)
if r<0 then r=0 end
if r>255 then r=255 end
g = round(g)
if g<0 then g=0 end
if g>255 then g=255 end
b = round(b)
if b<0 then b=0 end
if b>255 then b=255 end
return string.format("#%02X%02X%02X", r, g, b)
end