-- * Lua module for writing TpX files * -- require("XmlOut") -- * Class for creating TpX drawing * -- 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