2016-04-28 17 views
2

Hallo, ich versuche, Vertices in einer .obj-Datei in eine Tabelle zu konvertieren, die tatsächlich in lua verwendet werden können.Lua mehrere Zeichenfolge Ersetzungen mit string.gsub

Dies ist, was eine OBJ-Datei wie folgt aussieht:

# Blender v2.77 (sub 0) OBJ File: '' 
# www.blender.org 
mtllib pyramid.mtl 
o Cube 
v 1.000000 0.000000 -1.000000 
v 1.000000 0.000000 1.000000 
v -1.000000 0.000000 1.000000 
v -1.000000 0.000000 -1.000000 
v -0.000000 2.000000 0.000000 
vn 0.0000 -1.0000 0.0000 
vn 0.8944 0.4472 0.0000 
vn -0.0000 0.4472 0.8944 
vn -0.8944 0.4472 -0.0000 
vn 0.0000 0.4472 -0.8944 
usemtl Material 
s off 
f 1//1 2//1 3//1 4//1 
f 1//2 5//2 2//2 
f 2//3 5//3 3//3 
f 3//4 5//4 4//4 
f 5//5 1//5 4//5 

Alles was ich brauche sind die 5 Linien mit v beginnen wie folgt aussehen:

Node1= {x=1.000000, y=0.000000, z=-1.000000} 
Node2= {x=1.000000, y=0.000000, z=1.000000} 
Node3= {x=-1.000000, y=0.000000, z=1.000000} 
Node4= {x=-1.000000, y=0.000000, z=-1.000000} 
Node5= {x=-0.000000, y=2.000000, z=0.000000} 

Mit dem Code schrieb ich, ich die Ausgabe zu sehen wie folgt aus verwaltet:

Node1= {x=1.000000 0.000000 -1.000000} 
Node2= {x=1.000000 0.000000 1.000000} 
Node3= {x=-1.000000 0.000000 1.000000} 
Node4= {x=-1.000000 0.000000 -1.000000} 
Node5= {x=-0.000000 2.000000 0.000000} 

das ist mein Code, der die Arbeit tut:

inputFile = io.open("file.txt", "r") 
io.input(inputFile) 
string = io.read("*all") 
io.close(inputFile) 

outputFile = io.open("object.lua", "a") 
io.output(otputFile) 


i = 1 
for word in 
    string.gmatch(string, " .?%d.%d%d%d%d%d%d .?%d.%d%d%d%d%d%d .?%d.%d%d%d%d%d%d") do 
    print(word) 
    -- outputFile:write("Node"..i.. "= {" ..word.. "}\n") 
    outputFile:write("Node"..i.. "= {" ..string.gsub(word, "(%s)", "x=", 1).. "}\n") 
    i = i + 1 
end 

Zuerst öffnet es die .obj-Datei und speichert alles in "string". Dann erstellt "object.lua". Für jede Zeichenfolge, die dieses Muster ist passend:

1.000000 0.000000 -1.000000 

in string, string.gmatch wird es finden und es in die Ausgabedatei schreiben. Aber zuerst muss die Saite neu formatiert werden. Wie Sie sehen können, ist es mir gelungen, das erste Leerzeichen (% s) durch "x =" zu ersetzen. Außerdem muss das zweite Leerzeichen durch ", y =" und das dritte durch ", z =" ersetzt werden. Allerdings kann ich nicht sehen, wie man string.gsub in einer Weise verwendet, dass es mehrere verschiedene Ersetzungen tun kann.

Ist das der richtige Weg und ich mache nur etwas falsch? Oder gibt es eine andere Möglichkeit, diese Aufgabe zu erfüllen?

+1

Lustige Beobachtung: 'string' hat seine Bedeutung (als Variable mit dem gleichen Namen eingeführt wurde) geändert, aber' string.gmatch' blieb richtig! –

+0

'für x, y, z in Zeichenfolge: gmatch '\ nv% s + (% S +)% s + (% S +)% s + (% S +)'' ''Knoten' .. i .. '= {x =' ..x .. ', y =' .. y .. ', z =' .. z .. '} \ n'' –

Antwort

2

Eine Variation des Gesamtkonzeptes, aber mit dem gleichen Ergebnis:

string.gsub(word, "([^%s]) ([^%s]) ([^%s])", "x=%1 y=%2 z=%3", 1) 

Auch kann die gmatch wie dies vereinfacht werden.

PATTERN = '^v (%S+) (%S+) (%S+)$' 

fo = io.open('object.lua','w') 

i = 1 
for line in io.lines('file.txt') do 
    if line:match(PATTERN) then 
    line = line:gsub(PATTERN,'Node'..i..'= {x=%1, y=%2, z=%3}') 
    print(line) 
    fo:write(line,'\n') 
    i = i + 1 
    end 
end 

fo:close() 
+0

Vielen Dank, das hat den Job für mich gemacht! Funktioniert perfekt! – user148013

1

Das Hauptproblem ist in der Gsub-Aufruf. Sie passen eher die Zahlen selbst an ([^%s]), als das Leerzeichen am Anfang. Dies hat den Zweck erfüllt:

string.gmatch(s, "v [0-9.-]* [0-9.-]* [0-9.-]*") 

Live example