DXF import completed
Note DXF files coordinate origin is bottom left not top right, the Y coordinate is inversed so if you had a full screen graphic the Y coordinate would be the full screen depth.
DATA export completed
POLYVECTOR export completed
See readme attached on how to use Inkscape with SVGPOLY.
put files in the .app directory, you will have to make a dummy project, paste code below.
Change files names as required. The program will do DXF > SVG > POLYVECTOR. If you want data output, change datamode=1. Glbasic code is in the POLYVECTOR.txt file after it has run.
Note DXF files coordinate origin is bottom left not top right, the Y coordinate is inversed so if you had a full screen graphic the Y coordinate would be the full screen depth.
DATA export completed
POLYVECTOR export completed
See readme attached on how to use Inkscape with SVGPOLY.
put files in the .app directory, you will have to make a dummy project, paste code below.
Change files names as required. The program will do DXF > SVG > POLYVECTOR. If you want data output, change datamode=1. Glbasic code is in the POLYVECTOR.txt file after it has run.
Code (glbasic) Select
// --------------------------------- //
// Project: SVGPOLY
// Start: Sunday, March 10, 2013
// IDE Version: 10.202
// FREE-VERSION:
// Need Premium for Features:
// 3D Graphics
// Network Commands
// INLINE C/C+++ code
// SETCURRENTDIR("Media") // go to media files
GLOBAL screenx%,screeny%,rd$,test$,pos#,rgb1%,rgb2%,rgb3%,spno%
GLOBAL prgb1%,prgb2%,prgb3%,cirx#,ciry#,cdi#,doch%
GLOBAL tempx#, tempy#,temp1$,temp2$,debug$,count%,mode%,isline%
GLOBAL polyvx#[],polyvy#[],tempa$[],tempb$[],dxfname$
GLOBAL datamode%
//change these to set file names
//read dxf
dxfname$ = "a.dxf"
//write svg
test$ = "a.SVG"
//write polyvector code
debug$ = "POLYVECT.TXT"
//polyvector or data mode 1= data 2= polyvector
datamode = 2
DIM tempa$[400]
DIM tempb$[400]
DIM polyvx#[400]
DIM polyvy#[400]
screenx%=640
screeny%=480
//document height, should take from svg!
doch=screeny%
isline=0
mode%=0
IF DOESFILEEXIST(dxfname$)
dxftosvg(dxfname$)
ENDIF
tempx=0.0
tempy=0.0
SETSCREEN screenx%,screeny%,1
OPENFILE(1, test$, TRUE)
OPENFILE(2, debug$, FALSE)
spno% = 0
IF datamode = 2
//write functions()
WRITELINE 2,"sprite_"+MID$(test$,0,INSTR(test$,"."))+"()"
WRITELINE 2,"draw_"+MID$(test$,0,INSTR(test$,"."))+"(0,0,1,1)"
WRITELINE 2,"SHOWSCREEN"
WRITELINE 2,"KEYWAIT"
WRITELINE 2,"END"
WRITELINE 2,"FUNCTION draw_"+MID$(test$,0,INSTR(test$,"."))+":xval#,yval#,scxval#,scyval#"
ENDIF
FOR i = 1 TO 400
IF ENDOFFILE(1)=TRUE THEN BREAK
isline=0
READLINE 1,rd$
IF INSTR(rd$, "pagecolor") > 0
pos# = INSTR(rd$, UCASE$("pagecolor"))
rd$ = LCASE$(MID$(rd$,pos#+12,6))
rgb1% = 0
rgb2% = 0
rgb3% = 0
FOR j = 1 TO 6
IF j = 1 THEN rgb1 = hextoint(MID$(rd$,0,1))*16
IF j = 2 THEN rgb1 = rgb1 +hextoint(MID$(rd$,1,1))
IF j = 3 THEN rgb2 = hextoint(MID$(rd$,2,1))*16
IF j = 4 THEN rgb2 = rgb2 +hextoint(MID$(rd$,3,1))
IF j = 5 THEN rgb3 = hextoint(MID$(rd$,4,1))*16
IF j = 6 THEN rgb3 = rgb3 +hextoint(MID$(rd$,5,1))
NEXT
prgb1%=rgb1%
prgb2%=rgb2%
prgb3%=rgb3%
WRITELINE 2,"DRAWRECT 0, 0, "+screenx%+", "+screeny%+",RGB("+prgb1%+","+prgb2%+","+prgb3%+")"
ENDIF
pos# = INSTR(rd$, "<path")
//draw and write a circle
IF INSTR(rd$, "arc") > 0
READLINE 1,rd$
pos# = INSTR(rd$, "fill:#")
rd$ = LCASE$(MID$(rd$,pos#+6,6))
rgb1% = 0
rgb2% = 0
rgb3% = 0
FOR j = 1 TO 6
IF j = 1 THEN rgb1 = hextoint(MID$(rd$,0,1))*16
IF j = 2 THEN rgb1 = rgb1 +hextoint(MID$(rd$,1,1))
IF j = 3 THEN rgb2 = hextoint(MID$(rd$,2,1))*16
IF j = 4 THEN rgb2 = rgb2 +hextoint(MID$(rd$,3,1))
IF j = 5 THEN rgb3 = hextoint(MID$(rd$,4,1))*16
IF j = 6 THEN rgb3 = rgb3 +hextoint(MID$(rd$,5,1))
NEXT
READLINE 1,rd$
READLINE 1,rd$
cirx=MID$(rd$,INSTR(rd$, "sodipodi:cx=")+13,LEN(rd$)-1)
READLINE 1,rd$
ciry=MID$(rd$,INSTR(rd$, "sodipodi:cy=")+13,LEN(rd$)-1)
READLINE 1,rd$
cdi=MID$(rd$,INSTR(rd$, "sodipodi:rx=")+13,LEN(rd$)-1)
FOR i=0 TO 359
DRAWLINE cirx,ciry, cdi*SIN(i) + cirx, cdi*COS(i)+ciry, RGB(rgb1%, rgb2%, rgb3%)
NEXT
SHOWSCREEN
//WRITELINE 2,"//CIRCLE"
WRITELINE 2,"FOR i=0 TO 359"
WRITELINE 2,"DRAWLINE "+cirx+"+xval,"+ciry+"+yval,"+cdi+"*SIN(i) + "+cirx+"+xval, "+cdi+"*COS(i)+"+(ciry)+"+yval,RGB("+rgb1%+","+rgb2%+","+rgb3%+")"
WRITELINE 2,"NEXT"
isline = 2
ENDIF
IF INSTR(rd$, "fill:#") > 0 OR INSTR(rd$, "fill:n") > 0
//colour
IF INSTR(rd$, "fill:#") > 0
pos# = INSTR(rd$, "fill:#")
rd$ = LCASE$(MID$(rd$,pos#+6,6))
ELSE
pos# = INSTR(rd$, "stroke:#")
rd$ = LCASE$(MID$(rd$,pos#+8,6))
IF isline<>2 THEN isline=1
ENDIF
rgb1% = 0
rgb2% = 0
rgb3% = 0
FOR j = 1 TO 6
IF j = 1 THEN rgb1 = hextoint(MID$(rd$,0,1))*16
IF j = 2 THEN rgb1 = rgb1 +hextoint(MID$(rd$,1,1))
IF j = 3 THEN rgb2 = hextoint(MID$(rd$,2,1))*16
IF j = 4 THEN rgb2 = rgb2 +hextoint(MID$(rd$,3,1))
IF j = 5 THEN rgb3 = hextoint(MID$(rd$,4,1))*16
IF j = 6 THEN rgb3 = rgb3 +hextoint(MID$(rd$,5,1))
NEXT
spno% = spno%+1
//clear screen TO match SVG background
DRAWRECT 0, 0, screenx%, screeny%,RGB(prgb1%,prgb2%,prgb3%)
IF isline=0
//SPRITE INFO
DRAWRECT spno%, 0, 32, 32, RGB(rgb1%, rgb2%, rgb3%)
GRABSPRITE spno%, 0, 0, 32, 32
tempa$[spno%]="DRAWRECT 0, 0, 32, 32, RGB("+rgb1%+","+rgb2%+","+rgb3%+")"
tempb$[spno%]="GRABSPRITE "+spno%+", 0, 0, 32, 32"
ENDIF
//drawpoly
mode%=0
READLINE 1,rd$
WHILE INSTR(rd$, "d=")<1
READLINE 1,rd$
WEND
//WRITELINE 2,"//"+rd$
//if M in svg made in Inkscape treat as absolute Coords
IF INSTR(rd$, "-")>0 THEN mode%=0
IF INSTR(rd$, "M")>0 THEN mode%=1
rd$=LCASE$(rd$)
//convert Inkscape svg L path standard
IF INSTR(rd$, "l")>1
mode%=1
rd$=REPLACE$(rd$,CHR$(32),",")
rd$=REPLACE$(rd$,"l"," ")
ENDIF
IF MID$(rd$,LEN(rd$)-2,1) <> " "
rd$=MID$(rd$,0,LEN(rd$)-2)+" z"
ENDIF
IF MID$(rd$,INSTR(rd$, "m")+1,1)=" "
pos# = INSTR(rd$, "m")+2
ELSE
pos# = INSTR(rd$, "m")+1
ENDIF
//WRITELINE 2,"//mode%="+mode%
count%=0
temp1$=""
temp2$=""
tempx=0.0
tempy=0.0
REDIM polyvx[400]
REDIM polyvy[400]
WHILE pos# < LEN(rd$)-3
rd$=MID$(rd$,pos#,LEN(rd$))
IF INSTR(rd$," ")<1 THEN BREAK
IF count% = 0
temp1$ =MID$(rd$,0,INSTR(rd$,","))
temp2$ =MID$(rd$,INSTR(rd$,",")+1,(INSTR(rd$," ")-INSTR(rd$,",")-1))
tempx = temp1$
tempy = temp2$
polyvx[count%]=tempx
polyvy[count%]=tempy
count%=count%+1
ELSE
temp1$ =MID$(rd$,0,INSTR(rd$,","))
temp2$ =MID$(rd$,INSTR(rd$,",")+1,(INSTR(rd$," ")-INSTR(rd$,",")-1))
IF mode%=0
tempx = tempx+temp1$
tempy = tempy+temp2$
ELSE
tempx = temp1$
tempy = temp2$
ENDIF
polyvx[count%]=tempx
polyvy[count%]=tempy
count%=count%+1
ENDIF
pos# = INSTR(rd$," ")+1
IF pos# = INSTR(rd$,"z") THEN BREAK
IF pos#+1 = INSTR(rd$,"z") THEN BREAK
IF count% = 399 THEN BREAK
WEND
IF datamode = 2
IF isline=0 AND count%>2
//STARTPOLY spno%
WRITELINE 2,"STARTPOLY "+spno%
FOR m = count%-1 TO 0 STEP -1
//POLYVECTOR polyvx[m], polyvy[m] ,0,0,RGB(rgb1%, rgb2%, rgb3%)
WRITELINE 2,"POLYVECTOR ("+polyvx[m] +"*scxval)+xval,("+polyvy[m]+"*scyval)+yval,0,0,rgb(255,255,255)"
NEXT
//ENDPOLY
WRITELINE 2,"ENDPOLY"
ENDIF
ELSE
//data
WRITELINE 2, "STARTDATA poly_"+MID$(test$,0,LEN(test$)-4)+":"
WRITELINE 2, "//sprite number,xcoord,ycood"
//in loop
FOR m = count%-1 TO 0 STEP -1
WRITELINE 2, "DATA "+spno%+","+polyvx[m] +","+polyvy[m]
NEXT
ENDIF
IF datamode = 2
IF isline=1
DRAWLINE polyvx[0], polyvy[0],polyvx[1], polyvy[1],RGB(rgb1%, rgb2%, rgb3%)
WRITELINE 2,"DRAWLINE "+polyvx[0] +"+xval,"+polyvy[0]+"+yval,"+polyvx[1]+"+xval,"+polyvy[1]+"+yval, RGB("+rgb1%+","+rgb2%+","+rgb3%+")"
ENDIF
ELSE
//data
WRITELINE 2, "STARTDATA poly_"+MID$(test$,0,LEN(test$)-4)+":"
WRITELINE 2, "//sprite number,xcoord,ycood"
//in loop
FOR m = count%-1 TO 0 STEP -1
WRITELINE 2, "DATA "+spno%+","+polyvx[m] +","+polyvy[m]
NEXT
ENDIF
WRITELINE 2, "ENDDATA"
SHOWSCREEN
SLEEP 40
ENDIF
NEXT
IF datamode = 2
WRITELINE 2,"ENDFUNCTION"
WRITELINE 2,""
WRITELINE 2,"FUNCTION sprite_"+MID$(test$,0,INSTR(test$,"."))+":"
FOR i = 1 TO spno%
WRITELINE 2,tempa$[i]
WRITELINE 2,tempb$[i]
NEXT
WRITELINE 2,"ENDFUNCTION"
ENDIF
CLOSEFILE 1
CLOSEFILE 2
FUNCTION dxftosvg:dxfin$
LOCAL idnum#, writepath$,svgout$,tempval#
OPENFILE(3,dxfin$, TRUE)
svgout$=MID$(dxfin$,0,LEN(dxfin$)-4)+".svg"
OPENFILE(4,svgout$,FALSE)
idnum = 1000
//header
WRITELINE 4, "<svg"
WRITELINE 4, " inkscape:version=" + CHR$(34) + "0.48.4 r9939" + CHR$(34) + ">"
WRITELINE 4, " <g"
WRITELINE 4, " inkscape:label=" + CHR$(34) + "Layer 1" + CHR$(34)
WRITELINE 4, " inkscape:groupmode= " + CHR$(34) + "layer" + CHR$(34)
WRITELINE 4, " id=" + CHR$(34) + "layer1" + CHR$(34) + ">"
WHILE 1=1
IF ENDOFFILE(3) = 1 THEN BREAK
READLINE 3, rd$
IF rd$ = "LWPOLYLINE"
idnum=idnum+1
writepath$=" d=" + CHR$(34) + "M"
WHILE 1=1
READLINE 3, rd$
IF rd$ = " 10"
READLINE 3, rd$
writepath$=writepath$ + " " + rd$
ENDIF
IF rd$ = " 20"
READLINE 3, rd$
IF MID$(rd$,0,1) = "-"
rd$=MID$(rd$,1,LEN(rd$)-1)
ELSE
tempval = rd$
IF tempval <>0
rd$="-" +rd$
ELSE
ENDIF
ENDIF
writepath$=writepath$ + "," +rd$
ENDIF
IF rd$ = " 0" THEN BREAK
WEND
writepath$=writepath$ + " z" + CHR$(34)
WRITELINE 4, " <path"
WRITELINE 4, " style=" + CHR$(34) + "fill:#ffffff;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + CHR$(34)
WRITELINE 4, writepath$
WRITELINE 4, " id=" + CHR$(34) + "path" + idnum + CHR$(34)
WRITELINE 4, " inkscape:connector-curvature=" + CHR$(34) + "0" + CHR$(34) + " />"
ENDIF
WEND
WRITELINE 4, " </g>"
WRITELINE 4, "</svg>"
CLOSEFILE 3
CLOSEFILE 4
ENDFUNCTION
FUNCTION hextoint:temp$
LOCAL r%
SELECT UCASE$(temp$)
CASE "0"
r%=0
CASE "1"
r%=1
CASE "2"
r%=2
CASE "3"
r%=3
CASE "4"
r%=4
CASE "5"
r%=5
CASE "6"
r%=6
CASE "7"
r%=7
CASE "8"
r%=8
CASE "9"
r%=9
CASE "A"
r%=10
CASE "B"
r%=11
CASE "C"
r%=12
CASE "D"
r%=13
CASE "E"
r%=14
CASE "F"
r%=15
ENDSELECT
RETURN r%
ENDFUNCTION