Browse Source

创建模块cadengine。

庞利祥 5 years ago
parent
commit
e1bb0de105
41 changed files with 1554 additions and 188 deletions
  1. 2 0
      .gitignore
  2. BIN
      .idea/caches/build_file_checksums.ser
  3. 6 1
      .idea/gradle.xml
  4. 0 36
      .idea/inspectionProfiles/Project_Default.xml
  5. 3 29
      .idea/misc.xml
  6. 1 1
      .idea/modules.xml
  7. 0 12
      .idea/runConfigurations.xml
  8. 1 1
      .idea/vcs.xml
  9. 42 16
      app/build.gradle
  10. 63 11
      build.gradle
  11. 0 1
      cadengine/.gitignore
  12. 134 13
      cadengine/build.gradle
  13. 3 3
      cadengine/src/androidTest/java/cn/sagacloud/cadengine/ExampleInstrumentedTest.java
  14. 1 1
      cadengine/src/main/AndroidManifest.xml
  15. 361 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/FloorScene.kt
  16. 50 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/ColumnItem.kt
  17. 103 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/DoorItem.kt
  18. 64 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/MarkItem.kt
  19. 121 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/SpaceItem.kt
  20. 103 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/UserMark.kt
  21. 51 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/VirtualWallItem.kt
  22. 56 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/WallItem.kt
  23. 48 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/WindowItem.kt
  24. 23 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Column.kt
  25. 34 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Door.kt
  26. 15 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/FloorData.kt
  27. 17 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Marker.kt
  28. 23 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Opt.kt
  29. 13 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Place.kt
  30. 25 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Space.kt
  31. 21 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/VirtualWall.kt
  32. 25 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Wall.kt
  33. 29 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Window.kt
  34. 1 1
      cadengine/src/main/res/values/strings.xml
  35. 2 2
      cadengine/src/test/java/cn/sagacloud/cadengine/ExampleUnitTest.java
  36. 63 13
      gradle.properties
  37. BIN
      gradle/wrapper/gradle-wrapper.jar
  38. 0 6
      gradle/wrapper/gradle-wrapper.properties
  39. 42 30
      gradlew
  40. 4 10
      gradlew.bat
  41. 4 1
      settings.gradle

+ 2 - 0
.gitignore

@@ -6,4 +6,6 @@
 .DS_Store
 /build
 /captures
+gradle
+libs
 .externalNativeBuild

BIN
.idea/caches/build_file_checksums.ser


+ 6 - 1
.idea/gradle.xml

@@ -1,10 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>
+        <option name="delegatedBuild" value="true" />
+        <option name="testRunner" value="GRADLE" />
         <option name="distributionType" value="DEFAULT_WRAPPED" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="gradleHome" value="D:/Server/gradle-5.2.1" />
+        <option name="gradleJvm" value="1.8" />
         <option name="modules">
           <set>
             <option value="$PROJECT_DIR$" />
@@ -12,7 +17,7 @@
             <option value="$PROJECT_DIR$/cadengine" />
           </set>
         </option>
-        <option name="resolveModulePerSourceSet" value="false" />
+        <option name="useQualifiedModuleNames" value="true" />
       </GradleProjectSettings>
     </option>
   </component>

+ 0 - 36
.idea/inspectionProfiles/Project_Default.xml

@@ -1,36 +0,0 @@
-<component name="InspectionProjectProfileManager">
-  <profile version="1.0">
-    <option name="myName" value="Project Default" />
-    <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
-      <option name="TOP_LEVEL_CLASS_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="" />
-        </value>
-      </option>
-      <option name="INNER_CLASS_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="" />
-        </value>
-      </option>
-      <option name="METHOD_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
-        </value>
-      </option>
-      <option name="FIELD_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="" />
-        </value>
-      </option>
-      <option name="IGNORE_DEPRECATED" value="false" />
-      <option name="IGNORE_JAVADOC_PERIOD" value="true" />
-      <option name="IGNORE_DUPLICATED_THROWS" value="false" />
-      <option name="IGNORE_POINT_TO_ITSELF" value="false" />
-      <option name="myAdditionalJavadocTags" value="date" />
-    </inspection_tool>
-  </profile>
-</component>

+ 3 - 29
.idea/misc.xml

@@ -1,33 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="NullableNotNullManager">
-    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
-    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
-    <option name="myNullables">
-      <value>
-        <list size="4">
-          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
-          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
-          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
-          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
-        </list>
-      </value>
-    </option>
-    <option name="myNotNulls">
-      <value>
-        <list size="4">
-          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
-          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
-          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
-          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
-        </list>
-      </value>
-    </option>
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/build/classes" />
-  </component>
-  <component name="ProjectType">
-    <option name="id" value="Android" />
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
   </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
 </project>

+ 1 - 1
.idea/modules.xml

@@ -2,7 +2,7 @@
 <project version="4">
   <component name="ProjectModuleManager">
     <modules>
-      <module fileurl="file://$PROJECT_DIR$/CadEngine-app.iml" filepath="$PROJECT_DIR$/CadEngine-app.iml" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/CadEngine.iml" filepath="$PROJECT_DIR$/.idea/CadEngine.iml" />
       <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
       <module fileurl="file://$PROJECT_DIR$/cadengine/cadengine.iml" filepath="$PROJECT_DIR$/cadengine/cadengine.iml" />
     </modules>

+ 0 - 12
.idea/runConfigurations.xml

@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="RunConfigurationProducerService">
-    <option name="ignoredProducers">
-      <set>
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
-      </set>
-    </option>
-  </component>
-</project>

+ 1 - 1
.idea/vcs.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+    <mapping directory="" vcs="Git" />
   </component>
 </project>

+ 42 - 16
app/build.gradle

@@ -1,33 +1,59 @@
 apply plugin: 'com.android.application'
-
 apply plugin: 'kotlin-android'
-
 apply plugin: 'kotlin-android-extensions'
 
 android {
-    compileSdkVersion 26
+    compileSdkVersion ANDROID_SDK_VERSION.toInteger()
+    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
+
     defaultConfig {
-        applicationId "cn.sagacloud.cadengine"
-        minSdkVersion 15
-        targetSdkVersion 26
-        versionCode 1
-        versionName "1.0"
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        minSdkVersion ANDROID_MIN_SDK_VERSION.toInteger()
+        targetSdkVersion ANDROID_SDK_VERSION.toInteger()
+        versionCode SYBOTAN_CODE.toInteger()
+        versionName SYBOTAN_ANDROID_VERSION
+
+        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
+        vectorDrawables.useSupportLibrary = true
     }
+
     buildTypes {
         release {
-            minifyEnabled false
+            // minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }
+
+    // 解决lint语法检查错误(kotlin语法无法通过lint)
+    lintOptions {
+        abortOnError false
+    }
+
+    kotlinOptions {
+        jvmTarget = JVM_TARGET
+    }
 }
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
-    implementation 'com.android.support:appcompat-v7:26.1.0'
-    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
-    testImplementation 'junit:junit:4.12'
-    androidTestImplementation 'com.android.support.test:runner:1.0.2'
-    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    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
 }

+ 63 - 11
build.gradle

@@ -1,27 +1,79 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
+/*
+ * ********************************************************************************************************************
+ *
+ *               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 'cn.sagacloud.android'
+version SAGACLOUD_VERSION
 
 buildscript {
-    ext.kotlin_version = '1.1.51'
     repositories {
-        google()
+        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
+        mavenCentral()
         jcenter()
+        google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.0.1'
-        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
-
-        // NOTE: Do not place your application dependencies here; they belong
-        // in the individual module build.gradle files
+        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 {
-        google()
+        maven{ url MAVEN_REPO_PUBLIC_URL}
+        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
+        mavenCentral()
         jcenter()
+        google()
+    }
+    tasks.withType(Javadoc) {
+        options{
+            encoding 'UTF-8'
+            charSet 'UTF-8'
+            links 'http://docs.oracle.com/javase/8/docs/api'
+        }
     }
 }
 
-task clean(type: Delete) {
-    delete rootProject.buildDir
+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
+//}

+ 0 - 1
cadengine/.gitignore

@@ -1 +0,0 @@
-/build

+ 134 - 13
cadengine/build.gradle

@@ -1,34 +1,155 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *               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'
 
-android {
-    compileSdkVersion 26
+apply plugin: 'org.jetbrains.dokka-android'
+apply plugin: 'maven'
 
+android {
+    compileSdkVersion ANDROID_SDK_VERSION.toInteger()
+    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
 
 
     defaultConfig {
-        minSdkVersion 21
-        targetSdkVersion 26
-        versionCode 1
-        versionName "1.0"
+        minSdkVersion ANDROID_MIN_SDK_VERSION.toInteger()
+        targetSdkVersion ANDROID_SDK_VERSION.toInteger()
+        versionCode SYBOTAN_CODE.toInteger()
+        versionName SYBOTAN_ANDROID_VERSION
 
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
 
     }
 
     buildTypes {
         release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+            proguardFile 'proguard-rules.pro'
         }
     }
 
+    // 解决lint语法检查错误(kotlin语法无法通过lint)
+    lintOptions {
+        abortOnError false
+    }
+
+    kotlinOptions {
+        jvmTarget = JVM_TARGET
+    }
 }
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
 
-    implementation 'com.android.support:appcompat-v7:26.1.0'
-    testImplementation 'junit:junit:4.12'
-    androidTestImplementation 'com.android.support.test:runner:1.0.2'
-    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // 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
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Sybotan依赖
+    implementation group: 'com.sybotan', name: 'sybotan-kotlin-base', version: SYBOTAN_KOTLIN_VERSION
+    implementation group: 'com.sybotan', name: 'sybotan-android-base', version: SYBOTAN_ANDROID_VERSION
+    implementation group: 'com.sybotan', name: 'sybotan-android-graphy', version: SYBOTAN_ANDROID_VERSION
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// 文档生成
+// 源码
+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 SYBOTAN_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)
+            }
+        }
+    }
 }

+ 3 - 3
cadengine/src/androidTest/java/cn/sagacloud/cadengine/ExampleInstrumentedTest.java

@@ -1,4 +1,4 @@
-package cn.sagacloud.cadengine;
+package cn.sagacloud.android.cadengine;
 
 import android.content.Context;
 import android.support.test.InstrumentationRegistry;
@@ -17,10 +17,10 @@ import static org.junit.Assert.*;
 @RunWith(AndroidJUnit4.class)
 public class ExampleInstrumentedTest {
     @Test
-    public void useAppContext() throws Exception {
+    public void useAppContext() {
         // Context of the app under test.
         Context appContext = InstrumentationRegistry.getTargetContext();
 
-        assertEquals("cn.sagacloud.cadengine.test", appContext.getPackageName());
+        assertEquals("cn.sagacloud.android.cadengine.test", appContext.getPackageName());
     }
 }

+ 1 - 1
cadengine/src/main/AndroidManifest.xml

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

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

@@ -0,0 +1,361 @@
+//package cn.sagacloud.android.cadengine
+//
+//import cn.sagacloud.android.cadengine.items.*
+//import cn.sagacloud.android.cadengine.types.*
+//
+///**
+// * 楼层场景
+// *
+// * @author 付国宝
+// */
+//class FloorScene {
+//    /** item 数据  */
+//    //data: FloorData | null = null;
+//
+//    /** 是否显示空间  */
+//    private var _isShowSpace: Boolean = true;
+//    fun getIsShowSpace() : Boolean {
+//        return this._isShowSpace
+//    } // Function getIsShowSpace()
+//    fun setIsShowSpace(v: Boolean ) {
+//        if(this._isShowSpace == v){
+//            return
+//        }
+//        this._isShowSpace = v
+////        this.spaceList.map((t: SpaceItem) => {
+////            t.visible = this._isShowSpace;
+////            return t;
+////        })
+//    } // Function setIsShowSpace()
+//
+//    /** 是否显示柱子  */
+//    private var _isShowColumn: Boolean = true;
+//    fun getIsShowColumn() : Boolean {
+//        return this._isShowColumn
+//    } // Function getIsShowColumn()
+//    fun setIsShowColumn(v: Boolean ) {
+//        if(this._isShowColumn == v){
+//            return
+//        }
+//        this._isShowColumn = v
+////        this.columnList.map((t: ColumnItem) => {
+////            t.visible = this._isShowColumn;
+////            return t;
+////        })
+//    } // Function setIsShowColumn()
+//
+//    /** 是否显示墙体  */
+//    private var _isShowWall: Boolean = true;
+//    fun getIsShowWall() : Boolean {
+//        return this._isShowWall
+//    } // Function getIsShowWall()
+//    fun setIsShowWall(v: Boolean ) {
+//        if(this._isShowWall == v){
+//            return
+//        }
+//        this._isShowWall = v
+////        this.wallList.map((t: WallItem) => {
+////            t.visible = this._isShowWall;
+////            return t;
+////        })
+//    } // Function setIsShowWall()
+//
+//    /** 是否显示虚拟墙  */
+//    private var _isShowVirtualWall: Boolean = true;
+//    fun getIsShowVirtualWall() : Boolean {
+//        return this._isShowVirtualWall
+//    } // Function getIsShowVirtualWall()
+//    fun setIsShowVirtualWall(v: Boolean ) {
+//        if(this._isShowVirtualWall == v){
+//            return
+//        }
+//        this._isShowVirtualWall = v
+////        this.virtualWallList.map((t: VirtualWallItem) => {
+////            t.visible = this._isShowVirtualWall;
+////            return t;
+////        })
+//    } // Function setIsShowVirtualWall()
+//
+//    /** 是否显示门  */
+//    private var _isShowDoor: Boolean = true;
+//    fun getIsShowDoor() : Boolean {
+//        return this._isShowDoor
+//    } // Function getIsShowDoor()
+//    fun setIsShowDoor(v: Boolean ) {
+//        if(this._isShowDoor == v){
+//            return
+//        }
+//        this._isShowDoor = v
+////        this.doorList.map((t: DoorItem) => {
+////            t.visible = this._isShowDoor;
+////            return t;
+////        })
+//    } // Function setIsShowDoor()
+//
+//    /** 是否显示窗户  */
+//    private var _isShowWindow: Boolean = true;
+//    fun getIsShowWindow() : Boolean {
+//        return this._isShowWindow
+//    } // Function getIsShowWindow()
+//    fun setIsShowWindow(v: Boolean ) {
+//        if(this._isShowWindow == v){
+//            return
+//        }
+//        this._isShowWindow = v
+////        this.windowList.map((t: WindowItem) => {
+////            t.visible = this._isShowWindow
+////            return t
+////        })
+//    } // Function setIsShowWindow()
+//
+//    /** 墙 list   */
+//    var wallList: ArrayList<WallItem>? = null
+//    /** 柱子 list   */
+//    var columnList: ArrayList<ColumnItem>? = null
+//    /** 门 list   */
+//    var doorList: ArrayList<DoorItem>? = null
+//    /** 窗 list   */
+//    var casementList: ArrayList<WindowItem>? = null
+//    /** 虚拟墙 list   */
+//    var virtualWallList: ArrayList<VirtualWallItem>? = null
+//    /** 空间 list   */
+//    var spaceList: ArrayList<SpaceItem>? = null
+//
+//    /**
+//     *  @param  data    绘制空间地图得所有参数
+//     */
+//    constructor(){
+//        super()
+//    } // Constructor()
+//
+//    /**
+//     *  获取底图压缩文件
+//     *
+//     *  @param  url     请求数据文件路径
+//     */
+//    fun loadUrl(url: String){
+//        var that = this
+////        return Promise((relove, reject) => {
+////            Axios({
+////                method: "get",
+////                url: url,
+////                data: {},
+////                responseType: "blob"
+////            })
+////            .then((res: any) => {
+////                let blob = res.data
+////                this.unzip(blob)
+////                .then((jsonData: any) => {
+////                    that.addBaseMapItem(jsonData)
+////                    relove()
+////                })
+////                .catch((error: any) => {
+//////                    console.log(error)
+////                })
+////             })
+////            .catch((res: any) => {
+//////                console.log(res)
+////            });
+////        })
+//    } // Function loadUrl()
+//
+//    /**
+//     *  解压数据
+//     *
+//     *  @param  blob     文件
+//     */
+//    private fun unzip(blob: Any) : Any {
+//        var reader = FileReader()
+//        reader.readAsBinaryString(blob)
+//        var that = this
+//        return Promise(resolve => {
+//            reader.onload = (readerEvt: any) => {
+//                var binaryString = readerEvt.target.result
+//                //解压数据
+//                var base64Data = btoa(binaryString)
+//                var unGzipData = that.unzipBase64(base64Data)
+//                that.data = unGzipData.EntityList[0].Elements
+//                resolve(unGzipData)
+//            }
+//        })
+//    } // Function unzip()
+//
+//    /**
+//     *  获取楼层未压缩数据
+//     *
+//     *  @param  url     请求路径
+//     */
+//    fun getFloorData(url: String, data: HashMap<String, String>){
+//        var that = this
+////        return Promise((resolve, reject) => {
+////            Axios({
+////                method: "post",
+////                url: url,
+////                data: data
+////            })
+////            .then((res: Any) => {
+////                var floordata = res.data.EntityList[0].Elements;
+////                that.addBaseMapItem(floordata);
+////                resolve(res.data);
+////            })
+////            .catch((res: Any) => {
+//////                console.log(res);
+////            });
+////        })
+//    } // Function getFloorData()
+//
+//    /**
+//     *  增添所有底图 item;
+//     *
+//     *  @param  data    itemList对象
+//     */
+//    private fun addBaseMapItem(data: FloorData){
+////        data.Walls.map((t: Wall) => {
+////            this.addWall(t)
+////        })
+////        data.Columns.map((t: Column) => {
+////            this.addColumn(t)
+////        })
+////        data.Windows.map((t: Casement) => {
+////            this.addCasement(t)
+////        })
+////        data.VirtualWalls.map((t: VirtualWall) => {
+////            this.addVirtualWall(t)
+////        })
+////        data.Doors.map((t: Door) => {
+////            this.addDoor(t)
+////        })
+////        data.Spaces.map((t: Space) => {
+////            this.addSpace(t)
+////        })
+//    } // Function addBaseMapItem()
+//
+//    /**
+//     *  添加空间到 scene 中
+//     *
+//     *  @param  space   空间list
+//     */
+//    fun addSpace(space: Space){
+//        var item = SpaceItem(null, space)
+//        item.zOrder = 2.0
+//        item.visible = this.getIsShowSpace()
+//        this.spaceList!!.add(item)
+//        this.addItem(item)
+//    } // Function addSpace()
+//
+//    /**
+//     *  添加柱子到 scene 中
+//     *
+//     *  @param  column   柱子list
+//     */
+//    fun addColumn(column: Column){
+//        var item = ColumnItem(null, column)
+//        item.visible = this.getIsShowColumn()
+//        this.columnList!!.add(item)
+//        this.addItem(item)
+//    } // Function addColumn()
+//
+//    /**
+//     *  添加墙到 scene 中
+//     *
+//     *  @param  wall   墙list
+//     */
+//    fun addWall(wall: Wall){
+//        var item = WallItem(null, wall)
+//        item.visible = this.getIsShowWall()
+//        this.wallList!!.add(item)
+//        this.addItem(item)
+//    } // Function addWall()
+//
+//    /**
+//     *  添加所有虚拟墙到 scene 中
+//     *
+//     *  @param  virtualWall   虚拟墙list
+//     */
+//    fun addVirtualWall(virtualWall: VirtualWall){
+//        var item = VirtualWallItem(null, virtualWall)
+//        item.visible = this.getIsShowVirtualWall()
+//        this.virtualWallList.add(item)
+//        this.addItem(item)
+//    } // Function addVirtualWall()
+//
+//    /**
+//     *  添加门到 scene 中
+//     *
+//     *  @param  doors   门list
+//     */
+//    fun addDoor(door: Door){
+//        var item = DoorItem(null, door)
+//        item.zOrder = 1.0
+//        item.visible = this.getIsShowDoor()
+//        this.doorList.add(item)
+//        this.addItem(item)
+//    } // Function addDoor()
+//
+//    /**
+//     * 添加窗户到 scene 中
+//     *
+//     * @param  windows   窗户list
+//     */
+//    fun addCasement(casement: Window){
+//        var item = WindowItem(null, casement)
+//        item.zOrder = 1
+//        item.visible = this.getIsShowWindow()
+//        this.casementList!!.add(item)
+//        this.addItem(item)
+//    } // Function addCasement()
+//
+//    /**
+//     *  扩大数组中相应字段一定倍数
+//     *
+//     *  @param  arr     itemList
+//     *  @param  k       倍数
+//     *  @param  name    字段key值
+//     */
+//    fun changeMap(arr: Any, k: Any, name: Any){
+////        var data = arr.map((items: any) => {
+////            if (items[name] && items[name].length) {
+////                items[name].map((children: any) => {
+////                    if (Array.isArray(children)) {
+////                        return children.map(res => {
+////                            res.Y = res.Y * k
+////                            return res
+////                        })
+////                    } else {
+////                        children.Y = children.Y * k;
+////                        return children;
+////                    }
+////                })
+////            }
+////        })
+////        return data
+//    } // Function changeMap()
+//
+//    /**
+//     *  解压文件
+//     *
+//     *  @param  b64Data    base64数据
+//     */
+//    private fun unzipBase64(b64Data: Any){
+//        var strData = atob(b64Data)
+////        var charData = strData.split("").map(function(x) {
+////            return x.charCodeAt(0)
+////        })
+//        var binData = Uint8Array(charData)
+////        var data = pako.inflate(binData, { to: "string" })
+////        return eval("(" + data + ")")
+//    } // Function unzipBase64()
+//
+//    /**
+//     *  压缩文件
+//     *
+//     *  @param  str    被压缩的数据
+//     */
+//    private fun zip(str: Any){
+//        //escape(str)  --->压缩前编码,防止中午乱码
+//        var toMap = HashMap<String, String>()
+//        toMap.put("to","string")
+//        var binaryString = pako.gzip(escape(str), toMap);
+//        return binaryString;
+//    } // Function zip()
+//} // Class FloorScene

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

@@ -0,0 +1,50 @@
+package cn.sagacloud.android.cadengine.items
+
+import android.graphics.*
+import cn.sagacloud.android.cadengine.types.Column
+import cn.sagacloud.android.cadengine.types.Opt
+import com.sybotan.android.graphy.SGraphyItem
+
+/**
+ * 柱子 Item
+ *
+ * @author 付国宝
+ */
+class ColumnItem(private val data: Column, parent: SGraphyItem) : SGraphyItem(parent) {
+    /** 画笔 */
+    private val paint = Paint()
+    /** 墙轮廓 */
+    private val pathList = ArrayList<Path>()
+
+    init {
+        paint.style = Paint.Style.FILL
+        if (data.OutLine != null) {
+            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) {
+                    path.lineTo(p.x, p.y)
+                }
+                path.close()
+                pathList.add(path)
+            }
+        }
+    } // Init
+
+    /**
+     * Item绘制操作
+     *
+     * @param   canvas          画布
+     * @param   rect            绘制区域
+     */
+    override fun onDraw(canvas : Canvas, rect: RectF){
+        paint.color = Opt.columnColor;
+        for (path in pathList) {
+            canvas.drawPath(path, paint);
+        }
+    } // Function onDraw()
+} // Class ColumnItem

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

@@ -0,0 +1,103 @@
+//package cn.sagacloud.android.cadengine.items
+//
+//import cn.sagacloud.android.cadengine.types.Door
+//
+///**
+// * 门 Item
+// *
+// * @author 付国宝
+// */
+//class DoorItem {
+//    /** 门数据 */
+//    var data: Door? = null
+//    /** 门轮廓线坐标list  */
+//    private val pointArr = ArrayList<SPoint>()
+//    /** 门长度 */
+//    private var r: Double? = null
+//    /** 角度  */
+//    private var ang: Double? = null
+//    /** 旋转点 */
+//    private var p = SPoint(0,0)
+//    /** 旋转起始角度 */
+//    private var startAng: Double = -Math.PI / 2
+//    /** 旋转结束角度 */
+//    private var endAng = 0
+//
+//    /**
+//     * 构造函数
+//     *
+//     * @param data      门数据
+//     */
+//    constructor(data: Door){
+//        this.data = data
+//        if (this.data?.OutLine!!.size > 0) {
+////            this.pointArr = this.data.OutLine[0].map(t => {
+////                return SPoint(t.X, -t.Y)
+////            })
+//            var p1 = this.pointArr[0]
+//            var p2 = this.pointArr[1]
+////            var fo = Math.atan( -this.data.FaceDirection.Y / this.data.FaceDirection.X)
+//            // 两点间距离
+////            this.r = Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))
+//            // 门朝向角度
+////            this.ang = this.data.FaceDirection.X > 0 ? fo : fo + Math.PI
+//            // 旋转点
+//            if (Math.abs(this.data.HandDirection.X) > Math.abs(this.data.HandDirection.Y)){
+//                if (this.data.HandDirection.X > 0) {
+//                    if (p1.x > p2.x) {
+//                        this.p = p1
+//                        // this.number = 1 //
+//                    } else {
+//                        this.p = p2
+//                        // this.number = 2
+//                    }
+//                } else {
+//                    if (p1.x < p2.x) {
+//                        this.p = p1
+//                        // this.number = 3 //
+//                    } else {
+//                        this.p = p2
+//                        // this.number = 4 //
+//                    }
+//                }
+//            }else{
+//                if (this.data.HandDirection.Y > 0) {
+//                    if (p1.y > p2.y) {
+//                        this.p = p1
+//                        // this.number = 5 //
+//                    } else {
+//                        this.p = p2
+//                        // this.number = 6
+//                    }
+//                } else {
+//                    if (p1.y < p2.y) {
+//                        this.p = p1
+//                        // this.number = 7
+//                    } else {
+//                        this.p = p2
+//                        // this.number = 8
+//                    }
+//                }
+//            }
+//        }
+//    } // Constructor
+//
+//    /**
+//     * Item绘制操作
+//     *
+//     * @param   painter       painter对象
+//     * @param   rect          绘制区域
+//     */
+//    fun onDraw(painter: SPainter, rect/*?*/: SRect){
+//        if (this.visible) {
+//            painter.translate(this.p.x, this.p.y)
+//            painter.rotate(this.ang)
+//            painter.pen.lineWidth = 100
+//            painter.pen.color = Opt.doorColor
+//            painter.drawLine(0, 0, this.r, 0)
+//
+//            painter.pen.lineDash = [50, 50]
+//            painter.drawArc( -this.r,  -this.r, this.r * 2, this.r * 2, this.startAng, this.endAng)
+//        }
+//    } // Function onDraw()
+//} // Class DoorItem

File diff suppressed because it is too large
+ 64 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/MarkItem.kt


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

@@ -0,0 +1,121 @@
+package cn.sagacloud.android.cadengine.items
+
+import android.graphics.*
+import cn.sagacloud.android.cadengine.types.Opt
+import cn.sagacloud.android.cadengine.types.Space
+import com.sybotan.android.graphy.SGraphyItem
+
+/**
+ * 空间item
+ *
+ * @author 付国宝
+ */
+class SpaceItem(private val data: Space, parent: SGraphyItem) : SGraphyItem(parent) {
+    /** 画笔 */
+    private val paint = Paint()
+    /** 墙轮廓 */
+    private val path = Path()
+    /** 空间轮廓线坐标list  */
+    private val pointArr = ArrayList<ArrayList<PointF>>()
+    /** X坐标最小值  */
+    private var minX = 0.0f
+    /** X坐标最大值  */
+    private var maxX = 0.0f
+    /** Y坐标最小值  */
+    private var minY = 0.0f
+    /** Y坐标最大值  */
+    private var maxY = 0.0f
+
+    init {
+        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(this.minX, this.minY, this.maxX - this.minX, this.maxY - this.minY)
+    } // 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, rect: RectF) {
+        paint.color = Opt.wallColor;
+        canvas.drawPath(path, paint);
+    } // Function onDraw()
+
+} // Class SpaceItem

+ 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

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

@@ -0,0 +1,51 @@
+//package cn.sagacloud.android.cadengine.items
+//
+//import cn.sagacloud.android.cadengine.types.Opt
+//import cn.sagacloud.android.cadengine.types.VirtualWall
+//import com.sybotan.android.graphy.SGraphyItem
+//
+///**
+// * 墙item
+// *
+// * @author 付国宝
+// */
+//class VirtualWallItem {
+//    /** 虚拟墙数据   */
+//    var data: VirtualWall? = null
+//    /** 虚拟墙轮廓线坐标list  */
+//    private val pointArr: ArrayList<SPoint>? = null
+//
+//    /**
+//     * 构造函数
+//     *
+//     * @param parent    指向父对象
+//     * @param data      虚拟墙数据
+//     */
+//    constructor(parent: SGraphyItem?, data: VirtualWall){
+//        super(parent)
+//        this.data = data
+//        if (this.data?.OutLine!!.size > 0) {
+////            this.pointArr = this?.data!!.OutLine.get(0).map(t => {
+////                return SPoint(t.X, -t.Y)
+////            })
+//        }
+//    } // Constructor
+//
+//    /**
+//     * Item绘制操作
+//     *
+//     * @param   painter       painter对象
+//     * @param   rect          绘制区域
+//     */
+//    fun onDraw(painter: SPainter, rect/*?*/: SRect){
+//        if (this.visible) {
+//            painter.pen.lineWidth = 100
+//            painter.pen.color = Opt.virtualWallColor
+//            var lineDash = ArrayList<Double>()
+//            lineDash.add(200.0)
+//            lineDash.add(200.0)
+//            painter.pen.lineDash = lineDash
+//            painter.drawPolyline(this.pointArr)
+//        }
+//    } // Function onDraw()
+//} // Class VirtualWallItem

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

@@ -0,0 +1,56 @@
+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.Opt
+import cn.sagacloud.android.cadengine.types.Wall
+import com.sybotan.android.graphy.SGraphyItem
+
+/**
+ * 墙item
+ *
+ * @author  郝建龙
+ */
+class WallItem(private val data: Wall, parent: SGraphyItem) : SGraphyItem(parent) {
+    /** 画笔 */
+    private val paint = Paint()
+    /** 墙轮廓 */
+    private val pathList = ArrayList<Path>()
+
+    /**
+     * 构造
+     */
+    init {
+        paint.style = Paint.Style.FILL
+        if (data.OutLine != null) {
+            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) {
+                    path.lineTo(p.x, p.y)
+                }
+                path.close()
+                pathList.add(path)
+            }
+        }
+    } // Constructor
+
+    /**
+     * Item绘制操作
+     *
+     * @param   canvas          画布
+     * @param   rect            绘制区域
+     */
+    override fun onDraw(canvas : Canvas, rect: RectF) {
+        paint.color = Opt.wallColor;
+        for (path in pathList) {
+            canvas.drawPath(path, paint);
+        }
+    } // Function onDraw()
+} // Class WallItem

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

@@ -0,0 +1,48 @@
+//package cn.sagacloud.android.cadengine.items
+//
+//import cn.sagacloud.android.cadengine.types.Window
+//import cn.sagacloud.android.cadengine.types.Opt
+//import com.sybotan.android.graphy.SGraphyItem
+//
+///**
+// * 窗户item
+// *
+// * @author 付国宝
+// */
+//class WindowItem {
+//    /** 窗户数据    */
+//    var data: Window? = bull
+//    /** 窗户轮廓线坐标list  */
+//    private val pointArr: ArrayList<SPoint>? = null
+//
+//    /**
+//     * 构造函数
+//     *
+//     * @param parent    指向父对象
+//     * @param data      窗户数据
+//     */
+//    constructor(parent: SGraphyItem?, data: Window){
+//        super(parent)
+//        this.data = data
+//        if (this.data?.OutLine!!.size) {
+////            this.pointArr = this.data?.OutLine!!.get(0).map(t => {
+////                return SPoint(t.X, -t.Y)
+////            })
+//        }
+//    } // Function constructor
+//
+//    /**
+//     * Item绘制操作
+//     *
+//     * @param   painter       painter对象
+//     * @param   rect          绘制区域
+//     */
+//    fun onDraw(painter: SPainter, rect/*?*/: SRect) {
+//        if (this.visible) {
+//            painter.pen.color = Opt.windowColor
+//            painter.pen.lineWidth = 400.0
+//            painter.drawPolyline(this.pointArr)
+//        }
+//    } // Function onDraw()
+//
+//} // Class WindowItem

+ 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 付国宝
+ */
+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 付国宝
+ */
+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

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

@@ -0,0 +1,15 @@
+package cn.sagacloud.android.cadengine.types
+
+/**
+ * json数据类
+ *
+ * @author 付国宝
+ */
+class FloorData {
+    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 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 付国宝
+ */
+class Marker {
+    /** 标记的id  */
+    var Id: String? = null
+    /** 标记的名称  */
+    var Name: String? = null
+    /** X坐标 */
+    var X: Double? = null
+    /** Y坐标 */
+    var Y: Double? = null
+} // Class Marker

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

@@ -0,0 +1,23 @@
+package cn.sagacloud.android.cadengine.types
+
+/**
+ * 颜色类
+ *
+ * @author 付国宝
+ */
+class Opt {
+    companion object {
+        /** 墙颜色 */
+        val wallColor = 0xFF0000
+        /** 柱子颜色 */
+        val columnColor = 0x000000
+        /** 虚拟墙颜色 */
+        val virtualWallColor = 0x000000
+        /** 空间颜色 */
+        val spaceColor = 0xcbe5ff
+        /** 门颜色 */
+        val doorColor = 0xf5b36f
+        /** 窗户颜色 */
+        val windowColor = 0xfcd6ff
+    }
+} // Class Opt

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

@@ -0,0 +1,13 @@
+package cn.sagacloud.android.cadengine.types
+
+import android.graphics.PointF
+
+/**
+ * 位置类
+ *
+ * @author 付国宝
+ */
+class Place {
+    var Point: 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 付国宝
+ */
+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 付国宝
+ */
+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 付国宝
+ */
+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 付国宝
+ */
+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

+ 1 - 1
cadengine/src/main/res/values/strings.xml

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

+ 2 - 2
cadengine/src/test/java/cn/sagacloud/cadengine/ExampleUnitTest.java

@@ -1,4 +1,4 @@
-package cn.sagacloud.cadengine;
+package cn.sagacloud.android.cadengine;
 
 import org.junit.Test;
 
@@ -11,7 +11,7 @@ import static org.junit.Assert.*;
  */
 public class ExampleUnitTest {
     @Test
-    public void addition_isCorrect() throws Exception {
+    public void addition_isCorrect() {
         assertEquals(4, 2 + 2);
     }
 }

+ 63 - 13
gradle.properties

@@ -1,17 +1,67 @@
-# Project-wide Gradle settings.
+org.gradle.jvmargs = -Xmx1536m
+#org.gradle.configureondemand=false
 
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
+SYBOTAN_URL = http://www.sybotan.com
+SYBOTAN_KOTLIN_VERSION = 1.4.59
+SYBOTAN_ANDROID_VERSION = 1.2.24
+SAGACLOUD_VERSION = 1.0.0
+SYBOTAN_CODE = 5
 
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
+MAVEN_REPO_PUBLIC_URL = http://dev.dp.sagacloud.cn:8082/repository/maven-public/
+MAVEN_REPO_RELEASE_URL = http://dev.dp.sagacloud.cn:8082/repository/maven-releases/
+MAVEN_REPO_SNAPSHOT_URL = http://dev.dp.sagacloud.cn:8082/repository/maven-snapshots/
+NEXUS_USERNAME = saga
+NEXUS_PASSWORD = saga
 
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
+#MAVEN_REPO_PUBLIC_URL = http://maven.sybotan.com/repository/sybotan-public/
+#MAVEN_REPO_RELEASE_URL = http://maven.sybotan.com/repository/sybotan-releases/
+#MAVEN_REPO_SNAPSHOT_URL = http://maven.sybotan.com/repository/sybotan-snapshots/
+#NEXUS_USERNAME = andy
+#NEXUS_PASSWORD = 123456
 
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
+LICENSE_NAME = The Apache Software License, Version 2.0
+LICENSE_URL = http://www.apache.org/licenses/LICENSE-2.0.txt
+
+DEVELOPER_ID = Andy.Sybotan
+DEVELOPER_NAME = Andy
+
+JVM_TARGET = 1.8
+JDK_VERSION = 8
+
+ANDROID_SDK_VERSION = 28
+ANDROID_MIN_SDK_VERSION = 21
+ANDROID_BUILD_TOOLS_VERSION = 28.0.3
+
+# https://mvnrepository.com/artifact/com.android.support/appcompat-v7
+ANDROID_SUPPORT_VERSION = 28.0.0
+#27.1.1
+# https://mvnrepository.com/artifact/org.jetbrains.anko/anko-common
+ANKO_VERSION = 0.10.8
+# https://mvnrepository.com/artifact/com.android.support.constraint/constraint-layout
+CONSTRAINT_VERSION = 2.0.0-alpha2
+# https://mvnrepository.com/artifact/org.jetbrains.dokka/dokka-gradle-plugin
+DOKKA_VERSION = 0.9.16
+# https://mvnrepository.com/artifact/pub.devrel/easypermissions
+EASYPERMISSIONS_VERSION = 1.2.0
+# https://mvnrepository.com/artifact/org.greenrobot/eventbus
+EVENTBUS_VERSION = 3.1.1
+# https://mvnrepository.com/artifact/com.alibaba/fastjson
+FASTJSON_VERSION = 1.1.70.android
+# https://mvnrepository.com/artifact/com.android.tools.build/gradle
+GRADLE_VERSION = 3.2.1
+## https://mvnrepository.com/artifact/com.google.code.gson/gson
+#GSON_VERSION = 2.8.5
+# https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
+JACKSON_VERSION = 2.9.8
+# https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
+JUNIT_VERSION = 5.3.1
+# https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib-jdk8
+KOTLIN_VERSION = 1.3.20
+# https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
+OKHTTP_VERSION = 3.11.0
+# https://mvnrepository.com/artifact/javax.persistence/persistence-api
+PERSISTENCE_VERSION = 1.0.2
+# https://mvnrepository.com/artifact/com.squareup.picasso/picasso
+PICASSO_VERSION = 2.5.2
+# https://mvnrepository.com/artifact/com.google.zxing/core
+ZXING_VERSION = 3.3.0

BIN
gradle/wrapper/gradle-wrapper.jar


+ 0 - 6
gradle/wrapper/gradle-wrapper.properties

@@ -1,6 +0,0 @@
-#Tue Sep 10 14:19:30 CST 2019
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

+ 42 - 30
gradlew

@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
 
 ##############################################################################
 ##
@@ -6,20 +6,38 @@
 ##
 ##############################################################################
 
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
 
 APP_NAME="Gradle"
 APP_BASE_NAME=`basename "$0"`
 
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m"'
+
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD="maximum"
 
-warn ( ) {
+warn () {
     echo "$*"
 }
 
-die ( ) {
+die () {
     echo
     echo "$*"
     echo
@@ -30,6 +48,7 @@ die ( ) {
 cygwin=false
 msys=false
 darwin=false
+nonstop=false
 case "`uname`" in
   CYGWIN* )
     cygwin=true
@@ -40,26 +59,11 @@ case "`uname`" in
   MINGW* )
     msys=true
     ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
 esac
 
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 
 # Determine the Java command to use to start the JVM.
@@ -85,7 +89,7 @@ location of your Java installation."
 fi
 
 # Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
     MAX_FD_LIMIT=`ulimit -H -n`
     if [ $? -eq 0 ] ; then
         if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -150,11 +154,19 @@ if $cygwin ; then
     esac
 fi
 
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
 }
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
 
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"

+ 4 - 10
gradlew.bat

@@ -8,14 +8,14 @@
 @rem Set local scope for the variables with windows NT shell
 if "%OS%"=="Windows_NT" setlocal
 
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
 set DIRNAME=%~dp0
 if "%DIRNAME%" == "" set DIRNAME=.
 set APP_BASE_NAME=%~n0
 set APP_HOME=%DIRNAME%
 
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m"
+
 @rem Find java.exe
 if defined JAVA_HOME goto findJavaFromJavaHome
 
@@ -46,10 +46,9 @@ echo location of your Java installation.
 goto fail
 
 :init
-@rem Get command-line arguments, handling Windowz variants
+@rem Get command-line arguments, handling Windows variants
 
 if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
 
 :win9xME_args
 @rem Slurp the command line arguments.
@@ -60,11 +59,6 @@ set _SKIP=2
 if "x%~1" == "x" goto execute
 
 set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
 
 :execute
 @rem Setup the command line

+ 4 - 1
settings.gradle

@@ -1 +1,4 @@
-include ':app', ':cadengine'
+rootProject.name = 'CadEngine'
+
+include ':app'
+include ':cadengine'