/** @file SketchDxf.java * * @author marco corvi * @date apr 2013 * * @brief TopoDroid 3d sketch DXF export * -------------------------------------------------------- * Copyright This sowftare is distributed under GPL-3.0 or later * See the file COPYING. * -------------------------------------------------------- */ package com.topodroid.DistoX; // import java.io.FileWriter; import java.io.PrintWriter; import java.util.Locale; import java.util.ArrayList; import java.util.HashMap; import android.util.SparseArray; class SketchDxf { static void write( PrintWriter out, String fullname, SketchModel model ) { DistoXNum num = model.mNum; // header out.printf("999\nDXF created from TopoDroid\n"); out.printf("0\nSECTION\n2\nHEADER\n"); out.printf("9\n$ACADVER\n1\nAC1012\n"); // was AC1006 out.printf("9\n$INSBASE\n"); out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", 0.0, 0.0, 0.0 ); // FIXME (0,0,0) out.printf("9\n$EXTMIN\n"); out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", num.surveyEmin(), num.surveySmin(), num.surveyVmin() ); out.printf("9\n$EXTMAX\n"); out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", num.surveyEmax(), num.surveySmax(), num.surveyVmax() ); out.printf("0\nENDSEC\n"); out.printf("0\nSECTION\n2\nTABLES\n"); { out.printf("0\nTABLE\n2\nLTYPE\n70\n1\n"); // int flag = 64; out.printf("0\nLTYPE\n2\nCONTINUOUS\n70\n64\n3\nSolid line\n72\n65\n73\n0\n40\n0.0\n"); out.printf("0\nENDTAB\n"); out.printf("0\nTABLE\n2\nLAYER\n70\n6\n"); // 2 layer name, 70 flag (64), 62 color code, 6 line style String style = "CONTINUOUS"; int flag = 64; out.printf("0\nLAYER\n2\nLEG\n70\n%d\n62\n%d\n6\n%s\n", flag, 1, style ); out.printf("0\nLAYER\n2\nSPLAY\n70\n%d\n62\n%d\n6\n%s\n", flag, 2, style ); out.printf("0\nLAYER\n2\nSTATION\n70\n%d\n62\n%d\n6\n%s\n", flag, 3, style ); out.printf("0\nLAYER\n2\nLINE\n70\n%d\n62\n%d\n6\n%s\n", flag, 4, style ); out.printf("0\nLAYER\n2\nPOINT\n70\n%d\n62\n%d\n6\n%s\n", flag, 5, style ); out.printf("0\nLAYER\n2\nAREA\n70\n%d\n62\n%d\n6\n%s\n", flag, 6, style ); out.printf("0\nLAYER\n2\nSURFACE\n70\n%d\n62\n%d\n6\n%s\n", flag, 7, style ); out.printf("0\nLAYER\n2\nJOIN\n70\n%d\n62\n%d\n6\n%s\n", flag, 8, style ); out.printf("0\nENDTAB\n"); out.printf("0\nTABLE\n2\nSTYLE\n70\n0\n"); out.printf("0\nENDTAB\n"); } out.printf("0\nENDSEC\n"); out.printf("0\nSECTION\n2\nBLOCKS\n"); { // // 8 layer (0), 2 block name, for ( int n = 0; n < BrushManager.mPointLib.mSymbolNr; ++ n ) { int block = 1+n; // block_name = 1 + therion_code out.printf("0\nBLOCK\n8\nPOINT\n2\n%d\n70\n64\n10\n0.0\n20\n0.0\n30\n0.0\n", block ); out.printf( ((SymbolPoint)BrushManager.mPointLib.getSymbolByIndex(n)).getDxf() ); out.printf("0\nENDBLK\n"); } } out.printf("0\nENDSEC\n"); out.printf("0\nSECTION\n2\nENTITIES\n"); { // centerline data for ( NumShot sh : num.getShots() ) { NumStation f = sh.from; NumStation t = sh.to; out.printf("0\nLINE\n8\nLEG\n"); out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", f.e, f.s, f.v ); out.printf(Locale.US, "11\n%.2f\n21\n%.2f\n31\n%.2f\n", t.e, t.s, t.v ); } for ( NumSplay sh : num.getSplays() ) { NumStation f = sh.from; out.printf("0\nLINE\n8\nSPLAY\n"); out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", f.e, f.s, f.v ); out.printf(Locale.US, "11\n%.2f\n21\n%.2f\n31\n%.2f\n", sh.e, sh.s, sh.v ); } for ( NumStation st : num.getStations() ) { // FIXME station scale is 0.3 out.printf("0\nTEXT\n8\nSTATION\n"); out.printf("1\n%s\n", st.name ); out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n40\n0.3\n", st.e, st.s, st.v ); } for ( SketchPath path : model.mPaths ) { if ( path.mType == DrawingPath.DRAWING_PATH_LINE ) { String layer = "LINE"; int flag = 0; SketchLinePath line = (SketchLinePath) path; ArrayList< Vector > points = line.mLine.points; // ArrayList< Vector > points = line.mPts3D; out.printf("0\nPOLYLINE\n8\n%s\n70\n%d\n66\n1\n", layer, flag ); for ( Vector p : points ) { out.printf("0\nVERTEX\n8\n%s\n", layer ); out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", p.x, p.y, p.z ); } out.printf("0\nSEQEND\n"); } else if ( path.mType == DrawingPath.DRAWING_PATH_AREA ) { SketchLinePath line = (SketchLinePath) path; // ArrayList< Vector > points = line.mLine.points; ArrayList< Vector > points = line.mPts3D; out.printf("0\nHATCH\n8\nAREA\n91\n1\n" ); out.printf("93\n%d\n", points.size() ); for ( Vector p : points ) { out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", p.x, p.y, p.z ); } } else if ( path.mType == DrawingPath.DRAWING_PATH_POINT ) { // FIXME point scale factor is 0.3 SketchPointPath point = (SketchPointPath) path; int idx = 1 + point.mThType; out.printf("0\nINSERT\n8\nPOINT\n2\n%d\n41\n0.3\n42\n0.3\n", idx); out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", point.mXpos, point.mYpos, point.mZpos ); } } for ( SketchSurface sf : model.mSurfaces ) { SparseArray< SketchVertex > vts = sf.mVertices; // for ( SketchBorder brd : sf.borders ) { // for ( SketchSide s : brd.sides ) { // SketchVertex v1 = vts.get( s.v1 ); // SketchVertex v2 = vts.get( s.v2 ); // out.printf("0\nLINE\n8\nBORDER\n" ); // out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", v1.x, v1.y, v1.z ); // out.printf(Locale.US, "11\n%.2f\n21\n%.2f\n31\n%.2f\n", v2.x, v2.y, v2.z ); // } // } ArrayList< SketchTriangle > tris = sf.mTriangles; for ( SketchTriangle tri : tris ) { SketchVertex v1 = vts.get( tri.i ); SketchVertex v2 = vts.get( tri.j ); SketchVertex v3 = vts.get( tri.k ); out.printf("0\n3DFACE\n8\nSURFACE\n"); out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", v1.x, v1.y, v1.z ); out.printf(Locale.US, "11\n%.2f\n21\n%.2f\n31\n%.2f\n", v2.x, v2.y, v2.z ); out.printf(Locale.US, "12\n%.2f\n22\n%.2f\n32\n%.2f\n", v3.x, v3.y, v3.z ); out.printf(Locale.US, "13\n%.2f\n23\n%.2f\n33\n%.2f\n", v3.x, v3.y, v3.z ); } } for ( SketchSurface sf : model.mJoins ) { SparseArray< SketchVertex > vts = sf.mVertices; // for ( SketchBorder brd : sf.borders ) { // for ( SketchSide s : brd.sides ) { // SketchVertex v1 = vts.get( s.v1 ); // SketchVertex v2 = vts.get( s.v2 ); // out.printf("0\nLINE\n8\nBORDER\n" ); // out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", v1.x, v1.y, v1.z ); // out.printf(Locale.US, "11\n%.2f\n21\n%.2f\n31\n%.2f\n", v2.x, v2.y, v2.z ); // } // } ArrayList< SketchTriangle > tris = sf.mTriangles; for ( SketchTriangle tri : tris ) { SketchVertex v1 = vts.get( tri.i ); SketchVertex v2 = vts.get( tri.j ); SketchVertex v3 = vts.get( tri.k ); out.printf("0\n3DFACE\n8\nJOIN\n"); out.printf(Locale.US, "10\n%.2f\n20\n%.2f\n30\n%.2f\n", v1.x, v1.y, v1.z ); out.printf(Locale.US, "11\n%.2f\n21\n%.2f\n31\n%.2f\n", v2.x, v2.y, v2.z ); out.printf(Locale.US, "12\n%.2f\n22\n%.2f\n32\n%.2f\n", v3.x, v3.y, v3.z ); out.printf(Locale.US, "13\n%.2f\n23\n%.2f\n33\n%.2f\n", v3.x, v3.y, v3.z ); } } } out.printf("0\nENDSEC\n"); out.printf("0\nEOF\n"); } }