dxflib android

作者: 我爱麦芽糖 | 来源:发表于2017-09-21 10:13 被阅读0次
  1. 首先下载dxflib:https://github.com/clothbot/dxflib

  2. 然后将其中src文件导入到android 的cpp文件夹下
    如图:

cpp.png
  1. 更改Cmakelist添加

src/main/cpp/dl_dxf.cpp
src/main/cpp/dl_writer_ascii.cpp

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html```

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s)

              src/main/cpp/dl_dxf.cpp
              src/main/cpp/dl_writer_ascii.cpp
              src/main/cpp/native-lib.cpp )


# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
  1. 编辑nativelib

这里主要是需要注意dxf的初始化 ,以保证生成文件满足cad要求。
还有更改dxf.cpp文件里的函数 void DL_Dxf::writeStyle(DL_WriterA& dw) 中的 dw.dxfString( 3, "txt");为dw.dxfString( 3, "ARIAL.TTF");

#include <jni.h>
#include <string>
#include "dl_writer_ascii.h"
#include "dl_dxf.h"
#include "Android/log.h"
#include "dl_codes.h"

#define TAG    "myhello-jni-test" //
#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)

#define LC_NAME_zh_CN_GBK        LC_NAME_zh_CN "." CSET_GBK
#define LC_NAME_zh_CN_UTF8        LC_NAME_zh_CN "." CSET_UTF8
#define LC_NAME_zh_CN_DEFAULT    LC_NAME_zh_CN_GBK
static DL_Codes::version sversion;
static DL_Attributes attributes = DL_Attributes("mainlayer", 256, -1, "BYLAYER");
DL_Dxf *dxf;
DL_WriterA *dw;

JNIEXPORT void JNICALL
Java_adr_ycx_com_c_WriteC_addPoint(JNIEnv *env, jobject instance, jdouble x, jdouble y, jdouble z) {
    DL_PointData data = DL_PointData(x, y, z);
    dxf->writePoint(*dw, data, attributes);
    // TODO

}

extern "C"
JNIEXPORT void JNICALL
Java_adr_ycx_com_c_WriteC_addText(JNIEnv *env, jobject instance, jdouble x, jdouble y, jdouble z,
                                  jstring text_) {
    const char *chars = env->GetStringUTFChars(text_, 0);
    // TODO
    DL_TextData data = DL_TextData(x, y, 0, 0, 1, 1, 0, 0, 0, 0, 0, chars, "", 0);
    dxf->writeText(*dw, data, attributes);
    env->ReleaseStringUTFChars(text_, chars);
}
extern "C"
JNIEXPORT void JNICALL
Java_adr_ycx_com_c_WriteC_addLine(JNIEnv *env, jobject instance, jdouble x1, jdouble y1, jdouble z1,
                                  jdouble x2, jdouble y2, jdouble z3) {

    // TODO

}
extern "C"
JNIEXPORT void JNICALL
Java_adr_ycx_com_c_WriteC_addCircle(JNIEnv *env, jobject instance, jdouble radius, jdouble x1,
                                    jdouble y1, jdouble y2) {

    // TODO

}



extern "C"
JNIEXPORT jint JNICALL
Java_adr_ycx_com_c_WriteC_init(JNIEnv *env, jobject instance, jint verison, jstring filepath_) {
    const char *filepath = env->GetStringUTFChars(filepath_, 0);
    // TODO const char *filepath_ = env->GetStringUTFChars(filepath, 0);
    switch (verison) {
        case 1:
            sversion = DL_Codes::AC1009;
            break;
        case 2:
            sversion = DL_Codes::AC1012;
            break;
        case 3:
            sversion = DL_Codes::AC1014;
            break;
        case 4:
            sversion = DL_Codes::AC1015;
            break;
        default:
            break;
    }
    dxf = new DL_Dxf();
    dw = dxf->out(filepath, sversion);
    if (dw == NULL) {
        return -1;
    } else {
        dxf->writeHeader(*dw);
        // int variable:
        dw->dxfString(9, "$INSUNITS");
        dw->dxfInt(70, 4);
        // real (double, float) variable:
        dw->dxfString(9, "$DIMEXE");
        dw->dxfReal(40, 1.25);
        // string variable:
        dw->dxfString(9, "$TEXTSTYLE");
        dw->dxfString(7, "Standard");
        // vector variable:
        dw->dxfString(9, "$LIMMIN");
        dw->dxfReal(10, 0.0);
        dw->dxfReal(20, 0.0);
        dw->sectionEnd();
        dw->sectionTables();
        dxf->writeVPort(*dw);
        dw->tableLineTypes(25);
        dxf->writeLineType(*dw, DL_LineTypeData("BYBLOCK", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("BYLAYER", 0));
        dxf->writeLineType(*dw,
                           DL_LineTypeData("CONTINUOUS", 0));
        dxf->writeLineType(*dw,
                           DL_LineTypeData("ACAD_ISO02W100", 0));
        dxf->writeLineType(*dw,
                           DL_LineTypeData("ACAD_ISO03W100", 0));
        dxf->writeLineType(*dw,
                           DL_LineTypeData("ACAD_ISO04W100", 0));
        dxf->writeLineType(*dw,
                           DL_LineTypeData("ACAD_ISO05W100", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("BORDER", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("BORDER2", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("BORDERX2", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("CENTER", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("CENTER2", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("CENTERX2", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("DASHDOT", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("DASHDOT2", 0));
        dxf->writeLineType(*dw,
                           DL_LineTypeData("DASHDOTX2", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("DASHED", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("DASHED2", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("DASHEDX2", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("DIVIDE", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("DIVIDE2", 0));
        dxf->writeLineType(*dw,
                           DL_LineTypeData("DIVIDEX2", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("DOT", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("DOT2", 0));
        dxf->writeLineType(*dw, DL_LineTypeData("DOTX2", 0));
        dw->tableEnd();
        int numberOfLayers = 3;
        dw->tableLayers(numberOfLayers);

        dxf->writeLayer(*dw,
                        DL_LayerData("0", 0),
                        DL_Attributes(
                                std::string(""),      // leave empty
                                DL_Codes::black,        // default color
                                100,                  // default width
                                "CONTINUOUS"));       // default line style

        dxf->writeLayer(*dw,
                        DL_LayerData("mainlayer", 0),
                        DL_Attributes(
                                std::string(""),
                                DL_Codes::red,
                                100,
                                "CONTINUOUS"));

        dxf->writeLayer(*dw,
                        DL_LayerData("anotherlayer", 0),
                        DL_Attributes(
                                std::string(""),
                                DL_Codes::black,
                                100,
                                "CONTINUOUS"));

        dw->tableEnd();
        dxf->writeStyle(*dw);
        dxf->writeView(*dw);
        dxf->writeUcs(*dw);

        dw->tableAppid(1);
        dw->tableAppidEntry(0x12);
        dw->dxfString(2, "ACAD");
        dw->dxfInt(70, 0);
        dw->tableEnd();
        dxf->writeDimStyle(*dw,
                           1,
                           1,
                           1,
                           1,
                           1);
        dxf->writeBlockRecord(*dw);
        dxf->writeBlockRecord(*dw, "myblock1");
        dxf->writeBlockRecord(*dw, "myblock2");
        dw->tableEnd();
        dw->sectionEnd();
        dw->sectionBlocks();

        dxf->writeBlock(*dw,
                        DL_BlockData("*Model_Space", 0, 0.0, 0.0, 0.0));
        dxf->writeEndBlock(*dw, "*Model_Space");

        dxf->writeBlock(*dw,
                        DL_BlockData("*Paper_Space", 0, 0.0, 0.0, 0.0));
        dxf->writeEndBlock(*dw, "*Paper_Space");

        dxf->writeBlock(*dw,
                        DL_BlockData("*Paper_Space0", 0, 0.0, 0.0, 0.0));
        dxf->writeEndBlock(*dw, "*Paper_Space0");

        dxf->writeBlock(*dw,
                        DL_BlockData("myblock1", 0, 0.0, 0.0, 0.0));
        // ...
        // write block entities e.g. with dxf->writeLine(), ..
        // ...
        dxf->writeEndBlock(*dw, "myblock1");

        dxf->writeBlock(*dw,
                        DL_BlockData("myblock2", 0, 0.0, 0.0, 0.0));
        // ...
        // write block entities e.g. with dxf->writeLine(), ..
        // ...
        dxf->writeEndBlock(*dw, "myblock2");
        dw->sectionEnd();
    }
    env->ReleaseStringUTFChars(filepath_, filepath);
    return 1;
}
extern "C"
JNIEXPORT void JNICALL
Java_adr_ycx_com_c_WriteC_close(JNIEnv *env, jobject instance) {

    dw->dxfEOF();
    dw->close();
    // TODO

}
extern "C"
JNIEXPORT void JNICALL
Java_adr_ycx_com_c_WriteC_startEnity(JNIEnv *env, jobject instance) {
    dw->sectionEntities();
    // TODO

}
extern "C"
JNIEXPORT void JNICALL
Java_adr_ycx_com_c_WriteC_endEnity(JNIEnv *env, jobject instance) {
    dw->sectionEnd();
    dxf->writeObjects(*dw);
    dxf->writeObjectsEnd(*dw);
    // TODO

}
  1. 最后需要将生产的文件进行转码,因为该方法导出文件是UTF_8的,为了中文显示正确,需要将其转为CAD支持的GBK编码,建议使用java转换
 public static void convert(File file) throws IOException {
        // 如果是文件则进行编码转换,写入覆盖原文件
        int fileCount = 0;
        Charset sourceCharset = Charset.forName("utf-8");
        Charset targetCharset = Charset.forName("gbk");
        if (file.isFile()) {
            // 只处理.java结尾的代码文件
            InputStreamReader isr = new InputStreamReader(new FileInputStream(
                    file), sourceCharset);
            BufferedReader br = new BufferedReader(isr);
            StringBuffer sb = new StringBuffer();
            String line = null;
            while ((line = br.readLine()) != null) {
                // 注意写入换行符
                sb.append(line + "\n");
            }
            br.close();
            isr.close();

            OutputStreamWriter osw = new OutputStreamWriter(
                    new FileOutputStream(file), targetCharset);
            BufferedWriter bw = new BufferedWriter(osw);
            // 以字符串的形式一次性写入
            bw.write(sb.toString());
            bw.close();
            osw.close();

            System.out.println("Deal:" + file.getPath());
        
        } 

相关文章

网友评论

    本文标题:dxflib android

    本文链接:https://www.haomeiwen.com/subject/qofzsxtx.html