#include #include #include #include #include #include #include #include #include #include Global $inputok = False Global $inputfile = 'Nothing selected' Global $outputfile = '' Global $v[0] Global $f[0] Global $vx[0] Global $vy[0] Global $vz[0] Global $fx[0] Global $h = 200 Global $w = 200 Global $scale = 10 Opt("GUIOnEventMode", 1) GUICreate("OBJ > SVG", 500, 120) GUISetOnEvent($GUI_EVENT_CLOSE, "GUIExit") $idinputfile = GUICtrlCreateLabel(" No input file selected",7,10,390) GUICtrlSetBkColor($idinputfile,0xFFFFFF) GUICtrlSetPos(-1, 100, 8) GUICtrlCreateButton("Open", 210, 170, 85, 25) GUICtrlSetPos(-1, 10, 5) GUICtrlSetOnEvent(-1, "OpenOBJ") GUICtrlCreateButton("Convert", 210, 170, 85, 25) GUICtrlSetPos(-1, 10, 40) GUICtrlSetOnEvent(-1, "Start") GUISetState(@SW_SHOW) Func OpenOBJ() $inputfile = FileOpenDialog("Open OBJ file", @ScriptDir, "Wavefront 3D Object File (*.obj)", $FD_FILEMUSTEXIST) if @error Then GUICtrlSetData($idinputfile, " Nothing selected") $inputok = false Else GUICtrlSetData($idinputfile, " " & $inputfile & "") $inputok = true EndIf EndFunc Func Start() if $inputok Then Clean() GetVertex() GetFace() CloseOBJ() MakeSVG() PrepSVG() WriteSVG() EndSVG() CloseSVG() Else ;do nothing EndIf EndFunc func Clean() Local $test = false; Local $line = 1 Local $linemax = _FileCountLines($inputfile) while $line <= $linemax local $str = FileReadLine($inputfile, $line) $str = StringStripWS($str, $STR_STRIPSPACES) ;remove double+ spacing if StringLeft($str, 2) = "v " Then $str = StringTrimLeft($str, 2) ;remove 'v ' _ArrayAdd($v, $str) ;add vertex data to v[] Elseif StringLeft($str, 2) = "f " Then $str = StringTrimLeft($str, 2) ;remove 'f ' _ArrayAdd($f, $str) ;add face data to f[] Else ;do nothing EndIf $line += 1 WEnd EndFunc func GetVertex() ; '1 2 3' Local $test = false; for $str in $v local $split = StringSplit($str, " ", $STR_NOCOUNT) ; ['1', '2', '3'] if $test then _ArrayDisplay($split) _ArrayAdd($vx, $split[0]) ; ['1'] _ArrayAdd($vy, $split[1]) ; ['2'] _ArrayAdd($vz, $split[2]) ; ['3'] next if $test then _ArrayDisplay($vx) EndFunc func GetFace() ; '1//1 2//2 3//3 ...' Local $test = false; for $str in $f ; '1//1 2//2 3//3' $str = StringReplace($str, '//', 'x', 0) ; '1x1 2x2 3x3' if $test then msgbox(1,"replacement test", $str) $str = StringRegExpReplace($str, '(x[0-9]*)', '') ; '1 2 3' if $test then msgbox(1,"replacement test 2", $str) local $split = StringSplit($str, " ", $STR_NOCOUNT) ; ['1', '2', '3'] if $test then _ArrayDisplay($split) _ArrayAdd($split, $split[0]) ; ['1', '2', '3', '1'] $str = _ArrayToString($split, ' ') ; '1 2 3 1' _ArrayAdd($fx, $str) ; ['1 2 3 4 1'] if $test then msgbox(1, 'f - end result, fx[0]', $fx[0]) next EndFunc func CloseOBJ() FileClose($inputfile) EndFunc func MakeSVG() FileDelete("obj.SVG") $outputfile = FileOpen(@ScriptDir & "\obj.SVG", 2) EndFunc func PrepSVG() ; FileWrite($outputfile, '') EndFunc func WriteSVG() ; local $test = false; for $face in $fx ; ['1 2 3 4 1'] local $count = 0 local $x1 = 0 local $y1 = 0 local $x2 = 0 local $y2 = 0 local $a = stringsplit($face, ' ', $STR_NOCOUNT) ; ['1', '2', '3', '4', '1'] local $length = int(ubound($a) - 2) ; 3 ^____^____^____^ while $count <= $length local $t1 = $a[$count] - 1 if $test then msgbox(1,'test writesvg 1', $t1) local $t2 = $a[$count + 1] - 1 if $test then msgbox(1,'test writesvg 1', $t2) ;local $t1 = eval('$a[' & $count & ']') $x1 = $vx[$t1] * $scale $y1 = $vy[$t1] * $scale $x2 = $vx[$t2] * $scale $y2 = $vy[$t2] * $scale local $q0 = @crlf & ' FileWrite($outputfile, @crlf & "") EndFunc func CloseSVG() FileClose($outputfile) GUICtrlSetData($idinputfile, " Done") $inputok = false Global $v[0] Global $f[0] Global $vx[0] Global $vy[0] Global $vz[0] Global $fx[0] EndFunc while 1 sleep(1000) WEnd Func GUIExit() Exit EndFunc