Browse Source

@fun 3D土建精装

lihao1 3 years ago
parent
commit
92849abe1c
61 changed files with 2401 additions and 1 deletions
  1. 11 1
      app/src/main/AndroidManifest.xml
  2. 5 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/FunctionEndBlockModel.kt
  3. 7 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/InfosforFloor.kt
  4. 10 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/MeshObjectModel.kt
  5. 15 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/PageParam.java
  6. 30 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/PointZ.java
  7. 25 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/ProblemType.java
  8. 7 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/SetFloorPathModel.kt
  9. 25 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/SpaceData3D.java
  10. 12 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/SpaceInfo.java
  11. 10 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/TipArray.java
  12. 213 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/examine/ModelExamineActivity.kt
  13. 281 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/examine/ModelExamineScreen.kt
  14. 9 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/examine/ProblemTypeHelper.kt
  15. 803 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/ui/examine/Space3DActivity.kt
  16. 5 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/examine/Space3DRepository.kt
  17. 5 0
      app/src/main/java/com/ys/bdtp/adm/mvvm/vm/examine/Space3DViewModel.kt
  18. 74 0
      app/src/main/res/drawable-xhdpi/ic_launcher_background.xml
  19. BIN
      app/src/main/res/drawable-xxhdpi/icon_angle.png
  20. BIN
      app/src/main/res/drawable-xxhdpi/icon_angle_blue.png
  21. BIN
      app/src/main/res/drawable-xxhdpi/icon_arrow_down.png
  22. BIN
      app/src/main/res/drawable-xxhdpi/icon_back.png
  23. BIN
      app/src/main/res/drawable-xxhdpi/icon_close_blue.png
  24. BIN
      app/src/main/res/drawable-xxhdpi/icon_close_white.png
  25. BIN
      app/src/main/res/drawable-xxhdpi/icon_compass.png
  26. BIN
      app/src/main/res/drawable-xxhdpi/icon_compass_blue.png
  27. BIN
      app/src/main/res/drawable-xxhdpi/icon_degree.png
  28. BIN
      app/src/main/res/drawable-xxhdpi/icon_degree_blue.png
  29. BIN
      app/src/main/res/drawable-xxhdpi/icon_delete.png
  30. BIN
      app/src/main/res/drawable-xxhdpi/icon_delete_blue.png
  31. BIN
      app/src/main/res/drawable-xxhdpi/icon_delete_white.png
  32. BIN
      app/src/main/res/drawable-xxhdpi/icon_head.png
  33. BIN
      app/src/main/res/drawable-xxhdpi/icon_lock.png
  34. BIN
      app/src/main/res/drawable-xxhdpi/icon_lock_blue.png
  35. BIN
      app/src/main/res/drawable-xxhdpi/icon_message.png
  36. BIN
      app/src/main/res/drawable-xxhdpi/icon_overall_blue.png
  37. BIN
      app/src/main/res/drawable-xxhdpi/icon_overall_white.png
  38. BIN
      app/src/main/res/drawable-xxhdpi/icon_pline_blue.png
  39. BIN
      app/src/main/res/drawable-xxhdpi/icon_pline_white.png
  40. BIN
      app/src/main/res/drawable-xxhdpi/icon_point_blue.png
  41. BIN
      app/src/main/res/drawable-xxhdpi/icon_point_white.png
  42. BIN
      app/src/main/res/drawable-xxhdpi/icon_quit.png
  43. BIN
      app/src/main/res/drawable-xxhdpi/icon_record_blue.png
  44. BIN
      app/src/main/res/drawable-xxhdpi/icon_record_white.png
  45. BIN
      app/src/main/res/drawable-xxhdpi/icon_save_blue.png
  46. BIN
      app/src/main/res/drawable-xxhdpi/icon_save_white.png
  47. BIN
      app/src/main/res/drawable-xxhdpi/icon_vertical.png
  48. BIN
      app/src/main/res/drawable-xxhdpi/icon_vertical_blue.png
  49. 6 0
      app/src/main/res/drawable/bg_black_round.xml
  50. 6 0
      app/src/main/res/drawable/bg_blue_e1f2ff_round.xml
  51. 6 0
      app/src/main/res/drawable/bg_blue_round.xml
  52. 10 0
      app/src/main/res/drawable/bg_c3c7cb_left_round.xml
  53. 10 0
      app/src/main/res/drawable/bg_c3c7cb_right_round.xml
  54. 6 0
      app/src/main/res/drawable/bg_gray_eff0f1.xml
  55. 4 0
      app/src/main/res/drawable/bg_red_round.xml
  56. 5 0
      app/src/main/res/drawable/bg_round_c3c7cb.xml
  57. 9 0
      app/src/main/res/drawable/bg_white_round.xml
  58. 5 0
      app/src/main/res/drawable/btn_select_bg.xml
  59. 778 0
      app/src/main/res/layout/activity_space3d_activity.xml
  60. 5 0
      app/src/main/res/values/colors.xml
  61. 4 0
      app/src/main/res/xml/network_security_config.xml

+ 11 - 1
app/src/main/AndroidManifest.xml

@@ -10,14 +10,24 @@
             android:label="@string/app_name"
             android:name=".AdmApplication"
             android:roundIcon="@mipmap/ic_launcher_round"
-            android:supportsRtl="true"
             android:usesCleartextTraffic="true"
+            android:supportsRtl="true"
             android:theme="@style/Theme.Adm">
         <activity
                 android:name=".MainActivity"
                 android:exported="true"
                 android:label="@string/app_name"
+                android:networkSecurityConfig="@xml/network_security_config"
                 android:theme="@style/Theme.Adm.NoActionBar">
+            <!--            <intent-filter>-->
+            <!--                <action android:name="android.intent.action.MAIN"/>-->
+
+            <!--                <category android:name="android.intent.category.LAUNCHER"/>-->
+            <!--            </intent-filter>-->
+        </activity>
+
+<!--        <activity android:name=".mvvm.ui.examine.ModelExamineActivity" android:exported="true"/>-->
+        <activity android:name=".mvvm.ui.examine.Space3DActivity" android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
 

+ 5 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/FunctionEndBlockModel.kt

@@ -0,0 +1,5 @@
+package com.ys.bdtp.adm.mvvm.model.vo
+
+data class FunctionEndBlockModel(
+    val Name: String
+)

+ 7 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/InfosforFloor.kt

@@ -0,0 +1,7 @@
+package com.ys.bdtp.adm.mvvm.model.vo
+
+data class InfosforFloor(
+    val digitalDeliveryID: String,
+    val bimIdPre: String,
+    val floorElevation: Double,
+)

+ 10 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/MeshObjectModel.kt

@@ -0,0 +1,10 @@
+package com.ys.bdtp.adm.mvvm.model.vo
+
+/**
+ * 模型选中回调函数
+ */
+data class MeshObjectModel(
+    val ID: String,//模型ID
+    val Type: String,//Build 建筑 Space 空间  Other 设备或者管道
+    val SystemType: String,
+)

+ 15 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/PageParam.java

@@ -0,0 +1,15 @@
+package com.ys.bdtp.adm.mvvm.model.vo;
+
+/**
+ * Created by lihao.
+ * Date: 2021/12/2
+ */
+public class PageParam {
+    public String Name = "SpaceController";
+    public Param Param;
+
+    public static class Param {
+        //1 空间核查 2 空间勘测
+        public String PageType;
+    }
+}

+ 30 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/PointZ.java

@@ -0,0 +1,30 @@
+package com.ys.bdtp.adm.mvvm.model.vo;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Created by lihao.
+ * Date: 2021/6/10
+ */
+public class PointZ {
+    @SerializedName("X")
+    public float x;
+    @SerializedName("Y")
+    public float y;
+    @SerializedName("Z")
+    public float z;
+
+    public PointZ() {
+    }
+
+    public PointZ(float x, float y) {
+        this.x = x;
+        this.y = y;
+    }
+
+    public PointZ(float x, float y, float z) {
+        this.x = x;
+        this.y = y;
+        this.z = z;
+    }
+}

+ 25 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/ProblemType.java

@@ -0,0 +1,25 @@
+package com.ys.bdtp.adm.mvvm.model.vo;
+
+/**
+ * 对象类型与问题类型定义表
+ */
+public class ProblemType {
+    //对象类型编码
+    public String obj_type_code;
+    //对象类型名称
+    public String obj_type_name;
+    //问题类型编码
+    public String problem_type_code;
+    //问题类型名称
+    public String problem_type_name;
+
+    public ProblemType(String obj_type_code, String obj_type_name, String problem_type_code, String problem_type_name) {
+        this.obj_type_code = obj_type_code;
+        this.obj_type_name = obj_type_name;
+        this.problem_type_code = problem_type_code;
+        this.problem_type_name = problem_type_name;
+    }
+
+    public ProblemType() {
+    }
+}

+ 7 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/SetFloorPathModel.kt

@@ -0,0 +1,7 @@
+package com.ys.bdtp.adm.mvvm.model.vo
+
+data class SetFloorPathModel(
+    val PorjectID: String,
+    val FloorID: String,
+    val FloorElevation: Double,
+)

+ 25 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/SpaceData3D.java

@@ -0,0 +1,25 @@
+package com.ys.bdtp.adm.mvvm.model.vo;
+
+import java.util.ArrayList;
+
+/**
+ * Created by lihao.
+ * Date: 2021/11/26
+ */
+public class SpaceData3D {
+    public ArrayList<ID> ID = new ArrayList<>();
+    public Style Style = new Style();
+
+    public static class ID {
+        public String ID;
+        public String OutLine;
+        public boolean IsShow = true;
+        public int SpaceHeight = 3;
+        public double FloorElevation;
+    }
+
+    public static class Style {
+        public String color = "#C4C8F2";
+        public double opacity = 0.5;
+    }
+}

+ 12 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/SpaceInfo.java

@@ -0,0 +1,12 @@
+package com.ys.bdtp.adm.mvvm.model.vo;
+
+import java.util.ArrayList;
+
+
+/**
+ * Created by lihao.
+ * Date: 2021/11/16
+ */
+public class SpaceInfo {
+    public ArrayList<ArrayList<ArrayList<PointZ>>> outline = new ArrayList<>();
+}

+ 10 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/model/vo/TipArray.java

@@ -0,0 +1,10 @@
+package com.ys.bdtp.adm.mvvm.model.vo;
+
+public class TipArray {
+    public String ID;
+    public Param Param = new Param();
+
+    public static class Param{
+
+    }
+}

+ 213 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/examine/ModelExamineActivity.kt

@@ -0,0 +1,213 @@
+/*
+package com.ys.bdtp.adm.mvvm.ui.examine
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.webkit.*
+import android.webkit.WebView.setWebContentsDebuggingEnabled
+import android.widget.Toast
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.*
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.Divider
+import androidx.compose.material.Text
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.compose.ui.viewinterop.AndroidView
+import com.google.gson.Gson
+import com.ys.bdtp.adm.R
+import com.ys.bdtp.adm.di.di
+import com.ys.bdtp.adm.mvvm.model.vo.FunctionEndBlockModel
+import com.ys.bdtp.adm.mvvm.model.vo.PageParam
+import com.ys.bdtp.adm.mvvm.model.vo.SetFloorPathModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import org.kodein.di.DI
+import org.kodein.di.DIAware
+import org.kodein.di.android.closestDI
+import org.kodein.di.compose.withDI
+
+class ModelExamineActivity : ComponentActivity(), DIAware {
+    override val di: DI by closestDI()
+    val gson = Gson()
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContent {
+            ModelExaminApp()
+        }
+    }
+
+
+    @Preview
+    @Composable
+    fun ModelExaminApp() = withDI(di(LocalContext.current)) {
+        Column {
+            ModelExamineTitle()
+            Divider(modifier = Modifier.height(1.dp).fillMaxWidth().background(Color(0XFFEFF0F1)))
+            ModelExamineScreen()
+        }
+    }
+
+    @Preview
+    @Composable
+    fun ModelExamineTitle() = withDI(di(LocalContext.current)) {
+        Row(
+            modifier = Modifier.fillMaxWidth()
+                .background(Color.White).height(48.dp),
+            verticalAlignment = Alignment.CenterVertically,
+            horizontalArrangement = Arrangement.SpaceBetween
+        ) {
+            Row(modifier = Modifier.weight(1f)) { ModelExamineTitleLeft() }
+            Row(modifier = Modifier.weight(1f)) { ModelExamineTitleMiddel() }
+            Row(modifier = Modifier.weight(1f)) { ModelExamineTitleRight() }
+        }
+    }
+
+    @Preview
+    @Composable
+    fun ModelExamineTitleLeft() = withDI(di(LocalContext.current)) {
+        Row(
+            modifier = Modifier
+                .background(Color.White).height(48.dp).fillMaxWidth(),
+            verticalAlignment = Alignment.CenterVertically,
+            horizontalArrangement = Arrangement.Start
+        ) {
+
+            Spacer(modifier = Modifier.size(29.dp))
+
+            Image(
+                painter = painterResource(id = R.drawable.icon_back),
+                modifier = Modifier.size(18.dp),
+                contentDescription = null
+            )
+
+            Spacer(modifier = Modifier.size(22.dp))
+
+            Divider(modifier = Modifier.width(1.dp).height(16.dp).background(Color(0XFFD8D8D8)))
+
+            Spacer(modifier = Modifier.size(19.dp))
+
+            Text(
+                text = "测试项目",
+                color = Color(0XFF1F2329),
+                fontSize = 18.sp
+            )
+
+            Spacer(modifier = Modifier.size(14.dp))
+
+            Image(
+                painter = painterResource(id = R.drawable.icon_arrow_down),
+                modifier = Modifier.size(12.dp),
+                contentDescription = null
+            )
+        }
+    }
+
+    @Preview
+    @Composable
+    fun ModelExamineTitleMiddel() = withDI(di(LocalContext.current)) {
+        Row(
+            modifier = Modifier
+                .background(Color.White).height(48.dp).fillMaxWidth(),
+            verticalAlignment = Alignment.CenterVertically,
+            horizontalArrangement = Arrangement.Center
+        ) {
+            Text(
+                text = "选择对象",
+                color = Color(0XFF0091FF),
+                fontSize = 14.sp,
+                modifier = Modifier.border(
+                    border = BorderStroke(1.dp, color = Color(0XFF0091FF)),
+                    shape = RoundedCornerShape(4.dp, 0.dp, 0.dp, 4.dp)
+                ).padding(26.dp, 5.dp, 26.dp, 5.dp)
+            )
+
+            Text(
+                text = "选择空间",
+                color = Color(0XFF1F2429),
+                fontSize = 14.sp,
+                modifier = Modifier.border(
+                    border = BorderStroke(1.dp, color = Color(0XFFC3C7CB)),
+                    shape = RoundedCornerShape(0.dp, 4.dp, 4.dp, 0.dp)
+                )
+                    .padding(26.dp, 5.dp, 26.dp, 5.dp)
+            )
+        }
+    }
+
+    @Preview
+    @Composable
+    fun ModelExamineTitleRight() = withDI(di(LocalContext.current)) {
+        Row(
+            modifier = Modifier
+                .background(Color.White).height(48.dp).fillMaxWidth(),
+            verticalAlignment = Alignment.CenterVertically,
+            horizontalArrangement = Arrangement.End
+        ) {
+            Box {
+                Image(
+                    painter = painterResource(id = R.drawable.icon_message),
+                    modifier = Modifier.size(30.dp).padding(4.dp),
+                    contentDescription = null
+                )
+                Text(
+                    text = "2",
+                    color = Color.White,
+                    fontWeight = FontWeight.Bold,
+                    textAlign = TextAlign.Center,
+                    fontSize = 10.sp,
+                    modifier = Modifier.background(Color(0XFFF54E45), shape = CircleShape).width(15.dp).height(15.dp)
+                        .align(Alignment.TopEnd)
+                )
+            }
+
+            Spacer(modifier = Modifier.size(24.dp))
+
+            Text(
+                text = "",
+                modifier = Modifier.background(Color(0XFFD8D8D8)).width(1.dp).height(16.dp)
+            )
+
+            Spacer(modifier = Modifier.size(18.dp))
+
+            Text(
+                text = "业务角色",
+                color = Color(0XFF1F2429),
+                fontSize = 14.sp
+            )
+
+            Spacer(modifier = Modifier.size(13.dp))
+
+            Image(
+                painter = painterResource(id = R.drawable.icon_head),
+                modifier = Modifier.size(24.dp),
+                contentDescription = null
+            )
+
+            Spacer(modifier = Modifier.size(5.dp))
+
+            Image(
+                painter = painterResource(id = R.drawable.icon_arrow_down),
+                modifier = Modifier.size(9.dp),
+                contentDescription = null
+            )
+
+            Spacer(modifier = Modifier.size(30.dp))
+        }
+    }
+
+
+}*/

+ 281 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/examine/ModelExamineScreen.kt

@@ -0,0 +1,281 @@
+/*
+package com.ys.bdtp.adm.mvvm.ui.examine
+
+import android.annotation.SuppressLint
+import android.webkit.*
+import android.widget.Toast
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.Divider
+import androidx.compose.material.Text
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.compose.ui.viewinterop.AndroidView
+import com.google.gson.Gson
+import com.ys.bdtp.adm.mvvm.model.vo.FunctionEndBlockModel
+import com.ys.bdtp.adm.mvvm.model.vo.PageParam
+import com.ys.bdtp.adm.mvvm.model.vo.SetFloorPathModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+
+@Composable
+@SuppressLint("SetJavaScriptEnabled", "JavascriptInterface")
+fun ModelExamineScreen() {
+    val context = LocalContext.current
+    val gson = Gson()
+    var firstInit = false
+
+    val webViewChromeClient = object : WebChromeClient() {
+        override fun onProgressChanged(view: WebView?, newProgress: Int) {
+            super.onProgressChanged(view, newProgress)
+        }
+    }
+    val rcs = rememberCoroutineScope()
+
+    class Js(val webView: WebView) {
+
+        @JavascriptInterface
+        fun MeshClick(meshObject: String) {
+            rcs.launch {
+                Toast.makeText(context, "选中了ID:${meshObject}", Toast.LENGTH_LONG).show()
+//
+            }
+        }
+
+        @JavascriptInterface
+        fun FunctionEndBlock(name: String) {
+            val nameObject = gson.fromJson(name, FunctionEndBlockModel::class.java)
+            when (nameObject.Name) {
+                "OpenPage" -> {
+                    rcs.launch(Dispatchers.Main) {
+                        webView.loadUrl("javascript:OpenTestData()")
+                    }
+//                rcs.launch(Dispatchers.Main) { viewModel.getFloorSpace() }
+                }
+                "SetSpaceData" -> {
+//                if (isLastSpace) {
+                    rcs.launch(Dispatchers.Main) {
+                        val model = SetFloorPathModel("Pj9909990002", "Pj99099900022fcaba5e46b611ec821df544d04bf03aB3", -13.8)
+                        webView.loadUrl("javascript:SetFloorPath('${gson.toJson(model)}')")
+                    }
+//                }
+                }
+                "SetFloorPath" -> {
+//                    rcs.launch(Dispatchers.Main) {
+//                        webView?.loadUrl("javascript:LoadAllModelWithFloor()")
+//                    }
+                }
+                "OpenTestData" -> {
+                    rcs.launch(Dispatchers.Main) {
+                        webView.loadUrl("javascript:LoadAllModelWithFloor()")
+                    }
+                }
+            }
+        }
+    }
+
+    val webView by remember {
+        mutableStateOf(WebView(context).apply {
+            webViewClient = object : WebViewClient() {
+                //兼容低版本
+                override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
+                    view.loadUrl(url)
+                    return true
+                }
+
+                override fun onPageFinished(view: WebView, url: String) {
+                    super.onPageFinished(view, url)
+                    if (view.progress == 100 && !firstInit) {
+                        firstInit = true
+//                viewModel.getFloorSpace()
+                        val pageParam = PageParam()
+                        val param = PageParam.Param()
+                        param.PageType = "1"
+                        pageParam.Param = param
+                        loadUrl("javascript:OpenPage('${gson.toJson(pageParam)}')")
+                    }
+                }
+            }
+            webChromeClient = webViewChromeClient
+            settings.javaScriptEnabled = true
+            settings.javaScriptCanOpenWindowsAutomatically = true
+            settings.domStorageEnabled = true
+            settings.loadsImagesAutomatically = true
+            settings.mediaPlaybackRequiresUserGesture = false
+            addJavascriptInterface(Js(this), "android")
+            settings.defaultTextEncodingName = "utf-8"
+            settings.builtInZoomControls = true
+            settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN
+            // 是否启动概述模式浏览界面,当页面宽度超过WebView显示宽度时,缩小页面适应WebView。默认false
+            settings.loadWithOverviewMode = true
+            settings.databaseEnabled = true
+            settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
+            WebView.setWebContentsDebuggingEnabled(true)
+//                    loadUrl("https://www.baidu.com/")
+            loadUrl("http://60.205.177.43:8000/APP/")
+        })
+    }
+
+
+    Row(
+        modifier = Modifier.fillMaxWidth()
+            .background(Color.White),
+        verticalAlignment = Alignment.CenterVertically
+    ) {
+
+        Column(modifier = Modifier.fillMaxHeight().width(270.dp).verticalScroll(rememberScrollState())) {
+            for (i in 0..9) {
+                Text(
+                    text = "$i 层",
+                    modifier = Modifier.height(40.dp).fillMaxWidth().padding(60.dp, 9.dp, 0.dp, 9.dp),
+                    color = Color(0XFF1F2429),
+                    fontSize = 14.sp
+                )
+            }
+        }
+
+        Divider(modifier = Modifier.width(1.dp).fillMaxHeight().background(Color(0XFFEFF0F1)))
+
+
+        Box(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
+            AndroidView(modifier = Modifier.fillMaxWidth().fillMaxHeight(), factory = { ctx ->
+                webView
+            })
+
+            Column(
+                modifier = Modifier.padding(0.dp, 40.dp, 30.dp, 0.dp).background(
+                    color = Color.Black,
+                    shape = RoundedCornerShape(4.dp)
+                )
+                    .align(Alignment.TopEnd).width(40.dp)
+            ) {
+                Spacer(modifier = Modifier.size(20.dp))
+                Text(
+                    text = "2D",
+                    color = Color(0XFFFFFFFF),
+                    fontSize = 14.sp,
+                    modifier = Modifier.padding(4.dp).fillMaxWidth(),
+                    textAlign = TextAlign.Center
+                )
+
+                Spacer(modifier = Modifier.size(12.dp))
+
+                Text(
+                    text = "3D",
+                    color = Color(0XFFFFFFFF),
+                    fontSize = 14.sp,
+                    modifier = Modifier.padding(4.dp).fillMaxWidth().background(
+                        color = Color(0XFF0091FF),
+                        shape = RoundedCornerShape(4.dp)
+                    ).height(28.dp).padding(4.dp),
+                    textAlign = TextAlign.Center
+                )
+                Spacer(modifier = Modifier.size(20.dp))
+            }
+
+            Column(
+                modifier = Modifier.padding(0.dp, 170.dp, 30.dp, 0.dp).background(
+                    color = Color.Black,
+                    shape = RoundedCornerShape(4.dp)
+                )
+                    .align(Alignment.TopEnd).width(40.dp)
+            ) {
+                Spacer(modifier = Modifier.size(20.dp))
+
+                Column {
+                    Image(
+                        painter = painterResource(id = com.ys.bdtp.adm.R.drawable.icon_compass),
+                        modifier = Modifier.size(30.dp).align(Alignment.CenterHorizontally),
+                        contentDescription = null
+                    )
+                    Text(
+                        text = "指南",
+                        color = Color(0XFFFFFFFF),
+                        fontSize = 12.sp,
+                        modifier = Modifier.padding(4.dp).fillMaxWidth(),
+                        textAlign = TextAlign.Center
+                    )
+                }
+                Spacer(modifier = Modifier.size(12.dp))
+                Column {
+                    Image(
+                        painter = painterResource(id = com.ys.bdtp.adm.R.drawable.icon_vertical),
+                        modifier = Modifier.size(30.dp).align(Alignment.CenterHorizontally),
+                        contentDescription = null
+                    )
+                    Text(
+                        text = "俯视",
+                        color = Color(0XFFFFFFFF),
+                        fontSize = 12.sp,
+                        modifier = Modifier.padding(4.dp).fillMaxWidth(),
+                        textAlign = TextAlign.Center
+                    )
+                }
+                Spacer(modifier = Modifier.size(12.dp))
+                Column {
+                    Image(
+                        painter = painterResource(id = com.ys.bdtp.adm.R.drawable.icon_degree),
+                        modifier = Modifier.size(30.dp).align(Alignment.CenterHorizontally),
+                        contentDescription = null
+                    )
+                    Text(
+                        text = "45度",
+                        color = Color(0XFFFFFFFF),
+                        fontSize = 12.sp,
+                        modifier = Modifier.padding(4.dp).fillMaxWidth(),
+                        textAlign = TextAlign.Center
+                    )
+                }
+                Spacer(modifier = Modifier.size(12.dp))
+                Column {
+                    Image(
+                        painter = painterResource(id = com.ys.bdtp.adm.R.drawable.icon_lock),
+                        modifier = Modifier.size(30.dp).align(Alignment.CenterHorizontally),
+                        contentDescription = null
+                    )
+                    Text(
+                        text = "锁定\n视角",
+                        color = Color(0XFFFFFFFF),
+                        fontSize = 12.sp,
+                        modifier = Modifier.padding(4.dp).fillMaxWidth(),
+                        textAlign = TextAlign.Center
+                    )
+                }
+                Spacer(modifier = Modifier.size(12.dp))
+                Column {
+                    Image(
+                        painter = painterResource(id = com.ys.bdtp.adm.R.drawable.icon_angle),
+                        modifier = Modifier.size(30.dp).align(Alignment.CenterHorizontally),
+                        contentDescription = null
+                    )
+                    Text(
+                        text = "第一\n人称",
+                        color = Color(0XFFFFFFFF),
+                        fontSize = 12.sp,
+                        modifier = Modifier.padding(4.dp).fillMaxWidth(),
+                        textAlign = TextAlign.Center
+                    )
+                }
+                Spacer(modifier = Modifier.size(20.dp))
+            }
+
+        }
+    }
+
+}
+
+
+
+*/

+ 9 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/examine/ProblemTypeHelper.kt

@@ -0,0 +1,9 @@
+package com.ys.bdtp.adm.mvvm.ui.examine
+
+import com.ys.bdtp.adm.mvvm.model.vo.ProblemType
+
+class ProblemTypeHelper {
+    companion object {
+
+    }
+}

+ 803 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/examine/Space3DActivity.kt

@@ -0,0 +1,803 @@
+package com.ys.bdtp.adm.mvvm.ui.examine
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.View
+import android.webkit.JavascriptInterface
+import android.webkit.WebSettings
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import android.widget.Toast
+import androidx.activity.ComponentActivity
+import androidx.cardview.widget.CardView
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+import com.ys.bdtp.adm.R
+import com.ys.bdtp.adm.mvvm.model.db.entity.task.ObjectEntity
+import com.ys.bdtp.adm.mvvm.model.vo.*
+import org.kodein.di.DI
+import org.kodein.di.DIAware
+import org.kodein.di.android.closestDI
+
+class Space3DActivity : ComponentActivity(), DIAware, View.OnClickListener {
+
+    override val di: DI by closestDI()
+    var isLastSpace = false
+    var isLockCamera = false
+    var meshObject: MeshObjectModel? = null
+    private lateinit var buildingId: String
+    private lateinit var floorId: String
+    private lateinit var projectId: String
+    private var objTypeCode: String = ""
+    private var problemTypeCode: String = ""
+    private lateinit var floorEntity: ObjectEntity
+    private lateinit var tv2d: TextView
+    private lateinit var tv3d: TextView
+    private lateinit var compass: TextView
+    private lateinit var vertical: TextView
+    private lateinit var degree: TextView
+    private lateinit var lock: TextView
+    private lateinit var angle: TextView
+    private lateinit var chooseObject: TextView
+    private lateinit var chooseSpace: TextView
+    private lateinit var wall: TextView
+    private lateinit var door: TextView
+    private lateinit var pillar: TextView
+    private lateinit var window: TextView
+    private lateinit var parking: TextView
+    private lateinit var floorslab: TextView
+    private lateinit var addProblem: TextView
+    private lateinit var overall: TextView
+    private lateinit var forwardTools: LinearLayout
+    private lateinit var reverseTools: LinearLayout
+    private lateinit var drawTools: LinearLayout
+    private lateinit var quitTools: LinearLayout
+    private lateinit var mapTools: LinearLayout
+    private lateinit var cameraTypeTools: LinearLayout
+    private lateinit var point: TextView
+    private lateinit var pline: TextView
+    private lateinit var close: TextView
+    private lateinit var save: TextView
+    private lateinit var record: TextView
+    private lateinit var delete: TextView
+    private lateinit var quit: TextView
+    private lateinit var problemDone: TextView
+
+    private lateinit var less: TextView
+    private lateinit var more: TextView
+    private lateinit var materialError: TextView
+    private lateinit var propertyError: TextView
+    private lateinit var crossSectionError: TextView
+    private lateinit var sizeError: TextView
+    private lateinit var positionError: TextView
+    private lateinit var floorslabLess: TextView
+    private lateinit var plantHoleLess: TextView
+    private lateinit var floorslabHeightError: TextView
+    private lateinit var signProblem: CardView
+    private lateinit var closeProblem: ImageView
+
+    companion object {
+        private lateinit var webview: WebView
+
+        /*lateinit var viewModel: Space3DVM*/
+        val gson = Gson()
+    }
+
+    @SuppressLint("SetJavaScriptEnabled")
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_space3d_activity)
+        /* val floor = intent.getBundleExtra("floor")!!
+         buildingId = floor.getString("buildingId", "")
+         floorId = floor.getString("floorId", "")
+         projectId = floor.getString("projectId", "")*/
+        initView()
+        webview.clearCache(true)
+        WebView.setWebContentsDebuggingEnabled(true)
+        webview.settings.apply {
+            javaScriptEnabled = true
+            defaultTextEncodingName = "utf-8"
+            builtInZoomControls = true
+            loadsImagesAutomatically = true
+            layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN
+            //模式浏览界面,当页面宽度超过WebView显示宽度时,缩小页面适应WebView。默认false
+            loadWithOverviewMode = true
+            domStorageEnabled = true
+            databaseEnabled = true
+            mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
+        }
+        webview.addJavascriptInterface(this, "android")
+        webview.webViewClient = MyWebViewClient()
+        webview.loadUrl("http://60.205.177.43:8000/APP/")
+//        webview.loadUrl("file:///android_asset/dist/index.html")
+
+
+        /*viewModel = Space3DVM(this.application, { name, param ->
+            when (name) {
+                Space3DVM.FLOOR_SPACE -> {
+                    val spaces = param as ArrayList<ObjectEntity>
+                    val spaceDataList = ArrayList<SpaceData3D>()
+                    val space3D = SpaceData3D()
+                    for (space in spaces) {
+                        val id = SpaceData3D.ID()
+                        id.ID = space.id
+                        val info = gson.fromJson(space.infos, SpaceInfo::class.java)
+                        val outLineString = gson.toJson(info.outline)
+                        id.OutLine = outLineString.replace("\"", "\\\"")
+                        val floorInfo = gson.fromJson(floorEntity.infos, InfosforFloor::class.java)
+                        id.FloorElevation = floorInfo.floorElevation
+                        space3D.ID.add(id)
+                        if (space3D.ID.size >= 5 || space == spaces[spaces.size - 1]) {
+                            if (space === spaces[spaces.size - 1]) {
+                                Thread.sleep(300)
+                                isLastSpace = true
+                            }
+                            spaceDataList.add(space3D)
+                            val sss = gson.toJson(spaceDataList)
+                            webview.loadUrl("javascript:SetSpaceData('${sss}')")
+                            space3D.ID.clear()
+                            spaceDataList.clear()
+                        }
+                    }
+
+
+                }
+                Space3DVM.FLOOR_OBJECT -> {
+                    floorEntity = param as ObjectEntity
+                }
+            }
+        }, this, projectId, buildingId, floorId)*/
+    }
+
+    private fun initView() {
+        webview = findViewById(R.id.webview)
+        tv2d = findViewById(R.id.tv2d)
+        tv3d = findViewById(R.id.tv3d)
+        compass = findViewById(R.id.compass)
+        vertical = findViewById(R.id.vertical)
+        degree = findViewById(R.id.degree)
+        lock = findViewById(R.id.lock)
+        angle = findViewById(R.id.angle)
+        chooseObject = findViewById(R.id.chooseObject)
+        chooseSpace = findViewById(R.id.chooseSpace)
+        reverseTools = findViewById(R.id.reverseTools)
+        forwardTools = findViewById(R.id.forwardTools)
+        wall = findViewById(R.id.wall)
+        door = findViewById(R.id.door)
+        pillar = findViewById(R.id.pillar)
+        window = findViewById(R.id.window)
+        parking = findViewById(R.id.parking)
+        floorslab = findViewById(R.id.floorslab)
+        more = findViewById(R.id.more)
+        propertyError = findViewById(R.id.propertyError)
+        positionError = findViewById(R.id.positionError)
+        addProblem = findViewById(R.id.addProblem)
+        overall = findViewById(R.id.overall)
+        drawTools = findViewById(R.id.drawTools)
+        point = findViewById(R.id.point)
+        pline = findViewById(R.id.pline)
+        close = findViewById(R.id.close)
+        save = findViewById(R.id.save)
+        record = findViewById(R.id.record)
+        delete = findViewById(R.id.delete)
+        quitTools = findViewById(R.id.quitTools)
+        quit = findViewById(R.id.quit)
+        problemDone = findViewById(R.id.problemDone)
+        mapTools = findViewById(R.id.mapTools)
+        cameraTypeTools = findViewById(R.id.cameraTypeTools)
+        less = findViewById(R.id.less)
+        more = findViewById(R.id.more)
+        materialError = findViewById(R.id.materialError)
+        propertyError = findViewById(R.id.propertyError)
+        crossSectionError = findViewById(R.id.crossSectionError)
+        sizeError = findViewById(R.id.sizeError)
+        positionError = findViewById(R.id.positionError)
+        floorslabLess = findViewById(R.id.floorslabLess)
+        plantHoleLess = findViewById(R.id.plantHoleLess)
+        floorslabHeightError = findViewById(R.id.floorslabHeightError)
+        signProblem = findViewById(R.id.signProblem)
+        closeProblem = findViewById(R.id.closeProblem)
+
+        less.setOnClickListener(this)
+        more.setOnClickListener(this)
+        materialError.setOnClickListener(this)
+        propertyError.setOnClickListener(this)
+        crossSectionError.setOnClickListener(this)
+        sizeError.setOnClickListener(this)
+        positionError.setOnClickListener(this)
+        floorslabLess.setOnClickListener(this)
+        plantHoleLess.setOnClickListener(this)
+        floorslabHeightError.setOnClickListener(this)
+        tv2d.setOnClickListener(this)
+        tv3d.setOnClickListener(this)
+        compass.setOnClickListener(this)
+        vertical.setOnClickListener(this)
+        degree.setOnClickListener(this)
+        lock.setOnClickListener(this)
+        angle.setOnClickListener(this)
+        chooseObject.setOnClickListener(this)
+        chooseSpace.setOnClickListener(this)
+        wall.setOnClickListener(this)
+        door.setOnClickListener(this)
+        pillar.setOnClickListener(this)
+        window.setOnClickListener(this)
+        parking.setOnClickListener(this)
+        floorslab.setOnClickListener(this)
+        more.setOnClickListener(this)
+        propertyError.setOnClickListener(this)
+        positionError.setOnClickListener(this)
+        addProblem.setOnClickListener(this)
+        overall.setOnClickListener(this)
+        quit.setOnClickListener(this)
+        closeProblem.setOnClickListener(this)
+        save.setOnClickListener(this)
+    }
+
+
+    @JavascriptInterface
+    fun MeshClick(meshObjectString: String) {
+        runOnUiThread {
+            forwardTools.visibility = View.GONE
+            reverseTools.visibility = View.GONE
+            meshObject = gson.fromJson(meshObjectString, MeshObjectModel::class.java)
+            Toast.makeText(this, meshObject!!.ID, Toast.LENGTH_LONG).show()
+        }
+    }
+
+    @JavascriptInterface
+    fun EndDrawPointModel(pointModel: String) {
+        runOnUiThread {
+            val point = gson.fromJson(pointModel, PointZ::class.java)
+        }
+    }
+
+    @JavascriptInterface
+    fun EndDrawLineModel(lineObject: String) {
+        runOnUiThread {
+            val line = gson.fromJson<ArrayList<PointZ?>?>(lineObject, object : TypeToken<ArrayList<PointZ?>?>() {}.type)
+        }
+    }
+
+    @JavascriptInterface
+    fun FunctionEndBlock(name: String) {
+        val nameObject = gson.fromJson(name, FunctionEndBlockModel::class.java)
+        when (nameObject.Name) {
+            "OpenPage" -> {
+                runOnUiThread {
+                    webview.loadUrl("javascript:OpenTestData()")
+                }
+                /*runOnUiThread { viewModel.getFloorSpace() }*/
+            }
+            "SetSpaceData" -> {
+//                if (isLastSpace) {
+//                    runOnUiThread {
+//                        val floorInfo = gson.fromJson(floorEntity.infos, InfosforFloor::class.java)
+//                        val model = SetFloorPathModel(projectId, floorInfo.bimIdPre, floorInfo.floorElevation)
+//                        webview.loadUrl("javascript:SetFloorPath('${gson.toJson(model)}')")
+//                    }
+//                }
+            }
+            "SetFloorPath" -> {
+//                runOnUiThread {
+//                    webview.loadUrl("javascript:LoadAllModelWithFloor()")
+//                }
+            }
+            "OpenTestData" -> {
+                runOnUiThread {
+                    webview.loadUrl("javascript:LoadAllModelWithFloor()")
+
+                }
+            }
+        }
+    }
+
+    class MyWebViewClient : WebViewClient() {
+        //兼容低版本
+        override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
+            view.loadUrl(url)
+            return true
+        }
+
+        override fun onPageFinished(view: WebView, url: String) {
+            super.onPageFinished(view, url)
+            if (view.progress == 100) {
+//            viewModel.getFloorSpace()
+                val pageParam = PageParam()
+                val param = PageParam.Param()
+                param.PageType = "1"
+                pageParam.Param = param
+                webview.loadUrl("javascript:OpenPage('${gson.toJson(pageParam)}')")
+            }
+        }
+    }
+
+    @SuppressLint("UseCompatLoadingForDrawables")
+    override fun onClick(v: View) {
+        when (v.id) {
+            R.id.tv2d -> {
+                meshObject = null
+                webview.loadUrl("javascript:UpdateCameraType(${2})")
+                tv2d.background = getDrawable(R.drawable.bg_blue_round)
+                tv3d.background = getDrawable(R.color.trans)
+                reset2DTools()
+            }
+            R.id.tv3d -> {
+                meshObject = null
+                webview.loadUrl("javascript:UpdateCameraType(${1})")
+                tv3d.background = getDrawable(R.drawable.bg_blue_round)
+                tv2d.background = getDrawable(R.color.trans)
+                reset3DTools()
+            }
+            R.id.compass -> {
+//                compass.setCompoundDrawablesWithIntrinsicBounds(null, resources.getDrawable(R.drawable.icon_compass_blue), null, null)
+            }
+            R.id.overall -> {
+                webview.loadUrl("javascript:LookAtAllFloorWidth2D()")
+                overall.setCompoundDrawablesWithIntrinsicBounds(
+                    null,
+                    resources.getDrawable(R.drawable.icon_overall_blue),
+                    null,
+                    null
+                )
+            }
+            R.id.vertical -> {
+                webview.loadUrl("javascript:UpdateCameraAngle(${0})")
+                resetState()
+                vertical.setCompoundDrawablesWithIntrinsicBounds(
+                    null,
+                    resources.getDrawable(R.drawable.icon_vertical_blue),
+                    null,
+                    null
+                )
+            }
+            R.id.degree -> {
+                webview.loadUrl("javascript:UpdateCameraAngle(${1})")
+                resetState()
+                degree.setCompoundDrawablesWithIntrinsicBounds(
+                    null,
+                    resources.getDrawable(R.drawable.icon_degree_blue),
+                    null,
+                    null
+                )
+            }
+            R.id.lock -> {
+                isLockCamera = !isLockCamera
+                webview.loadUrl("javascript:IsLockCamera(${isLockCamera})")
+                lock.setCompoundDrawablesWithIntrinsicBounds(
+                    null,
+                    if (isLockCamera) resources.getDrawable(R.drawable.icon_lock_blue) else resources.getDrawable(R.drawable.icon_lock),
+                    null,
+                    null
+                )
+
+            }
+            R.id.angle -> {
+                resetState()
+                webview.loadUrl("javascript:IsFirstCamera(${true})")
+                angle.setCompoundDrawablesWithIntrinsicBounds(
+                    null,
+                    resources.getDrawable(R.drawable.icon_angle_blue),
+                    null,
+                    null
+                )
+            }
+            R.id.chooseObject -> {
+                webview.loadUrl("javascript:SetChoseBuildType()")
+                meshObject = null
+                chooseObject.setTextColor(getColor(R.color.blue_0091FF))
+                chooseObject.background = getDrawable(R.drawable.btn_bg_blue_left_close)
+                chooseSpace.setTextColor(getColor(R.color.black_1F2329))
+                chooseSpace.background = getDrawable(R.drawable.btn_bg_gray_right_open)
+            }
+            R.id.chooseSpace -> {
+                webview.loadUrl("javascript:SetChoseSpaceType()")
+                meshObject = null
+                chooseSpace.setTextColor(getColor(R.color.blue_0091FF))
+                chooseSpace.background = getDrawable(R.drawable.btn_bg_blue_right_close)
+                chooseObject.setTextColor(getColor(R.color.black_1F2329))
+                chooseObject.background = getDrawable(R.drawable.btn_bg_gray_left_open)
+            }
+            R.id.wall -> {
+                objTypeCode = "CFCSWL"
+                hideForwardTools()
+                less.visibility = View.VISIBLE
+                more.visibility = View.VISIBLE
+                materialError.visibility = View.VISIBLE
+                pline.visibility = View.VISIBLE
+                pline.setCompoundDrawablesWithIntrinsicBounds(
+                    null,
+                    resources.getDrawable(R.drawable.icon_pline_blue),
+                    null,
+                    null
+                )
+                resetReverseTools()
+                wall.setTextColor(getColor(R.color.blue_0091FF))
+                wall.background = getDrawable(R.drawable.bg_blue_e1f2ff_round)
+            }
+            R.id.door -> {
+                objTypeCode = "CFBEDR"
+                problemTypeCode = "CFBEDR_LESS"
+                resetReverseTools()
+                resetDrawTools()
+                webview.loadUrl("javascript:InDrawPointModel()")
+                point.visibility = View.VISIBLE
+                point.setCompoundDrawablesWithIntrinsicBounds(
+                    null,
+                    resources.getDrawable(R.drawable.icon_point_blue),
+                    null,
+                    null
+                )
+                door.setTextColor(getColor(R.color.blue_0091FF))
+                door.background = getDrawable(R.drawable.bg_blue_e1f2ff_round)
+            }
+            R.id.pillar -> {
+                objTypeCode = "CFCSCL"
+                problemTypeCode = "CFCSCL_LESS"
+                resetReverseTools()
+                resetDrawTools()
+                webview.loadUrl("javascript:InDrawPointModel()")
+                point.visibility = View.VISIBLE
+                point.setCompoundDrawablesWithIntrinsicBounds(
+                    null,
+                    resources.getDrawable(R.drawable.icon_point_blue),
+                    null,
+                    null
+                )
+                pillar.setTextColor(getColor(R.color.blue_0091FF))
+                pillar.background = getDrawable(R.drawable.bg_blue_e1f2ff_round)
+            }
+            R.id.window -> {
+                objTypeCode = "CFBEWN"
+                problemTypeCode = "CFBEWN_LESS"
+                resetReverseTools()
+                resetDrawTools()
+                webview.loadUrl("javascript:InDrawPointModel()")
+                point.visibility = View.VISIBLE
+                point.setCompoundDrawablesWithIntrinsicBounds(
+                    null,
+                    resources.getDrawable(R.drawable.icon_point_blue),
+                    null,
+                    null
+                )
+                window.setTextColor(getColor(R.color.blue_0091FF))
+                window.background = getDrawable(R.drawable.bg_blue_e1f2ff_round)
+            }
+            R.id.parking -> {
+                objTypeCode = "CFPKPS"
+                resetReverseTools()
+                resetDrawTools()
+                webview.loadUrl("javascript:InDrawPointModel()")
+                point.visibility = View.VISIBLE
+                point.setCompoundDrawablesWithIntrinsicBounds(
+                    null,
+                    resources.getDrawable(R.drawable.icon_point_blue),
+                    null,
+                    null
+                )
+                parking.setTextColor(getColor(R.color.blue_0091FF))
+                parking.background = getDrawable(R.drawable.bg_blue_e1f2ff_round)
+            }
+            R.id.floorslab -> {
+                objTypeCode = "CFCSFL"
+                hideForwardTools()
+                floorslabLess.visibility = View.VISIBLE
+                plantHoleLess.visibility = View.VISIBLE
+                floorslabHeightError.visibility = View.VISIBLE
+                resetReverseTools()
+                floorslab.setTextColor(getColor(R.color.blue_0091FF))
+                floorslab.background = getDrawable(R.drawable.bg_blue_e1f2ff_round)
+            }
+            R.id.addProblem -> {
+                if (reverseTools.visibility == View.VISIBLE || forwardTools.visibility == View.VISIBLE) {
+                    forwardTools.visibility = View.GONE
+                    reverseTools.visibility = View.GONE
+                } else {
+                    if (meshObject == null) {
+                        reverseTools.visibility = View.VISIBLE
+                        forwardTools.visibility = View.GONE
+                    } else {
+                        hideForwardTools()
+                        if (meshObject?.ID!!.contains("Column")) {
+                            objTypeCode = "CFCSCL"
+                            more.visibility = View.VISIBLE
+                            crossSectionError.visibility = View.VISIBLE
+                            sizeError.visibility = View.VISIBLE
+
+                        } else if (meshObject?.ID!!.contains("Door")) {
+                            objTypeCode = "CFBEDR"
+                            more.visibility = View.VISIBLE
+                            materialError.visibility = View.VISIBLE
+                            positionError.visibility = View.VISIBLE
+                        } else if (meshObject?.ID!!.contains("Window")) {
+                            objTypeCode = "CFBEWN"
+                            more.visibility = View.VISIBLE
+                            propertyError.visibility = View.VISIBLE
+                            sizeError.visibility = View.VISIBLE
+                            positionError.visibility = View.VISIBLE
+                        } else if (meshObject?.ID!!.contains("Parking")) {
+                            problemTypeCode = "CFPKPS_LESS"
+                            objTypeCode = "CFPKPS"
+                            more.visibility = View.VISIBLE
+                        }
+                    }
+                }
+            }
+            R.id.quit -> {
+                webview.loadUrl("javascript:OutDrawPointModel()")
+                webview.loadUrl("javascript:OutDrawLineModel()")
+                signProblem.visibility = View.GONE
+                addProblem.visibility = View.VISIBLE
+                drawTools.visibility = View.GONE
+                quitTools.visibility = View.GONE
+                problemDone.visibility = View.GONE
+                cameraTypeTools.visibility = View.VISIBLE
+                mapTools.visibility = View.VISIBLE
+                webview.loadUrl("javascript:UpdateCameraType(${1})")
+                resetReverseTools()
+            }
+            R.id.problemDone -> {
+                //TODO save
+                webview.loadUrl("javascript:OutDrawPointModel()")
+                webview.loadUrl("javascript:OutDrawLineModel()")
+                webview.loadUrl("javascript:EndDrawPointModel()")
+                webview.loadUrl("javascript:EndDrawLineModel()")
+            }
+            R.id.save -> {
+                if (problemTypeCode == "CFCSWL_MORE" || problemTypeCode == "CFCSWL_MATERIAL_ERROR" || objTypeCode == "CFCSFL") {
+//                    val lineStyleModel = LineStyleModel("#ff0000", true)
+                    val lineStyleModel = "{'Color':'#ff0000', 'IsLoop':'true'}"
+                    webview.loadUrl("javascript:SetDrawLineModel(${lineStyleModel})")
+                }
+//                webview.loadUrl("javascript:OutDrawPointModel()")
+//                webview.loadUrl("javascript:OutDrawLineModel()")
+//                webview.loadUrl("javascript:EndDrawPointModel()")
+//                webview.loadUrl("javascript:EndDrawLineModel()")
+            }
+            //缺少
+            R.id.less -> {
+                when (objTypeCode) {
+                    //墙
+                    "CFCSWL" -> {
+                        problemTypeCode = "CFCSWL_LESS"
+                        webview.loadUrl("javascript:InDrawLineModel()")
+                        resetDrawTools()
+                    }
+                }
+            }
+            //多余
+            R.id.more -> {
+                when (objTypeCode) {
+                    //墙
+                    "CFCSWL" -> {
+                        problemTypeCode = "CFCSWL_MORE"
+                        webview.loadUrl("javascript:InDrawLineModel()")
+                        resetDrawTools()
+                    }
+                    //柱子
+                    "CFCSCL" -> {
+                        problemTypeCode = "CFCSCL_MORE"
+                        signProblem.visibility = View.VISIBLE
+                        addProblem.visibility = View.GONE
+                        forwardTools.visibility = View.GONE
+                    }
+                    //门
+                    "CFBEDR" -> {
+                        problemTypeCode = "CFBEDR_MORE"
+                        signProblem.visibility = View.VISIBLE
+                        addProblem.visibility = View.GONE
+                        forwardTools.visibility = View.GONE
+                    }
+                    //窗
+                    "CFBEWN" -> {
+                        problemTypeCode = "CFBEWN_MORE"
+                        signProblem.visibility = View.VISIBLE
+                        addProblem.visibility = View.GONE
+                        forwardTools.visibility = View.GONE
+                    }
+                    //停车位
+                    "CFPKPS" -> {
+                        problemTypeCode = "CFPKPS_MORE"
+                        signProblem.visibility = View.VISIBLE
+                        addProblem.visibility = View.GONE
+                        forwardTools.visibility = View.GONE
+                    }
+                }
+                resetForwardTools()
+            }
+            //材质错误
+            R.id.materialError -> {
+                problemTypeCode = "CFCSWL_MATERIAL_ERROR"
+                webview.loadUrl("javascript:InDrawLineModel()")
+                resetDrawTools()
+            }
+            //属性错误
+            R.id.propertyError -> {
+                when (objTypeCode) {
+                    //门
+                    "CFBEDR" -> {
+                        problemTypeCode = "CFBEDR_PROPERTY_ERROR"
+                    }
+                    //窗
+                    "CFBEWN" -> {
+                        problemTypeCode = "CFBEWN_PROPERTY_ERROR"
+                    }
+
+                }
+                resetForwardTools()
+                propertyError.setTextColor(getColor(R.color.blue_0091FF))
+                propertyError.background = getDrawable(R.drawable.bg_blue_e1f2ff_round)
+            }
+            //截面形状错误
+            R.id.crossSectionError -> {
+                problemTypeCode = "CFCSCL_SECTION_SHAPE_ERROR"
+                signProblem.visibility = View.VISIBLE
+                addProblem.visibility = View.GONE
+                forwardTools.visibility = View.GONE
+            }
+            //尺寸错误
+            R.id.sizeError -> {
+                when (objTypeCode) {
+                    "CFCSCL" -> {
+                        problemTypeCode = "CFCSCL_SIZE_ERROR"
+                    }
+                }
+                signProblem.visibility = View.VISIBLE
+                addProblem.visibility = View.GONE
+                forwardTools.visibility = View.GONE
+            }
+            //位置错误
+            R.id.positionError -> {
+                when (objTypeCode) {
+                    //门
+                    "CFBEDR" -> {
+                        problemTypeCode = "CFBEDR_POSITION_ERROR"
+                    }
+                    //窗
+                    "CFBEWN" -> {
+                        problemTypeCode = "CFBEWN_POSITION_ERROR"
+                    }
+
+                }
+                resetForwardTools()
+                positionError.setTextColor(getColor(R.color.blue_0091FF))
+                positionError.background = getDrawable(R.drawable.bg_blue_e1f2ff_round)
+            }
+            //楼板缺少
+            R.id.floorslabLess -> {
+                problemTypeCode = "CFCSFL_LESS"
+                webview.loadUrl("javascript:InDrawLineModel()")
+                resetDrawTools()
+                resetForwardTools()
+            }
+            //板洞缺少
+            R.id.plantHoleLess -> {
+                problemTypeCode = "CFCSFL_HOLE_LESS"
+                webview.loadUrl("javascript:InDrawLineModel()")
+                resetDrawTools()
+                resetForwardTools()
+            }
+            //楼板高错误
+            R.id.floorslabHeightError -> {
+                problemTypeCode = "CFCSFL_ELEVATION_ERROR"
+                webview.loadUrl("javascript:InDrawLineModel()")
+                resetDrawTools()
+                resetForwardTools()
+            }
+            R.id.record -> {
+                signProblem.visibility = View.VISIBLE
+            }
+            R.id.closeProblem -> {
+                signProblem.visibility = View.GONE
+                addProblem.visibility = View.VISIBLE
+                drawTools.visibility = View.GONE
+                quitTools.visibility = View.GONE
+                problemDone.visibility = View.GONE
+                cameraTypeTools.visibility = View.VISIBLE
+                mapTools.visibility = View.VISIBLE
+            }
+
+        }
+    }
+
+    private fun resetReverseTools() {
+        wall.setTextColor(getColor(R.color.black_1F2329))
+        wall.background = resources.getDrawable(R.color.trans)
+        door.setTextColor(getColor(R.color.black_1F2329))
+        door.background = resources.getDrawable(R.color.trans)
+        pillar.setTextColor(getColor(R.color.black_1F2329))
+        pillar.background = resources.getDrawable(R.color.trans)
+        window.setTextColor(getColor(R.color.black_1F2329))
+        window.background = resources.getDrawable(R.color.trans)
+        parking.setTextColor(getColor(R.color.black_1F2329))
+        parking.background = resources.getDrawable(R.color.trans)
+        floorslab.setTextColor(getColor(R.color.black_1F2329))
+        floorslab.background = resources.getDrawable(R.color.trans)
+    }
+
+    private fun resetForwardTools() {
+        more.setTextColor(getColor(R.color.black_1F2329))
+        more.background = resources.getDrawable(R.color.trans)
+        propertyError.setTextColor(getColor(R.color.black_1F2329))
+        propertyError.background = resources.getDrawable(R.color.trans)
+        positionError.setTextColor(getColor(R.color.black_1F2329))
+        positionError.background = resources.getDrawable(R.color.trans)
+    }
+
+    private fun resetState() {
+        vertical.setCompoundDrawablesWithIntrinsicBounds(
+            null,
+            resources.getDrawable(R.drawable.icon_vertical),
+            null,
+            null
+        )
+        degree.setCompoundDrawablesWithIntrinsicBounds(
+            null,
+            resources.getDrawable(R.drawable.icon_degree),
+            null,
+            null
+        )
+//        lock.setCompoundDrawablesWithIntrinsicBounds(null, resources.getDrawable(R.drawable.icon_lock), null, null)
+        angle.setCompoundDrawablesWithIntrinsicBounds(
+            null,
+            resources.getDrawable(R.drawable.icon_angle),
+            null,
+            null
+        )
+        webview.loadUrl("javascript:IsFirstCamera(${false})")
+    }
+
+    private fun reset3DTools() {
+        vertical.visibility = View.VISIBLE
+        overall.visibility = View.GONE
+        degree.visibility = View.VISIBLE
+        lock.visibility = View.VISIBLE
+        angle.visibility = View.VISIBLE
+        overall.setCompoundDrawablesWithIntrinsicBounds(
+            null,
+            resources.getDrawable(R.drawable.icon_overall_white),
+            null,
+            null
+        )
+    }
+
+    private fun hideForwardTools() {
+        forwardTools.visibility = View.VISIBLE
+        less.visibility = View.GONE
+        more.visibility = View.GONE
+        materialError.visibility = View.GONE
+        propertyError.visibility = View.GONE
+        crossSectionError.visibility = View.GONE
+        sizeError.visibility = View.GONE
+        positionError.visibility = View.GONE
+        floorslabLess.visibility = View.GONE
+        plantHoleLess.visibility = View.GONE
+        floorslabHeightError.visibility = View.GONE
+    }
+
+    private fun reset2DTools() {
+        resetState()
+        vertical.visibility = View.GONE
+        overall.visibility = View.VISIBLE
+        degree.visibility = View.GONE
+        lock.visibility = View.GONE
+        angle.visibility = View.GONE
+    }
+
+    private fun resetDrawTools() {
+        webview.loadUrl("javascript:UpdateCameraType(${2})")
+        addProblem.visibility = View.GONE
+        forwardTools.visibility = View.GONE
+        reverseTools.visibility = View.GONE
+        point.visibility = View.GONE
+        pline.visibility = View.GONE
+        close.visibility = View.GONE
+        cameraTypeTools.visibility = View.GONE
+        mapTools.visibility = View.GONE
+        drawTools.visibility = View.VISIBLE
+        quitTools.visibility = View.VISIBLE
+        problemDone.visibility = View.VISIBLE
+    }
+}

+ 5 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/examine/Space3DRepository.kt

@@ -0,0 +1,5 @@
+package com.ys.bdtp.adm.mvvm.vm.examine
+
+import com.ys.bdtp.adm.mvvm.model.nt.Api
+
+class Space3DRepository(private val api: Api)

+ 5 - 0
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/examine/Space3DViewModel.kt

@@ -0,0 +1,5 @@
+package com.ys.bdtp.adm.mvvm.vm.examine
+
+import androidx.lifecycle.ViewModel
+
+class Space3DViewModel(private val repo: Space3DRepository) : ViewModel()

+ 74 - 0
app/src/main/res/drawable-xhdpi/ic_launcher_background.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="108dp"
+        android:width="108dp"
+        android:viewportHeight="108"
+        android:viewportWidth="108">
+    <path android:fillColor="#3DDC84"
+          android:pathData="M0,0h108v108h-108z"/>
+    <path android:fillColor="#00000000" android:pathData="M9,0L9,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,0L19,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,0L29,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,0L39,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,0L49,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,0L59,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,0L69,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,0L79,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M89,0L89,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M99,0L99,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,9L108,9"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,19L108,19"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,29L108,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,39L108,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,49L108,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,59L108,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,69L108,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,79L108,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,89L108,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,99L108,99"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,29L89,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,39L89,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,49L89,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,59L89,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,69L89,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,79L89,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,19L29,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,19L39,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,19L49,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,19L59,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,19L69,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,19L79,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+</vector>

BIN
app/src/main/res/drawable-xxhdpi/icon_angle.png


BIN
app/src/main/res/drawable-xxhdpi/icon_angle_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_arrow_down.png


BIN
app/src/main/res/drawable-xxhdpi/icon_back.png


BIN
app/src/main/res/drawable-xxhdpi/icon_close_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_close_white.png


BIN
app/src/main/res/drawable-xxhdpi/icon_compass.png


BIN
app/src/main/res/drawable-xxhdpi/icon_compass_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_degree.png


BIN
app/src/main/res/drawable-xxhdpi/icon_degree_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_delete.png


BIN
app/src/main/res/drawable-xxhdpi/icon_delete_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_delete_white.png


BIN
app/src/main/res/drawable-xxhdpi/icon_head.png


BIN
app/src/main/res/drawable-xxhdpi/icon_lock.png


BIN
app/src/main/res/drawable-xxhdpi/icon_lock_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_message.png


BIN
app/src/main/res/drawable-xxhdpi/icon_overall_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_overall_white.png


BIN
app/src/main/res/drawable-xxhdpi/icon_pline_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_pline_white.png


BIN
app/src/main/res/drawable-xxhdpi/icon_point_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_point_white.png


BIN
app/src/main/res/drawable-xxhdpi/icon_quit.png


BIN
app/src/main/res/drawable-xxhdpi/icon_record_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_record_white.png


BIN
app/src/main/res/drawable-xxhdpi/icon_save_blue.png


BIN
app/src/main/res/drawable-xxhdpi/icon_save_white.png


BIN
app/src/main/res/drawable-xxhdpi/icon_vertical.png


BIN
app/src/main/res/drawable-xxhdpi/icon_vertical_blue.png


+ 6 - 0
app/src/main/res/drawable/bg_black_round.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+       xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#cc000000"/>
+    <corners android:radius="4dp"/>
+</shape>

+ 6 - 0
app/src/main/res/drawable/bg_blue_e1f2ff_round.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+       xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#e1f2ff"/>
+    <corners android:radius="4dp"/>
+</shape>

+ 6 - 0
app/src/main/res/drawable/bg_blue_round.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+       xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#0091FF"/>
+    <corners android:radius="4dp"/>
+</shape>

+ 10 - 0
app/src/main/res/drawable/bg_c3c7cb_left_round.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+       xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke
+            android:color="#C3C7CB"
+            android:width="1dp"/>
+    <corners
+            android:topLeftRadius="4dp"
+            android:bottomLeftRadius="4dp"/>
+</shape>

+ 10 - 0
app/src/main/res/drawable/bg_c3c7cb_right_round.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+       xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke
+            android:color="#C3C7CB"
+            android:width="1dp"/>
+    <corners
+            android:topRightRadius="4dp"
+            android:bottomRightRadius="4dp"/>
+</shape>

+ 6 - 0
app/src/main/res/drawable/bg_gray_eff0f1.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+       xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#EFF0F1"/>
+    <corners android:radius="4dp"/>
+</shape>

+ 4 - 0
app/src/main/res/drawable/bg_red_round.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#F54E45"/>
+</shape>

+ 5 - 0
app/src/main/res/drawable/bg_round_c3c7cb.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"  xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="4dp"/>
+    <stroke android:color="#FFC3C7CB" android:width="1dp"/>
+</shape>

+ 9 - 0
app/src/main/res/drawable/bg_white_round.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+       xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#ffffff"/>
+    <corners android:radius="4dp"/>
+    <stroke
+            android:color="#33C3C7C8"
+            android:width="1px"/>
+</shape>

+ 5 - 0
app/src/main/res/drawable/btn_select_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_enabled="true" android:drawable="@drawable/bg_blue_round"/>
+    <item android:state_enabled="false" android:drawable="@drawable/bg_gray_eff0f1"/>
+</selector>

+ 778 - 0
app/src/main/res/layout/activity_space3d_activity.xml

@@ -0,0 +1,778 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+        android:orientation="vertical"
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        xmlns:tools="http://schemas.android.com/tools"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <RelativeLayout
+            android:gravity="center_vertical"
+            android:background="#ffffff"
+            android:layout_width="match_parent"
+            android:layout_height="48dp">
+
+        <ImageView
+                android:id="@+id/back"
+                android:paddingTop="15dp"
+                android:paddingBottom="15dp"
+                android:paddingLeft="28dp"
+                android:layout_centerVertical="true"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:src="@drawable/icon_back"/>
+
+        <View
+                android:id="@+id/line"
+                android:layout_marginLeft="22dp"
+                android:layout_toRightOf="@+id/back"
+                android:layout_centerVertical="true"
+                android:layout_width="1dp"
+                android:layout_height="16dp"
+                android:background="#d8d8d8"/>
+
+        <TextView
+                android:id="@+id/projectName"
+                android:layout_marginLeft="19dp"
+                android:text="京东科技大厦 地下1F"
+                android:layout_width="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_height="wrap_content"
+                android:layout_toRightOf="@+id/line"
+                android:textSize="16sp"
+                android:textColor="#1f2329"/>
+
+        <ImageView
+                android:paddingTop="20dp"
+                android:paddingBottom="20dp"
+                android:layout_marginLeft="12dp"
+                android:layout_toRightOf="@+id/projectName"
+                android:layout_centerVertical="true"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:src="@drawable/icon_arrow_down"/>
+
+        <LinearLayout
+                android:gravity="center_vertical"
+                android:layout_centerInParent="true"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:orientation="horizontal">
+
+            <TextView
+                    android:id="@+id/chooseObject"
+                    android:background="@drawable/btn_bg_gray_left_open"
+                    android:layout_width="140dp"
+                    android:layout_height="32dp"
+                    android:text="土建精装"
+                    android:textColor="#1F2429"
+                    android:textSize="14sp"
+                    android:gravity="center"/>
+
+            <TextView
+                    android:id="@+id/chooseSpace"
+                    android:background="@drawable/btn_bg_gray_right_close"
+                    android:layout_width="140dp"
+                    android:layout_height="32dp"
+                    android:text="物业空间"
+                    android:textColor="#1F2429"
+                    android:textSize="14sp"
+                    android:gravity="center"/>
+        </LinearLayout>
+
+        <LinearLayout
+                android:paddingRight="30dp"
+                android:layout_alignParentRight="true"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:orientation="horizontal">
+
+            <ImageView
+                    android:paddingTop="13dp"
+                    android:paddingBottom="13dp"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:src="@drawable/icon_message"/>
+
+            <TextView
+                    android:layout_marginTop="10dp"
+                    android:layout_marginLeft="-16dp"
+                    android:textSize="10sp"
+                    android:textColor="@android:color/white"
+                    android:layout_width="15dp"
+                    android:layout_height="15dp"
+                    android:text="2"
+                    android:gravity="center"
+                    android:background="@drawable/bg_red_round"/>
+
+            <View
+                    android:id="@+id/line2"
+                    android:layout_marginLeft="14dp"
+                    android:layout_gravity="center_vertical"
+                    android:layout_width="1dp"
+                    android:layout_height="16dp"
+                    android:background="#d8d8d8"/>
+
+            <TextView
+                    android:layout_gravity="center_vertical"
+                    android:id="@+id/roleName"
+                    android:layout_marginLeft="18dp"
+                    android:text="业务角色"
+                    android:layout_width="wrap_content"
+                    android:layout_centerVertical="true"
+                    android:layout_height="wrap_content"
+                    android:layout_toRightOf="@+id/line"
+                    android:textSize="16sp"
+                    android:textColor="#1f2329"/>
+
+            <ImageView
+                    android:layout_marginLeft="13dp"
+                    android:layout_gravity="center_vertical"
+                    android:layout_width="24dp"
+                    android:layout_height="24dp"
+                    android:src="@drawable/icon_head"/>
+
+            <ImageView
+                    android:layout_marginLeft="5dp"
+                    android:layout_gravity="center_vertical"
+                    android:layout_width="10dp"
+                    android:layout_height="6dp"
+                    android:src="@drawable/icon_arrow_down"/>
+        </LinearLayout>
+    </RelativeLayout>
+
+    <View
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="#EFF0F1"/>
+
+    <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+        <ExpandableListView
+                android:visibility="gone"
+                android:id="@+id/expandLv"
+                android:background="@android:color/white"
+                android:layout_width="270dp"
+                android:layout_height="match_parent"/>
+
+        <View
+                android:id="@+id/line3"
+                android:layout_toRightOf="@+id/expandLv"
+                android:layout_width="1px"
+                android:layout_height="match_parent"
+                android:background="#EFF0F1"/>
+
+        <WebView
+                android:layout_toRightOf="@+id/line3"
+                android:id="@+id/webview"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                tools:context=".activities.Space3DActivity"/>
+
+        <TextView
+                android:id="@+id/addProblem"
+                android:layout_centerHorizontal="true"
+                android:layout_alignParentBottom="true"
+                android:layout_marginBottom="30dp"
+                android:layout_width="260dp"
+                android:background="@drawable/bg_blue_round"
+                android:textColor="@android:color/white"
+                android:textSize="16sp"
+                android:text="记录问题"
+                android:gravity="center"
+                android:layout_height="48dp"/>
+
+        <TextView
+                android:visibility="gone"
+                android:id="@+id/problemDone"
+                android:layout_centerHorizontal="true"
+                android:layout_alignParentBottom="true"
+                android:layout_marginBottom="30dp"
+                android:layout_width="260dp"
+                android:background="@drawable/btn_select_bg"
+                android:textColor="#C3C7CB"
+                android:enabled="false"
+                android:textSize="16sp"
+                android:text="完成标记"
+                android:gravity="center"
+                android:layout_height="48dp"/>
+
+        <LinearLayout
+                android:id="@+id/reverseTools"
+                android:visibility="gone"
+                android:paddingLeft="21dp"
+                android:paddingRight="21dp"
+                android:layout_marginBottom="16dp"
+                android:layout_centerHorizontal="true"
+                android:layout_above="@+id/addProblem"
+                android:layout_width="wrap_content"
+                android:layout_height="48dp"
+                android:background="@drawable/bg_white_round"
+                android:orientation="horizontal">
+
+            <TextView
+                    android:id="@+id/wall"
+                    android:layout_width="60dp"
+                    android:layout_height="28dp"
+                    android:text="墙"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/door"
+                    android:layout_width="60dp"
+                    android:layout_height="28dp"
+                    android:text="缺门"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/pillar"
+                    android:layout_width="60dp"
+                    android:layout_height="28dp"
+                    android:text="缺柱子"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/window"
+                    android:layout_width="60dp"
+                    android:layout_height="28dp"
+                    android:text="缺窗户"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/parking"
+                    android:layout_width="60dp"
+                    android:layout_height="28dp"
+                    android:text="缺车位"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/floorslab"
+                    android:layout_width="60dp"
+                    android:layout_height="28dp"
+                    android:text="楼板"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+        </LinearLayout>
+
+        <LinearLayout
+                android:id="@+id/forwardTools"
+                android:visibility="gone"
+                android:paddingLeft="21dp"
+                android:paddingRight="21dp"
+                android:layout_marginBottom="16dp"
+                android:layout_centerHorizontal="true"
+                android:layout_above="@+id/reverseTools"
+                android:layout_width="wrap_content"
+                android:layout_height="48dp"
+                android:background="@drawable/bg_white_round"
+                android:orientation="horizontal">
+
+
+            <TextView
+                    android:id="@+id/less"
+                    android:layout_width="60dp"
+                    android:layout_height="28dp"
+                    android:text="缺少"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/more"
+                    android:layout_width="60dp"
+                    android:layout_height="28dp"
+                    android:text="多余"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+
+            <TextView
+                    android:id="@+id/materialError"
+                    android:layout_width="80dp"
+                    android:layout_height="28dp"
+                    android:text="材质错误"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/propertyError"
+                    android:layout_width="80dp"
+                    android:layout_height="28dp"
+                    android:text="属性错误"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/crossSectionError"
+                    android:layout_width="87dp"
+                    android:layout_height="28dp"
+                    android:text="截面形状错误"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/sizeError"
+                    android:layout_width="80dp"
+                    android:layout_height="28dp"
+                    android:text="尺寸错误"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/positionError"
+                    android:layout_width="80dp"
+                    android:layout_height="28dp"
+                    android:text="位置错误"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/floorslabLess"
+                    android:layout_width="80dp"
+                    android:layout_height="28dp"
+                    android:text="楼板缺少"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/plantHoleLess"
+                    android:layout_width="80dp"
+                    android:layout_height="28dp"
+                    android:text="板洞缺少"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+            <TextView
+                    android:id="@+id/floorslabHeightError"
+                    android:layout_width="80dp"
+                    android:layout_height="28dp"
+                    android:text="楼板高错误"
+                    android:layout_marginLeft="20dp"
+                    android:gravity="center"
+                    android:layout_gravity="center_vertical"
+                    android:textSize="14sp"
+                    android:textColor="#1F2429"/>
+
+
+        </LinearLayout>
+
+        <LinearLayout
+                android:id="@+id/cameraTypeTools"
+                android:layout_marginRight="30dp"
+                android:layout_alignParentRight="true"
+                android:layout_marginTop="40dp"
+                android:paddingTop="20dp"
+                android:paddingBottom="20dp"
+                android:background="@drawable/bg_black_round"
+                android:layout_width="40dp"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+            <TextView
+                    android:id="@+id/tv2d"
+                    android:layout_marginLeft="6dp"
+                    android:layout_marginRight="6dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="2D"
+                    android:textSize="14sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/tv3d"
+                    android:layout_marginLeft="6dp"
+                    android:layout_marginRight="6dp"
+                    android:layout_marginTop="10dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:gravity="center"
+                    android:background="@drawable/bg_blue_round"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="3D"
+                    android:textSize="14sp"
+                    android:textColor="@android:color/white"/>
+        </LinearLayout>
+
+        <LinearLayout
+                android:visibility="gone"
+                android:id="@+id/drawTools"
+                android:layout_marginRight="30dp"
+                android:layout_alignParentRight="true"
+                android:layout_marginTop="40dp"
+                android:paddingTop="20dp"
+                android:paddingBottom="20dp"
+                android:background="@drawable/bg_black_round"
+                android:layout_width="40dp"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+            <TextView
+                    android:id="@+id/point"
+                    android:drawableTop="@drawable/icon_point_white"
+                    android:drawablePadding="3dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:background="@android:color/transparent"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="标记点"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/pline"
+                    android:layout_marginTop="10dp"
+                    android:drawableTop="@drawable/icon_pline_white"
+                    android:drawablePadding="3dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:background="@android:color/transparent"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="多段线"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/close"
+                    android:layout_marginTop="10dp"
+                    android:drawableTop="@drawable/icon_close_white"
+                    android:drawablePadding="3dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:background="@android:color/transparent"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="闭合线"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/save"
+                    android:layout_marginTop="10dp"
+                    android:drawableTop="@drawable/icon_save_white"
+                    android:drawablePadding="3dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:background="@android:color/transparent"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="保存"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/delete"
+                    android:layout_marginTop="10dp"
+                    android:drawableTop="@drawable/icon_delete_white"
+                    android:drawablePadding="3dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:background="@android:color/transparent"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="删除"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+        </LinearLayout>
+
+        <LinearLayout
+                android:visibility="gone"
+                android:id="@+id/quitTools"
+                android:layout_below="@+id/drawTools"
+                android:layout_marginRight="30dp"
+                android:layout_alignParentRight="true"
+                android:layout_marginTop="15dp"
+                android:paddingBottom="20dp"
+                android:background="@drawable/bg_black_round"
+                android:layout_width="40dp"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+            <TextView
+                    android:id="@+id/record"
+                    android:layout_marginTop="10dp"
+                    android:drawableTop="@drawable/icon_record_white"
+                    android:drawablePadding="3dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:background="@android:color/transparent"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="记录\n问题"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/quit"
+                    android:layout_marginTop="10dp"
+                    android:drawableTop="@drawable/icon_quit"
+                    android:drawablePadding="3dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:background="@android:color/transparent"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="退出"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+        </LinearLayout>
+
+        <LinearLayout
+                android:id="@+id/mapTools"
+                android:layout_below="@+id/cameraTypeTools"
+                android:layout_marginRight="30dp"
+                android:layout_alignParentRight="true"
+                android:layout_marginTop="15dp"
+                android:paddingTop="20dp"
+                android:paddingBottom="20dp"
+                android:background="@drawable/bg_black_round"
+                android:layout_width="40dp"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+            <TextView
+                    android:id="@+id/compass"
+                    android:drawableTop="@drawable/icon_compass"
+                    android:layout_marginLeft="3dp"
+                    android:layout_marginRight="3dp"
+                    android:drawablePadding="3dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:background="@android:color/transparent"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="指南"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/vertical"
+                    android:drawableTop="@drawable/icon_vertical"
+                    android:layout_marginLeft="6dp"
+                    android:layout_marginRight="6dp"
+                    android:layout_marginTop="10dp"
+                    android:paddingTop="4dp"
+                    android:drawablePadding="3dp"
+                    android:paddingBottom="4dp"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="俯视"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/degree"
+                    android:drawableTop="@drawable/icon_degree"
+                    android:layout_marginLeft="6dp"
+                    android:layout_marginRight="6dp"
+                    android:layout_marginTop="10dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:drawablePadding="3dp"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="45度"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/lock"
+                    android:drawableTop="@drawable/icon_lock"
+                    android:layout_marginLeft="6dp"
+                    android:layout_marginRight="6dp"
+                    android:layout_marginTop="10dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:drawablePadding="3dp"
+                    android:layout_height="wrap_content"
+                    android:text="锁定视角"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/angle"
+                    android:drawableTop="@drawable/icon_angle"
+                    android:layout_marginLeft="6dp"
+                    android:layout_marginRight="6dp"
+                    android:layout_marginTop="10dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:gravity="center"
+                    android:drawablePadding="3dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="第一人称"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+
+            <TextView
+                    android:id="@+id/overall"
+                    android:visibility="gone"
+                    android:drawableTop="@drawable/icon_overall_white"
+                    android:layout_marginLeft="6dp"
+                    android:layout_marginRight="6dp"
+                    android:layout_marginTop="10dp"
+                    android:paddingTop="4dp"
+                    android:paddingBottom="4dp"
+                    android:gravity="center"
+                    android:drawablePadding="3dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="整层"
+                    android:textSize="12sp"
+                    android:textColor="@android:color/white"/>
+        </LinearLayout>
+
+        <androidx.cardview.widget.CardView
+                android:id="@+id/signProblem"
+                android:layout_alignParentRight="true"
+                android:layout_width="400dp"
+                android:visibility="gone"
+                android:elevation="8dp"
+                android:layout_height="match_parent">
+
+            <LinearLayout
+                    android:background="@android:color/white"
+                    android:layout_width="400dp"
+                    android:layout_height="match_parent"
+                    android:orientation="vertical">
+
+                <RelativeLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal">
+
+                    <TextView
+                            android:layout_marginLeft="32dp"
+                            android:layout_marginTop="16dp"
+                            android:text="标记问题"
+                            android:textSize="16sp"
+                            android:textColor="#1F2329"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"/>
+
+                    <ImageView
+                            android:id="@+id/closeProblem"
+                            android:paddingTop="21dp"
+                            android:paddingRight="25dp"
+                            android:paddingLeft="25dp"
+                            android:paddingBottom="21dp"
+                            android:layout_alignParentRight="true"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:src="@drawable/icon_delete"
+                            />
+                </RelativeLayout>
+
+                <View
+                        android:layout_width="match_parent"
+                        android:layout_height="1px"
+                        android:background="#E4E5E7"/>
+
+                <ScrollView
+                        android:layout_width="match_parent"
+                        android:layout_height="0dp"
+                        android:layout_weight="1">
+
+                </ScrollView>
+
+
+                <LinearLayout
+                        android:background="@android:color/white"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                    <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1px"
+                            android:background="#E4E5E7"/>
+
+                    <TextView
+                            android:id="@+id/saveProblem"
+                            android:text="保存"
+                            android:gravity="center"
+                            android:layout_width="match_parent"
+                            android:layout_height="48dp"
+                            android:textSize="16sp"
+                            android:layout_marginLeft="25dp"
+                            android:layout_marginRight="25dp"
+                            android:textColor="@android:color/white"
+                            android:layout_marginTop="16dp"
+                            android:layout_marginBottom="16dp"
+                            android:background="@drawable/bg_blue_round"/>
+                </LinearLayout>
+            </LinearLayout>
+        </androidx.cardview.widget.CardView>
+
+    </RelativeLayout>
+
+</LinearLayout>

+ 5 - 0
app/src/main/res/values/colors.xml

@@ -7,4 +7,9 @@
     <color name="teal_700">#FF018786</color>
     <color name="black">#FF000000</color>
     <color name="white">#FFFFFFFF</color>
+    <color name="black_1F2329">#1F2329</color>
+    <color name="gray_C3C7CB">#C3C7CB</color>
+    <color name="trans">#00000000</color>
+    <color name="blue_0091FF">#0091FF</color>
+
 </resources>

+ 4 - 0
app/src/main/res/xml/network_security_config.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<network-security-config>
+    <base-config cleartextTrafficPermitted="true" />
+</network-security-config>