dxflib android

  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());
        
        } 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容