全站仪设站

main
huangwei 9 months ago
parent 36e72f239c
commit fb0d12cd49
  1. BIN
      app/libs/agentweb-release.aar
  2. BIN
      app/libs/exFilePicker-release.aar
  3. BIN
      app/libs/javadxf-release.aar
  4. BIN
      app/libs/poishadow-all.jar
  5. 17
      app/src/main/java/com/project/survey/App.java
  6. 5
      app/src/main/java/com/project/survey/ui/home/InstrumentFragment.kt
  7. 13
      app/src/main/java/com/project/survey/ui/instrument/setupstation/BingCeAbstractListActivity.java
  8. 660
      app/src/main/java/com/project/survey/ui/instrument/setupstation/ControlPointsActivity.java
  9. 1038
      app/src/main/java/com/project/survey/ui/instrument/setupstation/ControlPointsNewActivity.java
  10. 5
      app/src/main/java/com/project/survey/ui/instrument/setupstation/ResultsTheExportActivity.java
  11. 2
      app/src/main/java/com/project/survey/ui/instrument/setupstation/SetupStationInputActivity.java
  12. 80
      app/src/main/java/com/project/survey/ui/instrument/setupstation/SetupStationKnownBackSightActivity.java
  13. 64
      app/src/main/java/com/project/survey/ui/instrument/setupstation/SetupStationResectionActivity.java
  14. 76
      app/src/main/java/com/project/survey/ui/instrument/setupstation/SetupStationResectionSubActivity.java
  15. 695
      app/src/main/java/com/project/survey/ui/instrument/setupstation/StakingNewJobActivity.java
  16. 139
      app/src/main/java/com/project/survey/ui/instrument/setupstation/adapter/ControlPointLibraryAdapter.kt
  17. 125
      app/src/main/java/com/project/survey/ui/instrument/setupstation/adapter/StakingPointLibraryAdapter.kt
  18. 34
      app/src/main/java/com/project/survey/ui/instrument/setupstation/bean/StakingJob.java
  19. 47
      app/src/main/java/com/project/survey/ui/instrument/setupstation/callback/ControlPointDiffCallback.kt
  20. 65
      app/src/main/java/com/project/survey/ui/instrument/setupstation/db/controlpoint/Constants.java
  21. 28
      app/src/main/java/com/project/survey/ui/instrument/setupstation/db/controlpoint/ControlPointDao.java
  22. 28
      app/src/main/java/com/project/survey/ui/instrument/setupstation/db/controlpoint/ControlPointItem.java
  23. 67
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/CollectAndroidDataFolderUtils.java
  24. 106
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/CollectLocalDataInAppStartFirstTimeUtil.java
  25. 71
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/ControlPointsClearDialogUtils.java
  26. 242
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/ControlPointsDetailDialogUtils.java
  27. 93
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/ControlPointsExportDialogUtils.java
  28. 60
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/ControlPointsFilterDialogUtils.java
  29. 380
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/ControlPointsImportConfigDialogUtils.java
  30. 341
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/CoordinatorSystemCollectUtils.java
  31. 240
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/JobDbUtils.java
  32. 70
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/JsonStringArray.java
  33. 50
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/MigrationBingCeFolderDataUtils.java
  34. 26
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/MigrationCeliangyuanFolderDataUtils.java
  35. 59
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/ProjectDbUtils.java
  36. 71
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/RoadDbUtils.java
  37. 79
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/StakingPointsLibraryActivitySQLiteUtils.java
  38. 44
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/_1TotalStationCollectUtils.java
  39. 348
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/_3CoordinatorCollectUtils.java
  40. 379
      app/src/main/java/com/project/survey/ui/instrument/setupstation/util/_6GlobalControlPointCollectUtils.java
  41. 308
      app/src/main/java/com/project/survey/util/CassCsvTxtExportUtil.java
  42. 9
      app/src/main/java/com/project/survey/util/CommonUtils.java
  43. 7
      app/src/main/java/com/project/survey/util/DxfUtil.java
  44. 48
      app/src/main/res/layout/activity_points.xml
  45. 307
      app/src/main/res/layout/activity_staking_new_job.xml
  46. 302
      app/src/main/res/layout/activity_staking_new_job2.xml
  47. 19
      app/src/main/res/layout/dialog_control_points_filter.xml
  48. 19
      app/src/main/res/layout/dialog_export_point_config.xml
  49. 95
      app/src/main/res/layout/dialog_new_control_point.xml
  50. 85
      app/src/main/res/layout/dialog_new_staking_point.xml
  51. 1
      app/src/main/res/layout/fragment_instrument.xml
  52. 98
      app/src/main/res/layout/item_staking_point_library.xml
  53. 24
      app/src/main/res/layout/item_staking_point_name_library.xml
  54. 40
      app/src/main/res/layout/layout_menu_more.xml
  55. 116
      app/src/main/res/layout/recyclerview_item_control_point_layout.xml
  56. 20
      app/src/main/res/menu/menu_activity_points.xml
  57. 8
      app/src/main/res/menu/menu_activity_staking_clear.xml
  58. 41
      app/src/main/res/values/strings.xml

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -14,13 +14,12 @@ import blankj.utilcode.util.Utils;
import io.reactivex.functions.Consumer;
import io.reactivex.plugins.RxJavaPlugins;
public class App extends BaseApp {
public class App extends Application {
private static App app;
public boolean isThemeDark;
@Override
public boolean isLandscape() {
return false;
}
@ -44,25 +43,11 @@ public class App extends BaseApp {
}
@Override
protected void initTtsManager() {
}
@Override
public String applicationId() {
return "";
}
@Override
public boolean isThemeDark() {
return false;
}
@Override
public int angleNotNumber() {
return 0;
}
private void initThemeDark() {
Colorful.defaults()

@ -8,6 +8,7 @@ import com.bingce.device.ui.ConnectTSActivity
import com.project.survey.databinding.FragmentInstrumentBinding
import com.project.survey.ui.base.BaseFragmentBinding
import com.project.survey.ui.instrument.satellitosis.SatelliteStatusActivity
import com.project.survey.ui.instrument.setupstation.InstrumentSetFragmentSetupStationTypeUtils
class InstrumentFragment : BaseFragmentBinding<FragmentInstrumentBinding>() {
override fun getViewBinding(
@ -27,6 +28,10 @@ class InstrumentFragment : BaseFragmentBinding<FragmentInstrumentBinding>() {
mBinding.tvSatelliteStatusActivity.setOnClickListener {
startActivity(Intent(requireContext(), SatelliteStatusActivity::class.java))
}
mBinding.tvTotalStationSetupStation.setOnClickListener {
//全站仪设站
InstrumentSetFragmentSetupStationTypeUtils.chooseSetupStationType(this)
}
}

@ -0,0 +1,13 @@
package com.project.survey.ui.instrument.setupstation;
import androidx.recyclerview.widget.RecyclerView;
import com.bingce.activity.AbstractListActivity;
import com.project.survey.App;
public abstract class BingCeAbstractListActivity<T, VH extends RecyclerView.ViewHolder> extends AbstractListActivity<T, VH> {
@Override
protected boolean isLandscape() {
return ((App) getApplication()).isLandscape();
}
}

@ -0,0 +1,660 @@
package com.project.survey.ui.instrument.setupstation;
import static com.bingce.road.parameter.RoadAttributeControlPointConverter.readControlPoint;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import androidx.activity.result.ActivityResult;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.MutableLiveData;
import androidx.recyclerview.widget.RecyclerView;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bingce.data.cache.CachedCurrentProject;
import com.bingce.data.cache.CachedCurrentRoad;
import com.bingce.data.database.DBQueryConstant;
import com.bingce.data.database.KeyValueDb;
import com.bingce.data.database.PointDb;
import com.bingce.data.database.RoadDb;
import com.bingce.data.surveyor.designdata.kv.KeyValueConstants;
import com.bingce.data.surveyor.designdata.kv.KeyValueRecord;
import com.bingce.data.surveyor.designdata.road.RoadConstants;
import com.bingce.data.surveyor.designdata.road.RoadRecord;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointConstants;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord;
import com.bingce.device.ui.dialog.DialogUtil;
import com.bingce.error.BingCeErrorCode;
import com.bingce.file.FileOperator;
import com.bingce.list.SwipeDeleteListLayoutHelper;
import com.bingce.poi.excel.ExcelExportHelper;
import com.bingce.road.RoadIntentUtil;
import com.bingce.utils.ActivityUtils;
import com.bingce.utils.DateUtils;
import com.bingce.utils.FileUtil;
import com.bingce.utils.FragmentUtils;
import com.bingce.utils.IntentUtil;
import com.bingce.utils.StringUtil;
import com.bingce.utils.ThreadPoolUtil;
import com.bingce.utils.Util;
import com.project.survey.BuildConfig;
import com.project.survey.R;
import com.project.survey.databinding.ActivityPointsBinding;
import com.project.survey.databinding.RecyclerviewItemControlPointLayoutBinding;
import com.project.survey.ui.instrument.setupstation.util.ControlPointsClearDialogUtils;
import com.project.survey.ui.instrument.setupstation.util.ControlPointsDetailDialogUtils;
import com.project.survey.ui.instrument.setupstation.util.ControlPointsExportDialogUtils;
import com.project.survey.ui.instrument.setupstation.util.ControlPointsFilterDialogUtils;
import com.project.survey.ui.instrument.setupstation.util.ControlPointsImportConfigDialogUtils;
import org.polaric.colorful.ColorfulActivity;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import blankj.utilcode.util.ToastUtils;
import cn.liuyanbing.surveyor.model.base.Point;
import cn.liuyanbing.surveyor.model.base.PointArray;
import cn.liuyanbing.surveyor.model.base.Road;
/**
* 控制点
*/
public class ControlPointsActivity extends ColorfulActivity {
private String[] mHeaders;
private ProgressDialog mProgressDialog;
private final List<List<String>> exportResult = new ArrayList<>();
private final ControlPointsFilterDialogUtils controlPointsFilterDialogUtils = new ControlPointsFilterDialogUtils(() -> this);
private final ControlPointsDetailDialogUtils controlPointsDetailDialogUtils = new ControlPointsDetailDialogUtils(this);
private final ControlPointsExportDialogUtils controlPointsExportDialogUtils = new ControlPointsExportDialogUtils(this);
private final ControlPointsClearDialogUtils controlPointsClearDialogUtils = new ControlPointsClearDialogUtils(this);
private final ControlPointsImportConfigDialogUtils controlPointsImportConfigDialogUtils = new ControlPointsImportConfigDialogUtils(this);
private final SwipeDeleteListLayoutHelper<DATA, VH> listLayoutHelper = new SwipeDeleteListLayoutHelper<DATA, VH>(this) {
@Override
protected void onDelete(int index, DATA instance, IOnDeleteListener<DATA> listener) {
DialogUtil.mNullCancelAlertDialog(ControlPointsActivity.this, null, R.string.confirm_delete, (dialogInterface, i) -> {
if (StringUtil.isEmpty(instance.roadId)) {//如果是全局控制点
ThreadPoolUtil.execute(() -> {
PointDb.getInstance().delete(instance.pointRecord);
runOnUiThread(() -> listener.completeDelete(instance));
});
} else {//如果是线路控制点,则需要修改线路数据
ThreadPoolUtil.execute(() -> {
RoadRecord roadRecord = RoadDb.getInstance()
.rawQueryData(DBQueryConstant.findById(RoadConstants.DB_NAME, instance.roadId));
if (roadRecord == null) {
BingCeErrorCode.toast(BingCeErrorCode.NO_FOUND_ROAD_BY_ID);
return;
}
Road road = RoadDb.getInstance().roadConverter().convert(roadRecord);
if (road == null) {
BingCeErrorCode.toast(BingCeErrorCode.ROAD_RECORD_CONVERT_2_ROAD_FAILURE);
return;
}
if (instance.index >= 0 && instance.index < road.getControlPointList().size()) {
road.getControlPointList().remove(instance.index);
RoadDb.getInstance().save(road);
}
});
}
binding.fabNewPoint.setVisibility(View.VISIBLE);
});
}
@Override
protected VH newItemContentVH(@NonNull ViewGroup parent, int viewType) {
return new VH(RecyclerviewItemControlPointLayoutBinding.inflate(getLayoutInflater(), parent, false));
}
@Override
protected void onItemClicked(int index, DATA data) {
boolean needReturn = IntentUtil.boolExtra(getIntent(), KEY_IS_RETURN_DATA);
if (needReturn) {
Intent intent = new Intent();
PointRecord instance = data.pointRecord;
intent.putExtra(RESULT_ID, instance.id);
intent.putExtra(RESULT_NAME, instance.name);
intent.putExtra(RESULT_CODE, instance.code);
intent.putExtra(RESULT_REMARK, instance.remarks);
intent.putExtra(RESULT_X, instance.x);
intent.putExtra(RESULT_Y, instance.y);
intent.putExtra(RESULT_Z, instance.h);
setResult(RESULT_OK, intent);
finish();
} else {
controlPointsDetailDialogUtils.showControlPointDialog(
data.roadId, data, getString(R.string.edit_control_point));
}
}
@Override
protected void doBindContent(VH vh, DATA data) {
PointRecord instance = data.pointRecord;
vh.itemBinding.recyclerviewItemSwipePointTitle1.setText(instance.name);
vh.itemBinding.recyclerviewItemSwipePointTitle2.setText(instance.code);
vh.itemBinding.recyclerviewItemSwipePointBody1.setText("X:" + Util.formatDouble2StringDotAuto(instance.x));
vh.itemBinding.recyclerviewItemSwipePointBody2.setText("Y:" + Util.formatDouble2StringDotAuto(instance.y));
vh.itemBinding.recyclerviewItemSwipePointBody3.setText("Z:" + Util.formatDouble2StringDotAuto(instance.h));
vh.itemBinding.recyclerviewItemSwipePointBody4.setText(
StringUtil.isEmpty(data.roadId) ? DateUtils.toFull(instance.createDate) : data.timeString
);
vh.itemBinding.recyclerviewItemSwipePointBody5.setText(instance.remarks);
}
@Override
protected void onMenuOpen() {
binding.fabNewPoint.setVisibility(View.GONE);
}
@Override
protected void onMenuClosed() {
binding.fabNewPoint.setVisibility(View.VISIBLE);
}
@Override
protected RecyclerView recyclerView() {
return binding.recyclerviewPoints;
}
};
private final MutableLiveData<List<DATA>> pointRecordsMutableLiveData = new MutableLiveData<>();
private ActivityPointsBinding binding;
@SuppressLint("SourceLockedOrientationActivity")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityPointsBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
mHeaders = new String[]{getString(R.string.category),
getString(R.string.point_name),
getString(R.string.point_code),
"X", "Y", "Z",
getString(R.string.remarks),
getString(R.string.record_time)};
//监控数据变化
pointRecordsMutableLiveData.observe(this, listLayoutHelper::onDataChanged);
String roadId = RoadIntentUtil.getRoadIdFromIntent(getIntent());
binding.fabNewPoint.setOnClickListener(v -> {
controlPointsDetailDialogUtils.showControlPointDialog(
roadId, null, getString(R.string.new_control_point));
});
boolean isGlobal = IntentUtil.boolExtra(this, KEY_IS_GLOBAL);
ThreadPoolUtil.execute(() -> {
if (isGlobal) {
String projectId = CachedCurrentProject.currentProjectId();
runOnUiThread(() -> {
PointDb.getInstance()
.rawQueryListLiveData(PointConstants.findControlPointByProject(projectId))
.observe(this, pointRecords -> {
List<DATA> dataList = new ArrayList<>();
for (PointRecord record : pointRecords) {
dataList.add(new DATA(record));
}
pointRecordsMutableLiveData.setValue(dataList);
});
});
} else {
if (!StringUtil.isEmpty(roadId)) {//
runOnUiThread(() -> {
RoadDb.getInstance()
.rawQueryLiveData(DBQueryConstant.findById(RoadConstants.DB_NAME, roadId))
.observe(this, roadRecord -> {
if (roadRecord == null){
return;
}
PointArray pointArray = new PointArray();
String error = readControlPoint(roadRecord.controlPointJson, roadRecord.name, pointArray);
if (!StringUtil.isEmpty(error)) {
ToastUtils.showShort(error);
return;
}
List<DATA> dataList = new ArrayList<>();
for (int index = 0; index < pointArray.size(); index++) {
Point point = pointArray.get(index);
dataList.add(new DATA(roadId, index,
new PointRecord(null, null, null,
-1,
point.getName(), point.getCode(), point.getRemarks(),
point.getX(), point.getY(), point.getZ(),
0, 0, 0,
PointConstants.POINT_FORMAT_XYZ, null), point.getTime()));
}
pointRecordsMutableLiveData.setValue(dataList);
});
});
} else {
//查询当前线路
String projectId = CachedCurrentProject.currentProjectId();
String currentRoadId = CachedCurrentRoad.currentRoadId(projectId);
runOnUiThread(() -> {
RoadDb.getInstance()
.rawQueryLiveData(DBQueryConstant.findById(RoadConstants.DB_NAME, currentRoadId))
.observe(this, roadRecord -> {
PointArray pointArray = new PointArray();
String error = readControlPoint(roadRecord.controlPointJson, roadRecord.name, pointArray);
if (!StringUtil.isEmpty(error)) {
ToastUtils.showShort(error);
return;
}
List<DATA> dataList = new ArrayList<>();
for (int index = 0; index < pointArray.size(); index++) {
Point point = pointArray.get(index);
dataList.add(new DATA(roadId, index,
new PointRecord(null, null, null,
-1,
point.getName(), point.getCode(), point.getRemarks(),
point.getX(), point.getY(), point.getZ(),
0, 0, 0,
PointConstants.POINT_FORMAT_XYZ, null), point.getTime()));
}
pointRecordsMutableLiveData.setValue(dataList);
});
});
}
}
});
}
private void updateData(String filterKey) {
String roadId = RoadIntentUtil.getRoadIdFromIntent(getIntent());
boolean isGlobal = IntentUtil.boolExtra(this, KEY_IS_GLOBAL);
ThreadPoolUtil.execute(() -> {
if (isGlobal) {//处理全局控制点
String projectId = CachedCurrentProject.currentProjectId();
List<PointRecord> pointRecords = PointDb.getInstance()
.rawQueryListData(PointConstants.findGlobalControlByNameLike(projectId, filterKey));
List<DATA> dataList = new ArrayList<>();
for (PointRecord record : pointRecords) {
dataList.add(new DATA(record));
}
runOnUiThread(() -> {
pointRecordsMutableLiveData.setValue(dataList);
});
} else {//处理线路控制点
if (!StringUtil.isEmpty(roadId)) {//
RoadRecord roadRecord = RoadDb.getInstance()
.rawQueryData(DBQueryConstant.findById(RoadConstants.DB_NAME, roadId));
PointArray pointArray = new PointArray();
String error = readControlPoint(roadRecord.controlPointJson, roadRecord.name, pointArray);
if (!StringUtil.isEmpty(error)) {
ToastUtils.showShort(error);
return;
}
runOnUiThread(() -> updatePointList(roadId, pointArray, filterKey));
} else {
//查询当前线路
String projectId = CachedCurrentProject.currentProjectId();
String currentRoadId = CachedCurrentRoad.currentRoadId(projectId);
RoadRecord roadRecord = RoadDb.getInstance()
.rawQueryData(DBQueryConstant.findById(RoadConstants.DB_NAME, currentRoadId));
PointArray pointArray = new PointArray();
String error = readControlPoint(roadRecord.controlPointJson, roadRecord.name, pointArray);
if (!StringUtil.isEmpty(error)) {
ToastUtils.showShort(error);
return;
}
runOnUiThread(() -> updatePointList(roadId, pointArray, filterKey));
}
}
});
}
private void updatePointList(String roadId, PointArray pointArray, String filterKey) {
List<DATA> dataList = new ArrayList<>();
if (pointArray != null) {
for (int index = 0; index < pointArray.size(); index++) {
Point point = pointArray.get(index);
if (StringUtil.isEmpty(filterKey) || point.getName().contains(filterKey)) {
dataList.add(new DATA(roadId, index,
new PointRecord(null, null, null,
-1,
point.getName(), point.getCode(), point.getRemarks(),
point.getX(), point.getY(), point.getZ(),
0, 0, 0,
PointConstants.POINT_FORMAT_XYZ, null), point.getTime()));
}
}
}
pointRecordsMutableLiveData.setValue(dataList);
}
@SuppressLint("StaticFieldLeak")
private void exportExcelAsync(final String name, final String[] headers) {
new AsyncTask<Integer, Integer, Boolean>() {
@Override
protected void onPreExecute() {
mProgressDialog = new ProgressDialog(ControlPointsActivity.this);
mProgressDialog.setMessage(getString(R.string.export_points));
mProgressDialog.setOnCancelListener(dialog -> cancel(true));
mProgressDialog.setCancelable(true);
mProgressDialog.show();
}
@Override
protected Boolean doInBackground(Integer... params) {
exportResult.clear();
for (int i = 0; i < listLayoutHelper.itemSize(); i++) {
DATA data = listLayoutHelper.getItem(i);
PointRecord point = data.pointRecord;
ArrayList<String> rowResult = new ArrayList<>();
String type = getString(R.string.control_point);
rowResult.add(type);
rowResult.add(point.name);
rowResult.add(point.code);
rowResult.add(Util.formatDouble2StringDotAuto(point.x));
rowResult.add(Util.formatDouble2StringDotAuto(point.y));
rowResult.add(Util.formatDouble2StringDotAuto(point.h));
rowResult.add(point.remarks);
rowResult.add(DateUtils.toFull(point.createDate));
exportResult.add(rowResult);
}
if (!exportResult.isEmpty()) {
new ExcelExportHelper().exportExcelForBigDataAndSave(headers, exportResult, getString(R.string.point_data), ExcelExportHelper.MORE_SHEET_FLAG, FileUtil.getSDPath() + "/" + getString(R.string.surveyor_exported_file) + "/" + getString(R.string.point_data), name);
}
return true;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
mProgressDialog.dismiss();
File file = new File(FileUtil.getSDPath() + "/" + getString(R.string.surveyor_exported_file) + "/" + getString(R.string.point_data) + "/" + name + ".xls");
if (file.exists()) {
FileUtil.scanFile(ControlPointsActivity.this, file);
showExportOverDialog(file);
}
}
}.execute();
}
private void showExportOverDialog(final File file) {
new MaterialDialog.Builder(this).title(R.string.export_successful)
.content(R.string.exported_file_save_at_surveyor_exported_files)
.positiveText(R.string.send_to)
.negativeText(R.string.open)
.neutralText(R.string.close)
.onPositive((dialog, which) -> FileOperator.shareFile(ControlPointsActivity.this, file, BuildConfig.APPLICATION_ID))
.onNegative((dialog, which) -> FileUtil.openFile(ControlPointsActivity.this, file))
.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu_activity_points, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
case R.id.menu_point_search:
controlPointsFilterDialogUtils.showFilterDialog(instance -> {
updateData(instance);
binding.tvFilterKey.setVisibility(StringUtil.isEmpty(instance) ? View.GONE : View.VISIBLE);
binding.tvFilterKey.setText(getString(R.string.filter) + ":[" + instance + "]");
});
break;
case R.id.menu_point_import:
controlPointsImportConfigDialogUtils.showImportConfigDialog();
break;
case R.id.menu_point_export:
controlPointsExportDialogUtils.showExportDialog(name -> {
exportExcelAsync(name, mHeaders);
});
break;
case R.id.menu_point_clear:
controlPointsClearDialogUtils.showClearDialog(() -> {
ThreadPoolUtil.execute(() -> {
boolean isGlobal = IntentUtil.boolExtra(this, KEY_IS_GLOBAL);
if (isGlobal) {//清空当前项目所有全局控制点
KeyValueRecord currentProjectConfig = KeyValueDb.getInstance().findData(KeyValueConstants.KEY_CURRENT_PROJECT_ID);
if (currentProjectConfig == null) {
BingCeErrorCode.toast(BingCeErrorCode.NO_CURRENT_PROJECT);
return;
}
PointDb.getInstance().deleteControlPoints(currentProjectConfig.value);
} else {//尝试清空当前线路所有控制点
String roadId = RoadIntentUtil.getRoadIdFromIntent(getIntent());
if (!StringUtil.isEmpty(roadId)) {
ThreadPoolUtil.execute(() -> {
RoadRecord roadRecord = RoadDb.getInstance()
.rawQueryData(DBQueryConstant.findById(RoadConstants.DB_NAME, roadId));
if (roadRecord == null) {
BingCeErrorCode.toast(BingCeErrorCode.NO_FOUND_ROAD_BY_ID);
return;
}
Road road = RoadDb.getInstance().roadConverter().convert(roadRecord);
road.getControlPointList().clear();
RoadDb.getInstance().save(road);
});
}
}
});
ToastUtils.showShort(R.string.clean_over);
});
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
finish();
break;
}
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
boolean isGlobal = IntentUtil.boolExtra(this, KEY_IS_GLOBAL);
controlPointsImportConfigDialogUtils.onActivityResult(isGlobal, requestCode, resultCode, data);
}
public static class DATA {
public final String roadId;
public final int index;
public final PointRecord pointRecord;
public final String timeString;
public DATA(PointRecord pointRecord) {
this(null, -1, pointRecord, null);
}
DATA(String roadId, int index, PointRecord pointRecord, String timeString) {
this.roadId = roadId;
this.index = index;
this.pointRecord = pointRecord;
this.timeString = timeString;
}
@Override
public String toString() {
return "DATA{" +
"roadId='" + roadId + '\'' +
", pointRecord=" + pointRecord.toString() +
", timeString='" + timeString + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (o instanceof DATA){
DATA pointRecord = (DATA) o;
return pointRecord.toString().equals(this.toString());
}
return false;
}
}
private static class VH extends RecyclerView.ViewHolder {
private final RecyclerviewItemControlPointLayoutBinding itemBinding;
public VH(@NonNull RecyclerviewItemControlPointLayoutBinding binding) {
super(binding.getRoot());
itemBinding = binding;
}
}
private final static String KEY_IS_GLOBAL = "is global";//是否查看全局控制点
private final static String KEY_IS_RETURN_DATA = "is return data";//是否返回选择点
private final static String RESULT_ID = "id";
private final static String RESULT_NAME = "name";
private final static String RESULT_CODE = "code";
private final static String RESULT_REMARK = "remark";
private final static String RESULT_X = "X";
private final static String RESULT_Y = "Y";
private final static String RESULT_Z = "Z";
public static void pickPoint(FragmentActivity activity, boolean isGlobal, @NonNull IPickCallback callback) {
Intent intent2 = new Intent(activity, ControlPointsActivity.class);
intent2.putExtra(KEY_IS_RETURN_DATA, true);
intent2.putExtra(KEY_IS_GLOBAL, isGlobal);
if (isGlobal) {
ActivityUtils.startActivityForResults(activity, intent2, result -> {
onPicked(result, callback);
});
} else {
ThreadPoolUtil.execute(() -> {
String projectId = CachedCurrentProject.currentProjectId();
String roadId = CachedCurrentRoad.currentRoadId(projectId);
RoadIntentUtil.setRoadId(intent2, roadId);
ThreadPoolUtil.executeInMain(() -> {
ActivityUtils.startActivityForResults(activity, intent2, result -> {
onPicked(result, callback);
});
});
});
}
}
public static void pickPoint(Fragment fragment, boolean isGlobal, @NonNull IPickCallback callback) {
Intent intent2 = new Intent(fragment.getContext(), ControlPointsActivity.class);
intent2.putExtra(KEY_IS_RETURN_DATA, true);
intent2.putExtra(KEY_IS_GLOBAL, isGlobal);
if (isGlobal) {
FragmentUtils.startActivityForResults(fragment, intent2, result -> {
onPicked(result, callback);
});
} else {
ThreadPoolUtil.execute(() -> {
String projectId = CachedCurrentProject.currentProjectId();
String roadId = CachedCurrentRoad.currentRoadId(projectId);
RoadIntentUtil.setRoadId(intent2, roadId);
ThreadPoolUtil.executeInMain(() -> {
FragmentUtils.startActivityForResults(fragment, intent2, result -> {
onPicked(result, callback);
});
});
});
}
}
private static void onPicked(ActivityResult result, @NonNull IPickCallback callback) {
if (result == null || result.getResultCode() != RESULT_OK || result.getData() == null) {
return;
}
Intent intent = result.getData();
callback.onPicked(
intent.getStringExtra(RESULT_NAME),
intent.getStringExtra(RESULT_CODE),
intent.getDoubleExtra(RESULT_X, 0),
intent.getDoubleExtra(RESULT_Y, 0),
intent.getDoubleExtra(RESULT_Z, 0),
intent.getStringExtra(RESULT_REMARK));
}
public static void pickPoint(FragmentActivity activity, boolean isGlobal, @NonNull IPickCallback2 callback) {
Intent intent2 = new Intent(activity, ControlPointsActivity.class);
intent2.putExtra(KEY_IS_RETURN_DATA, true);
intent2.putExtra(KEY_IS_GLOBAL, isGlobal);
if (isGlobal) {
ActivityUtils.startActivityForResults(activity, intent2, result -> {
onPicked2(result, callback);
});
} else {
ThreadPoolUtil.execute(() -> {
String projectId = CachedCurrentProject.currentProjectId();
String roadId = CachedCurrentRoad.currentRoadId(projectId);
RoadIntentUtil.setRoadId(intent2, roadId);
ThreadPoolUtil.executeInMain(() -> {
ActivityUtils.startActivityForResults(activity, intent2, result -> {
onPicked2(result, callback);
});
});
});
}
}
private static void onPicked2(ActivityResult result, @NonNull IPickCallback2 callback) {
if (result == null || result.getResultCode() != RESULT_OK || result.getData() == null) {
return;
}
Intent intent = result.getData();
callback.onPicked(
intent.getStringExtra(RESULT_ID),
intent.getStringExtra(RESULT_NAME),
intent.getStringExtra(RESULT_CODE),
intent.getDoubleExtra(RESULT_X, 0),
intent.getDoubleExtra(RESULT_Y, 0),
intent.getDoubleExtra(RESULT_Z, 0),
intent.getStringExtra(RESULT_REMARK));
}
public interface IPickCallback {
void onPicked(String name, String code, double x, double y, double z, String remarks);
}
public interface IPickCallback2 {
void onPicked(String pointId, String name, String code, double x, double y, double z, String remarks);
}
public static void startRoadControlListActivity(Context context, String roadId) {
Intent intent = new Intent(context, ControlPointsActivity.class);
RoadIntentUtil.setRoadId(intent, roadId);
intent.putExtra(KEY_IS_GLOBAL, false);
context.startActivity(intent);
}
public static void startGlobalControlListActivity(Context context) {
Intent intent = new Intent(context, ControlPointsActivity.class);
intent.putExtra(KEY_IS_GLOBAL, true);
context.startActivity(intent);
}
}

@ -18,14 +18,13 @@ import com.bingce.data.cache.CachedProject;
import com.bingce.data.database.PointDb;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointConstants;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord;
import com.bingce.surveyor.util.ConstUtils;
import com.bingce.surveyor.util.dialog.CustomDialog;
import com.bingce.utils.IntentUtil;
import com.bingce.utils.StringUtil;
import com.bingce.utils.ThreadPoolUtil;
import com.bingce.utils.Util;
import com.google.gson.Gson;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
@ -35,6 +34,8 @@ import com.project.survey.ui.base.BaseSurveyNewActivity;
import com.project.survey.ui.instrument.setupstation.db.PointSurveyRecord;
import com.project.survey.ui.instrument.setupstation.db.RecordsFixedDataBase;
import com.project.survey.ui.instrument.setupstation.db.resultformat.FormatRecord;
import com.project.survey.util.CassCsvTxtExportUtil;
import com.project.survey.util.DxfUtil;
import com.project.survey.util.ExcelUtil;
import com.project.survey.util.FormatSuffixesUtils;
import com.project.survey.util.SystemUtils;

@ -1,12 +1,10 @@
package com.project.survey.ui.instrument.setupstation;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bingce.AppChannel;
import com.bingce.device.ui.totalstation.AbstractSetupStationInputActivity;
import com.project.survey.App;
import com.project.survey.R;
import blankj.utilcode.util.Utils;
public class SetupStationInputActivity extends AbstractSetupStationInputActivity {

@ -0,0 +1,80 @@
package com.project.survey.ui.instrument.setupstation;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bingce.AppChannel;
import com.bingce.device.ui.totalstation.AbstractSetupStationKnownBackSightActivity;
import com.bingce.surveyor.agentweb.AgentWebActivity;
import com.project.survey.App;
import com.project.survey.R;
import blankj.utilcode.util.Utils;
public class SetupStationKnownBackSightActivity extends AbstractSetupStationKnownBackSightActivity {
@Override
protected void hideSoftKey() {
BingCeBaseSurveyPresenter.hideSoftKey();
}
@Override
protected void speak(String string) {
BingCeBaseSurveyPresenter.speak(string);
}
@Override
protected void updateLastRTKLocation() {
BingCeBaseSurveyPresenter.updateLastRTKLocation();
}
@Override
protected boolean checkRegister() {
return BingCeBaseSurveyPresenter.checkRegister();
}
@Override
protected int volumeUpAction() {
return BingCeBaseSurveyPresenter.volumeUpAction();
}
@Override
protected int volumeDownAction() {
return BingCeBaseSurveyPresenter.volumeDownAction();
}
@Override
protected void selectPoint(boolean station) {
String[] titles = new String[]{
getString(R.string.point_survey_point_library),
getString(R.string.staking_point_library)};
new MaterialDialog.Builder(this)
.title(R.string.data_source)
.items(titles)
.itemsCallback((dialog, itemView, which, text) -> {
switch (which) {
case 0:
CoordinatePointsLibraryActivity.pickPoint(this, (name, code, x, y, z, b, l, h) -> {
onPicked(station, name, x, y, z);
});
break;
case 1:
StakingNewJobActivity.pickPoint(this, (name, x, y, z) -> {
onPicked(station, name, x, y, z);
});
break;
}
}).show();
}
@Override
protected void openHelpWeb() {
// Intent intent = new Intent(Utils.getApp(), AgentWebActivity.class);
// intent.putExtra("short_url", "android_url_activity_setup_station_known_back_sight_help");
// startActivity(intent);
AgentWebActivity.navigation2(
this, "android_url_activity_setup_station_known_back_sight_help");
}
@Override
protected boolean isThemeDark() {
return ((App) Utils.getApp()).isThemeDark;
}
}

@ -0,0 +1,64 @@
package com.project.survey.ui.instrument.setupstation;
import android.content.Intent;
import com.bingce.device.ui.totalstation.AbstractSetupStationResectionActivity;
import com.bingce.surveyor.agentweb.AgentWebActivity;
import com.project.survey.App;
import blankj.utilcode.util.Utils;
public class SetupStationResectionActivity extends AbstractSetupStationResectionActivity {
@Override
protected void openHelpWeb() {
// Intent intent = new Intent(Utils.getApp(), AgentWebActivity.class);
// intent.putExtra("short_url", "android_url_activity_setup_station_resection_help");
// startActivity(intent);
AgentWebActivity.navigation2(this, "android_url_activity_setup_station_resection_help");
}
@Override
protected boolean isThemeDark() {
return ((App) Utils.getApp()).isThemeDark;
}
@Override
protected void initData() {
}
@Override
protected void hideSoftKey() {
BingCeBaseSurveyPresenter.hideSoftKey();
}
@Override
protected void speak(String string) {
BingCeBaseSurveyPresenter.speak(string);
}
@Override
protected void updateLastRTKLocation() {
BingCeBaseSurveyPresenter.updateLastRTKLocation();
}
@Override
protected boolean checkRegister() {
return BingCeBaseSurveyPresenter.checkRegister();
}
@Override
protected int volumeUpAction() {
return BingCeBaseSurveyPresenter.volumeUpAction();
}
@Override
protected int volumeDownAction() {
return BingCeBaseSurveyPresenter.volumeDownAction();
}
@Override
protected void startSetupStationResectionSubActivity() {
startActivityForResult(new Intent(Utils.getApp(), SetupStationResectionSubActivity.class), 30);
}
}

@ -0,0 +1,76 @@
package com.project.survey.ui.instrument.setupstation;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bingce.device.ui.totalstation.AbstractSetupStationResectionSubActivity;
import com.project.survey.App;
import com.project.survey.R;
import blankj.utilcode.util.Utils;
public class SetupStationResectionSubActivity extends AbstractSetupStationResectionSubActivity {
@Override
protected void hideSoftKey() {
BingCeBaseSurveyPresenter.hideSoftKey();
}
@Override
protected void speak(String string) {
BingCeBaseSurveyPresenter.speak(string);
}
@Override
protected void updateLastRTKLocation() {
BingCeBaseSurveyPresenter.updateLastRTKLocation();
}
@Override
protected boolean checkRegister() {
return BingCeBaseSurveyPresenter.checkRegister();
}
@Override
protected int volumeUpAction() {
return BingCeBaseSurveyPresenter.volumeUpAction();
}
@Override
protected int volumeDownAction() {
return BingCeBaseSurveyPresenter.volumeDownAction();
}
@Override
protected void selectPoint() {
new MaterialDialog.Builder(this)
.title(R.string.data_source)
.items(new String[]{getString(R.string.road_control_point), getString(R.string.global_control_point), getString(R.string.point_survey_point_library), getString(R.string.staking_point_library)})
.itemsCallback((dialog, itemView, which, text) -> {
switch (which) {
case 0:
ControlPointsNewActivity.pickPoint(this, false, (name, code, x, y, z, remarks) -> {
onPicked(name, x, y, z);
});
break;
case 1:
ControlPointsNewActivity.pickPoint(this, true, (name, code, x, y, z, remarks) -> {
onPicked(name, x, y, z);
});
break;
case 2:
CoordinatePointsLibraryActivity.pickPoint(this, (name, code, x, y, z, b, l, h) -> {
onPicked(name, x, y, z);
});
break;
case 3:
StakingNewJobActivity.pickPoint(this, (name, x, y, z) -> {
onPicked(name, x, y, z);
});
break;
}
}).show();
}
@Override
protected boolean isThemeDark() {
return ((App) Utils.getApp()).isThemeDark;
}
}

@ -0,0 +1,695 @@
package com.project.survey.ui.instrument.setupstation;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Handler;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.LiveData;
import androidx.paging.Pager;
import androidx.paging.PagingConfig;
import androidx.paging.PagingData;
import androidx.paging.PagingLiveData;
import androidx.paging.PagingSource;
import androidx.recyclerview.widget.RecyclerView;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.MDButton;
import com.bingce.data.cache.CachedCurrentJob;
import com.bingce.data.cache.CachedProject;
import com.bingce.data.database.PointDb;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointConstants;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord;
import com.bingce.surveyor.agentweb.AgentWebActivity;
import com.bingce.surveyor.util.dialog.CustomDialog;
import com.bingce.ui.BcDialogExt;
import com.bingce.utils.ActivityUtils;
import com.bingce.utils.PointLibraryUtil;
import com.bingce.utils.SimpleTextWatcher;
import com.bingce.utils.StringUtil;
import com.bingce.utils.ThreadPoolUtil;
import com.bingce.utils.Util;
import com.bingce.viewmodel.AbstractCoordinatePointsLibraryViewModelKt;
import com.kongzue.dialogx.interfaces.OnBindView;
import com.project.survey.App;
import com.project.survey.R;
import com.project.survey.databinding.ActivityStakingNewJob2Binding;
import com.project.survey.dialog.BubblePopWindow;
import com.project.survey.ui.base.BaseSurveyNewActivity;
import com.project.survey.ui.instrument.setupstation.adapter.StakingPointLibraryAdapter;
import com.project.survey.ui.instrument.setupstation.util.StakingPointsLibraryActivitySQLiteUtils;
import com.project.survey.util.CommonUtils;
import com.rengwuxian.materialedittext.MaterialEditText;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import blankj.utilcode.util.ConvertUtils;
import blankj.utilcode.util.ToastUtils;
import blankj.utilcode.util.Utils;
import ru.bartwell.exfilepicker.ExFilePicker;
import ru.bartwell.exfilepicker.data.ExFilePickerResult;
public class StakingNewJobActivity extends BaseSurveyNewActivity {
private RecyclerView.OnScrollListener leftScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (recyclerView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {
binding.bodyRv.scrollBy(dx, dy);
}
}
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
binding.bodyHsv.setIntercept(newState != RecyclerView.SCROLL_STATE_IDLE);
}
};
private RecyclerView.OnScrollListener rightScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (!isFinishing() && recyclerView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {
binding.bodyNameRv.scrollBy(dx, dy);
}
}
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
binding.bodyNameRl.setIntercept(newState != RecyclerView.SCROLL_STATE_IDLE);
}
};
private static final int EX_FILE_PICKER_RESULT_SURVEYOR_EXCEL = 330;
private static final int EX_FILE_PICKER_RESULT_SURVEYOR_TXT = 331;
private static final int EX_FILE_PICKER_RESULT_CASS_DAT = 332;
private ActivityStakingNewJob2Binding binding;
private final StakingPointLibraryAdapter stakingPointLibraryAdapter = new StakingPointLibraryAdapter(new PointRecordDiffCallback2(), this, false);
private final StakingPointLibraryAdapter stakingPointNameLibraryAdapter = new StakingPointLibraryAdapter(new PointRecordDiffCallback2(), this, true);
private AbstractCoordinatePointsLibraryViewModelKt.FilterParameter filterParameter = new AbstractCoordinatePointsLibraryViewModelKt.FilterParameter();
private Pager<Integer, PointRecord> pager = new Pager<>(
new PagingConfig(100),
this::dataSourse);
private final FilterHandlerNew filterHandler = new FilterHandlerNew(new FilterHandlerNew.FilterCallBack() {
@Override
public void fireByKey(String key) {
ThreadPoolUtil.execute(() -> {
String projectId = CachedProject.currentProjectId();
jobId = CachedCurrentJob.currentJobId(projectId);
ThreadPoolUtil.executeInMain(() -> {
pagingDataLiveData.removeObservers(StakingNewJobActivity.this);
pagingDataLiveData = PagingLiveData.cachedIn(PagingLiveData.getLiveData(pager), getLifecycle());
pagingDataLiveData.observe(StakingNewJobActivity.this, downloadRecordPagingData -> {
refreshAdapter(downloadRecordPagingData);
});
});
});
}
});
private void refreshAdapter(PagingData<PointRecord> downloadRecordPagingData) {
stakingPointLibraryAdapter.submitData(getLifecycle(), downloadRecordPagingData);
stakingPointNameLibraryAdapter.submitData(getLifecycle(), downloadRecordPagingData);
stakingPointLibraryAdapter.resetConfig();
stakingPointNameLibraryAdapter.resetConfig();
stakingPointLibraryAdapter.notifyDataSetChanged();
stakingPointNameLibraryAdapter.notifyDataSetChanged();
new Handler().postDelayed(() -> binding.tvPointNumber.setText(stakingPointLibraryAdapter.getItemCount() + ""), 500);
}
private final static String KEY_IS_SELECT = "is_selected";
private final static String RESULT_POINT_ID = "pointId";
private final static String RESULT_INDEX = "index";
private final static String RESULT_NAME = "name";
private final static String RESULT_X = "x";
private final static String RESULT_Y = "y";
private final static String RESULT_Z = "z";
private String jobId;
private LiveData<PagingData<PointRecord>> pagingDataLiveData;
public View getContentView() {
binding = ActivityStakingNewJob2Binding.inflate(getLayoutInflater());
return binding.getRoot();
}
@Override
protected void initView() {
setTitle(getString(R.string.staking_point_library));
if (((App) Utils.getApp()).isThemeDark) {
binding.topLayout.setBackgroundColor(getColor(R.color.theme_dark_black));
binding.tvNumber.setTextColor(getColor(R.color.white));
}
binding.bodyRv.setAdapter(stakingPointLibraryAdapter);
binding.bodyNameRv.setAdapter(stakingPointNameLibraryAdapter);
binding.bodyHsv.setScrollView(binding.headerHsv);
binding.headerHsv.setScrollView(binding.bodyHsv);
binding.bodyRv.addOnScrollListener(rightScrollListener);
binding.bodyNameRv.addOnScrollListener(leftScrollListener);
binding.bodyRv.addOnItemTouchListener(new SimpleRecyclerViewItemClickListener(binding.bodyRv, (view, position) -> {
stakingPointLibraryAdapter.setSelItemPos(position);
stakingPointNameLibraryAdapter.setSelItemPos(position);
}));
binding.bodyNameRv.addOnItemTouchListener(new SimpleRecyclerViewItemClickListener(binding.bodyNameRv, (view, position) -> {
stakingPointLibraryAdapter.setSelItemPos(position);
stakingPointNameLibraryAdapter.setSelItemPos(position);
}));
ThreadPoolUtil.execute(() -> {
String projectId = CachedProject.currentProjectId();
jobId = CachedCurrentJob.currentJobId(projectId);
ThreadPoolUtil.executeInMain(() -> {
pagingDataLiveData = PagingLiveData.cachedIn(PagingLiveData.getLiveData(pager), getLifecycle());
pagingDataLiveData
.observe(this, downloadRecordPagingData -> {
refreshAdapter(downloadRecordPagingData);
});
});
});
binding.pointsLibraryBtnConfirm.setOnClickListener(v -> {
int row = stakingPointLibraryAdapter.getSelItemPos();
PointRecord record = stakingPointLibraryAdapter.getSelItem();
if (record == null) {
ToastUtils.showShort(R.string.please_select_one_data_item);
return;
}
Intent intent = new Intent();
intent.putExtra(RESULT_POINT_ID, record.id);
intent.putExtra(RESULT_INDEX, row);
intent.putExtra(RESULT_NAME, record.name);
intent.putExtra(RESULT_X, record.x);
intent.putExtra(RESULT_Y, record.y);
intent.putExtra(RESULT_Z, record.h);
setResult(RESULT_OK, intent);
finish();
});
binding.pointsLibraryBtnNewCreate.setOnClickListener(v -> showPointDialog(null, getString(R.string.new_point)));
boolean isSelect = getIntent().getBooleanExtra(KEY_IS_SELECT, true);
if (isSelect) {
binding.pointsLibraryBtnConfirm.setVisibility(View.VISIBLE);
binding.pointsLibraryBtnDelete.setVisibility(View.GONE);
binding.pointsLibraryBtnMore.setVisibility(View.GONE);
} else {
binding.pointsLibraryBtnConfirm.setVisibility(View.GONE);
binding.pointsLibraryBtnDelete.setVisibility(View.VISIBLE);
binding.pointsLibraryBtnMore.setVisibility(View.VISIBLE);
}
binding.etEnterNameCode.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void afterTextChanged(Editable s) {
filterHandler.onFilterStringChanged(s.toString());
}
});
binding.pointsLibraryBtnFilter.setOnClickListener(v -> {
PointFilterActivity.startFilter(StakingNewJobActivity.this, false,
filterParameter.getNeedSurvey(), filterParameter.getNeedInput(), filterParameter.getNeedControl(),
filterParameter.getDateStart(), filterParameter.getDateEnd(),
filterParameter.getNameKey(), filterParameter.getCodeKey(), filterParameter.getRemarkKey(),
(needSurvey, needInput, needControl, dateStart, dateEnd, nameKey, codeKey, remarksKey) -> {
filterParameter.setNeedSurvey(needSurvey);
filterParameter.setNeedInput(needInput);
filterParameter.setNeedControl(needControl);
filterParameter.setDateStart(dateStart);
filterParameter.setDateEnd(dateEnd);
filterParameter.setNameKey(nameKey);
filterParameter.setCodeKey(codeKey);
filterParameter.setRemarkKey(remarksKey);
ThreadPoolUtil.execute(() -> {
String projectId = CachedProject.currentProjectId();
jobId = CachedCurrentJob.currentJobId(projectId);
ThreadPoolUtil.executeInMain(() -> {
pagingDataLiveData.removeObservers(this);
pagingDataLiveData =
PagingLiveData.cachedIn(PagingLiveData.getLiveData(pager), getLifecycle());
pagingDataLiveData.observe(this, downloadRecordPagingData -> {
refreshAdapter(downloadRecordPagingData);
});
});
});
});
});
binding.pointsLibraryBtnNewCreate.setOnClickListener(v -> {
showPointDialog(null, getString(R.string.new_point));
});
binding.pointsLibraryBtnDelete.setOnClickListener(v -> {
int row = stakingPointLibraryAdapter.getSelItemPos();
PointRecord record = stakingPointLibraryAdapter.getSelItem();
if (record == null) {
ToastUtils.showShort(R.string.please_select_one_data_item);
return;
}
//删除所选数据
if (StringUtil.isEmpty(record.id)) {
return;
}
BcDialogExt.create().showMessage(getString(R.string.warning), getString(R.string.want_to_delete_point_library), getString(R.string.confirm), getString(R.string.cancel), (baseDialog, view) -> {
//删除数据库中数据
ThreadPoolUtil.execute(() -> {
PointDb.getInstance().deleteById(record.id);
});
setResult(LauncherEvent.launcher_delete_point_lib);
return false;
}, (baseDialog, view) -> false);
});
binding.pointsLibraryBtnMore.setOnClickListener(v -> {
com.kongzue.dialogx.dialogs.CustomDialog.show(new OnBindView<com.kongzue.dialogx.dialogs.CustomDialog>(R.layout.layout_menu_more) {
private TextView tvImport;
private TextView tvExport;
private TextView tvEdit;
@Override
public void onBind(final com.kongzue.dialogx.dialogs.CustomDialog dialog, View v) {
if (((App) Utils.getApp()).isThemeDark) {
v.setBackground(getDrawable(R.drawable.round_dark));
}
tvImport = v.findViewById(R.id.tv_import);
tvExport = v.findViewById(R.id.tv_export);
tvEdit = v.findViewById(R.id.tv_edit);
tvExport.setVisibility(View.GONE);
tvImport.setOnClickListener(v12 -> {
showImportConfigDialog();
dialog.dismiss();
});
tvEdit.setOnClickListener(v1 -> {
int row = stakingPointLibraryAdapter.getSelItemPos();
PointRecord record = stakingPointLibraryAdapter.getSelItem();
if (record == null) {
ToastUtils.showShort(R.string.please_select_one_data_item);
return;
}
showPointDialog(record, getString(R.string.edit_known_point));
dialog.dismiss();
});
}
})
.setCancelable(false)
.setCancelable(true)
.setEnterAnimResId(R.anim.anim_dialogx_bottom_enter)
.setExitAnimResId(R.anim.anim_dialogx_bottom_exit)
.setAlignBaseViewGravity(
binding.pointsLibraryBtnMore,
Gravity.TOP | Gravity.RIGHT
)
.setBaseViewMarginLeft(ConvertUtils.dp2px(-126f))
.show();
});
}
@Override
protected void initData() {
}
private PagingSource<Integer, PointRecord> dataSourse() {
return PointDb.getInstance().rawQueryPagingSource(StakingPointsLibraryActivitySQLiteUtils.searchSQLit(
jobId,
filterParameter, true, binding.etEnterNameCode.getText().toString().trim()
));
}
private List<PointRecord> getAllPoint() {
return PointDb.getInstance().rawQueryListData(StakingPointsLibraryActivitySQLiteUtils.searchSQLit(
jobId,
filterParameter, true, binding.etEnterNameCode.getText().toString().trim()
));
}
private MaterialEditText met_name, met_code, met_x, met_y, met_z, met_remarks;
private MDButton mPositiveAction;
public void showPointDialog(final PointRecord pointRecord, String title) {
MaterialDialog dialog = new MaterialDialog.Builder(this)
.title(title)
.customView(R.layout.dialog_new_staking_point, false)
.onPositive((dialog1, which) -> {
ThreadPoolUtil.execute(() -> {
PointRecord record = pointRecord;
if (record != null) {
record.name = met_name.getText().toString().trim();
record.code = met_code.getText().toString().trim();
record.x = "".equals(met_x.getText().toString().trim()) ? 0 : Double.parseDouble(met_x.getText().toString().trim());
record.y = "".equals(met_y.getText().toString().trim()) ? 0 : Double.parseDouble(met_y.getText().toString().trim());
record.h = "".equals(met_z.getText().toString().trim()) ? 0 : Double.parseDouble(met_z.getText().toString().trim());
record.remarks = met_remarks.getText().toString().trim();
} else {
String projectId = CachedProject.currentProjectId();
jobId = CachedCurrentJob.currentJobId(projectId);
record = new PointRecord(projectId, jobId, "",
PointConstants.POINT_TYPE_KNOWN_POINT,
met_name.getText().toString().trim(),
met_code.getText().toString().trim(),
met_remarks.getText().toString().trim(),
"".equals(met_x.getText().toString().trim()) ? 0 : Double.parseDouble(met_x.getText().toString().trim()),
"".equals(met_y.getText().toString().trim()) ? 0 : Double.parseDouble(met_y.getText().toString().trim()),
"".equals(met_z.getText().toString().trim()) ? 0 : Double.parseDouble(met_z.getText().toString().trim()),
0, 0, 0,
PointConstants.POINT_FORMAT_XYZ, null);
}
PointDb.getInstance().save(record);
});
CommonUtils.hideSoftInput();
})
.positiveText(this.getString(R.string.save))
.negativeText(this.getString(R.string.cancel)).build();
met_name = dialog.getCustomView().findViewById(R.id.met_dialog_new_staking_point_name);
met_code = dialog.getCustomView().findViewById(R.id.met_dialog_new_staking_point_code);
met_x = dialog.getCustomView().findViewById(R.id.met_dialog_new_staking_point_x);
met_y = dialog.getCustomView().findViewById(R.id.met_dialog_new_staking_point_y);
met_z = dialog.getCustomView().findViewById(R.id.met_dialog_new_staking_point_z);
met_remarks = dialog.getCustomView().findViewById(R.id.met_dialog_new_staking_point_remarks);
mPositiveAction = dialog.getActionButton(DialogAction.POSITIVE);
initMaterialEditTextColor();
if (pointRecord != null) {
met_name.setText(pointRecord.name);
met_code.setText(pointRecord.code);
met_x.setText(Util.formatDouble2StringDotAuto(pointRecord.x));
met_y.setText(Util.formatDouble2StringDotAuto(pointRecord.y));
met_z.setText(Util.formatDouble2StringDotAuto(pointRecord.h));
met_remarks.setText(pointRecord.remarks);
}
TextWatcher watcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String name_text = met_name.getText().toString().trim();
String x_text = met_x.getText().toString().trim();
String y_text = met_y.getText().toString().trim();
String z_text = met_z.getText().toString().trim();
if (!"".equals(name_text)
&& !"-".equals(x_text)
&& !"-".equals(y_text)
&& !"-".equals(z_text)
&& !".".equals(x_text)
&& !".".equals(y_text)
&& !".".equals(z_text)
&& !"-.".equals(x_text)
&& !"-.".equals(y_text)
&& !"-.".equals(z_text)
&& !("".equals(x_text) && "".equals(y_text) && "".equals(z_text))) {
mPositiveAction.setEnabled(true);
} else {
mPositiveAction.setEnabled(false);
}
}
};
met_name.addTextChangedListener(watcher);
met_code.addTextChangedListener(watcher);
met_x.addTextChangedListener(watcher);
met_y.addTextChangedListener(watcher);
met_z.addTextChangedListener(watcher);
met_remarks.addTextChangedListener(watcher);
dialog.show();
mPositiveAction.setEnabled(false);
}
private void initMaterialEditTextColor() {
if (((App) Utils.getApp()).isThemeDark) {
met_name.setMetTextColor(Color.WHITE);
met_x.setMetTextColor(Color.WHITE);
met_y.setMetTextColor(Color.WHITE);
met_z.setMetTextColor(Color.WHITE);
met_name.setPrimaryColor(Color.LTGRAY);
met_x.setPrimaryColor(Color.LTGRAY);
met_y.setPrimaryColor(Color.LTGRAY);
met_z.setPrimaryColor(Color.LTGRAY);
met_name.setFocusFraction(1.0f);
met_x.setFocusFraction(1.0f);
met_y.setFocusFraction(1.0f);
met_z.setFocusFraction(1.0f);
met_name.setMetHintTextColor(Color.GRAY);
met_x.setMetHintTextColor(Color.GRAY);
met_y.setMetHintTextColor(Color.GRAY);
met_z.setMetHintTextColor(Color.GRAY);
met_name.setUnderlineColor(Color.GRAY);
met_x.setUnderlineColor(Color.GRAY);
met_y.setUnderlineColor(Color.GRAY);
met_z.setUnderlineColor(Color.GRAY);
}
}
private void showImportConfigDialog() {
new MaterialDialog.Builder(this)
.title(R.string.please_choose_import_format)
.items(new String[]{getString(R.string.excel_xls)
, getString(R.string.text_txt)
, getString(R.string.cass_dat_txt)})
.itemsCallback(new MaterialDialog.ListCallback() {
@Override
public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) {
String[] filter = null;
int intentResultNumber = EX_FILE_PICKER_RESULT_SURVEYOR_EXCEL;
String message = "";
switch (which) {
case 0:
filter = new String[]{"xls", "xlsx"};
intentResultNumber = EX_FILE_PICKER_RESULT_SURVEYOR_EXCEL;
message = getString(R.string.import_point_excel_guide);
break;
case 1:
filter = new String[]{"txt"};
intentResultNumber = EX_FILE_PICKER_RESULT_SURVEYOR_TXT;
message = getString(R.string.import_point_text_guide);
break;
case 2:
showImportCassXYDialog();
return;
}
if (filter != null) {
final int finalIntentResultNumber = intentResultNumber;
final String[] finalFilter = filter;
new AlertDialog.Builder(StakingNewJobActivity.this)
.setTitle(R.string.import_points)
.setMessage(message)
.setPositiveButton(R.string.overwrite_import, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isOverrideImport = true;
selectFolder(finalIntentResultNumber, finalFilter);
}
})
.setNegativeButton(R.string.additional_import, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isOverrideImport = false;
selectFolder(finalIntentResultNumber, finalFilter);
}
})
.setNeutralButton(R.string.view_sample, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Intent intent = new Intent();
// intent.setClass(Utils.getApp(), AgentWebActivity.class);
// intent.putExtra("short_url", "android_url_import_point_sample");
// startActivity(intent);
AgentWebActivity.navigation2(
StakingNewJobActivity.this,
"android_url_import_point_sample");
}
})
.show();
}
}
}).show();
}
private void selectFolder(final int intentResultNumber, final String[] filter) {
ExFilePicker exFilePicker = new ExFilePicker();
exFilePicker.setLandscape(((App) Utils.getApp()).isLandscape());
exFilePicker.setShowOnlyExtensions(filter);
exFilePicker.start(StakingNewJobActivity.this, intentResultNumber);
}
private boolean isOverrideImport;
private boolean cassXY = false;//cass格式按照xy排序,否则yx排序
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
ExFilePickerResult object = ExFilePickerResult.getFromIntent(data);
if (object != null && object.getCount() > 0) {
ThreadPoolUtil.execute(() -> {
String projectId = CachedProject.currentProjectId();
jobId = CachedCurrentJob.currentJobId(projectId);
try {
String path = object.getPath() + object.getNames().get(0);
String result = null;
switch (requestCode) {
case EX_FILE_PICKER_RESULT_SURVEYOR_EXCEL:
result = PointLibraryUtil.importStakingJobPointExcel(new File(path), projectId, jobId, isOverrideImport);
break;
case EX_FILE_PICKER_RESULT_SURVEYOR_TXT:
result = PointLibraryUtil.importStakingJobPointTxt(new File(path), projectId, jobId, isOverrideImport);
break;
case EX_FILE_PICKER_RESULT_CASS_DAT:
result = PointLibraryUtil.importStakingJobPointCassDat(new File(path), projectId, jobId, isOverrideImport, cassXY);
break;
}
if (result != null) ToastUtils.showShort(result);
} catch (Exception e) {
Log.e("StakingNewJobActivity", "File select error", e);
}
});
}
}
}
}
private void showImportCassXYDialog() {
cassXY = false;
String message;
if (cassXY) {
message = getString(R.string.import_point_cass_xy_dat);
} else {
message = getString(R.string.import_point_cass_yx_dat);
}
new AlertDialog.Builder(StakingNewJobActivity.this)
.setTitle(R.string.import_points)
.setMessage(message)
.setPositiveButton(R.string.overwrite_import, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isOverrideImport = true;
selectFolder(EX_FILE_PICKER_RESULT_CASS_DAT, new String[]{"dat", "txt"});
}
})
.setNegativeButton(R.string.additional_import, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isOverrideImport = false;
selectFolder(EX_FILE_PICKER_RESULT_CASS_DAT, new String[]{"dat", "txt"});
}
})
.setNeutralButton(R.string.view_sample, (dialog, which) -> AgentWebActivity.navigation2(
StakingNewJobActivity.this,
"android_url_import_point_sample"))
.show();
}
protected void onCommonRightClicked(View view) {
if (stakingPointLibraryAdapter.getItemCount() != 0) {
new CustomDialog.Builder(this)
.setContent(getString(R.string.want_to_empty_point_library))
.setButtonConfirm(v ->
ThreadPoolUtil.execute(() -> {
stakingPointLibraryAdapter.clear(getAllPoint());
runOnUiThread(() -> setResult(LauncherEvent.launcher_delete_point_lib));
}))
.create().show();
} else {
ToastUtils.showShort(getString(R.string.no_data_clear));
}
}
public static void start(Context context) {
Intent intent = new Intent(context, StakingNewJobActivity.class);
intent.putExtra(KEY_IS_SELECT, false);
context.startActivity(intent);
}
@Override
public BubblePopWindow newBubblePopWindow(Context context) {
return new BubblePopWindow(this, Arrays.asList(new BubblePopWindow.CustomMenuItem(R.drawable.icon_function_delete, getString(R.string.clear), () -> {
if (stakingPointLibraryAdapter.getItemCount() != 0) {
BcDialogExt.create().showMessageWithTick(getString(R.string.warning), getString(R.string.want_to_empty_point_library), getString(R.string.confirm), getString(R.string.cancel), (baseDialog, view) -> {
ThreadPoolUtil.execute(() -> {
stakingPointLibraryAdapter.clear(getAllPoint());
runOnUiThread(() -> setResult(LauncherEvent.launcher_delete_point_lib));
});
return false;
}, (baseDialog, view) -> false);
} else {
ToastUtils.showShort(getString(R.string.no_data_clear));
}
})));
}
@Override
public boolean isHideHelpDoc() {
return true;
}
public static void pickPoint(FragmentActivity context, ICallback callback) {
pickPoint(context, (pointId, index, name, x, y, z) -> callback.onPicked(name, x, y, z));
}
public static void pickPoint(FragmentActivity context, ICallbackWithIndex callback) {
Intent intent = new Intent(context, StakingNewJobActivity.class);
intent.putExtra(KEY_IS_SELECT, true);
ActivityUtils.startActivityForResults(context, intent, result -> {
if (result.getResultCode() == RESULT_OK && result.getData() != null) {
String pointId = result.getData().getStringExtra(RESULT_POINT_ID);
int index = result.getData().getIntExtra(RESULT_INDEX, -1);
String name = result.getData().getStringExtra(RESULT_NAME);
double x = result.getData().getDoubleExtra(RESULT_X, 0);
double y = result.getData().getDoubleExtra(RESULT_Y, 0);
double z = result.getData().getDoubleExtra(RESULT_Z, 0);
if (callback != null) {
callback.onPicked(pointId, index, name, x, y, z);
}
}
});
}
public interface ICallback {
void onPicked(String name, double x, double y, double z);
}
public interface ICallbackWithIndex {
void onPicked(String pointId, int index, String name, double x, double y, double z);
}
@Override
protected void onDestroy() {
try {
binding.bodyNameRv.removeOnScrollListener(leftScrollListener);
binding.bodyRv.removeOnScrollListener(rightScrollListener);
leftScrollListener = null;
rightScrollListener = null;
} catch (Exception e) {
e.printStackTrace();
}
super.onDestroy();
}
}

@ -0,0 +1,139 @@
package com.project.survey.ui.instrument.setupstation.adapter
import android.content.Context
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.bingce.data.database.PointDb
import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord
import com.bingce.utils.DateUtils
import com.bingce.utils.Util
import com.project.survey.databinding.ItemStakingPointLibraryBinding
import com.project.survey.databinding.ItemStakingPointNameLibraryBinding
import com.project.survey.ui.instrument.setupstation.ControlPointsActivity
class ControlPointLibraryAdapter(diffCallback: DiffUtil.ItemCallback<ControlPointsActivity.DATA>, val context: Context, private val onlyPointName:Boolean): PagingDataAdapter<ControlPointsActivity.DATA,ControlPointLibraryAdapter.BaseVH>(diffCallback) {
private var mSelItemPos = -1
fun setSelItemPos(pos:Int){
mSelItemPos = pos
notifyDataSetChanged()
}
fun getSelItemPos():Int{
return mSelItemPos
}
fun getSelItem():ControlPointsActivity.DATA?{
if (mSelItemPos == -1) return null
return getItem(mSelItemPos)
}
fun resetConfig(){
mSelItemPos = -1
}
fun item(index:Int):ControlPointsActivity.DATA?{
return getItem(index)
}
//clear全局控制点
// fun clear(){
// ThreadPoolUtil.execute {
// val list = ArrayList<PointRecord>()
// (0 until itemCount).forEach {
// getItem(it)?.let { it1 -> list.add(it1.pointRecord) }
// }
// mSelItemPos = -1
// PointDb.getInstance().delete(list)
// }
// }
fun clear(pointRecords:List<PointRecord>){
mSelItemPos = -1
PointDb.getInstance().delete(pointRecords)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseVH {
return if (onlyPointName){
VH2(ItemStakingPointNameLibraryBinding.inflate(LayoutInflater.from(context),parent,false))
}else {
VH(
ItemStakingPointLibraryBinding.inflate(
LayoutInflater.from(context),
parent,
false
)
)
}
}
// override fun getItemCount(): Int {
// return arrayList.size
// }
override fun onBindViewHolder(holder: BaseVH, position: Int) {
getItem(position)?.let { holder.update(it) }
}
override fun onBindViewHolder(holder: BaseVH, position: Int, payloads: MutableList<Any>) {
if (payloads.isEmpty()){
onBindViewHolder(holder,position)
}else{
val bundle = payloads[0]
getItem(position)?.let { holder.updatePart(it,bundle as Bundle) }
}
}
inner class VH2(val vb: ItemStakingPointNameLibraryBinding): BaseVH(vb.root) {
override fun update(data: ControlPointsActivity.DATA) {
if (data.pointRecord == null) return
vb.tvName.text = data.pointRecord.name
if (mSelItemPos == absoluteAdapterPosition){
vb.root.setBackgroundColor(Color.rgb(226, 236, 215))
}else{
vb.root.background = null
}
}
override fun updatePart(data: ControlPointsActivity.DATA, bundle: Bundle) {
for (key in bundle.keySet()) {
val value = bundle.getString(key)?:""
when (key) {
"name"-> vb.tvName.text = value
else -> {}
}
}
}
}
inner class VH(val vb: ItemStakingPointLibraryBinding): BaseVH(vb.root) {
override fun update(data: ControlPointsActivity.DATA) {
if (data.pointRecord == null) return
vb.tvCode.text = data.pointRecord.code
vb.tvX.text = Util.formatDouble2StringDotAuto(data.pointRecord.x)
vb.tvY.text = Util.formatDouble2StringDotAuto(data.pointRecord.y)
vb.tvH.text = Util.formatDouble2StringDotAuto(data.pointRecord.h)
vb.tvTime.text = DateUtils.toFull(data.pointRecord.createDate)
vb.tvRemark.text = data.pointRecord.remarks
if (mSelItemPos == absoluteAdapterPosition){
vb.root.setBackgroundColor(Color.rgb(226, 236, 215))
}else{
vb.root.background = null
}
}
override fun updatePart(data: ControlPointsActivity.DATA, bundle: Bundle) {
for (key in bundle.keySet()) {
val value = bundle.getString(key)?:""
when (key) {
"code"-> vb.tvCode.text = value
"x"->vb.tvX.text = value
"y"->vb.tvY.text = value
"h"->vb.tvH.text = value
"time"->vb.tvTime.text = value
else -> {}
}
}
}
}
abstract class BaseVH(val view: View):RecyclerView.ViewHolder(view){
abstract fun update(data:ControlPointsActivity.DATA)
abstract fun updatePart(data: ControlPointsActivity.DATA, bundle: Bundle)
}
}

@ -0,0 +1,125 @@
package com.project.survey.ui.instrument.setupstation.adapter
import android.content.Context
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.bingce.data.database.PointDb
import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord
import com.bingce.utils.DateUtils
import com.bingce.utils.Util
import com.project.survey.databinding.ItemStakingPointLibraryBinding
import com.project.survey.databinding.ItemStakingPointNameLibraryBinding
class StakingPointLibraryAdapter(diffCallback: DiffUtil.ItemCallback<PointRecord>, val context: Context, private val onlyPointName:Boolean): PagingDataAdapter<PointRecord,StakingPointLibraryAdapter.BaseVH>(diffCallback) {
private var mSelItemPos = -1
fun setSelItemPos(pos:Int){
mSelItemPos = pos
notifyDataSetChanged()
}
fun getSelItemPos():Int{
return mSelItemPos
}
fun resetConfig(){
mSelItemPos = -1
}
fun getSelItem():PointRecord?{
if (mSelItemPos == -1) return null
return getItem(mSelItemPos)
}
fun resetSelPos(){
mSelItemPos = -1
}
fun clear(pointRecords:List<PointRecord>){
mSelItemPos = -1
PointDb.getInstance().delete(pointRecords)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseVH {
return if (onlyPointName){
VH2(ItemStakingPointNameLibraryBinding.inflate(LayoutInflater.from(context),parent,false))
}else {
VH(
ItemStakingPointLibraryBinding.inflate(
LayoutInflater.from(context),
parent,
false
)
)
}
}
// override fun getItemCount(): Int {
// return arrayList.size
// }
override fun onBindViewHolder(holder: BaseVH, position: Int) {
getItem(position)?.let { holder.update(it) }
}
override fun onBindViewHolder(holder: BaseVH, position: Int, payloads: MutableList<Any>) {
if (payloads.isEmpty()){
onBindViewHolder(holder,position)
}else{
val bundle = payloads[0]
getItem(position)?.let { holder.updatePart(it,bundle as Bundle) }
}
}
inner class VH2(val vb: ItemStakingPointNameLibraryBinding): BaseVH(vb.root) {
override fun update(pointRecord: PointRecord) {
vb.tvName.text = pointRecord.name
if (mSelItemPos == absoluteAdapterPosition){
vb.root.setBackgroundColor(Color.rgb(226, 236, 215))
}else{
vb.root.background = null
}
}
override fun updatePart(pointRecord: PointRecord, bundle: Bundle) {
for (key in bundle.keySet()) {
val value = bundle.getString(key)?:""
when (key) {
"name"-> vb.tvName.text = value
else -> {}
}
}
}
}
inner class VH(val vb: ItemStakingPointLibraryBinding): BaseVH(vb.root) {
override fun update(pointRecord: PointRecord) {
vb.tvCode.text = pointRecord.code
vb.tvX.text = Util.formatDouble2StringDotAuto(pointRecord.x)
vb.tvY.text = Util.formatDouble2StringDotAuto(pointRecord.y)
vb.tvH.text = Util.formatDouble2StringDotAuto(pointRecord.h)
vb.tvTime.text = DateUtils.toFull(pointRecord.createDate)
vb.tvRemark.text = pointRecord.remarks
if (mSelItemPos == absoluteAdapterPosition){
vb.root.setBackgroundColor(Color.rgb(226, 236, 215))
}else{
vb.root.background = null
}
}
override fun updatePart(pointRecord: PointRecord, bundle: Bundle) {
for (key in bundle.keySet()) {
val value = bundle.getString(key)?:""
when (key) {
"code"-> vb.tvCode.text = value
"x"->vb.tvX.text = value
"y"->vb.tvY.text = value
"h"->vb.tvH.text = value
"time"->vb.tvTime.text = value
else -> {}
}
}
}
}
abstract class BaseVH(val view: View):RecyclerView.ViewHolder(view){
abstract fun update(pointRecord:PointRecord)
abstract fun updatePart(pointRecord: PointRecord, bundle: Bundle)
}
}

@ -0,0 +1,34 @@
package com.project.survey.ui.instrument.setupstation.bean;
import java.io.Serializable;
import cn.liuyanbing.surveyor.model.base.PointArray;
public class StakingJob implements Serializable {
private static final long serialVersionUID = 202008141046L;
String name = "Default";
private PointArray pointList = new PointArray();
public StakingJob() {
}
public StakingJob(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PointArray getPointList() {
return pointList;
}
public void setPointList(PointArray pointList) {
this.pointList = pointList;
}
}

@ -0,0 +1,47 @@
package com.project.survey.ui.instrument.setupstation.callback
import android.os.Bundle
import android.text.TextUtils
import androidx.recyclerview.widget.DiffUtil
import com.bingce.utils.DateUtils
import com.bingce.utils.Util
import com.project.survey.ui.instrument.setupstation.ControlPointsActivity
class ControlPointDiffCallback: DiffUtil.ItemCallback<ControlPointsActivity.DATA>() {
override fun areItemsTheSame(oldItem: ControlPointsActivity.DATA, newItem: ControlPointsActivity.DATA): Boolean {
if (oldItem.pointRecord == null || newItem.pointRecord == null || TextUtils.isEmpty(oldItem.pointRecord.id) || TextUtils.isEmpty(newItem.pointRecord.id)){
return false
}
return oldItem.pointRecord.id == newItem.pointRecord.id
}
override fun areContentsTheSame(oldItem: ControlPointsActivity.DATA, newItem: ControlPointsActivity.DATA): Boolean {
return oldItem == newItem
}
override fun getChangePayload(oldItem: ControlPointsActivity.DATA, newItem: ControlPointsActivity.DATA): Any? {
val bundle = Bundle()
if (oldItem.pointRecord.name != newItem.pointRecord.name){
bundle.putString("name",newItem.pointRecord.name)
}
if (oldItem.pointRecord.code != newItem.pointRecord.code){
bundle.putString("code",newItem.pointRecord.code)
}
if (oldItem.pointRecord.x != newItem.pointRecord.x){
bundle.putString("x", Util.formatDouble2StringDotAuto(newItem.pointRecord.x))
}
if (oldItem.pointRecord.y != newItem.pointRecord.y){
bundle.putString("y", Util.formatDouble2StringDotAuto(newItem.pointRecord.y))
}
if (oldItem.pointRecord.h != newItem.pointRecord.h){
bundle.putString("h", Util.formatDouble2StringDotAuto(newItem.pointRecord.h))
}
if (oldItem.pointRecord.createDate.time != newItem.pointRecord.createDate.time){
bundle.putString("time", DateUtils.toFull(newItem.pointRecord.createDate))
}
if (bundle.size() == 0) return null
return bundle
}
}

@ -0,0 +1,65 @@
package com.project.survey.ui.instrument.setupstation.db.controlpoint;
public class Constants {
public static final String DB_NAME_CONFIG = "__configs__";
public static final String DB_NAME_USER = "__users__";
public static final String DB_NAME_PROJECT = "__projects__";
public static final String DB_NAME_PROJECT2 = "__projects_2_";
public static final String DB_NAME_PART = "__parts__";
public static final String DB_NAME_POINT = "__points__";
public static final String DB_NAME_CONTROL_POINT = "__control_points__";
public static final String DB_NAME_STAKE_RECORD = "__stake_records__";
public static final String DB_SQL_SELECT_CONFIG_ALL = "SELECT * FROM " + DB_NAME_CONFIG;
public static final String DB_SQL_SELECT_CONFIG_BY_ID = "SELECT * FROM " + DB_NAME_CONFIG + " WHERE id =:id";
public static final String DB_SQL_COUNT_OF_CONFIG = "SELECT count(*) FROM " + DB_NAME_CONFIG;
public static final String DB_SQL_SELECT_PROJECT_ALL = "SELECT * FROM " + DB_NAME_PROJECT2;
public static final String DB_SQL_DELETE_PROJECT_ALL = "DELETE FROM " + DB_NAME_PROJECT2;
public static final String DB_SQL_SELECT_PROJECT_BY_ID = "SELECT * FROM " + DB_NAME_PROJECT2 + " WHERE id =:id";
public static final String DB_SQL_SELECT_RECORD_ALL = "SELECT * FROM " + DB_NAME_STAKE_RECORD;
public static final String DB_SQL_SELECT_RECORD_BY_ID =
"SELECT * FROM " + DB_NAME_STAKE_RECORD + " WHERE id =:id";
public static final String DB_SQL_DELETE_RECORD_BY_ID =
"DELETE FROM " + DB_NAME_STAKE_RECORD + " WHERE id =:id";
public static final String DB_SQL_SELECT_RECORD_BY_POSITION_ID =
"SELECT * FROM " + DB_NAME_STAKE_RECORD + " WHERE position_id =:id";
public static final String DB_SQL_SELECT_PART_ALL = "SELECT * FROM " + DB_NAME_PART;
public static final String DB_SQL_SELECT_PART_BY_ID = "SELECT * FROM " + DB_NAME_PART + " WHERE id =:id";
public static final String DB_SQL_SELECT_PART_BY_PROJECT_ID =
"SELECT * FROM " + DB_NAME_PART + " WHERE project_id =:id and parent_id=\"-1\"";
public static final String DB_SQL_SELECT_PART_BY_PARENT_ID =
"SELECT * FROM " + DB_NAME_PART + " WHERE parent_id =:id";
public static final String DB_SQL_SELECT_CONTROL_POINTS_ALL =
"SELECT * FROM " + DB_NAME_CONTROL_POINT;
public static final String DB_SQL_SELECT_CONTROL_POINT_BY_ID =
"SELECT * FROM " + DB_NAME_CONTROL_POINT + " WHERE id =:id";
public static final String DB_SQL_SELECT_CONTROL_POINTS_BY_PROJECT_ID =
"SELECT * FROM " + DB_NAME_CONTROL_POINT + " WHERE project_id =:id";
public static final String DB_SQL_SELECT_POINT_ALL = "SELECT * FROM " + DB_NAME_POINT;
public static final String DB_SQL_SELECT_POINT_BY_ID = "SELECT * FROM " + DB_NAME_POINT + " WHERE id =:id";
public static final String DB_SQL_SELECT_POINT_BY_PART_ID = "SELECT * FROM " + DB_NAME_POINT + " WHERE position_id =:id order by point_name asc";
public static final String DB_SQL_SELECT_POINT_BY_PROJECT_ID = "SELECT * FROM " + DB_NAME_POINT + " WHERE project_id =:id order by point_name asc";
public static final String DB_SQL_DELETE_POINT_BY_PROJECT_POSITION = "DELETE FROM " + DB_NAME_POINT + " WHERE ( project_id =:projectId ) AND ( position_id =:positionId)";
public static final String DB_SQL_DELETE_POINT_BY_PROJECT = "DELETE FROM " + DB_NAME_POINT + " WHERE ( project_id =:projectId ) ";
public static final String DB_CONFIG_KEY_USER_NAME = "__user_name_new";
public static final String DB_CONFIG_KEY_PWD = "__password_new";
public static final String DB_CONFIG_KEY_COOKIE = "__cookie";
public static final String DB_CONFIG_KEY_LAST_PROJECT = "__last_project__";
public static final String DB_CONFIG_KEY_LAST_LOGIN = "__last_login__";
public static final String API_RET_FLAG = "rtnFlag";
public static final String API_RET_MSG = "rtnMessage";
public static final String API_RET_OBJ = "rtnObj";
public static final String API_RET_FLAG_IS_SUCCESS = "isSuccess";
public static final String API_RET_MSG_2 = "rtnMsg";
public static final int MEASURE_TYPE_WORK = 1;
public static final int MEASURE_TYPE_CHECK = 3;
}

@ -0,0 +1,28 @@
package com.project.survey.ui.instrument.setupstation.db.controlpoint;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import java.util.List;
@Dao
public interface ControlPointDao {
@Query(Constants.DB_SQL_SELECT_CONTROL_POINTS_ALL)
LiveData<List<ControlPointItem>> getAll();
@Query(Constants.DB_SQL_SELECT_CONTROL_POINT_BY_ID)
LiveData<ControlPointItem> find(String id);
@Query(Constants.DB_SQL_SELECT_CONTROL_POINTS_BY_PROJECT_ID)
LiveData<List<ControlPointItem>> findByProjectId(String id);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(ControlPointItem... tubes);
@Delete
void delete(ControlPointItem tube);
}

@ -0,0 +1,28 @@
package com.project.survey.ui.instrument.setupstation.db.controlpoint;
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = Constants.DB_NAME_CONTROL_POINT)
public class ControlPointItem {
@NonNull
@PrimaryKey
public String id;
@ColumnInfo(name = "point_name")
public String pointName;
@ColumnInfo(name = "project_id")
public String projectId;
@ColumnInfo(name = "x")
public double X;
@ColumnInfo(name = "y")
public double Y;
@ColumnInfo(name = "z")
public double Z;
}

@ -0,0 +1,67 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import androidx.annotation.WorkerThread;
import com.bingce.TimeCount;
import com.bingce.data.database.KeyValueDb;
import com.bingce.data.surveyor.designdata.kv.KeyValueRecord;
import com.bingce.road.xport.RoadAllUtil;
import java.io.File;
public class CollectAndroidDataFolderUtils {
@WorkerThread
public static boolean collectFromDataFolder(Context appCompatActivity, File dataFolder, CollectLocalDataInAppStartFirstTimeUtil.ILog log, TimeCount.ITimeCounter timeCounter) {
log.log("检测Data目录下数据");
if (!dataFolder.exists()) {
log.log("Data目录不存在");
return false;
}
File[] children = dataFolder.listFiles();
if (children == null || children.length == 0) {
log.log("Data目录为空.");
return false;
}
//检测是否有road目录
boolean hasRoad = false;
for (File folder : children) {
if (RoadAllUtil.isRoadFolder(folder)) {
hasRoad = true;
break;
}
}
if (!hasRoad) {
log.log("Data目录为空..");
return false;
}
File mark = new File(dataFolder, CollectLocalDataInAppStartFirstTimeUtil.COLLECTED_FILE_NAME);
if (mark.exists()) {//已经收集过了
log.log("Data目录数据已收集");
return true;
}
//1.收集全站仪数据
_1TotalStationCollectUtils.collect(dataFolder, log);
//遍历目录
File[] projects = dataFolder.listFiles();
if (projects == null) {
log.log("项目数据为空");
return false;
}
//2.遍历项目目录
for (File project : projects) {
if (!project.exists() || project.isFile()) {
continue;
}
ProjectDbUtils.collect(appCompatActivity, project, log, timeCounter);
}
//生成收集标识
if (!CollectLocalDataInAppStartFirstTimeUtil.generatorCollectedFile(dataFolder)) {
KeyValueDb.getInstance().save(new KeyValueRecord());
}
return true;
}
}

@ -0,0 +1,106 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import androidx.annotation.WorkerThread;
import com.bingce.TimeCount;
import com.bingce.data.database.ProjectCoordinateDatabase;
import com.bingce.data.database.SurveyRecordDatabase;
import com.bingce.data.database.SyncRecordDatabase;
import com.bingce.utils.FileUtil;
import com.bingce.utils.StringUtil;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.project.survey.R;
import java.io.File;
import java.io.IOException;
import blankj.utilcode.util.ToastUtils;
/**
* 应用首次启动时执行的操作
*/
public class CollectLocalDataInAppStartFirstTimeUtil {
static final String COLLECTED_FILE_NAME = "collected2";
static final String GENERATOR_COLLECTED_FILE_FAILURE = "generator_collect_failure";
@WorkerThread
public static void collectData(Context activity, ILog log, TimeCount.ITimeCounter timeCounter) {
log.log("执行数据库清除");
//1.先清除数据库
SurveyRecordDatabase.getInstance().clearAllTables();
ProjectCoordinateDatabase.getInstance().clearAllTables();
SyncRecordDatabase.getInstance().clearAllTables();
log.log("读取本地数据");
//2.开始收集本地数据
collect(activity, log, timeCounter);
}
@WorkerThread
private static void collect(Context appCompatActivity, ILog log, TimeCount.ITimeCounter timeCounter) {
//1.优先尝试读取私有目录
File appFolder = new File(appCompatActivity.getFilesDir(), "Project");
if (!CollectAndroidDataFolderUtils.collectFromDataFolder(appCompatActivity, appFolder, log, timeCounter)) {
if (XXPermissions.isGranted(appCompatActivity, Permission.MANAGE_EXTERNAL_STORAGE)) {
//2.尝试读取根目录下数据--如果有权限 ,就尝试收集根目录,否则以后收集
collectFromDisk(appCompatActivity, log, timeCounter);
}
}
}
@WorkerThread
public static void collectFromDisk(Context appCompatActivity, ILog log, TimeCount.ITimeCounter timeCounter) {
log.log("检测BingCe目录下数据");
//1.检测‘BingCe’目录
String sdPath = FileUtil.getSDPath();
if (StringUtil.isEmpty(sdPath)) {
log.log("读取手机根目录失败.");
return;
}
File rootFolder = new File(FileUtil.getSDPath());
if (!rootFolder.exists()) {
log.log("读取手机根目录失败..");
ToastUtils.showShort("读取手机根目录失败!");
return;
}
//1.检测冰测目录
File bingceFolder = new File(rootFolder, "Bingce");
File surveyorFolder = new File(bingceFolder, "Surveyor");
File mark = new File(surveyorFolder, COLLECTED_FILE_NAME);
if (mark.exists() || !surveyorFolder.exists() || !MigrationBingCeFolderDataUtils.collectFromBingCeFolder(appCompatActivity, surveyorFolder, log, timeCounter)) {
//2.检测‘测量员’目录
File celiangyuanFolder = new File(rootFolder, appCompatActivity.getString(R.string.app_name));
mark = new File(celiangyuanFolder, COLLECTED_FILE_NAME);
if (!mark.exists() && celiangyuanFolder.exists()) {
MigrationCeliangyuanFolderDataUtils.collectFromCeliangyuanFolder(appCompatActivity, celiangyuanFolder, log, timeCounter);
}
}
}
static boolean generatorCollectedFile(File folder) {
if (folder.exists()) {
File tagFile = new File(folder, COLLECTED_FILE_NAME);
if (!tagFile.exists()) {
String result = "";
try {
if (!tagFile.createNewFile()) {
result = "create Failure";
}
} catch (IOException ioException) {
result = "generatorCollectedFile of " + folder.getAbsolutePath() + " " + ioException.toString();
}
if (!result.isEmpty()) {
return false;
}
}
}
return true;
}
public interface ILog {
void log(String msg);
}
}

@ -0,0 +1,71 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import android.content.DialogInterface;
import android.os.CountDownTimer;
import androidx.annotation.StringRes;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.MDButton;
import com.project.survey.R;
public class ControlPointsClearDialogUtils {
private final Context context;
private MDButton mPositiveAction;
public ControlPointsClearDialogUtils(Context context) {
this.context = context;
}
public void showClearDialog(ICallback callback) {
MaterialDialog dialog = new MaterialDialog.Builder(context)
.title(R.string.warning)
.content(R.string.confirm_clear_points)
.positiveText(getString(R.string.clear))
.negativeText(getString(R.string.cancel))
.onPositive((dialog1, which) -> {
// isPrjChanged = true;
// allControlPoints.clear();
// updateRecyclerView();
// ToastUtils.showShort(R.string.clean_over);
callback.onCleared();
})
.build();
mPositiveAction = dialog.getActionButton(DialogAction.POSITIVE);
mPositiveAction.setEnabled(false);
final CountDownTimer countDownTimer = new CountDownTimer(5000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mPositiveAction.setText(getString(R.string.clear) + "(" + millisUntilFinished / 1000 + "s)");
}
@Override
public void onFinish() {
mPositiveAction.setEnabled(true);
mPositiveAction.setText(R.string.clear);
}
}.start();
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
countDownTimer.cancel();
}
});
dialog.show();
}
private String getString(@StringRes int id) {
return context.getString(id);
}
public interface ICallback {
void onCleared();
}
}

@ -0,0 +1,242 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import android.graphics.Color;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import androidx.annotation.StringRes;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.MDButton;
import com.bingce.data.cache.CachedCurrentJob;
import com.bingce.data.cache.CachedCurrentProject;
import com.bingce.data.cache.CachedCurrentRoad;
import com.bingce.data.database.DBQueryConstant;
import com.bingce.data.database.PointDb;
import com.bingce.data.database.RoadDb;
import com.bingce.data.surveyor.designdata.road.RoadConstants;
import com.bingce.data.surveyor.designdata.road.RoadRecord;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointConstants;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord;
import com.bingce.device.util.DeviceUtils;
import com.bingce.utils.DateUtils;
import com.bingce.utils.StringUtil;
import com.bingce.utils.ThreadPoolUtil;
import com.bingce.utils.Util;
import com.project.survey.App;
import com.project.survey.R;
import com.project.survey.ui.instrument.setupstation.ControlPointsActivity;
import com.rengwuxian.materialedittext.MaterialEditText;
import java.util.Date;
import blankj.utilcode.util.Utils;
import cn.liuyanbing.surveyor.model.base.Point;
import cn.liuyanbing.surveyor.model.base.Road;
public class ControlPointsDetailDialogUtils {
private final Context context;
private MDButton mPositiveAction;
private MaterialEditText met_name, met_code, met_x, met_y, met_z, met_remarks, met_date;
public ControlPointsDetailDialogUtils(Context context) {
this.context = context;
}
public interface DataCallBack {
default void edit(ControlPointsActivity.DATA data) {
}
default void add(ControlPointsActivity.DATA data) {
}
}
public void showControlPointDialog(String roadId, final ControlPointsActivity.DATA data, String title, DataCallBack callBack) {
MaterialDialog dialog = new MaterialDialog.Builder(context)
.title(title)
.customView(R.layout.dialog_new_control_point, false)
.onPositive((dialog1, which) -> {
String name = met_name.getText().toString().trim();
String code = met_code.getText().toString().trim();
double x = "".equals(met_x.getText().toString().trim()) ? 0 : Double.parseDouble(met_x.getText().toString().trim());
double y = "".equals(met_y.getText().toString().trim()) ? 0 : Double.parseDouble(met_y.getText().toString().trim());
double z = "".equals(met_z.getText().toString().trim()) ? 0 : Double.parseDouble(met_z.getText().toString().trim());
String remarks = met_remarks.getText().toString().trim();
if (data != null) {//修改
ThreadPoolUtil.execute(() -> {
if (StringUtil.isEmpty(data.roadId)) {//全局控制点
PointRecord pointRecord = data.pointRecord;
pointRecord.name = name;
pointRecord.code = code;
pointRecord.x = x;
pointRecord.y = y;
pointRecord.h = z;
pointRecord.remarks = remarks;
PointDb.getInstance().save(pointRecord);
if (callBack != null) callBack.edit(data);
} else {//线路控制点
RoadRecord roadRecord = RoadDb.getInstance()
.rawQueryData(DBQueryConstant.findById(RoadConstants.DB_NAME, data.roadId));
Road road = RoadDb.getInstance().roadConverter().convert(roadRecord);
if (road != null && road.getControlPointList() != null && data.index >= 0 && data.index < road.getControlPointList().size()) {
road.getControlPointList().set(data.index, Point.CONTROL, name, code, x, y, z, remarks, DateUtils.toFull(new Date()));
RoadDb.getInstance().save(road);
}
}
});
} else {//添加
ThreadPoolUtil.execute(() -> {
if (StringUtil.isEmpty(roadId)) {//添加全局控制点
String currentProjectId = CachedCurrentProject.currentProjectId();
PointRecord pointRecord = new PointRecord(
currentProjectId, CachedCurrentJob.currentJobId(currentProjectId), CachedCurrentRoad.currentRoadId(currentProjectId),
PointConstants.POINT_TYPE_GLOBAL_CONTROL_POINT,
name, code, remarks,
x, y, z, 0, 0, 0, PointConstants.POINT_FORMAT_XYZ,
DeviceUtils.collectDeviceInfo());
PointDb.getInstance().save(pointRecord);
if (callBack != null)
callBack.add(new ControlPointsActivity.DATA(pointRecord));
} else {
RoadRecord roadRecord = RoadDb.getInstance()
.rawQueryData(DBQueryConstant.findById(RoadConstants.DB_NAME, roadId));
Road road = RoadDb.getInstance().roadConverter().convert(roadRecord);
if (road != null && road.getControlPointList() != null) {
road.getControlPointList().add(Point.CONTROL, name, code, x, y, z, remarks);
RoadDb.getInstance().save(road);
}
}
});
}
})
.positiveText(this.getString(R.string.save))
.negativeText(this.getString(R.string.cancel)).build();
met_name = dialog.getCustomView().findViewById(R.id.met_dialog_new_staking_point_name);
met_code = dialog.getCustomView().findViewById(R.id.met_dialog_new_point_code);
met_x = dialog.getCustomView().findViewById(R.id.met_dialog_new_staking_point_x);
met_y = dialog.getCustomView().findViewById(R.id.met_dialog_new_staking_point_y);
met_z = dialog.getCustomView().findViewById(R.id.met_dialog_new_staking_point_z);
met_remarks = dialog.getCustomView().findViewById(R.id.met_dialog_new_point_remarks);
met_date = dialog.getCustomView().findViewById(R.id.met_dialog_new_point_date);
mPositiveAction = dialog.getActionButton(DialogAction.POSITIVE);
initMaterialEditTextColor();
if (/*position >= 0 && position < allControlPoints.size()*/data != null) {
PointRecord pointRecord = data.pointRecord;
met_name.setText(pointRecord.name);
met_code.setText(pointRecord.code);
met_x.setText(Util.formatDouble2StringDotAuto(pointRecord.x));
met_y.setText(Util.formatDouble2StringDotAuto(pointRecord.y));
met_z.setText(Util.formatDouble2StringDotAuto(pointRecord.h));
met_remarks.setText(pointRecord.remarks);
met_date.setText(StringUtil.isEmpty(data.roadId) ? DateUtils.toFull(pointRecord.createDate) : data.timeString);
} else {
met_date.setVisibility(View.GONE);
}
TextWatcher watcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String name_text = met_name.getText().toString().trim();
String x_text = met_x.getText().toString().trim();
String y_text = met_y.getText().toString().trim();
String z_text = met_z.getText().toString().trim();
if (!"".equals(name_text)
&& !"-".equals(x_text)
&& !"-".equals(y_text)
&& !"-".equals(z_text)
&& !".".equals(x_text)
&& !".".equals(y_text)
&& !".".equals(z_text)
&& !"-.".equals(x_text)
&& !"-.".equals(y_text)
&& !"-.".equals(z_text)
&& !("".equals(x_text)
&& "".equals(y_text)
&& "".equals(z_text))) {
mPositiveAction.setEnabled(true);
} else {
mPositiveAction.setEnabled(false);
}
}
};
met_name.addTextChangedListener(watcher);
met_code.addTextChangedListener(watcher);
met_x.addTextChangedListener(watcher);
met_y.addTextChangedListener(watcher);
met_z.addTextChangedListener(watcher);
met_remarks.addTextChangedListener(watcher);
dialog.show();
mPositiveAction.setEnabled(false);
}
public void showControlPointDialog(String roadId, final ControlPointsActivity.DATA data, String title) {
showControlPointDialog(roadId, data, title, null);
}
private void initMaterialEditTextColor() {
if (((App) Utils.getApp()).isThemeDark) {
met_name.setMetTextColor(Color.WHITE);
met_code.setMetTextColor(Color.WHITE);
met_x.setMetTextColor(Color.WHITE);
met_y.setMetTextColor(Color.WHITE);
met_z.setMetTextColor(Color.WHITE);
met_remarks.setMetTextColor(Color.WHITE);
met_date.setMetTextColor(Color.WHITE);
met_name.setPrimaryColor(Color.LTGRAY);
met_code.setPrimaryColor(Color.LTGRAY);
met_x.setPrimaryColor(Color.LTGRAY);
met_y.setPrimaryColor(Color.LTGRAY);
met_z.setPrimaryColor(Color.LTGRAY);
met_remarks.setPrimaryColor(Color.LTGRAY);
met_date.setPrimaryColor(Color.LTGRAY);
met_name.setFocusFraction(1.0f);
met_code.setFocusFraction(1.0f);
met_x.setFocusFraction(1.0f);
met_y.setFocusFraction(1.0f);
met_z.setFocusFraction(1.0f);
met_remarks.setFocusFraction(1.0f);
met_date.setFocusFraction(1.0f);
met_name.setMetHintTextColor(Color.GRAY);
met_code.setMetHintTextColor(Color.GRAY);
met_x.setMetHintTextColor(Color.GRAY);
met_y.setMetHintTextColor(Color.GRAY);
met_z.setMetHintTextColor(Color.GRAY);
met_remarks.setMetHintTextColor(Color.GRAY);
met_date.setMetHintTextColor(Color.GRAY);
met_name.setUnderlineColor(Color.GRAY);
met_code.setUnderlineColor(Color.GRAY);
met_x.setUnderlineColor(Color.GRAY);
met_y.setUnderlineColor(Color.GRAY);
met_z.setUnderlineColor(Color.GRAY);
met_remarks.setUnderlineColor(Color.GRAY);
met_date.setUnderlineColor(Color.GRAY);
}
}
private String getString(@StringRes int id) {
return context.getString(id);
}
}

@ -0,0 +1,93 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import android.graphics.Color;
import android.text.Editable;
import android.text.TextWatcher;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.MDButton;
import com.project.survey.App;
import com.project.survey.R;
import com.rengwuxian.materialedittext.MaterialEditText;
import blankj.utilcode.util.ToastUtils;
import blankj.utilcode.util.Utils;
public class ControlPointsExportDialogUtils {
private final Context context;
private MDButton mPositiveAction;
public ControlPointsExportDialogUtils(Context context) {
this.context = context;
}
MaterialEditText met_export_name;
public void showExportDialog(ICallback callback) {
MaterialDialog dialog = new MaterialDialog.Builder(context)
.title(R.string.export_excel)
.customView(R.layout.dialog_export_point_config, true)
.positiveText(R.string.export_points)
.negativeText(R.string.cancel)
.onPositive((dialog1, which) -> {
String name;
if ("".equals(met_export_name.getText().toString().trim())) {
ToastUtils.showLong(R.string.file_name_can_not_empty);
return;
} else {
name = met_export_name.getText().toString().trim();
}
// exportExcelAsync(name, mHeaders);
if (callback != null) {
callback.onExport(name);
}
})
.build();
met_export_name = dialog.getCustomView().findViewById(R.id.dialog_export_point_config_name);
mPositiveAction = dialog.getActionButton(DialogAction.POSITIVE);
initMaterialEditTextColor2();
met_export_name.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!"".equals(met_export_name.getText().toString().trim())) {
mPositiveAction.setEnabled(true);
} else {
mPositiveAction.setEnabled(false);
}
}
});
dialog.show();
mPositiveAction.setEnabled(false);
}
private void initMaterialEditTextColor2() {
if (((App) Utils.getApp()).isThemeDark) {
met_export_name.setMetTextColor(Color.WHITE);
met_export_name.setPrimaryColor(Color.LTGRAY);
met_export_name.setFocusFraction(1.0f);
met_export_name.setMetHintTextColor(Color.GRAY);
met_export_name.setUnderlineColor(Color.GRAY);
}
}
public interface ICallback {
void onExport(String name);
}
}

@ -0,0 +1,60 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import android.graphics.Color;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bingce.utils.ContextProviderUtils;
import com.bingce.utils.IOnSingleGetCallback;
import com.bingce.utils.IProvider;
import com.project.survey.App;
import com.project.survey.R;
import com.rengwuxian.materialedittext.MaterialEditText;
import blankj.utilcode.util.Utils;
public class ControlPointsFilterDialogUtils extends ContextProviderUtils {
private String point_name_keyword;
private MaterialEditText met_point_name_keyword;
public ControlPointsFilterDialogUtils(IProvider<Context> contextIProvider) {
super(contextIProvider);
}
public void showFilterDialog(IOnSingleGetCallback<String> keyCallback) {
MaterialDialog dialog = new MaterialDialog.Builder(context())
.title(R.string.filter)
.customView(R.layout.dialog_control_points_filter, true)
.onPositive((dialog1, which) -> {
point_name_keyword = met_point_name_keyword.getText().toString();
if (keyCallback != null) {
keyCallback.onGet(point_name_keyword);
}
})
.positiveText(getString(R.string.confirm))
.negativeText(getString(R.string.cancel)).build();
met_point_name_keyword =
dialog.getCustomView().findViewById(R.id.met_dialog_records_filter_roadname_keyword);
initMaterialEditTextColor2();
met_point_name_keyword.setText(point_name_keyword);
dialog.show();
}
private void initMaterialEditTextColor2() {
if (((App) Utils.getApp()).isThemeDark) {
met_point_name_keyword.setMetTextColor(Color.WHITE);
met_point_name_keyword.setPrimaryColor(Color.LTGRAY);
met_point_name_keyword.setFocusFraction(1.0f);
met_point_name_keyword.setMetHintTextColor(Color.GRAY);
met_point_name_keyword.setUnderlineColor(Color.GRAY);
}
}
}

@ -0,0 +1,380 @@
package com.project.survey.ui.instrument.setupstation.util;
import static com.bingce.road.parameter.RoadAttributeControlPointConverter.exportPoints;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.util.Log;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bingce.TimeCount;
import com.bingce.data.cache.CachedCurrentJob;
import com.bingce.data.cache.CachedCurrentProject;
import com.bingce.data.cache.CachedCurrentRoad;
import com.bingce.data.database.DBQueryConstant;
import com.bingce.data.database.PointDb;
import com.bingce.data.database.RoadDb;
import com.bingce.data.surveyor.designdata.road.RoadConstants;
import com.bingce.data.surveyor.designdata.road.RoadRecord;
import com.bingce.error.BingCeErrorCode;
import com.bingce.road.RoadIntentUtil;
import com.bingce.road.RoadRecordConvertUtils;
import com.bingce.surveyor.agentweb.AgentWebActivity;
import com.bingce.utils.StringUtil;
import com.bingce.utils.ThreadPoolUtil;
import com.project.survey.App;
import com.project.survey.R;
import java.io.File;
import blankj.utilcode.util.ToastUtils;
import blankj.utilcode.util.Utils;
import cn.liuyanbing.surveyor.model.base.Point;
import cn.liuyanbing.surveyor.model.base.PointArray;
import cn.liuyanbing.surveyor.model.base.Road;
import ru.bartwell.exfilepicker.ExFilePicker;
import ru.bartwell.exfilepicker.data.ExFilePickerResult;
public class ControlPointsImportConfigDialogUtils {
private static final int EX_FILE_PICKER_RESULT_SURVEYOR_EXCEL = 330;
private static final int EX_FILE_PICKER_RESULT_SURVEYOR_TXT = 331;
private static final int EX_FILE_PICKER_RESULT_CASS_DAT = 332;
private static final int EX_FILE_PICKER_RESULT_ROADSTAR_EXCEL = 333;
private final Activity context;
private boolean cassXY = false;//cass格式按照xy排序,否则yx排序
private boolean isOverrideImport;
public ControlPointsImportConfigDialogUtils(Activity context) {
this.context = context;
}
public void showImportConfigDialog() {
new MaterialDialog.Builder(context)
.title(R.string.please_choose_import_format)
.items(new String[]{getString(R.string.excel_xls)
, getString(R.string.text_txt)
, getString(R.string.cass_dat_txt)
/* , getString(R.string.road_star_point_data_excel_xls)*/})
.itemsCallback((dialog, itemView, which, text) -> {
String[] filter = null;
int intentResultNumber = EX_FILE_PICKER_RESULT_SURVEYOR_EXCEL;
String message = "";
switch (which) {
case 0:
filter = new String[]{"xls", "xlsx"};
intentResultNumber = EX_FILE_PICKER_RESULT_SURVEYOR_EXCEL;
message = getString(R.string.import_point_excel_guide);
break;
case 1:
filter = new String[]{"txt"};
intentResultNumber = EX_FILE_PICKER_RESULT_SURVEYOR_TXT;
message = getString(R.string.import_point_text_guide);
break;
case 2:
showImportCassXYDialog();
return;
case 3:
filter = new String[]{"xls", "xlsx"};
intentResultNumber = EX_FILE_PICKER_RESULT_ROADSTAR_EXCEL;
message = getString(R.string.import_point_road_star_excel_guide);
break;
}
if (filter != null) {
final int finalIntentResultNumber = intentResultNumber;
final String[] finalFilter = filter;
new AlertDialog.Builder(context)
.setTitle(R.string.import_points)
.setMessage(message)
.setPositiveButton(R.string.overwrite_import, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isOverrideImport = true;
selectFolder(finalIntentResultNumber, finalFilter);
}
})
.setNegativeButton(R.string.additional_import, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isOverrideImport = false;
selectFolder(finalIntentResultNumber, finalFilter);
}
})
.setNeutralButton(R.string.view_sample, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Intent intent = new Intent();
// intent.setClass(Utils.getApp(), AgentWebActivity.class);
// intent.putExtra("short_url", "android_url_import_point_sample");
// context.startActivity(intent);
AgentWebActivity.navigation2(
context,
"android_url_import_point_sample"
);
}
})
.show();
}
}).show();
}
private void showImportCassXYDialog() {
cassXY = false;
String message;
if (cassXY) {
message = getString(R.string.import_point_cass_xy_dat);
} else {
message = getString(R.string.import_point_cass_yx_dat);
}
new AlertDialog.Builder(context)
.setTitle(R.string.import_points)
.setMessage(message)
.setPositiveButton(R.string.overwrite_import, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isOverrideImport = true;
selectFolder(EX_FILE_PICKER_RESULT_CASS_DAT, new String[]{"dat", "txt"});
}
})
.setNegativeButton(R.string.additional_import, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isOverrideImport = false;
selectFolder(EX_FILE_PICKER_RESULT_CASS_DAT, new String[]{"dat", "txt"});
}
})
.setNeutralButton(R.string.view_sample, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Intent intent = new Intent();
// intent.setClass(Utils.getApp(), AgentWebActivity.class);
// intent.putExtra("short_url", "android_url_import_point_sample");
// startActivity(intent);
AgentWebActivity.navigation2(
context,
"android_url_import_point_sample");
}
})
.show();
}
// private void showImportCassXYDialog() {
// new MaterialDialog.Builder(context)
// .title(R.string.coordinate_order)
// .items(new String[]{"X-Y-Z", "Y-X-Z"})
// .itemsCallback(new MaterialDialog.ListCallback() {
// @Override
// public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) {
// String message = getString(R.string.import_point_cass_xy_dat);
// switch (which) {
// case 0:
// cassXY = true;
// message = getString(R.string.import_point_cass_xy_dat);
// break;
// case 1:
// cassXY = false;
// message = getString(R.string.import_point_cass_yx_dat);
// break;
// }
// new AlertDialog.Builder(context)
// .setTitle(R.string.import_points)
// .setMessage(message)
// .setPositiveButton(R.string.overwrite_import, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// isOverrideImport = true;
// selectFolder(EX_FILE_PICKER_RESULT_CASS_DAT, new String[]{"dat", "txt"});
// }
// })
// .setNegativeButton(R.string.additional_import, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// isOverrideImport = false;
// selectFolder(EX_FILE_PICKER_RESULT_CASS_DAT, new String[]{"dat", "txt"});
// }
// })
// .setNeutralButton(R.string.view_sample, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
//// Intent intent = new Intent();
//// intent.setClass(Utils.getApp(), AgentWebActivity.class);
//// intent.putExtra("short_url", "android_url_import_point_sample");
//// context.startActivity(intent);
// AgentWebActivity.navigation2(
// context, "android_url_import_point_sample");
// }
// })
// .show();
// }
// }).show();
// }
private void selectFolder(final int intentResultNumber, final String[] filter) {
ExFilePicker exFilePicker = new ExFilePicker();
exFilePicker.setLandscape(((App) Utils.getApp()).isLandscape());
exFilePicker.setShowOnlyExtensions(filter);
exFilePicker.start(context, intentResultNumber);
}
public void onActivityResult(boolean isGlobal, int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
ExFilePickerResult object = ExFilePickerResult.getFromIntent(data);
if (object != null && object.getCount() > 0) {
try {
String path = object.getPath() + object.getNames().get(0);
switch (requestCode) {
case EX_FILE_PICKER_RESULT_SURVEYOR_EXCEL: {
ThreadPoolUtil.execute(() -> {
String projectId = CachedCurrentProject.currentProjectId();
if (isGlobal) {
String jobId = CachedCurrentJob.currentJobId(projectId);
if (isOverrideImport) {
//删除之前控制点
PointDb.getInstance().deleteControlPoints(projectId);
}
_6GlobalControlPointCollectUtils.importGlobalControlPointExcel(projectId, jobId,
new File(path),
TimeCount.timeCounter());
} else {
String roadId = RoadIntentUtil.getRoadIdFromIntent(context.getIntent());
if (StringUtil.isEmpty(roadId)) {
roadId = CachedCurrentRoad.currentRoadId(projectId);
}
RoadRecord roadRecord = RoadDb.getInstance()
.rawQueryData(DBQueryConstant.findById(RoadConstants.DB_NAME, roadId));
if (roadRecord == null) {
BingCeErrorCode.toast(BingCeErrorCode.NO_FOUND_ROAD_BY_ID);
return;
}
PointArray pointArray = new PointArray();
_6GlobalControlPointCollectUtils.Result result = _6GlobalControlPointCollectUtils.importGlobalControlPointExcel(new File(path), pointArray);
if (isOverrideImport) {
roadRecord.controlPointJson = exportPoints(pointArray);
} else {
Road road = RoadDb.getInstance().roadConverter().convert(roadRecord);
if (road != null) {
for (int index = 0; index < pointArray.size(); index++) {
Point point = pointArray.get(index);
road.getControlPointList().add(point.getCategory(), point.getName(), point.getCode(),
point.getX(), point.getY(), point.getZ(), point.getRemarks(), point.getTime());
}
}
RoadRecordConvertUtils.updateRecord(roadRecord, road);
}
RoadDb.getInstance().save(roadRecord);
ToastUtils.showShort(result.describe);
}
});
}
break;
case EX_FILE_PICKER_RESULT_SURVEYOR_TXT:
ThreadPoolUtil.execute(() -> {
String projectId = CachedCurrentProject.currentProjectId();
if (isGlobal) {
String jobId = CachedCurrentJob.currentJobId(projectId);
if (isOverrideImport) {
//删除之前控制点
PointDb.getInstance().deleteControlPoints(projectId);
}
_6GlobalControlPointCollectUtils.importStakingJobPointTxt(new File(path), projectId, jobId,
TimeCount.timeCounter());
} else {
String roadId = RoadIntentUtil.getRoadIdFromIntent(context.getIntent());
if (StringUtil.isEmpty(roadId)) {
roadId = CachedCurrentRoad.currentRoadId(projectId);
}
RoadRecord roadRecord = RoadDb.getInstance()
.rawQueryData(DBQueryConstant.findById(RoadConstants.DB_NAME, roadId));
if (roadRecord == null) {
BingCeErrorCode.toast(BingCeErrorCode.NO_FOUND_ROAD_BY_ID);
return;
}
PointArray pointArray = new PointArray();
_6GlobalControlPointCollectUtils.Result result = _6GlobalControlPointCollectUtils.importStakingJobPointTxt(new File(path), pointArray);
if (isOverrideImport) {
roadRecord.controlPointJson = exportPoints(pointArray);
} else {
Road road = RoadDb.getInstance().roadConverter().convert(roadRecord);
if (road != null) {
for (int index = 0; index < pointArray.size(); index++) {
Point point = pointArray.get(index);
road.getControlPointList().add(point.getCategory(), point.getName(), point.getCode(),
point.getX(), point.getY(), point.getZ(), point.getRemarks(), point.getTime());
}
}
RoadRecordConvertUtils.updateRecord(roadRecord, road);
}
RoadDb.getInstance().save(roadRecord);
ToastUtils.showShort(result.describe);
}
});
break;
case EX_FILE_PICKER_RESULT_CASS_DAT:
ThreadPoolUtil.execute(() -> {
String projectId = CachedCurrentProject.currentProjectId();
if (isGlobal) {
String jobId = CachedCurrentJob.currentJobId(projectId);
if (isOverrideImport) {
//删除之前控制点
PointDb.getInstance().deleteControlPoints(projectId);
}
_6GlobalControlPointCollectUtils.importStakingJobPointCassDat(new File(path), projectId, jobId,
TimeCount.timeCounter(), false);
} else {
String roadId = RoadIntentUtil.getRoadIdFromIntent(context.getIntent());
if (StringUtil.isEmpty(roadId)) {
roadId = CachedCurrentRoad.currentRoadId(projectId);
}
RoadRecord roadRecord = RoadDb.getInstance()
.rawQueryData(DBQueryConstant.findById(RoadConstants.DB_NAME, roadId));
if (roadRecord == null) {
BingCeErrorCode.toast(BingCeErrorCode.NO_FOUND_ROAD_BY_ID);
return;
}
PointArray pointArray = new PointArray();
_6GlobalControlPointCollectUtils.Result result = _6GlobalControlPointCollectUtils.importStakingJobPointCassDat(new File(path), pointArray, false);
if (isOverrideImport) {
roadRecord.controlPointJson = exportPoints(pointArray);
} else {
Road road = RoadDb.getInstance().roadConverter().convert(roadRecord);
if (road != null) {
for (int index = 0; index < pointArray.size(); index++) {
Point point = pointArray.get(index);
road.getControlPointList().add(point.getCategory(), point.getName(), point.getCode(),
point.getX(), point.getY(), point.getZ(), point.getRemarks(), point.getTime());
}
}
RoadRecordConvertUtils.updateRecord(roadRecord, road);
}
RoadDb.getInstance().save(roadRecord);
ToastUtils.showShort(result.describe);
}
});
break;
// case EX_FILE_PICKER_RESULT_ROADSTAR_EXCEL:
// String result4 = isGlobal
// ? PointLibraryUtil.importGlobalControlPointRoadStarExcel(new File(path), isOverrideImport)
// : ControlPointUtil.importControlPointRoadStarExcel(new File(path), road, isOverrideImport);
// ToastUtils.showLong(result4);
// break;
}
// updateRecyclerView();
// isPrjChanged = true;
} catch (Exception e) {
Log.e(ControlPointsImportConfigDialogUtils.class.getName(), "File select error", e);
}
}
}
}
}
private String getString(@StringRes int id) {
return context.getString(id);
}
}

@ -0,0 +1,341 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.util.Log;
import com.bingce.TimeCount;
import com.bingce.coordlib.enums.DatumEnum;
import com.bingce.coordlib.enums.EllipsoidEnum;
import com.bingce.coordlib.enums.GridEnum;
import com.bingce.coordlib.enums.HFittingEnum;
import com.bingce.coordlib.enums.ProjectionEnum;
import com.bingce.coordlib.model.Blh;
import com.bingce.coordlib.model.BlhCoordinatePair;
import com.bingce.coordlib.model.Coordinate;
import com.bingce.coordlib.model.CoordinateSystem;
import com.bingce.data.database.CoordinateSystemDb;
import com.bingce.data.surveyor.designdata.coordinate.CoordinateSystemRecord;
import com.bingce.poi.excel.ExcelReadHelper;
import com.bingce.utils.Util;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class CoordinatorSystemCollectUtils {
static void collectCoordinatorTemplate(File coordinateExcel, TimeCount.ITimeCounter timeCounter) {
//0.收集坐标系模板
// File coordinateExcel = new File(dataFolder, FileNameConstants.CONFIG_FILE_EXCEL_COORDINATOR_OF_PROJECT);
if (coordinateExcel.exists()) {
List<CoordinateSystem> coordinateSystems = importAllCoordSysExcelFile(coordinateExcel);
if (coordinateSystems != null) {
List<CoordinateSystemRecord> coordinateSystemRecords = new ArrayList<>();
for (CoordinateSystem coordinateSystem : coordinateSystems) {
CoordinateSystemRecord record = new CoordinateSystemRecord(coordinateSystem, timeCounter.time());
coordinateSystemRecords.add(record);
}
CoordinateSystemDb.getInstance().save(coordinateSystemRecords);
}
}
}
/**
* 导入excel版坐标系统
*
* @param sysFile excel坐标库
* @return 坐标系统
*/
static List<CoordinateSystem> importAllCoordSysExcelFile(File sysFile) {
if (!sysFile.exists() || sysFile.isDirectory()) {
return null;
}
List<CoordinateSystem> list = new ArrayList<>();
int line = 0;
try {
List<List<List<String>>> importResult = ExcelReadHelper.excelReadBySheet(sysFile, ExcelReadHelper.FIRST_ROW_NOT_IGNORE);
if (importResult == null) return new ArrayList<>();
if (importResult.isEmpty()) return new ArrayList<>();
for (int i = 0; i < importResult.size(); i++) {
CoordinateSystem coordinateSystem = new CoordinateSystem();
coordinateSystem.isPreset = false;
line = 0;
List<List<String>> sheetResult = importResult.get(i);
if (sheetResult == null || sheetResult.isEmpty()) {
Log.d("CoordinateSystemUtil", sysFile.getAbsolutePath() + ",导入失败,原因:导入excel为空");
return new ArrayList<>();
}
String sheetName = sheetResult.get(0).isEmpty() ? "default" : sheetResult.get(0).get(0);
coordinateSystem.setName(sheetName);
for (int j = 1; j < sheetResult.size(); j++) {
List<String> row = sheetResult.get(j);
line = j + 1;
if (row.isEmpty() || ExcelReadHelper.isRowEmpty(row)) {
continue;
}
if (row.size() != 2 && row.size() != 7 && row.size() != 6 && row.size() != 9) {
Log.d("CoordinateSystemUtil", sysFile.getAbsolutePath() + ",导入失败,原因:第" + line + "行,元素个数必须为2,7,6,9");
break;
}
if (row.size() == 2) {
switch (row.get(0)) {
case "isPreset":
int preset = Integer.parseInt(row.get(1));
coordinateSystem.isPreset = preset == 1;
break;
case "rtkTransformMethod":
case "transMethod":
int method = Integer.parseInt(row.get(1));
if (method == 0) {
coordinateSystem.datum = DatumEnum.BURSA;
coordinateSystem.grid = GridEnum.NULL;
coordinateSystem.hFitting = HFittingEnum.NULL;
} else if (method == 1 || method == 2) {
coordinateSystem.datum = DatumEnum.NULL;
coordinateSystem.grid = GridEnum.FOUR_PARA;
coordinateSystem.hFitting = HFittingEnum.FIX;
}
break;
case "ellipsoidType":
int ellipsoid = Integer.parseInt(row.get(1));
switch (ellipsoid) {
case 0:
coordinateSystem.setEllipsoid(EllipsoidEnum.WGS_84);
break;
case 1:
coordinateSystem.setEllipsoid(EllipsoidEnum.BEIJING_54);
break;
case 2:
coordinateSystem.setEllipsoid(EllipsoidEnum.XIAN_80);
break;
default:
coordinateSystem.setEllipsoid(EllipsoidEnum.CGCS_2000);
break;
}
break;
case "rtkProjectType":
case "projectType":
int type = Integer.parseInt(row.get(1));
switch (type) {
case 2:
coordinateSystem.setProjection(ProjectionEnum.UTM);
break;
default:
coordinateSystem.setProjection(ProjectionEnum.GAUSS);
}
break;
case "datumTransType":
int datumTransType = Integer.parseInt(row.get(1));
if (datumTransType < 0 || datumTransType > 1)
datumTransType = 0;
switch (datumTransType) {
case 1:
coordinateSystem.datum = DatumEnum.BURSA;
break;
default:
coordinateSystem.datum = DatumEnum.NULL;
}
break;
case "planeTransType":
int planeTransType = Integer.parseInt(row.get(1));
switch (planeTransType) {
case 1:
coordinateSystem.grid = GridEnum.FOUR_PARA;
break;
default:
coordinateSystem.grid = GridEnum.NULL;
}
break;
case "elvFitType":
int elvFitType = Integer.parseInt(row.get(1));
switch (elvFitType) {
case 1:
case 4:
coordinateSystem.hFitting = HFittingEnum.FIX;
break;
case 2:
coordinateSystem.hFitting = HFittingEnum.PLANE;
break;
case 3:
coordinateSystem.hFitting = HFittingEnum.CURVE;
break;
case 5:
coordinateSystem.hFitting = HFittingEnum.TGO;
break;
default:
coordinateSystem.hFitting = HFittingEnum.NULL;
}
break;
case "longOfOrigin":
case "centLng":
coordinateSystem.centLng = Double.parseDouble(row.get(1));
break;
case "latOfOrigin":
case "baseLat":
coordinateSystem.baseLat = Double.parseDouble(row.get(1));
break;
case "projectionScale":
case "projScl":
coordinateSystem.projScl = Double.parseDouble(row.get(1));
break;
case "falseEasting":
case "falseE":
coordinateSystem.falseE = Double.parseDouble(row.get(1));
break;
case "falseNorthing":
case "falseN":
coordinateSystem.falseN = Double.parseDouble(row.get(1));
break;
case "projectionHeight":
case "projAlt":
coordinateSystem.projAlt = Double.parseDouble(row.get(1));
break;
case "sevenParDx":
coordinateSystem.sevenDx = Double.parseDouble(row.get(1));
break;
case "sevenParDy":
coordinateSystem.sevenDy = Double.parseDouble(row.get(1));
break;
case "sevenParDz":
coordinateSystem.sevenDz = Double.parseDouble(row.get(1));
break;
case "sevenParRx":
coordinateSystem.sevenRx = Double.parseDouble(row.get(1)) * 3600d;
break;
case "sevenParRy":
coordinateSystem.sevenRy = Double.parseDouble(row.get(1)) * 3600d;
break;
case "sevenParRz":
coordinateSystem.sevenRz = Double.parseDouble(row.get(1)) * 3600d;
break;
case "sevenParScl":
coordinateSystem.sevenPpm = (Double.parseDouble(row.get(1)) - 1) * 1000000d;
break;
case "fourParDx":
coordinateSystem.fourDx = Double.parseDouble(row.get(1));
break;
case "fourParDy":
coordinateSystem.fourDy = Double.parseDouble(row.get(1));
break;
case "fourParRot":
coordinateSystem.fourRot = Util.radianToDmsDouble(Math.toRadians(Double.parseDouble(row.get(1))));
break;
case "fourParScl":
coordinateSystem.fourScl = Double.parseDouble(row.get(1));
break;
case "hFitA0":
coordinateSystem.hFitA0 = Double.parseDouble(row.get(1));
break;
case "hFitA1":
coordinateSystem.hFitA1 = Double.parseDouble(row.get(1));
break;
case "hFitA2":
coordinateSystem.hFitA2 = Double.parseDouble(row.get(1));
break;
case "hFitA3":
coordinateSystem.hFitA3 = Double.parseDouble(row.get(1));
break;
case "hFitA4":
coordinateSystem.hFitA4 = Double.parseDouble(row.get(1));
break;
case "hFitA5":
coordinateSystem.hFitA5 = Double.parseDouble(row.get(1));
break;
case "hFitN":
coordinateSystem.hFitN = Double.parseDouble(row.get(1));
break;
case "hFitE":
coordinateSystem.hFitE = Double.parseDouble(row.get(1));
break;
case "hFitNorthOrigin":
coordinateSystem.hFitNorthOrigin = Double.parseDouble(row.get(1));
break;
case "hFitEastOrigin":
coordinateSystem.hFitEastOrigin = Double.parseDouble(row.get(1));
break;
case "hFitNorthSlope":
coordinateSystem.hFitNorthSlope = Double.parseDouble(row.get(1));
break;
case "hFitEastSlope":
coordinateSystem.hFitEastSlope = Double.parseDouble(row.get(1));
break;
case "hFitHdConstant":
coordinateSystem.hFitHdConstant = Double.parseDouble(row.get(1));
break;
case "correctX":
coordinateSystem.correctN = -1 * Double.parseDouble(row.get(1));
break;
case "correctY":
coordinateSystem.correctE = -1 * Double.parseDouble(row.get(1));
break;
case "correctZ":
coordinateSystem.correctH = -1 * Double.parseDouble(row.get(1));
break;
case "correctN":
coordinateSystem.correctN = Double.parseDouble(row.get(1));
break;
case "correctE":
coordinateSystem.correctE = Double.parseDouble(row.get(1));
break;
case "correctH":
coordinateSystem.correctH = Double.parseDouble(row.get(1));
break;
}
} else if (row.size() == 6) {
coordinateSystem.getPairs().add(new BlhCoordinatePair("", new Blh(Double.parseDouble(row.get(0)), Double.parseDouble(row.get(1)), Double.parseDouble(row.get(2)))
, new Coordinate(Double.parseDouble(row.get(3)), Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)))));
} else if (row.size() == 9) {
if ("BlhPointPair".equals(row.get(0).trim())) {
switch (Integer.parseInt(row.get(1))) {
case 47:
coordinateSystem.getPairs().add(new BlhCoordinatePair(row.get(2), new Blh(Double.parseDouble(row.get(3)), Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)))
, new Coordinate(Double.parseDouble(row.get(6)), Double.parseDouble(row.get(7)), Double.parseDouble(row.get(8)))));
break;
case 51:
coordinateSystem.phonePair1 = new BlhCoordinatePair(row.get(2), new Blh(Double.parseDouble(row.get(3)), Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)))
, new Coordinate(Double.parseDouble(row.get(6)), Double.parseDouble(row.get(7)), Double.parseDouble(row.get(8))));
break;
case 52:
coordinateSystem.phonePair2 = new BlhCoordinatePair(row.get(2), new Blh(Double.parseDouble(row.get(3)), Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)))
, new Coordinate(Double.parseDouble(row.get(6)), Double.parseDouble(row.get(7)), Double.parseDouble(row.get(8))));
break;
}
}
} else {
switch (Integer.parseInt(row.get(0))) {
case 4:
case 7:
coordinateSystem.getPairs().add(new BlhCoordinatePair("", new Blh(Math.toDegrees(Util.dmsStringToRadian(row.get(1), false)), Math.toDegrees(Util.dmsStringToRadian(row.get(2), false)), Double.parseDouble(row.get(3)))
, new Coordinate(Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), Double.parseDouble(row.get(6)))));
break;
case 31:
coordinateSystem.phonePair1 = new BlhCoordinatePair("", new Blh(Math.toDegrees(Util.dmsStringToRadian(row.get(1), false)), Math.toDegrees(Util.dmsStringToRadian(row.get(2), false)), Double.parseDouble(row.get(3)))
, new Coordinate(Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), Double.parseDouble(row.get(6))));
break;
case 32:
coordinateSystem.phonePair2 = new BlhCoordinatePair("", new Blh(Math.toDegrees(Util.dmsStringToRadian(row.get(1), false)), Math.toDegrees(Util.dmsStringToRadian(row.get(2), false)), Double.parseDouble(row.get(3)))
, new Coordinate(Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), Double.parseDouble(row.get(6))));
break;
case 41:
coordinateSystem.phonePair1 = new BlhCoordinatePair("", new Blh(Double.parseDouble(row.get(1)), Double.parseDouble(row.get(2)), Double.parseDouble(row.get(3)))
, new Coordinate(Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), Double.parseDouble(row.get(6))));
break;
case 42:
coordinateSystem.phonePair2 = new BlhCoordinatePair("", new Blh(Double.parseDouble(row.get(1)), Double.parseDouble(row.get(2)), Double.parseDouble(row.get(3)))
, new Coordinate(Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), Double.parseDouble(row.get(6))));
break;
}
}
}
list.add(coordinateSystem);
}
Log.d("CoordinateSystemUtil", sysFile.getAbsolutePath() + ",导入成功");
} catch (NumberFormatException ex) {
Log.d("CoordinateSystemUtil", sysFile.getAbsolutePath() + ",导入失败,原因:第" + line + "行,发现非数字字符串");
} catch (Exception ex) {
ex.printStackTrace();
}
return list;
}
}

@ -0,0 +1,240 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import androidx.annotation.WorkerThread;
import com.bingce.TimeCount;
import com.bingce.constants.FileNameConstants;
import com.bingce.data.database.JobDb;
import com.bingce.data.database.KeyValueDb;
import com.bingce.data.database.PointDb;
import com.bingce.data.surveyor.designdata.job.JobConstants;
import com.bingce.data.surveyor.designdata.job.JobRecord;
import com.bingce.data.surveyor.designdata.kv.KeyValueConstants;
import com.bingce.data.surveyor.designdata.kv.KeyValueRecord;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointConstants;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord;
import com.bingce.log.BCLog;
import com.bingce.poi.excel.ExcelReadHelper;
import com.bingce.utils.AppUtil;
import com.bingce.utils.StringUtil;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.project.survey.R;
import com.project.survey.ui.instrument.setupstation.bean.StakingJob;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import blankj.utilcode.util.StringUtils;
import cn.liuyanbing.surveyor.model.base.Point;
import cn.liuyanbing.surveyor.model.base.PointArray;
public class JobDbUtils {
@WorkerThread
static void collect(Context context, String projectId, File projectFolder, CollectLocalDataInAppStartFirstTimeUtil.ILog log, TimeCount.ITimeCounter time) {
if (StringUtil.isEmpty(projectId) || projectFolder == null || !projectFolder.exists() || projectFolder.isFile()) {
return;
}
log.log("读取面积测量作业");
log.log("读取点测量作业");
//收集点测量作业
collectPointSurveyJob(projectId, projectFolder, time);
log.log("读取已知点放样作业");
//收集已知点放样作业
collectPointStakingJob(projectId, projectFolder, time);
log.log("读取断面测量作业");
}
/*
* 收集项目下的点测量作业
*/
@WorkerThread
private static void collectPointSurveyJob(String projectId, File projectFolder, TimeCount.ITimeCounter time) {
String fileName = FileNameConstants.POINT_SURVEYOR;
collectXJob(projectId, projectFolder, FileNameConstants.POINT_SURVEYOR_JOB_PREFIX, fileName, time);
}
@WorkerThread
private static void collectPointStakingJob(String projectId, File projectFolder, TimeCount.ITimeCounter timeCounter) {
File stakingFile = new File(projectFolder, FileNameConstants.CONFIG_FILE_KNOWN_POINT_STAKING);
if (!stakingFile.exists()) {
stakingFile = new File(projectFolder, "放样点库.xls");
}
if (!stakingFile.exists()) {
return;
}
List<StakingJob> stakingJobs = new ArrayList<>();
String error = readStakingJob(stakingFile, stakingJobs);
BCLog.log(log -> log.e("collect_job", projectId + "__" + error));
for (StakingJob job : stakingJobs) {
String stakingJobName = job.getName();
JobRecord record = JobDb.getInstance().rawQueryData(
JobConstants.findByProjectAndName(projectId, FileNameConstants.POINT_STAKE_JOB_PREFIX + stakingJobName));
if (record != null) {
BCLog.log(log -> log.d("collect_warning", "stakingJob 重复收集-" + stakingJobName));
continue;
}
JobRecord jobRecord = new JobRecord(FileNameConstants.POINT_STAKE_JOB_PREFIX + stakingJobName, projectId, timeCounter.time());
JobDb.getInstance().save(jobRecord);
String jobId = jobRecord.id;
//存储放样任务设置点坐标
PointArray pointArray = job.getPointList();
if (pointArray == null || pointArray.isEmpty()) {
continue;
}
List<PointRecord> pointRecords = new ArrayList<>();
for (int index = 0; index < pointArray.size(); index++) {
Point point = pointArray.get(index);
PointRecord pointRecord = new PointRecord(projectId, jobId, "",
PointConstants.POINT_TYPE_KNOWN_POINT,
point.getName(), point.getCode(), point.getRemarks(),
point.getX(), point.getY(), point.getZ(),
0, 0, 0,
PointConstants.POINT_FORMAT_XYZ, null);
pointRecord.createDate = new Date(timeCounter.time());
pointRecords.add(pointRecord);
}
PointDb.getInstance().save(pointRecords);
}
}
private static String readStakingJob(File stakingFile, List<StakingJob> stakingJobs) {
String result = "";
int line = 0;
try {
List<List<List<String>>> importResult = ExcelReadHelper.excelReadBySheet(stakingFile, ExcelReadHelper.FIRST_ROW_NOT_IGNORE);
if (importResult == null) return "";
for (int i = 0; i < importResult.size(); i++) {
line = 0;
List<List<String>> sheetResult = importResult.get(i);
if (sheetResult == null || sheetResult.isEmpty()) {
if (AppUtil.isZh()) {
return stakingFile.getAbsolutePath() + ",导入失败,原因:导入excel为空";
} else {
result = stakingFile.getAbsolutePath() + "," + StringUtils.getString(R.string.import_failed);
}
}
String sheetName = sheetResult.get(0).isEmpty() ? "default" : sheetResult.get(0).get(0);
StakingJob stakeOutJob = new StakingJob(sheetName);
for (int j = 1; j < sheetResult.size(); j++) {
List<String> row = sheetResult.get(j);
line = j + 1;
if (row.isEmpty() || ExcelReadHelper.isRowEmpty(row)) {
continue;
}
if (row.size() != 8) {
if (AppUtil.isZh()) {
result = stakingFile.getAbsolutePath() + "/" + sheetName + ",导入失败,原因:第" + line + "行,元素个数必须为8";
} else {
result = stakingFile.getAbsolutePath() + "," + StringUtils.getString(R.string.import_failed);
}
break;
}
stakeOutJob.getPointList().add(Integer.parseInt(row.get(0)), row.get(1), row.get(2), Double.parseDouble(row.get(3))
, Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), row.get(6), row.get(7));
}
stakingJobs.add(stakeOutJob);
}
if ("".equals(result)) {
result = stakingFile.getAbsolutePath() + "," + "," + StringUtils.getString(R.string.import_success);
}
} catch (NumberFormatException ex) {
if (AppUtil.isZh()) {
result = stakingFile.getAbsolutePath() + ",导入失败,原因:第" + line + "行,发现非数字字符串";
} else {
result = stakingFile.getAbsolutePath() + "," + StringUtils.getString(R.string.import_failed);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
/**
* 收集面积测量任务和点测量任务
*/
@WorkerThread
static void collectXJob(String projectId, File projectFolder, String prefix, String jsonArrayFileName, TimeCount.ITimeCounter time) {
if (projectId == null || projectFolder == null || !projectFolder.exists()) {
return;
}
JsonStringArray jsonStringArray = readListStringJson(projectFolder, jsonArrayFileName);
if (jsonStringArray != null && jsonStringArray.getStrings() != null) { //1.尝试读取「.json」文件
List<String> surveyJobList = jsonStringArray.getStrings();
for (String jobString : surveyJobList) {
String jobName = prefix + jobString;
JobRecord record = JobDb.getInstance().rawQueryData(
JobConstants.findByProjectAndName(projectId, jobName));
if (record != null) {
BCLog.log(log -> log.d("collect_warning", "测量任务 重复收集-" + jobName + " in " + projectId));
continue;
}
JobRecord jobRecord = new JobRecord(jobName, projectId, time.time());
JobDb.getInstance().save(jobRecord);
}
} else { //2.尝试读取「.job」文件
//todo 暂时放弃
}
}
/**
* 读取面积测量点测量任务配置文件
*/
private static JsonStringArray readListStringJson(File prjFolder, String fileName) {
if (!new File(prjFolder, fileName + "." + FileNameConstants.JSON_SUFFIX).exists()) {//应用自有目录下文件是否存在
return null;
} else {
try {
return JsonStringArray.read(prjFolder, fileName, FileNameConstants.JSON_SUFFIX);
} catch (Exception ex) {
File target = new File(prjFolder, fileName + FileNameConstants.JSON_SUFFIX);
BCLog.log(log -> log.e("Read Config", "read " + target.getAbsolutePath() + " failure!" + "\n" + ex.toString()));
}
}
return null;
}
/**
* json转换成列表
*/
//Json数组字符串转换为对应的列表
private static <T> List<T> getDataList(Context context, String tag, Class<T> cls) {
List<T> list = new ArrayList<>();
SharedPreferences preferences = context.getSharedPreferences("bingce_celiangyuan", Context.MODE_PRIVATE);
String json = preferences.getString(tag, "");
if (!TextUtils.isEmpty(json)) {
Gson gson = new Gson();
JsonArray array = new JsonParser().parse(json).getAsJsonArray();
for (JsonElement elem : array) {
try {
list.add(gson.fromJson(elem, cls));
} catch (Exception ignore) {
}
}
}
return list;
}
@WorkerThread
public static String createDefaultJob(Context context, String projectId, long time) {
JobRecord jobRecord = new JobRecord(context.getString(R.string.default_work_name), projectId, time);
JobDb.getInstance().save(jobRecord);
KeyValueRecord defaultJobConfig = new KeyValueRecord(KeyValueConstants.keyOfProjectCurrentJob(projectId), jobRecord.id);
KeyValueDb.getInstance().save(defaultJobConfig);
BCLog.Launcher.log(() -> "为项目[" + projectId + "]创建默认作业[" + jobRecord.id + "]");
return jobRecord.id;
}
}

@ -0,0 +1,70 @@
package com.project.survey.ui.instrument.setupstation.util;
import com.bingce.utils.FileUtil;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
class JsonStringArray {
private String name;
private List<String> strings = new ArrayList<>();
public JsonStringArray() {
}
public JsonStringArray(String name) {
this.name = name;
strings = new ArrayList<>();
}
public List<String> getStrings() {
return strings;
}
public void setStrings(List<String> strings) {
this.strings = strings;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static JsonStringArray read(File folder, String name, String suffix) {
JsonStringArray jsonStringArray = new JsonStringArray(name);
File target = new File(folder, name + "." + suffix);
if (!target.exists()) {
return jsonStringArray;
}
FileUtil.ReadFileResult readFileResult = FileUtil.readStringFrom(target);
if (readFileResult.success) {
try {
List<String> result = gson.fromJson(readFileResult.string, new TypeToken<List<String>>() {
}.getType());
if (result != null) {
jsonStringArray.strings.addAll(result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return jsonStringArray;
}
public void save(File folder, String suffix) {
String json = gson.toJson(strings);
FileUtil.writeString(json, new File(folder, name + "." + suffix));
}
public void clear() {
strings.clear();
}
private static final Gson gson = new Gson();
}

@ -0,0 +1,50 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import androidx.annotation.WorkerThread;
import com.bingce.TimeCount;
import com.bingce.constants.FileNameConstants;
import com.bingce.data.database.KeyValueDb;
import com.bingce.data.surveyor.designdata.kv.KeyValueConstants;
import com.bingce.data.surveyor.designdata.kv.KeyValueRecord;
import java.io.File;
public class MigrationBingCeFolderDataUtils {
@WorkerThread
public static boolean collectFromBingCeFolder(Context appCompatActivity, File dataFolder, CollectLocalDataInAppStartFirstTimeUtil.ILog log, TimeCount.ITimeCounter timeCounter) {
if (!dataFolder.exists()) {
return false;
}
File mark = new File(dataFolder, CollectLocalDataInAppStartFirstTimeUtil.COLLECTED_FILE_NAME);
if (mark.exists()) {//已经收集过了
log.log("BingCe目录下数据已读取");
return true;
}
log.log("读取坐标系数据");
//0.收集坐标系模板
CoordinatorSystemCollectUtils.collectCoordinatorTemplate(new File(dataFolder, FileNameConstants.CONFIG_FILE_EXCEL_COORDINATOR_OF_PROJECT), timeCounter);
//1.收集全站仪数据
_1TotalStationCollectUtils.collect(dataFolder, log);
//遍历目录
File[] projects = dataFolder.listFiles();
if (projects == null) {
return false;
}
//遍历项目目录
for (File project : projects) {
if (!project.exists() || project.isFile()) {
continue;
}
ProjectDbUtils.collect(appCompatActivity, project, log, timeCounter);
}
//生成收集标识
if (!CollectLocalDataInAppStartFirstTimeUtil.generatorCollectedFile(dataFolder)) {
KeyValueDb.getInstance().save(new KeyValueRecord(CollectLocalDataInAppStartFirstTimeUtil.GENERATOR_COLLECTED_FILE_FAILURE
, KeyValueConstants.VALUE_YES));
}
return true;
}
}

@ -0,0 +1,26 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import com.bingce.TimeCount;
import com.bingce.data.database.KeyValueDb;
import com.bingce.data.surveyor.designdata.kv.KeyValueConstants;
import com.bingce.data.surveyor.designdata.kv.KeyValueRecord;
import java.io.File;
public class MigrationCeliangyuanFolderDataUtils {
static boolean collectFromCeliangyuanFolder(
Context appCompatActivity, File celiangyuanFolder, CollectLocalDataInAppStartFirstTimeUtil.ILog log, TimeCount.ITimeCounter timeCounter) {
log.log("读取测量员目录下数据");
if (!ProjectDbUtils.collect(appCompatActivity, celiangyuanFolder, log, timeCounter)) {
return false;
}
//生成收集标识
if (!CollectLocalDataInAppStartFirstTimeUtil.generatorCollectedFile(celiangyuanFolder)) {
KeyValueDb.getInstance().save(new KeyValueRecord(CollectLocalDataInAppStartFirstTimeUtil.GENERATOR_COLLECTED_FILE_FAILURE
, KeyValueConstants.VALUE_YES));
}
return true;
}
}

@ -0,0 +1,59 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
import com.bingce.TimeCount;
import com.bingce.coordlib.model.CoordinateSystem;
import com.bingce.data.database.KeyValueDb;
import com.bingce.data.database.ProjectDb;
import com.bingce.data.surveyor.designdata.kv.KeyValueConstants;
import com.bingce.data.surveyor.designdata.kv.KeyValueRecord;
import com.bingce.data.surveyor.designdata.project.ProjectRecord;
import com.bingce.utils.StringUtil;
import java.io.File;
public class ProjectDbUtils {
@WorkerThread
static boolean collect(@NonNull Context context, @NonNull File projectFolder, CollectLocalDataInAppStartFirstTimeUtil.ILog log, TimeCount.ITimeCounter timeCounter) {
if (!projectFolder.exists() || projectFolder.isFile()) {
return false;
}
log.log("读取[" + projectFolder.getName() + "]项目数据");
//收集项目坐标系
CoordinateSystem coordinateSystem = _3CoordinatorCollectUtils.collectCoordinatorOfProject(projectFolder);
//创建项目记录
ProjectRecord projectRecord = new ProjectRecord(projectFolder.getName(), coordinateSystem, timeCounter.time());
String projectId = projectRecord.id;
//收集道路信息
File[] folders = projectFolder.listFiles();
if (folders != null) {
for (File folder : folders) {
String id = RoadDbUtils.collectRoad(projectId, folder, log, timeCounter.time());
if (StringUtil.isEmpty(id)) {
continue;
}
projectRecord.roadSequence.add(id);
}
}
//检测是否有线路
if (projectRecord.roadSequence.isEmpty()) {
String defaultRoadId = RoadDbUtils.createDefaultRoad(context, projectId);
projectRecord.roadSequence.add(defaultRoadId);
}
KeyValueRecord defaultRoadConfig = new KeyValueRecord(KeyValueConstants.keyOfProjectCurrentRoad(projectId), projectRecord.roadSequence.get(0));
KeyValueDb.getInstance().save(defaultRoadConfig);
//需要在更新过线路顺序后再存储project
ProjectDb.getInstance().save(projectRecord);
//收集作业
//创建默认作业,用于存储各种测量信息
String defaultJobId = JobDbUtils.createDefaultJob(context, projectId, timeCounter.time());
JobDbUtils.collect(context, projectId, projectFolder, log, timeCounter);
//收集全局控制点
_6GlobalControlPointCollectUtils.collect(projectId, defaultJobId, projectFolder, log, timeCounter);
return true;
}
}

@ -0,0 +1,71 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.content.Context;
import android.util.Log;
import androidx.annotation.WorkerThread;
import com.bingce.constants.FileNameConstants;
import com.project.survey.BuildConfig;
import com.bingce.data.database.KeyValueDb;
import com.bingce.data.database.RoadDb;
import com.bingce.data.surveyor.designdata.kv.KeyValueConstants;
import com.bingce.data.surveyor.designdata.kv.KeyValueRecord;
import com.bingce.data.surveyor.designdata.road.RoadRecord;
import com.bingce.log.BCLog;
import com.bingce.road.RoadRecordConvertUtils;
import com.bingce.road.xport.RoadAllUtil;
import com.bingce.utils.IdUtils;
import java.io.File;
import com.project.survey.R;
import cn.liuyanbing.surveyor.model.base.Road;
public class RoadDbUtils {
/**
* 收集道路数据
*
* @return 成功返回RoadRecord实例已经被存储到数据库中的id失败返回null
*/
@WorkerThread
static String collectRoad(String projectId, File roadFolder, CollectLocalDataInAppStartFirstTimeUtil.ILog log, long time) {
//1.检测是否是道路数据目录
if (!RoadAllUtil.isRoadFolder(roadFolder)) {
return null;
}
log.log("开始读取道路数据[" + roadFolder.getName() + "]");
if (BuildConfig.DEBUG) {
Log.d("__test_develop", "收集Road" + roadFolder.getName() + ": ");
}
//2.优化使用json文件导入道路数据
File jsonFile = new File(roadFolder, FileNameConstants.DEFAULT_ROAD_DATA_FILE_NAME);
Road road = new Road(roadFolder.getName());
if (!jsonFile.exists() || !road.read(jsonFile.getAbsolutePath())) {
if (BuildConfig.DEBUG) {
Log.d("__test_develop", "收集Road" + roadFolder.getName() + ": 读取road.json失败");
}
//如果json文件导入失败,尝试读取excel或txt
RoadAllUtil.importRoadArgs(roadFolder, road, false);
}
RoadRecord roadRecord = RoadRecordConvertUtils.convert2Record(road, projectId, time);
//检测id是否是uuid
//检测UUID是否合法----之前使用id是根据时间创建的,现在需要将其转换为uuid
int deprecatedIdSize = "20220707092909073544".length();
if (roadRecord.id.length() <= deprecatedIdSize) {
roadRecord.id = IdUtils.getUUID();
}
RoadDb.getInstance().save(roadRecord);
return roadRecord.id;
}
@WorkerThread
public static String createDefaultRoad(Context context, String projectId) {
//设置默认线路
RoadRecord roadRecord = RoadDb.getInstance().createNewInstance(projectId, context.getString(R.string.default_road));
KeyValueRecord defaultRoadConfig = new KeyValueRecord(KeyValueConstants.keyOfProjectCurrentRoad(projectId), roadRecord.id);
KeyValueDb.getInstance().save(defaultRoadConfig);
BCLog.Launcher.log(() ->"为项目[" + projectId + "]创建默认线路[" + roadRecord.id + "]");
return roadRecord.id;
}
}

@ -0,0 +1,79 @@
package com.project.survey.ui.instrument.setupstation.util;
import static com.bingce.data.database.DBQueryConstant.NOT_DELETED;
import static com.bingce.data.database.DBQueryConstant.WHERE;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.sqlite.db.SimpleSQLiteQuery;
import androidx.sqlite.db.SupportSQLiteQuery;
import com.bingce.data.BingCeDbConstant;
import com.bingce.data.database.DBQueryConstant;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointConstants;
import com.bingce.utils.RoomFilterBuilder;
import com.bingce.utils.StringUtil;
import com.bingce.viewmodel.AbstractCoordinatePointsLibraryViewModelKt.FilterParameter;
public class StakingPointsLibraryActivitySQLiteUtils {
@NonNull
static SimpleSQLiteQuery getSimpleSQLiteQuery(FilterParameter parameter, StringBuilder stringBuilder, String jobOrProjectId, int pageIndex, int pageSize, boolean stakingFlag, String nameOrCodeStr) {
if (parameter == null) {
return new SimpleSQLiteQuery(stringBuilder.toString());
}
stringBuilder.append(WHERE).append(NOT_DELETED);
boolean filtered = stakingFlag ?
RoomFilterBuilder.appendEqualsFilter(true, stringBuilder, BingCeDbConstant.DB_KEY_JOB_ID, jobOrProjectId):
RoomFilterBuilder.appendEqualsFilter(true,stringBuilder,BingCeDbConstant.DB_KEY_PROJECT_ID,jobOrProjectId);
filtered = stakingFlag? PointConstants.knownPoint(filtered, stringBuilder) : PointConstants.globalControlPoint(filtered,stringBuilder);
if (!StringUtil.isEmpty(parameter.getNameKey())) {
filtered = RoomFilterBuilder.appendLikesFilter(filtered, stringBuilder, PointConstants.COL_NAME, parameter.getNameKey());
}
if (!StringUtil.isEmpty(parameter.getCodeKey())) {
filtered = RoomFilterBuilder.appendLikesFilter(filtered, stringBuilder, PointConstants.COL_CODE, parameter.getCodeKey());
}
if (!StringUtil.isEmpty(parameter.getRemarkKey())) {
filtered = RoomFilterBuilder.appendLikesFilter(filtered, stringBuilder, BingCeDbConstant.DB_KEY_REMARKS, parameter.getRemarkKey());
}
if (!TextUtils.isEmpty(nameOrCodeStr)){
stringBuilder.append(" AND ");
stringBuilder.append(" (");
stringBuilder.append(RoomFilterBuilder.filterLike(PointConstants.COL_NAME, nameOrCodeStr));
RoomFilterBuilder.appendOrLikesFilter(filtered,stringBuilder,PointConstants.COL_CODE,nameOrCodeStr);
stringBuilder.append(") ");
}
if (parameter.getDateStart() != null && parameter.getDateEnd() != null) {
filtered = RoomFilterBuilder.appendBetweenDate(filtered, stringBuilder, BingCeDbConstant.DB_KEY_CREATED_DATE,
parameter.getDateStart(), parameter.getDateEnd());
} else if (parameter.getDateStart() != null) {
filtered = RoomFilterBuilder.appendDateFilter(filtered, stringBuilder, parameter.getDateStart(), BingCeDbConstant.DB_KEY_CREATED_DATE, true);
} else if (parameter.getDateEnd() != null) {
filtered = RoomFilterBuilder.appendDateFilter(filtered, stringBuilder, parameter.getDateEnd(), BingCeDbConstant.DB_KEY_CREATED_DATE, false);
}
RoomFilterBuilder.appendDateOrder(stringBuilder, BingCeDbConstant.DB_KEY_CREATED_DATE, false);
return new SimpleSQLiteQuery(stringBuilder.toString());
}
public static SupportSQLiteQuery countSQLit(String jobId, FilterParameter parameter, boolean stakingFlag) {
StringBuilder stringBuilder = new StringBuilder(DBQueryConstant.COUNT_FROM)
.append(PointConstants.DB_NAME);
return getSimpleSQLiteQuery(parameter, stringBuilder, jobId, -1, -1,stakingFlag,null);
}
public static SupportSQLiteQuery searchSQLit(String jobId, FilterParameter parameter, int pageIndex, int pageSize, boolean stakingFlag) {
StringBuilder stringBuilder = new StringBuilder(DBQueryConstant.SELECT_FROM)
.append(PointConstants.DB_NAME);
return getSimpleSQLiteQuery(parameter, stringBuilder, jobId, pageIndex, pageSize,stakingFlag,null);
}
public static SupportSQLiteQuery searchSQLit(String jobOrProjectId, FilterParameter parameter, boolean stakingFlag, String nameOrCode){
StringBuilder stringBuilder = new StringBuilder(DBQueryConstant.SELECT_FROM)
.append(PointConstants.DB_NAME);
return getSimpleSQLiteQuery(parameter, stringBuilder, jobOrProjectId, -1, -1,stakingFlag,nameOrCode);
}
}

@ -0,0 +1,44 @@
package com.project.survey.ui.instrument.setupstation.util;
import androidx.annotation.WorkerThread;
import com.bingce.totalstation.TsConfig;
import com.bingce.utils.FileUtil;
import java.io.File;
import blankj.utilcode.util.Utils;
class _1TotalStationCollectUtils {
@WorkerThread
static void collect(File appFolder, CollectLocalDataInAppStartFirstTimeUtil.ILog log) {
log.log("读取全站仪数据...");
//1.优化读取total_station.json
File jsonFile = new File(appFolder, TsConfig.CONFIG_FILE);
if (jsonFile.exists()) {
FileUtil.ReadFileResult readFileResult = FileUtil.readStringFrom(jsonFile);
if (readFileResult.success) {
save(readFileResult.string);
}
log.log("完成全站仪数据收集.");
return;
}
//2.读取其他
File configJsonFile = new File(appFolder, "totalstation.json");
if (configJsonFile.exists()) {
FileUtil.ReadFileResult readFileResult = FileUtil.readStringFrom(configJsonFile);
if (readFileResult.success) {
save(readFileResult.string);
log.log("完成全站仪数据收集..");
return;
}
}
log.log("结束全站仪数据收集.");
}
@WorkerThread
private static void save(String configString) {
File configJsonFile = new File(Utils.getApp().getFilesDir(), TsConfig.CONFIG_FILE);
FileUtil.writeString(configString, configJsonFile);
}
}

@ -0,0 +1,348 @@
package com.project.survey.ui.instrument.setupstation.util;
import android.util.Log;
import androidx.annotation.WorkerThread;
import com.bingce.coordlib.enums.DatumEnum;
import com.bingce.coordlib.enums.EllipsoidEnum;
import com.bingce.coordlib.enums.GridEnum;
import com.bingce.coordlib.enums.HFittingEnum;
import com.bingce.coordlib.enums.ProjectionEnum;
import com.bingce.coordlib.model.Blh;
import com.bingce.coordlib.model.BlhCoordinatePair;
import com.bingce.coordlib.model.Coordinate;
import com.bingce.coordlib.model.CoordinateSystem;
import com.bingce.coordlib.util.CoordinateSystemUtil;
import com.bingce.coordlib.util.CoordinateSystemUtilOld;
import com.bingce.poi.excel.ExcelReadHelper;
import com.bingce.utils.Util;
import java.io.File;
import java.util.List;
import blankj.utilcode.util.Utils;
class _3CoordinatorCollectUtils {
/**
* 收集坐标系数据
*
* @return 成功返回CoordinateRecord实例已经被存储到数据库中失败返回null
*/
@WorkerThread
static CoordinateSystem collectCoordinatorOfProject(File projectFolder) {
//先尝试收集.json
CoordinateSystem coordinateSystem = CoordinateSystemUtilOld.importCoordSysJsonFile(projectFolder);
//如果json坐标文件不存在,尝试读取excel
if (coordinateSystem == null) {
coordinateSystem = importCoordSysExcelFile(projectFolder);
}
if (coordinateSystem == null){
coordinateSystem = CoordinateSystemUtil.importCoordSysStringFile(projectFolder);
}
//如果仍然没有配置文件,则尝试新建
if (coordinateSystem == null) {
coordinateSystem = CoordinateSystem.newCoordinateSystem(Utils.getApp());
}
return coordinateSystem;
}
/**
* 导入excel版坐标系统
*
* @param prjFolder 工程文件夹路径
* @return 坐标系统
*/
private static CoordinateSystem importCoordSysExcelFile(File prjFolder) {
File sysFile = new File(prjFolder, "coordinate_system.xls");
if (!sysFile.exists() || sysFile.isDirectory()) {
return null;
}
CoordinateSystem coordinateSystem = new CoordinateSystem();
coordinateSystem.isPreset = false;
int line = 0;
try {
List<List<List<String>>> importResult = ExcelReadHelper.excelReadBySheet(sysFile, ExcelReadHelper.FIRST_ROW_NOT_IGNORE);
if (importResult == null) return coordinateSystem;
if (importResult.isEmpty()) return coordinateSystem;
line = 0;
List<List<String>> sheetResult = importResult.get(0);
if (sheetResult == null || sheetResult.isEmpty()) {
Log.d("CoordinateSystemUtil", sysFile.getAbsolutePath() + ",导入失败,原因:导入excel为空");
return coordinateSystem;
}
String sheetName = sheetResult.get(0).isEmpty() ? "default" : sheetResult.get(0).get(0);
coordinateSystem.setName(sheetName);
for (int j = 1; j < sheetResult.size(); j++) {
List<String> row = sheetResult.get(j);
line = j + 1;
if (row.isEmpty() || ExcelReadHelper.isRowEmpty(row)) {
continue;
}
if (row.size() != 2 && row.size() != 7 && row.size() != 6 && row.size() != 9) {
Log.d("CoordinateSystemUtil", sysFile.getAbsolutePath() + ",导入失败,原因:第" + line + "行,元素个数必须为2,7,6,9");
break;
}
if (row.size() == 2) {
switch (row.get(0)) {
case "isPreset":
int preset = Integer.parseInt(row.get(1));
coordinateSystem.isPreset = preset == 1;
break;
case "rtkTransformMethod":
case "transMethod":
int method = Integer.parseInt(row.get(1));
if (method == 0) {
coordinateSystem.datum = DatumEnum.BURSA;
coordinateSystem.grid = GridEnum.NULL;
coordinateSystem.hFitting = HFittingEnum.NULL;
} else if (method == 1 || method == 2) {
coordinateSystem.datum = DatumEnum.NULL;
coordinateSystem.grid = GridEnum.FOUR_PARA;
coordinateSystem.hFitting = HFittingEnum.FIX;
}
break;
case "ellipsoidType":
int ellipsoid = Integer.parseInt(row.get(1));
switch (ellipsoid) {
case 0:
coordinateSystem.setEllipsoid(EllipsoidEnum.WGS_84);
break;
case 1:
coordinateSystem.setEllipsoid(EllipsoidEnum.BEIJING_54);
break;
case 2:
coordinateSystem.setEllipsoid(EllipsoidEnum.XIAN_80);
break;
default:
coordinateSystem.setEllipsoid(EllipsoidEnum.CGCS_2000);
break;
}
break;
case "rtkProjectType":
case "projectType":
int type = Integer.parseInt(row.get(1));
switch (type) {
case 2:
coordinateSystem.setProjection(ProjectionEnum.UTM);
break;
default:
coordinateSystem.setProjection(ProjectionEnum.GAUSS);
}
break;
case "datumTransType":
int datumTransType = Integer.parseInt(row.get(1));
if (datumTransType < 0 || datumTransType > 1)
datumTransType = 0;
switch (datumTransType) {
case 1:
coordinateSystem.datum = DatumEnum.BURSA;
break;
default:
coordinateSystem.datum = DatumEnum.NULL;
}
break;
case "planeTransType":
int planeTransType = Integer.parseInt(row.get(1));
switch (planeTransType) {
case 1:
coordinateSystem.grid = GridEnum.FOUR_PARA;
break;
default:
coordinateSystem.grid = GridEnum.NULL;
}
break;
case "elvFitType":
int elvFitType = Integer.parseInt(row.get(1));
switch (elvFitType) {
case 1:
case 4:
coordinateSystem.hFitting = HFittingEnum.FIX;
break;
case 2:
coordinateSystem.hFitting = HFittingEnum.PLANE;
break;
case 3:
coordinateSystem.hFitting = HFittingEnum.CURVE;
break;
case 5:
coordinateSystem.hFitting = HFittingEnum.TGO;
break;
default:
coordinateSystem.hFitting = HFittingEnum.NULL;
}
break;
case "longOfOrigin":
case "centLng":
coordinateSystem.centLng = Double.parseDouble(row.get(1));
break;
case "latOfOrigin":
case "baseLat":
coordinateSystem.baseLat = Double.parseDouble(row.get(1));
break;
case "projectionScale":
case "projScl":
coordinateSystem.projScl = Double.parseDouble(row.get(1));
break;
case "falseEasting":
case "falseE":
coordinateSystem.falseE = Double.parseDouble(row.get(1));
break;
case "falseNorthing":
case "falseN":
coordinateSystem.falseN = Double.parseDouble(row.get(1));
break;
case "projectionHeight":
case "projAlt":
coordinateSystem.projAlt = Double.parseDouble(row.get(1));
break;
case "sevenParDx":
coordinateSystem.sevenDx = Double.parseDouble(row.get(1));
break;
case "sevenParDy":
coordinateSystem.sevenDy = Double.parseDouble(row.get(1));
break;
case "sevenParDz":
coordinateSystem.sevenDz = Double.parseDouble(row.get(1));
break;
case "sevenParRx":
coordinateSystem.sevenRx = Double.parseDouble(row.get(1)) * 3600d;
break;
case "sevenParRy":
coordinateSystem.sevenRy = Double.parseDouble(row.get(1)) * 3600d;
break;
case "sevenParRz":
coordinateSystem.sevenRz = Double.parseDouble(row.get(1)) * 3600d;
break;
case "sevenParScl":
coordinateSystem.sevenPpm = (Double.parseDouble(row.get(1)) - 1) * 1000000d;
break;
case "fourParDx":
coordinateSystem.fourDx = Double.parseDouble(row.get(1));
break;
case "fourParDy":
coordinateSystem.fourDy = Double.parseDouble(row.get(1));
break;
case "fourParRot":
coordinateSystem.fourRot = Util.radianToDmsDouble(Math.toRadians(Double.parseDouble(row.get(1))));
break;
case "fourParScl":
coordinateSystem.fourScl = Double.parseDouble(row.get(1));
break;
case "hFitA0":
coordinateSystem.hFitA0 = Double.parseDouble(row.get(1));
break;
case "hFitA1":
coordinateSystem.hFitA1 = Double.parseDouble(row.get(1));
break;
case "hFitA2":
coordinateSystem.hFitA2 = Double.parseDouble(row.get(1));
break;
case "hFitA3":
coordinateSystem.hFitA3 = Double.parseDouble(row.get(1));
break;
case "hFitA4":
coordinateSystem.hFitA4 = Double.parseDouble(row.get(1));
break;
case "hFitA5":
coordinateSystem.hFitA5 = Double.parseDouble(row.get(1));
break;
case "hFitN":
coordinateSystem.hFitN = Double.parseDouble(row.get(1));
break;
case "hFitE":
coordinateSystem.hFitE = Double.parseDouble(row.get(1));
break;
case "hFitNorthOrigin":
coordinateSystem.hFitNorthOrigin = Double.parseDouble(row.get(1));
break;
case "hFitEastOrigin":
coordinateSystem.hFitEastOrigin = Double.parseDouble(row.get(1));
break;
case "hFitNorthSlope":
coordinateSystem.hFitNorthSlope = Double.parseDouble(row.get(1));
break;
case "hFitEastSlope":
coordinateSystem.hFitEastSlope = Double.parseDouble(row.get(1));
break;
case "hFitHdConstant":
coordinateSystem.hFitHdConstant = Double.parseDouble(row.get(1));
break;
case "correctX":
coordinateSystem.correctN = -1 * Double.parseDouble(row.get(1));
break;
case "correctY":
coordinateSystem.correctE = -1 * Double.parseDouble(row.get(1));
break;
case "correctZ":
coordinateSystem.correctH = -1 * Double.parseDouble(row.get(1));
break;
case "correctN":
coordinateSystem.correctN = Double.parseDouble(row.get(1));
break;
case "correctE":
coordinateSystem.correctE = Double.parseDouble(row.get(1));
break;
case "correctH":
coordinateSystem.correctH = Double.parseDouble(row.get(1));
break;
}
} else if (row.size() == 6) {
coordinateSystem.getPairs().add(new BlhCoordinatePair("", new Blh(Double.parseDouble(row.get(0)), Double.parseDouble(row.get(1)), Double.parseDouble(row.get(2)))
, new Coordinate(Double.parseDouble(row.get(3)), Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)))));
} else if (row.size() == 9) {
if ("BlhPointPair".equals(row.get(0).trim())) {
switch (Integer.parseInt(row.get(1))) {
case 47:
coordinateSystem.getPairs().add(new BlhCoordinatePair(row.get(2), new Blh(Double.parseDouble(row.get(3)), Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)))
, new Coordinate(Double.parseDouble(row.get(6)), Double.parseDouble(row.get(7)), Double.parseDouble(row.get(8)))));
break;
case 51:
coordinateSystem.phonePair1 = new BlhCoordinatePair(row.get(2), new Blh(Double.parseDouble(row.get(3)), Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)))
, new Coordinate(Double.parseDouble(row.get(6)), Double.parseDouble(row.get(7)), Double.parseDouble(row.get(8))));
break;
case 52:
coordinateSystem.phonePair2 = new BlhCoordinatePair(row.get(2), new Blh(Double.parseDouble(row.get(3)), Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)))
, new Coordinate(Double.parseDouble(row.get(6)), Double.parseDouble(row.get(7)), Double.parseDouble(row.get(8))));
break;
}
}
} else {
switch (Integer.parseInt(row.get(0))) {
case 4:
case 7:
coordinateSystem.getPairs().add(new BlhCoordinatePair("", new Blh(Math.toDegrees(Util.dmsStringToRadian(row.get(1), false)), Math.toDegrees(Util.dmsStringToRadian(row.get(2), false)), Double.parseDouble(row.get(3)))
, new Coordinate(Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), Double.parseDouble(row.get(6)))));
break;
case 31:
coordinateSystem.phonePair1 = new BlhCoordinatePair("", new Blh(Math.toDegrees(Util.dmsStringToRadian(row.get(1), false)), Math.toDegrees(Util.dmsStringToRadian(row.get(2), false)), Double.parseDouble(row.get(3)))
, new Coordinate(Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), Double.parseDouble(row.get(6))));
break;
case 32:
coordinateSystem.phonePair2 = new BlhCoordinatePair("", new Blh(Math.toDegrees(Util.dmsStringToRadian(row.get(1), false)), Math.toDegrees(Util.dmsStringToRadian(row.get(2), false)), Double.parseDouble(row.get(3)))
, new Coordinate(Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), Double.parseDouble(row.get(6))));
break;
case 41:
coordinateSystem.phonePair1 = new BlhCoordinatePair("", new Blh(Double.parseDouble(row.get(1)), Double.parseDouble(row.get(2)), Double.parseDouble(row.get(3)))
, new Coordinate(Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), Double.parseDouble(row.get(6))));
break;
case 42:
coordinateSystem.phonePair2 = new BlhCoordinatePair("", new Blh(Double.parseDouble(row.get(1)), Double.parseDouble(row.get(2)), Double.parseDouble(row.get(3)))
, new Coordinate(Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), Double.parseDouble(row.get(6))));
break;
}
}
}
Log.d("CoordinateSystemUtil", sysFile.getAbsolutePath() + ",导入成功");
} catch (NumberFormatException ex) {
Log.d("CoordinateSystemUtil", sysFile.getAbsolutePath() + ",导入失败,原因:第" + line + "行,发现非数字字符串");
} catch (Exception ex) {
ex.printStackTrace();
}
return coordinateSystem;
}
}

@ -0,0 +1,379 @@
package com.project.survey.ui.instrument.setupstation.util;
import androidx.annotation.WorkerThread;
import com.bingce.TimeCount;
import com.bingce.constants.FileNameConstants;
import com.bingce.data.database.PointDb;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointConstants;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord;
import com.bingce.poi.excel.ExcelReadHelper;
import com.bingce.utils.AppUtil;
import com.project.survey.R;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import blankj.utilcode.util.StringUtils;
import blankj.utilcode.util.ToastUtils;
import cn.liuyanbing.surveyor.model.base.Point;
import cn.liuyanbing.surveyor.model.base.PointArray;
public class _6GlobalControlPointCollectUtils {
static void collect(String projectId, String defaultJobId, File projectFolder, CollectLocalDataInAppStartFirstTimeUtil.ILog log, TimeCount.ITimeCounter timeCounter) {
File globalFile = new File(projectFolder, FileNameConstants.CONFIG_FILE_GLOBAL_CONTROL_POINT);
if (!globalFile.exists()) {
globalFile = new File(projectFolder, "全局控制点.xls");
}
if (!globalFile.exists()) {
return;
}
log.log("读取全局控制点数据");
importGlobalControlPointExcel(projectId, defaultJobId, globalFile, timeCounter);
// PointArray pointArray = new PointArray();
// String error = importGlobalControlPointExcel(globalFile, pointArray);
// if (!StringUtil.isEmpty(error)) {
// return;
// }
// int size = pointArray.size();
// List<PointRecord> pointRecords = new ArrayList<>();
// for (int index = 0; index < size; index++) {
// Point point = pointArray.get(index);
// PointRecord pointRecord = new PointRecord(projectId, defaultJobId, "",
// PointConstants.POINT_TYPE_GLOBAL_CONTROL_POINT,
// point.getName(), point.getCode(), point.getRemarks(),
// point.getX(), point.getY(), point.getZ(),
// 0, 0, 0,
// PointConstants.POINT_FORMAT_XYZ, null);
// pointRecord.createDate = new Date(timeCounter.time());
// pointRecords.add(pointRecord);
// }
// PointDb.getInstance().save(pointRecords);
}
public static void importGlobalControlPointExcel(String projectId, String defaultJobId, File globalFile, TimeCount.ITimeCounter timeCounter) {
PointArray pointArray = new PointArray();
Result result = importGlobalControlPointExcel(globalFile, pointArray);
if (!pointArray.isEmpty()) {
int size = pointArray.size();
List<PointRecord> pointRecords = new ArrayList<>();
for (int index = 0; index < size; index++) {
Point point = pointArray.get(index);
PointRecord pointRecord = new PointRecord(projectId, defaultJobId, "",
PointConstants.POINT_TYPE_GLOBAL_CONTROL_POINT,
point.getName(), point.getCode(), point.getRemarks(),
point.getX(), point.getY(), point.getZ(),
0, 0, 0,
PointConstants.POINT_FORMAT_XYZ, null);
pointRecord.createDate = new Date(timeCounter.time());
pointRecords.add(pointRecord);
}
PointDb.getInstance().save(pointRecords);
}
if (!result.isSuccess()) {
ToastUtils.showShort(result.describe);
}
}
public static Result importGlobalControlPointExcel(File file, PointArray pointArray) {
int line = 0;
try {
List<List<String>> importResult = ExcelReadHelper.excelRead(file, ExcelReadHelper.FIRST_ROW_NOT_IGNORE);
if (importResult == null || importResult.isEmpty()) {
if (AppUtil.isZh()) {
return Result.failure(file.getAbsolutePath() + ",导入失败,原因:导入excel为空");
} else {
return Result.failure(file.getAbsolutePath() + "," + StringUtils.getString(R.string.import_failed));
}
}
for (int i = 0; i < importResult.size(); i++) {
List<String> row = importResult.get(i);
line = i + 1;
if (row.isEmpty() || ExcelReadHelper.isRowEmpty(row) || row.size() < 3) {
continue;
}
if (row.size() == 3) {
pointArray.add(Point.CONTROL, "", Double.parseDouble(row.get(0))
, Double.parseDouble(row.get(1)), Double.parseDouble(row.get(2)), "");
} else if (row.size() == 4) {
pointArray.add(Point.CONTROL, row.get(0), Double.parseDouble(row.get(1))
, Double.parseDouble(row.get(2)), Double.parseDouble(row.get(3)), "");
} else if (row.size() == 5) {
pointArray.add(Point.CONTROL, row.get(0), Double.parseDouble(row.get(1))
, Double.parseDouble(row.get(2)), Double.parseDouble(row.get(3)), row.get(4));
} else if (row.size() == 6) {
pointArray.add(Point.CONTROL, row.get(0), row.get(1), Double.parseDouble(row.get(2))
, Double.parseDouble(row.get(3)), Double.parseDouble(row.get(4)), row.get(5));
} else {
pointArray.add(Point.CONTROL, row.get(1), row.get(2), Double.parseDouble(row.get(3))
, Double.parseDouble(row.get(4)), Double.parseDouble(row.get(5)), row.get(6), row.get(7));
}
}
} catch (NumberFormatException ex) {
pointArray.clear();
if (AppUtil.isZh()) {
return Result.failure(file.getAbsolutePath() + ",导入失败,原因:第" + line + "行,发现非数字字符串");
} else {
return Result.failure(file.getAbsolutePath() + "," + StringUtils.getString(R.string.import_failed));
}
} catch (Exception ex) {
ex.printStackTrace();
if (AppUtil.isZh()) {
return Result.failure(file.getAbsolutePath() + ",导入失败,原因:第" + line + "行:" + ex.getMessage());
} else {
return Result.failure(file.getAbsolutePath() + "," + StringUtils.getString(R.string.import_failed));
}
}
return Result.success(file.getAbsolutePath() + "," + StringUtils.getString(R.string.import_success));
}
public static Result importStakingJobPointTxt(File file, PointArray pointArray) {
String result = "";
FileInputStream fis = null;
BufferedInputStream bis = null;
BufferedReader buff = null;
int line = 0;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
buff = new BufferedReader(new InputStreamReader(bis, "utf-8"));
String a = null;
while ((a = buff.readLine()) != null)// 检查数据
{
line++;
if ("".equals(a.trim()) || a.trim().startsWith("#")) {
continue;
}
a = a.replaceAll("(^[\u0020\u0009\u3000]*)|([\u0020\u0009\u3000]*$)", "");// 删除首尾空格、制表及全角空格
String[] arr = a.split(",|,", -2);
if (arr.length < 4) {
if (AppUtil.isZh()) {
return Result.failure(file.getAbsolutePath() + ",导入失败,原因:第" + line + "行,元素个数不能少于4个");
} else {
return Result.failure(file.getAbsolutePath() + "," + StringUtils.getString(R.string.import_failed));
}
}
if (arr.length == 4) {
/*job.getPointList()*/
pointArray.add(Point.STAKEOUT, arr[0], Double.parseDouble(arr[1])
, Double.parseDouble(arr[2]), Double.parseDouble(arr[3]), "");
} else if (arr.length == 5) {
/*job.getPointList()*/
pointArray.add(Point.STAKEOUT, arr[0], Double.parseDouble(arr[1])
, Double.parseDouble(arr[2]), Double.parseDouble(arr[3]), arr[4]);
} else if (arr.length == 6) {
/*job.getPointList()*/
pointArray.add(Point.STAKEOUT, arr[0], arr[1], Double.parseDouble(arr[2])
, Double.parseDouble(arr[3]), Double.parseDouble(arr[4]), arr[5]);
}
}
// if ("".equals(result)) {
// result = file.getAbsolutePath() + ",导入成功";
// }
} catch (NumberFormatException ex) {
if (AppUtil.isZh()) {
return Result.failure(file.getAbsolutePath() + ",导入失败,原因:第" + line + "行,发现非数字字符串");
} else {
return Result.failure(file.getAbsolutePath() + "," + StringUtils.getString(R.string.import_failed));
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (buff != null) {
try {
buff.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//执行一次性操作
//更新数据
//PointDb.getInstance().replaceKnownPoints(jobId, knownPointRecordsFrom(projectId, jobId, pointArray), isOverride);
return Result.success(file.getAbsolutePath() + "," + StringUtils.getString(R.string.import_success));
}
@WorkerThread
public static void importStakingJobPointCassDat(File file, String projectId, String jobId, TimeCount.ITimeCounter timeCounter, boolean cassXy) {
PointArray pointArray = new PointArray();
Result result = importStakingJobPointCassDat(file, pointArray, cassXy);
if (!pointArray.isEmpty()) {
int size = pointArray.size();
List<PointRecord> pointRecords = new ArrayList<>();
for (int index = 0; index < size; index++) {
Point point = pointArray.get(index);
PointRecord pointRecord = new PointRecord(projectId, jobId, "",
PointConstants.POINT_TYPE_GLOBAL_CONTROL_POINT,
point.getName(), point.getCode(), point.getRemarks(),
point.getX(), point.getY(), point.getZ(),
0, 0, 0,
PointConstants.POINT_FORMAT_XYZ, null);
pointRecord.createDate = new Date(timeCounter.time());
pointRecords.add(pointRecord);
}
PointDb.getInstance().save(pointRecords);
}
if (!result.isSuccess()) {
ToastUtils.showShort(result.describe);
}
}
/**
* 导入点数据
*
* @param file
* @return
*/
@WorkerThread
public static Result importStakingJobPointCassDat(File file, PointArray pointArray, boolean cassXy) {
String result = "";
FileInputStream fis = null;
BufferedInputStream bis = null;
BufferedReader buff = null;
int line = 0;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
buff = new BufferedReader(new InputStreamReader(bis, "utf-8"));
String a = null;
while ((a = buff.readLine()) != null)// 检查数据
{
line++;
if ("".equals(a.trim()) || a.trim().startsWith("#")) {
continue;
}
a = a.replaceAll("(^[\u0020\u0009\u3000]*)|([\u0020\u0009\u3000]*$)", "");// 删除首尾空格、制表及全角空格
String[] arr = a.split(",|,", -2);
if (arr.length != 5) {
if (AppUtil.isZh()) {
return Result.failure(file.getAbsolutePath() + ",导入失败,原因:第" + line + "行,元素个数不等于5个");
} else {
return Result.failure(file.getAbsolutePath() + "," + StringUtils.getString(R.string.import_failed));
}
}
if (cassXy) {
pointArray.add(Point.STAKEOUT, arr[0], arr[1], Double.parseDouble(arr[2]), Double.parseDouble(arr[3]), Double.parseDouble(arr[4]), "");
} else {
pointArray.add(Point.STAKEOUT, arr[0], arr[1], Double.parseDouble(arr[3]), Double.parseDouble(arr[2]), Double.parseDouble(arr[4]), "");
}
}
} catch (NumberFormatException ex) {
if (AppUtil.isZh()) {
return Result.failure(file.getAbsolutePath() + ",导入失败,原因:第\" + line + \"行,发现非数字字符串");
} else {
return Result.failure(file.getAbsolutePath() + "," + StringUtils.getString(R.string.import_failed));
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (buff != null) {
try {
buff.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//执行一次性操作
//更新数据
// PointDb.getInstance().replaceKnownPoints(jobId, knownPointRecordsFrom(projectId, jobId, pointArray), isOverride);
return Result.success(file.getAbsolutePath() + "," + StringUtils.getString(R.string.import_success));
}
/**
* 导入点数据
*
* @param file
* @param jobId
* @return
*/
@WorkerThread
public static void importStakingJobPointTxt(File file, String projectId, String jobId, TimeCount.ITimeCounter timeCounter) {
PointArray pointArray = new PointArray();
Result result = importStakingJobPointTxt(file, pointArray);
if (!pointArray.isEmpty()) {
int size = pointArray.size();
List<PointRecord> pointRecords = new ArrayList<>();
for (int index = 0; index < size; index++) {
Point point = pointArray.get(index);
PointRecord pointRecord = new PointRecord(projectId, jobId, "",
PointConstants.POINT_TYPE_GLOBAL_CONTROL_POINT,
point.getName(), point.getCode(), point.getRemarks(),
point.getX(), point.getY(), point.getZ(),
0, 0, 0,
PointConstants.POINT_FORMAT_XYZ, null);
pointRecord.createDate = new Date(timeCounter.time());
pointRecords.add(pointRecord);
}
PointDb.getInstance().save(pointRecords);
}
if (!result.isSuccess()) {
ToastUtils.showShort(result.describe);
}
}
public static class Result {
private final int code;
public final String describe;
public Result(int code, String describe) {
this.code = code;
this.describe = describe;
}
public boolean isSuccess() {
return SUCCESS == code;
}
private final static int SUCCESS = 0;
public static Result success(String str) {
return new Result(SUCCESS, str);
}
public static Result failure(String str) {
return new Result(-1, str);
}
}
}

@ -0,0 +1,308 @@
package com.project.survey.util;
import android.content.Context;
import com.bingce.coordlib.model.CoordinateSystem;
import com.bingce.data.cache.CachedProject;
import com.bingce.surveyor.util.dialog.CustomInputDialog;
import com.bingce.utils.FileUtil;
import com.bingce.utils.StringUtil;
import com.bingce.utils.Util;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.project.survey.R;
import com.project.survey.ui.instrument.setupstation.AddResultFormatActivity;
import com.project.survey.ui.instrument.setupstation.db.PointSurveyRecord;
import com.project.survey.ui.instrument.setupstation.db.resultformat.FormatRecord;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import blankj.utilcode.util.ToastUtils;
import blankj.utilcode.util.Utils;
public class CassCsvTxtExportUtil {
public static void exportFormat(Context activity, String suffixesUtils, CachedProject currentProject, FormatRecord formatRecord, List<PointSurveyRecord> pointSurveyRecords, CoordinateSystem coordinateSystem) {
List<String> regexFormatRecordList = new ArrayList<>();
String[] split = formatRecord.format_content.split(formatRecord.divided_symbols);
for (int i = 0; i < split.length; i++) {
regexFormatRecordList.add(split[i]);
}
if (XXPermissions.isGranted(activity, Permission.MANAGE_EXTERNAL_STORAGE)) {
exportCassFile(activity, currentProject, suffixesUtils, formatRecord, regexFormatRecordList, pointSurveyRecords, coordinateSystem);
} else {
ToastUtils.showShort(activity.getString(R.string.open_read_write_permissions));
}
}
/**
* 导出Cass文件
*/
private static String title;
private static void exportCassFile(Context context, CachedProject currentProject, String suffixesUtils, FormatRecord formatRecord, List<String> regexList, List<PointSurveyRecord> pointSurveyRecordList, CoordinateSystem coordinateSystem) {
if (Objects.equals(suffixesUtils, FormatSuffixesUtils.formatDAT)) {
title = context.getString(R.string.export_cass_file_name);
} else if (Objects.equals(suffixesUtils, FormatSuffixesUtils.formatTXT)) {
title = context.getString(R.string.export_txt_file_name);
} else if (Objects.equals(suffixesUtils, FormatSuffixesUtils.formatCSV)) {
title = context.getString(R.string.export_csv_file_name);
}
new CustomInputDialog.Builder(context).setTitle(title).setButtonConfirm(new CustomInputDialog.setOnConfirmClickListener() {
@Override
public void OnConfirmClick(String editText) {
if (android.text.TextUtils.isEmpty(editText.trim())) {
ToastUtils.showShort(context.getString(R.string.enter_file_name));
return;
}
StringBuilder result = new StringBuilder();
String divided_symbols = formatRecord.divided_symbols;
for (int i = 0; i < pointSurveyRecordList.size(); i++) {
PointSurveyRecord pointBaseRecord = pointSurveyRecordList.get(i);
for (int j = 0; j < regexList.size(); j++) {
String s = regexList.get(j);
if (s.equals("点名") || s.equals("Point name") || s.equals("№точ.")) {
if (j == regexList.size() - 1) {
result.append(pointBaseRecord.pointName);
} else {
result.append(pointBaseRecord.pointName).append(divided_symbols);
}
} else if (s.equals("编码") || s.equals("Code") || s.equals("Код")) {
if (StringUtil.isEmpty(pointBaseRecord.code) || pointBaseRecord.code.equals("空") || pointBaseRecord.code.equals("null") || pointBaseRecord.code.equals("Null") || pointBaseRecord.code.equals("NULL")) {
if (j == regexList.size() - 1) {
result.append("");
} else {
result.append("").append(divided_symbols);
}
} else {
if (j == regexList.size() - 1) {
result.append(pointBaseRecord.code);
} else {
result.append(pointBaseRecord.code).append(divided_symbols);
}
}
} else if (s.equals("纬度") || s.equals("Latitude") || s.equals("Широта")) {
if (j == regexList.size() - 1) {
result.append(converAngleFormat(formatRecord.angle_format, pointBaseRecord.latitude));
} else {
result.append(converAngleFormat(formatRecord.angle_format, pointBaseRecord.latitude)).append(divided_symbols);
}
} else if (s.equals("经度") || s.equals("Longitude") || s.equals("Долгота")) {
if (j == regexList.size() - 1) {
result.append(converAngleFormat(formatRecord.angle_format, pointBaseRecord.longitude));
} else {
result.append(converAngleFormat(formatRecord.angle_format, pointBaseRecord.longitude)).append(divided_symbols);
}
} else if (s.equals("大地高") || s.equals("Geodetic height") || s.equals("Высота")) {
if (j == regexList.size() - 1) {
result.append(Util.formatDouble2String(pointBaseRecord.altitude, 6));
} else {
result.append(Util.formatDouble2String(pointBaseRecord.altitude, 6)).append(divided_symbols);
}
} else if (s.equals("天线类型") || s.equals("Antenna type") || s.equals("Тип антенны")) {
if (j == regexList.size() - 1) {
result.append(pointBaseRecord.antennaTypeName == null ? "" : pointBaseRecord.antennaTypeName);
} else {
result.append(pointBaseRecord.antennaTypeName == null ? "" : pointBaseRecord.antennaTypeName).append(divided_symbols);
}
} else if (s.equals("天线高") || s.equals("Antenna height") || s.equals("Высота антенны")) {
if (j == regexList.size() - 1) {
if (pointBaseRecord.antennaHeight == -1) {
result.append("null");
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.antennaHeight));
}
} else {
if (pointBaseRecord.antennaHeight == -1) {
result.append("null").append(divided_symbols);
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.antennaHeight)).append(divided_symbols);
}
}
} else if (s.equals("北坐标") || s.equals("Northing") || s.equals("Северные координаты.")) {
if (j == regexList.size() - 1) {
result.append(Util.formatDouble2String(pointBaseRecord.planeN, 6));
} else {
result.append(Util.formatDouble2String(pointBaseRecord.planeN, 6)).append(divided_symbols);
}
} else if (s.equals("东坐标") || s.equals("Easting") || s.equals("Восточные координаты.")) {
if (j == regexList.size() - 1) {
result.append(Util.formatDouble2String(pointBaseRecord.planeE, 6));
} else {
result.append(Util.formatDouble2String(pointBaseRecord.planeE, 6)).append(divided_symbols);
}
} else if (s.equals("高程") || s.equals("Elevation") || s.equals("Восточные координаты.")) {
if (j == regexList.size() - 1) {
result.append(Util.formatDouble2String(pointBaseRecord.planeH, 6));
} else {
result.append(Util.formatDouble2String(pointBaseRecord.planeH, 6)).append(divided_symbols);
}
} else if (s.equals("解状态") || s.equals("Solution state") || s.equals("Режим решения.")) {
if (j == regexList.size() - 1) {
result.append(pointBaseRecord.solutionState);
} else {
result.append(pointBaseRecord.solutionState).append(divided_symbols);
}
} else if (s.equals("解算卫星") || s.equals("Satellite number") || s.equals("Спутник для вычисления")) {
if (j == regexList.size() - 1) {
if (pointBaseRecord.satelliteNum == -1) {
result.append("null");
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.satelliteNum));
}
} else {
if (pointBaseRecord.satelliteNum == -1) {
result.append("null").append(divided_symbols);
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.satelliteNum)).append(divided_symbols);
}
}
} else if (s.equals("可见卫星") || s.equals("Satellite track num") || s.equals("Видимый спутник")) {
if (j == regexList.size() - 1) {
if (pointBaseRecord.satelliteTrackNum == -1) {
result.append("null");
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.satelliteTrackNum));
}
} else {
if (pointBaseRecord.satelliteTrackNum == -1) {
result.append("null").append(divided_symbols);
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.satelliteTrackNum)).append(divided_symbols);
}
}
} else if (s.equals(context.getString(R.string.pdop))) {
if (j == regexList.size() - 1) {
if (pointBaseRecord.pdop == -1) {
result.append("null");
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.pdop));
}
} else {
if (pointBaseRecord.pdop == -1) {
result.append("null").append(divided_symbols);
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.pdop)).append(divided_symbols);
}
}
} else if (s.equals(context.getString(R.string.hrms))) {
if (j == regexList.size() - 1) {
if (pointBaseRecord.hrms == -1) {
result.append("null");
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.hrms));
}
} else {
if (pointBaseRecord.hrms == -1) {
result.append("null").append(divided_symbols);
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.hrms)).append(divided_symbols);
}
}
} else if (s.equals(context.getString(R.string.vrms))) {
if (j == regexList.size() - 1) {
if (pointBaseRecord.vrms == -1) {
result.append("null");
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.vrms));
}
} else {
if (pointBaseRecord.vrms == -1) {
result.append("null").append(divided_symbols);
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.vrms)).append(divided_symbols);
}
}
} else if (s.equals("差分延迟") || s.equals("Diff age") || s.equals("Дифференциальная задержка")) {
if (j == regexList.size() - 1) {
if (pointBaseRecord.diffAge == -1) {
result.append("null");
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.diffAge));
}
} else {
if (pointBaseRecord.diffAge == -1) {
result.append("null").append(divided_symbols);
} else {
result.append(Util.formatDouble2StringDotAuto(pointBaseRecord.diffAge)).append(divided_symbols);
}
}
} else if (s.equals("备注") || s.equals("Remark") || s.equals("примечан")) {
if (StringUtil.isEmpty(pointBaseRecord.remarks) || pointBaseRecord.remarks.equals("") || pointBaseRecord.remarks.equals("null") || pointBaseRecord.remarks.equals("Null") || pointBaseRecord.remarks.equals("NULL")) {
if (j == regexList.size() - 1) {
result.append("");
} else {
result.append("").append(divided_symbols);
}
} else {
if (j == regexList.size() - 1) {
result.append(pointBaseRecord.remarks);
} else {
result.append(pointBaseRecord.remarks).append(divided_symbols);
}
}
} else if (s.equals("采集时间") || s.equals("Measure time") || s.equals("Время сбора")) {
if (j == regexList.size() - 1) {
result.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(pointBaseRecord.createdAt));
} else {
result.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(pointBaseRecord.createdAt)).append(divided_symbols);
}
} else if (s.equals("惯导测量") || s.equals("Tilt survey") || s.equals("Нормативное измерение")) {
if (pointBaseRecord.isTiltEnable) {
if (j == regexList.size() - 1) {
result.append(context.getString(R.string.yes));
} else {
result.append(context.getString(R.string.yes)).append(divided_symbols);
}
} else {
if (j == regexList.size() - 1) {
result.append(context.getString(R.string.no));
} else {
result.append(context.getString(R.string.no)).append(divided_symbols);
}
}
}
}
result.append("\r\n");
}
File target = new File(FileUtil.getSDPath() + "/" + context.getString(R.string.surveyor_exported_file) + "/" + context.getString(R.string.point_survey) + "/" + editText + suffixesUtils);
boolean success = FileUtil.writeString(result.toString(), target, "GBK");
if (success) {
ExcelUtil.showCompleteDialog(context, target);
} else {
ToastUtils.showShort(context.getString(R.string.export_failure));
}
}
}).create().show();
}
/**
* 根据成果导出的格式经纬度进行转换导出
*
* @param angle_format_type
* @param l
* @return
*/
private static String converAngleFormat(int angle_format_type, double l) {
if (angle_format_type == AddResultFormatActivity.ANGLE_FORMAT_D_MS) {
//度.分秒
return Util.radianToDmsDoubleString(Math.toRadians(l), 6, false);
} else if (angle_format_type == AddResultFormatActivity.ANGLE_FORMAT_D_M_S) {
//度°分′秒″
return Util.radianToDmsString(Math.toRadians(l), 6, true);
} else if (angle_format_type == AddResultFormatActivity.ANGLE_FORMAT_D) {
//度
return Util.formatDouble2String(l, 6);
} else {
//弧度
return Util.formatDouble2String(Math.toRadians(l), 6);
}
}
}

@ -4,15 +4,13 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Rect;
import android.text.TextUtils;
import android.view.View;
import com.bingce.chart.ChartViewUtils;
import com.bingce.coordlib.model.Coordinate;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointConstants;
import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord;
import com.bingce.poi.excel.ExcelReadHelper;
import com.bingce.utils.FileUtil;
import com.bingce.utils.PointUtils;
import com.bingce.utils.SoftKeyUtils;
@ -20,6 +18,7 @@ import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.project.survey.R;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
@ -421,16 +420,18 @@ public class CommonUtils {
/**
* dp 转成 px
*
* @param dpValue
* @return
*/
public static int dip2px(float dpValue) {
final float scale = ((App) Utils.getApp()).getResources().getDisplayMetrics().density;
final float scale = Utils.getApp().getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 判断导出文件是否存在
*
* @param filePaths 文件路径
*/
public static boolean isCheckExistFile(String filePaths) {

@ -13,6 +13,10 @@ import com.bingce.utils.FileUtil;
import com.bingce.utils.ThreadPoolUtil;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.project.survey.BuildConfig;
import com.project.survey.R;
import com.project.survey.dialog.CustomStyleDialog;
import com.project.survey.ui.instrument.setupstation.db.PointSurveyRecord;
import java.io.File;
import java.io.IOException;
@ -28,9 +32,6 @@ import cn.liuyanbing.javadxf.Header.DxfVersion;
import cn.liuyanbing.javadxf.Tables.Layer;
import cn.liuyanbing.javadxf.Vector3;
import com.project.survey.BuildConfig;
import com.project.survey.R;
public class DxfUtil {
/**
* 导出dxf文件调用此方法

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="?colorPrimary"
android:minHeight="?android:attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<TextView
android:id="@+id/tv_filter_key"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="gone" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview_points"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
<com.github.clans.fab.FloatingActionButton
android:id="@+id/fab_new_point"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:src="@drawable/fab_add"
fab:fab_colorNormal="?colorPrimary"
fab:fab_colorPressed="?colorPrimaryDark" />
</RelativeLayout>

@ -0,0 +1,307 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="?colorPrimary"
android:minHeight="?android:attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
<RelativeLayout
android:id="@+id/top_layout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:elevation="3dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar">
<LinearLayout
android:id="@+id/ll_number"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:text="数量"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="15sp"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_point_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="0"
android:textColor="@color/nliveo_green_colorPrimaryDark"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="10dp"
android:layout_marginTop="6dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="6dp"
android:layout_toEndOf="@+id/ll_number"
android:background="@drawable/rectangle_radius_5_gray_full">
<com.bingce.ui.CleanableEditText
android:id="@+id/etEnterNameCode"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="20dp"
android:background="@null"
android:drawableEnd="@mipmap/icon_clear"
android:gravity="center_vertical"
android:imeOptions="actionDone"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:singleLine="true"
android:textColor="@color/black"
android:textColorHint="@color/color_999999"
android:textSize="@dimen/NormalTextSize" />
</RelativeLayout>
</RelativeLayout>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/header_name"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/top_layout"
android:layout_width="100dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:minWidth="100dp"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/point_name" />
<com.project.survey.widget.bingce.SyncHorizontalScrollView
android:id="@+id/header_hsv"
app:layout_constraintTop_toTopOf="@id/header_name"
app:layout_constraintBottom_toBottomOf="@id/header_name"
app:layout_constraintStart_toEndOf="@id/header_name"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
android:scrollbars="none">
<LinearLayout
android:layout_width="600dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="70dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/point_code" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="110dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/northing" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="110dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/easting" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="110dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:minWidth="100dp"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/elevation" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="200dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:minWidth="100dp"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/create_date" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="200dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:minWidth="100dp"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/remark" />
</LinearLayout>
</com.project.survey.widget.bingce.SyncHorizontalScrollView>
<com.project.survey.widget.bingce.TouchRelativeLayout
android:id="@+id/body_name_rl"
app:layout_constraintTop_toBottomOf="@id/header_name"
app:layout_constraintStart_toStartOf="@id/header_name"
app:layout_constraintBottom_toTopOf="@id/bottom_menu"
android:layout_width="100dp"
android:layout_height="0dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/body_name_rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
</com.project.survey.widget.bingce.TouchRelativeLayout>
<com.project.survey.widget.bingce.SyncHorizontalScrollView
android:id="@+id/body_hsv"
app:layout_constraintStart_toEndOf="@id/body_name_rl"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/body_name_rl"
app:layout_constraintBottom_toBottomOf="@id/body_name_rl"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
android:scrollbars="none">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/body_rv"
android:layout_width="600dp"
android:layout_height="match_parent"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</com.project.survey.widget.bingce.SyncHorizontalScrollView>
<include
android:id="@+id/page_layout"
layout="@layout/page_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/bottom_menu"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible" />
<LinearLayout
android:id="@+id/bottom_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/points_library_btn_filter"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="@dimen/bt_height"
android:textAppearance="@style/MyTextAppearanceBody1"
android:layout_weight="1"
android:text="@string/filter" />
<Button
android:id="@+id/points_library_btn_new_create"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="@dimen/bt_height"
android:textAppearance="@style/MyTextAppearanceBody1"
android:layout_weight="1"
android:text="@string/create" />
<Button
android:id="@+id/points_library_btn_delete"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="@dimen/bt_height"
android:textAppearance="@style/MyTextAppearanceBody1"
android:layout_weight="1"
android:text="@string/delete" />
<Button
android:id="@+id/points_library_btn_confirm"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="@dimen/bt_height"
android:textAppearance="@style/MyTextAppearanceBody1"
android:layout_weight="1"
android:text="@string/confirm" />
<Button
android:id="@+id/points_library_btn_more"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="@dimen/bt_height"
android:textAppearance="@style/MyTextAppearanceBody1"
android:layout_weight="1"
android:text="@string/more" />
</LinearLayout>
<FrameLayout
android:id="@+id/loading_layout"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/ripple_white_loading"
android:clickable="true"
android:elevation="3dp"
android:visibility="gone"
android:focusable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/top_layout">
<ProgressBar
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:indeterminateDrawable="@drawable/loading_drawable"
android:visibility="visible" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,302 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/top_layout"
android:layout_width="match_parent"
android:layout_height="52dp"
android:background="@color/white"
android:elevation="3dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="MissingConstraints">
<LinearLayout
android:id="@+id/ll_number"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:text="@string/number"
android:textColor="@color/black"
android:textSize="15sp"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_point_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="0"
android:textColor="@color/nliveo_green_colorPrimaryDark"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="10dp"
android:layout_marginTop="6dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="6dp"
android:layout_toEndOf="@+id/ll_number"
android:background="@drawable/rectangle_radius_5_gray_full">
<com.bingce.ui.CleanableEditText
android:id="@+id/etEnterNameCode"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="20dp"
android:background="@null"
android:drawableEnd="@mipmap/icon_clear"
android:gravity="center_vertical"
android:imeOptions="actionDone"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:singleLine="true"
android:textColor="@color/black"
android:textColorHint="@color/color_999999"
android:textSize="@dimen/NormalTextSize" />
</RelativeLayout>
</RelativeLayout>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/header_name"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/top_layout"
android:layout_width="100dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:minWidth="100dp"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/point_name" />
<com.project.survey.widget.bingce.SyncHorizontalScrollView
android:id="@+id/header_hsv"
app:layout_constraintTop_toTopOf="@id/header_name"
app:layout_constraintBottom_toBottomOf="@id/header_name"
app:layout_constraintStart_toEndOf="@id/header_name"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
android:scrollbars="none">
<LinearLayout
android:layout_width="600dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="70dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/point_code" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="110dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/northing" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="110dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/easting" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="110dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/elevation" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="200dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:minWidth="100dp"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/create_date" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="200dp"
android:layout_height="50dp"
android:paddingHorizontal="10dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:minWidth="100dp"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:textStyle="bold"
android:text="@string/remark" />
</LinearLayout>
</com.project.survey.widget.bingce.SyncHorizontalScrollView>
<com.project.survey.widget.bingce.TouchRelativeLayout
android:id="@+id/body_name_rl"
app:layout_constraintTop_toBottomOf="@id/header_name"
app:layout_constraintStart_toStartOf="@id/header_name"
app:layout_constraintBottom_toTopOf="@id/bottom_menu"
android:layout_width="100dp"
android:layout_height="0dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/body_name_rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
</com.project.survey.widget.bingce.TouchRelativeLayout>
<com.project.survey.widget.bingce.SyncHorizontalScrollView
android:id="@+id/body_hsv"
app:layout_constraintStart_toEndOf="@id/body_name_rl"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/body_name_rl"
app:layout_constraintBottom_toBottomOf="@id/body_name_rl"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
android:scrollbars="none">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/body_rv"
android:layout_width="600dp"
android:layout_height="match_parent"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</com.project.survey.widget.bingce.SyncHorizontalScrollView>
<include
android:id="@+id/page_layout"
layout="@layout/page_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/bottom_menu"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible" />
<LinearLayout
android:id="@+id/bottom_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/points_library_btn_filter"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="@dimen/bt_height"
android:textAppearance="@style/MyTextAppearanceBody1"
android:layout_weight="1"
android:text="@string/filter" />
<Button
android:id="@+id/points_library_btn_new_create"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="@dimen/bt_height"
android:textAppearance="@style/MyTextAppearanceBody1"
android:layout_weight="1"
android:text="@string/create" />
<Button
android:id="@+id/points_library_btn_delete"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="@dimen/bt_height"
android:textAppearance="@style/MyTextAppearanceBody1"
android:layout_weight="1"
android:text="@string/delete" />
<Button
android:id="@+id/points_library_btn_confirm"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="@dimen/bt_height"
android:textAppearance="@style/MyTextAppearanceBody1"
android:layout_weight="1"
android:text="@string/confirm" />
<Button
android:id="@+id/points_library_btn_more"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="@dimen/bt_height"
android:textAppearance="@style/MyTextAppearanceBody1"
android:layout_weight="1"
android:text="@string/more" />
</LinearLayout>
<FrameLayout
android:id="@+id/loading_layout"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/ripple_white_loading"
android:clickable="true"
android:elevation="3dp"
android:visibility="gone"
android:focusable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/top_layout">
<ProgressBar
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:indeterminateDrawable="@drawable/loading_drawable"
android:visibility="visible" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_records_filter_roadname_keyword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/name"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/point_name" />
</LinearLayout>

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="10dip">
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/dialog_export_point_config_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/file_name"
android:textSize="@dimen/myTextSize"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/file_name" />
</LinearLayout>

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_staking_point_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/point_name"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/point_name" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_point_code"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/point_code"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/point_code" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_staking_point_x"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/x_coordinate"
android:inputType="numberDecimal|numberSigned"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/x_coordinate" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_staking_point_y"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/y_coordinate"
android:inputType="numberDecimal|numberSigned"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/y_coordinate" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_staking_point_z"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/z_coordinate"
android:inputType="numberDecimal|numberSigned"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/z_coordinate" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_point_remarks"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/remarks"
android:maxLines="3"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/remarks" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_point_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:hint="@string/modify_time"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/modify_time" />
</LinearLayout>
</ScrollView>

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_staking_point_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/point_name"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/point_name" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_staking_point_code"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/point_code"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/point_code" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_staking_point_x"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/x_coordinate"
android:inputType="numberDecimal|numberSigned"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/x_coordinate" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_staking_point_y"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/y_coordinate"
android:inputType="numberDecimal|numberSigned"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/y_coordinate" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_staking_point_z"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/z_coordinate"
android:inputType="numberDecimal|numberSigned"
android:singleLine="true"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/z_coordinate" />
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/met_dialog_new_staking_point_remarks"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/remarks"
android:maxLines="3"
android:textSize="@dimen/myTextSize"
app:met_clearButton="true"
app:met_floatingLabel="normal"
app:met_floatingLabelText="@string/remarks" />
</LinearLayout>
</ScrollView>

@ -122,6 +122,7 @@
android:weightSum="3">
<TextView
android:id="@+id/tvTotalStationSetupStation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_code"
android:layout_width="70dp"
android:layout_height="match_parent"
android:paddingHorizontal="5dp"
android:gravity="center"
android:maxLines="1"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
android:ellipsize="end"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="9sp"
app:autoSizeMaxTextSize="14sp"
app:autoSizeStepGranularity="1sp"
tools:text="编码" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_x"
android:layout_width="110dp"
android:layout_height="match_parent"
android:paddingHorizontal="5dp"
android:gravity="center"
android:maxLines="1"
android:ellipsize="end"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="9sp"
app:autoSizeMaxTextSize="14sp"
app:autoSizeStepGranularity="1sp"
tools:text="北坐标" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_y"
android:layout_width="110dp"
android:layout_height="match_parent"
android:paddingHorizontal="5dp"
android:gravity="center"
android:ellipsize="end"
android:maxLines="1"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="9sp"
app:autoSizeMaxTextSize="14sp"
app:autoSizeStepGranularity="1sp"
tools:text="东坐标" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_h"
android:layout_width="110dp"
android:layout_height="match_parent"
android:paddingHorizontal="5dp"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="9sp"
app:autoSizeMaxTextSize="14sp"
app:autoSizeStepGranularity="1sp"
tools:text="高程" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_time"
android:layout_width="200dp"
android:layout_height="match_parent"
android:paddingHorizontal="5dp"
android:gravity="center"
android:ellipsize="end"
android:maxLines="1"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="9sp"
app:autoSizeMaxTextSize="14sp"
app:autoSizeStepGranularity="1sp"
tools:text="创建时间" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_remark"
android:layout_width="200dp"
android:layout_height="match_parent"
android:paddingHorizontal="5dp"
android:gravity="center"
android:ellipsize="end"
android:maxLines="3"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="8sp"
app:autoSizeMaxTextSize="14sp"
app:autoSizeStepGranularity="1sp"
tools:text="备注" />
</LinearLayout>

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_name"
android:layout_width="100dp"
android:layout_height="match_parent"
android:paddingHorizontal="10dp"
android:gravity="center"
android:maxLines="3"
android:textAppearance="@style/MyTextAppearanceBody1"
android:textSize="14sp"
app:autoSizeTextType="uniform"
android:ellipsize="end"
app:autoSizeMinTextSize="10sp"
app:autoSizeMaxTextSize="14sp"
app:autoSizeStepGranularity="1sp"
tools:text="点名" />
</LinearLayout>

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="106dp"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:background="@drawable/round_white">
<TextView
android:id="@+id/tv_edit"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textSize="16sp"
android:text="编辑"
style="@style/Widget.AppCompat.Button.Colored"
android:textAppearance="@style/MyTextAppearanceBody1"
android:gravity="center"
android:paddingHorizontal="10dp"/>
<TextView
android:id="@+id/tv_import"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textSize="16sp"
android:textAppearance="@style/MyTextAppearanceBody1"
android:text="导入"
style="@style/Widget.AppCompat.Button.Colored"
android:gravity="center"
android:paddingHorizontal="10dp"/>
<TextView
android:id="@+id/tv_export"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textSize="16sp"
android:text="导出"
android:textAppearance="@style/MyTextAppearanceBody1"
style="@style/Widget.AppCompat.Button.Colored"
android:gravity="center"
android:paddingHorizontal="10dp"/>
</LinearLayout>

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_margin="5dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="16dp"
android:paddingEnd="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:elevation="5dp"
android:gravity="center_vertical"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/recyclerview_item_swipe_point_title1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:paddingEnd="16dp"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceHeadline"
tools:text="标题1" />
<TextView
android:id="@+id/recyclerview_item_swipe_point_title2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceSubhead"
tools:text="标题2" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/recyclerview_item_swipe_point_body1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:paddingEnd="16dp"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
tools:text="内容1" />
<TextView
android:id="@+id/recyclerview_item_swipe_point_body2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:paddingEnd="16dp"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
tools:text="内容2" />
<TextView
android:id="@+id/recyclerview_item_swipe_point_body3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
tools:text="内容3" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/recyclerview_item_swipe_point_body4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:paddingEnd="16dp"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
tools:text="内容4" />
<TextView
android:id="@+id/recyclerview_item_swipe_point_body5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@style/MyTextAppearanceBody1"
tools:text="内容5" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,20 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_point_search"
android:title="@string/search"
app:showAsAction="ifRoom|collapseActionView" />
<item
android:id="@+id/menu_point_import"
android:title="@string/import_points"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_point_export"
android:title="@string/export_points"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_point_clear"
android:title="@string/clear"
app:showAsAction="never" />
</menu>

@ -0,0 +1,8 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_job_clear"
android:title="@string/clear"
app:showAsAction="ifRoom" />
</menu>

@ -119,5 +119,46 @@
<string name="export_hdm_file_name">导出Hdm文件名</string>
<string name="export_kml_file_name">导出Kml文件名</string>
<string name="export_txt_file_name">导出Txt文件名</string>
<string name="export_dxf_file_name">导出Dxf文件名</string>
<string name="export_cass_file_name">导出Cass文件名</string>
<string name="export_csv_file_name">导出Csv文件名</string>
<string name="export_failure">导出失败</string>
<string name="plane_coordinate">平面坐标</string>
<string name="lat_lon_coordinate">经纬度坐标</string>
<string name="format_original_data">原始数据格式</string>
<string name="number">数量</string>
<string name="more">更多</string>
<string name="new_point">新建点</string>
<string name="want_to_delete_point_library">确定要删除选择的点吗?</string>
<string name="edit_known_point">编辑已知点</string>
<string name="cass_dat_txt">CASS(.dat/.txt)</string>
<string name="import_point_excel_guide">导入格式为Excel,每行代表一个点,三种格式都可以\n第一种:\n点名|X|Y|Z\n……\n第二种:\n点名|X|Y|Z|备注\n……\n第三种:\n点名|编码|X|Y|Z|备注\n……\nExcel里只能有数字,不能有非数字项,不可包含公式</string>
<string name="import_point_text_guide">导入格式为txt,每行代表一个点,三种格式都可以\n第一种:\n点名,X,Y,Z\n……\n第二种:\n点名,X,Y,Z,备注\n……\n第三种:\n点名,编码,X,Y,Z,备注\n……</string>
<string name="import_points">导入</string>
<string name="additional_import">追加导入</string>
<string name="overwrite_import">覆盖导入</string>
<string name="import_point_cass_xy_dat">导入格式为dat或txt,每行代表一个点,格式:\n点名,编码,X,Y,Z\n……\n其中,编码可以为空,但逗号不能省</string>
<string name="import_point_cass_yx_dat">导入格式为dat或txt,每行代表一个点,格式:\n点名,编码,Y,X,Z\n……\n其中,编码可以为空,但逗号不能省</string>
<string name="want_to_empty_point_library">确定要清空所有的点吗?</string>
<string name="no_data_clear">当前没有可清空的数据</string>
<string name="project_control_points">项目控制点</string>
<string name="export_excel">导出Excel</string>
<string name="export_points">导出</string>
<string name="file_name_can_not_empty">文件名不能为空</string>
<string name="confirm_clear_points">确定删除所有点数据?</string>
<string name="import_point_road_star_excel_guide">请在道路之星控制点编辑界面,点击顶部的Excel图标,生成excel文件,请另存为xls后缀,并拷贝或发送到手机内</string>
<string name="edit_control_point">编辑控制点</string>
<string name="control_point">控制点</string>
<string name="new_control_point">新建控制点</string>
<string name="point_data">点数据</string><!--不能轻易改名,因为有个测量员导出文件里有个参数,地铁管片姿态.xls-->
<string name="exported_file_save_at_surveyor_exported_files"><![CDATA[导出文件保存在手机根目录的<测量员导出文件>文件夹内]]></string>
<string name="search">搜索</string>
<string name="clean_over">清空完成</string>
<string name="enter_code">请输入编码</string>
<string name="enter_remark">请输入备注</string>
<string name="solution_status_limit">状态限制</string>
<string name="solution_status">解状态</string>
<string name="modify_time">修改时间</string>
<string name="record_none">无(长按记录按钮可以添加备注)</string>
</resources>
Loading…
Cancel
Save