首先下载dxflib:https://github.com/clothbot/dxflib
然后将其中src文件导入到android 的cpp文件夹下
如图:
- 更改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} )
- 编辑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
}
- 最后需要将生产的文件进行转码,因为该方法导出文件是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());
}