cgal/Segment_Delaunay_graph_Linf_2/archive/developer_scripts/lsp2ipe.lua

141 lines
3.2 KiB
Lua

-- lsp2ipe.lua
-- convert segments in lsp format from stdin
-- to an ipe file that is given in the command line;
function printusage()
io.stderr:write("Usage: ipescript lsp2ipe <file_to_save>")
io.stderr:write(" [[offsetx offsety] scale]\n")
end
-- print('#argv = ', #argv)
if #argv < 1 then
printusage()
return
end
fname = argv[1]
offsetx = 0
offsety = 0
scale = 1
if #argv > 1 then
if #argv == 3 or #argv == 4 then
offsetx = tonumber(argv[2])
offsety = tonumber(argv[3])
if #argv == 4 then
scale = tonumber(argv[4])
end
else
printusage()
end
end
if offsetx == nil or offsety == nil or scale == nil then
io.stderr:write("Error: bad number input in command line\n")
return
end
-- find basic.isy ipe style sheet
-- list of possible locations
basiclist = {
"/opt/local/share/ipe/7.1.4/styles/basic.isy",
"/usr/share/ipe/7.1.2/styles/basic.isy",
"/usr/share/ipe/7.1.1/styles/basic.isy",
"/opt/local/share/ipe/7.1.2/styles/basic.isy"
}
function file_exists(name)
local f = io.open(name,"r")
if f ~= nil then io.close(f) return true else return false end
end
basicfilename = nil
for i, filename in ipairs(basiclist) do
--print("trying ", filename)
if file_exists(filename) then
basicfilename = filename
break
end
end
if basicfilename == nil then
io.stderr:write("Error: missing basic.isy\n")
return
end
doc = ipe.Document()
sheet = ipe.Sheet(basicfilename)
sheets = ipe.Sheets()
sheets:insert(1, sheet)
doc:replaceSheets(sheets)
attr = {}
for l in io.lines() do
print(l)
t = {}
for w in l:gmatch("[^\t ]+") do
table.insert(t, w)
end
print("#t=", #t)
if #t ~= 0 then
print(t[1])
if t[1] == 'p' then
if #t ~= 3 then
io.stderr:write("Error: bad point line, t=", #t, "\n")
return
end
--print("point found")
px = tonumber(t[2])
py = tonumber(t[3])
if px == nil or py == nil then
io.stderr:write("Error: bad number input\n")
return
end
fpx = offsetx + (px * scale)
fpy = offsety + (py * scale)
v = ipe.Vector(fpx, fpy)
obj = ipe.Reference(attr, "mark/disk(sx)", v)
elseif t[1] == 's' then
if #t ~= 5 then
io.stderr:write("Error: bad segment line, t=", #t, "\n")
return
end
px = tonumber(t[2])
py = tonumber(t[3])
qx = tonumber(t[4])
qy = tonumber(t[5])
if px == nil or py == nil or qx == nil or qy == nil then
io.stderr:write("Error: bad number input\n")
return
end
fpx = offsetx + (px * scale)
fpy = offsety + (py * scale)
fqx = offsetx + (qx * scale)
fqy = offsety + (qy * scale)
seg = {}
seg["type"] = "segment"
seg[1] = ipe.Vector(fpx, fpy)
seg[2] = ipe.Vector(fqx, fqy)
subpath = {}
subpath["type"] = "curve"
subpath["closed"] = false
subpath[1] = seg
shape = { subpath }
obj = ipe.Path(attr, shape, false)
else
-- here we have neither 'p' nor 's'
io.stderr:write("Error: bad line type (neither p nor s):\n")
io.stderr:write(l)
return
end
doc[1]:insert(nil, obj, nil, "alpha")
end
end
doc:save(fname, xml, nil)