本代码需要最新版 godking.conn 库,请自行下载!
建议安装 sqlite - odbc 驱动 0.997版。
如果没有安装 odbc for sqlite 驱动,可以升级 godking.conn.driver.sqlite3 库后,使用 godking.conn.driver.sqlite3.install() 安装。
也可以在此下载安装:http://www.chengxu.online/show.asp?softid=267
1、将json数据转为sqlite数据库,以后可以抛弃json文件。用数据库搜索汉字非常方便。
2、从数据库中搜索某个汉字的笔顺信息,进行绘图,如下图。
演示代码:
import console;
import godking.conn;
import godking.paint;
import web.json;
import brotli;
var bro = brotli();
// 将json文件内容写入数据库
var conn,err = godking.conn.openSqlite3("\hanzi.db");
if !conn {
console.dump("打开数据库失败!pos:1",err);
console.pause();
return ;
}
if !conn.existsTable("stroke"){
conn.exec("CREATE TABLE [hanzi](hanzi TEXT,data BLOB);");
}
import fsys.file;
var f = fsys.file("\all.json");
var num,ok = 0,0;
var rs = conn.rs("hanzi")
do{ //共9574个汉字
var t = f.readTo("}")
ok = #t;
if #t {
num++;
//提取汉字信息
t += "}";
t = ..string.trimleft(t,", {");
t = web.json.parse("{"+t+"}")
var hanzi = table.keys(t)[1]
var strokes = table.tostring(t[hanzi]):"";
strokes = ..string.replace(strokes,'\n','');
var data = ..raw.buffer(bro.compress(strokes,11));
//加入数据库
rs.AddNew();
rs.setValue(1,hanzi);
rs.setValue(2,data);
rs.UpDate();
//验证写入结果
var bbb = rs.getValue(2);
console.dump(num,"压缩数据大小:"++#data,"写入数据大小:"++#bbb,"写入结果:"++(#bbb===#data?"成功":"失败"))
}
if num===100 {
console.print("仅写入前100个用作演示...")
break;
}
} while (ok);
//关闭文件、记录集、数据库连接
rs.close();
conn.close();
f.close();
// 定义生成汉字笔顺图片的函数
var savePic = function(hanzi,strokes){
import godking.paint;
var p = godking.paint(1024,1024/*高度*/,/*背景颜色*/,/*背景图像*/);
p.scale(1 /*宽度缩放比例*/,-1/*高度缩放比例*/,/*选项*/);
p.translate(0 /*水平偏移像素*/,-1024*7/8/*垂直偏移像素*/,/*选项*/);
for(i=1;#strokes;1){
var path = p.path( 1 /*0 交叉填充 1 全填充*/);
var x,y = 0,0;
var s = string.split(strokes[i]," ");
for(n=1;#s;1){
select(s[n]) {
case "M" {
x,y = tonumber(s[n+1]),tonumber(s[n+2]);
}
case "L" {
var x1,y1 = tonumber(s[n+1]),tonumber(s[n+2]);
path.addLine(x,y,x1,y1);
x,y = x1,y1;
}
case "Z" {
path.closeFigure();
}
case "Q" {
var cx,cy,x1,y1 =tonumber(s[n+1]),tonumber(s[n+2]),tonumber(s[n+3]),tonumber(s[n+4]);
path.addBezier(x,y,cx,cy,x1,y1,x1,y1);
x,y = x1,y1;
}
case "C" {
var cx1,cy1,cx2,cy2,x1,y1 =tonumber(s[n+1]),tonumber(s[n+2]),tonumber(s[n+3]),tonumber(s[n+4]),tonumber(s[n+5]),tonumber(s[n+6]);
path.addBezier(x,y,cx1,cy1,x1,y1,cx2,cy2);
x,y = x1,y1;
}
}
}
p.fillPath(path,0xFFFF0000/*填充颜色或brush对象*/);
p.saveToFlie("\"+hanzi+"笔顺"+i+".png");
if i<#strokes p.fillPath(path,0xFF000000/*填充颜色或brush对象*/);
path.delete();
}
p.close();
}
// 从数据库读取汉字笔顺信息并绘制图片
var conn,err = godking.conn.openSqlite3("\hanzi.db");
if !conn {
console.dump("打开数据库失败!!pos:2",err);
console.pause();
return ;
}
var t = conn.getTable("select * from [hanzi] where hanzi='䠀'",false/*数组*/,/*开始行*/,/*总行数*/,/*格式化参数*/);
if t[[1]] {
var hanzi = t[1]["hanzi"];
var data = eval(bro.decompress(t[1]["data"]));
strokes = data["strokes"]
radStrokes = data["radStrokes"]
medians = data["medians"]
console.dump(hanzi,#strokes,#medians,#radStrokes)
savePic(hanzi,strokes)
console.dump("已生成笔顺图片,请查看。")
}
conn.close();
console.pause(,"全部演示完毕,请查看代码文件目录内生成的笔顺图片。");
all.json 文件可以从下面附件中下载:
https://aardio.online/attach-download-357.htm