Quellcode durchsuchen

feat 射线法改为jts包方法判断

lihao1 vor 3 Jahren
Ursprung
Commit
4d0a066f37
21 geänderte Dateien mit 232 neuen und 569 gelöschten Zeilen
  1. 3 0
      demo/build.gradle
  2. 0 3
      demo/src/main/AndroidManifest.xml
  3. 1 1
      demo/src/main/java/com/framework/app/Constants.kt
  4. 1 1
      demo/src/main/java/com/sybotan/android/demo/activities/ChooseSpaceActivity.kt
  5. 0 1
      demo/src/main/java/com/sybotan/android/demo/activities/EquipDetailActivity.kt
  6. 23 30
      demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt
  7. 1 1
      demo/src/main/java/com/sybotan/android/demo/activities/ServeAreaActivity.kt
  8. 40 12
      demo/src/main/java/com/sybotan/android/demo/activities/Space3DActivity.kt
  9. 3 0
      demo/src/main/java/com/sybotan/android/demo/activities/SpaceDeliveryCodeActivity.kt
  10. 0 1
      demo/src/main/java/com/sybotan/android/demo/activities/SpaceMapActivity.kt
  11. 0 247
      demo/src/main/java/com/sybotan/android/demo/activities/poc/RelationActivity.kt
  12. 22 0
      demo/src/main/java/com/sybotan/android/demo/bean/SpaceData3D.java
  13. 45 37
      cadengine/src/main/java/cn/sagacloud/android/cadengine/Lasso.kt
  14. 20 16
      demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.kt
  15. 0 79
      demo/src/main/java/com/sybotan/android/demo/viewmodel/RelationVM.kt
  16. 38 0
      demo/src/main/java/com/sybotan/android/demo/viewmodel/Space3DVM.kt
  17. 4 5
      demo/src/main/java/com/sybotan/android/demo/viewmodel/SpaceDeliveryCodeVM.kt
  18. 1 1
      demo/src/main/java/com/sybotan/android/demo/viewmodel/SpaceMapVM.kt
  19. 0 125
      demo/src/main/res/layout/activity_relation.xml
  20. 28 7
      demo/src/main/res/layout/activity_space3_dactivity.xml
  21. 2 2
      gradle.properties

+ 3 - 0
demo/build.gradle

@@ -56,6 +56,9 @@ android {
                 arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
             }
         }
+        dataBinding {
+            enabled true
+        }
     }
 
     signingConfigs {

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

@@ -78,9 +78,6 @@
             </intent-filter>
         </activity>
         <activity
-            android:name=".activities.poc.RelationActivity"
-            android:exported="true" />
-        <activity
             android:name=".activities.poc.RecordInfoActivity"
             android:exported="true" />
         <activity

+ 1 - 1
demo/src/main/java/com/framework/app/Constants.kt

@@ -11,7 +11,7 @@ const val tencentIP = "http://82.157.28.170:8876/"
 
 const val JdIP = "http://82.157.151.123/adm-poc-backend/"
 
-const val IP = JdIP
+const val IP = test2IP
 
 const val devFileServiceUrl = "http://develop.persagy.com/image-service/"
 

+ 1 - 1
demo/src/main/java/com/sybotan/android/demo/activities/ChooseSpaceActivity.kt

@@ -29,7 +29,6 @@ import android.os.Bundle
 import android.view.Gravity
 import android.widget.*
 import cn.sagacloud.android.cadengine.FloorScene
-import cn.sagacloud.android.cadengine.Lasso
 import cn.sagacloud.android.cadengine.items.*
 import cn.sagacloud.android.cadengine.types.*
 import com.framework.mvvm.model.db.entity.task.ObjectEntity
@@ -42,6 +41,7 @@ import com.sybotan.android.demo.bean.result.*
 import com.sybotan.android.demo.entitiies.Floor
 import com.sybotan.android.demo.retrofit.Constant
 import com.sybotan.android.demo.tools.CommonUtils
+import com.sybotan.android.demo.tools.Lasso
 import com.sybotan.android.demo.tools.ObjectNameUtils
 import com.sybotan.android.demo.tools.ToastUtils
 import com.sybotan.android.demo.view.SelectListSinglePopupWindow

+ 0 - 1
demo/src/main/java/com/sybotan/android/demo/activities/EquipDetailActivity.kt

@@ -28,7 +28,6 @@ import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import com.rm.rmswitch.RMSwitch
 import com.rm.rmswitch.RMTristateSwitch
-import com.sybotan.android.demo.activities.poc.RelationActivity
 import com.sybotan.android.demo.adapter.PictureAdapter
 import com.sybotan.android.demo.adapter.PipeExpandAdapter
 import com.sybotan.android.demo.adapter.RelationExpandAdapter

+ 23 - 30
demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt

@@ -49,7 +49,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import cn.hutool.core.collection.CollectionUtil
 import cn.sagacloud.android.cadengine.FloorScene
-import cn.sagacloud.android.cadengine.Lasso
 import cn.sagacloud.android.cadengine.Opt
 import cn.sagacloud.android.cadengine.items.*
 import cn.sagacloud.android.cadengine.types.*
@@ -69,7 +68,6 @@ import com.lzy.okgo.OkGo
 import com.lzy.okgo.callback.FileCallback
 import com.lzy.okgo.model.Response
 import com.sybotan.android.demo.R
-import com.sybotan.android.demo.activities.poc.RelationActivity
 import com.sybotan.android.demo.adapter.PictureAdapter
 import com.sybotan.android.demo.adapter.PipeAdapter
 import com.sybotan.android.demo.bean.ReLoactionEventBus
@@ -1208,15 +1206,6 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
 //        problemPicRecycler.adapter = pictureAdapter
     }
 
-    private fun skipRelationship(code: String, type: String) {
-        val intent = Intent(this, RelationActivity::class.java)
-        val bundle = Bundle()
-        bundle.putString("spaceId", scene.choseSpace!!.data.id)
-        bundle.putString("code", code)
-        bundle.putString("type", type)
-        intent.putExtra("params", bundle)
-        startActivity(intent)
-    }
 
     /**
      * 初始化viewModel
@@ -1470,10 +1459,12 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                 val childIterator = item.children.iterator()
                 while (childIterator.hasNext()) {
                     val child = childIterator.next()
-                    var position = gson.fromJson(child.position, Position::class.java)
-                    val isContain = Lasso.isPolygonContainsPoint(scene.choseSpace!!.mPoints, android.graphics.Point(position.x.toFloat().toInt(), position.y.toFloat().toInt()))
-                    if (!isContain) {
-                        childIterator.remove()
+                    if (child.position != null) {
+                        var position = gson.fromJson(child.position, Position::class.java)
+                        val isContain = Lasso.isPolygonContainsPoint(scene.choseSpace!!.mPoints, android.graphics.Point(position.x.toFloat().toInt(), position.y.toFloat().toInt()))
+                        if (!isContain) {
+                            childIterator.remove()
+                        }
                     }
                 }
                 if (CommonUtils.IsNull(item.children)) {
@@ -1612,21 +1603,23 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
         for (model in list) {
             if (!model.children.isEmpty() && (!model.isCheck || checkAll.isChecked)) {
                 for (child in model.children) {
-                    val position = gson.fromJson(child.position, Position::class.java)
-                    val point = Point()
-                    point.mX = position.x.toFloat()
-                    point.mY = -position.y.toFloat()
-                    val isContains = Lasso.isPolygonContainsPoint(scene.choseSpace!!.mPoints, android.graphics.Point(point.mX.toInt(), -point.mY.toInt()))
-                    point.remark = child.remark
-                    point.type = model.type
-                    point.equipState = child.type
-                    point.name = child.name
-                    point.equipType = child.type
-                    point.position = child.position
-                    point.deviceId = child.deviceId
-                    point.digitalDeliveryID = child.digitalDeliveryID
-                    if (((onlySpace.isChecked && isContains) || !onlySpace.isChecked) && (TextUtils.isEmpty(major) || point.type!!.startsWith(major))) {
-                        graphyHelper.addEquip(point)
+                    if (child.position != null) {
+                        val position = gson.fromJson(child.position, Position::class.java)
+                        val point = Point()
+                        point.mX = position.x.toFloat()
+                        point.mY = -position.y.toFloat()
+                        val isContains = Lasso.isPolygonContainsPoint(scene.choseSpace!!.mPoints, android.graphics.Point(point.mX.toInt(), -point.mY.toInt()))
+                        point.remark = child.remark
+                        point.type = model.type
+                        point.equipState = child.type
+                        point.name = child.name
+                        point.equipType = child.type
+                        point.position = child.position
+                        point.deviceId = child.deviceId
+                        point.digitalDeliveryID = child.digitalDeliveryID
+                        if (((onlySpace.isChecked && isContains) || !onlySpace.isChecked) && (TextUtils.isEmpty(major) || point.type!!.startsWith(major))) {
+                            graphyHelper.addEquip(point)
+                        }
                     }
                 }
             }

+ 1 - 1
demo/src/main/java/com/sybotan/android/demo/activities/ServeAreaActivity.kt

@@ -33,7 +33,6 @@ import android.widget.RadioButton
 import android.widget.TextView
 import androidx.appcompat.app.AlertDialog
 import cn.sagacloud.android.cadengine.FloorScene
-import cn.sagacloud.android.cadengine.Lasso
 import cn.sagacloud.android.cadengine.Opt
 import cn.sagacloud.android.cadengine.items.*
 import cn.sagacloud.android.cadengine.types.*
@@ -43,6 +42,7 @@ import com.sybotan.android.demo.R
 import com.sybotan.android.demo.bean.result.*
 import com.sybotan.android.demo.graphy.GraphyHelper
 import com.sybotan.android.demo.tools.CommonUtils
+import com.sybotan.android.demo.tools.Lasso
 import com.sybotan.android.demo.tools.ToastUtils
 import com.sybotan.android.demo.viewmodel.GraphyVM
 import com.sybotan.android.demo.viewmodel.SpaceMapVM

+ 40 - 12
demo/src/main/java/com/sybotan/android/demo/activities/Space3DActivity.kt

@@ -6,18 +6,36 @@ import android.webkit.JavascriptInterface
 import android.webkit.WebSettings
 import android.webkit.WebView
 import android.webkit.WebViewClient
+import android.widget.TextView
+import androidx.databinding.DataBindingUtil
+import cn.sagacloud.android.cadengine.types.FloorData
+import com.google.gson.Gson
 import com.sybotan.android.demo.R
+import com.sybotan.android.demo.bean.SpaceData3D
 import com.sybotan.android.demo.bean.model3d.MeshObject
+import com.sybotan.android.demo.databinding.ActivitySpace3DactivityBinding
 import com.sybotan.android.demo.tools.ToastUtils
+import com.sybotan.android.demo.viewmodel.ChooseSpaceVM
+import com.sybotan.android.demo.viewmodel.GraphyVM
+import com.sybotan.android.demo.viewmodel.Space3DVM
+import com.sybotan.base.utils.SJsonUtil
+import org.kodein.di.DI
+import org.kodein.di.DIAware
+import org.kodein.di.android.closestDI
+import java.io.File
 import kotlin.reflect.jvm.internal.impl.load.kotlin.JvmType
 
-class Space3DActivity : AppCompatActivity() {
+class Space3DActivity : BaseActivity(), DIAware {
+
+    override val di: DI by closestDI()
+    lateinit var viewModel: Space3DVM
 
     private lateinit var webview: WebView
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_space3_dactivity)
-        webview = findViewById(R.id.webview)
+//        setContentView(R.layout.activity_space3_dactivity)
+        val da = DataBindingUtil.setContentView<ActivitySpace3DactivityBinding>(this, R.layout.activity_space3_dactivity)
+        webview = da.webview
         webview.clearCache(true)
         val settings: WebSettings = webview.settings
         settings.javaScriptEnabled = true
@@ -33,17 +51,27 @@ class Space3DActivity : AppCompatActivity() {
         webview.addJavascriptInterface(this, "android")
         webview.webViewClient = MyWebViewClient()
         webview.loadUrl("http://60.205.177.43:8000/APP/#/?PageType=1")
+
+
+        val mapFile = File("/storage/emulated/0/Android/data/com.sybotan.android.demo/files/floorMap/Fl99099900021206b35236df4465845b9dae69ae45bf")
+        val map = mapFile.bufferedReader().use { it.readText() }
+        val floorData = SJsonUtil.fromJson(map, FloorData::class.java)
+        da.click.setOnClickListener {
+//            webview.loadUrl("javascript:GetInitSceneData(${map})")
+//            webview.loadUrl("javascript:GetInitSceneData(" + "12345" + ")")
+            viewModel.getFloorSpace()
+            webview.loadUrl("javascript:OpenTestData()")
+            webview.loadUrl("javascript:LoadAllModelWithFloor()")
+
+
+        }
+        viewModel = Space3DVM(this.application, { name, param ->
+            when (name) {
+
+            }
+        }, this)
     }
 
-//    @JavascriptInterface
-//    fun MeshClick(meshObject: Any) {
-//        runOnUiThread {
-//            if (meshObject is MeshObject) {
-//                val mo = meshObject as MeshObject
-//                ToastUtils.showMyToast("选中了ID:${mo.ID}")
-//            }
-//        }
-//    }
 
     @JavascriptInterface
     fun MeshClick(meshObject: String) {

+ 3 - 0
demo/src/main/java/com/sybotan/android/demo/activities/SpaceDeliveryCodeActivity.kt

@@ -14,6 +14,9 @@ import org.kodein.di.DI
 import org.kodein.di.DIAware
 import org.kodein.di.android.closestDI
 
+/**
+ * 空间数字化编码
+ */
 class SpaceDeliveryCodeActivity : BaseActivity(), DIAware {
 
     override val di: DI by closestDI()

+ 0 - 1
demo/src/main/java/com/sybotan/android/demo/activities/SpaceMapActivity.kt

@@ -41,7 +41,6 @@ import androidx.appcompat.widget.LinearLayoutCompat
 import androidx.core.content.ContextCompat
 import androidx.recyclerview.widget.GridLayoutManager
 import cn.sagacloud.android.cadengine.FloorScene
-import cn.sagacloud.android.cadengine.Lasso
 import cn.sagacloud.android.cadengine.Opt
 import cn.sagacloud.android.cadengine.items.*
 import cn.sagacloud.android.cadengine.types.*

+ 0 - 247
demo/src/main/java/com/sybotan/android/demo/activities/poc/RelationActivity.kt

@@ -1,247 +0,0 @@
-package com.sybotan.android.demo.activities.poc
-
-import android.os.Bundle
-import android.view.View
-import android.widget.Button
-import android.widget.ImageView
-import android.widget.ListView
-import android.widget.TextView
-import com.sybotan.android.demo.R
-import com.sybotan.android.demo.activities.BaseActivity
-import com.sybotan.android.demo.adapter.RelationAdapter
-import com.sybotan.android.demo.adapter.ServerRelAdapter
-import com.sybotan.android.demo.adapter.SpacePipeAdapter
-import com.sybotan.android.demo.bean.request.ReqEqToEqRel
-import com.sybotan.android.demo.bean.request.ReqEqToRel
-import com.sybotan.android.demo.entitiies.RelationEq
-import com.sybotan.android.demo.entitiies.SpacePipe
-import com.sybotan.android.demo.retrofit.BaseViewModelInterface
-import com.sybotan.android.demo.viewmodel.RelationVM
-
-
-class RelationActivity : BaseActivity() {
-    companion object {
-        // 设备服务于空间
-        const val EQ_SP_SERVE = "eq_sp_serve"
-
-        // 设备 阀门 设备
-        const val EQ_EQ_VV = "eq_eq_vv"
-
-        // 设备 控制 设备
-        const val EQ_EQ_CTRL = "eq_eq_ctrl"
-
-        // 设备 供电 设备
-        const val EQ_EQ_POWER = "eq_eq_power"
-
-        // 设备 测量 设备
-        const val EQ_EQ_SS = "eq_eq_ss"
-
-        // 设备连接管道
-        const val EQ_PIPE_CNCT = "eq_pipe_cnct"
-
-        // 设备服务于空间
-        const val TYPE_EQ_SP = "eq_sp"
-
-        // 设备与设备之间的关系
-        const val TYPE_EQ_EQ = "eq_eq"
-
-        // 设备与管道之间的关系
-        const val TYPE_EQ_PIPE = "eq_pipe"
-    }
-
-    private lateinit var mSpaceId: String
-    private lateinit var mMajorTv: TextView
-    private lateinit var mMinorTv: TextView
-
-    private lateinit var mMajorLv: ListView
-    private lateinit var mMinorLv: ListView
-
-    private lateinit var mAddBtn: Button
-    private lateinit var type: String
-    private lateinit var code: String
-
-    private lateinit var mBackIv: ImageView
-    private lateinit var mTitleTv: TextView
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_relation)
-        findView()
-        initView()
-        initViewModel()
-        setListener()
-    }
-
-    private fun findView() {
-        mBackIv = findViewById(R.id.backIv)
-        mTitleTv = findViewById(R.id.titleTv)
-        mAddBtn = findViewById(R.id.addBtn)
-        mMajorTv = findViewById(R.id.majorTv)
-        mMajorLv = findViewById(R.id.majorLv)
-        mMajorLv.divider = null
-        mMinorTv = findViewById(R.id.minorTv)
-        mMinorLv = findViewById(R.id.minorLv)
-        mMinorLv.divider = null
-    }
-
-    private fun initView() {
-        val bundle = intent.getBundleExtra("params")
-        mSpaceId = bundle?.getString("spaceId") ?: ""
-        type = bundle?.getString("type") ?: ""
-        code = bundle?.getString("code") ?: ""
-        println("code: $code")
-        when (code) {
-            EQ_SP_SERVE -> {
-                mMinorTv.visibility = View.GONE
-                mMinorLv.visibility = View.GONE
-                mMajorTv.visibility = View.GONE
-                mTitleTv.text = "选择服务于当前空间的设备"
-            }
-
-            EQ_EQ_VV -> {
-                mMinorTv.visibility = View.VISIBLE
-                mMinorLv.visibility = View.VISIBLE
-                mMajorTv.visibility = View.VISIBLE
-                mMajorTv.text = "主"
-                mMinorTv.text = "从"
-                mTitleTv.text = "当前空间内设备与设备(阀门)"
-            }
-
-            EQ_EQ_CTRL -> {
-                mMinorTv.visibility = View.VISIBLE
-                mMinorLv.visibility = View.VISIBLE
-                mMajorTv.visibility = View.VISIBLE
-                mMajorTv.text = "主"
-                mMinorTv.text = "从"
-                mTitleTv.text = "当前空间内设备与设备(控制)"
-
-            }
-            EQ_EQ_POWER -> {
-                mMinorTv.visibility = View.VISIBLE
-                mMinorLv.visibility = View.VISIBLE
-                mMajorTv.visibility = View.VISIBLE
-                mMajorTv.text = "主"
-                mMinorTv.text = "从"
-                mTitleTv.text = "当前空间内设备与设备(电量)"
-            }
-            EQ_EQ_SS -> {
-                mMinorTv.visibility = View.VISIBLE
-                mMinorLv.visibility = View.VISIBLE
-                mMajorTv.visibility = View.VISIBLE
-                mMajorTv.text = "主"
-                mMinorTv.text = "从"
-                mTitleTv.text = "当前空间内设备与设备(测量)"
-            }
-
-            EQ_PIPE_CNCT -> {
-                mMinorTv.visibility = View.VISIBLE
-                mMinorLv.visibility = View.VISIBLE
-                mMajorTv.visibility = View.VISIBLE
-                mMajorTv.text = "设备"
-                mMinorTv.text = "管道类型"
-                mTitleTv.text = "当前空间内设备与管道"
-            }
-        }
-    }
-
-    private fun setListener() {
-
-        mAddBtn.setOnClickListener {
-            when (code) {
-                EQ_SP_SERVE -> {
-                    val list = serverRelEqs.map { it.deviceId }
-                    val rel = ReqEqToRel(eq_id = list, target_id = mSpaceId, rel = EQ_SP_SERVE)
-                    mVm.addEqToSer(rel)
-                }
-
-                EQ_EQ_SS, EQ_EQ_VV, EQ_EQ_CTRL, EQ_EQ_POWER -> {
-                    val rel = ReqEqToEqRel(
-                        eq_id = mMajorEqToEq?.deviceId ?: "",
-                        target_id = mMinorEqToEq?.deviceId ?: "",
-                        rel = code
-                    )
-                    mVm.addEqToEq(rel)
-                }
-
-                EQ_PIPE_CNCT -> {
-                    val rel = ReqEqToEqRel(
-                        eq_id = mMajorEqToEq?.deviceId ?: "",
-                        target_id = mPipe?.pipeId ?: "",
-                        rel = EQ_PIPE_CNCT
-                    )
-                    mVm.addEqToEq(rel)
-                }
-            }
-
-        }
-        mBackIv.setOnClickListener {
-            finish()
-        }
-    }
-
-
-    private var mEqs = mutableListOf<RelationEq>()
-    private var mPipes = mutableListOf<SpacePipe>()
-    private var serverRelEqs = mutableListOf<RelationEq>()
-
-    private lateinit var mVm: RelationVM
-    private var mMajorEqToEq: RelationEq? = null
-    private var mMinorEqToEq: RelationEq? = null
-    private var mPipe: SpacePipe? = null
-    private var mPipeVM: RelationVM? = null
-    private fun initViewModel() {
-        mVm = RelationVM(this.application, BaseViewModelInterface { name, params ->
-
-            when (name) {
-                EQ_SP_SERVE -> {
-                    val eqs = params as List<RelationEq>
-                    mEqs.clear()
-                    mEqs.addAll(eqs)
-                    val adapter = ServerRelAdapter(mEqs, this@RelationActivity) { eq ->
-                        serverRelEqs.clear()
-                        serverRelEqs.addAll(eq)
-                        println("serverRelEqs size : ${serverRelEqs.size}")
-                    }
-                    mMajorLv.setAdapter(adapter)
-                }
-
-                EQ_EQ_SS, EQ_EQ_VV, EQ_EQ_CTRL, EQ_EQ_POWER, EQ_PIPE_CNCT -> {
-                    val eqs = params as List<RelationEq>
-                    mEqs.clear()
-                    mEqs.addAll(eqs)
-                    val majorAdapter = RelationAdapter(mEqs, this@RelationActivity) { eq ->
-                        mMajorEqToEq = eq
-                    }
-                    mMajorLv.adapter = majorAdapter
-                    val minorAdapter = RelationAdapter(mEqs, this@RelationActivity) { eq ->
-                        mMinorEqToEq = eq
-                    }
-                    mMinorLv.adapter = minorAdapter
-
-                }
-
-            }
-
-        }, this)
-
-
-        mVm.getEqs(mSpaceId, code)
-
-        mPipeVM = RelationVM(this.application, BaseViewModelInterface { name, params ->
-            if (name == EQ_PIPE_CNCT) {
-                val pipes = params as List<SpacePipe>
-                println("pipes: $pipes")
-                mPipes.clear()
-                mPipes.addAll(pipes)
-                val pipeAdapter = SpacePipeAdapter(mPipes, this@RelationActivity) { pipe ->
-                    mPipe = pipe
-                }
-                mMinorLv.adapter = pipeAdapter
-            }
-        }, this)
-
-        if (code == EQ_PIPE_CNCT) {
-            mPipeVM?.getPipes(mSpaceId, code)
-        }
-    }
-}

+ 22 - 0
demo/src/main/java/com/sybotan/android/demo/bean/SpaceData3D.java

@@ -0,0 +1,22 @@
+package com.sybotan.android.demo.bean;
+
+import java.util.ArrayList;
+
+/**
+ * Created by lihao.
+ * Date: 2021/11/26
+ */
+public class SpaceData3D {
+    public ArrayList<ID> ID = new ArrayList<>();
+    public Style Style;
+
+    public static class ID{
+        public String ID;
+        public String OutLine;
+        public boolean IsShow;
+        public int SpaceHeight;
+    }
+    public static class Style{
+        public String color;
+    }
+}

+ 45 - 37
cadengine/src/main/java/cn/sagacloud/android/cadengine/Lasso.kt

@@ -1,4 +1,4 @@
-package cn.sagacloud.android.cadengine
+package com.sybotan.android.demo.tools
 
 import android.graphics.Point
 import android.graphics.PointF
@@ -7,6 +7,14 @@ import cn.sagacloud.android.cadengine.types.PointZ
 import kotlin.math.abs
 import kotlin.math.pow
 import kotlin.math.sqrt
+import org.locationtech.jts.geom.Polygon
+import org.locationtech.jts.geom.GeometryFactory
+import android.R.attr.y
+
+import android.R.attr.x
+import org.locationtech.jts.geom.Coordinate
+import java.lang.Exception
+
 
 /**
  * Created by lihao.
@@ -77,46 +85,46 @@ class Lasso {
 
     companion object {
         fun isPolygonContainsPoint(mPoints: List<PointF>, point: Point): Boolean {
-            var nCross = 0
-            for (i in mPoints.indices) {
-                val p1 = mPoints[i]
-                val p2 = mPoints[(i + 1) % mPoints.size]
-                // 取多边形任意一个边,做点point的水平延长线,求解与当前边的交点个数
-                // p1p2是水平线段,要么没有交点,要么有无限个交点
-                if (p1.y == p2.y) continue
-                // point 在p1p2 底部 --> 无交点
-                if (point.y < Math.min(p1.y, p2.y)) continue
-                // point 在p1p2 顶部 --> 无交点
-                if (point.y >= Math.max(p1.y, p2.y)) continue
-                // 求解 point点水平线与当前p1p2边的交点的 X 坐标
-                val x = ((point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x).toDouble()
-                if (x > point.x) // 当x=point.x时,说明point在p1p2线段上
-                    nCross++ // 只统计单边交点
-            }
-            // 单边交点为偶数,点在多边形之外 ---
-            return nCross % 2 == 1
+            val polygon = createPolygon(mPoints)
+
+            val coord = Coordinate(point.x.toDouble(), point.y.toDouble())
+            val geoPoint = geometryFactory.createPoint(coord)
+            return geoPoint.within(polygon)
+
+//            var nCross = 0
+//            for (i in mPoints.indices) {
+//                val p1 = mPoints[i]
+//                val p2 = mPoints[(i + 1) % mPoints.size]
+//                // 取多边形任意一个边,做点point的水平延长线,求解与当前边的交点个数
+//                // p1p2是水平线段,要么没有交点,要么有无限个交点
+//                if (p1.y == p2.y) continue
+//                // point 在p1p2 底部 --> 无交点
+//                if (point.y < Math.min(p1.y, p2.y)) continue
+//                // point 在p1p2 顶部 --> 无交点
+//                if (point.y >= Math.max(p1.y, p2.y)) continue
+//                // 求解 point点水平线与当前p1p2边的交点的 X 坐标
+//                val x = ((point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x).toDouble()
+//                if (x > point.x) // 当x=point.x时,说明point在p1p2线段上
+//                    nCross++ // 只统计单边交点
+//            }
+//            // 单边交点为偶数,点在多边形之外 ---
+//            return nCross % 2 == 1
         }
 
+        private val geometryFactory = GeometryFactory()
 
-        fun isPolygonContainsPointZ(mPoints: ArrayList<PointZ>, point: Point): Boolean {
-            var nCross = 0
-            for (i in mPoints.indices) {
-                val p1 = mPoints[i]
-                val p2 = mPoints[(i + 1) % mPoints.size]
-                // 取多边形任意一个边,做点point的水平延长线,求解与当前边的交点个数
-                // p1p2是水平线段,要么没有交点,要么有无限个交点
-                if (p1.y == p2.y) continue
-                // point 在p1p2 底部 --> 无交点
-                if (point.y < Math.min(p1.y, p2.y)) continue
-                // point 在p1p2 顶部 --> 无交点
-                if (point.y >= Math.max(p1.y, p2.y)) continue
-                // 求解 point点水平线与当前p1p2边的交点的 X 坐标
-                val x = ((point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x).toDouble()
-                if (x > point.x) // 当x=point.x时,说明point在p1p2线段上
-                    nCross++ // 只统计单边交点
+        fun createPolygon(xys: List<PointF>): Polygon? {
+            try {
+                val coords: Array<Coordinate?> = arrayOfNulls<Coordinate>(xys.size + 1)
+                for (i in xys.indices) {
+                    coords[i] = Coordinate(xys[i].x.toDouble(), xys[i].y.toDouble())
+                }
+                coords[xys.size] = Coordinate(xys[0].x.toDouble(), xys[0].y.toDouble())
+                return geometryFactory.createPolygon(coords)
+            } catch (e: Exception) {
+                e.printStackTrace()
             }
-            // 单边交点为偶数,点在多边形之外 ---
-            return nCross % 2 == 1
+            return geometryFactory.createPolygon()
         }
 
         /**

+ 20 - 16
demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.kt

@@ -5,7 +5,6 @@ import android.graphics.PointF
 import android.text.TextUtils
 import androidx.lifecycle.viewModelScope
 import cn.hutool.core.util.IdUtil
-import cn.sagacloud.android.cadengine.Lasso
 import cn.sagacloud.android.cadengine.items.SpaceItem
 import cn.sagacloud.android.cadengine.items.TunableSpaceItem
 import cn.sagacloud.android.cadengine.types.*
@@ -35,6 +34,7 @@ import java.util.*
 import kotlin.collections.ArrayList
 import kotlin.collections.HashMap
 import com.sybotan.android.demo.bean.*
+import com.sybotan.android.demo.tools.Lasso
 import com.sybotan.android.demo.tools.ObjectNameUtils
 import com.sybotan.base.extensions.toInt
 import java.io.File
@@ -80,7 +80,7 @@ class GraphyVM(
                 objectEntity?.let {
                     spaceJobModel.buildingId = buildingId
                     spaceJobModel.id = spaceEntity.spaceId
-                    spaceJobModel.localName =  ObjectNameUtils.getEquipName(objectEntity.infos)
+                    spaceJobModel.localName = ObjectNameUtils.getEquipName(objectEntity.infos)
                     spaceJobModel.name = objectEntity.name
                     spaceJobModel.projectId = projectId
                     val infos = gson.fromJson(objectEntity.infos, InfosForObj::class.java)
@@ -224,13 +224,15 @@ class GraphyVM(
                                 child.type = 3
                             }
                             val position = Position()
-                            position.x = infos.location.x().toString()
-                            position.y = infos.location.y().toString()
-                            val z = Z()
-                            z.offset = infos.location.z().toString()
-                            z.region = infos.zRegion
-                            position.z = z
-                            child.position = gson.toJson(position)
+                            if (infos.location != null) {
+                                position.x = infos.location.x().toString()
+                                position.y = infos.location.y().toString()
+                                val z = Z()
+                                z.offset = infos.location.z().toString()
+                                z.region = infos.zRegion
+                                position.z = z
+                                child.position = gson.toJson(position)
+                            }
                             model.children.add(child)
                         }
                     }
@@ -268,13 +270,15 @@ class GraphyVM(
                             child.type = 3
                         }
                         val position = Position()
-                        position.x = infos.location.x().toString()
-                        position.y = infos.location.y().toString()
-                        val z = Z()
-                        z.offset = infos.location.z().toString()
-                        z.region = infos.zRegion
-                        position.z = z
-                        child.position = gson.toJson(position)
+                        if (infos.location != null) {
+                            position.x = infos.location.x().toString()
+                            position.y = infos.location.y().toString()
+                            val z = Z()
+                            z.offset = infos.location.z().toString()
+                            z.region = infos.zRegion
+                            position.z = z
+                            child.position = gson.toJson(position)
+                        }
                         spaceModel.children.add(child)
                         models.add(spaceModel)
                     }

+ 0 - 79
demo/src/main/java/com/sybotan/android/demo/viewmodel/RelationVM.kt

@@ -1,79 +0,0 @@
-package com.sybotan.android.demo.viewmodel
-
-import android.app.Application
-import com.sybotan.android.demo.activities.BaseActivity
-import com.sybotan.android.demo.bean.request.ReqEqToEqRel
-import com.sybotan.android.demo.bean.request.ReqEqToRel
-import com.sybotan.android.demo.bean.request.ReqRelationEq
-import com.sybotan.android.demo.bean.result.ResEqRel
-import com.sybotan.android.demo.entitiies.RelationEq
-import com.sybotan.android.demo.entitiies.SpacePipe
-import com.sybotan.android.demo.retrofit.BaseObserver
-import com.sybotan.android.demo.retrofit.BaseViewModelInterface
-import com.sybotan.android.demo.retrofit.RetrofitFactory
-
-class RelationVM(app: Application, b: BaseViewModelInterface, a: BaseActivity) :
-    BaseViewModel(app, b, a) {
-    companion object {
-        // 设备服务于空间
-        const val EQ_SP_SERVE = "eq_sp_serve"
-
-        // 设备 阀门 设备
-        const val EQ_EQ_VV = "eq_eq_vv"
-
-        // 设备 控制 设备
-        const val EQ_EQ_CTRL = "EQ_EQ_CTRL"
-
-        // 设备 电量 设备
-        const val EQ_EQ_POWER = "EQ_EQ_POWER"
-
-        // 设备 测量 设备
-        const val EQ_EQ_SS = "EQ_EQ_SS"
-
-        // 设备连接管道
-        const val EQ_PIPE_CNCT = "EQ_PIPE_CNCT"
-    }
-
-    fun getEqs(spaceId: String, code: String) {
-        val req = ReqRelationEq(spaceId)
-        val observable = RetrofitFactory.getInstance().getRelationEqs(getRequestBody(req))
-        sendRequest(observable, object : BaseObserver<List<RelationEq>>(mActivity, this) {
-            override fun onSuccess(models: List<RelationEq>) {
-                mEmitter.SendDirective(code, models)
-            }
-        }, true)
-
-    }
-
-    fun getPipes(spaceId: String, code: String) {
-        val req = ReqRelationEq(spaceId)
-        val observable = RetrofitFactory.getInstance().getSpacePipe(getRequestBody(req))
-        sendRequest(observable, object : BaseObserver<List<SpacePipe>>(mActivity, this) {
-            override fun onSuccess(pipes: List<SpacePipe>) {
-                mEmitter.SendDirective(code, pipes)
-            }
-        }, true)
-
-    }
-
-
-    fun addEqToSer(rel: ReqEqToRel) {
-        val observable = RetrofitFactory.getInstance().addEqToSerRel(getRequestBody(rel))
-        this.sendRequest(observable, object : BaseObserver<ResEqRel>(mActivity, this) {
-            override fun onSuccess(t: ResEqRel?) {
-                mActivity.finish()
-            }
-        }, true)
-    }
-
-    fun addEqToEq(rel: ReqEqToEqRel) {
-        val observable = RetrofitFactory.getInstance().addEqToEqRel(getRequestBody(rel))
-        this.sendRequest(observable, object : BaseObserver<ResEqRel>(mActivity, this) {
-            override fun onSuccess(t: ResEqRel?) {
-                mActivity.finish()
-            }
-        }, true)
-    }
-
-
-}

+ 38 - 0
demo/src/main/java/com/sybotan/android/demo/viewmodel/Space3DVM.kt

@@ -0,0 +1,38 @@
+package com.sybotan.android.demo.viewmodel
+
+import android.app.Application
+import androidx.lifecycle.viewModelScope
+import com.framework.mvvm.model.repository.AdmRepository
+import com.google.gson.Gson
+import com.sybotan.android.demo.activities.BaseActivity
+import com.sybotan.android.demo.retrofit.BaseViewModelInterface
+import kotlinx.coroutines.launch
+import org.kodein.di.DI
+import org.kodein.di.DIAware
+import org.kodein.di.android.x.closestDI
+import org.kodein.di.instance
+
+
+/**
+ * Created by lihao.
+ * Date: 2021/6/9
+ */
+class Space3DVM(
+    app: Application,
+    b: BaseViewModelInterface?, activity: BaseActivity?, //建筑id
+) : BaseViewModel(app, b, activity), DIAware {
+    private val gson = Gson()
+
+    override val di: DI by closestDI()
+    val repo: AdmRepository by instance()
+
+    fun getFloorSpace() {
+        viewModelScope.launch {
+//            repo.getSpaceByFloorId()
+        }
+    }
+
+    companion object {
+        const val FLOOR_SPACE = "FLOOR_SPACE"
+    }
+}

+ 4 - 5
demo/src/main/java/com/sybotan/android/demo/viewmodel/SpaceDeliveryCodeVM.kt

@@ -3,7 +3,6 @@ package com.sybotan.android.demo.viewmodel
 import android.app.Activity
 import android.app.Application
 import android.content.Intent
-import android.os.Bundle
 import android.text.TextUtils
 import androidx.lifecycle.viewModelScope
 import com.framework.mvvm.model.db.entity.task.*
@@ -12,7 +11,6 @@ import com.google.gson.Gson
 import com.sybotan.android.demo.activities.BaseActivity
 import com.sybotan.android.demo.retrofit.BaseViewModelInterface
 import com.sybotan.android.demo.tools.ToastUtils
-import com.zbar.lib.CaptureActivity
 import kotlinx.coroutines.launch
 import org.kodein.di.DI
 import org.kodein.di.DIAware
@@ -23,6 +21,7 @@ import org.kodein.di.instance
 /**
  * Created by lihao.
  * Date: 2021/6/9
+ * 空间数字化编码
  */
 class SpaceDeliveryCodeVM(
     app: Application,
@@ -70,8 +69,8 @@ class SpaceDeliveryCodeVM(
         viewModelScope.launch {
             val spaces = repo.getObjectByObjType("space")
             for (space in spaces) {
-                if (space.infos != null && !space.infos!!.asJsonObject.keySet().isEmpty()) {
-                    val hashMap = gson.fromJson(space.infos, HashMap::class.java) as HashMap<String, Any>
+                if (space.infos != null && space.infos!!.asJsonObject.keySet().isNotEmpty()) {
+                    val hashMap = gson.fromJson(space.infos, HashMap::class.java) as HashMap<*, *>
                     if (hashMap != null && hashMap["digitalDeliveryID"] != null && !TextUtils.isEmpty(hashMap["digitalDeliveryID"].toString())) {
                         if (hashMap["digitalDeliveryID"].toString() == "$content1-RM$content2" && space.id != spaceId) {
                             ToastUtils.showMyToast("数字化交付编码重复!")
@@ -83,7 +82,7 @@ class SpaceDeliveryCodeVM(
             val spaceEntity = repo.getObject(spaceId)
             if (spaceEntity != null) {
                 val hashMap = gson.fromJson(spaceEntity.infos, HashMap::class.java) as HashMap<String, Any>
-                hashMap.put("digitalDeliveryID", "$content1-RM$content2")
+                hashMap["digitalDeliveryID"] = "$content1-RM$content2"
                 spaceEntity.infos = gson.toJsonTree(hashMap)
                 repo.insObject(spaceEntity)
             }

+ 1 - 1
demo/src/main/java/com/sybotan/android/demo/viewmodel/SpaceMapVM.kt

@@ -5,7 +5,6 @@ import android.graphics.PointF
 import android.text.TextUtils
 import androidx.lifecycle.viewModelScope
 import cn.hutool.core.util.IdUtil
-import cn.sagacloud.android.cadengine.Lasso
 import cn.sagacloud.android.cadengine.items.PipeLineItem
 import cn.sagacloud.android.cadengine.items.PointItem
 import cn.sagacloud.android.cadengine.items.TunableSpaceItem
@@ -22,6 +21,7 @@ import com.sybotan.android.demo.activities.BaseActivity
 import com.sybotan.android.demo.bean.result.*
 import com.sybotan.android.demo.retrofit.BaseViewModelInterface
 import com.sybotan.android.demo.tools.CommonUtils
+import com.sybotan.android.demo.tools.Lasso
 import com.sybotan.android.demo.tools.ObjectNameUtils
 import com.sybotan.android.demo.tools.ToastUtils
 import com.sybotan.base.utils.SJsonUtil

+ 0 - 125
demo/src/main/res/layout/activity_relation.xml

@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout
-        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"
-        tools:context=".activities.poc.RelationActivity">
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-            android:id="@+id/topBarTv"
-            android:layout_width="match_parent"
-            android:layout_height="48dp"
-            android:background="@color/blue_500"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent">
-
-        <ImageView
-                android:id="@+id/backIv"
-                android:layout_width="24dp"
-                android:layout_height="24dp"
-                android:layout_marginStart="16dp"
-                android:contentDescription="back"
-                android:src="@drawable/ic_round_arrow_back_24"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent"/>
-
-        <TextView
-                android:id="@+id/titleTv"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="空间结构核查"
-                android:textColor="@color/black_272727"
-                android:textSize="18sp"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent"/>
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-            android:id="@+id/relationCl"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            app:layout_constraintTop_toBottomOf="@id/topBarTv"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintBottom_toTopOf="@+id/addBtn"
-    >
-
-        <TextView
-                android:id="@+id/majorTv"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="major"
-                android:textSize="20sp"
-                android:textColor="@color/black_272727"
-                app:layout_constraintBottom_toTopOf="@id/majorLv"
-                android:layout_marginTop="16dp"
-                android:layout_marginStart="16dp"
-                app:layout_constraintTop_toTopOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-        />
-
-        <ListView
-                android:id="@+id/majorLv"
-                android:layout_width="0dp"
-                android:layout_height="0dp"
-                android:layout_marginStart="16dp"
-                android:layout_marginTop="16dp"
-                android:layout_marginEnd="16dp"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/majorTv"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintBottom_toTopOf="@id/minorTv"
-                tools:listitem="@layout/item_relation"
-        />
-
-        <TextView
-                android:id="@+id/minorTv"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
-                android:text="minor"
-                android:textSize="20sp"
-                android:textColor="@color/black_272727"
-                app:layout_constraintStart_toStartOf="@id/majorLv"
-                app:layout_constraintTop_toBottomOf="@id/majorLv"
-                app:layout_constraintBottom_toTopOf="@+id/minorLv"
-        />
-
-        <ListView
-                android:id="@+id/minorLv"
-                android:layout_width="0dp"
-                android:layout_height="0dp"
-                android:layout_marginTop="16dp"
-                android:layout_marginEnd="16dp"
-                app:layout_constraintStart_toStartOf="@id/minorTv"
-                app:layout_constraintTop_toBottomOf="@id/minorTv"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintBottom_toBottomOf="parent"
-                tools:listitem="@layout/item_relation"
-        />
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-    <Button
-            android:id="@+id/addBtn"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="32dp"
-            android:layout_marginEnd="32dp"
-            android:layout_marginBottom="16dp"
-            android:layout_marginTop="16dp"
-            android:text="添加"
-            android:textSize="18sp"
-            android:textColor="@color/black_272727"
-            app:layout_constraintTop_toBottomOf="@id/relationCl"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintBottom_toBottomOf="parent"
-    />
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 28 - 7
demo/src/main/res/layout/activity_space3_dactivity.xml

@@ -1,10 +1,31 @@
 <?xml version="1.0" encoding="utf-8"?>
-<WebView xmlns:android="http://schemas.android.com/apk/res/android"
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/webview"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".activities.Space3DActivity">
+    xmlns:tools="http://schemas.android.com/tools">
 
-</WebView>
+    <data>
+
+    </data>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        tools:context=".activities.Space3DActivity">
+
+        <WebView
+            android:id="@+id/webview"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            tools:context=".activities.Space3DActivity"></WebView>
+
+        <TextView
+            android:id="@+id/click"
+            android:background="@color/white_ffffff"
+            android:textColor="@color/black_272727"
+            android:padding="5dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:text="click" />
+    </RelativeLayout>
+</layout>

+ 2 - 2
gradle.properties

@@ -17,14 +17,14 @@ SAGA_SERVICE_VERSION=1.4.140
 MAVEN_REPO_RELEASE_URL=http\://dev.dp.sagacloud.cn\:8082/repository/maven-releases/
 EVENTBUS_VERSION=3.1.1
 EASYPERMISSIONS_VERSION=1.2.0
-SAGA_ANDROID_VERSION=1.0.1
+SAGA_ANDROID_VERSION=1.0.2
 JUNIT_VERSION=5.3.1
 KOTLIN_VERSION=1.5.31
 SAGA_GROUP=cn.sagacloud
 SYBOTAN_KOTLIN_VERSION=1.2.42
 android.useAndroidX=true
 LICENSE_NAME=The Apache Software License, Version 2.0
-SAGA_CODE=13
+SAGA_CODE=14
 MAVEN_REPO_SNAPSHOT_URL=http\://dev.dp.sagacloud.cn\:8082/repository/maven-snapshots/
 NEXUS_USERNAME=saga
 DEVELOPER_ID=Andy.Sybotan