lihao1 3 лет назад
Родитель
Сommit
b5d3555764
100 измененных файлов с 25312 добавлено и 0 удалено
  1. 10 0
      .gitignore
  2. 89 0
      build.gradle
  3. 167 0
      cadengine/build.gradle
  4. 21 0
      cadengine/proguard-rules.pro
  5. 26 0
      cadengine/src/androidTest/java/cn/sagacloud/android/cadengine/ExampleInstrumentedTest.java
  6. 2 0
      cadengine/src/main/AndroidManifest.xml
  7. 339 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/FloorScene.kt
  8. 25 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/Opt.kt
  9. 43 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/http/DownloadData.kt
  10. 88 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/ColumnItem.kt
  11. 117 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/DoorItem.kt
  12. 64 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/MarkItem.kt
  13. 167 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/SpaceItem.kt
  14. 98 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/SpatialCenterItem.kt
  15. 103 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/UserMark.kt
  16. 97 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/VirtualWallItem.kt
  17. 92 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/WallItem.kt
  18. 94 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/WindowItem.kt
  19. 133 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/test/GraphyFmItem.kt
  20. 142 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/test/GraphyTwoItem.kt
  21. 23 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Column.kt
  22. 34 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Door.kt
  23. 21 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Elements.kt
  24. 11 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Entity.kt
  25. 13 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/FloorData.kt
  26. 17 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Marker.kt
  27. 15 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Place.kt
  28. 25 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Space.kt
  29. 21 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/VirtualWall.kt
  30. 25 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Wall.kt
  31. 29 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Window.kt
  32. 3 0
      cadengine/src/main/res/values/strings.xml
  33. 17 0
      cadengine/src/test/java/cn/sagacloud/android/cadengine/ExampleUnitTest.java
  34. 145 0
      demo/build.gradle
  35. 21 0
      demo/proguard-rules.pro
  36. 64 0
      demo/src/main/AndroidManifest.xml
  37. 6702 0
      demo/src/main/assets/WallDatas.json
  38. 12944 0
      demo/src/main/assets/cxds5.json
  39. 22 0
      demo/src/main/assets/dist/abc.html
  40. 1 0
      demo/src/main/assets/dist/index.html
  41. 2 0
      demo/src/main/assets/dist/static/css/app.aa519651e328a583ca88e8b7d02122ab.css
  42. 1 0
      demo/src/main/assets/dist/static/css/app.aa519651e328a583ca88e8b7d02122ab.css.map
  43. 2 0
      demo/src/main/assets/dist/static/css/app.cca059254702f9ed953b7df749673cf4.css
  44. 1 0
      demo/src/main/assets/dist/static/css/app.cca059254702f9ed953b7df749673cf4.css.map
  45. 2 0
      demo/src/main/assets/dist/static/js/app.4768fdc1107768177998.js
  46. 1 0
      demo/src/main/assets/dist/static/js/app.4768fdc1107768177998.js.map
  47. 2 0
      demo/src/main/assets/dist/static/js/app.c59eccc233104d73ccb7.js
  48. 1 0
      demo/src/main/assets/dist/static/js/app.c59eccc233104d73ccb7.js.map
  49. 2 0
      demo/src/main/assets/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js
  50. 1 0
      demo/src/main/assets/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js.map
  51. 2 0
      demo/src/main/assets/dist/static/js/manifest.3ad1d5771e9b13dbdad2.js
  52. 1 0
      demo/src/main/assets/dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map
  53. 13 0
      demo/src/main/assets/dist/static/js/vendor.7fed9fa7b7ba482410b7.js
  54. 1 0
      demo/src/main/assets/dist/static/js/vendor.7fed9fa7b7ba482410b7.js.map
  55. 13 0
      demo/src/main/assets/dist/static/js/vendor.9d43f691bba00d2c76b8.js
  56. 1 0
      demo/src/main/assets/dist/static/js/vendor.9d43f691bba00d2c76b8.js.map
  57. BIN
      demo/src/main/assets/ic_launcher.png
  58. 1 0
      demo/src/main/assets/vue/index.html
  59. 310 0
      demo/src/main/assets/vue/static/css/app.365230fcdec5540c73c87126a6b39cdb.css
  60. 1 0
      demo/src/main/assets/vue/static/css/app.365230fcdec5540c73c87126a6b39cdb.css.map
  61. BIN
      demo/src/main/assets/vue/static/fonts/iconfont.83485c9.ttf
  62. BIN
      demo/src/main/assets/vue/static/fonts/iconfont.df5f83a.eot
  63. 1259 0
      demo/src/main/assets/vue/static/img/iconfont.15eea4c.svg
  64. 2 0
      demo/src/main/assets/vue/static/js/app.bcfe948aec3e9d1194c5.js
  65. 1 0
      demo/src/main/assets/vue/static/js/app.bcfe948aec3e9d1194c5.js.map
  66. 2 0
      demo/src/main/assets/vue/static/js/manifest.2ae2e69a05c33dfc65f8.js
  67. 1 0
      demo/src/main/assets/vue/static/js/manifest.2ae2e69a05c33dfc65f8.js.map
  68. 13 0
      demo/src/main/assets/vue/static/js/vendor.94ad8e265ab2d614e07f.js
  69. 1 0
      demo/src/main/assets/vue/static/js/vendor.94ad8e265ab2d614e07f.js.map
  70. 56 0
      demo/src/main/java/com/sybotan/android/demo/DemoApp.kt
  71. 148 0
      demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt
  72. 70 0
      demo/src/main/java/com/sybotan/android/demo/activities/MainActivity.kt
  73. 78 0
      demo/src/main/java/com/sybotan/android/demo/activities/WebViewActivity.kt
  74. 29 0
      demo/src/main/java/com/sybotan/android/demo/entitiies/FloorDatas.kt
  75. 30 0
      demo/src/main/java/com/sybotan/android/demo/entitiies/Revit.kt
  76. 26 0
      demo/src/main/java/com/sybotan/android/demo/entitiies/SgElement.kt
  77. 110 0
      demo/src/main/java/com/sybotan/android/demo/graphy/GraphyWallItem.kt
  78. 162 0
      demo/src/main/java/com/sybotan/android/demo/tools/GzipUtil.java
  79. 66 0
      demo/src/main/java/com/sybotan/android/demo/tools/HttpDownloadMap.kt
  80. 188 0
      demo/src/main/java/com/sybotan/android/demo/tools/OkhttpUtil.kt
  81. 59 0
      demo/src/main/java/com/sybotan/android/demo/tools/Opt.kt
  82. 34 0
      demo/src/main/res/animator/sybotan_anim.xml
  83. 57 0
      demo/src/main/res/drawable-v24/ic_launcher_foreground.xml
  84. BIN
      demo/src/main/res/drawable/ic_launcher123.png
  85. 97 0
      demo/src/main/res/drawable/ic_launcher_background.xml
  86. 32 0
      demo/src/main/res/drawable/menu_my.xml
  87. 27 0
      demo/src/main/res/drawable/menu_my_selected.xml
  88. 30 0
      demo/src/main/res/drawable/menu_my_selector.xml
  89. 53 0
      demo/src/main/res/drawable/sybotan_logo.xml
  90. 39 0
      demo/src/main/res/drawable/sybotan_logo_anim.xml
  91. 36 0
      demo/src/main/res/layout/activity_graphy.xml
  92. 40 0
      demo/src/main/res/layout/activity_main.xml
  93. 37 0
      demo/src/main/res/layout/activity_web_view.xml
  94. 45 0
      demo/src/main/res/menu/navigation.xml
  95. 28 0
      demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  96. 28 0
      demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  97. BIN
      demo/src/main/res/mipmap-hdpi/ic_launcher.png
  98. BIN
      demo/src/main/res/mipmap-hdpi/ic_launcher_round.png
  99. BIN
      demo/src/main/res/mipmap-mdpi/ic_launcher.png
  100. 0 0
      demo/src/main/res/mipmap-mdpi/ic_launcher_round.png

+ 10 - 0
.gitignore

@@ -0,0 +1,10 @@
+/.idea
+/.gradle
+**/build
+/gradle
+*.iml
+.idea
+*.iml
+.gradle
+build
+out

+ 89 - 0
build.gradle

@@ -0,0 +1,89 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+group SAGA_GROUP
+version SAGA_ANDROID_VERSION
+
+buildscript {
+    repositories {
+
+        maven{ url'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
+        maven { url 'https://maven.aliyun.com/repository/google' }
+        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
+        mavenCentral()
+        jcenter()
+        google()
+
+
+
+    }
+    dependencies {
+        classpath group: 'com.android.tools.build', name: 'gradle', version: GRADLE_VERSION
+        classpath group: 'org.jetbrains.kotlin', name: 'kotlin-gradle-plugin', version: KOTLIN_VERSION
+        classpath group: 'org.jetbrains.kotlin', name: 'kotlin-android-extensions', version: KOTLIN_VERSION
+        classpath group: 'org.jetbrains.dokka', name: 'dokka-android-gradle-plugin', version: DOKKA_VERSION
+    }
+}
+
+allprojects {
+    repositories {
+        mavenCentral()
+        maven{ url MAVEN_REPO_PUBLIC_URL}
+        maven{ url'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
+        maven { url 'https://maven.aliyun.com/repository/google' }
+        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
+
+        jcenter()
+        google()
+
+    }
+    tasks.withType(Javadoc) {
+        options{
+            encoding 'UTF-8'
+            charSet 'UTF-8'
+            links 'http://docs.oracle.com/javase/8/docs/api'
+        }
+    }
+}
+
+tasks.withType(JavaCompile) {
+    // 全局编码设置
+    options.encoding = 'UTF-8'
+}
+
+// 生成文档
+task dokkaAll(type: org.jetbrains.dokka.gradle.DokkaTask) {
+    jdkVersion = JDK_VERSION.toInteger()
+    noStdlibLink = true
+    outputFormat = 'javadoc'
+    outputDirectory = $/$buildDir/javadoc/$
+    sourceDirs = files(
+            "$projectDir/sybotan-android-core/src/main/java",
+            "$projectDir/sybotan-android-devices/src/main/java",
+            "$projectDir/sybotan-android-graphy/src/main/java",
+            "$projectDir/sybotan-android-views/src/main/java")
+}
+
+//task clean(type: Delete) {
+//    delete rootProject.buildDir
+//}

+ 167 - 0
cadengine/build.gradle

@@ -0,0 +1,167 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+group rootProject.group
+version rootProject.version
+
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+apply plugin: 'org.jetbrains.dokka-android'
+apply plugin: 'maven'
+
+android {
+    compileSdkVersion ANDROID_SDK_VERSION.toInteger()
+    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
+
+
+    defaultConfig {
+        minSdkVersion ANDROID_MIN_SDK_VERSION.toInteger()
+        targetSdkVersion ANDROID_SDK_VERSION.toInteger()
+        versionCode SAGA_CODE.toInteger()
+        versionName SAGA_ANDROID_VERSION
+
+        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
+
+    }
+
+    buildTypes {
+        release {
+            proguardFile 'proguard-rules.pro'
+        }
+    }
+
+    // 解决lint语法检查错误(kotlin语法无法通过lint)
+    lintOptions {
+        abortOnError false
+    }
+
+    kotlinOptions {
+        jvmTarget = JVM_TARGET
+    }
+}
+
+dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // kotlin 依赖
+    // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib-jdk8
+    implementation group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk8', version: KOTLIN_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // android支持
+    implementation group: 'com.android.support', name: 'appcompat-v7', version: ANDROID_SUPPORT_VERSION
+    implementation group: 'com.android.support', name: 'design', version: ANDROID_SUPPORT_VERSION
+    // implementation group: 'com.android.support', name: 'support-v4', version: ANDROID_SUPPORT_VERSION
+    implementation group: 'com.android.support.constraint', name: 'constraint-layout', version: CONSTRAINT_VERSION
+
+    // anko依赖
+    // https://mvnrepository.com/artifact/org.jetbrains.anko/anko-commons
+    implementation group: 'org.jetbrains.anko', name: 'anko-commons', version: ANKO_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Sybotan依赖
+//    implementation group: "cn.sagacloud", name: "sybotan-android-base", version: SYBOTAN_ANDROID_VERSION
+//    implementation group: "cn.sagacloud", name: "sybotan-android-graphy", version: SYBOTAN_ANDROID_VERSION
+//    implementation group: "cn.sagacloud", name: "sybotan-android-database", version: SYBOTAN_ANDROID_VERSION
+    implementation group: 'cn.sagacloud', name: 'saga-kotlin-base', version: SAGA_KOTLIN_VERSION
+    implementation group: 'cn.sagacloud', name: 'saga-kotlin-database', version: SAGA_KOTLIN_VERSION
+    implementation project(':sybotan-android-base')
+    implementation project(':sybotan-android-database')
+    implementation project(':sybotan-android-graphy')
+
+    //noinspection GradleDependency
+    implementation 'org.greenrobot:eventbus:3.0.0'
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// 文档生成
+// 源码
+task sourcesJar(type: Jar) {
+    group = 'jar'
+    from "${android.sourceSets.main.java.srcDirs}"
+    classifier = 'sources'
+}
+
+// 文档
+task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) {
+    jdkVersion = JDK_VERSION.toInteger()
+    noStdlibLink = true
+    outputFormat = 'javadoc'
+    outputDirectory = "$buildDir/javadoc"
+//    sourceDirs = files('src/main/java')
+}
+
+// 上成上传的文档jar包
+task javadocJar(type: Jar, dependsOn: dokkaJavadoc) {
+    group = 'jar'
+    classifier = 'javadoc'
+    from "${dokka.outputDirectory}"
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// maven 仓库管理
+
+// 设置上传的包,默认上传aar与pom
+artifacts {
+    // 上传源码包
+    // archives sourcesJar
+    // 上传文档包
+    // archives javadocJar
+}
+
+uploadArchives {
+    repositories {
+        mavenDeployer {
+            pom.groupId = project.group
+            pom.version = project.version
+            pom.artifactId = project.name
+            pom.project {
+                name project.name
+                packaging 'jar'
+                url SAGA_URL
+                description '上格云cad引擎库。'
+                licenses {
+                    license {
+                        name 'The Apache Software License, Version 2.0'
+                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                    }
+                }
+                developers {
+                    developer {
+                        id DEVELOPER_ID
+                        name DEVELOPER_NAME
+                    }
+                }
+            }
+            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
+                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+            }
+            repository(url: MAVEN_REPO_RELEASE_URL) {
+                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+            }
+        }
+    }
+}

+ 21 - 0
cadengine/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 26 - 0
cadengine/src/androidTest/java/cn/sagacloud/android/cadengine/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package cn.sagacloud.android.cadengine;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getTargetContext();
+
+        assertEquals("cn.sagacloud.android.cadengine.test", appContext.getPackageName());
+    }
+}

+ 2 - 0
cadengine/src/main/AndroidManifest.xml

@@ -0,0 +1,2 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="cn.sagacloud.android.cadengine"/>

+ 339 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/FloorScene.kt

@@ -0,0 +1,339 @@
+package cn.sagacloud.android.cadengine
+
+import android.graphics.PointF
+import android.util.Log
+import cn.sagacloud.android.cadengine.types.*
+import com.alibaba.fastjson.PropertyNamingStrategy
+import com.sybotan.android.graphy.SGraphyScene
+import com.sybotan.base.extensions.toJson
+import com.sybotan.base.utils.SHttpUtil
+import com.sybotan.base.utils.SJsonUtil
+import android.text.TextUtils
+import android.util.SizeF
+import cn.sagacloud.android.cadengine.items.*
+import cn.sagacloud.android.cadengine.test.GraphyFmItem
+import com.sybotan.android.graphy.events.SGraphyViewMoveEvent
+import com.sybotan.android.graphy.items.SGraphyClockItem
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+/**
+ * 楼层场景
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+open class FloorScene : SGraphyScene() {
+    /** item 数据  */
+    var data: FloorData? = null
+        set(value) {
+            addBaseMapItem(value!!)
+            field = value
+        } // Set data
+
+    /** 初始化 */
+    init {
+        //addItem(SGraphyClockItem(SizeF(500f, 500f), null))
+    } // Init()
+
+    /** 是否显示墙体  */
+    var isShowColumn: Boolean = true
+        set(value) {
+            field = value
+            for (column in columnList) {
+                column.isVisible = value
+            }
+        } // Set isShowColumn
+
+    /** 是否显示墙体  */
+    var isShowWall: Boolean = true
+        set(value) {
+            field = value
+            for (wall in wallList) {
+                wall.isVisible = value
+            }
+        } // Set isShowWall
+    /** 是否显示虚拟墙  */
+    var isShowVirtualWall: Boolean = true
+        set(value) {
+            field = value
+            for (wall in virtualWallList) {
+                wall.isVisible = value
+            }
+        } // Set isShowWall
+
+    /** 是否显示空间  */
+    var isShowSpace: Boolean = true
+        set(value) {
+            field = value
+            for (space in spaceList) {
+                space.isVisible = value
+            }
+        } // Set isShowSpace
+
+    /** 是否显示门  */
+    var isShowDoor: Boolean = true
+        set(value) {
+            field = value
+            for (door in doorList) {
+                door.isVisible = value
+            }
+        } // Set isShowDoor
+
+    /** 是否显示窗户  */
+    var isShowWindow: Boolean = true
+        set(value) {
+            field = value
+            for (window in windowList) {
+                window.isVisible = value
+            }
+        } // Set isShowWindow
+
+    /** 墙 list   */
+    val wallList = ArrayList<WallItem>()
+    /** 虚拟墙 list   */
+    val virtualWallList = ArrayList<VirtualWallItem>()
+    /** 柱子 list   */
+    var columnList = ArrayList<ColumnItem>()
+    /** 空间 list   */
+    var spaceList = ArrayList<SpaceItem>()
+    /** 空间名称 list   */
+    val spaceNameList = ArrayList<SpatialCenterItem>()
+    /** 门 list   */
+    var doorList = ArrayList<DoorItem>()
+    /** 空间 list   */
+    var windowList = ArrayList<WindowItem>()
+
+    /**
+     *  获取底图压缩文件
+     *
+     *  @param  url         请求数据文件路径
+     *  @param  isGzip      是否为压缩格式
+     */
+    fun loadUrl(url: String, isGzip: Boolean = true){
+        Log.e("PLX","url = $url")
+        try {
+            val json = if (isGzip) {
+                SHttpUtil.getZipRequest(url)
+            } else {
+                SHttpUtil.getRequest(url)
+            }
+//            SJsonUtil.propertyNamingStrategy = PropertyNamingStrategy.PascalCase
+            val d = SJsonUtil.fromJson<FloorData>(json)
+            Log.e("PLX", "json = ${d?.toJson()}")
+            data = SJsonUtil.fromJson(json, FloorData::class.java)
+            Log.e("数据源", "json = ${d?.toJson()}")
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    } // Function loadUrl()
+
+    fun loadData(json : FloorData){
+        try {
+//            SJsonUtil.propertyNamingStrategy = PropertyNamingStrategy.PascalCase
+            Log.e("PLX", "json = ${json?.toJson()}")
+            data = json
+            Log.e("数据源", "json = ${json?.toJson()}")
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    } // Function loadUrl()
+
+
+
+
+
+
+
+
+
+
+
+    /**
+     *  增添所有底图 item;
+     *
+     *  @param  data    itemList对象
+     */
+    private fun addBaseMapItem(data: FloorData){
+        if (data.entityList.size < 1) {
+            return;
+        }
+        val elements = data.entityList[0].elements ?: return
+
+        // 添加墙
+        if (elements.walls != null) {
+            for (wall in elements.walls!!) {
+                addWall(wall);
+            }
+        }
+
+        // 添加虚拟墙
+        if (elements.virtualWalls != null) {
+            for (wall in elements.virtualWalls!!) {
+                addVirtualWall(wall);
+            }
+        }
+
+        // 添加柱子
+        if (elements.columns != null) {
+            for (column in elements.columns!!) {
+                addColumn(column);
+            }
+        }
+
+        // 添加空间
+        if (elements.spaces != null) {
+            for (space in elements.spaces!!) {
+                addSpace(space)
+            }
+        }
+
+        // 添加空间名称
+        if (elements.spaces != null) {
+            for (space in elements.spaces!!) {
+                addSpaceName(space)
+            }
+        }
+
+        // 添加门
+        if (elements.doors != null) {
+            for (door in elements.doors!!) {
+                addDoor(door);
+            }
+        }
+
+        // 添加窗户
+        if (elements.windows != null) {
+            for (window in elements.windows!!) {
+                addWindow(window);
+            }
+        }
+    } // Function addBaseMapItem()
+
+    /**
+     *  添加柱子到 scene 中
+     *
+     *  @param  column   柱子
+     */
+    open fun addColumn(column: Column){
+        val item = ColumnItem(column)
+        item.isVisible = isShowColumn
+        columnList.add(item)
+        addItem(item)
+    } // Function addColumn()
+
+    /**
+     *  添加墙到 scene 中
+     *
+     *  @param  wall   墙
+     */
+    open fun addWall(wall: Wall){
+        val item = WallItem(wall)
+        item.isVisible = isShowWall
+        wallList.add(item)
+        addItem(item)
+    } // Function addWall()
+
+    /**
+     *  添加所有虚拟墙到 scene 中
+     *
+     *  @param  wall   墙
+     */
+    open fun addVirtualWall(wall: VirtualWall){
+        val item = VirtualWallItem(wall)
+        item.isVisible = isShowVirtualWall
+        virtualWallList.add(item)
+        addItem(item)
+    } // Function addVirtualWall()
+
+    /**
+     *  添加空间到 scene 中
+     *
+     *  @param  space       空间
+     */
+    open fun addSpace(space: Space){
+        val item = SpaceItem(space)
+        Log.e("打印数据",space.toJson())
+        item.isVisible = isShowSpace
+        spaceList.add(item)
+        addItem(item)
+    } // Function addSpace()
+
+    /**
+     *  添加空间名称 scene 中
+     *
+     *  @param  space       空间
+     */
+    open fun addSpaceName(space: Space){
+            if (space.outLine!=null){
+                val scitem= SpatialCenterItem(space.name!!)
+                scitem.moveTo(PointF(space.location!!.points!![0].x, -space.location!!.points!![0].y))
+                scitem.zOrder= 100f
+                scitem.isVisible = true
+                spaceNameList.add(scitem)
+                this.addItem(scitem)
+
+        }
+    } // Function addSpace()
+
+    /**
+     *  添加门到 scene 中
+     *
+     *  @param  door        门
+     */
+    open fun addDoor(door: Door){
+        val item = DoorItem(door)
+        item.isVisible = isShowSpace
+        doorList.add(item)
+        addItem(item)
+    } // Function addWindow()
+
+
+
+    /**
+     *  添加窗户到 scene 中
+     *
+     *  @param  window     窗户
+     */
+    open fun addWindow(window: Window){
+        val item = WindowItem(window)
+        item.isVisible = isShowSpace
+        windowList.add(item)
+        addItem(item)
+    } // Function addWindow()
+
+    /**
+     * 截断输出日志
+     * 解决Log打印不全的问题
+     */
+    fun println1(msg: String) {
+        var msg = msg
+        if (TextUtils.isEmpty(msg))
+            return
+        val segmentSize = 3 * 1024
+        val length = msg.length.toLong()
+        if (length <= segmentSize) {// 长度小于等于限制直接打印
+            Log.e("PLX", msg)
+        } else {
+            while (msg.length > segmentSize) {// 循环分段打印日志
+                val logContent = msg.substring(0, segmentSize)
+                msg = msg.replace(logContent, "")
+                Log.e("PLX", logContent)
+            }
+            Log.e("PLX", msg)// 打印剩余日志
+        }
+    }
+
+    /**
+     *  接收移动坐标
+     */
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoveEvent(event: SGraphyViewMoveEvent) {
+        Log.e("x",event.x.toString())
+        Log.e("y",event.y.toString())
+//        mapToScene = this.mapToScene( PointF(this.width/2f,this.height/2f))
+//        if (cadViewMovePointF!=null){
+//            cadViewMovePointF!!.viewMovePointF(mapToScene)
+//        }
+    }
+
+} // Class FloorScene

+ 25 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/Opt.kt

@@ -0,0 +1,25 @@
+package cn.sagacloud.android.cadengine
+
+import android.graphics.Color
+
+/**
+ * 颜色类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class Opt {
+    companion object {
+        /** 墙颜色 */
+        val wallColor = Color.BLACK
+        /** 柱子颜色 */
+        val columnColor = Color.BLACK
+        /** 虚拟墙颜色 */
+        val virtualWallColor = Color.BLACK
+        /** 空间颜色 */
+        val spaceColor = Color.rgb(0xcb, 0xe5, 0xff)
+        /** 门颜色 */
+        val doorColor = Color.rgb(0xf5, 0xb3, 0x6f)
+        /** 窗户颜色 */
+        val windowColor = Color.rgb(0xfc, 0xd6, 0xff)
+    }
+} // Class Opt

+ 43 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/http/DownloadData.kt

@@ -0,0 +1,43 @@
+package cn.sagacloud.android.cadengine.http
+
+import android.util.Log
+import cn.sagacloud.android.cadengine.types.FloorData
+import com.alibaba.fastjson.PropertyNamingStrategy
+import com.sybotan.base.extensions.toJson
+import com.sybotan.base.utils.SHttpUtil
+import com.sybotan.base.utils.SJsonUtil
+
+/**
+ * 下载数据
+ *
+ * @author 张维新
+ */
+object DownloadData {
+
+    /**
+     *  获取底图压缩文件
+     *
+     *  @param  url         请求数据文件路径
+     *  @param  isGzip      是否为压缩格式
+     */
+    fun loadUrlFile(url: String, isGzip: Boolean = true): FloorData? {
+        Log.e("PLX","url = $url")
+        var floorData: FloorData? = null
+       return try {
+            val json = if (isGzip) {
+                SHttpUtil.getZipRequest(url)
+            } else {
+                SHttpUtil.getRequest(url)
+            }
+//            SJsonUtil.propertyNamingStrategy = PropertyNamingStrategy.PascalCase
+            val d = SJsonUtil.fromJson<FloorData>(json)
+            Log.e("PLX", "json = ${d?.toJson()}")
+           floorData = SJsonUtil.fromJson(json, FloorData::class.java)
+           floorData
+        } catch (e: Exception) {
+            e.printStackTrace()
+           floorData
+        }
+    } // Function loadUrlFile()
+
+} // Object DownloadData

+ 88 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/ColumnItem.kt

@@ -0,0 +1,88 @@
+package cn.sagacloud.android.cadengine.items
+
+import android.graphics.*
+import cn.sagacloud.android.cadengine.types.Column
+import cn.sagacloud.android.cadengine.Opt
+import com.sybotan.android.graphy.SGraphyItem
+
+/**
+ * 柱子 Item
+ *
+ * @author 付国宝
+ */
+class ColumnItem(private val data: Column, parent: SGraphyItem? = null) : SGraphyItem(parent) {
+    /** 画笔 */
+    private val paint = Paint()
+    /** 墙轮廓 */
+    private val pathList = ArrayList<Path>()
+    /** X坐标最小值  */
+    private var minX = 0f
+    /** X坐标最大值  */
+    private var maxX = 0f
+    /** Y坐标最小值  */
+    private var minY = 0f
+    /** Y坐标最大值  */
+    private var maxY = 0f
+
+    init {
+        paint.style = Paint.Style.FILL
+        try {
+            if (data.outLine != null && data.outLine!!.size > 0 && data.outLine!![0].size > 0) {
+                minX = data.outLine!![0][0].x
+                maxX = data.outLine!![0][0].x
+                minY = data.outLine!![0][0].y
+                maxY = data.outLine!![0][0].y
+                for (out in data.outLine!!) {
+                    if (out.size < 1) {
+                        continue
+                    }
+
+                    val path = Path()
+                    path.moveTo(out[0].x, -out[0].y)
+                    for (p in out) {
+                        if (p.x < minX) {
+                            minX = p.x
+                        }
+                        if (p.x > maxX) {
+                            maxX = p.x
+                        }
+                        if (-p.y < minY) {
+                            minY = -p.y
+                        }
+                        if (-p.y > maxY) {
+                            maxY = -p.y
+                        }
+                        path.lineTo(p.x, -p.y)
+                    }
+                    path.close()
+                    pathList.add(path)
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    } // Init
+
+    /**
+     * Item对象边界区域
+     *
+     * @return  边界区域
+     */
+    override fun boundingRect(): RectF {
+        return RectF(minX, minY, maxX, maxY)
+    } // Function boundingRect()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   canvas          画布
+     * @param   rect            绘制区域
+     */
+    override fun onDraw(canvas : Canvas) {
+        paint.style = Paint.Style.FILL
+        paint.color = Opt.columnColor;
+        for (path in pathList) {
+            canvas.drawPath(path, paint);
+        }
+    } // Function onDraw()
+} // Class ColumnItem

+ 117 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/DoorItem.kt

@@ -0,0 +1,117 @@
+package cn.sagacloud.android.cadengine.items
+
+import android.graphics.*
+import cn.sagacloud.android.cadengine.types.Door
+import cn.sagacloud.android.cadengine.Opt
+import com.sybotan.android.graphy.SGraphyItem
+import kotlin.math.atan2
+import kotlin.math.sqrt
+import kotlin.math.abs
+
+
+/**
+ * 门item
+ *
+ * @author 付国宝
+ */
+class DoorItem(private val data: Door, parent: SGraphyItem? = null) : SGraphyItem(parent) {
+    /** 画笔 */
+    private val paint1 = Paint()
+    private val paint2 = Paint()
+    /** 门长度 */
+    private var d = 0f
+
+    /** 角度  */
+    private var angle = 0f
+    /** 旋转点 */
+    private var p = PointF(0f, 0f)
+    /** 旋转起始角度 */
+    private var startAng = 0f
+
+    /**
+     * 构造
+     */
+    init {
+
+        try {
+            paint1.style = Paint.Style.STROKE
+            paint1.color = Opt.doorColor
+            paint1.strokeWidth = 100f
+            paint2.style = Paint.Style.STROKE
+            paint2.color = Opt.doorColor
+            paint2.strokeWidth = 50f
+            paint2.pathEffect = DashPathEffect(floatArrayOf(200f, 200f), 0f)
+
+            zOrder = 2f
+            if (data.outLine != null && data.outLine!!.size > 0 && data.outLine!![0].size >= 2) {
+                // 取门的两个端点
+                val p1 = PointF(data.outLine!![0][0].x, -data.outLine!![0][0].y)
+                val p2 = PointF(data.outLine!![0][1].x, -data.outLine!![0][1].y)
+                d = sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y))
+
+                // 角度为
+                val fo = atan2(-data.faceDirection!!.y, data.faceDirection!!.x)
+                // 门朝向角度
+                angle = if(data.faceDirection!!.x > 0) {
+                    fo
+                } else {
+                    fo + Math.PI.toFloat()
+                }
+
+//                val dir = data.faceDirection!!.x * (data.handDirection!!.y - data.faceDirection!!.y) - data.faceDirection!!.y * (data.handDirection!!.x - data.faceDirection!!.x)
+//                if (dir < 0) {
+//                    startAng = -90f
+//                }
+
+                // 计算旋转点
+                if (abs(data.handDirection!!.x) > abs(data.handDirection!!.y)) {
+                    p = if (data.handDirection!!.x > 0) {
+                        if (p1.x > p2.x) {
+                            p1
+                        } else {
+                            p2
+                        }
+                    } else {
+                        if (p1.x < p2.x) {
+                            p1
+                        } else {
+                            p2
+                        }
+                    }
+                } else {
+                    p = if (data.handDirection!!.y > 0) {
+                        if (p1.y > p2.y) {
+                            p1
+                        } else {
+                            p2
+                        }
+                    } else {
+                        if (p1.y < p2.y) {
+                            p1
+                        } else {
+                            p2
+                        }
+                    }
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    } // Constructor
+
+    /**
+     * Item绘制操作
+     *
+     * @param   canvas          画布
+     * @param   rect            绘制区域
+     */
+    override fun onDraw(canvas : Canvas) {
+        canvas.translate(p.x, p.y);
+        canvas.rotate(angle * 180f / Math.PI.toFloat())
+
+        canvas.drawLine(0f, 0f, d, 0f, paint1)
+//
+//        canvas.drawArc(-d, -d, d, d, startAng, 90f ,false, paint2)
+
+    } // Function onDraw()
+} // Class DoorItem

Разница между файлами не показана из-за своего большого размера
+ 64 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/MarkItem.kt


+ 167 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/SpaceItem.kt

@@ -0,0 +1,167 @@
+package cn.sagacloud.android.cadengine.items
+
+import android.graphics.*
+import cn.sagacloud.android.cadengine.Opt
+import cn.sagacloud.android.cadengine.types.Space
+import com.sybotan.android.graphy.SGraphyItem
+
+/**
+ * 空间item
+ *
+ * @author 付国宝
+ */
+class SpaceItem(private val data: Space, parent: SGraphyItem? = null) : SGraphyItem(parent) {
+    /** 画笔 */
+    private val paint = Paint()
+    /** 墙轮廓 */
+    private var spacePath: Path? = null
+    /** 空间轮廓线坐标list  */
+    private val pointArr = ArrayList<ArrayList<PointF>>()
+    /** X坐标最小值  */
+    private var minX = 0f
+    /** X坐标最大值  */
+    private var maxX = 0f
+    /** Y坐标最小值  */
+    private var minY = 0f
+    /** Y坐标最大值  */
+    private var maxY = 0f
+
+    init {
+        try {
+            zOrder = 1f
+            if (data.outLine != null && data.outLine!!.size > 0 && data.outLine!![0].size > 0) {
+                minX = data.outLine!![0][0].x
+                maxX = data.outLine!![0][0].x
+                minY = data.outLine!![0][0].y
+                maxY = data.outLine!![0][0].y
+
+                for (line in data.outLine!!) {
+                    if (line.size < 1) {
+                        continue
+                    }
+
+                    val path = Path()
+                    path.moveTo(line[0].x, -line[0].y)
+                    for (p in line) {
+                        if (p.x < minX) {
+                            minX = p.x
+                        }
+                        if (p.x > maxX) {
+                            maxX = p.x
+                        }
+                        if (-p.y < minY) {
+                            minY = -p.y
+                        }
+                        if (-p.y > maxY) {
+                            maxY = -p.y
+                        }
+                        path.lineTo(p.x, -p.y)
+                    }
+                    path.close()
+                    if (spacePath == null) {
+                        spacePath = path;
+                    } else {
+                        // spacePath.b
+                    }
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+        //if (data.outLine!!.size > 0) {
+//            val tempArr = this.data.OutLine
+//            this.minX = tempArr[0][0].x
+//            this.maxX = this.minX
+//            this.minY = -(tempArr[0][0].y)
+//            this.maxY = this.minY
+            // 处理轮廓点数组,同时计算最大最小值
+//            this.pointArr = tempArr.map(t => {
+//                var tempArr = t.map(it => {
+//                    var x = it.X,
+//                    y = -it.Y
+//                    if (x < this.minX) {
+//                        this.minX = x
+//                    }
+//                    if (y < this.minY) {
+//                        this.minY = y
+//                    }
+//                    if (x > this.maxX) {
+//                        this.maxX = x
+//                    }
+//                    if (y > this.maxY) {
+//                        this.maxY = y
+//                    }
+//                    return SPoint(x, y)
+//                })
+//                return tempArr
+//            })
+        //}
+    } // Constructor
+
+    /**
+     * Item对象边界区域
+     *
+     * @return SRect
+     */
+    override fun boundingRect() : RectF {
+        return RectF(minX, minY, maxX, maxY)
+    } // Function boundingRect()
+
+    /**
+     * 判断点是否在区域内
+     *
+     * @param x
+     * @param y
+     */
+    override fun contains(x: Float, y: Float): Boolean {
+//        if (this.data?.OutLine!!.size > 0) {
+//            var nCross: Double = 0.0
+//            var point = ArrayList<String>()
+//            point.add("x")
+//            point.add("y")
+//            var APoints = this.data?.OutLine!!.get(0)
+//            var length = APoints.size
+//            var p1: ArrayList<Point>? = null
+//            var p2: ArrayList<Point>? = null
+//            var i: Int? = null
+//            var xinters: Double? = null
+//            p1 = APoints.get(0)
+//            i == 1
+//            while (i!! <= length){
+//                p2 = APoints.get((i % length))
+//                if (point[0] > Math.min(p1.X, p2.X) && point[0] <= Math.max(p1.X, p2.X)) {
+//                    if (point[1] <= Math.max(p1.Y, p2.Y)) {
+//                        if (p1.X != p2.X) {
+//                            //计算位置信息
+//                            xinters = ((point[0] - p1.X) * (p2.Y - p1.Y)) / (p2.X - p1.X) + p1.Y
+//                            if (p1.Y == p2.Y || point[1] <= xinters) {
+//                                nCross++
+//                            }
+//                        }
+//                    }
+//                }
+//                p1 = p2
+//                i++
+//            }
+//            return nCross % 2 === 1
+//        }
+        return false
+    } // Function contains()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   canvas          画布
+     * @param   rect            绘制区域
+     */
+    override fun onDraw(canvas : Canvas) {
+        if (null != spacePath) {
+            paint.style = Paint.Style.FILL
+            paint.color = Opt.spaceColor;
+            canvas.drawPath(spacePath!!, paint)
+
+        }
+    } // Function onDraw()
+
+} // Class SpaceItem

+ 98 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/SpatialCenterItem.kt

@@ -0,0 +1,98 @@
+/*
+ * ********************************************************************************************************************
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2018.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reservad.
+ * ********************************************************************************************************************
+ */
+
+package cn.sagacloud.android.cadengine.items
+
+import android.graphics.*
+import android.view.MotionEvent
+import com.sybotan.android.graphy.SGraphyItem
+import com.sybotan.android.graphy.SMotionEvent
+
+
+/**
+ *   空间中心点
+ * @author  Andy
+ */
+class SpatialCenterItem(name :String,parent: SGraphyItem? = null) : SGraphyItem(parent) {
+        // 画笔
+    private var pen = Paint()
+    private var pain = Paint()
+    private var panText = Paint()
+    private var panT = Paint()
+     var flag:Boolean = false
+    private var codename:String
+
+    /**
+     * 默认构造函数
+     */
+    init {
+        this.hide()
+        pen.color = Color.BLACK
+        pen.strokeWidth = 5f
+        pen.isAntiAlias = true
+        pen.style = Paint.Style.FILL
+
+        pain.color = Color.BLUE
+        pain.strokeWidth = 5f
+        pain.isAntiAlias = false
+
+        panText.color = Color.BLACK
+        panText.strokeWidth = 5f
+        panText.isAntiAlias = true
+        panText.textSize=800f
+
+        panT.color = Color.BLUE
+        panT.strokeWidth = 5f
+        panT.isAntiAlias = false
+        panT.textSize=40f
+        this.codename=name
+        /** item获取焦点ItemIsFocusable,移动ItemIsMovable */
+//        flags= EnumSet.of(SGraphyItemFlag.ItemIsFocusable)
+//        flags = EnumSet.of(SGraphyItemFlag.ItemIsMovable)
+    } // init
+
+
+    /**
+     * Item对象边界区域
+     */
+    override fun boundingRect(): RectF {
+        return RectF(-10f, -10f,
+                50f, 50f)
+    } // Function boundingRect()
+
+    /**
+     * @param   canvas      画布对象
+     */
+    override fun onDraw(canvas: Canvas) {
+        canvas.drawText(codename.trim(),-10f,0f,panText)
+        return
+    } // Function paint()
+
+    /**
+     *  点击
+     */
+    override fun onSingleTapUp(e: SMotionEvent): Boolean {
+        return false
+    }
+
+    override fun onScroll(e1: SMotionEvent, e2: SMotionEvent, distanceX: Float, distanceY: Float): Boolean {
+        flag=false
+        return super.onScroll(e1, e2, distanceX, distanceY)
+    }
+
+} // Class GraphyWallItem

+ 103 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/UserMark.kt

@@ -0,0 +1,103 @@
+//package cn.sagacloud.android.cadengine.items
+//
+///**
+// * 标志item
+// *
+// * @author 付国宝
+// */
+//class UserMark {
+//    /** 标志宽度 */
+//    private var width: Double = 10.0
+//    /** 标志高度 */
+//    private var height: Double = 10.0
+//    /** 轮廓线坐标 */
+//    var outLine: ArrayList<SPoint>? = null
+//    /** 是否闭合 */
+//    var closeFlag = false
+//
+//    /**
+//     * 构造函数
+//     *
+//     * @param parent    指向父对象
+//     * @param data      标志数据
+//     */
+//    constructor(parent: SGraphyItem?, data: SPoint){
+//        super(parent)
+//        this.outLine.add(data)
+//    } // Constructor
+//
+//    /**
+//     * Item 对象边界区域
+//     *
+//     * @return	SRect
+//     */
+//    fun boundingRect() : SRect {
+//        return SRect(0, 0, this.width, this.height)
+//    } // Function boundingRect()
+//
+//    /**
+//     * 鼠标按下
+//     *
+//     * @param	event         事件参数
+//     * @return	boolean
+//     */
+//    fun onMouseDown(event: SMouseEvent) : Boolean {
+//        if (!this.closeFlag) {
+//            var newPoint = this.outLine?.get(this.outLine!!.size - 1)
+//            if (newPoint.x == this.outLine?.get(0).x && newPoint.y == this.outLine?.get(0).y) {
+//                this.closeFlag = true
+//            } else {
+//                newPoint = SPoint(event.x, event.y)
+//                this.outLine!!.add(newPoint)
+//            }
+//        }
+//        return true
+//    } // Function onMouseDown()
+//
+//    /**
+//     * 鼠标移动事件
+//     *
+//     * @param	event         事件参数
+//     * @return	boolean
+//     */
+//    fun onMouseMove(event: SMouseEvent) : Boolean {
+//        if (!this.closeFlag) {
+//            var first: SPoint? = null
+//            var newLast: SPoint? = null
+//            if (this.outLine!!.size > 1) {
+//                this.outLine.pop()
+//                first = this.outLine?.get(0)
+//            }
+//            newLast = SPoint(event.x, event.y)
+//            if(this.outLine!!.size > 2 && first != null){
+//                if (event.x + 20 >= first.x && event.x - 20 <= first.x && event.y + 20 >= first.y && event.y - 20 <= first.y) {
+//                    newLast = first
+//                }
+//            }
+//            this.outLine!!.add(newLast)
+//        }
+//        return true
+//    } // Function onMouseMove()
+//
+//    /**
+//     * Item绘制操作
+//     *
+//     * @param   painter       painter对象
+//     * @param   rect          绘制区域
+//     */
+//    fun onDraw(painter: SPainter, rect/*?*/: SRect){
+//        if (this.visible) {
+//            painter.pen.color = SColor("#00ff00")
+//            painter.pen.lineWidth = 2
+//            if (this.closeFlag) {
+//                painter.brush.color = SColor("#00ff00")
+//            }else{
+//                painter.brush.color = SColor("#ffffff80")
+//            }
+////            this.outLine.map(t => {
+////                painter.drawRect(t.x - 4, t.y - 4, 8, 8)
+////            })
+//            painter.drawPolyline(this.outLine)
+//        }
+//    } // Function onDraw()
+//} // Class UserMark

+ 97 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/VirtualWallItem.kt

@@ -0,0 +1,97 @@
+package cn.sagacloud.android.cadengine.items
+
+import android.graphics.*
+import cn.sagacloud.android.cadengine.Opt
+import cn.sagacloud.android.cadengine.types.VirtualWall
+import com.sybotan.android.graphy.SGraphyItem
+import android.graphics.DashPathEffect
+
+
+/**
+ * 墙item
+ *
+ * @author 付国宝
+ */
+class VirtualWallItem(private val data: VirtualWall, parent: SGraphyItem? = null) : SGraphyItem(parent) {
+    /** 画笔 */
+    private val paint = Paint()
+    /** 虚拟墙路径 */
+    private val pathList = ArrayList<Path>()
+
+    /** X坐标最小值  */
+    private var minX = 0f
+    /** X坐标最大值  */
+    private var maxX = 0f
+    /** Y坐标最小值  */
+    private var minY = 0f
+    /** Y坐标最大值  */
+    private var maxY = 0f
+
+    /**
+     * 构造
+     */
+    init {
+        try {
+            if (data.outLine != null && data.outLine!!.size > 0 && data.outLine!![0].size > 0) {
+                minX = data.outLine!![0][0].x
+                maxX = data.outLine!![0][0].x
+                minY = data.outLine!![0][0].y
+                maxY = data.outLine!![0][0].y
+
+                for (line in data.outLine!!) {
+                    if (line.size < 1) {
+                        continue
+                    }
+
+                    val path = Path()
+                    path.moveTo(line[0].x, -line[0].y)
+                    for (p in line) {
+                        if (p.x < minX) {
+                            minX = p.x
+                        }
+                        if (p.x > maxX) {
+                            maxX = p.x
+                        }
+                        if (-p.y < minY) {
+                            minY = -p.y
+                        }
+                        if (-p.y > maxY) {
+                            maxY = -p.y
+                        }
+                        path.lineTo(p.x, -p.y)
+                    }
+                    path.close()
+                    pathList.add(path)
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    } // Init
+
+    /**
+     * Item对象边界区域
+     *
+     * @return  边界区域
+     */
+    override fun boundingRect(): RectF {
+        return RectF(minX, minY, maxX, maxY)
+    } // Function boundingRect()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   canvas          画布
+     * @param   rect            绘制区域
+     */
+    override fun onDraw(canvas : Canvas) {
+        paint.color = Opt.virtualWallColor
+        paint.pathEffect = DashPathEffect(floatArrayOf(200f, 200f), 0f)
+        paint.style = Paint.Style.STROKE
+        paint.strokeWidth = 100f
+        for (path in pathList) {
+            canvas.drawPath(path, paint);
+        }
+
+    } // Function onDraw()
+} // Class VirtualWallItem

+ 92 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/WallItem.kt

@@ -0,0 +1,92 @@
+package cn.sagacloud.android.cadengine.items
+
+import android.graphics.*
+import cn.sagacloud.android.cadengine.Opt
+import cn.sagacloud.android.cadengine.types.Wall
+import com.sybotan.android.graphy.SGraphyItem
+
+/**
+ * 墙item
+ *
+ * @author  郝建龙
+ */
+class WallItem(private val data: Wall, parent: SGraphyItem? = null) : SGraphyItem(parent) {
+    /** 画笔 */
+    private val paint = Paint()
+    /** 墙轮廓 */
+    private val pathList = ArrayList<Path>()
+    /** X坐标最小值  */
+    private var minX = 0f
+    /** X坐标最大值  */
+    private var maxX = 0f
+    /** Y坐标最小值  */
+    private var minY = 0f
+    /** Y坐标最大值  */
+    private var maxY = 0f
+
+    /**
+     * 构造
+     */
+    init {
+        try {
+            if (data.outLine != null && data.outLine!!.size > 0 && data.outLine!![0].size > 0) {
+                minX = data.outLine!![0][0].x
+                maxX = data.outLine!![0][0].x
+                minY = data.outLine!![0][0].y
+                maxY = data.outLine!![0][0].y
+
+                for (line in data.outLine!!) {
+                    if (line.size < 1) {
+                        continue
+                    }
+
+                    val path = Path()
+                    path.moveTo(line[0].x, -line[0].y)
+                    for (p in line) {
+                        if (p.x < minX) {
+                            minX = p.x
+                        }
+                        if (p.x > maxX) {
+                            maxX = p.x
+                        }
+                        if (-p.y < minY) {
+                            minY = -p.y
+                        }
+                        if (-p.y > maxY) {
+                            maxY = -p.y
+                        }
+                        path.lineTo(p.x, -p.y)
+                    }
+                    path.close()
+                    pathList.add(path)
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    } // Constructor
+
+    /**
+     * Item对象边界区域
+     *
+     * @return  边界区域
+     */
+    override fun boundingRect(): RectF {
+        return RectF(minX, minY, maxX, maxY)
+    } // Function boundingRect()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   canvas          画布
+     * @param   rect            绘制区域
+     */
+    override fun onDraw(canvas : Canvas) {
+        paint.style = Paint.Style.FILL
+        paint.color = Opt.wallColor
+        for (path in pathList) {
+            canvas.drawPath(path, paint)
+        }
+
+    } // Function onDraw()
+} // Class WallItem

+ 94 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/WindowItem.kt

@@ -0,0 +1,94 @@
+package cn.sagacloud.android.cadengine.items
+
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.graphics.Path
+import android.graphics.RectF
+import cn.sagacloud.android.cadengine.types.Window
+import cn.sagacloud.android.cadengine.Opt
+import com.sybotan.android.graphy.SGraphyItem
+
+/**
+ * 窗户item
+ *
+ * @author 付国宝
+ */
+class WindowItem(private val data: Window, parent: SGraphyItem? = null) : SGraphyItem(parent) {
+    /** 画笔 */
+    private val paint = Paint()
+    /** 墙轮廓 */
+    private val pathList = ArrayList<Path>()
+    /** X坐标最小值  */
+    private var minX = 0f
+    /** X坐标最大值  */
+    private var maxX = 0f
+    /** Y坐标最小值  */
+    private var minY = 0f
+    /** Y坐标最大值  */
+    private var maxY = 0f
+
+    /**
+     * 构造
+     */
+    init {
+        try {
+            if (data.outLine != null && data.outLine!!.size > 0 && data.outLine!![0].size > 0) {
+                minX = data.outLine!![0][0].x
+                maxX = data.outLine!![0][0].x
+                minY = data.outLine!![0][0].y
+                maxY = data.outLine!![0][0].y
+
+                for (line in data.outLine!!) {
+                    if (line.size < 1) {
+                        continue
+                    }
+
+                    val path = Path()
+                    path.moveTo(line[0].x, -line[0].y)
+                    for (p in line) {
+                        if (p.x < minX) {
+                            minX = p.x
+                        }
+                        if (p.x > maxX) {
+                            maxX = p.x
+                        }
+                        if (-p.y < minY) {
+                            minY = -p.y
+                        }
+                        if (-p.y > maxY) {
+                            maxY = -p.y
+                        }
+                        path.lineTo(p.x, -p.y)
+                    }
+                    path.close()
+                    pathList.add(path)
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    } // Constructor
+
+    /**
+     * Item对象边界区域
+     *
+     * @return  边界区域
+     */
+    override fun boundingRect(): RectF {
+        return RectF(minX, minY, maxX, maxY)
+    } // Function boundingRect()
+
+    /**
+     * Item绘制操作
+     *
+     * @param   canvas          画布
+     * @param   rect            绘制区域
+     */
+    override fun onDraw(canvas : Canvas) {
+        paint.style = Paint.Style.FILL
+        paint.color = Opt.windowColor
+        for (path in pathList) {
+            canvas.drawPath(path, paint);
+        }
+    } // Function onDraw()
+} // Class WindowItem

+ 133 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/test/GraphyFmItem.kt

@@ -0,0 +1,133 @@
+/*
+ * ********************************************************************************************************************
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2018.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reservad.
+ * ********************************************************************************************************************
+ */
+
+package cn.sagacloud.android.cadengine.test
+
+import android.content.Context
+import android.graphics.*
+import android.util.Log
+
+
+import com.sybotan.android.graphy.SGraphyItem
+import com.sybotan.android.graphy.SMotionEvent
+import com.sybotan.android.graphy.enums.SGraphyItemFlag
+import java.util.*
+import kotlin.math.log
+
+
+/**
+ * 设备
+ * @author  Andy
+ */
+class GraphyFmItem(parent: SGraphyItem? = null) : SGraphyItem(parent) {
+
+    // 画笔
+    private var pen = Paint()
+    var flag:Boolean = false
+    var isClick:Boolean = false
+    /** 当前设备 */
+    var isCurrent:Boolean=false
+    private lateinit var bitmapdianbiao:Bitmap
+    private lateinit var bitmapequipment:Bitmap
+    private lateinit var decodeResource:Bitmap
+    private var bitheight = 0
+    private var bitwidth = 0
+
+    /** png图数据 */
+    private var pngWidth = 16
+    private var pngHeight = 16
+    /** png定位点的坐标 */
+    private val pngLocatX = 8
+    private val pngLocatY = 14
+
+    /** 原始宽 */
+    private var originalWidth = 0
+    /** 原始高 */
+    private var originalHeight = 0
+    private var rate = 1f
+    var color = Color.BLACK
+
+    /**
+     * 默认构造函数
+     */
+    init {
+
+//        hide()
+        isClick=true
+        isCurrent=false
+        pen.color = color
+        pen.strokeWidth = 5f
+        pen.isAntiAlias=false
+
+        /** item获取焦点ItemIsFocusable,移动ItemIsMovable */
+        flags= EnumSet.of(SGraphyItemFlag.ItemIsFocusable)
+
+
+
+    } // init
+
+    /**
+     * Item对象边界区域
+     */
+    override fun boundingRect(): RectF {
+        return RectF(0f,0f,600f,300f)
+    } // Function boundingRect()
+
+    /**
+     * @param   canvas      画布对象
+     */
+    override fun onDraw(canvas: Canvas) {
+        try {
+            canvas.drawRect(0f,0f,600f,300f,pen)
+            invalidate()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return
+    } // Function paint()
+
+    /**
+     *  点击
+     */
+    override fun onSingleTapUp(e: SMotionEvent): Boolean {
+       Log.e("被点击1","**************************************")
+        return true
+    }
+
+    /**
+     *
+     * @param bm        传入的bitmap
+     * @param newWidth  指定的图片宽
+     * @param newHeight 指定的图片高
+     * @return  newbm   返回 bitmap类型
+     */
+    private fun setImgSize(bm: Bitmap?, newWidth: Int, newHeight: Int): Bitmap {
+        // 获得图片的宽高.
+        val width = bm!!.width
+        val height = bm.height
+        // 计算缩放比例.
+        val scaleWidth = newWidth.toFloat() / width
+        val scaleHeight = newHeight.toFloat() / height
+        // 取得想要缩放的matrix参数.
+        val matrix = Matrix()
+        matrix.postScale(scaleWidth, scaleHeight)
+//        bm.config = Bitmap.Config.RGB_565
+        // 得到新的图片.
+        return Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true)
+    }
+} // Class GraphyWallItem

+ 142 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/test/GraphyTwoItem.kt

@@ -0,0 +1,142 @@
+/*
+ * ********************************************************************************************************************
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2018.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reservad.
+ * ********************************************************************************************************************
+ */
+
+package cn.sagacloud.android.cadengine.test
+
+import android.graphics.*
+import android.util.Log
+
+
+import com.sybotan.android.graphy.SGraphyItem
+import com.sybotan.android.graphy.SMotionEvent
+import com.sybotan.android.graphy.enums.SGraphyItemFlag
+import java.util.*
+
+
+/**
+ * 设备
+ * @author  Andy
+ */
+class GraphyTwoItem(parent: SGraphyItem? = null) : SGraphyItem(parent) {
+
+    // 画笔
+    private var pen = Paint()
+    var flag:Boolean = false
+    var isClick:Boolean = false
+    /** 当前设备 */
+    var isCurrent:Boolean=false
+    private lateinit var bitmapdianbiao:Bitmap
+    private lateinit var bitmapequipment:Bitmap
+    private lateinit var decodeResource:Bitmap
+    private var bitheight = 0
+    private var bitwidth = 0
+
+    /** png图数据 */
+    private var pngWidth = 16
+    private var pngHeight = 16
+    /** png定位点的坐标 */
+    private val pngLocatX = 8
+    private val pngLocatY = 14
+
+    /** 原始宽 */
+    private var originalWidth = 0
+    /** 原始高 */
+    private var originalHeight = 0
+    private var rate = 1f
+    var color = Color.RED
+    /**
+     * 默认构造函数
+     */
+    init {
+
+//        hide()
+        isClick=true
+        isCurrent=false
+        pen.color = color
+        pen.strokeWidth = 5f
+        pen.isAntiAlias=false
+
+        /** item获取焦点ItemIsFocusable,移动ItemIsMovable */
+        flags= EnumSet.of(SGraphyItemFlag.ItemIsFocusable)
+//        this.parent = parent
+
+
+    } // init
+
+    /**
+     * Item对象边界区域
+     */
+    override fun boundingRect(): RectF {
+        return RectF(0f,0f,600f,300f)
+    } // Function boundingRect()
+
+    /**
+     * @param   canvas      画布对象
+     */
+    override fun onDraw(canvas: Canvas) {
+        try {
+            canvas.drawRect(0f,0f,600f,300f,pen)
+            invalidate()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return
+    } // Function paint()
+
+    /**
+     *  点击
+     */
+    override fun onSingleTapUp(e: SMotionEvent): Boolean {
+        Log.e("被点击2","**************************************")
+        Log.e("X",e.x.toString())
+        Log.e("y",e.y.toString())
+        return true
+    }
+
+    override fun onScroll(e1: SMotionEvent, e2: SMotionEvent, distanceX: Float, distanceY: Float): Boolean {
+        flag=false
+        Log.e("item","滑动")
+        return super.onScroll(e1, e2, distanceX, distanceY)
+    }
+
+
+
+
+
+    /**
+     *
+     * @param bm        传入的bitmap
+     * @param newWidth  指定的图片宽
+     * @param newHeight 指定的图片高
+     * @return  newbm   返回 bitmap类型
+     */
+    private fun setImgSize(bm: Bitmap?, newWidth: Int, newHeight: Int): Bitmap {
+        // 获得图片的宽高.
+        val width = bm!!.width
+        val height = bm.height
+        // 计算缩放比例.
+        val scaleWidth = newWidth.toFloat() / width
+        val scaleHeight = newHeight.toFloat() / height
+        // 取得想要缩放的matrix参数.
+        val matrix = Matrix()
+        matrix.postScale(scaleWidth, scaleHeight)
+//        bm.config = Bitmap.Config.RGB_565
+        // 得到新的图片.
+        return Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true)
+    }
+} // Class GraphyWallItem

+ 23 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Column.kt

@@ -0,0 +1,23 @@
+package cn.sagacloud.android.cadengine.types
+
+import android.graphics.PointF
+
+/**
+ * 柱子 Item 类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class Column {
+    /** 名称  */
+    var name: String? = null
+    /** 轮廓线  */
+    var outLine: ArrayList<ArrayList<PointF>>? = null
+    /** 房间边界  */
+    var roomBoundary: Boolean? = null
+    /** 位置  */
+    var location: Place? = null
+    /** 模型id(外键)    */
+    var modelId: String? = null
+    /** 对应Revit模型id */
+    var sourceId: String? = null
+} // Class Column

+ 34 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Door.kt

@@ -0,0 +1,34 @@
+package cn.sagacloud.android.cadengine.types
+
+import android.graphics.PointF
+
+/**
+ * 门 Item 类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class Door {
+    /** 面朝方向  */
+    var faceDirection: PointF? = null
+    /** 把手方向  */
+    var handDirection: PointF? = null
+    /** 位置  */
+    var location: Place? = null
+    /** 模型id(外键)    */
+    var modelId: String? = null
+    /** 名称  */
+    var name: String? = null
+    /** 轮廓线  */
+    var outLine: ArrayList<ArrayList<PointF>>? = null
+    /** 拥有者的RevitId */
+    var owner: String? = null
+    /** 对应Revit模型id */
+    var sourceId: String? = null
+    /** 厚度  */
+    var thick: Double? = null
+    /** 所属墙 */
+    var wallId: String? = null
+    /** 宽度  */
+    var width: String? = null
+
+} // Class Door

+ 21 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Elements.kt

@@ -0,0 +1,21 @@
+package cn.sagacloud.android.cadengine.types
+
+class Elements {
+    /** 柱子 */
+    var columns: ArrayList<Column>? = null
+
+    /** 门 */
+    var doors: ArrayList<Door>? = null
+
+    /** 空间 */
+    var spaces: ArrayList<Space>? = null
+
+    /** 虚拟墙 */
+    var virtualWalls: ArrayList<VirtualWall>? = null
+
+    /** 墙 */
+    var walls: ArrayList<Wall>? = null
+
+    /** 窗户 */
+    var windows: ArrayList<Window>? = null
+} // Class Elements

+ 11 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Entity.kt

@@ -0,0 +1,11 @@
+package cn.sagacloud.android.cadengine.types
+
+/**
+ * 实体对象
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class Entity {
+    /** 元素 */
+    var elements: Elements? = null
+} // Class Entity

+ 13 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/FloorData.kt

@@ -0,0 +1,13 @@
+package cn.sagacloud.android.cadengine.types
+
+/**
+ * json数据类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class FloorData {
+    val result = ""
+    var message = ""
+    /** 实体列表 */
+    var entityList = ArrayList<Entity>()
+} // Class FloorData

+ 17 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Marker.kt

@@ -0,0 +1,17 @@
+package cn.sagacloud.android.cadengine.types
+
+/**
+ * 标记 item 类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class Marker {
+    /** 标记的id  */
+    var id: String? = null
+    /** 标记的名称  */
+    var name: String? = null
+    /** X坐标 */
+    var x: Double? = null
+    /** Y坐标 */
+    var y: Double? = null
+} // Class Marker

+ 15 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Place.kt

@@ -0,0 +1,15 @@
+package cn.sagacloud.android.cadengine.types
+
+import android.graphics.PointF
+
+/**
+ * 定位类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class Place {
+    /** 定位点 */
+    var points: ArrayList<PointF>? = null
+    /** 类型 */
+    var type: String? = null
+} // Class Place

+ 25 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Space.kt

@@ -0,0 +1,25 @@
+package cn.sagacloud.android.cadengine.types
+
+import android.graphics.PointF
+
+/**
+ * 空间 item 类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class Space {
+    /** 轮廓线段    */
+    var boundarySegments: ArrayList<String>? = null
+    /** 位置  */
+    var location: Place? = null
+    /** 模型id(外键)    */
+    var modelId: String? = null
+    /** 名称  */
+    var name: String? = null
+    /** 轮廓线  */
+    var outLine: ArrayList<ArrayList<PointF>>? = null
+    /** 对应Revit模型id */
+    var sourceId: String? = null
+    /** 补充信息    */
+    var tag: String? = null
+} // Class Space

+ 21 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/VirtualWall.kt

@@ -0,0 +1,21 @@
+package cn.sagacloud.android.cadengine.types
+
+import android.graphics.PointF
+
+/**
+ * 虚拟墙 item 类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class VirtualWall {
+    /** 位置  */
+    var location: Place? = null
+    /** 模型id(外键)    */
+    var modelId: String? = null
+    /** 名称  */
+    var name: String? = null
+    /** 轮廓线  */
+    var outLine: ArrayList<ArrayList<PointF>>? = null
+    /** 对应Revit模型id */
+    var sourceId: String? = null
+} // Class VirtualWall

+ 25 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Wall.kt

@@ -0,0 +1,25 @@
+package cn.sagacloud.android.cadengine.types
+
+import android.graphics.PointF
+
+/**
+ * 墙 item 类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class Wall {
+    /** 层id */
+    var levelId: String? = null
+    /** 位置  */
+    var location: Place? = null
+    /** 模型id(外键)    */
+    var modelId: String? = null
+    /** 名称  */
+    var name: String? = null
+    /** 轮廓线  */
+    var outLine: ArrayList<ArrayList<PointF>>? = null
+    /** 对应Revit模型id */
+    var sourceId: String? = null
+    /** 厚度  */
+    var width: String? = null
+} // Calss Wall

+ 29 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Window.kt

@@ -0,0 +1,29 @@
+package cn.sagacloud.android.cadengine.types
+
+import android.graphics.PointF
+
+/**
+ * 窗户 Item 类
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class Window {
+    /** 位置  */
+    var location: PointF? = null
+    /** 模型id(外键)    */
+    var modelId: String? = null
+    /** 名称  */
+    var name: String? = null
+    /** 轮廓线  */
+    var outLine: ArrayList<ArrayList<PointF>>? = null
+    /** 拥有者的RevitId */
+    var owner: String? = null
+    /** 对应Revit模型id */
+    var sourceId: String? = null
+    /** 厚度  */
+    var thick: Double? = null
+    /** 所属墙 */
+    var wallId: String? = null
+    /** 宽度  */
+    var width: String ? = null
+} // Class Casement

+ 3 - 0
cadengine/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">cadengine</string>
+</resources>

+ 17 - 0
cadengine/src/test/java/cn/sagacloud/android/cadengine/ExampleUnitTest.java

@@ -0,0 +1,17 @@
+package cn.sagacloud.android.cadengine;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+    @Test
+    public void addition_isCorrect() {
+        assertEquals(4, 2 + 2);
+    }
+}

+ 145 - 0
demo/build.gradle

@@ -0,0 +1,145 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+    compileSdkVersion ANDROID_SDK_VERSION.toInteger()
+    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
+
+    defaultConfig {
+        minSdkVersion ANDROID_MIN_SDK_VERSION.toInteger()
+        targetSdkVersion ANDROID_SDK_VERSION.toInteger()
+        versionCode SAGA_CODE.toInteger()
+        versionName SAGA_ANDROID_VERSION
+
+        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
+        vectorDrawables.useSupportLibrary = true
+    }
+
+    buildTypes {
+        release {
+            // minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    // 解决lint语法检查错误(kotlin语法无法通过lint)
+    lintOptions {
+        abortOnError false
+    }
+
+    kotlinOptions {
+        jvmTarget = JVM_TARGET
+    }
+
+    compileOptions {
+        targetCompatibility JavaVersion.VERSION_1_8
+        sourceCompatibility JavaVersion.VERSION_1_8
+    }
+}
+
+dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
+    testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: JUNIT_VERSION
+    androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.2', {
+        exclude group: 'com.android.support', module: 'support-annotations'
+    })
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // kotlin 依赖
+    implementation group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk8', version: KOTLIN_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // android支持
+    implementation group: 'com.android.support', name: 'appcompat-v7', version: ANDROID_SUPPORT_VERSION
+    implementation group: 'com.android.support', name: 'design', version: ANDROID_SUPPORT_VERSION
+    implementation group: 'com.android.support', name: 'support-v4', version: ANDROID_SUPPORT_VERSION
+    implementation group: 'com.android.support.constraint', name: 'constraint-layout', version: CONSTRAINT_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // anko依赖
+    // https://mvnrepository.com/artifact/org.jetbrains.anko/anko-commons
+    implementation group: 'org.jetbrains.anko', name: 'anko-commons', version: ANKO_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // 图片加载框架
+    // https://mvnrepository.com/artifact/com.squareup.picasso/picasso
+    implementation group: 'com.squareup.picasso', name: 'picasso', version: PICASSO_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // anko依赖
+    // https://mvnrepository.com/artifact/org.jetbrains.anko/anko-common
+    implementation group: 'org.jetbrains.anko', name: 'anko-common', version: ANKO_VERSION
+    // https://mvnrepository.com/artifact/org.jetbrains.anko/anko-sdk25
+    implementation group: 'org.jetbrains.anko', name: 'anko-sdk25', version: ANKO_VERSION
+    // https://mvnrepository.com/artifact/org.jetbrains.anko/anko-appcompat-v7
+    implementation group: 'org.jetbrains.anko', name: 'anko-appcompat-v7', version: ANKO_VERSION
+    // https://mvnrepository.com/artifact/org.jetbrains.anko/anko-design
+    implementation group: 'org.jetbrains.anko', name: 'anko-design', version: ANKO_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // 运行时权限申请
+    // https://mvnrepository.com/artifact/pub.devrel/easypermissions
+    implementation group: 'pub.devrel', name: 'easypermissions', version: EASYPERMISSIONS_VERSION
+
+//    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//    // 谷歌JSON解析
+//    // https://mvnrepository.com/artifact/com.google.code.gson/gson
+//    implementation group: 'com.google.code.gson', name: 'gson', version: GSON_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // JSON解析
+    // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
+    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: JACKSON_VERSION
+
+    // https://mvnrepository.com/artifact/org.greenrobot/eventbus
+    implementation group: 'org.greenrobot', name: 'eventbus', version: EVENTBUS_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // https://mvnrepository.com/artifact/javax.persistence/persistence-api
+    implementation group: "javax.persistence", name: "persistence-api", version: PERSISTENCE_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // 二维码与条形码
+    // https://mvnrepository.com/artifact/com.google.zxing/core
+    implementation group: 'com.google.zxing', name: 'core', version: ZXING_VERSION
+    // https://mvnrepository.com/artifact/com.google.zxing/android-core
+    implementation group: 'com.google.zxing', name: 'android-core', version: ZXING_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Sybotan依赖
+    implementation group: 'cn.sagacloud', name: 'saga-kotlin-base', version: SAGA_KOTLIN_VERSION
+    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
+    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
+    implementation project(':sybotan-android-base')
+    implementation project(':sybotan-android-database')
+    implementation project(':sybotan-android-devices')
+    implementation project(':sybotan-android-views')
+    implementation project(':sybotan-android-graphy')
+    implementation project(':sybotan-android-works')
+    implementation project(':cadengine')
+}

+ 21 - 0
demo/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 64 - 0
demo/src/main/AndroidManifest.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools" package="com.sybotan.android.demo">
+
+  <uses-permission android:name="android.permission.INTERNET"/>
+  <uses-permission android:name="android.permission.BLUETOOTH"/>
+  <!-- SD卡中创建与删除文件权限 -->
+  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions"/>
+  <!-- 向SDCard写入数据权限 -->
+  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+
+  <!-- 摄像头 -->
+  <uses-permission android:name="android.permission.CAMERA" />
+  <uses-feature android:name="android.hardware.camera" />
+  <uses-feature android:name="android.hardware.camera.autofocus" />
+
+  <application
+      android:name=".DemoApp"
+      android:allowBackup="true"
+      android:icon="@mipmap/ic_launcher"
+      android:label="@string/app_name"
+      android:roundIcon="@mipmap/ic_launcher_round"
+      android:supportsRtl="true"
+      android:networkSecurityConfig="@xml/network_security_config"
+      android:theme="@style/AppTheme">
+    <activity android:name=".activities.MainActivity">
+      <intent-filter>
+        <action android:name="android.intent.action.MAIN"/>
+
+        <category android:name="android.intent.category.LAUNCHER"/>
+      </intent-filter>
+    </activity>
+    <activity android:name=".activities.GraphyActivity">
+    </activity>
+    <activity android:name=".activities.WebViewActivity">
+
+    </activity>
+
+  </application>
+
+</manifest>

Разница между файлами не показана из-за своего большого размера
+ 6702 - 0
demo/src/main/assets/WallDatas.json


Разница между файлами не показана из-за своего большого размера
+ 12944 - 0
demo/src/main/assets/cxds5.json


+ 22 - 0
demo/src/main/assets/dist/abc.html

@@ -0,0 +1,22 @@
+<html>
+<body>
+<script lang="javascript">
+console.debug("begin=================================================")
+//LPrinter.getAll("printer");
+alert(LPrinter.getAllPrinters(""))
+alert(LPrinter.openPrinterSync(""))
+//LPrinter.startJob(40, 30, 0)
+//LPrinter.drawText("Hello world!", 4, 5, 40, 30, 4)
+// LPrinter.drawText("上格云技术!", 4, 15, 40, 30, 4)
+
+//LPrinter.drawImage("file:///android_asset/ic_launcher.png", 0.0, 5.0, 20.0, 20.0)
+LPrinter.drawImage("/sdcard/ic_launcher.png", 0.0, 5.0, 20.0, 20.0)
+LPrinter.commitJob()
+console.debug("end=================================================")
+</script>
+
+<h1>abcdefg</h1>
+<a href="services://qrcode?context=abceefg&size=400">services://qrcode?context=abceefg&size=400</a>
+<img src="services://qrcode?context=abceefg&size=200">
+</body>
+</html>

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/dist/index.html


Разница между файлами не показана из-за своего большого размера
+ 2 - 0
demo/src/main/assets/dist/static/css/app.aa519651e328a583ca88e8b7d02122ab.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/dist/static/css/app.aa519651e328a583ca88e8b7d02122ab.css.map


+ 2 - 0
demo/src/main/assets/dist/static/css/app.cca059254702f9ed953b7df749673cf4.css

@@ -0,0 +1,2 @@
+#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;margin-top:60px}h1[data-v-694cd902],h2[data-v-694cd902]{font-weight:400}ul[data-v-694cd902]{list-style-type:none;padding:0}li[data-v-694cd902]{display:inline-block;margin:0 10px}a[data-v-694cd902]{color:#42b983}
+/*# sourceMappingURL=app.cca059254702f9ed953b7df749673cf4.css.map */

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/dist/static/css/app.cca059254702f9ed953b7df749673cf4.css.map


Разница между файлами не показана из-за своего большого размера
+ 2 - 0
demo/src/main/assets/dist/static/js/app.4768fdc1107768177998.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/dist/static/js/app.4768fdc1107768177998.js.map


Разница между файлами не показана из-за своего большого размера
+ 2 - 0
demo/src/main/assets/dist/static/js/app.c59eccc233104d73ccb7.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/dist/static/js/app.c59eccc233104d73ccb7.js.map


Разница между файлами не показана из-за своего большого размера
+ 2 - 0
demo/src/main/assets/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js.map


Разница между файлами не показана из-за своего большого размера
+ 2 - 0
demo/src/main/assets/dist/static/js/manifest.3ad1d5771e9b13dbdad2.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map


Разница между файлами не показана из-за своего большого размера
+ 13 - 0
demo/src/main/assets/dist/static/js/vendor.7fed9fa7b7ba482410b7.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/dist/static/js/vendor.7fed9fa7b7ba482410b7.js.map


Разница между файлами не показана из-за своего большого размера
+ 13 - 0
demo/src/main/assets/dist/static/js/vendor.9d43f691bba00d2c76b8.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/dist/static/js/vendor.9d43f691bba00d2c76b8.js.map


BIN
demo/src/main/assets/ic_launcher.png


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/vue/index.html


Разница между файлами не показана из-за своего большого размера
+ 310 - 0
demo/src/main/assets/vue/static/css/app.365230fcdec5540c73c87126a6b39cdb.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/vue/static/css/app.365230fcdec5540c73c87126a6b39cdb.css.map


BIN
demo/src/main/assets/vue/static/fonts/iconfont.83485c9.ttf


BIN
demo/src/main/assets/vue/static/fonts/iconfont.df5f83a.eot


Разница между файлами не показана из-за своего большого размера
+ 1259 - 0
demo/src/main/assets/vue/static/img/iconfont.15eea4c.svg


Разница между файлами не показана из-за своего большого размера
+ 2 - 0
demo/src/main/assets/vue/static/js/app.bcfe948aec3e9d1194c5.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/vue/static/js/app.bcfe948aec3e9d1194c5.js.map


Разница между файлами не показана из-за своего большого размера
+ 2 - 0
demo/src/main/assets/vue/static/js/manifest.2ae2e69a05c33dfc65f8.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/vue/static/js/manifest.2ae2e69a05c33dfc65f8.js.map


Разница между файлами не показана из-за своего большого размера
+ 13 - 0
demo/src/main/assets/vue/static/js/vendor.94ad8e265ab2d614e07f.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
demo/src/main/assets/vue/static/js/vendor.94ad8e265ab2d614e07f.js.map


+ 56 - 0
demo/src/main/java/com/sybotan/android/demo/DemoApp.kt

@@ -0,0 +1,56 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.demo
+
+import android.annotation.SuppressLint
+import android.app.Application
+import android.content.Context
+import android.util.Log
+
+class DemoApp : Application() {
+
+
+    companion object {
+        private val TAG = DemoApp::class.java.name
+        var mContext: Context? = null
+
+        fun getContext(): DemoApp? {
+            return mContext as DemoApp
+        }
+    }
+
+    /**
+     * 创建应用时调用
+     */
+    @SuppressLint("MissingSuperCall")
+    override fun onCreate() {
+        super.onCreate()
+        Log.d(TAG, "DemoApp starting...")
+        mContext = applicationContext
+        return
+    } // Function onCreate()
+
+
+
+} // Class DemoApp

+ 148 - 0
demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt

@@ -0,0 +1,148 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.demo.activities
+
+import android.graphics.BitmapFactory
+import android.graphics.PointF
+import android.support.v7.app.AppCompatActivity
+import android.os.Bundle
+import android.util.Log
+import android.util.SizeF
+import cn.sagacloud.android.cadengine.FloorScene
+import cn.sagacloud.cadengine.HttpDownloadMap
+import com.fasterxml.jackson.databind.PropertyNamingStrategy
+import com.sybotan.android.demo.R
+import com.sybotan.android.demo.R.id.graphyView
+import com.sybotan.android.demo.entitiies.Revit
+import com.sybotan.android.demo.graphy.GraphyWallItem
+import com.sybotan.android.graphy.SGraphyScene
+import com.sybotan.android.graphy.events.SGraphyViewMoveEvent
+import com.sybotan.android.graphy.items.SGraphyClockItem
+import com.sybotan.base.utils.SJsonUtil
+import kotlinx.android.synthetic.main.activity_graphy.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.jetbrains.anko.doAsync
+import org.jetbrains.anko.uiThread
+
+class GraphyActivity : AppCompatActivity() {
+    companion object {
+        private val TAG = GraphyActivity::class.java.name
+    }
+
+    val scene = FloorScene()
+    val path = "base/cbde057b91e711eb9901557a780001bf.jsonz"
+
+    @Subscribe
+    fun test(msg: SGraphyViewMoveEvent) {
+        Log.d(TAG, "msg=$msg")
+
+    } // test()
+
+    /**
+     * 创建Activity时的回调函数
+     *
+     * @param   savedInstanceState
+     */
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_graphy)
+        // 注册eventbus
+        EventBus.getDefault().register(this)
+
+        graphyView.scene = scene
+        /** 开启异步 */
+        doAsync {
+//            scene.loadUrl("http://adm.sagacloud.cn/image-service/common/file_get?systemId=revit&key=base/61a99fc1a66b11eb8f633d7605ae9def.jsonz")
+//            scene.loadUrl("http://api.sagacloud.cn/dp-auxiliary/image-service/common/file_get?systemId=revit&key=Fl42010500018b580334dcf111e8a553db1eadfac99320190803114958bim.jsonz",false)
+            val downloadGZIPMap =
+                HttpDownloadMap.downloadGZIPMap(path)
+            if (downloadGZIPMap != null) {
+                scene.loadData(downloadGZIPMap!!)
+            }
+//            val graphyFmItem = GraphyFmItem()
+//            graphyFmItem.show()
+//            graphyFmItem.isVisible = true
+//            graphyFmItem.moveTo(300f,300f)
+////            graphyFmItem.rotate = 60f // (20f*Math.PI / 180f) as Float
+////            graphyFmItem.isTransform = false
+//            scene.addItem(graphyFmItem)
+//            val graphyTwoItem = GraphyTwoItem()
+//            graphyTwoItem.parent = graphyFmItem
+//            //graphyTwoItem.scale = PointF(2.0f,2.0f)
+////            graphyTwoItem.rotate = 60f
+//            Log.e("children" ,graphyFmItem.children.size.toString())
+////            graphyTwoItem.show()
+////            graphyTwoItem.flag = true
+////            graphyTwoItem.parent = graphyFmItem
+//            graphyTwoItem.moveTo(100f,100f)
+//            graphyTwoItem.color = Color.RED
+
+
+//            scene.addItem(graphyTwoItem)
+            /** 主线程处理ui */
+            uiThread {
+
+
+                /** 适应屏幕大小 */
+                graphyView.fitSceneToView()
+                /** 限定移动范围不超出屏幕 */
+//                graphyView.moveRange()
+                graphyView.post {
+                    Log.e("viewW", graphyView.width.toString())
+                }
+
+                Log.e("viewH", graphyView.measuredHeight.toString())
+            }
+        }
+
+        return
+    } // Function onCreate()
+
+    /**
+     * 加载墙数据
+     */
+    private fun loadWalls() {
+//        val revit = SJsonUtil.fromJson<Revit>(applicationContext.assets.open("WallDatas.json"), PropertyNamingStrategy.UPPER_CAMEL_CASE)
+//        Log.d(TAG, "name=${revit.name}")
+//        Log.d(TAG, "${revit.floorDatas!![revit.floorDatas!!.size - 1].lines!!}")
+//
+//        Log.d(TAG, "line.size=${revit.floorDatas!![revit.floorDatas!!.size - 1].lines!!.size}")
+//        //for ( line in revit.floorDatas!![revit.floorDatas!!.size - 1].lines!!) {
+//        for ( line in revit.floorDatas!![0].lines!!) {
+//            val pointList = ArrayList<PointF>()
+//            Log.d(TAG, "point.size=${line.size}")
+//            for (t in 0 until  line.size) {
+//                val p1 = line[t].split(",")
+//                val point = PointF(p1[0].toFloat() * 20  + 12000, -p1[1].toFloat() * 20  -20600)
+//                pointList.add(point)
+//            }
+//            scene.addItem(GraphyWallItem(pointList))
+//        }
+//        println()
+
+        return
+    } // Function loadWalls()
+
+} // Class GraphyActivity

+ 70 - 0
demo/src/main/java/com/sybotan/android/demo/activities/MainActivity.kt

@@ -0,0 +1,70 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.demo.activities
+
+import android.Manifest
+import android.content.Intent
+import android.os.Bundle
+import com.sybotan.android.base.activities.SBaseActivity
+import com.sybotan.android.base.extensions.immersive
+import com.sybotan.android.demo.R
+import com.sybotan.android.works.activities.SAboutActivity
+import com.sybotan.android.works.activities.SQrCodeActivity
+import kotlinx.android.synthetic.main.activity_main.*
+import org.jetbrains.anko.startActivity
+
+class MainActivity : SBaseActivity() {
+
+    companion object {
+        private val TAG = MainActivity::class.java.name
+        private const val permissionRequestCode = 123
+    }
+
+    /**
+     * 创建Activity时的回调函数
+     *
+     * @param   savedInstanceState
+     */
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_main)
+
+        /** 沉浸式APP设置 */
+        //immersive()
+
+        /** 申请权限 */
+        requestPermission(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE,
+                Manifest.permission.CAMERA,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                Manifest.permission.INTERNET))
+
+        qrcode.setOnClickListener {
+//            startActivity<SQrCodeActivity>()
+//            startActivity<SAboutActivity>()
+            startActivity<GraphyActivity>()
+        }
+        return
+    } // Function onCreate()
+
+} // Class MainActivity

+ 78 - 0
demo/src/main/java/com/sybotan/android/demo/activities/WebViewActivity.kt

@@ -0,0 +1,78 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.demo.activities
+
+import android.support.v7.app.AppCompatActivity
+import android.os.Bundle
+import com.sybotan.android.demo.R
+import com.sybotan.android.devices.printer.SLPrinter
+//import com.sybotan.android.devices.printer.SLPrinter
+import kotlinx.android.synthetic.main.activity_web_view.*
+
+/**
+ * WebView扩展测试Activity
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class WebViewActivity : AppCompatActivity() {
+
+    /**
+     * 创建Activity时的回调函数
+     *
+     * @param   savedInstanceState
+     */
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_web_view)
+
+        //uiWebView.loadUrl("http://www.baidu.com")
+        uiWebView.loadUrl("http://172.16.0.241/#/")
+        //uiWebView.loadUrl("assets:///dist/index.html#/")
+
+        //uiWebView.addJavascriptInterface(SLPrinter(), "LPrinter")
+        //uiWebView.loadUrl("http://android/index.html")
+
+        //uiWebView.loadUrl("services://qrcode?context=${Uri.encode("http://www.baidu.com/abc?dd=123&abc=123")}&size=400")
+
+//        alert("Testing alerts") {
+//            positiveButton(R.string.btn_ok) { toast("Yess!!!") }
+//            negativeButton(R.string.btn_cancel) { }
+//            // 屏蔽返回按键
+//            onKeyPressed { _, _, _ ->
+//                true
+//            }
+//            customView {
+//                verticalLayout {
+//                    editText("I'm a text") {
+//                        hint = "Name"
+//                    }
+//                    padding = dip(20)
+//                }
+//            }
+//        }.show()
+
+        return
+    } // Function onCreate()
+
+} // Class WebViewActivity

+ 29 - 0
demo/src/main/java/com/sybotan/android/demo/entitiies/FloorDatas.kt

@@ -0,0 +1,29 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.demo.entitiies
+
+class FloorDatas {
+    var lines : List<List<String>>? = null
+    //var endPoints: List<SgElement>? = null
+} // Class FloorDatas

+ 30 - 0
demo/src/main/java/com/sybotan/android/demo/entitiies/Revit.kt

@@ -0,0 +1,30 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.demo.entitiies
+
+class Revit {
+    var name = ""
+    var id: String? = null
+    var floorDatas: List<FloorDatas>? = null
+} // Class Revit

+ 26 - 0
demo/src/main/java/com/sybotan/android/demo/entitiies/SgElement.kt

@@ -0,0 +1,26 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.demo.entitiies
+
+class SgElement

+ 110 - 0
demo/src/main/java/com/sybotan/android/demo/graphy/GraphyWallItem.kt

@@ -0,0 +1,110 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               iFHS7.
+ *              ;BBMBMBMc                  rZMBMBR              BMB
+ *              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+ *     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+ *     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+ *      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+ *     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+ *     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+ *     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+ *         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+ *     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+ *      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+ *         i0BM: SWKHKGO  MBDv
+ *           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+ *              ,  XMW  ..
+ *                  r                                                                     All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.demo.graphy
+
+import android.graphics.*
+import android.util.Log
+import com.sybotan.android.graphy.SGraphyItem
+
+/**
+ * 墙图元
+ *
+ * @author  庞利祥(sybotan@126.com)
+ */
+class GraphyWallItem(pointList: List<PointF>, parent: SGraphyItem? = null) : SGraphyItem(parent) {
+    companion object {
+        private val TAG = GraphyWallItem::class.java.name
+    } // companion object
+
+    // 画笔
+    private var pen = Paint()
+    private var pointList: List<PointF> = ArrayList(0)
+        set(value) {
+            field = value
+            if (field.size < 2) {
+                bRect = RectF()
+                return
+            }
+            bRect = RectF(field[0].x, field[0].y, field[0].x, field[0].y)
+            for (i in 1 until field.size) {
+                val p = field[i]
+                if (bRect.left > p.x) {
+                    bRect.left = p.x
+                }
+                if (bRect.right < p.x) {
+                    bRect.right = p.x
+                }
+                if (bRect.top > p.y) {
+                    bRect.top = p.y
+                }
+                if (bRect.bottom < p.y) {
+                    bRect.bottom = p.y
+                }
+            }
+            Log.d(TAG, "bRect=$bRect")
+        }
+
+    private var bRect = RectF()
+
+    /**
+     * 默认构造函数
+     */
+    init {
+        pen.color = Color.RED
+        pen.strokeWidth = 5f
+
+
+        this.pointList = pointList
+    } // init
+
+
+    /**
+     * Item对象边界区域
+     */
+    override fun boundingRect(): RectF {
+        return RectF(bRect.left - 5, bRect.top - 5,
+                bRect.right + 5, bRect.bottom + 5)
+    } // Function boundingRect()
+
+    /**
+     * @param   canvas      画布对象
+     * @param   rect        更新区域
+     */
+    override fun onDraw(canvas: Canvas) {
+        if (pointList.size < 2) {       // 如果少于2个点,则退出
+            return
+        }
+
+        for (i in 1 until pointList.size) {
+            val p1 = pointList[i - 1]
+            val p2 = pointList[i]
+            canvas.drawLine(p1.x, p1.y, p2.x, p2.y, pen)
+        }
+
+        val p1 = Path()
+        val p2 = Path()
+        
+        return
+    } // Function paint()
+} // Class GraphyWallItem

+ 162 - 0
demo/src/main/java/com/sybotan/android/demo/tools/GzipUtil.java

@@ -0,0 +1,162 @@
+/*
+ * ********************************************************************************************************************
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2018.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reservad.
+ * ********************************************************************************************************************
+ */
+
+package com.sybotan.android.demo.tools;
+
+import android.util.Base64;
+import android.util.Log;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+/**
+ * Created by mengxy on 2018/11/19.
+ * 创建日期:2018/11/19on ${time}
+ * 描述:
+ * 作者:zwx
+ */
+
+@SuppressWarnings({"SameParameterValue", "unused"})
+public class GzipUtil {
+
+    private static final String GZIP_ENCODE_UTF_8 = "UTF-8";
+    public static final String GZIP_ENCODE_ISO_8859_1 = "ISO-8859-1";
+
+    /**
+     * 字符串的解压
+     *
+     * @param str 对字符串解压
+     * @return 返回解压缩后的字符串
+     */
+    public static byte[] unCompress(String str) throws IOException {
+        if (null == str || str.length() <= 0) {
+            return null;
+        }
+// 创建一个新的 byte 数组输出流
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+// 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组
+        ByteArrayInputStream in = new ByteArrayInputStream(str
+                .getBytes("UTF-8"));
+// 使用默认缓冲区大小创建新的输入流
+        GZIPInputStream gzip = new GZIPInputStream(in);
+        byte[] buffer = new byte[256];
+        int n;
+        while ((n = gzip.read(buffer)) >= 0) {// 将未压缩数据读入字节数组
+// 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte数组输出流
+            out.write(buffer, 0, n);
+        }
+// 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串
+        return buffer;
+    }
+
+    /**
+     * 字符串压缩为GZIP字节数组
+     */
+    public static byte[] compress(String str, String encoding) {
+        if (str == null || str.length() == 0) {
+            return null;
+        }
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        GZIPOutputStream gzip;
+        try {
+            gzip = new GZIPOutputStream(out);
+            gzip.write(str.getBytes(encoding));
+            gzip.close();
+        } catch (IOException e) {
+            Log.e("gzip compress error.", e.getMessage());
+        }
+        return out.toByteArray();
+    }
+
+    /**
+     * Gzip  byte[] 解压成字符串
+     */
+    public static String uncompressToString(byte[] bytes) {
+        if (bytes.length< 25) {
+            return  "";
+        }
+        return uncompressToString(bytes, GZIP_ENCODE_UTF_8);
+    }
+
+
+    /**
+     * Gzip  byte[] 解压成字符串
+     */
+    private static String uncompressToString(byte[] bytes, String encoding) {
+        if (bytes == null || bytes.length == 0) {
+            return null;
+        }
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
+        try {
+            GZIPInputStream ungzip = new GZIPInputStream(in);
+            byte[] buffer = new byte[1024];
+            int n;
+            while ((n = ungzip.read(buffer)) >= 0) {
+                out.write(buffer, 0, n);
+            }
+            return out.toString(encoding);
+        } catch (IOException e) {
+            Log.e("gzip compress error.", e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * 判断byte[]是否是Gzip格式
+     */
+    public static boolean isGzip(byte[] data) {
+        int header =  ((data[0] << 8) | data[1] & 0xFF);
+        return header == 0x1f8b;
+    }
+
+    /** GZIP解压缩
+     * @param zipText GZIP压缩过的字符串
+     * @return 解压后的字符串
+     */
+    public static String decompress(String zipText) throws IOException {
+        byte[] compressed = Base64.decode(zipText,1024);
+        if (compressed.length > 4)
+        {
+            GZIPInputStream gzipInputStream = new GZIPInputStream(
+                    new ByteArrayInputStream(compressed, 4,
+                            compressed.length - 4));
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            for (int value = 0; value != -1;) {
+                value = gzipInputStream.read();
+                if (value != -1) {
+                    baos.write(value);
+                }
+            }
+            gzipInputStream.close();
+            baos.close();
+            return new String(baos.toByteArray(), "UTF-8");
+        }
+        else
+        {
+            return "";
+        }
+
+
+    }
+}
+

+ 66 - 0
demo/src/main/java/com/sybotan/android/demo/tools/HttpDownloadMap.kt

@@ -0,0 +1,66 @@
+/*
+ * ********************************************************************************************************************
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2018.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reservad.
+ * ********************************************************************************************************************
+ */
+
+package cn.sagacloud.cadengine
+
+import android.util.Log
+import cn.sagacloud.android.cadengine.types.FloorData
+import cn.sagacloud.cadengine.Opt.MAPCAD
+import com.sybotan.base.utils.SJsonUtil
+
+
+/**
+ * Created by mengxy on 2018/10/16.
+ * 创建日期:2018/10/16on ${time}
+ * 描述: 下载图形数据
+ * 作者:zwx
+ */
+object HttpDownloadMap {
+
+    fun downloadMap(key: String): FloorData? {
+        val dl= OkhttpUtil.getRequest("${MAPCAD}${key}&" +
+                "systemId=revit")
+        val url="${MAPCAD}${key}&" +
+                "systemId=revit"
+        Log.e("图形","图形下载url=${url}")
+//        LogUtils.e("图形下载的数据类型${dl}")
+        if (dl=="Image not existed"){
+            Log.e("图形","********************************************************************")
+            return null
+        }
+//        LogUtils.e("图形数据=${dl}")
+        return SJsonUtil.fromJson<FloorData>(dl)
+    }
+
+    fun downloadGZIPMap(key: String): FloorData? {
+        val dl = OkhttpUtil.getGzipMap("${MAPCAD}${key}&" +
+                "systemId=revit")
+        val url="${MAPCAD}${key}&" +
+                "systemId=revit"
+        Log.e("图形","图形下载url=${url}")
+        if (dl=="Image not existed"){
+            Log.e("图形","********************************************************************")
+            return null
+        }else if (dl.isNullOrEmpty()){
+            return null
+        }
+        return SJsonUtil.fromJson<FloorData>(dl)
+    }
+
+
+}

+ 188 - 0
demo/src/main/java/com/sybotan/android/demo/tools/OkhttpUtil.kt

@@ -0,0 +1,188 @@
+/*
+ * ********************************************************************************************************************
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2018.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reservad.
+ * ********************************************************************************************************************
+ */
+
+package cn.sagacloud.cadengine
+
+
+import com.google.gson.FieldNamingPolicy
+import com.sybotan.android.demo.DemoApp
+import com.sybotan.android.demo.tools.GzipUtil
+import com.sybotan.base.extensions.toJson
+import okhttp3.*
+import com.sybotan.base.utils.SJsonUtil
+import java.io.File
+import java.util.concurrent.TimeUnit
+
+
+/**
+ * Created by mengxy on 2018/10/16.
+ * 创建日期:2018/10/16on ${time}
+ * 描述:
+ * 作者:zwx
+ */
+object OkhttpUtil {
+
+    /** http客户端 */
+    private val httpClient: OkHttpClient by lazy {
+        val client = OkHttpClient().newBuilder()
+                .readTimeout(600, TimeUnit.SECONDS)
+                .writeTimeout(600 , TimeUnit.SECONDS)
+                .connectTimeout(600 , TimeUnit.SECONDS)
+//                .cache(cache)
+                .build()
+        client
+    }
+
+    /** 缓存 路径 */
+    private val cacheFile = File(DemoApp.getContext()!!.cacheDir, "cache")
+    /**  缓存时间*/
+    private val cache = Cache(cacheFile, (1024 * 1024 * 100).toLong()) //100Mb
+    private val JSON = MediaType.parse("application/json; charset=utf-8")
+
+    /**
+     * post请求 json
+     *
+     * 不能私有
+     */
+    fun postRequestJson(url: String, json: String): String {
+        val jsonBody = FormBody.create(JSON, json)
+        val request = Request.Builder()
+                .url(url)
+                .post(jsonBody)
+                .build()
+        val call = httpClient.newCall(request)
+        try {
+            val response = call.execute()
+            response.code()
+            if (response.isSuccessful) {
+//                LogUtils.e("请求成功code${response.code()},url=${url}")
+            } else {
+//                LogUtils.e("请求成功code${response.code()},url=${url}")
+            }
+            return response.body()!!.string()
+        } catch (e: Throwable) {
+            e.printStackTrace()
+            return ""
+        }
+        return ""
+    } // Function postRequest()
+
+
+
+
+
+    /**
+     * post 对象
+     */
+    inline fun <reified T> postObj(url: String, requestBody: Any, namingPolicy: FieldNamingPolicy? = null): T {
+        val responseJson = postRequestJson(url, requestBody.toJson())
+//        LogUtils.e("数据 :${ responseJson.toJson()}")
+        return SJsonUtil.fromJson<T>(responseJson)
+    } // Function postObj()
+
+    /**
+     * get 对象
+     */
+    inline fun <reified T> getObj(url: String, namingPolicy: FieldNamingPolicy? = null): T {
+        val responseJson = getRequest(url)
+        return SJsonUtil.fromJson(responseJson)
+    } // Function postObj()
+
+
+
+    /**
+     *  get 请求
+     */
+    fun getRequest(url: String): String {
+        val request = Request.Builder()
+                .url(url)
+                .get()
+                .build()
+        val call = httpClient.newCall(request)
+        try {
+            val response = call.execute()
+            if (response.isSuccessful) {
+//                LogUtils.e("请求成功code${response.code()},url=${url}")
+            } else {
+//                LogUtils.e("请求失败code${response.code()},url=${url}")
+            }
+            return response.body()!!.string()
+        } catch (e: Throwable) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    /**
+     *  get 请求
+     */
+    fun getRequest(url: String,projectId: String): String {
+        val request = Request.Builder()
+                .url(url)
+                .addHeader("ProjectId",projectId)
+                .get()
+                .build()
+        val call = httpClient.newCall(request)
+        try {
+            val response = call.execute()
+            if (response.isSuccessful) {
+//                LogUtils.e("请求成功code${response.code()},url=${url}")
+            } else {
+//                LogUtils.e("请求失败code${response.code()},url=${url}")
+            }
+            return response.body()!!.string()
+        } catch (e: Throwable) {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    //http://prod-data.oss-cn-beijing.aliyuncs.com/test%2Ffiles%2Frevit%2FFl110108000327d8f006c39f49feb40e24a7ef22323220181119025802bim.jsonz?OSSAccessKeyId=LTAIHLlfCwmMRbV4&Expires=1542614466&Signature=RqDeGJn2DvnoqQOoUdQAyihvf1A%3D
+
+
+    /**
+     * 下载图形文件Gzip
+     */
+    fun getGzipMap(url: String): String {
+        try {
+            var isGzip = false
+            val request = Request.Builder()
+                    .url(url)
+                    .get()
+                    .header("Accept-Encoding", "gzip")
+                    .build()
+            val call = httpClient.newCall(request)
+
+            val response = call.execute()
+            if (response.isSuccessful) {
+//                LogUtils.e("请求成功code${response.code()},url=${url}")
+            } else {
+//                LogUtils.e("请求失败code${response.code()},url=${url}")
+            }
+            return  GzipUtil.uncompressToString(response.body()!!.bytes())
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return ""
+        }
+        return ""
+
+    }
+
+
+
+}

+ 59 - 0
demo/src/main/java/com/sybotan/android/demo/tools/Opt.kt

@@ -0,0 +1,59 @@
+/*
+ * ********************************************************************************************************************
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2018.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reservad.
+ * ********************************************************************************************************************
+ */
+
+package cn.sagacloud.cadengine
+
+
+/**
+ * @author
+ */
+
+object Opt {
+
+
+
+
+
+
+
+
+    val SERVICE_PATH_IMG = "http://api.sagacloud.cn/dp-auxiliary/image-service/common/"
+//    val SERVICE_PATH_IMG = "http://api.sagacloud.cn/image-service/common/"
+    //http://adm.sagacloud.cn/image-service/common/image_upload?systemId=dataPlatform&secret=9e0891a7a8c8e885&overwrite=true&key=1586081610295.jpg
+    /** 上传图片服务器地址 */
+    val IMG_SERVICE_UPLOAD = SERVICE_PATH_IMG + "image_upload?systemId=dataPlatform&secret=9e0891a7a8c8e885&key="
+    /** 图片链接地址 */
+    val IMG_SERVICE_DOWNLOAD = SERVICE_PATH_IMG + "image_get?systemId=dataPlatform&key="
+    /** 文件上传地址 */
+    val VIDEO_SERVICE_UPLOAD = SERVICE_PATH_IMG + "file_upload?systemId=dataPlatform&secret=9e0891a7a8c8e885&key="
+    /** 文件下载地址 */
+    val VIDEO_SERVICE_DOWNLOAD = SERVICE_PATH_IMG + "file_get/@@key@@?systemId=dataPlatform"
+    /** revit文件下载地址 */
+    val FILE_DOWNLOAD = SERVICE_PATH_IMG + "common/file_get/@@key@@?systemId=revit"
+    /** 下载平面图  */
+    val MAPCAD = SERVICE_PATH_IMG + "file_get/?key="
+
+
+
+    /** 验证版地址 */
+    val SERVICE_DATACENTER_PATH = "http://47.93.22.124:8080/datacenter/"
+    val SERVICE_PATH = "http://47.93.22.124:8080/scanbuilding/"
+    val SERVICE_PATH_MODELAPI = "http://47.93.22.124:8080/revit-algorithm/"
+
+
+}

+ 34 - 0
demo/src/main/res/animator/sybotan_anim.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+                android:duration="5000"
+                android:interpolator="@android:anim/linear_interpolator"
+                android:propertyName="trimPathOffset"
+                android:repeatMode="restart"
+                android:repeatCount="infinite"
+                android:valueFrom="0"
+                android:valueTo="1"
+                android:valueType="floatType">
+</objectAnimator>

Разница между файлами не показана из-за своего большого размера
+ 57 - 0
demo/src/main/res/drawable-v24/ic_launcher_foreground.xml


BIN
demo/src/main/res/drawable/ic_launcher123.png


+ 97 - 0
demo/src/main/res/drawable/ic_launcher_background.xml

@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<vector
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="108dp"
+        android:width="108dp"
+        android:viewportHeight="108"
+        android:viewportWidth="108">
+    <path android:fillColor="#26A69A"
+          android:pathData="M0,0h108v108h-108z"/>
+    <path android:fillColor="#00000000" android:pathData="M9,0L9,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,0L19,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,0L29,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,0L39,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,0L49,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,0L59,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,0L69,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,0L79,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M89,0L89,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M99,0L99,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,9L108,9"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,19L108,19"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,29L108,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,39L108,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,49L108,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,59L108,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,69L108,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,79L108,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,89L108,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,99L108,99"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,29L89,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,39L89,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,49L89,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,59L89,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,69L89,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,79L89,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,19L29,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,19L39,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,19L49,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,19L59,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,19L69,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,19L79,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+</vector>

Разница между файлами не показана из-за своего большого размера
+ 32 - 0
demo/src/main/res/drawable/menu_my.xml


+ 27 - 0
demo/src/main/res/drawable/menu_my_selected.xml

@@ -0,0 +1,27 @@
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<vector android:height="24dp" android:viewportHeight="1024.0"
+    android:viewportWidth="1024.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#666666" android:pathData="M649.6,633.6c86.4,-48 147.2,-144 147.2,-249.6 0,-160 -128,-288 -288,-288s-288,128 -288,288c0,108.8 57.6,201.6 147.2,249.6 -121.6,48 -214.4,153.6 -240,288 -3.2,9.6 0,19.2 6.4,25.6 3.2,9.6 12.8,12.8 22.4,12.8h704c9.6,0 19.2,-3.2 25.6,-12.8 6.4,-6.4 9.6,-16 6.4,-25.6 -25.6,-134.4 -121.6,-240 -243.2,-288z"/>
+</vector>

+ 30 - 0
demo/src/main/res/drawable/menu_my_selector.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/menu_my_selected" android:state_pressed="true"/>
+    <item android:drawable="@drawable/sybotan_logo_anim" android:state_selected="true"/>
+    <item android:drawable="@drawable/sybotan_logo_anim" android:state_checked="true"/>
+    <item android:drawable="@drawable/menu_my"/>
+</selector>

+ 53 - 0
demo/src/main/res/drawable/sybotan_logo.xml

@@ -0,0 +1,53 @@
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="256dp"
+        android:height="256dp"
+        android:viewportWidth="256.0"
+        android:viewportHeight="256.0">
+    <path
+            android:name="header"
+            android:strokeWidth="3"
+            android:trimPathEnd="0.96"
+            android:pathData="M128,3c-24.7,0 -44.6,20 -44.6,44.6c0,22.7 17,41.5 39,44.3c-12.1,-2.6 -21.2,-13.4 -21.2,-26.4c0,-14.9 12,-27 26.9,-27c14.9,0 26.9,12.1 26.9,27c0,13 -9.1,23.8 -21.2,26.4c22,-2.8 39,-21.5 39,-44.3C172.6,23 152.7,3 128,3z"
+            android:strokeColor="#E60012"/>
+    <path
+            android:name="body"
+            android:strokeWidth="3"
+            android:trimPathEnd="0.95"
+            android:pathData="M163.7,92.3l-35.7,17.8l-35.7,-17.8l0,98.2l8.9,26.8l26.8,35.7l26.8,-35.7l8.9,-26.8z"
+            android:strokeColor="#E60012"/>
+    <path
+            android:name="left"
+            android:strokeWidth="3"
+            android:trimPathEnd="0.97"
+            android:pathData="M74.4,190.5l0,-17.9l0,-35.7l0,-17.8l0,-17.6l0,-18.1l-71.4,-35.7l0,35.7l44.6,22.3l0,17.8l-44.6,-22.3l0,35.7l44.6,22.3l0,17.9l-44.6,-22.3l8.9,26.8l80.4,53.5z"
+            android:strokeColor="#E60012"/>
+    <path
+            android:name="right"
+            android:strokeWidth="3"
+            android:trimPathEnd="0.97"
+            android:pathData="M253,83.4l0,-35.7l-71.4,35.7l0,17.8l0,17.9l0,17.8l0,35.7l0,17.7l1,0l-1.2,0.5l-17.8,44.7l80.5,-53.9l8.9,-26.8l-43.5,21.9l0,-18l43.5,-21.8l0,-35.7l-43.5,21.8l0,-17.9z"
+            android:strokeColor="#E60012"/>
+</vector>

+ 39 - 0
demo/src/main/res/drawable/sybotan_logo_anim.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+                 android:drawable="@drawable/sybotan_logo">
+    <target
+            android:animation="@animator/sybotan_anim"
+            android:name="header"/>
+    <target
+            android:animation="@animator/sybotan_anim"
+            android:name="body"/>
+    <target
+            android:animation="@animator/sybotan_anim"
+            android:name="left"/>
+    <target
+            android:animation="@animator/sybotan_anim"
+            android:name="right"/>
+</animated-vector>

+ 36 - 0
demo/src/main/res/layout/activity_graphy.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:tools="http://schemas.android.com/tools"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        tools:context="com.sybotan.android.demo.activities.GraphyActivity">
+
+    <com.sybotan.android.graphy.SGraphyView
+            android:id="@+id/graphyView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+</LinearLayout>

+ 40 - 0
demo/src/main/res/layout/activity_main.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<merge
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:tools="http://schemas.android.com/tools"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <Button android:id="@+id/qrcode"
+            android:text="qrcode"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+    <com.sybotan.android.works.layouts.SBottomNavigationLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:nav_menu="@menu/navigation"/>
+</merge>

+ 37 - 0
demo/src/main/res/layout/activity_web_view.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<FrameLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:tools="http://schemas.android.com/tools"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        tools:context="com.sybotan.android.demo.activities.WebViewActivity">
+
+    <com.sybotan.android.views.webview.SWebView
+            android:id="@+id/uiWebView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="visible"/>
+</FrameLayout>

+ 45 - 0
demo/src/main/res/menu/navigation.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+            android:id="@+id/uiMenuJoystick"
+            android:title="遥控"
+            android:icon="@drawable/sybotan_logo_anim"/>
+    <item
+            android:id="@+id/uiMenuPrograming"
+            android:title="编程"
+            android:icon="@drawable/sybotan_logo_anim"/>
+    <item
+            android:id="@+id/uiMenuMy"
+            android:title="我2"
+            android:icon="@drawable/menu_my_selector"/>
+    <item
+            android:id="@+id/uiMenuRobot"
+            android:title="我1"
+            android:icon="@drawable/menu_my_selector"/>
+    <item
+            android:id="@+id/uiMenuRobot1"
+            android:title="我"
+            android:icon="@drawable/menu_my_selector"/>
+</menu>

+ 28 - 0
demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background"/>
+    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
+</adaptive-icon>

+ 28 - 0
demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ *********************************************************************************************************************
+  ~
+  ~               iFHS7.
+  ~              ;BBMBMBMc                  rZMBMBR              BMB
+  ~              MBEr:;PBM,               7MBMMEOBB:             BBB                       RBW
+  ~     XK:      BO     SB.     :SZ       MBM.       c;;     ir  BBM :FFr       :SSF:    ;xBMB:r   iuGXv.    i:. iF2;
+  ~     DBBM0r.  :D     S7   ;XMBMB       GMBMu.     MBM:   BMB  MBMBBBMBMS   WMBMBMBBK  MBMBMBM  BMBRBMBW  .MBMBMBMBB
+  ~      :JMRMMD  ..    ,  1MMRM1;         ;MBMBBR:   MBM  ;MB:  BMB:   MBM. RMBr   sBMH   BM0         UMB,  BMB.  KMBv
+  ~     ;.   XOW  B1; :uM: 1RE,   i           .2BMBs  rMB. MBO   MBO    JMB; MBB     MBM   BBS    7MBMBOBM:  MBW   :BMc
+  ~     OBRJ.SEE  MRDOWOR, 3DE:7OBM       .     ;BMB   RMR7BM    BMB    MBB. BMB    ,BMR  .BBZ   MMB   rMB,  BMM   rMB7
+  ~     :FBRO0D0  RKXSXPR. JOKOOMPi       BMBSSWBMB;    BMBB:    MBMB0ZMBMS  .BMBOXRBMB    MBMDE RBM2;SMBM;  MBB   xBM2
+  ~         iZGE  O0SHSPO. uGZ7.          sBMBMBDL      :BMO     OZu:BMBK,     rRBMB0;     ,EBMB  xBMBr:ER.  RDU   :OO;
+  ~     ,BZ, 1D0  RPSFHXR. xWZ .SMr                  . .BBB
+  ~      :0BMRDG  RESSSKR. 2WOMBW;                   BMBMR
+  ~         i0BM: SWKHKGO  MBDv
+  ~           .UB  OOGDM. MK,                                          Copyright (c) 2015-2019.  斯伯坦机器人
+  ~              ,  XMW  ..
+  ~                  r                                                                     All rights reserved.
+  ~
+  ~ *********************************************************************************************************************
+  -->
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background"/>
+    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
+</adaptive-icon>

BIN
demo/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
demo/src/main/res/mipmap-hdpi/ic_launcher_round.png


BIN
demo/src/main/res/mipmap-mdpi/ic_launcher.png


+ 0 - 0
demo/src/main/res/mipmap-mdpi/ic_launcher_round.png


Некоторые файлы не были показаны из-за большого количества измененных файлов