Browse Source

*****************cad图形引擎 ******************

张维新 5 years ago
parent
commit
ba36519a0a

+ 1 - 1
app/build.gradle

@@ -3,7 +3,7 @@ apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
 
 android {
-    compileSdkVersion ANDROID_SDK_VERSION.toInteger()
+    compileSdkVersion = 28
     buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
 
     defaultConfig {

+ 6 - 2
app/src/main/AndroidManifest.xml

@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="cn.sagacloud.cadengine">
+    package="cn.sagacloud.cadengine"
+
+    >
 
     <uses-permission android:name="android.permission.INTERNET"/>
 
@@ -10,7 +12,9 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        android:theme="@style/AppTheme">
+        android:theme="@style/AppTheme"
+        android:usesCleartextTraffic="true"
+        >
         <activity android:name=".MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />

+ 45 - 2
app/src/main/java/cn/sagacloud/cadengine/MainActivity.kt

@@ -1,7 +1,11 @@
 package cn.sagacloud.cadengine
 
+import android.Manifest
+import android.content.pm.PackageManager
 import android.support.v7.app.AppCompatActivity
 import android.os.Bundle
+import android.support.v4.app.ActivityCompat
+import android.support.v4.content.ContextCompat
 import cn.sagacloud.android.cadengine.FloorScene
 import kotlinx.android.synthetic.main.activity_main.*
 import org.jetbrains.anko.doAsync
@@ -12,12 +16,12 @@ class MainActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
-
+        addPermission()
         graphyView.scene = scene
 
         /** 开启异步 */
         doAsync {
-            scene.loadUrl("http://192.168.20.215:9001/image-service/common/file_get?systemId=revit&key=base/a12a88d1d92411e98e2ded11576ff4c3.jsonz")
+            scene.loadUrl("http://192.168.20.215:9001/image-service/common/file_get?systemId=revit&key=base/2e179188dec911e9a6adaf571308f9a0.jsonz")
             //scene.loadUrl("http://api.sagacloud.cn/dp-auxiliary/image-service/common/file_get?systemId=revit&key=Fl42010500018b580334dcf111e8a553db1eadfac99320190803114958bim.jsonz")
             /** 主线程处理ui */
             uiThread {
@@ -28,4 +32,43 @@ class MainActivity : AppCompatActivity() {
             }
         }
     } // Function onCreate()
+
+    companion object {
+        val CODE_PERMISSION = 1604
+        private val CODE_DOWNLOAD = 1808
+        private val CODE_CLEAR = 1911
+    }
+
+    /**
+     * Desc: 动态请求权限
+     * Created by mengxy
+     * Mail: mengxiangyong@persagy.com
+     * 2018/3/29 15:08
+     */
+    private fun addPermission() {
+        val isAllGranted = checkPermissionAllGranted(
+                arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                        Manifest.permission.READ_EXTERNAL_STORAGE,
+                        Manifest.permission.CAMERA,
+                        Manifest.permission.RECORD_AUDIO)
+        )
+        if (!isAllGranted) {
+            ActivityCompat.requestPermissions(
+                    this,
+                    arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                            Manifest.permission.READ_EXTERNAL_STORAGE,
+                            Manifest.permission.CAMERA,
+                            Manifest.permission.RECORD_AUDIO),
+                    CODE_PERMISSION
+            )
+        }
+    }
+
+    /**
+     * 检查是否拥有指定的所有权限
+     */
+    private fun checkPermissionAllGranted(permissions: Array<String>): Boolean {
+        // 只要有一个权限没有被授予, 则直接返回 false
+        return permissions.none { ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED }
+    }
 } // Class MainActivity

+ 1 - 0
build.gradle

@@ -32,6 +32,7 @@ buildscript {
         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

+ 4 - 0
cadengine/build.gradle

@@ -77,6 +77,10 @@ dependencies {
     // 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: 'com.sybotan', name: 'sybotan-kotlin-base', version: SYBOTAN_KOTLIN_VERSION

+ 30 - 2
cadengine/src/main/java/cn/sagacloud/android/cadengine/FloorScene.kt

@@ -1,5 +1,6 @@
 package cn.sagacloud.android.cadengine
 
+import android.graphics.PointF
 import android.util.Log
 import cn.sagacloud.android.cadengine.types.*
 import com.alibaba.fastjson.PropertyNamingStrategy
@@ -91,6 +92,8 @@ open class FloorScene : SGraphyScene() {
     var columnList = ArrayList<ColumnItem>()
     /** 空间 list   */
     var spaceList = ArrayList<SpaceItem>()
+    /** 空间名称 list   */
+    val spaceNameList = ArrayList<SpatialCenterItem>()
     /** 门 list   */
     var doorList = ArrayList<DoorItem>()
     /** 空间 list   */
@@ -114,12 +117,12 @@ open class FloorScene : SGraphyScene() {
             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()
 
-
     /**
      *  增添所有底图 item;
      *
@@ -155,7 +158,14 @@ open class FloorScene : SGraphyScene() {
         // 添加空间
         if (elements.spaces != null) {
             for (space in elements.spaces!!) {
-                addSpace(space);
+                addSpace(space)
+            }
+        }
+
+        // 添加空间名称
+        if (elements.spaces != null) {
+            for (space in elements.spaces!!) {
+                addSpaceName(space)
             }
         }
 
@@ -217,12 +227,30 @@ open class FloorScene : SGraphyScene() {
      */
     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        门

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

@@ -1,4 +1,4 @@
-package cn.sagacloud.android.cadengine.types
+package cn.sagacloud.android.cadengine
 
 import android.graphics.Color
 

+ 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

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

@@ -2,7 +2,7 @@ package cn.sagacloud.android.cadengine.items
 
 import android.graphics.*
 import cn.sagacloud.android.cadengine.types.Column
-import cn.sagacloud.android.cadengine.types.Opt
+import cn.sagacloud.android.cadengine.Opt
 import com.sybotan.android.graphy.SGraphyItem
 
 /**

+ 2 - 7
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/DoorItem.kt

@@ -2,12 +2,10 @@ package cn.sagacloud.android.cadengine.items
 
 import android.graphics.*
 import cn.sagacloud.android.cadengine.types.Door
-import cn.sagacloud.android.cadengine.types.Opt
+import cn.sagacloud.android.cadengine.Opt
 import com.sybotan.android.graphy.SGraphyItem
-import kotlin.math.atan
 import kotlin.math.atan2
 import kotlin.math.sqrt
-import android.view.View.X
 import kotlin.math.abs
 
 
@@ -111,10 +109,7 @@ class DoorItem(private val data: Door, parent: SGraphyItem? = null) : SGraphyIte
         canvas.translate(p.x, p.y);
         canvas.rotate(angle * 180f / Math.PI.toFloat())
 
-        paint1.style = Paint.Style.FILL
-        canvas.drawArc(-d, -d, d, d, 0f, 360f ,false, paint1)
-
-//        canvas.drawLine(0f, 0f, d, 0f, paint1)
+        canvas.drawLine(0f, 0f, d, 0f, paint1)
 //
 //        canvas.drawArc(-d, -d, d, d, startAng, 90f ,false, paint2)
         super.onDraw(canvas, rect)

+ 2 - 1
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/SpaceItem.kt

@@ -1,7 +1,7 @@
 package cn.sagacloud.android.cadengine.items
 
 import android.graphics.*
-import cn.sagacloud.android.cadengine.types.Opt
+import cn.sagacloud.android.cadengine.Opt
 import cn.sagacloud.android.cadengine.types.Space
 import com.sybotan.android.graphy.SGraphyItem
 
@@ -160,6 +160,7 @@ class SpaceItem(private val data: Space, parent: SGraphyItem? = null) : SGraphyI
             paint.style = Paint.Style.FILL
             paint.color = Opt.spaceColor;
             canvas.drawPath(spacePath!!, paint)
+
         }
         super.onDraw(canvas, rect)
     } // Function onDraw()

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

@@ -0,0 +1,96 @@
+/*
+ * ********************************************************************************************************************
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    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
+
+/**
+ *   空间中心点
+ * @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, rect: RectF) {
+        canvas.drawText(codename.trim(),-10f,0f,panText)
+        return
+    } // Function paint()
+
+    /**
+     *  点击
+     */
+    override fun onSingleTapUp(e: MotionEvent): Boolean {
+        return false
+    }
+
+    override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
+        flag=false
+        return super.onScroll(e1, e2, distanceX, distanceY)
+    }
+
+} // Class GraphyWallItem

+ 1 - 2
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/VirtualWallItem.kt

@@ -1,11 +1,10 @@
 package cn.sagacloud.android.cadengine.items
 
 import android.graphics.*
-import cn.sagacloud.android.cadengine.types.Opt
+import cn.sagacloud.android.cadengine.Opt
 import cn.sagacloud.android.cadengine.types.VirtualWall
 import com.sybotan.android.graphy.SGraphyItem
 import android.graphics.DashPathEffect
-import android.util.Log
 
 
 /**

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

@@ -1,7 +1,7 @@
 package cn.sagacloud.android.cadengine.items
 
 import android.graphics.*
-import cn.sagacloud.android.cadengine.types.Opt
+import cn.sagacloud.android.cadengine.Opt
 import cn.sagacloud.android.cadengine.types.Wall
 import com.sybotan.android.graphy.SGraphyItem
 

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

@@ -5,7 +5,7 @@ import android.graphics.Paint
 import android.graphics.Path
 import android.graphics.RectF
 import cn.sagacloud.android.cadengine.types.Window
-import cn.sagacloud.android.cadengine.types.Opt
+import cn.sagacloud.android.cadengine.Opt
 import com.sybotan.android.graphy.SGraphyItem
 
 /**

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

@@ -9,7 +9,7 @@ import android.graphics.PointF
  */
 class Place {
     /** 定位点 */
-    var point: ArrayList<PointF>? = null
+    var points: ArrayList<PointF>? = null
     /** 类型 */
     var type: String? = null
 } // Class Place