【Aegisub】任意字符串转ASSDraw3绘图代码

首先在提任意字符串转ASSDraw3绘图之前,先讲讲ASSDraws的绘图代码是什么样子的
一、Yutils的文字转绘图产生的绘图字符串是什么样的
Yutils可以将文字转为绘图代码,但是这些绘图字符串都是省略的绘图字符串。
因为本来的绘图字符串应该符合以下规律:
b命令后面只能接3个点,然后要不然后面什么绘图命令都没有、要不然就接下一个绘图命令
直线l命令后面只接一个点,然后要不然后面就画完了,要不然就接着下一个绘图命令
m表示开始一个新的绘图起点
所以整个绘图比如这样的格式:
m 2 5 l 12 55 l 24 32
再比如:m 0 3 b 12 23 21 33 26 18 b 42 33 15 28 10 38 l 5 9
而Yutils转出的绘图代码并不是上面这种"严格规范"的格式,而是能省就省的格式,这样的省略格式虽然你复制到assdraw3里面也能识别,但是,assdraw3会自动把你这个省略的代码补完、补齐以后才读出绘图的,所以并不是直接读的省略的绘图代码,而是它自动补齐再读的绘图
所以,如果直接用Yutils转的绘图,就不能用在比如vector_move函数里面,因为那个函数只能读出"严格规范"的绘图字符串代码,不能读出Yutils这种能省就省省略绘图代码,它可不会像assdraw3那样自动补齐、补完。所以你直接用Yutils转的绘图字符串给Vector_move函数,那么就会报错,就会报错说你的绘图命令是未知的,所以为了不出现这样的情况,你就必须先自己把Yutils转出的绘图字符串文本给好好补齐才可以
比如你可以这样写一个函数来处理字符串:
function Xshape.change_Yutilsdraw(ass_shape)
local new_l_b={}
for m in ass_shape:gmatch("m[^m]+") do
for bl in m:gmatch("[mbl][- .%d]+") do
if bl:match("[mbl]")=="m" then
new_l_b[#new_l_b+1]=bl
elseif bl:match("[mbl]")=="l" then
local l_points={}
for l_p in bl:gmatch("[-.%d]+ [-.%d]+") do
l_points[#l_points+1]="l "..l_p.." "
end
new_l_b[#new_l_b+1]=table.concat(l_points)
elseif bl:match("[mbl]")=="b" then
local b_points={}
for b_p in bl:gmatch("[-.%d]+ [-.%d]+ [-.%d]+ [-.%d]+ [-.%d]+ [-.%d]+") do
b_points[#b_points+1]="b "..b_p.." "
end
new_l_b[#new_l_b+1]=table.concat(b_points)
end
end
end
return table.concat(new_l_b)
end
当然你也可以用gsub来写,那样更简单!
二、那么对于任意一串字符串,要怎么处理成assdraw3形式的绘图代码呢?
详见视频:https://www.bilibili.com/video/BV1da4y1v7kd/

另外,如何封闭绘图路径也在另一个视频里说明介绍了