From 46a0d04caed0d6c198f0ecdda2829fe24170cf5c Mon Sep 17 00:00:00 2001 From: huangwei <983142558@qq.com> Date: Tue, 19 Mar 2024 17:36:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 31 + .gitmodules | 3 + README.md | 1 + app/.gitignore | 2 + app/build.gradle | 143 + app/debug.keystore | Bin 0 -> 1260 bytes app/doc/Untitled-old.mdj | 44 + app/doc/states.mdj | 36869 +++++++++++++ app/doc/状态机.mdj | 45155 ++++++++++++++++ app/proguard-rules.pro | 281 + .../surveyor/activity/MainActivityTest.java | 19 + app/src/androidTest/kotlin/HelloKotlin.kt | 49 + app/src/main/AndroidManifest.xml | 184 + app/src/main/README.md | 1 + app/src/main/assets/Roboto-Light.ttf | Bin 0 -> 162636 bytes app/src/main/assets/Roboto-Medium.ttf | Bin 0 -> 160696 bytes .../main/assets/agreement_policy_summary.xml | 8 + .../assets/agreement_policy_summary_en.xml | 4 + app/src/main/assets/default_tolerance | 868 + app/src/main/assets/features.hcc | 574 + app/src/main/assets/network_error.png | Bin 0 -> 13792 bytes app/src/main/assets/privacyPolicy.xml | 170 + app/src/main/assets/privacyPolicy_en.xml | 45 + app/src/main/assets/service_default.html | 51 + app/src/main/assets/supplierconfig.json | 13 + app/src/main/assets/template_tolerance | 93 + app/src/main/assets/userAgreement.xml | 117 + app/src/main/assets/userAgreement_en.xml | 116 + app/src/main/design.sketch | Bin 0 -> 1353649 bytes app/src/main/doc/测绘云流程图.mdj | 12064 +++++ .../java/com/bingce/controlnetwork/App.java | 183 + .../activity/AboutActivity.java | 133 + .../controlnetwork/activity/BaseActivity.java | 55 + .../activity/ChangelogActivity.java | 38 + .../activity/LogCollectActivity.java | 26 + .../controlnetwork/activity/MainActivity.java | 1210 + .../activity/MainActivityUtils.java | 439 + .../activity/NotificationActivity.java | 250 + .../activity/SettingsActivity.java | 275 + .../activity/SplashActivity.java | 231 + .../backup/AbstractBackupExportActivity.java | 266 + .../activity/backup/BackupExportActivity.java | 30 + .../backup/launch/BackupImportHelper.java | 34 + .../MigrationFolder2PrivateRoomActivity.java | 124 + .../backup/launch/ZipMigrationUtils.java | 124 + .../fragmentcontainer/FragmentContainer.java | 103 + .../FragmentContainerActivity.java | 138 + .../fragmentcontainer/FragmentItem.java | 11 + .../fragmentcontainer/IOnBackFilter.java | 5 + .../user/EditNicknamePasswordActivity.java | 143 + .../activity/user/InputEmailActivity.java | 107 + .../user/InputPhoneNumberActivity.java | 93 + .../activity/user/LoginActivity.java | 579 + .../user/OpeningRenewalVipActivity.java | 534 + .../activity/user/RedeemVipActivity.java | 171 + .../activity/user/RegisterActivity.java | 500 + .../activity/user/UserInfoActivity.java | 812 + .../user/VerifyEmailCodeActivity.java | 234 + .../activity/user/VerifySMSCodeActivity.java | 329 + .../adapter/AbstractPointSelectAdapter.java | 176 + .../controlnetwork/adapter/BaseAdapter.java | 57 + ...IndexPrefixTextWithContextMenuAdapter.java | 61 + .../BaseIndexTextWithContextMenuAdapter.java | 54 + ...ctableIndexTextWithContextMenuAdapter.java | 55 + ...itleAndSubtitleWithContextMenuAdapter.java | 51 + .../GlobalControlPointSelectAdapter.java | 49 + .../IOnContextItemSelectedCallback.java | 9 + .../adapter/IUpdateListAdapter.java | 9 + .../adapter/IndexWithTextAdapter.java | 88 + .../IndexWithTextAndPrefixAdapter.java | 20 + .../adapter/MeasureAngleDistanceAdapter.java | 122 + .../adapter/MeasureHeightTraverseAdapter.java | 98 + ...ultipleSelectableIndexWithTextAdapter.java | 71 + .../adapter/PointRecordAdapter.java | 75 + .../adapter/PointSelectAdapter.java | 60 + .../adapter/PrismMagegeAdapter.java | 106 + .../adapter/ProjectListAdapter.java | 28 + .../adapter/ReSurveyorCycleAdapter.java | 56 + .../adapter/ResurveyorPointsAdapter.java | 61 + .../SelectableIndexWithTextAdapter.java | 99 + .../adapter/SpinnerAdapter.java | 83 + .../adapter/SurveyorPeriodAdapter.java | 32 + .../adapter/SurveyorStationListAdapter.java | 440 + .../SurveyorStationRecordsAdapter.java | 77 + .../adapter/TitleWithSubtitleAdapter.java | 76 + .../adapter/ToleranceDetailAdapter.java | 135 + .../contextmenu/ContextMenuDelete.java | 28 + .../contextmenu/ContextMenuDeleteEdit.java | 37 + .../adapter/contextmenu/ContextMenuEdit.java | 28 + .../contextmenu/IAdapterContextMenu.java | 14 + .../ProjectAdapterContextMenu.java | 49 + .../SurveyorPeriodAdapterContextMenu.java | 84 + .../BaseStationDetailAdapter.java | 227 + .../EditableStationDetailAdapter.java | 11 + .../NoEditableStationDetailAdapter.java | 11 + ...ionCreateLineKnownUnknownKnownAdapter.java | 354 + .../StationCreateLineSingleAdapter.java | 238 + .../StationCreateLineWellAdapter.java | 301 + ...tionCreateLineWellDoubleGroundAdapter.java | 296 + ...reateLineWellDoubleUnderGroundAdapter.java | 331 + .../controlnetwork/controller/Expression.java | 1008 + .../controller/KeyEventAction.java | 12 + .../AbstractFullScreenDialogFragment.java | 125 + .../AbstractHierarchicalListFragment.java | 213 + .../AbstractProjectToleranceFragment.java | 180 + .../AbstractRecyclerViewFragment.java | 33 + .../BaseBottomSheetDialogFragment.java | 12 + .../BottomSheetSelectListFragment.java | 141 + .../BottomSheetSurveyorPeriodFragment.java | 320 + ...ponentStationSurveyorDataListFragment.java | 355 + .../ComponentSurveyorStationListFragment.java | 138 + .../ComponentSwitchStationListFragment.java | 153 + .../ComponentSwitchToleranceFragment.java | 248 + .../fragment/ConfigFragment.java | 93 + .../fragment/EmptyFragment.java | 10 + .../fragment/FullLoadingFragment.java | 83 + .../fragment/ListDialogFragment.java | 173 + .../fragment/MainSurveyFragment.kt | 310 + .../fragment/PickPointFragment.java | 177 + .../fragment/PointFragment.java | 362 + .../fragment/PointListFragment.java | 174 + .../fragment/PrismManageFragment.java | 159 + .../PrismManagerCreateCustomFragment.java | 277 + .../fragment/ProjectListFragment.java | 230 + .../ProjectToleranceSettingFragment.java | 107 + .../SelectExportHeightTraverseFragment.kt | 276 + .../SelectExportSurveyorRecordFragment.java | 299 + ...tExportSurveyorRecordWireFileFragment.java | 363 + .../SelectMeasureDataExportTypeFragment.java | 209 + ...SelectProjectAndSurveyorCycleFragment.java | 163 + .../fragment/SelectProjectTypeFragment.java | 111 + .../SelectReSurveyorCycleFragment.java | 139 + .../SelectReSurveyorPointFragment.java | 176 + .../SelectSurveyorStationTypeFragment.java | 176 + ...ectSurveyorStationTypeWellSubFragment.java | 103 + .../SelectToleranceBottomSheetFragment.java | 156 + ...tToleranceTemplateBottomSheetFragment.java | 144 + .../fragment/ServiceFragment.java | 108 + .../StationDataAdjustDialogFragment.java | 183 + .../fragment/StringInputFragment.java | 88 + .../SurveyorRouteStationFragment.java | 200 + .../fragment/SurveyorSettingsFragment.java | 98 + .../fragment/SurveyorStationListFragment.java | 352 + .../controlnetwork/fragment/TipsFragment.java | 177 + .../fragment/TipsWith2OptionFragment.java | 452 + .../ToleranceAttributeEditFragment.java | 195 + .../fragment/ToleranceDetailFragment.java | 163 + .../fragment/ToleranceManageFragment.java | 203 + .../fragment/ToleranceSelectFragment.java | 112 + .../fragment/base/BaseFragment.java | 30 + .../fragment/base/BaseLazyFragment.java | 87 + .../fragment/bottompage/BottomBean.kt | 15 + .../fragment/bottompage/BottomPageAdapter.kt | 42 + .../bottompage/BottomPageContentFragment.kt | 99 + .../fragment/bottompage/BottomPageFragment.kt | 157 + .../fragment/bottompage/BottomSwitchVm.kt | 8 + .../fragment/bottompage/IData.kt | 7 + .../fragment/bottompage/ViewHolder.kt | 6 + .../CreateOrEditRouteDialog.java | 447 + .../adapter/RouteListAdapter.java | 18 + .../viewmodel/HeightCreateOrEditVm.kt | 62 + .../projectdetail/ProjectDetailFragment.kt | 300 + .../ProjectDetailHeightTraverseFragment.kt | 103 + .../ProjectDetailTriangleFragment.kt | 223 + .../projectdetail/content/RouteFragment.kt | 185 + .../AbstractProjectEditFragment.kt | 300 + .../ProjectEditHeightTraverseFragment.kt | 239 + .../ProjectEditTriangleFragment.kt | 127 + .../station/AbstractStationFragment.java | 108 + ...bstractSingleStationPointListFragment.java | 201 + ...mponentSingleStationPointListFragment.java | 180 + .../DefaultStationSetupFragment.java | 224 + ...tructSetupStationHeightTraverseFragment.kt | 181 + .../CreateStationForHeightTraverseFragment.kt | 176 + .../EverySetUpStationFragment.kt | 313 + .../SeparatSetupStationFragment.kt | 428 + ...StationKnownUnknownKnownSetupFragment.java | 247 + ...tLineStationKnownUnknownSetupFragment.java | 249 + .../AbstractLineStationSetupFragment.java | 114 + ...eStationWellDoubleGroundSetupFragment.java | 333 + ...ionWellDoubleUnderGroundSetupFragment.java | 422 + .../AbstractLineStationWellSetupFragment.java | 421 + .../LineStationAttachedSetupFragment.java | 280 + .../close/LineStationCloseSetupFragment.java | 329 + .../LineStationRandomSetupFragment.java | 272 + .../LineStationSingleSetupFragment.java | 240 + ...eStationWellDoubleGroundSetupFragment.java | 342 + ...ionWellDoubleUnderGroundSetupFragment.java | 382 + .../well/LineStationWellSetupFragment.java | 312 + .../SingleStationDetailAndEditFragment.java | 211 + .../stationdetail/StationDetailViewModel.java | 17 + .../BaseStationSettingFragment.kt | 49 + .../StationSettingHeightTraverseFragment.kt | 496 + .../StationSettingsFragment.java | 752 + .../stationsurvey/IMeasureOperate.java | 28 + .../stationsurvey/MethodCheckSetting.java | 94 + .../StationSurveyorFragment.java | 398 + .../angledistance/MeasureDefaultFragment.java | 411 + .../MeasureDistanceFragment.java | 394 + .../angledistance/MeasureFragment.java | 179 + .../angledistance/MeasureVm.java | 20 + .../angledistance/StationCheckBeforeUtil.java | 83 + .../base/MeasureBaseFragment.java | 489 + .../MeasureHeightTraverseFragment.kt | 194 + .../MeasureHeightTraverseSubFragment.java | 416 + .../controlnetwork/guide/GuideSequence.java | 110 + .../guide/ITapTargetProvider.java | 15 + .../bingce/controlnetwork/http/HttpExtend.kt | 54 + .../controlnetwork/http/RetrofitClient.kt | 142 + .../http/sevice/CommonService.kt | 9 + .../method/SingleCycleTipsMethod.java | 102 + .../surveyor/state/AutoModeType.java | 10 + .../surveyor/state/IScrollDelegate.java | 10 + .../surveyor/state/StateConstants.java | 18 + .../StateManagerAloneDistance.java | 498 + .../alonedistance/_CheckReadDataState.java | 75 + .../alonedistance/_CheckSingleCycleState.java | 90 + .../alonedistance/_CheckStationState.java | 195 + .../_CheckStationSuccessState.java | 33 + .../alonedistance/_DoAutoSurveyorState.java | 32 + .../alonedistance/_DoCalAdjustState.java | 74 + .../_DoCalScheduleInSingleCycleState.java | 108 + .../alonedistance/_DoDeleteAllCycleState.java | 63 + .../_DoDeleteCurrentCycleState.java | 55 + .../_DoMove2NextValidateState.java | 72 + .../state/alonedistance/_DoMoveBackState.java | 85 + .../state/alonedistance/_DoSurveyorState.java | 177 + .../_DoWellMeasureRotationReadyState.java | 41 + .../state/alonedistance/_IdleState.java | 64 + .../_IsAllCycleCompletedState.java | 54 + .../_IsSingleCycleCompletedState.java | 61 + .../alonedistance/_SurveyorFailureState.java | 36 + .../state/alonedistance/__BaseState.java | 395 + .../state/angledistance/StateManager.java | 535 + .../state/angledistance/_Check2CState.java | 113 + .../_CheckHalfCycleZeroState.java | 81 + .../angledistance/_CheckReadDataState.java | 126 + .../angledistance/_CheckSingleCycleState.java | 102 + .../angledistance/_CheckStationState.java | 415 + .../_CheckStationSuccessState.java | 33 + .../angledistance/_DoAutoSurveyorState.java | 32 + .../angledistance/_DoCalAdjustState.java | 44 + .../_DoCalScheduleInAllCycleState.java | 134 + .../_DoCalScheduleInSingleCycleState.java | 110 + .../angledistance/_DoDeleteAllCycleState.java | 70 + .../_DoDeleteCurrentCycleState.java | 69 + .../_DoMove2NextValidateState.java | 95 + .../state/angledistance/_DoMoveBackState.java | 143 + .../angledistance/_DoRecordCleanState.java | 32 + .../state/angledistance/_DoSurveyorState.java | 294 + .../_DoWellMeasureRotationReadyState.java | 30 + .../state/angledistance/_IdleState.java | 134 + .../angledistance/_Is2CCheckReadyState.java | 55 + .../_IsAllCycleCompletedState.java | 90 + .../_IsHalfCycleZeroCheckReadyState.java | 68 + .../_IsSingleCycleCompletedState.java | 75 + .../angledistance/_SurveyorFailureState.java | 52 + .../state/angledistance/__BaseState.java | 586 + .../state/heighttraverse/ILookCase.java | 9 + .../StateManagerHeightTraverse.java | 536 + .../heighttraverse/_CheckStationState.java | 343 + .../heighttraverse/_CheckToleranceState.java | 313 + .../heighttraverse/_DoAutoSurveyorState.java | 32 + .../heighttraverse/_DoCalAdjustState.java | 45 + .../_DoDeleteAllCycleState.java | 70 + .../_DoDeleteCurrentCycleState.java | 84 + .../_DoMove2NextValidateState.java | 122 + .../heighttraverse/_DoMoveBackState.java | 161 + .../heighttraverse/_DoSurveyorState.java | 243 + .../_DoWellMeasureRotationReadyState.java | 30 + .../state/heighttraverse/_IdleState.java | 135 + .../surveyor/state/heighttraverse/_Init.java | 69 + .../heighttraverse/_SurveyorFailureState.java | 52 + .../state/heighttraverse/__BaseState.java | 572 + .../surveyor/TestDataSelectFragment.java | 74 + .../bingce/controlnetwork/ui/ViewUtil.java | 18 + .../controlnetwork/ui/WechatImagePicker.java | 21 + .../ui/helper/OnActivityTouchListener.java | 7 + .../ui/helper/RecyclerTouchListener.java | 918 + .../ui/vh/DraggableTextViewHolder.java | 32 + .../ui/vh/DraggableViewHolder.java | 14 + .../ui/vh/GroupParentViewHolder.java | 21 + .../ui/vh/IndexTextSelectableViewHolder.java | 21 + .../ui/vh/IndexTextViewHolder.java | 20 + .../ui/vh/IndexTextWithPrefixViewHolder.java | 17 + .../ui/vh/ItemWellViewHolder.java | 40 + .../ui/vh/KeyBoolViewHolder.java | 21 + .../ui/vh/KeyValueViewHolder.java | 20 + .../ui/vh/PrismManageViewHolder.java | 22 + .../ui/vh/StationAdjustItemViewHolder.java | 24 + .../ui/vh/StationGroupItemViewHolder.java | 46 + .../SurveyorDataAloneDistanceViewHolder.java | 243 + .../ui/vh/SurveyorDataViewHolder.java | 408 + .../SurveyorDataViewHolderHeightTraverse.java | 366 + .../ui/vh/TextSelectableViewHolder.java | 21 + .../ui/vh/TitleWithSubtitleViewHolder.java | 20 + .../ui/widget/CommentListTextView.java | 380 + .../ui/widget/ItemWithEditText.java | 25 + .../ui/widget/MyDrawerBuilder.java | 27 + .../ui/widget/NoScrollView.java | 39 + .../ui/widget/NoScrollViewPager.java | 56 + .../ui/widget/RotateLayout.java | 189 + .../controlnetwork/ui/widget/TextItem.java | 100 + .../ui/widget/TextItemWithDescribe.java | 58 + .../ui/widget/TextItemWithMore.java | 32 + .../controlnetwork/ui/widget/ViewFactory.java | 125 + .../ui/widget/dialog/LoadingDialog.java | 86 + .../ui/widget/dialog/LoadingUtil.java | 32 + .../ui/widget/dialog/LoadingUtilKt.kt | 33 + .../AbstractDraggableRecycleViewAdapter.java | 173 + .../recyclerview/IDragActionDelegate.java | 5 + .../IDragSwipeActionListener.java | 23 + .../recyclerview/IDragSwipeChecker.java | 7 + .../recyclerview/ISwipeDragListener.java | 7 + .../recyclerview/IViewHolderDragDelegate.java | 7 + .../ItemTouchHelperCallbackImpl.java | 105 + .../SwipeDraggableRecyclerViewUtil.java | 80 + .../ui/widget/treeview/TreeNode.java | 231 + .../ui/widget/treeview/TreeView.java | 214 + .../ui/widget/treeview/TreeViewAdapter.java | 286 + .../treeview/base/BaseNodeViewBinder.java | 70 + .../treeview/base/BaseNodeViewFactory.java | 58 + .../widget/treeview/base/BaseTreeAction.java | 50 + .../base/CheckableNodeViewBinder.java | 47 + .../treeview/base/SelectableTreeAction.java | 35 + .../custom/FirstLevelNodeViewBinder.java | 45 + .../treeview/custom/MyNodeViewFactory.java | 43 + .../custom/SecondLevelNodeViewBinder.java | 51 + .../custom/ThirdLevelNodeViewBinder.java | 43 + .../ui/widget/treeview/helper/TreeHelper.java | 290 + .../util/CheckControlUpdateUtil.java | 97 + .../controlnetwork/util/DatabaseFixUtils.java | 53 + .../controlnetwork/util/DefaultNameUtil.kt | 29 + .../util/SurveyorStationUtil.java | 126 + .../util/config/AbstractSetConfigs.java | 80 + .../util/config/ConfigItem.java | 86 + .../util/config/ConfigsSetConfigs.java | 110 + .../util/config/IConfigItemCallback.java | 5 + .../controlnetwork/wxapi/Constants.java | 7 + .../com/bingce/controlnetwork/wxapi/MD5.java | 26 + .../controlnetwork/wxapi/WXEntryActivity.java | 111 + .../wxapi/WXPayEntryActivity.java | 51 + app/src/main/res/anim/fade_in_quick.xml | 5 + app/src/main/res/anim/fade_out_quick.xml | 5 + app/src/main/res/anim/slide_in_left.xml | 9 + app/src/main/res/anim/slide_in_right.xml | 9 + app/src/main/res/anim/slide_out_left.xml | 9 + app/src/main/res/anim/slide_out_right.xml | 9 + app/src/main/res/drawable-hdpi/icon_small.png | Bin 0 -> 9837 bytes app/src/main/res/drawable-v21/blue_bg.xml | 5 + .../res/drawable-v21/fab_label_background.xml | 11 + .../ic_keyboard_arrow_right_white_24px.xml | 9 + .../main/res/drawable-v23/app_background.xml | 16 + .../res/drawable-v23/icon_control_logo.png | Bin 0 -> 10746 bytes .../res/drawable-v23/icon_control_text.png | Bin 0 -> 18195 bytes .../main/res/drawable-xxhdpi/efp__ic_file.png | Bin 0 -> 1804 bytes .../res/drawable-xxhdpi/efp__ic_folder.png | Bin 0 -> 1021 bytes .../main/res/drawable-xxhdpi/efp__ic_up.png | Bin 0 -> 1454 bytes .../efp_dark__ic_action_cancel.png | Bin 0 -> 897 bytes .../efp_dark__ic_action_deselect.png | Bin 0 -> 1276 bytes .../efp_dark__ic_action_grid.png | Bin 0 -> 626 bytes .../efp_dark__ic_action_invert_selection.png | Bin 0 -> 1200 bytes .../efp_dark__ic_action_list.png | Bin 0 -> 441 bytes .../efp_dark__ic_action_new_folder.png | Bin 0 -> 723 bytes .../efp_dark__ic_action_ok.png | Bin 0 -> 937 bytes .../efp_dark__ic_action_select_all.png | Bin 0 -> 1089 bytes .../efp_dark__ic_action_sort.png | Bin 0 -> 402 bytes .../efp_dark__ic_action_storage.png | Bin 0 -> 1017 bytes .../main/res/drawable-xxhdpi/icon_back.png | Bin 0 -> 4271 bytes app/src/main/res/drawable-xxxhdpi/icon.png | Bin 0 -> 15570 bytes app/src/main/res/drawable/app_background.xml | 21 + app/src/main/res/drawable/app_logo.xml | 12 + .../baseline_reorder_grey_600_24dp.xml | 6 + .../res/drawable/bg_circle_white_chatui.xml | 16 + app/src/main/res/drawable/bg_gray_3.xml | 9 + app/src/main/res/drawable/bg_spinner.xml | 26 + app/src/main/res/drawable/bg_splash.xml | 14 + app/src/main/res/drawable/bg_table_color1.xml | 9 + app/src/main/res/drawable/bg_table_color2.xml | 9 + app/src/main/res/drawable/bg_table_family.xml | 9 + app/src/main/res/drawable/bg_white_3.xml | 9 + .../main/res/drawable/clickable_blue_bg.xml | 5 + .../drawable/corners_edit_white_chatui.xml | 16 + app/src/main/res/drawable/drawer_header.jpg | Bin 0 -> 35612 bytes .../res/drawable/fab_label_background.xml | 11 + app/src/main/res/drawable/ic_arrow_down.xml | 12 + .../res/drawable/ic_arrow_to_right_dark.xml | 14 + app/src/main/res/drawable/ic_arrow_up.xml | 12 + app/src/main/res/drawable/ic_backup.xml | 24 + .../res/drawable/ic_baseline_clear_all_24.xml | 5 + .../main/res/drawable/ic_close_black_24dp.xml | 9 + .../main/res/drawable/ic_custom_tolerance.xml | 10 + app/src/main/res/drawable/ic_export.xml | 18 + .../drawable/ic_export_height_traverse.xml | 28 + app/src/main/res/drawable/ic_export_wire.xml | 15 + .../ic_indeterminate_check_box_black_24dp.xml | 5 + .../main/res/drawable/ic_known_point_24.xml | 5 + .../main/res/drawable/ic_ruler_selected.xml | 12 + .../main/res/drawable/ic_ruler_unselected.xml | 12 + app/src/main/res/drawable/ic_selected.xml | 12 + app/src/main/res/drawable/ic_surveyor_24.xml | 10 + app/src/main/res/drawable/ic_switch.xml | 12 + .../res/drawable/ic_tab_project_selected.xml | 12 + .../res/drawable/ic_tab_project_unselect.xml | 12 + app/src/main/res/drawable/ic_tolerance_24.xml | 9 + .../main/res/drawable/ic_unknown_point_24.xml | 5 + .../main/res/drawable/icon_control_logo.png | Bin 0 -> 7070 bytes .../main/res/drawable/icon_control_text.png | Bin 0 -> 9233 bytes .../res/drawable/icon_parameter_points.xml | 15 + .../main/res/drawable/icon_prism_manager.xml | 28 + .../main/res/drawable/icon_ts_connecting.xml | 20 + ...request_android_data_access_permission.jpg | Bin 0 -> 273247 bytes .../drawable/img_weixin_download_guide.jpg | Bin 0 -> 66702 bytes .../main/res/drawable/iv_back_selector.xml | 6 + app/src/main/res/drawable/loading_circle.xml | 8 + .../res/drawable/loading_dialog_bg_ll.xml | 13 + .../loading_dialog_bg_progress_bar.xml | 5 + .../main/res/drawable/loading_dialog_pic.png | Bin 0 -> 1512 bytes .../res/drawable/msg_state_fail_resend.png | Bin 0 -> 1744 bytes .../drawable/record_microphone_bj_chatui.xml | 11 + .../res/drawable/record_microphone_chatui.xml | 7 + .../res/drawable/recyclerview_divider.xml | 24 + app/src/main/res/drawable/round_btn_bg.xml | 6 + app/src/main/res/drawable/round_white.xml | 6 + app/src/main/res/drawable/select_mask.xml | 9 + app/src/main/res/drawable/separator_table.xml | 8 + .../res/drawable/separator_table_first.xml | 8 + .../res/drawable/separator_table_header.xml | 8 + .../drawable/separator_table_header_first.xml | 8 + app/src/main/res/drawable/tab_shadow.xml | 10 + .../res/drawable/transparent_ripple_bg.xml | 5 + .../main/res/drawable/voice_left_chatui.xml | 16 + .../main/res/drawable/voice_right_chatui.xml | 16 + app/src/main/res/drawable/white_ripple_bg.xml | 5 + .../res/drawable/wifi_chat_item_left_bg.9.png | Bin 0 -> 319 bytes .../drawable/wifi_chat_item_right_bg.9.png | Bin 0 -> 435 bytes app/src/main/res/layout/activity_about.xml | 13 + app/src/main/res/layout/activity_activate.xml | 135 + .../res/layout/activity_agentweb_base.xml | 28 + .../main/res/layout/activity_changelog.xml | 15 + .../res/layout/activity_control_network.xml | 31 + .../activity_edit_user_nickname_password.xml | 157 + .../res/layout/activity_export_layout.xml | 65 + .../activity_fragment_container_layout.xml | 16 + .../main/res/layout/activity_input_email.xml | 78 + .../layout/activity_input_phone_number.xml | 105 + app/src/main/res/layout/activity_login.xml | 305 + app/src/main/res/layout/activity_main.xml | 45 + ...vity_migration_2_private_folder_layout.xml | 137 + .../res/layout/activity_opening_renewal.xml | 149 + .../res/layout/activity_record_detail.xml | 23 + app/src/main/res/layout/activity_records.xml | 22 + app/src/main/res/layout/activity_redeem.xml | 66 + app/src/main/res/layout/activity_settings.xml | 16 + app/src/main/res/layout/activity_splash.xml | 18 + ...activity_user_agreement_privacy_policy.xml | 21 + .../main/res/layout/activity_user_info.xml | 156 + .../main/res/layout/activity_verify_code.xml | 55 + app/src/main/res/layout/broswer.xml | 16 + .../layout/content_create_project_content.xml | 72 + .../res/layout/content_edit_point_layout.xml | 84 + .../layout/content_string_input_layout.xml | 16 + ...tent_tolerance_attribute_editor_layout.xml | 58 + app/src/main/res/layout/device_name.xml | 19 + app/src/main/res/layout/dialog_add_friend.xml | 23 + app/src/main/res/layout/dialog_changelog.xml | 6 + .../main/res/layout/dialog_create_route.xml | 152 + .../main/res/layout/dialog_edit_nickname.xml | 21 + ...request_android_data_access_permission.xml | 14 + ...dialog_imageview_weixin_download_guide.xml | 14 + .../dialog_input_measuredd_coordinate.xml | 42 + .../res/layout/dialog_new_control_point.xml | 95 + .../main/res/layout/dialog_new_project.xml | 21 + app/src/main/res/layout/dialog_power_off.xml | 14 + .../res/layout/dialog_projection_setting.xml | 75 + .../layout/dialog_register_pay_qr_code.xml | 18 + .../res/layout/dialog_select_libs_point.xml | 22 + app/src/main/res/layout/dialog_sign_in.xml | 34 + app/src/main/res/layout/dialog_sign_up.xml | 66 + app/src/main/res/layout/efp__new_folder.xml | 20 + app/src/main/res/layout/fragment_agentweb.xml | 6 + .../layout/fragment_bottom_page_content.xml | 44 + .../res/layout/fragment_bottom_popup_list.xml | 13 + ...agment_bottom_popup_list_select_layout.xml | 18 + ...up_surveyor_station_type_select_layout.xml | 81 + ...or_station_type_select_layout_well_sub.xml | 34 + ...ose_line_surveyor_station_setup_layout.xml | 39 + ...fragment_cloud_sync_cloud_recyclerview.xml | 5 + app/src/main/res/layout/fragment_config.xml | 13 + ...ent_create_station_for_height_traverse.xml | 22 + ..._default_surveyor_station_setup_layout.xml | 25 + .../fragment_fragment_container_layout.xml | 28 + .../layout/fragment_full_loading_layout.xml | 37 + .../fragment_fullscreen_dialog_layout.xml | 77 + ...nt_height_traverse_every_setup_station.xml | 42 + ...height_traverse_seperate_setup_station.xml | 50 + .../fragment_hierarchical_list_layout.xml | 92 + app/src/main/res/layout/fragment_home.xml | 29 + .../main/res/layout/fragment_limit_detail.xml | 20 + .../res/layout/fragment_limit_detail_list.xml | 13 + .../main/res/layout/fragment_limited_item.xml | 20 + .../res/layout/fragment_limited_item_list.xml | 13 + ...ent_line_surveyor_station_setup_layout.xml | 25 + .../main/res/layout/fragment_list_layout.xml | 7 + app/src/main/res/layout/fragment_measure.xml | 93 + ...ragment_pick_point_bottom_sheet_layout.xml | 12 + .../layout/fragment_plates_recyclerview.xml | 5 + .../main/res/layout/fragment_point_layout.xml | 148 + .../res/layout/fragment_prism_manager.xml | 83 + .../fragment_prism_manager_create_custom.xml | 98 + .../fragment_project_detail_list_layout.xml | 114 + .../fragment_project_edit_height_traverse.xml | 188 + .../layout/fragment_project_edit_triangle.xml | 14 + .../fragment_project_limit_detail_layout.xml | 25 + .../main/res/layout/fragment_project_list.xml | 58 + .../fragment_project_station_item_layout.xml | 20 + ...project_surveyor_station_detail_layout.xml | 75 + ...t_project_surveyor_station_list_layout.xml | 63 + ...ect_surveyor_station_point_list_layout.xml | 24 + .../layout/fragment_resurveryor_layout.xml | 77 + .../fragment_resurveryor_layout_cycle.xml | 46 + ...fragment_select_export_surveyor_layout.xml | 58 + ...agment_select_measure_data_export_type.xml | 56 + .../layout/fragment_select_project_type.xml | 40 + app/src/main/res/layout/fragment_service.xml | 6 + .../fragment_single_framelayout_layout.xml | 9 + .../layout/fragment_single_list_layout.xml | 7 + ...ment_station_data_adjust_dialog_layout.xml | 84 + ...station_select_point_datasource_layout.xml | 26 + ...agment_station_setting_height_traverse.xml | 112 + .../res/layout/fragment_surveryor_number.xml | 20 + ...fragment_surveryor_station_number_list.xml | 71 + .../fragment_surveyor_route_station.xml | 26 + ...agment_surveyor_settings_dialog_layout.xml | 6 + ...surveyor_station_detail_or_edit_layout.xml | 54 + ...ent_surveyor_station_point_list_layout.xml | 7 + .../main/res/layout/fragment_tips_layout.xml | 43 + .../fragment_tips_with_2_option_layout.xml | 61 + .../fragment_tolerance_manager_layout.xml | 40 + ...nt_tolerance_select_framelayout_layout.xml | 22 + ...gment_tolerance_template_select_layout.xml | 26 + app/src/main/res/layout/item_create_route.xml | 103 + .../item_create_station_height_traverse.xml | 46 + ...em_create_station_height_traverse_desc.xml | 31 + app/src/main/res/layout/item_first_level.xml | 49 + .../main/res/layout/item_prism_manager.xml | 39 + app/src/main/res/layout/item_second_level.xml | 48 + .../item_select_measure_data_export_type.xml | 24 + app/src/main/res/layout/item_shortcut.xml | 29 + .../main/res/layout/item_spinner_content.xml | 26 + app/src/main/res/layout/item_spinner_text.xml | 11 + .../item_station_setting_1_edittext.xml | 38 + ...on_setting_2_edit_text_height_traverse.xml | 53 + .../res/layout/item_station_setting_title.xml | 36 + ...yor_station_settings_1_edittext_layout.xml | 38 + ...yor_station_settings_2_edittext_layout.xml | 60 + ...or_station_settings_point_title_layout.xml | 59 + ...surveyor_station_settings_title_layout.xml | 10 + ...ion_settings_title_with_2button_layout.xml | 37 + app/src/main/res/layout/item_table.xml | 19 + app/src/main/res/layout/item_table_family.xml | 15 + app/src/main/res/layout/item_table_first.xml | 20 + app/src/main/res/layout/item_table_header.xml | 20 + .../res/layout/item_table_header_first.xml | 21 + app/src/main/res/layout/item_third_level.xml | 36 + .../main/res/layout/item_with_more_layout.xml | 54 + .../main/res/layout/item_with_text_layout.xml | 22 + .../item_with_text_with_describe_layout.xml | 32 + .../layout/layout_cut_down_progressbar.xml | 14 + .../res/layout/layout_files_grid_item.xml | 62 + .../res/layout/layout_files_list_item.xml | 79 + .../res/layout/list_item_draggable_layout.xml | 30 + .../layout/list_item_group_parent_layout.xml | 26 + .../layout/list_item_index_text_layout.xml | 21 + ...list_item_index_text_selectable_layout.xml | 50 + ...ist_item_index_text_with_prefix_layout.xml | 28 + .../list_item_project_station_layout.xml | 14 + .../list_item_station_adjust_layout.xml | 44 + ...r_station_group_parent_with_add_layout.xml | 45 + ..._item_surveyor_station_height_traverse.xml | 304 + ...ist_item_surveyor_station_point_layout.xml | 330 + .../layout/list_item_text_boolen_layout.xml | 28 + .../list_item_text_selectable_layout.xml | 35 + .../layout/list_item_text_value_layout.xml | 27 + .../list_item_title_subtitle_layout.xml | 30 + app/src/main/res/layout/list_item_well.xml | 37 + .../list_item_well_measure_distance.xml | 268 + app/src/main/res/layout/loading_dialog.xml | 39 + ...inner_dropdown_item_my_with_background.xml | 27 + .../res/layout/toolbar_with_one_spinner.xml | 17 + .../res/layout/toolbar_with_two_spinner.xml | 30 + app/src/main/res/layout/view_marker.xml | 7 + .../main/res/menu/files_list_multi_choice.xml | 36 + .../res/menu/files_list_single_choice.xml | 44 + app/src/main/res/menu/menu_activity_about.xml | 8 + .../main/res/menu/menu_activity_agentweb.xml | 21 + .../menu/menu_activity_control_network.xml | 8 + app/src/main/res/menu/menu_activity_main.xml | 22 + .../menu/menu_activity_parameter_common.xml | 9 + .../main/res/menu/menu_activity_points.xml | 22 + .../res/menu/menu_activity_project_list.xml | 8 + .../main/res/menu/menu_activity_records.xml | 16 + .../main/res/menu/menu_activity_user_info.xml | 7 + app/src/main/res/menu/menu_confirm.xml | 7 + .../main/res/menu/menu_import_and_clear.xml | 15 + app/src/main/res/menu/menu_record_detail.xml | 13 + .../res/menu/menu_surveyor_station_edit.xml | 13 + ...urveyor_station_record_data_edit_debug.xml | 41 + ...veyor_station_record_data_edit_release.xml | 37 + .../res/menu/project_detail_fragment_menu.xml | 8 + .../main/res/menu/tolerance_select_menu.xml | 8 + .../res/mipmap-xhdpi/chatui_record_bottom.png | Bin 0 -> 5636 bytes .../res/mipmap-xhdpi/chatui_record_top.png | Bin 0 -> 6275 bytes .../main/res/mipmap-xhdpi/icon_chatui_add.png | Bin 0 -> 2241 bytes .../mipmap-xhdpi/icon_chatui_expression.png | Bin 0 -> 2541 bytes .../mipmap-xhdpi/icon_chatui_pick_photo.png | Bin 0 -> 4376 bytes .../mipmap-xhdpi/icon_chatui_take_photo.png | Bin 0 -> 5303 bytes .../res/mipmap-xhdpi/icon_chatui_voice.png | Bin 0 -> 2660 bytes .../mipmap-xhdpi/icon_chatui_voice_left1.png | Bin 0 -> 1246 bytes .../mipmap-xhdpi/icon_chatui_voice_left2.png | Bin 0 -> 1619 bytes .../mipmap-xhdpi/icon_chatui_voice_left3.png | Bin 0 -> 1915 bytes .../mipmap-xhdpi/icon_chatui_voice_right1.png | Bin 0 -> 1259 bytes .../mipmap-xhdpi/icon_chatui_voice_right2.png | Bin 0 -> 1608 bytes .../mipmap-xhdpi/icon_chatui_voice_right3.png | Bin 0 -> 2025 bytes .../main/res/mipmap-xhdpi/tab_home_select.png | Bin 0 -> 3229 bytes .../res/mipmap-xhdpi/tab_home_unselect.png | Bin 0 -> 3253 bytes .../mipmap-xhdpi/tab_parameters_select.png | Bin 0 -> 3982 bytes .../mipmap-xhdpi/tab_parameters_unselect.png | Bin 0 -> 1027 bytes .../res/mipmap-xhdpi/tab_tools_select.png | Bin 0 -> 1274 bytes .../res/mipmap-xhdpi/tab_tools_unselect.png | Bin 0 -> 1726 bytes .../res/mipmap-xxhdpi/app_icon_green_200.png | Bin 0 -> 15945 bytes .../res/mipmap-xxhdpi/app_icon_red_200.png | Bin 0 -> 19008 bytes .../res/mipmap-xxhdpi/avatar_liuyanbing.jpg | Bin 0 -> 62947 bytes .../main/res/mipmap-xxhdpi/banglocation.png | Bin 0 -> 4423 bytes .../res/mipmap-xxhdpi/bluetooth_connected.png | Bin 0 -> 16685 bytes app/src/main/res/mipmap-xxhdpi/comment.png | Bin 0 -> 1847 bytes .../mipmap-xxhdpi/icon_arrow_updown_128.png | Bin 0 -> 1143 bytes .../res/mipmap-xxhdpi/icon_backspace_64.png | Bin 0 -> 1558 bytes .../main/res/mipmap-xxhdpi/icon_bluetooth.png | Bin 0 -> 6208 bytes .../mipmap-xxhdpi/icon_cad_browse_only.png | Bin 0 -> 3161 bytes .../res/mipmap-xxhdpi/icon_cad_layers.png | Bin 0 -> 2675 bytes .../res/mipmap-xxhdpi/icon_cad_location.png | Bin 0 -> 17302 bytes .../main/res/mipmap-xxhdpi/icon_cad_regen.png | Bin 0 -> 2458 bytes .../main/res/mipmap-xxhdpi/icon_cad_save.png | Bin 0 -> 1725 bytes .../res/mipmap-xxhdpi/icon_cad_search.png | Bin 0 -> 3661 bytes .../icon_cad_select_by_finger.png | Bin 0 -> 18152 bytes .../icon_cad_select_by_mouse.png | Bin 0 -> 25136 bytes .../res/mipmap-xxhdpi/icon_cad_zoom_e.png | Bin 0 -> 2013 bytes .../res/mipmap-xxhdpi/icon_calculator_128.png | Bin 0 -> 4467 bytes .../main/res/mipmap-xxhdpi/icon_close_x.png | Bin 0 -> 15074 bytes .../icon_config_project_management.png | Bin 0 -> 4269 bytes .../main/res/mipmap-xxhdpi/icon_connect.png | Bin 0 -> 7194 bytes .../main/res/mipmap-xxhdpi/icon_continue.png | Bin 0 -> 18819 bytes .../res/mipmap-xxhdpi/icon_download_fill.png | Bin 0 -> 924 bytes app/src/main/res/mipmap-xxhdpi/icon_edit.png | Bin 0 -> 4332 bytes .../main/res/mipmap-xxhdpi/icon_edit_64.png | Bin 0 -> 3084 bytes .../main/res/mipmap-xxhdpi/icon_edm_np.png | Bin 0 -> 4271 bytes .../main/res/mipmap-xxhdpi/icon_edm_prism.png | Bin 0 -> 7513 bytes .../main/res/mipmap-xxhdpi/icon_edm_sheet.png | Bin 0 -> 8062 bytes .../res/mipmap-xxhdpi/icon_go_measure.png | Bin 0 -> 2621 bytes .../main/res/mipmap-xxhdpi/icon_jobinfo.png | Bin 0 -> 30296 bytes .../main/res/mipmap-xxhdpi/icon_location.png | Bin 0 -> 9102 bytes .../res/mipmap-xxhdpi/icon_message_128.png | Bin 0 -> 2357 bytes .../res/mipmap-xxhdpi/icon_my_location.png | Bin 0 -> 9221 bytes .../res/mipmap-xxhdpi/icon_other_valid.png | Bin 0 -> 21489 bytes .../res/mipmap-xxhdpi/icon_phone_unband.png | Bin 0 -> 3303 bytes .../icon_point_survey_continue_distance.png | Bin 0 -> 4736 bytes .../icon_point_survey_continue_time.png | Bin 0 -> 4452 bytes .../icon_point_survey_location_off.png | Bin 0 -> 19947 bytes .../icon_point_survey_location_on.png | Bin 0 -> 19797 bytes .../mipmap-xxhdpi/icon_point_survey_quick.png | Bin 0 -> 4018 bytes .../icon_point_survey_setting.png | Bin 0 -> 19005 bytes .../icon_point_survey_smooth.png | Bin 0 -> 4321 bytes .../mipmap-xxhdpi/icon_point_survey_start.png | Bin 0 -> 5337 bytes .../mipmap-xxhdpi/icon_point_survey_stop.png | Bin 0 -> 20390 bytes .../icon_point_survey_zoom_max.png | Bin 0 -> 4262 bytes .../res/mipmap-xxhdpi/icon_prism_height.png | Bin 0 -> 5104 bytes .../icon_program_customer_service.png | Bin 0 -> 9568 bytes .../mipmap-xxhdpi/icon_publish_jobinfo.png | Bin 0 -> 26577 bytes .../res/mipmap-xxhdpi/icon_rtk_ant_height.png | Bin 0 -> 1921 bytes .../mipmap-xxhdpi/icon_rtk_beidouhaida.png | Bin 0 -> 43123 bytes .../res/mipmap-xxhdpi/icon_rtk_comnav.png | Bin 0 -> 33512 bytes .../res/mipmap-xxhdpi/icon_rtk_devecent.png | Bin 0 -> 31285 bytes .../res/mipmap-xxhdpi/icon_rtk_geomax.png | Bin 0 -> 39680 bytes .../res/mipmap-xxhdpi/icon_rtk_haixingda.png | Bin 0 -> 55233 bytes .../res/mipmap-xxhdpi/icon_rtk_huace_old.png | Bin 0 -> 35862 bytes .../res/mipmap-xxhdpi/icon_rtk_huace_t.png | Bin 0 -> 45064 bytes .../res/mipmap-xxhdpi/icon_rtk_huace_x.png | Bin 0 -> 47617 bytes .../res/mipmap-xxhdpi/icon_rtk_huaxing.png | Bin 0 -> 46071 bytes .../main/res/mipmap-xxhdpi/icon_rtk_huayi.png | Bin 0 -> 27130 bytes .../res/mipmap-xxhdpi/icon_rtk_icegps.png | Bin 0 -> 21114 bytes .../res/mipmap-xxhdpi/icon_rtk_kelida.png | Bin 0 -> 47868 bytes .../res/mipmap-xxhdpi/icon_rtk_pentax.png | Bin 0 -> 52326 bytes .../res/mipmap-xxhdpi/icon_rtk_quanfang.png | Bin 0 -> 33747 bytes .../res/mipmap-xxhdpi/icon_rtk_qxwz_sr1.png | Bin 0 -> 23992 bytes .../res/mipmap-xxhdpi/icon_rtk_qxwz_sr2.png | Bin 0 -> 26568 bytes .../res/mipmap-xxhdpi/icon_rtk_qxwz_sr3.png | Bin 0 -> 29994 bytes .../main/res/mipmap-xxhdpi/icon_rtk_ruide.png | Bin 0 -> 47013 bytes .../res/mipmap-xxhdpi/icon_rtk_sanding.png | Bin 0 -> 53482 bytes .../res/mipmap-xxhdpi/icon_rtk_shuangwei.png | Bin 0 -> 48317 bytes .../res/mipmap-xxhdpi/icon_rtk_situoli.png | Bin 0 -> 37642 bytes .../res/mipmap-xxhdpi/icon_rtk_sokkia.png | Bin 0 -> 33758 bytes .../main/res/mipmap-xxhdpi/icon_rtk_south.png | Bin 0 -> 43475 bytes .../res/mipmap-xxhdpi/icon_rtk_spectra.png | Bin 0 -> 49533 bytes .../mipmap-xxhdpi/icon_rtk_status_fixed.png | Bin 0 -> 6673 bytes .../mipmap-xxhdpi/icon_rtk_status_float.png | Bin 0 -> 5920 bytes .../mipmap-xxhdpi/icon_rtk_status_paused.png | Bin 0 -> 6067 bytes .../mipmap-xxhdpi/icon_rtk_status_single.png | Bin 0 -> 5058 bytes .../res/mipmap-xxhdpi/icon_rtk_tersus.png | Bin 0 -> 139729 bytes .../res/mipmap-xxhdpi/icon_rtk_ufo_u3.png | Bin 0 -> 35388 bytes .../res/mipmap-xxhdpi/icon_rtk_ufo_u5.png | Bin 0 -> 40464 bytes .../res/mipmap-xxhdpi/icon_rtk_unistrong.png | Bin 0 -> 36603 bytes .../res/mipmap-xxhdpi/icon_rtk_zhonghaida.png | Bin 0 -> 45810 bytes .../res/mipmap-xxhdpi/icon_rtk_zhonghui.png | Bin 0 -> 46749 bytes .../main/res/mipmap-xxhdpi/icon_search.png | Bin 0 -> 4311 bytes .../icon_tool_advanced_fansuan.png | Bin 0 -> 14738 bytes .../icon_tool_advanced_zhengsuan.png | Bin 0 -> 14962 bytes .../res/mipmap-xxhdpi/icon_tool_compass.png | Bin 0 -> 7424 bytes .../icon_tool_coordinate_transform.png | Bin 0 -> 8716 bytes .../icon_tool_four_parameters.png | Bin 0 -> 6632 bytes .../icon_tool_line_element_fansuan.png | Bin 0 -> 10005 bytes .../mipmap-xxhdpi/icon_tool_line_staking.png | Bin 0 -> 8097 bytes .../icon_tool_seven_parameters.png | Bin 0 -> 7288 bytes .../icon_tool_simple_fansuan.png | Bin 0 -> 12131 bytes .../icon_tool_simple_zhengsuan.png | Bin 0 -> 12110 bytes .../icon_total_station_setting.png | Bin 0 -> 4845 bytes app/src/main/res/mipmap-xxhdpi/icon_wifi.png | Bin 0 -> 7886 bytes .../main/res/mipmap-xxhdpi/icon_wifi_128.png | Bin 0 -> 2924 bytes .../main/res/mipmap-xxhdpi/jobinfo_found.png | Bin 0 -> 1043 bytes .../res/mipmap-xxhdpi/location_gray_64.png | Bin 0 -> 1074 bytes .../main/res/mipmap-xxhdpi/location_red.png | Bin 0 -> 20031 bytes .../main/res/mipmap-xxhdpi/logo_comnav.png | Bin 0 -> 39784 bytes .../main/res/mipmap-xxhdpi/logo_douyin.png | Bin 0 -> 42094 bytes .../main/res/mipmap-xxhdpi/logo_fiofpad.png | Bin 0 -> 38584 bytes .../main/res/mipmap-xxhdpi/logo_geomax.png | Bin 0 -> 37891 bytes app/src/main/res/mipmap-xxhdpi/logo_huace.png | Bin 0 -> 40439 bytes .../main/res/mipmap-xxhdpi/logo_kuaishou.png | Bin 0 -> 45965 bytes .../main/res/mipmap-xxhdpi/logo_pentax.png | Bin 0 -> 33195 bytes .../res/mipmap-xxhdpi/logo_septentrio.png | Bin 0 -> 19448 bytes app/src/main/res/mipmap-xxhdpi/logo_south.png | Bin 0 -> 42665 bytes .../main/res/mipmap-xxhdpi/logo_surpad.png | Bin 0 -> 9621 bytes .../main/res/mipmap-xxhdpi/logo_ufopad.png | Bin 0 -> 3924 bytes app/src/main/res/mipmap-xxhdpi/logo_zhd.png | Bin 0 -> 8702 bytes .../main/res/mipmap-xxhdpi/logo_zhd_new.png | Bin 0 -> 25237 bytes app/src/main/res/mipmap-xxhdpi/marker_0.png | Bin 0 -> 18575 bytes app/src/main/res/mipmap-xxhdpi/marker_1.png | Bin 0 -> 17816 bytes .../res/mipmap-xxhdpi/marker_1px_alpha.png | Bin 0 -> 2790 bytes app/src/main/res/mipmap-xxhdpi/marker_2.png | Bin 0 -> 18403 bytes app/src/main/res/mipmap-xxhdpi/marker_3.png | Bin 0 -> 18530 bytes app/src/main/res/mipmap-xxhdpi/marker_4.png | Bin 0 -> 18113 bytes app/src/main/res/mipmap-xxhdpi/marker_5.png | Bin 0 -> 18349 bytes app/src/main/res/mipmap-xxhdpi/marker_6.png | Bin 0 -> 18690 bytes app/src/main/res/mipmap-xxhdpi/marker_6px.png | Bin 0 -> 2901 bytes app/src/main/res/mipmap-xxhdpi/marker_7.png | Bin 0 -> 18103 bytes app/src/main/res/mipmap-xxhdpi/marker_8.png | Bin 0 -> 18804 bytes app/src/main/res/mipmap-xxhdpi/marker_9.png | Bin 0 -> 18664 bytes .../mipmap-xxhdpi/marker_control_point.png | Bin 0 -> 6844 bytes app/src/main/res/mipmap-xxhdpi/marker_gq.png | Bin 0 -> 19574 bytes app/src/main/res/mipmap-xxhdpi/marker_hy.png | Bin 0 -> 18446 bytes app/src/main/res/mipmap-xxhdpi/marker_hz.png | Bin 0 -> 18514 bytes .../res/mipmap-xxhdpi/marker_my_location.png | Bin 0 -> 7317 bytes app/src/main/res/mipmap-xxhdpi/marker_qd.png | Bin 0 -> 19453 bytes app/src/main/res/mipmap-xxhdpi/marker_qz.png | Bin 0 -> 19423 bytes .../res/mipmap-xxhdpi/marker_record_point.png | Bin 0 -> 6631 bytes .../mipmap-xxhdpi/marker_settingout_point.png | Bin 0 -> 7045 bytes app/src/main/res/mipmap-xxhdpi/marker_yh.png | Bin 0 -> 18371 bytes app/src/main/res/mipmap-xxhdpi/marker_yz.png | Bin 0 -> 18720 bytes app/src/main/res/mipmap-xxhdpi/marker_zd.png | Bin 0 -> 18875 bytes app/src/main/res/mipmap-xxhdpi/marker_zh.png | Bin 0 -> 18502 bytes app/src/main/res/mipmap-xxhdpi/marker_zx.png | Bin 0 -> 19173 bytes app/src/main/res/mipmap-xxhdpi/marker_zy.png | Bin 0 -> 18657 bytes app/src/main/res/mipmap-xxhdpi/phone.png | Bin 0 -> 1484 bytes .../main/res/mipmap-xxhdpi/picture_empty.png | Bin 0 -> 4281 bytes .../main/res/mipmap-xxhdpi/picture_new.png | Bin 0 -> 2867 bytes .../main/res/mipmap-xxhdpi/profile_image.png | Bin 0 -> 4666 bytes app/src/main/res/mipmap-xxhdpi/scan.png | Bin 0 -> 4337 bytes .../mipmap-xxhdpi/tab_instrument_select.png | Bin 0 -> 14723 bytes .../mipmap-xxhdpi/tab_instrument_unselect.png | Bin 0 -> 13878 bytes .../res/mipmap-xxhdpi/tab_service_select.png | Bin 0 -> 1475 bytes .../mipmap-xxhdpi/tab_service_unselect.png | Bin 0 -> 1405 bytes .../res/mipmap-xxhdpi/tilt_calibration.gif | Bin 0 -> 1387548 bytes .../main/res/mipmap-xxhdpi/tilt_megnet.gif | Bin 0 -> 1200291 bytes app/src/main/res/mipmap-xxhdpi/watermark.png | Bin 0 -> 47869 bytes app/src/main/res/mipmap-xxhdpi/wepay_logo.png | Bin 0 -> 10480 bytes .../icon_point_survey_continue_distance.png | Bin 0 -> 21285 bytes .../icon_point_survey_continue_time.png | Bin 0 -> 21305 bytes .../res/mipmap-zh/icon_point_survey_quick.png | Bin 0 -> 22060 bytes .../mipmap-zh/icon_point_survey_smooth.png | Bin 0 -> 21239 bytes app/src/main/res/raw-zh/origin_tolerance.json | 2591 + app/src/main/res/raw/changelog.xml | 31 + app/src/main/res/raw/origin_tolerance.json | 2591 + app/src/main/res/raw/savedone.wav | Bin 0 -> 20044 bytes app/src/main/res/raw/septentrio_cut.m4a | Bin 0 -> 20480 bytes app/src/main/res/raw/septentrio_fill.m4a | Bin 0 -> 20480 bytes app/src/main/res/values-hdpi/dimens.xml | 21 + app/src/main/res/values-hdpi/styles.xml | 63 + app/src/main/res/values-mdpi/dimens.xml | 21 + app/src/main/res/values-mdpi/styles.xml | 63 + app/src/main/res/values-xhdpi/dimens.xml | 21 + app/src/main/res/values-xhdpi/styles.xml | 63 + app/src/main/res/values-xlarge/dimens.xml | 21 + app/src/main/res/values-xlarge/styles.xml | 63 + app/src/main/res/values-xxhdpi/dimens.xml | 21 + app/src/main/res/values-xxhdpi/styles.xml | 63 + app/src/main/res/values-xxxhdpi/dimens.xml | 21 + app/src/main/res/values-xxxhdpi/styles.xml | 63 + app/src/main/res/values-zh/arrays.xml | 269 + app/src/main/res/values-zh/strings.xml | 5 + app/src/main/res/values/arrays.xml | 271 + app/src/main/res/values/attr.xml | 55 + app/src/main/res/values/colors.xml | 51 + app/src/main/res/values/dimens.xml | 44 + app/src/main/res/values/ids.xml.xml | 7 + app/src/main/res/values/strings.xml | 5 + app/src/main/res/values/styles.xml | 183 + app/src/main/res/xml-v25/shortcuts.xml | 16 + .../main/res/xml/network_security_config.xml | 4 + app/src/main/res/xml/prefs.xml | 101 + app/src/main/res/xml/shortcuts.xml | 11 + .../main/res/xml/surveyor_settings_prefs.xml | 12 + .../14.json | 1134 + .../15.json | 1134 + app/src/test/java/TestCase.java | 16 + app/src/test/kotlin/Hello.kt | 37 + build.gradle | 27 + buildSrc/build.gradle.kts | 7 + .../main/java/com/bingce/ConfigProperties.kt | 25 + .../src/main/java/com/bingce/ModuleName.kt | 44 + .../java/com/bingce/SurveyorVersionUtils.kt | 27 + .../src/main/java/com/bingce/dependencies.kt | 234 + .../java/com/bingce/flavor/FlavorItems.java | 50 + control_common | 1 + gradle.properties | 25 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 + gradlew.bat | 90 + import-summary.txt | 36 + settings.gradle | 2 + 839 files changed, 164460 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/debug.keystore create mode 100644 app/doc/Untitled-old.mdj create mode 100644 app/doc/states.mdj create mode 100644 app/doc/状态机.mdj create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/cn/liuyanbing/surveyor/activity/MainActivityTest.java create mode 100644 app/src/androidTest/kotlin/HelloKotlin.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/README.md create mode 100644 app/src/main/assets/Roboto-Light.ttf create mode 100644 app/src/main/assets/Roboto-Medium.ttf create mode 100644 app/src/main/assets/agreement_policy_summary.xml create mode 100644 app/src/main/assets/agreement_policy_summary_en.xml create mode 100644 app/src/main/assets/default_tolerance create mode 100644 app/src/main/assets/features.hcc create mode 100644 app/src/main/assets/network_error.png create mode 100644 app/src/main/assets/privacyPolicy.xml create mode 100644 app/src/main/assets/privacyPolicy_en.xml create mode 100644 app/src/main/assets/service_default.html create mode 100644 app/src/main/assets/supplierconfig.json create mode 100644 app/src/main/assets/template_tolerance create mode 100644 app/src/main/assets/userAgreement.xml create mode 100644 app/src/main/assets/userAgreement_en.xml create mode 100644 app/src/main/design.sketch create mode 100644 app/src/main/doc/测绘云流程图.mdj create mode 100644 app/src/main/java/com/bingce/controlnetwork/App.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/AboutActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/BaseActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/ChangelogActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/LogCollectActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/MainActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/MainActivityUtils.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/NotificationActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/SettingsActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/SplashActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/backup/AbstractBackupExportActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/backup/BackupExportActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/BackupImportHelper.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/MigrationFolder2PrivateRoomActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/ZipMigrationUtils.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentContainer.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentContainerActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentItem.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/IOnBackFilter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/user/EditNicknamePasswordActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/user/InputEmailActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/user/InputPhoneNumberActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/user/LoginActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/user/OpeningRenewalVipActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/user/RedeemVipActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/user/RegisterActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/user/UserInfoActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/user/VerifyEmailCodeActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/activity/user/VerifySMSCodeActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/AbstractPointSelectAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/BaseAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/BaseIndexPrefixTextWithContextMenuAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/BaseIndexTextWithContextMenuAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/BaseSelectableIndexTextWithContextMenuAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/BaseTitleAndSubtitleWithContextMenuAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/GlobalControlPointSelectAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/IOnContextItemSelectedCallback.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/IUpdateListAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/IndexWithTextAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/IndexWithTextAndPrefixAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/MeasureAngleDistanceAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/MeasureHeightTraverseAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/MultipleSelectableIndexWithTextAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/PointRecordAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/PointSelectAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/PrismMagegeAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/ProjectListAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/ReSurveyorCycleAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/ResurveyorPointsAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/SelectableIndexWithTextAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/SpinnerAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorPeriodAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorStationListAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorStationRecordsAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/TitleWithSubtitleAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/ToleranceDetailAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuDelete.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuDeleteEdit.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuEdit.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/IAdapterContextMenu.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ProjectAdapterContextMenu.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/SurveyorPeriodAdapterContextMenu.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/BaseStationDetailAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/EditableStationDetailAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/NoEditableStationDetailAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineKnownUnknownKnownAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineSingleAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellDoubleGroundAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellDoubleUnderGroundAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/controller/Expression.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/controller/KeyEventAction.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/AbstractFullScreenDialogFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/AbstractHierarchicalListFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/AbstractProjectToleranceFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/AbstractRecyclerViewFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/BaseBottomSheetDialogFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/BottomSheetSelectListFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/BottomSheetSurveyorPeriodFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ComponentStationSurveyorDataListFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSurveyorStationListFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSwitchStationListFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSwitchToleranceFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ConfigFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/EmptyFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/FullLoadingFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ListDialogFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/MainSurveyFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/PickPointFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/PointFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/PointListFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/PrismManageFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/PrismManagerCreateCustomFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ProjectListFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ProjectToleranceSettingFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportHeightTraverseFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportSurveyorRecordFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportSurveyorRecordWireFileFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectMeasureDataExportTypeFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectProjectAndSurveyorCycleFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectProjectTypeFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectReSurveyorCycleFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectReSurveyorPointFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectSurveyorStationTypeFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectSurveyorStationTypeWellSubFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectToleranceBottomSheetFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SelectToleranceTemplateBottomSheetFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ServiceFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/StationDataAdjustDialogFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/StringInputFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorRouteStationFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorSettingsFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorStationListFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/TipsFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/TipsWith2OptionFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceAttributeEditFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceDetailFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceManageFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceSelectFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/base/BaseFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/base/BaseLazyFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomBean.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageAdapter.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageContentFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomSwitchVm.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/IData.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/ViewHolder.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/CreateOrEditRouteDialog.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/adapter/RouteListAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/viewmodel/HeightCreateOrEditVm.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailHeightTraverseFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailTriangleFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/content/RouteFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/AbstractProjectEditFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/ProjectEditHeightTraverseFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/ProjectEditTriangleFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/AbstractStationFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/AbstractSingleStationPointListFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/ComponentSingleStationPointListFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/DefaultStationSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/AbstructSetupStationHeightTraverseFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/CreateStationForHeightTraverseFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/EverySetUpStationFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/SeparatSetupStationFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationKnownUnknownKnownSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationKnownUnknownSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellDoubleGroundSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellDoubleUnderGroundSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/attached/LineStationAttachedSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/close/LineStationCloseSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/random/LineStationRandomSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/single/LineStationSingleSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellDoubleGroundSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellDoubleUnderGroundSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellSetupFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationdetail/SingleStationDetailAndEditFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationdetail/StationDetailViewModel.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/BaseStationSettingFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/StationSettingHeightTraverseFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/StationSettingsFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/IMeasureOperate.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/MethodCheckSetting.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/StationSurveyorFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureDefaultFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureDistanceFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureVm.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/StationCheckBeforeUtil.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/base/MeasureBaseFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/heighttraverse/MeasureHeightTraverseFragment.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/heighttraverse/MeasureHeightTraverseSubFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/guide/GuideSequence.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/guide/ITapTargetProvider.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/http/HttpExtend.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/http/RetrofitClient.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/http/sevice/CommonService.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/method/SingleCycleTipsMethod.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/AutoModeType.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/IScrollDelegate.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/StateConstants.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/StateManagerAloneDistance.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckReadDataState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckSingleCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckStationState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckStationSuccessState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoAutoSurveyorState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoCalAdjustState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoCalScheduleInSingleCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoDeleteAllCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoDeleteCurrentCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoMove2NextValidateState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoMoveBackState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoSurveyorState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoWellMeasureRotationReadyState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IdleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IsAllCycleCompletedState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IsSingleCycleCompletedState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_SurveyorFailureState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/__BaseState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/StateManager.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_Check2CState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckHalfCycleZeroState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckReadDataState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckSingleCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckStationState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckStationSuccessState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoAutoSurveyorState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalAdjustState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalScheduleInAllCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalScheduleInSingleCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoDeleteAllCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoDeleteCurrentCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoMove2NextValidateState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoMoveBackState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoRecordCleanState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoSurveyorState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoWellMeasureRotationReadyState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IdleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_Is2CCheckReadyState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsAllCycleCompletedState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsHalfCycleZeroCheckReadyState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsSingleCycleCompletedState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_SurveyorFailureState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/__BaseState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/ILookCase.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/StateManagerHeightTraverse.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_CheckStationState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_CheckToleranceState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoAutoSurveyorState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoCalAdjustState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoDeleteAllCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoDeleteCurrentCycleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoMove2NextValidateState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoMoveBackState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoSurveyorState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoWellMeasureRotationReadyState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_IdleState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_Init.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_SurveyorFailureState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/__BaseState.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/surveyor/surveyor/TestDataSelectFragment.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/ViewUtil.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/WechatImagePicker.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/helper/OnActivityTouchListener.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/helper/RecyclerTouchListener.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/DraggableTextViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/DraggableViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/GroupParentViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextSelectableViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextWithPrefixViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/ItemWellViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/KeyBoolViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/KeyValueViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/PrismManageViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/StationAdjustItemViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/StationGroupItemViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataAloneDistanceViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataViewHolderHeightTraverse.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/TextSelectableViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/vh/TitleWithSubtitleViewHolder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/CommentListTextView.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/ItemWithEditText.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/MyDrawerBuilder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/NoScrollView.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/NoScrollViewPager.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/RotateLayout.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItem.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItemWithDescribe.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItemWithMore.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/ViewFactory.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingDialog.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingUtil.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingUtilKt.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/AbstractDraggableRecycleViewAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragActionDelegate.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragSwipeActionListener.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragSwipeChecker.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/ISwipeDragListener.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IViewHolderDragDelegate.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/ItemTouchHelperCallbackImpl.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/SwipeDraggableRecyclerViewUtil.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeNode.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeView.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeViewAdapter.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseNodeViewBinder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseNodeViewFactory.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseTreeAction.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/CheckableNodeViewBinder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/SelectableTreeAction.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/FirstLevelNodeViewBinder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/MyNodeViewFactory.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/SecondLevelNodeViewBinder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/ThirdLevelNodeViewBinder.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/helper/TreeHelper.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/util/CheckControlUpdateUtil.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/util/DatabaseFixUtils.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/util/DefaultNameUtil.kt create mode 100644 app/src/main/java/com/bingce/controlnetwork/util/SurveyorStationUtil.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/util/config/AbstractSetConfigs.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/util/config/ConfigItem.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/util/config/ConfigsSetConfigs.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/util/config/IConfigItemCallback.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/wxapi/Constants.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/wxapi/MD5.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/wxapi/WXEntryActivity.java create mode 100644 app/src/main/java/com/bingce/controlnetwork/wxapi/WXPayEntryActivity.java create mode 100644 app/src/main/res/anim/fade_in_quick.xml create mode 100644 app/src/main/res/anim/fade_out_quick.xml create mode 100644 app/src/main/res/anim/slide_in_left.xml create mode 100644 app/src/main/res/anim/slide_in_right.xml create mode 100644 app/src/main/res/anim/slide_out_left.xml create mode 100644 app/src/main/res/anim/slide_out_right.xml create mode 100644 app/src/main/res/drawable-hdpi/icon_small.png create mode 100644 app/src/main/res/drawable-v21/blue_bg.xml create mode 100644 app/src/main/res/drawable-v21/fab_label_background.xml create mode 100644 app/src/main/res/drawable-v21/ic_keyboard_arrow_right_white_24px.xml create mode 100644 app/src/main/res/drawable-v23/app_background.xml create mode 100644 app/src/main/res/drawable-v23/icon_control_logo.png create mode 100644 app/src/main/res/drawable-v23/icon_control_text.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp__ic_file.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp__ic_folder.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp__ic_up.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_cancel.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_deselect.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_grid.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_invert_selection.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_list.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_new_folder.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_ok.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_select_all.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_sort.png create mode 100644 app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_storage.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_back.png create mode 100644 app/src/main/res/drawable-xxxhdpi/icon.png create mode 100644 app/src/main/res/drawable/app_background.xml create mode 100644 app/src/main/res/drawable/app_logo.xml create mode 100644 app/src/main/res/drawable/baseline_reorder_grey_600_24dp.xml create mode 100644 app/src/main/res/drawable/bg_circle_white_chatui.xml create mode 100644 app/src/main/res/drawable/bg_gray_3.xml create mode 100644 app/src/main/res/drawable/bg_spinner.xml create mode 100644 app/src/main/res/drawable/bg_splash.xml create mode 100644 app/src/main/res/drawable/bg_table_color1.xml create mode 100644 app/src/main/res/drawable/bg_table_color2.xml create mode 100644 app/src/main/res/drawable/bg_table_family.xml create mode 100644 app/src/main/res/drawable/bg_white_3.xml create mode 100644 app/src/main/res/drawable/clickable_blue_bg.xml create mode 100644 app/src/main/res/drawable/corners_edit_white_chatui.xml create mode 100644 app/src/main/res/drawable/drawer_header.jpg create mode 100644 app/src/main/res/drawable/fab_label_background.xml create mode 100644 app/src/main/res/drawable/ic_arrow_down.xml create mode 100644 app/src/main/res/drawable/ic_arrow_to_right_dark.xml create mode 100644 app/src/main/res/drawable/ic_arrow_up.xml create mode 100644 app/src/main/res/drawable/ic_backup.xml create mode 100644 app/src/main/res/drawable/ic_baseline_clear_all_24.xml create mode 100644 app/src/main/res/drawable/ic_close_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_custom_tolerance.xml create mode 100644 app/src/main/res/drawable/ic_export.xml create mode 100644 app/src/main/res/drawable/ic_export_height_traverse.xml create mode 100644 app/src/main/res/drawable/ic_export_wire.xml create mode 100644 app/src/main/res/drawable/ic_indeterminate_check_box_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_known_point_24.xml create mode 100644 app/src/main/res/drawable/ic_ruler_selected.xml create mode 100644 app/src/main/res/drawable/ic_ruler_unselected.xml create mode 100644 app/src/main/res/drawable/ic_selected.xml create mode 100644 app/src/main/res/drawable/ic_surveyor_24.xml create mode 100644 app/src/main/res/drawable/ic_switch.xml create mode 100644 app/src/main/res/drawable/ic_tab_project_selected.xml create mode 100644 app/src/main/res/drawable/ic_tab_project_unselect.xml create mode 100644 app/src/main/res/drawable/ic_tolerance_24.xml create mode 100644 app/src/main/res/drawable/ic_unknown_point_24.xml create mode 100644 app/src/main/res/drawable/icon_control_logo.png create mode 100644 app/src/main/res/drawable/icon_control_text.png create mode 100644 app/src/main/res/drawable/icon_parameter_points.xml create mode 100644 app/src/main/res/drawable/icon_prism_manager.xml create mode 100644 app/src/main/res/drawable/icon_ts_connecting.xml create mode 100644 app/src/main/res/drawable/img_request_android_data_access_permission.jpg create mode 100644 app/src/main/res/drawable/img_weixin_download_guide.jpg create mode 100644 app/src/main/res/drawable/iv_back_selector.xml create mode 100644 app/src/main/res/drawable/loading_circle.xml create mode 100644 app/src/main/res/drawable/loading_dialog_bg_ll.xml create mode 100644 app/src/main/res/drawable/loading_dialog_bg_progress_bar.xml create mode 100644 app/src/main/res/drawable/loading_dialog_pic.png create mode 100644 app/src/main/res/drawable/msg_state_fail_resend.png create mode 100644 app/src/main/res/drawable/record_microphone_bj_chatui.xml create mode 100644 app/src/main/res/drawable/record_microphone_chatui.xml create mode 100644 app/src/main/res/drawable/recyclerview_divider.xml create mode 100644 app/src/main/res/drawable/round_btn_bg.xml create mode 100644 app/src/main/res/drawable/round_white.xml create mode 100644 app/src/main/res/drawable/select_mask.xml create mode 100644 app/src/main/res/drawable/separator_table.xml create mode 100644 app/src/main/res/drawable/separator_table_first.xml create mode 100644 app/src/main/res/drawable/separator_table_header.xml create mode 100644 app/src/main/res/drawable/separator_table_header_first.xml create mode 100644 app/src/main/res/drawable/tab_shadow.xml create mode 100644 app/src/main/res/drawable/transparent_ripple_bg.xml create mode 100644 app/src/main/res/drawable/voice_left_chatui.xml create mode 100644 app/src/main/res/drawable/voice_right_chatui.xml create mode 100644 app/src/main/res/drawable/white_ripple_bg.xml create mode 100644 app/src/main/res/drawable/wifi_chat_item_left_bg.9.png create mode 100644 app/src/main/res/drawable/wifi_chat_item_right_bg.9.png create mode 100644 app/src/main/res/layout/activity_about.xml create mode 100644 app/src/main/res/layout/activity_activate.xml create mode 100644 app/src/main/res/layout/activity_agentweb_base.xml create mode 100644 app/src/main/res/layout/activity_changelog.xml create mode 100644 app/src/main/res/layout/activity_control_network.xml create mode 100644 app/src/main/res/layout/activity_edit_user_nickname_password.xml create mode 100644 app/src/main/res/layout/activity_export_layout.xml create mode 100644 app/src/main/res/layout/activity_fragment_container_layout.xml create mode 100644 app/src/main/res/layout/activity_input_email.xml create mode 100644 app/src/main/res/layout/activity_input_phone_number.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_migration_2_private_folder_layout.xml create mode 100644 app/src/main/res/layout/activity_opening_renewal.xml create mode 100644 app/src/main/res/layout/activity_record_detail.xml create mode 100644 app/src/main/res/layout/activity_records.xml create mode 100644 app/src/main/res/layout/activity_redeem.xml create mode 100644 app/src/main/res/layout/activity_settings.xml create mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/layout/activity_user_agreement_privacy_policy.xml create mode 100644 app/src/main/res/layout/activity_user_info.xml create mode 100644 app/src/main/res/layout/activity_verify_code.xml create mode 100644 app/src/main/res/layout/broswer.xml create mode 100644 app/src/main/res/layout/content_create_project_content.xml create mode 100644 app/src/main/res/layout/content_edit_point_layout.xml create mode 100644 app/src/main/res/layout/content_string_input_layout.xml create mode 100644 app/src/main/res/layout/content_tolerance_attribute_editor_layout.xml create mode 100644 app/src/main/res/layout/device_name.xml create mode 100644 app/src/main/res/layout/dialog_add_friend.xml create mode 100644 app/src/main/res/layout/dialog_changelog.xml create mode 100644 app/src/main/res/layout/dialog_create_route.xml create mode 100644 app/src/main/res/layout/dialog_edit_nickname.xml create mode 100644 app/src/main/res/layout/dialog_imageview_request_android_data_access_permission.xml create mode 100644 app/src/main/res/layout/dialog_imageview_weixin_download_guide.xml create mode 100644 app/src/main/res/layout/dialog_input_measuredd_coordinate.xml create mode 100644 app/src/main/res/layout/dialog_new_control_point.xml create mode 100644 app/src/main/res/layout/dialog_new_project.xml create mode 100644 app/src/main/res/layout/dialog_power_off.xml create mode 100644 app/src/main/res/layout/dialog_projection_setting.xml create mode 100644 app/src/main/res/layout/dialog_register_pay_qr_code.xml create mode 100644 app/src/main/res/layout/dialog_select_libs_point.xml create mode 100644 app/src/main/res/layout/dialog_sign_in.xml create mode 100644 app/src/main/res/layout/dialog_sign_up.xml create mode 100644 app/src/main/res/layout/efp__new_folder.xml create mode 100644 app/src/main/res/layout/fragment_agentweb.xml create mode 100644 app/src/main/res/layout/fragment_bottom_page_content.xml create mode 100644 app/src/main/res/layout/fragment_bottom_popup_list.xml create mode 100644 app/src/main/res/layout/fragment_bottom_popup_list_select_layout.xml create mode 100644 app/src/main/res/layout/fragment_bottom_popup_surveyor_station_type_select_layout.xml create mode 100644 app/src/main/res/layout/fragment_bottom_popup_surveyor_station_type_select_layout_well_sub.xml create mode 100644 app/src/main/res/layout/fragment_close_line_surveyor_station_setup_layout.xml create mode 100644 app/src/main/res/layout/fragment_cloud_sync_cloud_recyclerview.xml create mode 100644 app/src/main/res/layout/fragment_config.xml create mode 100644 app/src/main/res/layout/fragment_create_station_for_height_traverse.xml create mode 100644 app/src/main/res/layout/fragment_default_surveyor_station_setup_layout.xml create mode 100644 app/src/main/res/layout/fragment_fragment_container_layout.xml create mode 100644 app/src/main/res/layout/fragment_full_loading_layout.xml create mode 100644 app/src/main/res/layout/fragment_fullscreen_dialog_layout.xml create mode 100644 app/src/main/res/layout/fragment_height_traverse_every_setup_station.xml create mode 100644 app/src/main/res/layout/fragment_height_traverse_seperate_setup_station.xml create mode 100644 app/src/main/res/layout/fragment_hierarchical_list_layout.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/fragment_limit_detail.xml create mode 100644 app/src/main/res/layout/fragment_limit_detail_list.xml create mode 100644 app/src/main/res/layout/fragment_limited_item.xml create mode 100644 app/src/main/res/layout/fragment_limited_item_list.xml create mode 100644 app/src/main/res/layout/fragment_line_surveyor_station_setup_layout.xml create mode 100644 app/src/main/res/layout/fragment_list_layout.xml create mode 100644 app/src/main/res/layout/fragment_measure.xml create mode 100644 app/src/main/res/layout/fragment_pick_point_bottom_sheet_layout.xml create mode 100644 app/src/main/res/layout/fragment_plates_recyclerview.xml create mode 100644 app/src/main/res/layout/fragment_point_layout.xml create mode 100644 app/src/main/res/layout/fragment_prism_manager.xml create mode 100644 app/src/main/res/layout/fragment_prism_manager_create_custom.xml create mode 100644 app/src/main/res/layout/fragment_project_detail_list_layout.xml create mode 100644 app/src/main/res/layout/fragment_project_edit_height_traverse.xml create mode 100644 app/src/main/res/layout/fragment_project_edit_triangle.xml create mode 100644 app/src/main/res/layout/fragment_project_limit_detail_layout.xml create mode 100644 app/src/main/res/layout/fragment_project_list.xml create mode 100644 app/src/main/res/layout/fragment_project_station_item_layout.xml create mode 100644 app/src/main/res/layout/fragment_project_surveyor_station_detail_layout.xml create mode 100644 app/src/main/res/layout/fragment_project_surveyor_station_list_layout.xml create mode 100644 app/src/main/res/layout/fragment_project_surveyor_station_point_list_layout.xml create mode 100644 app/src/main/res/layout/fragment_resurveryor_layout.xml create mode 100644 app/src/main/res/layout/fragment_resurveryor_layout_cycle.xml create mode 100644 app/src/main/res/layout/fragment_select_export_surveyor_layout.xml create mode 100644 app/src/main/res/layout/fragment_select_measure_data_export_type.xml create mode 100644 app/src/main/res/layout/fragment_select_project_type.xml create mode 100644 app/src/main/res/layout/fragment_service.xml create mode 100644 app/src/main/res/layout/fragment_single_framelayout_layout.xml create mode 100644 app/src/main/res/layout/fragment_single_list_layout.xml create mode 100644 app/src/main/res/layout/fragment_station_data_adjust_dialog_layout.xml create mode 100644 app/src/main/res/layout/fragment_station_select_point_datasource_layout.xml create mode 100644 app/src/main/res/layout/fragment_station_setting_height_traverse.xml create mode 100644 app/src/main/res/layout/fragment_surveryor_number.xml create mode 100644 app/src/main/res/layout/fragment_surveryor_station_number_list.xml create mode 100644 app/src/main/res/layout/fragment_surveyor_route_station.xml create mode 100644 app/src/main/res/layout/fragment_surveyor_settings_dialog_layout.xml create mode 100644 app/src/main/res/layout/fragment_surveyor_station_detail_or_edit_layout.xml create mode 100644 app/src/main/res/layout/fragment_surveyor_station_point_list_layout.xml create mode 100644 app/src/main/res/layout/fragment_tips_layout.xml create mode 100644 app/src/main/res/layout/fragment_tips_with_2_option_layout.xml create mode 100644 app/src/main/res/layout/fragment_tolerance_manager_layout.xml create mode 100644 app/src/main/res/layout/fragment_tolerance_select_framelayout_layout.xml create mode 100644 app/src/main/res/layout/fragment_tolerance_template_select_layout.xml create mode 100644 app/src/main/res/layout/item_create_route.xml create mode 100644 app/src/main/res/layout/item_create_station_height_traverse.xml create mode 100644 app/src/main/res/layout/item_create_station_height_traverse_desc.xml create mode 100644 app/src/main/res/layout/item_first_level.xml create mode 100644 app/src/main/res/layout/item_prism_manager.xml create mode 100644 app/src/main/res/layout/item_second_level.xml create mode 100644 app/src/main/res/layout/item_select_measure_data_export_type.xml create mode 100644 app/src/main/res/layout/item_shortcut.xml create mode 100644 app/src/main/res/layout/item_spinner_content.xml create mode 100644 app/src/main/res/layout/item_spinner_text.xml create mode 100644 app/src/main/res/layout/item_station_setting_1_edittext.xml create mode 100644 app/src/main/res/layout/item_station_setting_2_edit_text_height_traverse.xml create mode 100644 app/src/main/res/layout/item_station_setting_title.xml create mode 100644 app/src/main/res/layout/item_surveyor_station_settings_1_edittext_layout.xml create mode 100644 app/src/main/res/layout/item_surveyor_station_settings_2_edittext_layout.xml create mode 100644 app/src/main/res/layout/item_surveyor_station_settings_point_title_layout.xml create mode 100644 app/src/main/res/layout/item_surveyor_station_settings_title_layout.xml create mode 100644 app/src/main/res/layout/item_surveyor_station_settings_title_with_2button_layout.xml create mode 100644 app/src/main/res/layout/item_table.xml create mode 100644 app/src/main/res/layout/item_table_family.xml create mode 100644 app/src/main/res/layout/item_table_first.xml create mode 100644 app/src/main/res/layout/item_table_header.xml create mode 100644 app/src/main/res/layout/item_table_header_first.xml create mode 100644 app/src/main/res/layout/item_third_level.xml create mode 100644 app/src/main/res/layout/item_with_more_layout.xml create mode 100644 app/src/main/res/layout/item_with_text_layout.xml create mode 100644 app/src/main/res/layout/item_with_text_with_describe_layout.xml create mode 100644 app/src/main/res/layout/layout_cut_down_progressbar.xml create mode 100644 app/src/main/res/layout/layout_files_grid_item.xml create mode 100644 app/src/main/res/layout/layout_files_list_item.xml create mode 100644 app/src/main/res/layout/list_item_draggable_layout.xml create mode 100644 app/src/main/res/layout/list_item_group_parent_layout.xml create mode 100644 app/src/main/res/layout/list_item_index_text_layout.xml create mode 100644 app/src/main/res/layout/list_item_index_text_selectable_layout.xml create mode 100644 app/src/main/res/layout/list_item_index_text_with_prefix_layout.xml create mode 100644 app/src/main/res/layout/list_item_project_station_layout.xml create mode 100644 app/src/main/res/layout/list_item_station_adjust_layout.xml create mode 100644 app/src/main/res/layout/list_item_surveyor_station_group_parent_with_add_layout.xml create mode 100644 app/src/main/res/layout/list_item_surveyor_station_height_traverse.xml create mode 100644 app/src/main/res/layout/list_item_surveyor_station_point_layout.xml create mode 100644 app/src/main/res/layout/list_item_text_boolen_layout.xml create mode 100644 app/src/main/res/layout/list_item_text_selectable_layout.xml create mode 100644 app/src/main/res/layout/list_item_text_value_layout.xml create mode 100644 app/src/main/res/layout/list_item_title_subtitle_layout.xml create mode 100644 app/src/main/res/layout/list_item_well.xml create mode 100644 app/src/main/res/layout/list_item_well_measure_distance.xml create mode 100644 app/src/main/res/layout/loading_dialog.xml create mode 100644 app/src/main/res/layout/spinner_dropdown_item_my_with_background.xml create mode 100644 app/src/main/res/layout/toolbar_with_one_spinner.xml create mode 100644 app/src/main/res/layout/toolbar_with_two_spinner.xml create mode 100644 app/src/main/res/layout/view_marker.xml create mode 100644 app/src/main/res/menu/files_list_multi_choice.xml create mode 100644 app/src/main/res/menu/files_list_single_choice.xml create mode 100644 app/src/main/res/menu/menu_activity_about.xml create mode 100644 app/src/main/res/menu/menu_activity_agentweb.xml create mode 100644 app/src/main/res/menu/menu_activity_control_network.xml create mode 100644 app/src/main/res/menu/menu_activity_main.xml create mode 100644 app/src/main/res/menu/menu_activity_parameter_common.xml create mode 100644 app/src/main/res/menu/menu_activity_points.xml create mode 100644 app/src/main/res/menu/menu_activity_project_list.xml create mode 100644 app/src/main/res/menu/menu_activity_records.xml create mode 100644 app/src/main/res/menu/menu_activity_user_info.xml create mode 100644 app/src/main/res/menu/menu_confirm.xml create mode 100644 app/src/main/res/menu/menu_import_and_clear.xml create mode 100644 app/src/main/res/menu/menu_record_detail.xml create mode 100644 app/src/main/res/menu/menu_surveyor_station_edit.xml create mode 100644 app/src/main/res/menu/menu_surveyor_station_record_data_edit_debug.xml create mode 100644 app/src/main/res/menu/menu_surveyor_station_record_data_edit_release.xml create mode 100644 app/src/main/res/menu/project_detail_fragment_menu.xml create mode 100644 app/src/main/res/menu/tolerance_select_menu.xml create mode 100644 app/src/main/res/mipmap-xhdpi/chatui_record_bottom.png create mode 100644 app/src/main/res/mipmap-xhdpi/chatui_record_top.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_add.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_expression.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_pick_photo.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_take_photo.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_voice.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_voice_left1.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_voice_left2.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_voice_left3.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_voice_right1.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_voice_right2.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_chatui_voice_right3.png create mode 100644 app/src/main/res/mipmap-xhdpi/tab_home_select.png create mode 100644 app/src/main/res/mipmap-xhdpi/tab_home_unselect.png create mode 100644 app/src/main/res/mipmap-xhdpi/tab_parameters_select.png create mode 100644 app/src/main/res/mipmap-xhdpi/tab_parameters_unselect.png create mode 100644 app/src/main/res/mipmap-xhdpi/tab_tools_select.png create mode 100644 app/src/main/res/mipmap-xhdpi/tab_tools_unselect.png create mode 100644 app/src/main/res/mipmap-xxhdpi/app_icon_green_200.png create mode 100644 app/src/main/res/mipmap-xxhdpi/app_icon_red_200.png create mode 100644 app/src/main/res/mipmap-xxhdpi/avatar_liuyanbing.jpg create mode 100644 app/src/main/res/mipmap-xxhdpi/banglocation.png create mode 100644 app/src/main/res/mipmap-xxhdpi/bluetooth_connected.png create mode 100644 app/src/main/res/mipmap-xxhdpi/comment.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_arrow_updown_128.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_backspace_64.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_bluetooth.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_cad_browse_only.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_cad_layers.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_cad_location.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_cad_regen.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_cad_save.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_cad_search.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_cad_select_by_finger.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_cad_select_by_mouse.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_cad_zoom_e.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_calculator_128.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_close_x.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_config_project_management.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_connect.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_continue.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_download_fill.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_edit.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_edit_64.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_edm_np.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_edm_prism.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_edm_sheet.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_go_measure.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_jobinfo.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_location.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_message_128.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_my_location.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_other_valid.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_phone_unband.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_point_survey_continue_distance.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_point_survey_continue_time.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_point_survey_location_off.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_point_survey_location_on.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_point_survey_quick.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_point_survey_setting.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_point_survey_smooth.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_point_survey_start.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_point_survey_stop.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_point_survey_zoom_max.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_prism_height.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_program_customer_service.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_publish_jobinfo.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_ant_height.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_beidouhaida.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_comnav.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_devecent.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_geomax.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_haixingda.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_huace_old.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_huace_t.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_huace_x.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_huaxing.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_huayi.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_icegps.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_kelida.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_pentax.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_quanfang.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_qxwz_sr1.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_qxwz_sr2.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_qxwz_sr3.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_ruide.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_sanding.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_shuangwei.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_situoli.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_sokkia.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_south.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_spectra.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_status_fixed.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_status_float.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_status_paused.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_status_single.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_tersus.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_ufo_u3.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_ufo_u5.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_unistrong.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_zhonghaida.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_rtk_zhonghui.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_search.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_tool_advanced_fansuan.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_tool_advanced_zhengsuan.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_tool_compass.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_tool_coordinate_transform.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_tool_four_parameters.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_tool_line_element_fansuan.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_tool_line_staking.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_tool_seven_parameters.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_tool_simple_fansuan.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_tool_simple_zhengsuan.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_total_station_setting.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_wifi.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_wifi_128.png create mode 100644 app/src/main/res/mipmap-xxhdpi/jobinfo_found.png create mode 100644 app/src/main/res/mipmap-xxhdpi/location_gray_64.png create mode 100644 app/src/main/res/mipmap-xxhdpi/location_red.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_comnav.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_douyin.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_fiofpad.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_geomax.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_huace.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_kuaishou.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_pentax.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_septentrio.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_south.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_surpad.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_ufopad.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_zhd.png create mode 100644 app/src/main/res/mipmap-xxhdpi/logo_zhd_new.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_0.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_1.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_1px_alpha.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_2.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_3.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_4.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_5.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_6.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_6px.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_7.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_8.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_9.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_control_point.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_gq.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_hy.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_hz.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_my_location.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_qd.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_qz.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_record_point.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_settingout_point.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_yh.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_yz.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_zd.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_zh.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_zx.png create mode 100644 app/src/main/res/mipmap-xxhdpi/marker_zy.png create mode 100644 app/src/main/res/mipmap-xxhdpi/phone.png create mode 100644 app/src/main/res/mipmap-xxhdpi/picture_empty.png create mode 100644 app/src/main/res/mipmap-xxhdpi/picture_new.png create mode 100644 app/src/main/res/mipmap-xxhdpi/profile_image.png create mode 100644 app/src/main/res/mipmap-xxhdpi/scan.png create mode 100644 app/src/main/res/mipmap-xxhdpi/tab_instrument_select.png create mode 100644 app/src/main/res/mipmap-xxhdpi/tab_instrument_unselect.png create mode 100644 app/src/main/res/mipmap-xxhdpi/tab_service_select.png create mode 100644 app/src/main/res/mipmap-xxhdpi/tab_service_unselect.png create mode 100644 app/src/main/res/mipmap-xxhdpi/tilt_calibration.gif create mode 100644 app/src/main/res/mipmap-xxhdpi/tilt_megnet.gif create mode 100644 app/src/main/res/mipmap-xxhdpi/watermark.png create mode 100644 app/src/main/res/mipmap-xxhdpi/wepay_logo.png create mode 100644 app/src/main/res/mipmap-zh/icon_point_survey_continue_distance.png create mode 100644 app/src/main/res/mipmap-zh/icon_point_survey_continue_time.png create mode 100644 app/src/main/res/mipmap-zh/icon_point_survey_quick.png create mode 100644 app/src/main/res/mipmap-zh/icon_point_survey_smooth.png create mode 100644 app/src/main/res/raw-zh/origin_tolerance.json create mode 100644 app/src/main/res/raw/changelog.xml create mode 100644 app/src/main/res/raw/origin_tolerance.json create mode 100644 app/src/main/res/raw/savedone.wav create mode 100644 app/src/main/res/raw/septentrio_cut.m4a create mode 100644 app/src/main/res/raw/septentrio_fill.m4a create mode 100644 app/src/main/res/values-hdpi/dimens.xml create mode 100644 app/src/main/res/values-hdpi/styles.xml create mode 100644 app/src/main/res/values-mdpi/dimens.xml create mode 100644 app/src/main/res/values-mdpi/styles.xml create mode 100644 app/src/main/res/values-xhdpi/dimens.xml create mode 100644 app/src/main/res/values-xhdpi/styles.xml create mode 100644 app/src/main/res/values-xlarge/dimens.xml create mode 100644 app/src/main/res/values-xlarge/styles.xml create mode 100644 app/src/main/res/values-xxhdpi/dimens.xml create mode 100644 app/src/main/res/values-xxhdpi/styles.xml create mode 100644 app/src/main/res/values-xxxhdpi/dimens.xml create mode 100644 app/src/main/res/values-xxxhdpi/styles.xml create mode 100644 app/src/main/res/values-zh/arrays.xml create mode 100644 app/src/main/res/values-zh/strings.xml create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/values/attr.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/ids.xml.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/xml-v25/shortcuts.xml create mode 100644 app/src/main/res/xml/network_security_config.xml create mode 100644 app/src/main/res/xml/prefs.xml create mode 100644 app/src/main/res/xml/shortcuts.xml create mode 100644 app/src/main/res/xml/surveyor_settings_prefs.xml create mode 100644 app/src/main/schemas/cn.liuyanbing.surveyor.datasource.database.SurveyorDataBase/14.json create mode 100644 app/src/main/schemas/cn.liuyanbing.surveyor.datasource.database.SurveyorDataBase/15.json create mode 100644 app/src/test/java/TestCase.java create mode 100644 app/src/test/kotlin/Hello.kt create mode 100644 build.gradle create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/src/main/java/com/bingce/ConfigProperties.kt create mode 100644 buildSrc/src/main/java/com/bingce/ModuleName.kt create mode 100644 buildSrc/src/main/java/com/bingce/SurveyorVersionUtils.kt create mode 100644 buildSrc/src/main/java/com/bingce/dependencies.kt create mode 100644 buildSrc/src/main/java/com/bingce/flavor/FlavorItems.java create mode 160000 control_common create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 import-summary.txt create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d293cf1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +#git submodule update --init --recursive +*.hprof +build/ +.vscode/ +.gradle +/local.properties +/.idea +.DS_Store +/captures +/build +/app/build +/app/release +/app/mapping.txt +/app/src/main/libs +/app/src/main/obj +/controlapp/mapping.txt +/controlapp/release +/alpha/build +/alpha/release +/alpha/mapping.txt +/alpha/src/main/schemas/zone.a.dimap.db.RecordsDataBase/1.json +*.iml +.idea +*.jks +obj/ +.cxx/ +*.class +#定制版本 +/app/*/release +/alpha/*/release +/pad/*/release diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a8b9b8d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "control_common"] + path = control_common + url = http://code.bingce.com/BingCe-Android/control_common.git diff --git a/README.md b/README.md new file mode 100644 index 0000000..d592795 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +解放军信息工程导线助手 diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..3f08270 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,2 @@ +/build +*/release \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..38c2fc4 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,143 @@ +//import com.bingce.AndroidSdk +//import com.bingce.SurveyorVersionUtils + +apply plugin: 'com.android.application' +apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'kotlin-kapt' +apply plugin: 'kotlin-parcelize' + +apply from: "../control_common/config.gradle" + +android { + namespace 'com.bingce.controlnetwork' + useLibrary "org.apache.http.legacy" + compileSdk 34 + defaultConfig { + applicationId "com.bingce.controlnetwork" + minSdkVersion 26 + targetSdkVersion 34 + ndk {} + flavorDimensions "custom_made" + multiDexEnabled true + + javaCompileOptions { + annotationProcessorOptions { + arguments = [ + //数据库room + "room.schemaLocation": "$projectDir/src/main/schemas".toString() + ] + } + } + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildFeatures { + viewBinding true + } + + signingConfigs { + debug { + storeFile file('./debug.keystore') + } + } + + def gitCommit = 'git rev-parse --short HEAD'.execute().text.trim() + System.out.println("base-java -- version:${gitCommit}") + + buildTypes { + debug { + signingConfig signingConfigs.debug + buildConfigField "String", "codeVersion", "\"${gitCommit}\"" + } + release { + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + buildConfigField "String", "codeVersion", "\"${gitCommit}\"" + } + } + + //渠道key + // tj61365--天津定制 + def flavor = "tj61365" + + + //多渠道打包 + flavorDimensions 'custom_made' + productFlavors { + //天津版本 + if (flavor == "tj61365") { +// tj61365 { +// dimension 'custom_made' +// buildConfigField "int", "CHANNEL_TYPE", "com.bingce.AppChannel.CUSTOM_CONTROL_TJ_61365" +// versionCode(_versionCode * 100) +// versionName _versionName//"1.3.1" +// } + } + + } + + splits { + abi { + enable true + reset() + include 'arm64-v8a', 'armeabi-v7a'//,'armeabi-v7a', 'x86'//, 'x86_64', 'mips','armeabi', + } + } + + //为了解决部分第三方库重复打包了META-INF的问题 + packagingOptions { + exclude 'META-INF/DEPENDENCIES' + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/NOTICE.txt' + exclude 'META-INF/LICENSE' + exclude 'META-INF/NOTICE' + + exclude 'META-INF/*.kotlin_module' + } + lintOptions { + abortOnError false + disable 'GoogleAppIndexingWarning' + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + +} + +dependencies { + implementation fileTree(include: ['*.jar', '*.aar'], dir: '../control_common/libs') + project.ext.dependencies.each { k, v -> + implementation v + } + project.ext.kapt.each { k, v -> kapt v } + implementation 'com.google.android.gms:play-services-auth:20.7.0' + implementation project(':control_common') + constraints { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") { + because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib") + } + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") { + because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib") + } + } + + def leanCloudVersion = "8.2.16" + implementation "cn.leancloud:storage-android:$leanCloudVersion" + implementation "cn.leancloud:realtime-android:$leanCloudVersion" + + implementation 'com.getbase:floatingactionbutton:1.10.1' + + implementation 'com.github.razir.progressbutton:progressbutton:2.1.0' + implementation "com.mikepenz:materialdrawer:6.1.2" + + testImplementation "junit:junit:4.13.2" + androidTestImplementation "androidx.test:runner:1.1.0" + + def imagepicker = "2.5.6" + implementation "com.github.qingmei2:rximagepicker:$imagepicker" +// implementation "com.github.qingmei2:rximagepicker_support:$imagepicker" +// implementation "com.github.qingmei2:rximagepicker_support_wechat:$imagepicker" +} \ No newline at end of file diff --git a/app/debug.keystore b/app/debug.keystore new file mode 100644 index 0000000000000000000000000000000000000000..5bb84af22019e5f81c8d5bd213874d842712216e GIT binary patch literal 1260 zcmezO_TO6u1_mY|W&~sY#JrTE{LGY;)TGk%?9@u2c!Y7rt!qFvyA7I{wj1!VacQ$L zvM_2f2{JOWGO#o;E%v&R?Q!v%m~Y)FuN?nnS=$z+OTBloIC*sadyyQK_mP$i#s+;^ zn#?9P+q+FU;?=e?te<-BbK<1hxg}vdNe%N)R69#PN?dbqZY`Ylu58BN>67Iv zx6LuVxW!5A{iC4e>l8m2*6zwIQ+_a4u|1;DTifN!+J!0iD16twt-h=%mrBQph*IgiNxTXsIl|HFU&9{F%X zznbKmSAMT}a3nUv<%wE-MB9(~_Isk-V>py`jP2gd$!}DP`cd&dN_54M2PcCR_ui~t zx;oD9X5K3fKI2B$+2KmFA;Y(Tf2Dl{9nEI2}jJLfPc?xqh7t> z+uL!%wdbtp)hyQEqKbWo7AHHD-}|1w3hQqG=;%LqIzudgeXxNCCbM}tq2 zm-7wotoy&id#+RdioQ=Pd?sDLx=*8`di||VUg19;!U3=4i;dojiM%PzZC+@bbo=<4 zL$W{FdVYz|i~dp|!NN85LMgjg=H95fYuCPCEIe7E!S^zA*0YnViayU-J7Lx`<7-vY z?PjcEt1C~g@7>}#U!dH~^xA|sSrK1q)^yG~eg2$;z3qxQ*VGm+QvWlpZSnWUPQM#T zw{yj+qd$3cp53>!(8#ZRBZJ&NuazuZdQL9_e*WB9xp?Z$If34-aA}(nqTsYQtUt8!rIO&Qqj#(8^LLt zHA2tSz!I3E9~v|<-UVVeCPqdBUN%mxHjlRNyujql%3xq_C}tqS#vIDR%){#l$qNcD zpv+(>08INpaV{QqsJJ1w0Vha=O_(V(*g#I4*U-$+(7@Ed+}Om>GD@7+#LUpZ$P&sW z-{8ji$ZiDYIp)S*27|^f4BJ-KOL%xK*DQ>@fXx2)b zjlDNS6pF7-_HX|C;!V;yZh_ekoNg=0yl?ruBWSz9(wfpPp?~RTYQtHI&MNDR&wgXs za^uBxU2)$7#f!_U_A8zjyg0qDBmGxyW9D4d0Gsbe^siU(T{>=?k@orAI-kW7*CJmt zF*7ot2O%@iUG=W&mi0Rx%xC#;TCsV}yH2J{{7s9t=Vv%P4piC3wMaZ`i@3h%sk^(T zU0_z_Eq=ZsYNc8wyI|(Qix>OPYwNquvzC)@ciZ2s`q$&+8Kc9QOICe2^5^li+mfD# z*YufJ`9$tgy<*RFaKDq;$Iw>i`P^ASKP}u_8Cb=Nme$6t=)cIP>;INtX#bv>feT-> N=Pyh(;?LS*4FDEQ7-awe literal 0 HcmV?d00001 diff --git a/app/doc/Untitled-old.mdj b/app/doc/Untitled-old.mdj new file mode 100644 index 0000000..c83fd9d --- /dev/null +++ b/app/doc/Untitled-old.mdj @@ -0,0 +1,44 @@ +{ + "_type": "Project", + "_id": "AAAAAAFF+h6SjaM2Hec=", + "name": "Untitled", + "ownedElements": [ + { + "_type": "UMLModel", + "_id": "AAAAAAFF+qBWK6M3Z8Y=", + "_parent": { + "$ref": "AAAAAAFF+h6SjaM2Hec=" + }, + "name": "Model", + "ownedElements": [ + { + "_type": "UMLStateMachine", + "_id": "AAAAAAF5RXOA7okfG2A=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "StateMachine1", + "ownedElements": [ + { + "_type": "UMLStatechartDiagram", + "_id": "AAAAAAF5RXOA7okhiTg=", + "_parent": { + "$ref": "AAAAAAF5RXOA7okfG2A=" + }, + "name": "StatechartDiagram1" + } + ], + "regions": [ + { + "_type": "UMLRegion", + "_id": "AAAAAAF5RXOA7okgaKU=", + "_parent": { + "$ref": "AAAAAAF5RXOA7okfG2A=" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/app/doc/states.mdj b/app/doc/states.mdj new file mode 100644 index 0000000..fa3a069 --- /dev/null +++ b/app/doc/states.mdj @@ -0,0 +1,36869 @@ +{ + "_type": "Project", + "_id": "AAAAAAFElm5XMFNoGY0=", + "name": "Untitled", + "ownedElements": [ + { + "_type": "UMLModel", + "_id": "AAAAAAFElm6BOFNpegQ=", + "_parent": { + "$ref": "AAAAAAFElm5XMFNoGY0=" + }, + "name": "Model", + "ownedElements": [ + { + "_type": "UMLUseCaseDiagram", + "_id": "AAAAAAF5P5m6Qk1jVXQ=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "UseCaseDiagram1", + "ownedViews": [ + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P5nMr01oLTI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P5nMr01pxLs=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P5nMr01qZlQ=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01pxLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 224, + "top": 352, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5nMr01rWkA=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01pxLs=" + }, + "font": "Arial;13;1", + "left": 132, + "top": 187.5, + "width": 62, + "height": 13, + "text": "check2C" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5nMr01srVY=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01pxLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 224, + "top": 352, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5nMr01tKAI=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01pxLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 224, + "top": 352, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 127, + "top": 180.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P5nMr01qZlQ=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P5nMr01rWkA=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P5nMr01srVY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P5nMr01tKAI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P5nMr01u10s=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P5nMr01vn/8=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5nMr01wvTc=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P5nMr01xNvU=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P5nMr01yEgM=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 176, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 112, + "top": 176, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P5nMr01pxLs=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P5nMr01u10s=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P5nMr01vn/8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5nMr01wvTc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P5nMr01xNvU=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P5nMr01yEgM=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P5rmBE2YaOM=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P5rmBE2WOV0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P5rmBE2Z1VU=", + "_parent": { + "$ref": "AAAAAAF5P5rmBE2YaOM=" + }, + "model": { + "$ref": "AAAAAAF5P5rmBE2WOV0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P5rmBE2awCc=", + "_parent": { + "$ref": "AAAAAAF5P5rmBE2Z1VU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -112, + "top": -368, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5rmBE2bxgA=", + "_parent": { + "$ref": "AAAAAAF5P5rmBE2Z1VU=" + }, + "font": "Arial;13;1", + "left": 367, + "top": 83.5, + "width": 75, + "height": 13, + "text": "recordClean" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5rmBU2c6aQ=", + "_parent": { + "$ref": "AAAAAAF5P5rmBE2Z1VU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -112, + "top": -368, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5rmBU2dJfU=", + "_parent": { + "$ref": "AAAAAAF5P5rmBE2Z1VU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -112, + "top": -368, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 362, + "top": 76.5, + "width": 85.86083984375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P5rmBE2awCc=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P5rmBE2bxgA=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P5rmBU2c6aQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P5rmBU2dJfU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P5rmBU2e6A8=", + "_parent": { + "$ref": "AAAAAAF5P5rmBE2YaOM=" + }, + "model": { + "$ref": "AAAAAAF5P5rmBE2WOV0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -56, + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P5rmBU2f+Vc=", + "_parent": { + "$ref": "AAAAAAF5P5rmBE2YaOM=" + }, + "model": { + "$ref": "AAAAAAF5P5rmBE2WOV0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -56, + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5rmBU2gXnU=", + "_parent": { + "$ref": "AAAAAAF5P5rmBE2YaOM=" + }, + "model": { + "$ref": "AAAAAAF5P5rmBE2WOV0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -56, + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P5rmBU2hbLU=", + "_parent": { + "$ref": "AAAAAAF5P5rmBE2YaOM=" + }, + "model": { + "$ref": "AAAAAAF5P5rmBE2WOV0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -56, + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P5rmBU2iePg=", + "_parent": { + "$ref": "AAAAAAF5P5rmBE2YaOM=" + }, + "model": { + "$ref": "AAAAAAF5P5rmBE2WOV0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -56, + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 344, + "top": 72, + "width": 121, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P5rmBE2Z1VU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P5rmBU2e6A8=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P5rmBU2f+Vc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5rmBU2gXnU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P5rmBU2hbLU=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P5rmBU2iePg=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P5saWE3J2FY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3K1ts=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "font": "Arial;13;0", + "left": 248, + "top": 121, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 1, + "text": "+通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3LIi0=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 271, + "top": 107, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3M7xA=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 288, + "top": 148, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3NmNI=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03GReQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 221, + "top": 144, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3Oy1k=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03GReQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 218, + "top": 131, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3PZiY=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03GReQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 228, + "top": 171, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3QKR0=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03HrLQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 332, + "top": 97, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3RVpc=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03HrLQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 324, + "top": 86, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3S3i0=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03HrLQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 347, + "top": 121, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P5saWE3TepE=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03GReQ=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P5saWE3U3g4=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03HrLQ=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P5rmBE2YaOM=" + }, + "tail": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "lineStyle": 1, + "points": "204:175;362:107", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P5saWE3K1ts=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P5saWE3LIi0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P5saWE3M7xA=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P5saWE3NmNI=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P5saWE3Oy1k=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P5saWE3PZiY=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P5saWE3QKR0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P5saWE3RVpc=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P5saWE3S3i0=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P5saWE3TepE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P5saWE3U3g4=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P56LZE6M/G8=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P56LZE6NeNY=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P56LZE6OE2I=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6NeNY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -464, + "top": -224, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P56LZE6PKW0=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6NeNY=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 205, + "top": 283.5, + "width": 103, + "height": 13, + "text": "【用户选择操作】" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P56LZE6QSXM=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6NeNY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -464, + "top": -224, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P56LZE6RMmU=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6NeNY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -464, + "top": -224, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 200, + "top": 276.5, + "width": 114, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P56LZE6OE2I=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P56LZE6PKW0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P56LZE6QSXM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P56LZE6RMmU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P56LZE6SLIg=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -232, + "top": -112, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P56LZE6TWFg=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -232, + "top": -112, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P56LZE6U8ts=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -232, + "top": -112, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P56LZE6VNIk=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -232, + "top": -112, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P56LZE6W1sE=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -232, + "top": -112, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 176, + "top": 272, + "width": 161, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P56LZE6NeNY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P56LZE6SLIg=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P56LZE6TWFg=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P56LZE6U8ts=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P56LZE6VNIk=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P56LZE6W1sE=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P56tgE7IY7E=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7JO9U=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "font": "Arial;13;0", + "left": 183, + "top": 224, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 1, + "text": "+未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7Kkjk=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 230, + "top": 214, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7LlPE=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 198, + "top": 245, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7MSF4=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7F7Yk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 208, + "top": 213, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7NsLs=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7F7Yk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 219, + "top": 205, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7OBww=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7F7Yk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 186, + "top": 229, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7PoMY=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7GNNA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 230, + "top": 235, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7Q0NM=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7GNNA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 238, + "top": 225, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7RtW8=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7GNNA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 213, + "top": 258, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P56tgE7SCeE=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7F7Yk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P56tgE7TSmw=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7GNNA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "tail": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "lineStyle": 1, + "points": "180:211;238:271", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P56tgE7JO9U=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P56tgE7Kkjk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P56tgE7LlPE=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P56tgE7MSF4=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P56tgE7NsLs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P56tgE7OBww=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P56tgE7PoMY=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P56tgE7Q0NM=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P56tgE7RtW8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P56tgE7SCeE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P56tgE7TSmw=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P5/CAk98zZc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P5/CAk99r9g=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P5/CA09+uJY=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk99r9g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 64, + "top": -64, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5/CA09/h4M=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk99r9g=" + }, + "font": "Arial;13;1", + "left": 764, + "top": 467.5, + "width": 62, + "height": 13, + "text": "Idle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5/CA0+AvMQ=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk99r9g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 64, + "top": -64, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5/CA0+BODA=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk99r9g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 64, + "top": -64, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 759, + "top": 460.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P5/CA09+uJY=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P5/CA09/h4M=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P5/CA0+AvMQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P5/CA0+BODA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P5/CA0+CFD4=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 32, + "top": -32, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P5/CA0+DO7Q=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 32, + "top": -32, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5/CA0+EZ7w=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 32, + "top": -32, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P5/CA0+FMSM=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 32, + "top": -32, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P5/CA0+GOcA=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 32, + "top": -32, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 744, + "top": 456, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P5/CAk99r9g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P5/CA0+CFD4=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P5/CA0+DO7Q=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5/CA0+EZ7w=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P5/CA0+FMSM=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P5/CA0+GOcA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P5/ask/ENuY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/FCi8=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "font": "Arial;13;0", + "left": 300, + "top": 372, + "width": 124.22798156738281, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 1, + "text": "+选择忽略or重测目标" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/GmBY=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 373, + "top": 362, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/H9Os=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 341, + "top": 393, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/ITgo=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/BASE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 301, + "top": 309, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/J3dw=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/BASE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 312, + "top": 301, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/KH+Q=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/BASE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 279, + "top": 325, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/LwxI=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/CwwU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 424, + "top": 435, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/MCSM=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/CwwU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": 425, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/N7rw=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/CwwU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 407, + "top": 458, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P5/ask/OUQY=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/BASE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P5/ask/P3tM=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/CwwU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "lineStyle": 1, + "points": "273:307;432:471", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P5/ask/FCi8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P5/ask/GmBY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P5/ask/H9Os=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P5/ask/ITgo=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P5/ask/J3dw=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P5/ask/KH+Q=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P5/ask/LwxI=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P5/ask/MCSM=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P5/ask/N7rw=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P5/ask/OUQY=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P5/ask/P3tM=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P6Btl1DS04s=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P6Btl1DTuQ4=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P6Btl1DUbE8=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DTuQ4=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -1072, + "top": 160, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6BtmFDVnHI=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DTuQ4=" + }, + "fillColor": "#ffadad", + "font": "Arial;13;1", + "left": 74.5, + "top": 411.5, + "width": 207, + "height": 13, + "text": "【提示用户是否确定删除整个测回】" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6BtmFDW1Rc=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DTuQ4=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -1072, + "top": 160, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6BtmFDXJZ4=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DTuQ4=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -1072, + "top": 160, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 69.5, + "top": 404.5, + "width": 218, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6Btl1DUbE8=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P6BtmFDVnHI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P6BtmFDW1Rc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6BtmFDXJZ4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P6BtmFDYzoo=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -536, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P6BtmFDZfOA=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -536, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P6BtmFDabNE=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -536, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P6BtmFDbcVg=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -536, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P6BtmFDcrag=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -536, + "top": 80, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 24, + "top": 400, + "width": 308, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P6Btl1DTuQ4=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P6BtmFDYzoo=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P6BtmFDZfOA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P6BtmFDabNE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P6BtmFDbcVg=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P6BtmFDcrag=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P6ETu1Fw08c=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFFx1mw=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "font": "Arial;13;0", + "left": 199, + "top": 354, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 1, + "text": "+重测测回" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFFyw0s=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 241, + "top": 362, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFFzyRs=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 203, + "top": 339, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF0+lY=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1FtUvs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 244, + "top": 330, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF1ok8=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1FtUvs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 254, + "top": 339, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF2wKI=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1FtUvs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 222, + "top": 312, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF3tbw=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fuzfc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 214, + "top": 378, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF4Oc0=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fuzfc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 226, + "top": 383, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF586k=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fuzfc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 188, + "top": 368, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6ETvFF6xek=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1FtUvs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6ETvFF7szs=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fuzfc=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "tail": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "lineStyle": 1, + "points": "245:307;188:399", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P6ETvFFx1mw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6ETvFFyw0s=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6ETvFFzyRs=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P6ETvFF0+lY=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P6ETvFF1ok8=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P6ETvFF2wKI=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P6ETvFF3tbw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P6ETvFF4Oc0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P6ETvFF586k=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P6ETvFF6xek=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P6ETvFF7szs=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P6HZl1JC23Y=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JDZsQ=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "font": "Arial;13;0", + "left": 267, + "top": 432, + "width": 98.22798156738281, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 1, + "text": "+选择忽略or取消" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JECIw=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 320, + "top": 417, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JF8pk=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 309, + "top": 461, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JG0HA=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I/u/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 273, + "top": 421, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JHztQ=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I/u/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 279, + "top": 408, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JIPD0=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I/u/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 262, + "top": 446, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JJLUs=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1JAt1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 359, + "top": 443, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JKFgU=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1JAt1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 360, + "top": 430, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JLM+Y=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1JAt1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 356, + "top": 471, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6HZl1JMru0=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I/u/s=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6HZl1JNqZA=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1JAt1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "lineStyle": 1, + "points": "245:435;381:471", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P6HZl1JDZsQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6HZl1JECIw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6HZl1JF8pk=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P6HZl1JG0HA=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P6HZl1JHztQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P6HZl1JIPD0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P6HZl1JJLUs=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P6HZl1JKFgU=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P6HZl1JLM+Y=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P6HZl1JMru0=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P6HZl1JNqZA=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P6IYDFMMeFQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P6IYDFMNnzQ=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P6IYDFMOOjk=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMNnzQ=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -1536, + "top": 544, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6IYDVMPgvc=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMNnzQ=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 125, + "top": 531.5, + "width": 103, + "height": 13, + "text": "【执行删除操作】" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6IYDVMQezU=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMNnzQ=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -1536, + "top": 544, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6IYDVMRBdM=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMNnzQ=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -1536, + "top": 544, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 120, + "top": 524.5, + "width": 114, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6IYDFMOOjk=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P6IYDVMPgvc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P6IYDVMQezU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6IYDVMRBdM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P6IYDVMSZQE=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -768, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P6IYDVMTe6E=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -768, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P6IYDVMUviY=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -768, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P6IYDVMVT7Q=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -768, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P6IYDVMWeEE=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -768, + "top": 272, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 96, + "top": 520, + "width": 161, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P6IYDFMNnzQ=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P6IYDVMSZQE=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P6IYDVMTe6E=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P6IYDVMUviY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P6IYDVMVT7Q=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P6IYDVMWeEE=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P6Jc6FQAXTQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6FQBsAA=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "font": "Arial;13;0", + "left": 161, + "top": 470, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 1, + "text": "+确认删除" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6FQCliU=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 205, + "top": 470, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6FQDs0Y=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 161, + "top": 471, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQErUI=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP9Ay0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 191, + "top": 455, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQFXc4=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP9Ay0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 204, + "top": 457, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQGACw=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP9Ay0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 164, + "top": 450, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQH5rw=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP+W/w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 191, + "top": 487, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQIDDY=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP+W/w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 204, + "top": 485, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQJXs0=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP+W/w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 163, + "top": 491, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6Jc6VQKiwE=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP9Ay0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6Jc6VQLymI=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP+W/w=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "tail": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "lineStyle": 1, + "points": "177:435;176:519", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P6Jc6FQBsAA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6Jc6FQCliU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6Jc6FQDs0Y=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P6Jc6VQErUI=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P6Jc6VQFXc4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P6Jc6VQGACw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P6Jc6VQH5rw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P6Jc6VQIDDY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P6Jc6VQJXs0=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P6Jc6VQKiwE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P6Jc6VQLymI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P6KuWFYy590=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFYzBrY=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 409, + "top": 536, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY07+U=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 410, + "top": 521, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY1T2M=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 406, + "top": 565, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY2uTU=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYvXto=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 284, + "top": 525, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY3Q0s=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYvXto=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 287, + "top": 512, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY4NMQ=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYvXto=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 277, + "top": 552, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY5sZg=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYwtmg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 534, + "top": 547, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY62Oo=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYwtmg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 533, + "top": 534, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY78L8=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYwtmg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 536, + "top": 575, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6KuWFY8wFs=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYvXto=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 376, + "top": -144, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6KuWVY9b40=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYwtmg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 376, + "top": -144, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "lineStyle": 1, + "points": "257:544;559:571", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P6KuWFYzBrY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6KuWFY07+U=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6KuWFY1T2M=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P6KuWFY2uTU=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P6KuWFY3Q0s=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P6KuWFY4NMQ=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P6KuWFY5sZg=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P6KuWFY62Oo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P6KuWFY78L8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P6KuWFY8wFs=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P6KuWVY9b40=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJWvCwgzk0M=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJWvCwg0EPw=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJWvCwg1NpM=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwg0EPw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "top": 2032, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJWvCwg2wKE=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwg0EPw=" + }, + "font": "Arial;13;1", + "left": 1144, + "top": 1419.5, + "width": 119, + "height": 13, + "text": "move2NextValidate" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJWvCwg3lvo=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwg0EPw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "top": 2032, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJWvCwg4tCw=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwg0EPw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "top": 2032, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1139, + "top": 1412.5, + "width": 129, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJWvCwg1NpM=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJWvCwg2wKE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJWvCwg3lvo=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJWvCwg4tCw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJWvCwg5PfY=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 352, + "top": 1016, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJWvDAg6ClE=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 352, + "top": 1016, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJWvDAg7Ros=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 352, + "top": 1016, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJWvDAg8tC0=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 352, + "top": 1016, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJWvDAg9Vl8=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 352, + "top": 1016, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1112, + "top": 1408, + "width": 183, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJWvCwg0EPw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJWvCwg5PfY=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJWvDAg6ClE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJWvDAg7Ros=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJWvDAg8tC0=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJWvDAg9Vl8=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJc4CA2oNI0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJc4CA2p+Dw=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2oNI0=" + }, + "model": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJc4CA2qdmU=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2p+Dw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1808, + "top": -848, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJc4CA2r3po=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2p+Dw=" + }, + "font": "Arial;13;1", + "left": 1081, + "top": 339.5, + "width": 124, + "height": 13, + "text": "checkHalfCycleZero" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJc4CA2s9SY=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2p+Dw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1808, + "top": -848, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJc4CA2tVXo=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2p+Dw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1808, + "top": -848, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1076, + "top": 332.5, + "width": 134.28076171875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJc4CA2qdmU=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJc4CA2r3po=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJc4CA2s9SY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJc4CA2tVXo=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJc4CA2uA/U=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2oNI0=" + }, + "model": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 904, + "top": -424, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJc4CQ2vtIA=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2oNI0=" + }, + "model": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 904, + "top": -424, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJc4CQ2wvoY=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2oNI0=" + }, + "model": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 904, + "top": -424, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJc4CQ2xB7c=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2oNI0=" + }, + "model": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 904, + "top": -424, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJc4CQ2yPQg=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2oNI0=" + }, + "model": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 904, + "top": -424, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1048, + "top": 328, + "width": 190, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJc4CA2p+Dw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJc4CA2uA/U=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJc4CQ2vtIA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJc4CQ2wvoY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJc4CQ2xB7c=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJc4CQ2yPQg=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJeXAw9Y7Yc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJeXAw9WAQQ=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJeXAw9Z7G0=", + "_parent": { + "$ref": "AAAAAAF5QJeXAw9Y7Yc=" + }, + "model": { + "$ref": "AAAAAAF5QJeXAw9WAQQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJeXAw9azp8=", + "_parent": { + "$ref": "AAAAAAF5QJeXAw9Z7G0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1936, + "top": -752, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJeXAw9b8aE=", + "_parent": { + "$ref": "AAAAAAF5QJeXAw9Z7G0=" + }, + "font": "Arial;13;1", + "left": 1469, + "top": 219.5, + "width": 105, + "height": 13, + "text": "isReady2CCheck" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJeXAw9cphk=", + "_parent": { + "$ref": "AAAAAAF5QJeXAw9Z7G0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1936, + "top": -752, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJeXAw9dhRA=", + "_parent": { + "$ref": "AAAAAAF5QJeXAw9Z7G0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1936, + "top": -752, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1464, + "top": 212.5, + "width": 115.498046875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJeXAw9azp8=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJeXAw9b8aE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJeXAw9cphk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJeXAw9dhRA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJeXAw9eiUw=", + "_parent": { + "$ref": "AAAAAAF5QJeXAw9Y7Yc=" + }, + "model": { + "$ref": "AAAAAAF5QJeXAw9WAQQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 968, + "top": -376, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJeXAw9fQSo=", + "_parent": { + "$ref": "AAAAAAF5QJeXAw9Y7Yc=" + }, + "model": { + "$ref": "AAAAAAF5QJeXAw9WAQQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 968, + "top": -376, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJeXAw9gktM=", + "_parent": { + "$ref": "AAAAAAF5QJeXAw9Y7Yc=" + }, + "model": { + "$ref": "AAAAAAF5QJeXAw9WAQQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 968, + "top": -376, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJeXAw9hx78=", + "_parent": { + "$ref": "AAAAAAF5QJeXAw9Y7Yc=" + }, + "model": { + "$ref": "AAAAAAF5QJeXAw9WAQQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 968, + "top": -376, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJeXAw9iEQ8=", + "_parent": { + "$ref": "AAAAAAF5QJeXAw9Y7Yc=" + }, + "model": { + "$ref": "AAAAAAF5QJeXAw9WAQQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 968, + "top": -376, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1440, + "top": 208, + "width": 163, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJeXAw9Z7G0=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJeXAw9eiUw=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJeXAw9fQSo=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJeXAw9gktM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJeXAw9hx78=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJeXAw9iEQ8=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJesYRAYGmw=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYRAZQUY=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "font": "Arial;13;0", + "left": 1232, + "top": 264, + "width": 189.2279815673828, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 1, + "text": "+测站不闭合or半测回归零差正常" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYRAa+X8=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1321, + "top": 250, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYRAb41g=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1335, + "top": 293, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAcFHE=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAV/Pw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1219, + "top": 298, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAdnH8=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAV/Pw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1217, + "top": 285, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAeLA0=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAV/Pw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1223, + "top": 326, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAfocQ=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAWIno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1434, + "top": 230, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAgNDY=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAWIno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1428, + "top": 218, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAh4Q4=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAWIno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1447, + "top": 255, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJesYhAiBdg=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAV/Pw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": -144, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJesYhAjzjQ=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAWIno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": -144, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJeXAw9Y7Yc=" + }, + "tail": { + "$ref": "AAAAAAF5QJc4CA2oNI0=" + }, + "lineStyle": 1, + "points": "1199:327;1464:243", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJesYRAZQUY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJesYRAa+X8=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJesYRAb41g=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJesYhAcFHE=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJesYhAdnH8=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJesYhAeLA0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJesYhAfocQ=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJesYhAgNDY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJesYhAh4Q4=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJesYhAiBdg=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJesYhAjzjQ=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJjLZRML/gk=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJjLZRMMO54=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJjLZRMN0eQ=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRMMO54=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -96, + "top": 32, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJjLZRMOGnw=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRMMO54=" + }, + "fillColor": "#8282ff", + "font": "Arial;13;1", + "left": 380, + "top": 483.5, + "width": 139, + "height": 13, + "text": "switchState2StandStill" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJjLZRMPJsQ=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRMMO54=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -96, + "top": 32, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJjLZRMQZsw=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRMMO54=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -96, + "top": 32, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 375, + "top": 476.5, + "width": 149.419921875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJjLZRMN0eQ=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJjLZRMOGnw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJjLZRMPJsQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJjLZRMQZsw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJjLZRMRZxg=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -48, + "top": 16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJjLZRMSuGM=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -48, + "top": 16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJjLZRMTa74=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -48, + "top": 16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJjLZRMUk04=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -48, + "top": 16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJjLZRMVcTY=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -48, + "top": 16, + "width": 10, + "height": 10 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 344, + "top": 472, + "width": 211, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJjLZRMMO54=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJjLZRMRZxg=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJjLZRMSuGM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJjLZRMTa74=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJjLZRMUk04=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJjLZRMVcTY=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJk5ohVYjKI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJk5ohVZ7LA=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJk5ohVaBvo=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVZ7LA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 528, + "top": -368, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJk5ohVbtSw=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVZ7LA=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 669, + "top": 387.5, + "width": 142, + "height": 13, + "text": "提示半测回归零检测失败" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJk5ohVc1ns=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVZ7LA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 528, + "top": -368, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJk5ohVdnqY=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVZ7LA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 528, + "top": -368, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 664, + "top": 380.5, + "width": 153, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJk5ohVaBvo=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJk5ohVbtSw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJk5ohVc1ns=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJk5ohVdnqY=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJk5ohVeC3M=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 264, + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJk5ohVfd1M=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 264, + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJk5ohVg6Qc=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 264, + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJk5ohVh4ZY=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 264, + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJk5ohViitY=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 264, + "top": -184, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 632, + "top": 376, + "width": 216, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJk5ohVZ7LA=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJk5ohVeC3M=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJk5ohVfd1M=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJk5ohVg6Qc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJk5ohVh4ZY=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJk5ohViitY=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJmQwBdwdmk=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwBdxb3k=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "font": "Arial;13;0", + "left": 906, + "top": 376, + "width": 85.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 1, + "text": "+没有通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRdyFDg=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 950, + "top": 391, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRdzOi4=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 945, + "top": 347, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd0cxc=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdt/Nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1023, + "top": 368, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd1+jk=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdt/Nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1022, + "top": 381, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd2je8=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdt/Nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1024, + "top": 340, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd3aOM=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdu0wk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 875, + "top": 385, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd4cEI=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdu0wk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 879, + "top": 398, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd5h7I=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdu0wk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 867, + "top": 358, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJmQwRd6XO0=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdt/Nk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJmQwRd7bPQ=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdu0wk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "tail": { + "$ref": "AAAAAAF5QJc4CA2oNI0=" + }, + "lineStyle": 1, + "points": "1047:356;848:380", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJmQwBdxb3k=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJmQwRdyFDg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJmQwRdzOi4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJmQwRd0cxc=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJmQwRd1+jk=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJmQwRd2je8=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJmQwRd3aOM=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJmQwRd4cEI=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJmQwRd5h7I=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJmQwRd6XO0=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJmQwRd7bPQ=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJnHsRkO52k=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkPXt4=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 598, + "top": 449, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkQg5M=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 603, + "top": 463, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkRfd8=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 589, + "top": 420, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkS/7E=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkLdTo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 665, + "top": 427, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkTUvo=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkLdTo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 666, + "top": 440, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkU2kA=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkLdTo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 660, + "top": 399, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkVrbg=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkM5N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 532, + "top": 471, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkWL5A=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkM5N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 538, + "top": 483, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkXIlE=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkM5N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 519, + "top": 446, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJnHsRkYjF0=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkLdTo=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJnHsRkZRp4=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkM5N4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "lineStyle": 1, + "points": "685:411;503:471", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJnHsRkPXt4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJnHsRkQg5M=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJnHsRkRfd8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJnHsRkS/7E=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJnHsRkTUvo=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJnHsRkU2kA=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJnHsRkVrbg=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJnHsRkWL5A=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJnHsRkXIlE=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJnHsRkYjF0=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJnHsRkZRp4=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJnk3hnngQ0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnoFuM=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 648, + "top": 458, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnpzsU=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 647, + "top": 443, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnqowI=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 649, + "top": 487, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnr2A8=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnk4S8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 580, + "top": 461, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnsPz4=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnk4S8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 581, + "top": 448, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnt7X0=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnk4S8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 577, + "top": 489, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnuPbw=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnlvxc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 716, + "top": 455, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnvOwA=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnlvxc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 713, + "top": 442, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnwvuU=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnlvxc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 721, + "top": 482, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJnk3hnxCbA=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnk4S8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJnk3hny8xs=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnlvxc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "tail": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "lineStyle": 1, + "points": "555:484;743:475", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJnk3hnoFuM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJnk3hnpzsU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJnk3hnqowI=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJnk3hnr2A8=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJnk3hnsPz4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJnk3hnt7X0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJnk3hnuPbw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJnk3hnvOwA=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJnk3hnwvuU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJnk3hnxCbA=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJnk3hny8xs=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJ6ahiPXyXI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJ6ahiPYzM0=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ6ahiPZdhA=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPYzM0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 208, + "top": -896, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ6ahiPa2BQ=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPYzM0=" + }, + "font": "Arial;13;1", + "left": 795.5, + "top": 123.5, + "width": 96, + "height": 13, + "text": "checkReadData" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ6ahyPb1CY=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPYzM0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 208, + "top": -896, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ6ahyPcSJM=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPYzM0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 208, + "top": -896, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 790.5, + "top": 116.5, + "width": 106.8271484375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ6ahiPZdhA=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJ6ahiPa2BQ=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJ6ahyPb1CY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ6ahyPcSJM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJ6ahyPdwvQ=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 104, + "top": -448, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJ6ahyPeius=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 104, + "top": -448, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJ6ahyPfDuE=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 104, + "top": -448, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJ6ahyPgVJE=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 104, + "top": -448, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJ6ahyPhyOw=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 104, + "top": -448, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 768, + "top": 112, + "width": 151, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJ6ahiPYzM0=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJ6ahyPdwvQ=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJ6ahyPeius=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJ6ahyPfDuE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJ6ahyPgVJE=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJ6ahyPhyOw=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJ8m8Sf6ofY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJ8m8Sf7JBU=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ8m8Sf8/hc=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf7JBU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1088, + "top": -1280, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ8m8Sf9x9A=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf7JBU=" + }, + "font": "Arial;13;1", + "left": 1044, + "top": 107.5, + "width": 175, + "height": 13, + "text": "isHalfCycleZeroCheckReady" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ8m8Sf+ddw=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf7JBU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1088, + "top": -1280, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ8m8Sf/cbI=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf7JBU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1088, + "top": -1280, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1039, + "top": 100.5, + "width": 186.2998046875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ8m8Sf8/hc=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJ8m8Sf9x9A=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJ8m8Sf+ddw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ8m8Sf/cbI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJ8m8SgAs+Y=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 544, + "top": -640, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJ8m8SgBoKU=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 544, + "top": -640, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJ8m8SgCMgY=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 544, + "top": -640, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJ8m8SgDeic=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 544, + "top": -640, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJ8m8SgEIBM=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 544, + "top": -640, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1000, + "top": 96, + "width": 263, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJ8m8Sf7JBU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJ8m8SgAs+Y=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJ8m8SgBoKU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJ8m8SgCMgY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJ8m8SgDeic=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJ8m8SgEIBM=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJ87PCkCJ2c=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkD2ew=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "font": "Arial;13;0", + "left": 903, + "top": 101, + "width": 111.22798156738281, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 1, + "text": "+单测量or通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkEHYk=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 957, + "top": 86, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkFD0M=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 959, + "top": 130, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkGBOM=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj/TJQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 943, + "top": 102, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkHciQ=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj/TJQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 945, + "top": 89, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkI53k=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj/TJQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 941, + "top": 130, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkJ5DY=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87OykA4RY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 972, + "top": 100, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkKd2s=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87OykA4RY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 969, + "top": 87, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkLnCE=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87OykA4RY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 978, + "top": 127, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ87PCkMizE=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj/TJQ=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ87PCkNuH0=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87OykA4RY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "tail": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "lineStyle": 1, + "points": "919:125;999:120", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJ87PCkD2ew=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ87PCkEHYk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ87PCkFD0M=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJ87PCkGBOM=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJ87PCkHciQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJ87PCkI53k=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJ87PCkJ5DY=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJ87PCkKd2s=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJ87PCkLnCE=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJ87PCkMizE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJ87PCkNuH0=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJ+mRitZ0H0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJ+mRitad0o=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ+mRitbxtk=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitad0o=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 544, + "top": -784, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ+mRytcRUc=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitad0o=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 591.5, + "top": 179.5, + "width": 77, + "height": 13, + "text": "提示读数有误" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ+mRytdKoM=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitad0o=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 544, + "top": -784, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ+mRytecXk=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitad0o=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 544, + "top": -784, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 586.5, + "top": 172.5, + "width": 88, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ+mRitbxtk=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJ+mRytcRUc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJ+mRytdKoM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ+mRytecXk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJ+mRytf9wc=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 272, + "top": -392, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJ+mRytgl/8=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 272, + "top": -392, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJ+mRythGBg=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 272, + "top": -392, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJ+mRytiPDo=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 272, + "top": -392, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJ+mRytjdZM=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 272, + "top": -392, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 568, + "top": 168, + "width": 124, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJ+mRitad0o=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJ+mRytf9wc=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJ+mRytgl/8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJ+mRythGBg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJ+mRytiPDo=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJ+mRytjdZM=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJ/UgywlH50=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/Ugywm6Cw=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "font": "Arial;13;0", + "left": 700, + "top": 166, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 1, + "text": "+未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UgywnNpM=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 740, + "top": 180, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UgywoaZM=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 729, + "top": 137, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCwpjOU=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywiha4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": 162, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCwqyBI=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywiha4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 754, + "top": 175, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCwrLDA=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywiha4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 749, + "top": 134, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCws+Vw=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/UgywjRPE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 720, + "top": 170, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCwtL5c=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/UgywjRPE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 726, + "top": 182, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCwuYNo=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/UgywjRPE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 709, + "top": 145, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ/UhCwvaPk=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywiha4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ/UhCwwUDY=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/UgywjRPE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "tail": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "lineStyle": 1, + "points": "774:147;692:169", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJ/Ugywm6Cw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ/UgywnNpM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ/UgywoaZM=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJ/UhCwpjOU=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJ/UhCwqyBI=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJ/UhCwrLDA=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJ/UhCws+Vw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJ/UhCwtL5c=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJ/UhCwuYNo=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJ/UhCwvaPk=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJ/UhCwwUDY=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJ/0PC0CShY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0DtlQ=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 551, + "top": 338, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0ETCk=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 564, + "top": 346, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0FS9M=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 526, + "top": 323, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0G2RA=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz/2CU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 617, + "top": 226, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0HEgs=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz/2CU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 628, + "top": 235, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0IKu8=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz/2CU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 596, + "top": 209, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0JtjU=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PC0AjHo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 486, + "top": 450, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0KkBY=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PC0AjHo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 498, + "top": 454, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0LEUU=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PC0AjHo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 460, + "top": 440, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ/0PS0MAmo=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz/2CU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ/0PS0Nb0Y=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PC0AjHo=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "lineStyle": 1, + "points": "618:203;460:471", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJ/0PS0DtlQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ/0PS0ETCk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ/0PS0FS9M=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJ/0PS0G2RA=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJ/0PS0HEgs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJ/0PS0IKu8=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJ/0PS0JtjU=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJ/0PS0KkBY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJ/0PS0LEUU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJ/0PS0MAmo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJ/0PS0Nb0Y=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKE6Ojfzjv0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKE6Ojf0W9Y=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKE6Ojf12Ns=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojf0W9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1472, + "top": 352, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKE6Ojf2D5I=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojf0W9Y=" + }, + "font": "Arial;13;1", + "left": 1342, + "top": 1123.5, + "width": 110, + "height": 13, + "text": "checkSingleCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKE6Ojf3N+g=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojf0W9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1472, + "top": 352, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKE6Ojf4rrM=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojf0W9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1472, + "top": 352, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1337, + "top": 1116.5, + "width": 120.55712890625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKE6Ojf12Ns=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKE6Ojf2D5I=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKE6Ojf3N+g=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKE6Ojf4rrM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKE6Ojf5X6A=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 736, + "top": 176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKE6Ojf6i5o=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 736, + "top": 176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKE6Ojf7hDo=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 736, + "top": 176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKE6Ojf8oq8=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 736, + "top": 176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKE6Ojf9edk=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 736, + "top": 176, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1312, + "top": 1112, + "width": 170, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKE6Ojf0W9Y=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKE6Ojf5X6A=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKE6Ojf6i5o=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKE6Ojf7hDo=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKE6Ojf8oq8=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKE6Ojf9edk=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKIG+T9Y4ko=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKIG+T9Zl2o=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKIG+T9a7vU=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Zl2o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1408, + "top": 544, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKIG+T9bDug=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Zl2o=" + }, + "font": "Arial;13;1", + "left": 1386, + "top": 1299.5, + "width": 129, + "height": 13, + "text": "isAllCycleCompleted" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKIG+T9cIfM=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Zl2o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1408, + "top": 544, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKIG+T9dArI=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Zl2o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1408, + "top": 544, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1381, + "top": 1292.5, + "width": 139.314453125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKIG+T9a7vU=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKIG+T9bDug=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKIG+T9cIfM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKIG+T9dArI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKIG+T9e1Wk=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKIG+T9fRvU=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKIG+T9gBhM=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKIG+T9hA48=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKIG+T9inVI=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "top": 272, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1352, + "top": 1288, + "width": 197, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKIG+T9Zl2o=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKIG+T9e1Wk=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKIG+T9fRvU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKIG+T9gBhM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKIG+T9hA48=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKIG+T9inVI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QKI4zEKHpSc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKIQ1c=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "font": "Arial;13;0", + "left": 1408, + "top": 1206, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 1, + "text": "+通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKJdn8=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1451, + "top": 1202, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKKTG0=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1408, + "top": 1215, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKL0+I=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKEuw8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1423, + "top": 1161, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKMDrE=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKEuw8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1437, + "top": 1159, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKNoT0=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKEuw8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1396, + "top": 1165, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKOx2g=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKFtZg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1450, + "top": 1251, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKP85E=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKFtZg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1462, + "top": 1245, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKQLJU=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKFtZg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1425, + "top": 1263, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QKI4zEKR1Nc=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKEuw8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QKI4zEKSZgo=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKFtZg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "tail": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "lineStyle": 1, + "points": "1402:1147;1444:1287", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QKI4zEKIQ1c=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKI4zEKJdn8=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKI4zEKKTG0=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QKI4zEKL0+I=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QKI4zEKMDrE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QKI4zEKNoT0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QKI4zEKOx2g=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QKI4zEKP85E=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QKI4zEKQLJU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QKI4zEKR1Nc=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QKI4zEKSZgo=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKuCwkzY630=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKuCwkzZLtk=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKuCwkzadw4=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzZLtk=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1872, + "top": 48, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKuCwkzbRGU=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzZLtk=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 1463.5, + "top": 963.5, + "width": 77, + "height": 13, + "text": "提示用户选择" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKuCwkzc5kQ=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzZLtk=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1872, + "top": 48, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKuCwkzd3VI=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzZLtk=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1872, + "top": 48, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1458.5, + "top": 956.5, + "width": 88, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKuCwkzadw4=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKuCwkzbRGU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKuCwkzc5kQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKuCwkzd3VI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKuCw0zeMMo=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 936, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKuCw0zfhJM=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 936, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKuCw0zgO20=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 936, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKuCw0zhG3k=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 936, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKuCw0ziN7I=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 936, + "top": 24, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1440, + "top": 952, + "width": 124, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKuCwkzZLtk=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKuCw0zeMMo=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKuCw0zfhJM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKuCw0zgO20=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKuCw0zhG3k=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKuCw0ziN7I=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QKvMIE8ZF/E=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8a1To=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "font": "Arial;13;0", + "left": 1399, + "top": 1034, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 1, + "text": "+未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8bx7Y=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1422, + "top": 1026, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8c/MU=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1460, + "top": 1051, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8df1Y=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8WKCE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1409, + "top": 1075, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8e89E=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8WKCE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1399, + "top": 1065, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8frKE=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8WKCE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1430, + "top": 1093, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8gpg0=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8XsG8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1462, + "top": 994, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8hUUs=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8XsG8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1449, + "top": 989, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8iPfY=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8XsG8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1487, + "top": 1005, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QKvMIU8jJRc=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8WKCE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QKvMIU8kteI=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8XsG8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "tail": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "lineStyle": 1, + "points": "1408:1111;1489:987", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QKvMIU8a1To=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKvMIU8bx7Y=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKvMIU8c/MU=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QKvMIU8df1Y=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QKvMIU8e89E=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QKvMIU8frKE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QKvMIU8gpg0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QKvMIU8hUUs=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QKvMIU8iPfY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QKvMIU8jJRc=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QKvMIU8kteI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKyR6VB+5F0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKyR6VB/sq8=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKyR6lCAlIw=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB/sq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 320, + "top": -272, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKyR6lCBFDc=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB/sq8=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 956, + "top": 731.5, + "width": 62, + "height": 13, + "text": "重测方向" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKyR6lCC81I=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB/sq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 320, + "top": -272, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKyR6lCDFwk=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB/sq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 320, + "top": -272, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 951, + "top": 724.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKyR6lCAlIw=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKyR6lCBFDc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKyR6lCC81I=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKyR6lCDFwk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKyR6lCEof0=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 160, + "top": -136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKyR6lCFl5A=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 160, + "top": -136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKyR6lCGLz0=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 160, + "top": -136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKyR6lCHKbg=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 160, + "top": -136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKyR6lCIqJE=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 160, + "top": -136, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 936, + "top": 720, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKyR6VB/sq8=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKyR6lCEof0=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKyR6lCFl5A=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKyR6lCGLz0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKyR6lCHKbg=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKyR6lCIqJE=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKysH1F4naw=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKysH1F5Vw8=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKysH1F6t1U=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F5Vw8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 672, + "top": -512, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKysH1F7w44=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F5Vw8=" + }, + "fillColor": "#ffadad", + "font": "Arial;13;1", + "left": 1172, + "top": 675.5, + "width": 62, + "height": 13, + "text": "重测测回" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKysH1F8ews=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F5Vw8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 672, + "top": -512, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKysH1F9CVk=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F5Vw8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 672, + "top": -512, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 1167, + "top": 668.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKysH1F6t1U=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKysH1F7w44=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKysH1F8ews=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKysH1F9CVk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKysH1F+SbI=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 336, + "top": -256, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKysH1F/p8w=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 336, + "top": -256, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKysH1GAwRg=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 336, + "top": -256, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKysH1GBWy4=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 336, + "top": -256, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKysH1GC8OE=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 336, + "top": -256, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1152, + "top": 664, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKysH1F5Vw8=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKysH1F+SbI=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKysH1F/p8w=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKysH1GAwRg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKysH1GBWy4=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKysH1GC8OE=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKzDRVJysxE=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKzDRVJztrc=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKzDRVJ0nsk=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJztrc=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 752, + "top": -1088, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKzDRVJ1z+Q=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJztrc=" + }, + "fillColor": "#8282ff", + "font": "Arial;13;1", + "left": 1238.5, + "top": 443.5, + "width": 226, + "height": 13, + "text": "resetSurveyorStateAndKeepPosition" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKzDRVJ29Q0=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJztrc=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 752, + "top": -1088, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKzDRVJ3D90=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJztrc=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 752, + "top": -1088, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 1233.5, + "top": 436.5, + "width": 237.5634765625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKzDRVJ0nsk=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKzDRVJ1z+Q=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKzDRVJ29Q0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKzDRVJ3D90=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKzDRVJ4vK0=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 376, + "top": -544, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKzDRVJ5ijM=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 376, + "top": -544, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKzDRVJ6ScY=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 376, + "top": -544, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKzDRVJ71p4=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 376, + "top": -544, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKzDRVJ8l2g=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 376, + "top": -544, + "width": 10, + "height": 10 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1184, + "top": 432, + "width": 335, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKzDRVJztrc=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKzDRVJ4vK0=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKzDRVJ5ijM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKzDRVJ6ScY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKzDRVJ71p4=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKzDRVJ8l2g=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QK2QmFlvdS8=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFlwJfE=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "font": "Arial;13;0", + "left": 1395, + "top": 707, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 1, + "text": "+忽略" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFlxSkY=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1397, + "top": 711, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFly6tM=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1440, + "top": 698, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFlzr3g=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lsCzU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1474, + "top": 924, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFl0RxM=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lsCzU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1460, + "top": 925, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFl1X3o=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lsCzU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1501, + "top": 920, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFl29pE=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1ltUBY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1348, + "top": 490, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFl39y0=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1ltUBY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1336, + "top": 496, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFl4Ns0=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1ltUBY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1374, + "top": 478, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QK2QmFl5muU=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lsCzU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QK2QmFl6Y7A=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1ltUBY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "tail": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "lineStyle": 1, + "points": "1496:951;1356:467", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QK2QmFlwJfE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QK2QmFlxSkY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QK2QmFly6tM=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QK2QmFlzr3g=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QK2QmFl0RxM=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QK2QmFl1X3o=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QK2QmFl29pE=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QK2QmFl39y0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QK2QmFl4Ns0=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QK2QmFl5muU=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QK2QmFl6Y7A=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QK340l0Fv9Q=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0GnqQ=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1014, + "top": 471, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0Habc=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1015, + "top": 486, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0IZgE=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1013, + "top": 442, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0Jr30=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0ChAw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1157, + "top": 466, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0KziQ=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0ChAw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1156, + "top": 479, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0LSAI=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0ChAw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1160, + "top": 438, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0MEF0=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0D79M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 872, + "top": 478, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0NAX0=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0D79M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 875, + "top": 491, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0Obj8=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0D79M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 867, + "top": 451, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QK340l0PZLk=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0ChAw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QK340l0QvTM=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0D79M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "tail": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "lineStyle": 1, + "points": "1183:456;846:471", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QK340l0GnqQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QK340l0Habc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QK340l0IZgE=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QK340l0Jr30=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QK340l0KziQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QK340l0LSAI=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QK340l0MEF0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QK340l0NAX0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QK340l0Obj8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QK340l0PZLk=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QK340l0QvTM=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QLdiXGHqtMU=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHrPm0=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1236, + "top": 860, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHsNrs=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1230, + "top": 874, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHtajM=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1249, + "top": 833, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHu5Ak=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HnzLc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1431, + "top": 948, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHvESE=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HnzLc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1423, + "top": 959, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHwu2c=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HnzLc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1446, + "top": 924, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHxgP0=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HodP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1043, + "top": 773, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHyZg0=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HodP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1040, + "top": 786, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHzjfw=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HodP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1050, + "top": 746, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QLdiXGH0aoo=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HnzLc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": -72, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QLdiXGH1FM8=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HodP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": -72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "tail": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "lineStyle": 1, + "points": "1461:951;1026:755", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QLdiXGHrPm0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QLdiXGHsNrs=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QLdiXGHtajM=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QLdiXGHu5Ak=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QLdiXGHvESE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QLdiXGHwu2c=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QLdiXGHxgP0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QLdiXGHyZg0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QLdiXGHzjfw=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QLdiXGH0aoo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QLdiXGH1FM8=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QLwOJ2bPDnI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QLwOJ2bQ8Ro=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QLwOJ2bRPfA=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bQ8Ro=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 560, + "top": -528, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QLwOJ2bSTVM=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bQ8Ro=" + }, + "fillColor": "#5656ff", + "font": "Arial;13;1", + "left": 1090.5, + "top": 587.5, + "width": 93, + "height": 13, + "text": "resurveyPoints" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QLwOJ2bTKUY=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bQ8Ro=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 560, + "top": -528, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QLwOJ2bUBI4=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bQ8Ro=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 560, + "top": -528, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 1085.5, + "top": 580.5, + "width": 103.9326171875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QLwOJ2bRPfA=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QLwOJ2bSTVM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QLwOJ2bTKUY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QLwOJ2bUBI4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QLwOJ2bVEa0=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 280, + "top": -264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QLwOJ2bWae0=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 280, + "top": -264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QLwOJ2bXEAg=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 280, + "top": -264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QLwOKGbYe7A=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 280, + "top": -264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QLwOKGbZQqo=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 280, + "top": -264, + "width": 10, + "height": 10 + } + ], + "fillColor": "#5656ff", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1064, + "top": 576, + "width": 146, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QLwOJ2bQ8Ro=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QLwOJ2bVEa0=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QLwOJ2bWae0=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QLwOJ2bXEAg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QLwOKGbYe7A=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QLwOKGbZQqo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QLx6RGoNnGE=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoOcBM=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1050, + "top": 648, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoPkXM=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1040, + "top": 637, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoQUT8=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1071, + "top": 669, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoRB9A=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoKxZI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1013, + "top": 684, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoSk+A=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoKxZI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1005, + "top": 673, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoT8Lo=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoKxZI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1029, + "top": 706, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoUHro=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoLs1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1087, + "top": 612, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoVk68=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoLs1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1077, + "top": 604, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoW9No=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoLs1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1110, + "top": 629, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QLx6RGoXj7U=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoKxZI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QLx6RGoYmUk=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoLs1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "tail": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "lineStyle": 1, + "points": "1005:719;1117:611", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QLx6RGoOcBM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QLx6RGoPkXM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QLx6RGoQUT8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QLx6RGoRB9A=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QLx6RGoSk+A=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QLx6RGoT8Lo=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QLx6RGoUHro=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QLx6RGoVk68=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QLx6RGoW9No=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QLx6RGoXj7U=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QLx6RGoYmUk=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QMaQUG/rlG8=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QMaQUG/sv3A=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QMaQUG/tkJ4=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/sv3A=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -448, + "top": -256, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QMaQUG/umGY=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/sv3A=" + }, + "fillColor": "#8282ff", + "font": "Arial;13;1", + "left": 612.5, + "top": 579.5, + "width": 216, + "height": 13, + "text": "switchState2RestartInCurrentCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QMaQUW/vdlU=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/sv3A=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -448, + "top": -256, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QMaQUW/w0wQ=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/sv3A=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -448, + "top": -256, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 607.5, + "top": 572.5, + "width": 227.4580078125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QMaQUG/tkJ4=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QMaQUG/umGY=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QMaQUW/vdlU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QMaQUW/w0wQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QMaQUW/x48o=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -224, + "top": -128, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QMaQUW/yJ84=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -224, + "top": -128, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QMaQUW/z4XE=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -224, + "top": -128, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QMaQUW/0u+w=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -224, + "top": -128, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QMaQUW/13YU=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -224, + "top": -128, + "width": 10, + "height": 10 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 560, + "top": 568, + "width": 321, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QMaQUG/sv3A=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QMaQUW/x48o=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QMaQUW/yJ84=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QMaQUW/z4XE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QMaQUW/0u+w=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QMaQUW/13YU=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QMbzEXNQ00I=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNR/aw=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "font": "Arial;13;0", + "left": 942, + "top": 598, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 1, + "text": "+开始重测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNSJUg=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 971, + "top": 613, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNTTKw=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 972, + "top": 569, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNUT2s=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNNh8o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1036, + "top": 600, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNVmq4=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNNh8o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1034, + "top": 613, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNWUrs=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNNh8o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1041, + "top": 573, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNX73U=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNOm6M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 906, + "top": 597, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNYoLo=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNOm6M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 908, + "top": 610, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNZwIQ=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNOm6M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 902, + "top": 569, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMbzEXNaGMo=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNNh8o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMbzEXNbVPI=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNOm6M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "lineStyle": 1, + "points": "1063:592;881:588", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QMbzEXNR/aw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QMbzEXNSJUg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QMbzEXNTTKw=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QMbzEXNUT2s=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QMbzEXNVmq4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QMbzEXNWUrs=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QMbzEXNX73U=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QMbzEXNYoLo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QMbzEXNZwIQ=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QMbzEXNaGMo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QMbzEXNbVPI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QMjEp4Xxm70=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4XyXqY=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 973, + "top": 991, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4XzTSE=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 986, + "top": 984, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X0hBs=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 948, + "top": 1006, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X1sYc=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXuicM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 755, + "top": 612, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X2bX4=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXuicM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 768, + "top": 607, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X3ebc=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXuicM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 729, + "top": 621, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X4oDY=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXvKNs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1193, + "top": 1371, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X5UnY=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXvKNs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1203, + "top": 1362, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X6pQM=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXvKNs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1171, + "top": 1388, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMjEqIX7oU8=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXuicM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMjEqIX8oCk=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXvKNs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "tail": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "lineStyle": 1, + "points": "730:603;1193:1407", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QMjEp4XyXqY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QMjEp4XzTSE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QMjEp4X0hBs=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QMjEp4X1sYc=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QMjEp4X2bX4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QMjEp4X3ebc=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QMjEp4X4oDY=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QMjEp4X5UnY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QMjEp4X6pQM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QMjEqIX7oU8=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QMjEqIX8oCk=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QMnaf4p31wI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p4YhA=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1340, + "top": 829, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p5heM=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1330, + "top": 840, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p6u/E=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1361, + "top": 808, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p7HWo=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p0R7o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1452, + "top": 937, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p8uO8=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p0R7o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1442, + "top": 945, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p9ZYk=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p0R7o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1475, + "top": 920, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p+8dA=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p1n0A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1229, + "top": 721, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p/pOU=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p1n0A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1221, + "top": 732, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4qAet8=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p1n0A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1245, + "top": 699, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMnaf4qBmzo=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p0R7o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 696, + "top": 8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMnaf4qCCtY=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p1n0A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 696, + "top": 8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "tail": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "lineStyle": 1, + "points": "1482:951;1221:699", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QMnaf4p4YhA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QMnaf4p5heM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QMnaf4p6u/E=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QMnaf4p7HWo=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QMnaf4p8uO8=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QMnaf4p9ZYk=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QMnaf4p+8dA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QMnaf4p/pOU=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QMnaf4qAet8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QMnaf4qBmzo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QMnaf4qCCtY=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QNAhapFuI7s=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapFvVXY=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "font": "Arial;13;0", + "left": 1312, + "top": 829, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 1, + "text": "+取消" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapFwVCE=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1336, + "top": 817, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapFxPvQ=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1311, + "top": 854, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapFyOWw=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFrudc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1242, + "top": 705, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapFz3Mw=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFrudc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1254, + "top": 699, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapF0mvQ=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFrudc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1217, + "top": 717, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAha5F1FkI=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFsZZ8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1460, + "top": 918, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAha5F2OJ8=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFsZZ8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1466, + "top": 905, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAha5F3+WU=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFsZZ8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1449, + "top": 943, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QNAha5F4AZU=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFrudc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 744, + "top": -56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QNAha5F5UgE=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFsZZ8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 744, + "top": -56, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "tail": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "lineStyle": 1, + "points": "1215:699;1320:848;1474:951", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QNAhapFvVXY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QNAhapFwVCE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QNAhapFxPvQ=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QNAhapFyOWw=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QNAhapFz3Mw=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QNAhapF0mvQ=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QNAha5F1FkI=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QNAha5F2OJ8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QNAha5F3+WU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QNAha5F4AZU=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QNAha5F5UgE=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QNFL66Cbz6k=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66CcWkE=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "font": "Arial;13;0", + "left": 1247, + "top": 550, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 1, + "text": "+忽略" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66CdTo8=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1250, + "top": 542, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66Ce+u8=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1288, + "top": 567, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66CfR+U=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCY2AQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1215, + "top": 627, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66Cg04o=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCY2AQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1205, + "top": 617, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66ChcXw=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCY2AQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1236, + "top": 645, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66CipGA=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCZ01s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1312, + "top": 474, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66Cj6oQ=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCZ01s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1299, + "top": 469, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66Ck0os=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCZ01s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1337, + "top": 485, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QNFL66ClLUo=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCY2AQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 696, + "top": 8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QNFL66Cm8No=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCZ01s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 696, + "top": 8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "tail": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "lineStyle": 1, + "points": "1214:663;1339:467", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QNFL66CcWkE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QNFL66CdTo8=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QNFL66Ce+u8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QNFL66CfR+U=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QNFL66Cg04o=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QNFL66ChcXw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QNFL66CipGA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QNFL66Cj6oQ=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QNFL66Ck0os=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QNFL66ClLUo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QNFL66Cm8No=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RVTun0vZBv0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vaxdo=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "font": "Arial;13;0", + "left": 1205, + "top": 502, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 1, + "text": "+重测失败" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vbxuQ=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1226, + "top": 490, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vcmj8=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1251, + "top": 527, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vdoCc=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vWQ0U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1176, + "top": 542, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0ved/I=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vWQ0U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1170, + "top": 529, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vfAMs=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vWQ0U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1187, + "top": 567, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vg9C0=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vXr0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1294, + "top": 463, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTuoEvhMzo=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vXr0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1284, + "top": 453, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTuoEviZLY=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vXr0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1312, + "top": 483, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVTuoEvjqMY=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vWQ0U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVTuoEvkZEE=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vXr0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "tail": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "lineStyle": 1, + "points": "1163:575;1324:467", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RVTun0vaxdo=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RVTun0vbxuQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RVTun0vcmj8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RVTun0vdoCc=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RVTun0ved/I=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RVTun0vfAMs=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RVTun0vg9C0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RVTuoEvhMzo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RVTuoEviZLY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RVTuoEvjqMY=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RVTuoEvkZEE=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RVWv21Zu6Aw=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv21ZvsKs=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1032, + "top": 1458, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv21ZwRzk=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1034, + "top": 1473, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv21ZxCSk=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1027, + "top": 1429, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv21Zyej0=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZro+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1087, + "top": 1451, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv21ZzuYg=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZro+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1086, + "top": 1464, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv3FZ0MPo=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZro+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1087, + "top": 1423, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv3FZ18no=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZs/XI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 977, + "top": 1467, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv3FZ21Iw=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZs/XI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 981, + "top": 1480, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv3FZ3nLg=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZs/XI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 969, + "top": 1440, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVWv3FZ4weo=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZro+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVWv3FZ58yM=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZs/XI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "tail": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "lineStyle": 1, + "points": "1111:1439;950:1462", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RVWv21ZvsKs=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RVWv21ZwRzk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RVWv21ZxCSk=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RVWv21Zyej0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RVWv21ZzuYg=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RVWv3FZ0MPo=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RVWv3FZ18no=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RVWv3FZ21Iw=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RVWv3FZ3nLg=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RVWv3FZ4weo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RVWv3FZ58yM=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RVbpp1nKVhc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RVbpp1nLusg=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RVbpqFnM530=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nLusg=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 1680, + "top": -704, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RVbpqFnNEWc=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nLusg=" + }, + "fillColor": "#ffadad", + "font": "Arial;13;1", + "left": 1095.5, + "top": 819.5, + "width": 77, + "height": 13, + "text": "执行测回删除" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RVbpqFnO5/0=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nLusg=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 1680, + "top": -704, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RVbpqFnPMMU=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nLusg=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 1680, + "top": -704, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 1090.5, + "top": 812.5, + "width": 88, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RVbpqFnM530=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RVbpqFnNEWc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RVbpqFnO5/0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RVbpqFnPMMU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RVbpqFnQqa0=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 840, + "top": -352, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RVbpqFnRVaY=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 840, + "top": -352, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RVbpqFnSiyY=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 840, + "top": -352, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RVbpqFnTp/o=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 840, + "top": -352, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RVbpqFnUeVQ=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 840, + "top": -352, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1072, + "top": 808, + "width": 124, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RVbpp1nLusg=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RVbpqFnQqa0=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RVbpqFnRVaY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RVbpqFnSiyY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RVbpqFnTp/o=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RVbpqFnUeVQ=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RVcwNF0lj/I=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0m640=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1180, + "top": 753, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0n9pE=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1194, + "top": 759, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0osMg=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1153, + "top": 740, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0pne0=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0iVWE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1195, + "top": 722, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0qTm8=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0iVWE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1206, + "top": 730, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0rLrQ=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0iVWE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1172, + "top": 707, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0s558=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0jQf0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1166, + "top": 783, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0tAew=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0jQf0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1179, + "top": 787, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0uE34=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0jQf0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1139, + "top": 776, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVcwNF0vsAE=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0iVWE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": 8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVcwNF0w5ls=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0jQf0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": 8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "tail": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "lineStyle": 1, + "points": "1193:699;1142:807", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RVcwNF0m640=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RVcwNF0n9pE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RVcwNF0osMg=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RVcwNF0pne0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RVcwNF0qTm8=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RVcwNF0rLrQ=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RVcwNF0s558=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RVcwNF0tAew=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RVcwNF0uE34=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RVcwNF0vsAE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RVcwNF0w5ls=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RVdEqmBOVoU=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBP7Mw=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 918, + "top": 711, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBQ+G0=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 910, + "top": 724, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBRwAI=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 933, + "top": 686, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBSb60=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBL2Ro=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1072, + "top": 800, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBT13s=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBL2Ro=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1063, + "top": 811, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBU/V0=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBL2Ro=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1089, + "top": 779, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBVD2o=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBMaWs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 765, + "top": 623, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBWru8=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBMaWs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 761, + "top": 635, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBX1jY=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBMaWs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 775, + "top": 597, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVdEqmBYqxc=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBL2Ro=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVdEqmBZh5U=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBMaWs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "lineStyle": 1, + "points": "1102:807;751:603", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RVdEqmBP7Mw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RVdEqmBQ+G0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RVdEqmBRwAI=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RVdEqmBSb60=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RVdEqmBT13s=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RVdEqmBU/V0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RVdEqmBVD2o=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RVdEqmBWru8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RVdEqmBX1jY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RVdEqmBYqxc=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RVdEqmBZh5U=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RWbWiJQ+LqI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RWbWiJQ/pQw=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RWbWiJRAz/w=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ/pQw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1808, + "top": 368, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWbWiJRBIu8=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ/pQw=" + }, + "font": "Arial;13;1", + "left": 594, + "top": 819.5, + "width": 167, + "height": 13, + "text": "doCalScheduleSingleCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWbWiJRCluw=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ/pQw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1808, + "top": 368, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWbWiJRDVic=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ/pQw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1808, + "top": 368, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 589, + "top": 812.5, + "width": 177.603515625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWbWiJRAz/w=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RWbWiJRBIu8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RWbWiJRCluw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWbWiJRDVic=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RWbWiJRE0bA=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -904, + "top": 184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RWbWiJRF/Bs=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -904, + "top": 184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RWbWiJRG03U=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -904, + "top": 184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RWbWiJRHoKE=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -904, + "top": 184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RWbWiZRIksM=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -904, + "top": 184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 552, + "top": 808, + "width": 251, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RWbWiJQ/pQw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RWbWiJRE0bA=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RWbWiJRF/Bs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RWbWiJRG03U=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RWbWiJRHoKE=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RWbWiZRIksM=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RWiYh6tfjKM=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RWiYh6tg64I=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RWiYh6th8ec=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tg64I=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -1424, + "top": 416, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWiYh6tiGF8=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tg64I=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 703.5, + "top": 931.5, + "width": 116, + "height": 13, + "text": "该测回是否完成测量" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWiYh6tjmMc=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tg64I=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -1424, + "top": 416, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWiYh6tktDE=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tg64I=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -1424, + "top": 416, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 698.5, + "top": 924.5, + "width": 127, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWiYh6th8ec=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RWiYh6tiGF8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RWiYh6tjmMc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWiYh6tktDE=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RWiYh6tlfk4=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -712, + "top": 208, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RWiYh6tmr4M=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -712, + "top": 208, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RWiYiKtnqn4=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -712, + "top": 208, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RWiYiKtodLM=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -712, + "top": 208, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RWiYiKtpwlU=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -712, + "top": 208, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 672, + "top": 920, + "width": 179, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RWiYh6tg64I=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RWiYh6tlfk4=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RWiYh6tmr4M=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RWiYiKtnqn4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RWiYiKtodLM=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RWiYiKtpwlU=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RWkDsK/8U8w=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsK/9X9k=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 730, + "top": 865, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsK/+yfw=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 742, + "top": 856, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsK//l9E=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 707, + "top": 884, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLAAR6U=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/5hKI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 718, + "top": 848, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLAB24o=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/5hKI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 730, + "top": 842, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLACKmw=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/5hKI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 693, + "top": 861, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLADQMw=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/6Fyk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 744, + "top": 883, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLAEjZI=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/6Fyk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 753, + "top": 873, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLAFuWM=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/6Fyk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 725, + "top": 903, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWkDsLAGH8s=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/5hKI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1160, + "top": 208, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWkDsLAHEmo=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/6Fyk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1160, + "top": 208, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "tail": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "lineStyle": 1, + "points": "691:843;748:919", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RWkDsK/9X9k=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWkDsK/+yfw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWkDsK//l9E=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RWkDsLAAR6U=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RWkDsLAB24o=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RWkDsLACKmw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RWkDsLADQMw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RWkDsLAEjZI=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RWkDsLAFuWM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RWkDsLAGH8s=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RWkDsLAHEmo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RWmAObijdJg=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObikqE4=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "font": "Arial;13;0", + "left": 702, + "top": 756, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 1, + "text": "+未完成" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObilnCo=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 710, + "top": 758, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObima+o=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 754, + "top": 753, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObinxIM=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObigyuY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 741, + "top": 888, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObioxZQ=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObigyuY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 727, + "top": 888, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObip4S4=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObigyuY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 768, + "top": 890, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObiqN8s=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObih5u0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 710, + "top": 624, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObir6/Y=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObih5u0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 697, + "top": 628, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObisLv4=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObih5u0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 736, + "top": 617, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWmAObitY30=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObigyuY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -888, + "top": 512, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWmAObiuohI=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObih5u0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -888, + "top": 512, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "lineStyle": 1, + "points": "759:919;722:603", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RWmAObikqE4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWmAObilnCo=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWmAObima+o=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RWmAObinxIM=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RWmAObioxZQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RWmAObip4S4=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RWmAObiqN8s=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RWmAObir6/Y=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RWmAObisLv4=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RWmAObitY30=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RWmAObiuohI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RWo+Isgcitc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RWo+Isgdtvs=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RWo+Isge0Bo=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgdtvs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 496, + "top": -256, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWo+Isgf4GU=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgdtvs=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 658, + "top": 1051.5, + "width": 90, + "height": 13, + "text": "执行单测回检测" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWo+Isgg0Do=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgdtvs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 496, + "top": -256, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWo+IsghCRI=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgdtvs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 496, + "top": -256, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 653, + "top": 1044.5, + "width": 101, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWo+Isge0Bo=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RWo+Isgf4GU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RWo+Isgg0Do=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWo+IsghCRI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RWo+IsgimWA=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 248, + "top": -128, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RWo+IsgjYQU=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 248, + "top": -128, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RWo+I8gkz+0=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 248, + "top": -128, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RWo+I8gl0UM=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 248, + "top": -128, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RWo+I8gmRYk=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 248, + "top": -128, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 632, + "top": 1040, + "width": 142, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RWo+Isgdtvs=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RWo+IsgimWA=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RWo+IsgjYQU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RWo+I8gkz+0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RWo+I8gl0UM=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RWo+I8gmRYk=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RWqc88vvIe4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88vwQ3o=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "font": "Arial;13;0", + "left": 728, + "top": 997, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 1, + "text": "+完成" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88vxT8A=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 758, + "top": 1003, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88vy9C4=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 717, + "top": 984, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88vzWws=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svs8AE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 754, + "top": 978, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88v0Sh0=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svs8AE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 765, + "top": 986, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88v168Q=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svs8AE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 731, + "top": 962, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88v2l68=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svtE1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 735, + "top": 1016, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88v3ThA=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svtE1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 748, + "top": 1019, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88v4wsI=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svtE1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 709, + "top": 1008, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWqc88v5V34=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svs8AE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWqc88v6Awc=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svtE1U=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "tail": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "lineStyle": 1, + "points": "752:955;711:1039", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RWqc88vwQ3o=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWqc88vxT8A=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWqc88vy9C4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RWqc88vzWws=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RWqc88v0Sh0=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RWqc88v168Q=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RWqc88v2l68=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RWqc88v3ThA=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RWqc88v4wsI=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RWqc88v5V34=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RWqc88v6Awc=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RWvJyNWG+ro=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJyNWHf5E=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "font": "Arial;13;0", + "left": 1068, + "top": 991, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 1, + "text": "+未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWI+RY=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1102, + "top": 976, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWJFaw=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1107, + "top": 1020, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWKHVg=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWDYLg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 798, + "top": 1025, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWLzSM=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWDYLg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 799, + "top": 1011, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWM5GE=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWDYLg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 796, + "top": 1053, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWN+wY=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWEI/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1411, + "top": 957, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWO3W0=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWEI/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1407, + "top": 944, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWPqsM=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWEI/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1418, + "top": 984, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWvJydWQnX8=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWDYLg=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWvJydWRolw=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWEI/s=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "tail": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "lineStyle": 1, + "points": "774:1049;1439:976", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RWvJyNWHf5E=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWvJydWI+RY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWvJydWJFaw=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RWvJydWKHVg=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RWvJydWLzSM=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RWvJydWM5GE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RWvJydWN+wY=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RWvJydWO3W0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RWvJydWPqsM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RWvJydWQnX8=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RWvJydWRolw=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RWzzg+QpJu4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RWzzg+QqF0g=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RWzzg+QruaM=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QqF0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -800, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWzzg+QscXo=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QqF0g=" + }, + "font": "Arial;13;1", + "left": 1093.5, + "top": 907.5, + "width": 144, + "height": 13, + "text": "doCalScheduleAllCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWzzg+QtTVY=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QqF0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -800, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWzzg+QuN+0=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QqF0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -800, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1088.5, + "top": 900.5, + "width": 155.208984375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWzzg+QruaM=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RWzzg+QscXo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RWzzg+QtTVY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWzzg+QuN+0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RWzzg+QvVhA=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": -400, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RWzzhOQwWI4=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": -400, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RWzzhOQxyn0=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": -400, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RWzzhOQy5lE=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": -400, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RWzzhOQzPbk=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": -400, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1056, + "top": 896, + "width": 219, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RWzzg+QqF0g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RWzzg+QvVhA=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RWzzhOQwWI4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RWzzhOQxyn0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RWzzhOQy5lE=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RWzzhOQzPbk=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RXS1EJdHVug=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EJdIPgY=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 953, + "top": 934, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EJdJc8o=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 954, + "top": 949, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdKavs=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 952, + "top": 905, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdLggY=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dEJJs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1029, + "top": 930, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdMTYk=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dEJJs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1028, + "top": 943, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdNexM=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dEJJs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1032, + "top": 902, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdOTNQ=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dF2N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 877, + "top": 939, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdPiGs=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dF2N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 880, + "top": 952, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdQDNw=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dF2N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 871, + "top": 912, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXS1EZdR8Jw=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dEJJs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXS1EZdSgUI=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dF2N4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "tail": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "lineStyle": 1, + "points": "1055:920;851:932", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RXS1EJdIPgY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RXS1EJdJc8o=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RXS1EZdKavs=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RXS1EZdLggY=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RXS1EZdMTYk=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RXS1EZdNexM=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RXS1EZdOTNQ=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RXS1EZdPiGs=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RXS1EZdQDNw=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RXS1EZdR8Jw=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RXS1EZdSgUI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RXZT37eTFkI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RXZT37eUYGs=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RXZT37eVlUE=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eUYGs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -768, + "top": -352, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RXZT37eWL9s=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eUYGs=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 75, + "top": 683.5, + "width": 209, + "height": 13, + "text": "是否是doCalScheduleAllCycle状态" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RXZT37eXM1A=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eUYGs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -768, + "top": -352, + "width": 73.67724609375, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RXZT37eYXNc=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eUYGs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -768, + "top": -352, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 70, + "top": 676.5, + "width": 220.208984375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RXZT37eVlUE=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RXZT37eWL9s=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RXZT37eXM1A=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RXZT37eYXNc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RXZT4LeZ09I=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -384, + "top": -176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RXZT4LeaFc4=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -384, + "top": -176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RXZT4Leb1Fs=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -384, + "top": -176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RXZT4Lec37Q=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -384, + "top": -176, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RXZT4Led934=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -384, + "top": -176, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 24, + "top": 672, + "width": 311, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RXZT37eUYGs=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RXZT4LeZ09I=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RXZT4LeaFc4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RXZT4Leb1Fs=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RXZT4Lec37Q=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RXZT4Led934=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RXgsFM1PXPQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1QsVQ=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "font": "Arial;13;0", + "left": 415, + "top": 879, + "width": 33.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 1, + "text": "+通过" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1Ra4g=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 422, + "top": 891, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1S7Hk=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 448, + "top": 854, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1TpZY=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ml9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 646, + "top": 1030, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1UfIs=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ml9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 636, + "top": 1039, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1VQJk=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ml9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 665, + "top": 1010, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1WeYo=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ncj4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 217, + "top": 728, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1XNlM=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ncj4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 211, + "top": 740, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1Y+GY=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ncj4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 229, + "top": 703, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXgsFc1ZbPg=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ml9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXgsFc1aqC8=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ncj4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "tail": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "lineStyle": 1, + "points": "676:1039;205:707", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RXgsFM1QsVQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RXgsFM1Ra4g=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RXgsFM1S7Hk=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RXgsFM1TpZY=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RXgsFM1UfIs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RXgsFM1VQJk=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RXgsFM1WeYo=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RXgsFM1XNlM=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RXgsFM1Y+GY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RXgsFc1ZbPg=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RXgsFc1aqC8=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RXiiXNaNYZA=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaOCjk=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "font": "Arial;13;0", + "left": 289, + "top": 570, + "width": 33.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 1, + "text": "+不是" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaPvOQ=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 296, + "top": 558, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaQrNs=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 322, + "top": 595, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaRjEI=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aKkno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 214, + "top": 637, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaS5Dg=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aKkno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 208, + "top": 625, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaT/jE=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aKkno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 227, + "top": 662, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaUStc=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aL3M4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 395, + "top": 504, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaVtIQ=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aL3M4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 385, + "top": 495, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaWcc8=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aL3M4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 415, + "top": 523, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXiiXNaXeGE=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aKkno=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXiiXNaY4kk=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aL3M4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "lineStyle": 1, + "points": "203:671;425:507", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RXiiXNaOCjk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RXiiXNaPvOQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RXiiXNaQrNs=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RXiiXNaRjEI=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RXiiXNaS5Dg=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RXiiXNaT/jE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RXiiXNaUStc=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RXiiXNaVtIQ=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RXiiXNaWcc8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RXiiXNaXeGE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RXiiXNaY4kk=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RX4IzuDknh4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RX4IzuDlZLU=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RX4IzuDmg8A=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDlZLU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -240, + "top": -240, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX4IzuDnpIw=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDlZLU=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 69, + "top": 1043.5, + "width": 181, + "height": 13, + "text": "检测其他测回是否有待补测数据" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX4IzuDoCnY=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDlZLU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -240, + "top": -240, + "width": 73.67724609375, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX4IzuDpft0=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDlZLU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -240, + "top": -240, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 64, + "top": 1036.5, + "width": 192, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX4IzuDmg8A=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RX4IzuDnpIw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RX4IzuDoCnY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX4IzuDpft0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RX4IzuDqBSE=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RX4IzuDrpSs=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RX4IzuDsUmU=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RX4IzuDtPH4=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RX4IzuDu2iA=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": -120, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 24, + "top": 1032, + "width": 271, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RX4IzuDlZLU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RX4IzuDqBSE=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RX4IzuDrpSs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RX4IzuDsUmU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RX4IzuDtPH4=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RX4IzuDu2iA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RX50xuaSWVY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaTzmw=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "font": "Arial;13;0", + "left": 173, + "top": 863, + "width": 20.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 1, + "text": "+是" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaUoZk=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 198, + "top": 864, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaVv9g=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 154, + "top": 862, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaWjUs=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaPW6s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 191, + "top": 727, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaX0wc=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaPW6s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 204, + "top": 730, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaYr8k=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaPW6s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 164, + "top": 721, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaZPzE=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaQJxA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 176, + "top": 999, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaaRl8=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaQJxA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 189, + "top": 998, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuabK8k=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaQJxA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 148, + "top": 1002, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX50xuac8yw=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaPW6s=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX50xuadjR8=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaQJxA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "tail": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "lineStyle": 1, + "points": "178:707;160:1031", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RX50xuaTzmw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX50xuaUoZk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX50xuaVv9g=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RX50xuaWjUs=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RX50xuaX0wc=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RX50xuaYr8k=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RX50xuaZPzE=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RX50xuaaRl8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RX50xuabK8k=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RX50xuac8yw=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RX50xuadjR8=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RX8e8+6VSP4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RX8e9O6W2xM=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RX8e9O6XR7Q=", + "_parent": { + "$ref": "AAAAAAF5RX8e9O6W2xM=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -400, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX8e9O6YBmI=", + "_parent": { + "$ref": "AAAAAAF5RX8e9O6W2xM=" + }, + "fillColor": "#ffadad", + "font": "Arial;13;1", + "left": 295.5, + "top": 1211.5, + "width": 77, + "height": 13, + "text": "提示用户选择" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX8e9O6ZG1Q=", + "_parent": { + "$ref": "AAAAAAF5RX8e9O6W2xM=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -400, + "width": 73.67724609375, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX8e9O6aHT4=", + "_parent": { + "$ref": "AAAAAAF5RX8e9O6W2xM=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -400, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 290.5, + "top": 1204.5, + "width": 88, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX8e9O6XR7Q=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RX8e9O6YBmI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RX8e9O6ZG1Q=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX8e9O6aHT4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RX8e9O6brFw=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -200, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RX8e9O6chUQ=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -200, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RX8e9O6d2JQ=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -200, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RX8e9O6ehSE=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -200, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RX8e9O6fsgA=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -200, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 272, + "top": 1200, + "width": 124, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RX8e9O6W2xM=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RX8e9O6brFw=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RX8e9O6chUQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RX8e9O6d2JQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RX8e9O6ehSE=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RX8e9O6fsgA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RX9EYPFfH8Q=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFg5zI=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "font": "Arial;13;0", + "left": 246, + "top": 1116, + "width": 20.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 1, + "text": "+有" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFh+Xw=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 266, + "top": 1105, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFiQm8=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 235, + "top": 1137, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFj0XU=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFcd3k=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 207, + "top": 1068, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFkHH4=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFcd3k=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 217, + "top": 1060, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFlEI4=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFcd3k=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 184, + "top": 1085, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFmXkk=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFdtmc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 305, + "top": 1164, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFnjvk=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFdtmc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 313, + "top": 1153, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFoLfQ=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFdtmc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 289, + "top": 1186, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX9EYPFp0GM=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFcd3k=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX9EYPFqX8k=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFdtmc=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "tail": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "lineStyle": 1, + "points": "178:1067;314:1199", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RX9EYPFg5zI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX9EYPFh+Xw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX9EYPFiQm8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RX9EYPFj0XU=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RX9EYPFkHH4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RX9EYPFlEI4=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RX9EYPFmXkk=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RX9EYPFnjvk=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RX9EYPFoLfQ=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RX9EYPFp0GM=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RX9EYPFqX8k=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RX+92/rtdeY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RX+92/ru5aU=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RX+92/rvMVo=", + "_parent": { + "$ref": "AAAAAAF5RX+92/ru5aU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -608, + "top": -240, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX+92/rwk7c=", + "_parent": { + "$ref": "AAAAAAF5RX+92/ru5aU=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 492, + "top": 1107.5, + "width": 62, + "height": 13, + "text": "切换测回" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX+92/rxBWI=", + "_parent": { + "$ref": "AAAAAAF5RX+92/ru5aU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -608, + "top": -240, + "width": 73.67724609375, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX+92/ryOmk=", + "_parent": { + "$ref": "AAAAAAF5RX+92/ru5aU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -608, + "top": -240, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 487, + "top": 1100.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX+92/rvMVo=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RX+92/rwk7c=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RX+92/rxBWI=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX+92/ryOmk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RX+92/rzeck=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -304, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RX+92/r0UGE=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -304, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RX+92/r1dEM=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -304, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RX+92/r24rI=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -304, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RX+92/r3m0Y=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -304, + "top": -120, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 472, + "top": 1096, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RX+92/ru5aU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RX+92/rzeck=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RX+92/r0UGE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RX+92/r1dEM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RX+92/r24rI=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RX+92/r3m0Y=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RX/wMv3JNxw=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3KAYY=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 606, + "top": 837, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3L2sA=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 592, + "top": 832, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3MDuY=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 635, + "top": 848, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3NMMM=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3GM64=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 524, + "top": 1059, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3OaEE=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3GM64=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 512, + "top": 1052, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3P2uw=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3GM64=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 548, + "top": 1073, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3QkNM=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3HIz8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 689, + "top": 616, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3RuyM=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3HIz8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 676, + "top": 613, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3SQ5M=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3HIz8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 717, + "top": 621, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX/wM/3TMvA=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3GM64=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX/wM/3Udik=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3HIz8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "lineStyle": 1, + "points": "529:1095;713:603", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RX/wM/3KAYY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX/wM/3L2sA=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX/wM/3MDuY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RX/wM/3NMMM=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RX/wM/3OaEE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RX/wM/3P2uw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RX/wM/3QkNM=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RX/wM/3RuyM=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RX/wM/3SQ5M=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RX/wM/3TMvA=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RX/wM/3Udik=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYA6Lgau9u4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6LgavBvE=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "font": "Arial;13;0", + "left": 370, + "top": 1145, + "width": 98.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 1, + "text": "+跳转到相应测回" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6LgawDgk=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 412, + "top": 1132, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lgaxot4=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 434, + "top": 1172, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6LgayEWk=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaryvU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 381, + "top": 1167, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lgazq+M=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaryvU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 377, + "top": 1154, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lga0Sio=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaryvU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 390, + "top": 1193, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lga1FSA=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQashgM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 459, + "top": 1124, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lga2vcA=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQashgM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 450, + "top": 1113, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lga3b2g=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQashgM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 476, + "top": 1146, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYA6Lga4c4g=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaryvU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYA6Lga51go=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQashgM=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "tail": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "lineStyle": 1, + "points": "366:1199;489:1131", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYA6LgavBvE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYA6LgawDgk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYA6Lgaxot4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYA6LgayEWk=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYA6Lgazq+M=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYA6Lga0Sio=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYA6Lga1FSA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYA6Lga2vcA=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYA6Lga3b2g=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYA6Lga4c4g=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYA6Lga51go=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYRxIyqNVJQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxIyqOsk8=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "font": "Arial;13;0", + "left": 340, + "top": 844, + "width": 72.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 1, + "text": "+忽略或取消" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxIyqPdMg=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 361, + "top": 842, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxIyqQWvY=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 405, + "top": 849, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxIyqRHT4=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqKuUY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 325, + "top": 1164, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxJCqS57E=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqKuUY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 312, + "top": 1160, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxJCqTkAo=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqKuUY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 351, + "top": 1173, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxJCqUXmw=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqLN6Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 427, + "top": 524, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxJCqVgEY=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqLN6Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 413, + "top": 524, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxJCqWNBU=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqLN6Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 454, + "top": 524, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYRxJCqXBjo=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqKuUY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYRxJCqYdsw=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqLN6Y=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "lineStyle": 1, + "points": "336:1199;446:507", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYRxIyqOsk8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYRxIyqPdMg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYRxIyqQWvY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYRxIyqRHT4=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYRxJCqS57E=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYRxJCqTkAo=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYRxJCqUXmw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYRxJCqVgEY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYRxJCqWNBU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYRxJCqXBjo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYRxJCqYdsw=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RYWBNj55r2s=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RYWBNj56ll8=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RYWBNj57vDo=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj56ll8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYWBNj582Gg=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj56ll8=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 167.5, + "top": 1403.5, + "width": 155, + "height": 13, + "text": "检测其他测回是否有空数据" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYWBNj59CIs=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj56ll8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "width": 73.67724609375, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYWBNj5+a6c=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj56ll8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 162.5, + "top": 1396.5, + "width": 166, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYWBNj57vDo=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RYWBNj582Gg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RYWBNj59CIs=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYWBNj5+a6c=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RYWBNj5/meo=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RYWBNj6ApFY=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RYWBNj6BKos=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RYWBNj6CyfU=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RYWBNj6DzGw=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 128, + "top": 1392, + "width": 234, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RYWBNj56ll8=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RYWBNj5/meo=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RYWBNj6ApFY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RYWBNj6BKos=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RYWBNj6CyfU=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RYWBNj6DzGw=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYXKoUPzfpc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP0Xm4=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "font": "Arial;13;0", + "left": 205, + "top": 1219, + "width": 20.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 1, + "text": "+无" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP1/8o=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 230, + "top": 1215, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP2TmE=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 186, + "top": 1226, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP3dpE=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPwWeY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 183, + "top": 1082, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP4Dks=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPwWeY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 197, + "top": 1081, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP5sn0=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPwWeY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 155, + "top": 1084, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP6dKk=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPxCsE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 248, + "top": 1356, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP7hGo=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPxCsE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 260, + "top": 1350, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP8Pbs=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPxCsE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 222, + "top": 1366, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYXKoUP9qJ8=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPwWeY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYXKokP+OFo=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPxCsE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "tail": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "lineStyle": 1, + "points": "163:1067;240:1391", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYXKoUP0Xm4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYXKoUP1/8o=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYXKoUP2TmE=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYXKoUP3dpE=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYXKoUP4Dks=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYXKoUP5sn0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYXKoUP6dKk=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYXKoUP7hGo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYXKoUP8Pbs=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYXKoUP9qJ8=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYXKokP+OFo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYbKCEsNrL8=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsOHZ0=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "font": "Arial;13;0", + "left": 264, + "top": 1300, + "width": 20.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 1, + "text": "+有" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsP+kM=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 260, + "top": 1294, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsQdPM=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 301, + "top": 1313, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsRxi0=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsKkG0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 249, + "top": 1355, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsSIa0=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsKkG0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 238, + "top": 1347, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsTIOs=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsKkG0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 272, + "top": 1370, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsUoUc=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsLR+0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 300, + "top": 1246, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCUsVQTY=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsLR+0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 287, + "top": 1242, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCUsWC+U=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsLR+0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 327, + "top": 1253, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYbKCUsX4lU=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsKkG0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYbKCUsYcdA=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsLR+0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "tail": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "lineStyle": 1, + "points": "252:1391;325:1235", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYbKCEsOHZ0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYbKCEsP+kM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYbKCEsQdPM=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYbKCEsRxi0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYbKCEsSIa0=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYbKCEsTIOs=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYbKCEsUoUc=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYbKCUsVQTY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYbKCUsWC+U=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYbKCUsX4lU=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYbKCUsYcdA=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RYo1sZrzoek=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RYo1sZr0KlU=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RYo1sZr1HjQ=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZr0KlU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": -160, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYo1sZr2W5c=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZr0KlU=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 623.5, + "top": 1275.5, + "width": 116, + "height": 13, + "text": "检测其他测回合法性" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYo1sZr3XYs=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZr0KlU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": -160, + "width": 73.67724609375, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYo1sZr4E80=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZr0KlU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": -160, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 618.5, + "top": 1268.5, + "width": 127, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYo1sZr1HjQ=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RYo1sZr2W5c=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RYo1sZr3XYs=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYo1sZr4E80=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RYo1sZr5VvI=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -16, + "top": -80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RYo1sZr6Veg=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -16, + "top": -80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RYo1sZr7Dv4=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -16, + "top": -80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RYo1sZr8TjI=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -16, + "top": -80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RYo1sZr9JcM=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -16, + "top": -80, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 592, + "top": 1264, + "width": 179, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RYo1sZr0KlU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RYo1sZr5VvI=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RYo1sZr6Veg=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RYo1sZr7Dv4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RYo1sZr8TjI=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RYo1sZr9JcM=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYqgkqO2MyI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO3BkI=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "font": "Arial;13;0", + "left": 428, + "top": 1324, + "width": 59.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 1, + "text": "+无空测回" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO4B50=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 453, + "top": 1310, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO5Eu4=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 466, + "top": 1353, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO6Q3U=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOzOcA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 325, + "top": 1363, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO7HyE=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOzOcA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 324, + "top": 1349, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO8jmg=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOzOcA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 329, + "top": 1390, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO9LA0=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaO0Gyw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 590, + "top": 1285, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO+vZw=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaO0Gyw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 584, + "top": 1273, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO/OQc=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaO0Gyw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 602, + "top": 1311, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYqgkqPAF8U=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOzOcA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYqgkqPBTIk=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaO0Gyw=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "tail": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "lineStyle": 1, + "points": "305:1391;620:1299", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYqgkqO3BkI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYqgkqO4B50=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYqgkqO5Eu4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYqgkqO6Q3U=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYqgkqO7HyE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYqgkqO8jmg=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYqgkqO9LA0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYqgkqO+vZw=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYqgkqO/OQc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYqgkqPAF8U=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYqgkqPBTIk=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYuGzq0zcW0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq00uWc=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "font": "Arial;13;0", + "left": 1017, + "top": 1104, + "width": 137.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 1, + "text": "+发现有测回未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq01kJ4=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1080, + "top": 1090, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq02LjQ=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1096, + "top": 1133, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq03E1k=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0wl4I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 746, + "top": 1233, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq044hU=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0wl4I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 744, + "top": 1220, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq05NGE=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0wl4I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": 1260, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq06xW4=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0xzjs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1424, + "top": 976, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq07gn8=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0xzjs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1417, + "top": 964, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq08/Nc=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0xzjs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1438, + "top": 1000, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYuGzq09BO0=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0wl4I=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYuGzq0+Fys=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0xzjs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "tail": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "lineStyle": 1, + "points": "728:1263;1454:987", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYuGzq00uWc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYuGzq01kJ4=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYuGzq02LjQ=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYuGzq03E1k=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYuGzq044hU=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYuGzq05NGE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYuGzq06xW4=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYuGzq07gn8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYuGzq08/Nc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYuGzq09BO0=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYuGzq0+Fys=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RY5M47VS/5M=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M47VTDWg=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "font": "Arial;13;0", + "left": 508, + "top": 883, + "width": 85.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 1, + "text": "+全部通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M47VUjKA=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 536, + "top": 887, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVVTlw=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 579, + "top": 874, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVWBPw=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVPReU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 654, + "top": 1236, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVX2xY=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVPReU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 640, + "top": 1237, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVYskw=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVPReU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 681, + "top": 1232, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVZo0A=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVQGdM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 446, + "top": 530, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVaI9U=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVQGdM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 434, + "top": 536, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVbdjo=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVQGdM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 472, + "top": 518, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RY5M5LVcoPg=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVPReU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RY5M5LVdBDo=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVQGdM=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "lineStyle": 1, + "points": "676:1263;454:507", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RY5M47VTDWg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RY5M47VUjKA=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RY5M5LVVTlw=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RY5M5LVWBPw=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RY5M5LVX2xY=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RY5M5LVYskw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RY5M5LVZo0A=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RY5M5LVaI9U=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RY5M5LVbdjo=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RY5M5LVcoPg=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RY5M5LVdBDo=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RY+P3cq78x4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RY+P3cq8lrU=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RY+P3cq9UVw=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq8lrU=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -384, + "top": -48, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RY+P3cq+inU=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq8lrU=" + }, + "fillColor": "#8282ff", + "font": "Arial;13;1", + "left": 860.5, + "top": 1283.5, + "width": 101, + "height": 13, + "text": "switchState2Idle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RY+P3cq/1Xo=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq8lrU=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -384, + "top": -48, + "width": 73.67724609375, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RY+P3crAIoY=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq8lrU=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -384, + "top": -48, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 855.5, + "top": 1276.5, + "width": 111.8671875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RY+P3cq9UVw=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RY+P3cq+inU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RY+P3cq/1Xo=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RY+P3crAIoY=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RY+P3srBu6A=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -192, + "top": -24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RY+P3srCnMw=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -192, + "top": -24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RY+P3srDTrA=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -192, + "top": -24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RY+P3srE+P0=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -192, + "top": -24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RY+P3srFRq4=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -192, + "top": -24, + "width": 10, + "height": 10 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 832, + "top": 1272, + "width": 158, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RY+P3cq8lrU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RY+P3srBu6A=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RY+P3srCnMw=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RY+P3srDTrA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RY+P3srE+P0=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RY+P3srFRq4=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RY/lW9HunTY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9Hvi/A=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 837, + "top": 877, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9Hw6yM=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 822, + "top": 879, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9Hx5k8=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 866, + "top": 872, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9HyN1A=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9Hrql4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 888, + "top": 1241, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9Hz89k=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9Hrql4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 875, + "top": 1240, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9H0J0I=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9Hrql4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 916, + "top": 1241, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9H1ErY=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9HsN84=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 785, + "top": 512, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9H23xw=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9HsN84=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 772, + "top": 516, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9H3Onc=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9HsN84=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 812, + "top": 504, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RY/lW9H46uE=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9Hrql4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RY/lW9H5+K0=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9HsN84=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "tail": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "lineStyle": 1, + "points": "907:1271;797:491", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RY/lW9Hvi/A=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RY/lW9Hw6yM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RY/lW9Hx5k8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RY/lW9HyN1A=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RY/lW9Hz89k=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RY/lW9H0J0I=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RY/lW9H1ErY=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RY/lW9H23xw=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RY/lW9H3Onc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RY/lW9H46uE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RY/lW9H5+K0=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RZAQqNi9KXs=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RZAQqNi+U5k=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RZAQqNi/3K4=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi+U5k=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -240, + "top": 160, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZAQqNjAnDw=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi+U5k=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 834, + "top": 1467.5, + "width": 90, + "height": 13, + "text": "查找待补测数据" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZAQqNjB74E=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi+U5k=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -240, + "top": 160, + "width": 73.67724609375, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZAQqNjCvdQ=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi+U5k=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -240, + "top": 160, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 829, + "top": 1460.5, + "width": 101, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZAQqNi/3K4=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RZAQqNjAnDw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RZAQqNjB74E=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZAQqNjCvdQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RZAQqNjDBLs=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RZAQqNjEOXs=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RZAQqNjF53M=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RZAQqNjGCMk=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RZAQqNjHp8s=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": 80, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 808, + "top": 1456, + "width": 142, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RZAQqNi+U5k=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RZAQqNjDBLs=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RZAQqNjEOXs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RZAQqNjF53M=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RZAQqNjGCMk=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RZAQqNjHp8s=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RZDsue7ftRY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7gCik=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "font": "Arial;13;0", + "left": 869, + "top": 1372, + "width": 20.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 1, + "text": "+有" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7h1YU=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 864, + "top": 1369, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7iQis=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 908, + "top": 1377, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7jDYo=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7cAPs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 870, + "top": 1420, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7kyAA=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7cAPs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 858, + "top": 1416, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7ll8Q=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7cAPs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 897, + "top": 1429, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7mtW0=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7dBLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 887, + "top": 1323, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7n/oo=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7dBLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 874, + "top": 1323, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7oje8=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7dBLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 915, + "top": 1324, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZDsue7pTkA=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7cAPs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZDsue7qLNI=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7dBLs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "tail": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "lineStyle": 1, + "points": "881:1455;907:1307", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RZDsue7gCik=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZDsue7h1YU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZDsue7iQis=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RZDsue7jDYo=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RZDsue7kyAA=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RZDsue7ll8Q=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RZDsue7mtW0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RZDsue7n/oo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RZDsue7oje8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RZDsue7pTkA=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RZDsue7qLNI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RZEXNfhC2ho=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RZEXNfhDeUQ=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RZEXNfhE1JY=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhDeUQ=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -880, + "top": -96, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZEXNfhF08s=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhDeUQ=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 525, + "top": 1419.5, + "width": 64, + "height": 13, + "text": "查找空数据" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZEXNfhGZmc=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhDeUQ=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -880, + "top": -96, + "width": 73.67724609375, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZEXNfhHCVU=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhDeUQ=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -880, + "top": -96, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 520, + "top": 1412.5, + "width": 75, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZEXNfhE1JY=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RZEXNfhF08s=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RZEXNfhGZmc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZEXNfhHCVU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RZEXNfhIvoY=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -440, + "top": -48, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RZEXNvhJXeE=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -440, + "top": -48, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RZEXNvhKzwc=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -440, + "top": -48, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RZEXNvhLfS4=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -440, + "top": -48, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RZEXNvhM3lA=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -440, + "top": -48, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 504, + "top": 1408, + "width": 106, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RZEXNfhDeUQ=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RZEXNfhIvoY=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RZEXNvhJXeE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RZEXNvhKzwc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RZEXNvhLfS4=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RZEXNvhM3lA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RZE5Jvvk8+0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vlq9g=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "font": "Arial;13;0", + "left": 695, + "top": 1455, + "width": 20.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 1, + "text": "+无" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vm7FE=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 703, + "top": 1470, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vn7vY=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 710, + "top": 1426, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/voHLE=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5Jvvh7eI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 779, + "top": 1467, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vpdnU=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5Jvvh7eI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 774, + "top": 1479, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vqSPU=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5Jvvh7eI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 787, + "top": 1440, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vrD3M=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvviTz0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 633, + "top": 1445, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vslRk=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvviTz0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 633, + "top": 1459, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vtins=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvviTz0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 633, + "top": 1417, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZE5J/vuuHI=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5Jvvh7eI=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZE5J/vvgB0=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvviTz0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "tail": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "lineStyle": 1, + "points": "807:1462;610:1433", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RZE5J/vlq9g=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZE5J/vm7FE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZE5J/vn7vY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RZE5J/voHLE=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RZE5J/vpdnU=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RZE5J/vqSPU=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RZE5J/vrD3M=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RZE5J/vslRk=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RZE5J/vtins=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RZE5J/vuuHI=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RZE5J/vvgB0=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RZGEZgj/XLs=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkArOw=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "font": "Arial;13;0", + "left": 717, + "top": 1336, + "width": 20.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 1, + "text": "+有" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkB2TY=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 722, + "top": 1322, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkChVo=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 738, + "top": 1365, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkDRjc=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj8gpI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 621, + "top": 1377, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkERZ0=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj8gpI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 619, + "top": 1364, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkFONE=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj8gpI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 627, + "top": 1404, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkGzgA=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj9p0E=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 833, + "top": 1296, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkHVm4=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj9p0E=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 826, + "top": 1284, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkIGXU=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj9p0E=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 847, + "top": 1320, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZGEZgkJQgE=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj8gpI=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZGEZgkK2ek=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj9p0E=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "tail": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "lineStyle": 1, + "points": "603:1407;863:1307", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RZGEZgkArOw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZGEZgkB2TY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZGEZgkChVo=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RZGEZgkDRjc=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RZGEZgkERZ0=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RZGEZgkFONE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RZGEZgkGzgA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RZGEZgkHVm4=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RZGEZgkIGXU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RZGEZgkJQgE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RZGEZgkK2ek=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RZHb+w38rbY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w39z3k=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "font": "Arial;13;0", + "left": 477, + "top": 952, + "width": 20.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 1, + "text": "+无" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w3+E8c=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 472, + "top": 954, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w3/cnc=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 516, + "top": 949, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4A7LA=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g35LNk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 536, + "top": 1376, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4BF6A=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g35LNk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 522, + "top": 1376, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4COx0=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g35LNk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 563, + "top": 1378, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4DS1Q=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g36Mvo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 439, + "top": 528, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4Efb8=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g36Mvo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 426, + "top": 532, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4Fx+M=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g36Mvo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 465, + "top": 521, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZHb+w4GxWE=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g35LNk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZHb+w4HFa8=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g36Mvo=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "lineStyle": 1, + "points": "554:1407;451:507", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RZHb+w39z3k=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZHb+w3+E8c=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZHb+w3/cnc=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RZHb+w4A7LA=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RZHb+w4BF6A=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RZHb+w4COx0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RZHb+w4DS1Q=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RZHb+w4Efb8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RZHb+w4Fx+M=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RZHb+w4GxWE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RZHb+w4HFa8=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RZ6XBji6Gjs=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RZ6XBji742g=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RZ6XBji84Lo=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji742g=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZ6XBji96yI=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji742g=" + }, + "font": "Arial;13;1", + "left": 1112, + "top": 1595.5, + "width": 79, + "height": 13, + "text": "doMoveBack" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZ6XBji+VvE=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji742g=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 73.67724609375, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZ6XBji/AjM=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji742g=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1107, + "top": 1588.5, + "width": 90.18994140625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZ6XBji84Lo=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RZ6XBji96yI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RZ6XBji+VvE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZ6XBji/AjM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RZ6XBjjASWk=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RZ6XBzjBtGc=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RZ6XBzjCvBw=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RZ6XBzjD9LY=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RZ6XBzjEkZ0=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1088, + "top": 1584, + "width": 127, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RZ6XBji742g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RZ6XBjjASWk=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RZ6XBzjBtGc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RZ6XBzjCvBw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RZ6XBzjD9LY=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RZ6XBzjEkZ0=" + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P5nMrk1mLCw=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "check2C", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P5saV03F9So=", + "_parent": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P5saV03GReQ=", + "_parent": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "reference": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P5saV03HrLQ=", + "_parent": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "reference": { + "$ref": "AAAAAAF5P5rmBE2WOV0=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P56tf07Epig=", + "_parent": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P56tgE7F7Yk=", + "_parent": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "reference": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P56tgE7GNNA=", + "_parent": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "reference": { + "$ref": "AAAAAAF5P56LY06KFIA=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P5rmBE2WOV0=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "recordClean" + }, + { + "_type": "UMLUseCaseSubject", + "_id": "AAAAAAF5P5vlT04vpIc=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "用户选择操作" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P56LY06KFIA=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "【用户选择操作】", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P5/ask/ASWM=", + "_parent": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "name": "选择忽略or重测目标", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P5/ask/BASE=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "reference": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P5/ask/CwwU=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P6ETu1Fsgo0=", + "_parent": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "name": "重测测回", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6ETu1FtUvs=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "reference": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6ETu1Fuzfc=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "reference": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P5/CAk96MB0=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "Idle" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P6Btl1DQYFs=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "【提示用户是否确定删除整个测回】", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P6HZl1I+eIg=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "name": "选择忽略or取消", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6HZl1I/u/s=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "reference": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6HZl1JAt1Q=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P6Jc6FP89fs=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "name": "确认删除", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6Jc6FP9Ay0=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "reference": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6Jc6FP+W/w=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "reference": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P6IYDFMK28k=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "【执行删除操作】", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P6KuWFYuLA4=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6KuWFYvXto=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "reference": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6KuWFYwtmg=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P6I/oFN00qM=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "重新搜索目标开启新一轮测量", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJXgiQky2RI=", + "_parent": { + "$ref": "AAAAAAF5P6I/oFN00qM=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJXgiQkzVQM=", + "_parent": { + "$ref": "AAAAAAF5QJXgiQky2RI=" + }, + "reference": { + "$ref": "AAAAAAF5P6I/oFN00qM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJXgiQk0kU4=", + "_parent": { + "$ref": "AAAAAAF5QJXgiQky2RI=" + }, + "reference": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJWvCggxZrM=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "move2NextValidate", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RVWv2lZqu2A=", + "_parent": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVWv2lZro+8=", + "_parent": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "reference": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVWv2lZs/XI=", + "_parent": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "reference": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJc4CA2m0sA=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "checkHalfCycleZero", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJesYRAUeZI=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "name": "测站不闭合or半测回归零差正常", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJesYRAV/Pw=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "reference": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJesYRAWIno=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "reference": { + "$ref": "AAAAAAF5QJeXAw9WAQQ=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJmQwBdscKg=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "name": "没有通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJmQwBdt/Nk=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "reference": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJmQwBdu0wk=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "reference": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJeXAw9WAQQ=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "isReady2CCheck" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJjLZBMJQJ8=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "switchState2StandStill", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJnk3RnjFKU=", + "_parent": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJnk3Rnk4S8=", + "_parent": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJnk3Rnlvxc=", + "_parent": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "reference": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJk5ohVWyGc=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "提示半测回归零检测失败", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJnHsRkKHYc=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJnHsRkLdTo=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "reference": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJnHsRkM5N4=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJ6ahSPVJNg=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "checkReadData", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJ87Oyj+dCg=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "name": "单测量or通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ87Oyj/TJQ=", + "_parent": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "reference": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ87OykA4RY=", + "_parent": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "reference": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJ/Ugywh52g=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ/Ugywiha4=", + "_parent": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "reference": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ/UgywjRPE=", + "_parent": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "reference": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJ8m8Sf4R1w=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "isHalfCycleZeroCheckReady" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJ+mRitXafY=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "提示读数有误", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJ/0PCz+xYo=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ/0PCz/2CU=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "reference": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ/0PC0AjHo=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKE6OTfx/D4=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "checkSingleCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QKI4y0KDGow=", + "_parent": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QKI4zEKEuw8=", + "_parent": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "reference": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QKI4zEKFtZg=", + "_parent": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "reference": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QKvMIE8VEZE=", + "_parent": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QKvMIE8WKCE=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "reference": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QKvMIE8XsG8=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKIG+T9Wjdo=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "isAllCycleCompleted" + }, + { + "_type": "UMLUseCaseSubject", + "_id": "AAAAAAF5QKJM6UPX41c=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "UseCaseSubject1" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKuCwkzWMuI=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "提示用户选择", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QK2Ql1lrW/0=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "name": "忽略", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QK2Ql1lsCzU=", + "_parent": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QK2Ql1ltUBY=", + "_parent": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "reference": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QLdiW2HmZcI=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QLdiW2HnzLc=", + "_parent": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QLdiW2HodP8=", + "_parent": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "reference": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QMnaf4pzXpA=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMnaf4p0R7o=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMnaf4p1n0A=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "reference": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKyR6VB8Gq8=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "重测方向", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QLx6RGoJ91g=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QLx6RGoKxZI=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "reference": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QLx6RGoLs1U=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "reference": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKysH1F2Xh8=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "重测测回", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QNAhapFq3kM=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "name": "取消", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QNAhapFrudc=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "reference": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QNAhapFsZZ8=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QNFL6qCXEtU=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "name": "忽略", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QNFL6qCY2AQ=", + "_parent": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "reference": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QNFL6qCZ01s=", + "_parent": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "reference": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RVcwNF0hcaI=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVcwNF0iVWE=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "reference": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVcwNF0jQf0=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "reference": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKzDRVJwpI4=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "resetSurveyorStateAndKeepPosition", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QK340l0BzRk=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QK340l0ChAw=", + "_parent": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "reference": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QK340l0D79M=", + "_parent": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "reference": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QLwOJ2bN7N0=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "resurveyPoints", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QMbzEHNMUo0=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "name": "开始重测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMbzEHNNh8o=", + "_parent": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "reference": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMbzEHNOm6M=", + "_parent": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + }, + { + "_type": "UMLGeneralization", + "_id": "AAAAAAF5QMevPnTKBWs=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "name": "重测失败", + "source": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "target": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RVTunkvVKUs=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "name": "重测失败", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVTun0vWQ0U=", + "_parent": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "reference": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVTun0vXr0g=", + "_parent": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "reference": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QMaQUG/pf+g=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "switchState2RestartInCurrentCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QMjEpoXtFac=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMjEpoXuicM=", + "_parent": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMjEpoXvKNs=", + "_parent": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "reference": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RVbpp1nIOnU=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "执行测回删除", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RVdEqWBKDgY=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVdEqWBL2Ro=", + "_parent": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "reference": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVdEqWBMaWs=", + "_parent": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RWbWh5Q82SE=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "doCalScheduleSingleCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RWkDr6/4piw=", + "_parent": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWkDr6/5hKI=", + "_parent": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "reference": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWkDr6/6Fyk=", + "_parent": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "reference": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + } + } + } + ] + }, + { + "_type": "UMLUseCaseSubject", + "_id": "AAAAAAF5RWdznZ2YK/Q=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "UseCaseSubject2" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RWiYh6tdXHE=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "该测回是否完成测量", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RWmAObifwr4=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "name": "未完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWmAObigyuY=", + "_parent": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "reference": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWmAObih5u0=", + "_parent": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RWqc8svr3pE=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "name": "完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWqc8svs8AE=", + "_parent": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "reference": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWqc8svtE1U=", + "_parent": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "reference": { + "$ref": "AAAAAAF5RWo+Icga7No=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RWo+Icga7No=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "执行单测回检测", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RWvJyNWC314=", + "_parent": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWvJyNWDYLg=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "reference": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWvJyNWEI/s=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RWxGx9n5fHg=", + "_parent": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWxGx9n6uSs=", + "_parent": { + "$ref": "AAAAAAF5RWxGx9n5fHg=" + }, + "reference": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWxGx9n7A0k=", + "_parent": { + "$ref": "AAAAAAF5RWxGx9n5fHg=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RXgsE81LcLM=", + "_parent": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "name": "通过", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXgsE81Ml9Y=", + "_parent": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "reference": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXgsE81Ncj4=", + "_parent": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "reference": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RWzzg+QnXQo=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "doCalScheduleAllCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RXS1D5dDHCY=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXS1D5dEJJs=", + "_parent": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "reference": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXS1D5dF2N4=", + "_parent": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "reference": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RXZT3reRJjE=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "是否是doCalScheduleAllCycle状态", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RXiiW9aJDaw=", + "_parent": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "name": "不是", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXiiW9aKkno=", + "_parent": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "reference": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXiiW9aL3M4=", + "_parent": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RX50xeaOm84=", + "_parent": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "name": "是", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX50xeaPW6s=", + "_parent": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "reference": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX50xeaQJxA=", + "_parent": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "reference": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RX4IzeDinbw=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "检测其他测回是否有待补测数据", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RX9EYPFbm2U=", + "_parent": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "name": "有", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX9EYPFcd3k=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "reference": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX9EYPFdtmc=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "reference": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYXKoEPvmVE=", + "_parent": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "name": "无", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYXKoUPwWeY=", + "_parent": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "reference": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYXKoUPxCsE=", + "_parent": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "reference": { + "$ref": "AAAAAAF5RYWBNT536bM=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RX8e8+6Tpi8=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "提示用户选择", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYA6LQaqG8I=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "name": "跳转到相应测回", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYA6LQaryvU=", + "_parent": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "reference": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYA6LQashgM=", + "_parent": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "reference": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYRxIiqJIUE=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "name": "忽略或取消", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYRxIyqKuUY=", + "_parent": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "reference": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYRxIyqLN6Y=", + "_parent": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RX+92vrrsgo=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "切换测回", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RX/wMv3F6d4=", + "_parent": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX/wMv3GM64=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "reference": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX/wMv3HIz8=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RYWBNT536bM=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "检测其他测回是否有空数据", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYbKCEsJsiQ=", + "_parent": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "name": "有", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYbKCEsKkG0=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "reference": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYbKCEsLR+0=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "reference": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYqgkaOybww=", + "_parent": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "name": "无空测回", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYqgkaOzOcA=", + "_parent": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "reference": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYqgkaO0Gyw=", + "_parent": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "reference": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RYo1sJrxVxU=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "检测其他测回合法性", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYuGza0vDqU=", + "_parent": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "name": "发现有测回未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYuGza0wl4I=", + "_parent": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "reference": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYuGza0xzjs=", + "_parent": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RY5M4rVOVIM=", + "_parent": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "name": "全部通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RY5M4rVPReU=", + "_parent": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "reference": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RY5M4rVQGdM=", + "_parent": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RY+P3cq56es=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "switchState2Idle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RY/lWtHqafY=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RY/lW9Hrql4=", + "_parent": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "reference": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RY/lW9HsN84=", + "_parent": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "reference": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RZAQp9i7BLM=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "查找待补测数据", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RZDsue7baAw=", + "_parent": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "name": "有", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZDsue7cAPs=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "reference": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZDsue7dBLs=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "reference": { + "$ref": "AAAAAAF5RY+P3cq56es=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RZE5JvvgNmk=", + "_parent": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "name": "无", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZE5Jvvh7eI=", + "_parent": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "reference": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZE5JvviTz0=", + "_parent": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "reference": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RZEXNfhA9nA=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "查找空数据", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RZGEZgj773A=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "name": "有", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZGEZgj8gpI=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "reference": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZGEZgj9p0E=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "reference": { + "$ref": "AAAAAAF5RY+P3cq56es=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RZHb+g34JOw=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "name": "无", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZHb+g35LNk=", + "_parent": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "reference": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZHb+g36Mvo=", + "_parent": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RZ6XBTi4yu4=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "doMoveBack" + } + ] + }, + { + "_type": "UMLProfile", + "_id": "AAAAAAFElnEzslS1AuE=", + "_parent": { + "$ref": "AAAAAAFElm5XMFNoGY0=" + }, + "name": "UMLStandardProfile", + "ownedElements": [ + { + "_type": "UMLProfileDiagram", + "_id": "AAAAAAFElnFUQFS4mT4=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "StandardProfileL2", + "ownedViews": [ + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFElnFrT1S8vVg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFElnFrT1S7Kic=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFElnFrT1S9WOE=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S8vVg=" + }, + "model": { + "$ref": "AAAAAAFElnFrT1S7Kic=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFElnFrT1S+aHM=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": -44, + "top": -16, + "width": 1, + "height": 12 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnFrT1S/1HM=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 57, + "top": 59, + "width": 81, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnFrT1TAD0M=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerChangeable": true, + "containerExtending": true, + "left": 57, + "top": 73, + "width": 81, + "height": 12, + "text": "UMLClassifier" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnFrT1TBaUI=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": -44, + "top": -16, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnFrT1TCF/Y=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": -44, + "top": -16, + "width": 1, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 52, + "top": 52, + "width": 91, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFElnFrT1S/1HM=" + }, + "nameLabel": { + "$ref": "AAAAAAFElnFrT1TAD0M=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFElnFrT1TBaUI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFElnFrT1TCF/Y=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 52, + "top": 52, + "width": 91, + "height": 101, + "nameCompartment": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFElnF1nFTadPw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqCEfLOas=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFElnF1nFTbplQ=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFElnF1nVTcCng=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 60, + "top": -116, + "width": 1, + "height": 12 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnF1nVTd3xg=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 213, + "top": 55, + "width": 83, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnF1nVTewJM=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "font": "Arial;12;1", + "containerChangeable": true, + "containerExtending": true, + "left": 213, + "top": 69, + "width": 83, + "height": 12, + "text": "Realization" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnF1nVTfQRQ=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 60, + "top": -116, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnF1nVTgrV8=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 60, + "top": -116, + "width": 1, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 208, + "top": 48, + "width": 93, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFElnF1nVTd3xg=" + }, + "nameLabel": { + "$ref": "AAAAAAFElnF1nVTewJM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFElnF1nVTfQRQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFElnF1nVTgrV8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFElnF1nVThfqA=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 208, + "top": 86, + "width": 93, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFElnF1nVTiFXA=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 208, + "top": 96, + "width": 93, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFElnF1nVTjasU=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 60, + "top": -116, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 208, + "top": 48, + "width": 93, + "height": 38, + "nameCompartment": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFElnF1nVThfqA=" + }, + "operationCompartment": { + "$ref": "AAAAAAFElnF1nVTiFXA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqCEfLOas=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFElnF1nVTjasU=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFElnGGLFUGHnM=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFElnGGLFUFZFA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnGGLFUH+8s=", + "_parent": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "model": { + "$ref": "AAAAAAFElnGGLFUFZFA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 174, + "top": 73, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnGGLFUIOR8=", + "_parent": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "model": { + "$ref": "AAAAAAFElnGGLFUFZFA=" + }, + "visible": null, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 174, + "top": 88, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnGGLFUJv6k=", + "_parent": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "model": { + "$ref": "AAAAAAFElnGGLFUFZFA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 175, + "top": 43, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "head": { + "$ref": "AAAAAAFElnFrT1S8vVg=" + }, + "tail": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "points": "208:64;142:64", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFElnGGLFUH+8s=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFElnGGLFUIOR8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFElnGGLFUJv6k=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFElnJRglVMyB8=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqCkfpKls=", + "_parent": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFElnJRglVN/RI=", + "_parent": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFElnJRglVO7ow=", + "_parent": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 104, + "top": -176, + "width": 1, + "height": 12 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnJRglVPiBM=", + "_parent": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 217, + "top": 119, + "width": 74.73593139648438, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnJRglVQT1k=", + "_parent": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "font": "Arial;12;1", + "containerChangeable": true, + "containerExtending": true, + "left": 217, + "top": 133, + "width": 74.73593139648438, + "height": 12, + "text": "Specification" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnJRglVRdk8=", + "_parent": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 104, + "top": -176, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnJRglVSFic=", + "_parent": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 104, + "top": -176, + "width": 1, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 212, + "top": 112, + "width": 84.73593139648438, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFElnJRglVPiBM=" + }, + "nameLabel": { + "$ref": "AAAAAAFElnJRglVQT1k=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFElnJRglVRdk8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFElnJRglVSFic=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFElnJRglVTXPE=", + "_parent": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 212, + "top": 150, + "width": 84, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFElnJRglVUe0c=", + "_parent": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 212, + "top": 160, + "width": 84, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFElnJRg1VVWNU=", + "_parent": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 104, + "top": -176, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 212, + "top": 112, + "width": 84.73593139648438, + "height": 38, + "nameCompartment": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFElnJRglVTXPE=" + }, + "operationCompartment": { + "$ref": "AAAAAAFElnJRglVUe0c=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqCkfpKls=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFElnJRg1VVWNU=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFElnKVuVV5hVg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFElnKVuVV4pBU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnKVuVV6VLo=", + "_parent": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "model": { + "$ref": "AAAAAAFElnKVuVV4pBU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 176, + "top": 141, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnKVuVV7m9U=", + "_parent": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "model": { + "$ref": "AAAAAAFElnKVuVV4pBU=" + }, + "visible": null, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 176, + "top": 156, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnKVuVV8bvU=", + "_parent": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "model": { + "$ref": "AAAAAAFElnKVuVV4pBU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 177, + "top": 111, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "head": { + "$ref": "AAAAAAFElnFrT1S8vVg=" + }, + "tail": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "points": "212:132;142:132", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFElnKVuVV6VLo=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFElnKVuVV7m9U=" + }, + "propertyLabel": { + "$ref": "AAAAAAFElnKVuVV8bvU=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFJsZbpDNpnkE=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFJsZbpTNq6XM=", + "_parent": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "model": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFJsZbpTNrbHw=", + "_parent": { + "$ref": "AAAAAAFFJsZbpTNq6XM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 561, + "top": 209, + "width": 87, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFJsZbpTNsdGc=", + "_parent": { + "$ref": "AAAAAAFFJsZbpTNq6XM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerChangeable": true, + "containerExtending": true, + "left": 561, + "top": 223, + "width": 87, + "height": 12, + "text": "UMLClass" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFJsZbpTNtikk=", + "_parent": { + "$ref": "AAAAAAFFJsZbpTNq6XM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 1500, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFJsZbpTNuOXU=", + "_parent": { + "$ref": "AAAAAAFFJsZbpTNq6XM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 1500, + "width": 1, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 556, + "top": 204, + "width": 97, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFJsZbpTNrbHw=" + }, + "nameLabel": { + "$ref": "AAAAAAFFJsZbpTNsdGc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFJsZbpTNtikk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFJsZbpTNuOXU=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 556, + "top": 204, + "width": 97, + "height": 305, + "nameCompartment": { + "$ref": "AAAAAAFFJsZbpTNq6XM=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwKqhJFq1z2Y=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKqhJFq2eQM=", + "_parent": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "model": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKqhJFq3hUU=", + "_parent": { + "$ref": "AAAAAAFFwKqhJFq2eQM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 57, + "top": 209, + "width": 79, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKqhJFq4Vb4=", + "_parent": { + "$ref": "AAAAAAFFwKqhJFq2eQM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 57, + "top": 223, + "width": 79, + "height": 12, + "text": "UMLArtifact" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKqhJFq5GlQ=", + "_parent": { + "$ref": "AAAAAAFFwKqhJFq2eQM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKqhJFq6Fls=", + "_parent": { + "$ref": "AAAAAAFFwKqhJFq2eQM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 52, + "top": 204, + "width": 89, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKqhJFq3hUU=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKqhJFq4Vb4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKqhJFq5GlQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKqhJFq6Fls=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 52, + "top": 204, + "width": 89, + "height": 329, + "nameCompartment": { + "$ref": "AAAAAAFFwKqhJFq2eQM=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKsvdVrTyNI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqDUglDBo=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKsvdVrUE8w=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKsvdVrVvYg=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrUE8w=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 237, + "top": 209, + "width": 119, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKsvdVrW/Dg=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrUE8w=" + }, + "font": "Arial;12;3", + "containerExtending": true, + "left": 237, + "top": 223, + "width": 119, + "height": 12, + "text": "File" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKsvdVrXXrQ=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrUE8w=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 48, + "top": -12, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKsvdVrYnv8=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrUE8w=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 48, + "top": -12, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 232, + "top": 204, + "width": 129, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKsvdVrVvYg=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKsvdVrW/Dg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKsvdVrXXrQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKsvdVrYnv8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKsvdVrZA0U=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 248, + "top": 236, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKsvdlraVvA=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 248, + "top": 236, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKsvdlrbd2U=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 32, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 232, + "top": 204, + "width": 129, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwKsvdVrUE8w=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKsvdVrZA0U=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKsvdlraVvA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqDUglDBo=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKsvdlrbd2U=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKtwS1r8DQQ=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqDUg7My0=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKtwS1r9YJ4=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKtwS1r+fw8=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r9YJ4=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 313, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKtwS1r/Lsw=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r9YJ4=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 189, + "top": 327, + "width": 72.51593017578125, + "height": 12, + "text": "Document" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKtwS1sAGYA=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r9YJ4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 24, + "top": 24, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKtwS1sB7y4=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r9YJ4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 24, + "top": 24, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 184, + "top": 308, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKtwS1r+fw8=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKtwS1r/Lsw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKtwS1sAGYA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKtwS1sB7y4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKtwTFsC02k=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 192, + "top": 352, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKtwTFsD5lc=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 192, + "top": 352, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKtwTFsEQlE=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 16, + "top": 16, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 184, + "top": 308, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwKtwS1r9YJ4=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKtwTFsC02k=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKtwTFsD5lc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqDUg7My0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKtwTFsEQlE=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKuBulskCVg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqDkhRFFg=", + "_parent": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKuBulsld0g=", + "_parent": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuBulsmb/s=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsld0g=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 257, + "top": 357, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuBulsnKBI=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsld0g=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 257, + "top": 371, + "width": 72.51593017578125, + "height": 12, + "text": "Executable" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuBu1soKF0=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsld0g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 96, + "top": -48, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuBu1spOXA=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsld0g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 96, + "top": -48, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 252, + "top": 352, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKuBulsmb/s=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKuBulsnKBI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKuBu1soKF0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKuBu1spOXA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKuBu1sqPhk=", + "_parent": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 284, + "top": 372, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKuBu1srnoE=", + "_parent": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 284, + "top": 372, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKuBu1ssVVg=", + "_parent": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 64, + "top": -32, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 252, + "top": 352, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwKuBulsld0g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKuBu1sqPhk=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKuBu1srnoE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqDkhRFFg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKuBu1ssVVg=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKuIMltMJw4=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqD0hnnhc=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKuIMltNJK8=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuIM1tO63M=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltNJK8=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 321, + "top": 405, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuIM1tPj60=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltNJK8=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 321, + "top": 419, + "width": 72.51593017578125, + "height": 12, + "text": "Library" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuIM1tQD7A=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltNJK8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 132, + "top": -108, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuIM1tRSSY=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltNJK8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 132, + "top": -108, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 316, + "top": 400, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKuIM1tO63M=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKuIM1tPj60=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKuIM1tQD7A=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKuIM1tRSSY=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKuIM1tSiN4=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 360, + "top": 400, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKuIM1tTPjo=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 360, + "top": 400, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKuIM1tUHbM=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 88, + "top": -72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 316, + "top": 400, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwKuIMltNJK8=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKuIM1tSiN4=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKuIM1tTPjo=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqD0hnnhc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKuIM1tUHbM=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKuS0lt0dAE=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqEEh93KM=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKuS0lt1+MM=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuS0lt2XgE=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt1+MM=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 385, + "top": 453, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuS0lt36r8=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt1+MM=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 385, + "top": 467, + "width": 72.51593017578125, + "height": 12, + "text": "Script" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuS0lt4pP4=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt1+MM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 180, + "top": -180, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuS0lt5mi4=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt1+MM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 180, + "top": -180, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 380, + "top": 448, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKuS0lt2XgE=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKuS0lt36r8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKuS0lt4pP4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKuS0lt5mi4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKuS0lt6gjg=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 424, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKuS0lt7fo0=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 424, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKuS0lt8w2A=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 120, + "top": -120, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 380, + "top": 448, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwKuS0lt1+MM=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKuS0lt6gjg=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKuS0lt7fo0=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqEEh93KM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKuS0lt8w2A=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKueMluc5bE=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqEUiTykw=", + "_parent": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKueMludFfk=", + "_parent": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKueMlueAco=", + "_parent": { + "$ref": "AAAAAAFFwKueMludFfk=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 445, + "top": 501, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKueMluflfo=", + "_parent": { + "$ref": "AAAAAAFFwKueMludFfk=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 445, + "top": 515, + "width": 72.51593017578125, + "height": 12, + "text": "Source" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKueMlughos=", + "_parent": { + "$ref": "AAAAAAFFwKueMludFfk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -108, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKueMluhfws=", + "_parent": { + "$ref": "AAAAAAFFwKueMludFfk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -108, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 496, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKueMlueAco=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKueMluflfo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKueMlughos=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKueMluhfws=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKueMluihu4=", + "_parent": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 500, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKueMlujEyo=", + "_parent": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 500, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKueMlukJo8=", + "_parent": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 496, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwKueMludFfk=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKueMluihu4=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKueMlujEyo=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqEUiTykw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKueMlukJo8=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFFwKzkslvYVdw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKzkslvX4gU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzkslvZbd0=", + "_parent": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "model": { + "$ref": "AAAAAAFFwKzkslvX4gU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 258, + "top": 267, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzks1vasdU=", + "_parent": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "model": { + "$ref": "AAAAAAFFwKzkslvX4gU=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 258, + "top": 252, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzks1vby/c=", + "_parent": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "model": { + "$ref": "AAAAAAFFwKzkslvX4gU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 258, + "top": 297, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "tail": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "points": "216:308;216:288;300:288;300:240", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwKzkslvZbd0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKzks1vasdU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKzks1vby/c=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFFwKzsCVvpt2A=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKzsCVvo11g=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzsCVvqAUg=", + "_parent": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "model": { + "$ref": "AAAAAAFFwKzsCVvo11g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 285, + "top": 289, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzsCVvrTi8=", + "_parent": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "model": { + "$ref": "AAAAAAFFwKzsCVvo11g=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 270, + "top": 289, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzsCVvsewQ=", + "_parent": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "model": { + "$ref": "AAAAAAFFwKzsCVvo11g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 314, + "top": 290, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "tail": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "points": "300:352;300:240", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwKzsCVvqAUg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKzsCVvrTi8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKzsCVvsewQ=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFFwKzxcVv6A2c=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKzxcVv56Dg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzxcVv7wpA=", + "_parent": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "model": { + "$ref": "AAAAAAFFwKzxcVv56Dg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 327, + "top": 297, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzxcVv8NxM=", + "_parent": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "model": { + "$ref": "AAAAAAFFwKzxcVv56Dg=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 327, + "top": 312, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzxcVv9X58=", + "_parent": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "model": { + "$ref": "AAAAAAFFwKzxcVv56Dg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 328, + "top": 267, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "tail": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "points": "356:400;356:288;300:288;300:240", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwKzxcVv7wpA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKzxcVv8NxM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKzxcVv9X58=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFFwKz3OVwLl+8=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKz3OVwK9hs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz3OVwMNB4=", + "_parent": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "model": { + "$ref": "AAAAAAFFwKz3OVwK9hs=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 357, + "top": 297, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz3OVwNd3E=", + "_parent": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "model": { + "$ref": "AAAAAAFFwKz3OVwK9hs=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 357, + "top": 312, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz3OVwODiI=", + "_parent": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "model": { + "$ref": "AAAAAAFFwKz3OVwK9hs=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 358, + "top": 267, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "tail": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "points": "416:448;416:288;300:288;300:240", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwKz3OVwMNB4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKz3OVwNd3E=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKz3OVwODiI=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFFwKz9mVwcos8=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKz9mFwbfDg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz9mVwdsGc=", + "_parent": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "model": { + "$ref": "AAAAAAFFwKz9mFwbfDg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 391, + "top": 297, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz9mVweYvs=", + "_parent": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "model": { + "$ref": "AAAAAAFFwKz9mFwbfDg=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 391, + "top": 312, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz9mVwfOSk=", + "_parent": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "model": { + "$ref": "AAAAAAFFwKz9mFwbfDg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 392, + "top": 267, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "tail": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "points": "484:496;484:288;300:288;300:240", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwKz9mVwdsGc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKz9mVweYvs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKz9mVwfOSk=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK4k1VxFxwI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK4k1VxEEpM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4k1lxGUvg=", + "_parent": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "model": { + "$ref": "AAAAAAFFwK4k1VxEEpM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 161, + "top": 333, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4k1lxHABk=", + "_parent": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "model": { + "$ref": "AAAAAAFFwK4k1VxEEpM=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 161, + "top": 348, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4k1lxIpIg=", + "_parent": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "model": { + "$ref": "AAAAAAFFwK4k1VxEEpM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 162, + "top": 303, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "points": "184:324;140:324", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK4k1lxGUvg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK4k1lxHABk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK4k1lxIpIg=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK4o4VxWQBI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK4o4VxVx00=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4o4VxXVGc=", + "_parent": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "model": { + "$ref": "AAAAAAFFwK4o4VxVx00=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 195, + "top": 378, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4o4VxYgZc=", + "_parent": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "model": { + "$ref": "AAAAAAFFwK4o4VxVx00=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 195, + "top": 393, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4o4VxZqsQ=", + "_parent": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "model": { + "$ref": "AAAAAAFFwK4o4VxVx00=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 196, + "top": 348, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "points": "252:369;140:369", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK4o4VxXVGc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK4o4VxYgZc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK4o4VxZqsQ=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK4tiVxnpno=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK4tiVxmVJM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4tiVxoTEk=", + "_parent": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "model": { + "$ref": "AAAAAAFFwK4tiVxmVJM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 227, + "top": 429, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4tiVxpG0I=", + "_parent": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "model": { + "$ref": "AAAAAAFFwK4tiVxmVJM=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 227, + "top": 444, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4tiVxqKIY=", + "_parent": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "model": { + "$ref": "AAAAAAFFwK4tiVxmVJM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 228, + "top": 399, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "points": "316:420;140:420", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK4tiVxoTEk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK4tiVxpG0I=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK4tiVxqKIY=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK41YVx4sZw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK41YVx3Hr0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK41YVx5rZ4=", + "_parent": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "model": { + "$ref": "AAAAAAFFwK41YVx3Hr0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 259, + "top": 473, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK41YVx6mfE=", + "_parent": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "model": { + "$ref": "AAAAAAFFwK41YVx3Hr0=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 259, + "top": 488, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK41YVx7lFo=", + "_parent": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "model": { + "$ref": "AAAAAAFFwK41YVx3Hr0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 260, + "top": 443, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "points": "380:464;140:464", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK41YVx5rZ4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK41YVx6mfE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK41YVx7lFo=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK47MFyJhkk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK47MFyIL/c=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK47MFyKeH8=", + "_parent": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "model": { + "$ref": "AAAAAAFFwK47MFyIL/c=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 289, + "top": 521, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK47MVyL2Gg=", + "_parent": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "model": { + "$ref": "AAAAAAFFwK47MFyIL/c=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 289, + "top": 536, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK47MVyMJyk=", + "_parent": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "model": { + "$ref": "AAAAAAFFwK47MFyIL/c=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 290, + "top": 491, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "points": "440:512;140:512", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK47MFyKeH8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK47MVyL2Gg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK47MVyMJyk=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK5AeFyarms=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK5AeFyZpVg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK5AeFybX8s=", + "_parent": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "model": { + "$ref": "AAAAAAFFwK5AeFyZpVg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 185, + "top": 229, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK5AeFycm2c=", + "_parent": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "model": { + "$ref": "AAAAAAFFwK5AeFyZpVg=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 185, + "top": 244, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK5AeVydbSU=", + "_parent": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "model": { + "$ref": "AAAAAAFFwK5AeFyZpVg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 186, + "top": 199, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "points": "232:220;140:220", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK5AeFybX8s=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK5AeFycm2c=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK5AeVydbSU=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwK/k1ly1mNU=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK/k1ly00Ec=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwK/k1ly236Y=", + "_parent": { + "$ref": "AAAAAAFFwK/k1ly1mNU=" + }, + "model": { + "$ref": "AAAAAAFFwK/k1ly00Ec=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwK/k1ly3kes=", + "_parent": { + "$ref": "AAAAAAFFwK/k1ly236Y=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 385, + "top": 585, + "width": 132, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwK/k1ly4Kb0=", + "_parent": { + "$ref": "AAAAAAFFwK/k1ly236Y=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 385, + "top": 599, + "width": 132, + "height": 12, + "text": "UMLBehavioralFeature" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwK/k11y5jis=", + "_parent": { + "$ref": "AAAAAAFFwK/k1ly236Y=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 972, + "top": 60, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwK/k11y6pH4=", + "_parent": { + "$ref": "AAAAAAFFwK/k1ly236Y=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 972, + "top": 60, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 380, + "top": 580, + "width": 142, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK/k1ly3kes=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwK/k1ly4Kb0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwK/k11y5jis=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK/k11y6pH4=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 380, + "top": 580, + "width": 142, + "height": 101, + "nameCompartment": { + "$ref": "AAAAAAFFwK/k1ly236Y=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLBdPFzSzQk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqFkkF9pQ=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLBdPFzT/sk=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLBdPFzUtqg=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzT/sk=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 589, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLBdPFzVTVM=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzT/sk=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 603, + "width": 72.51593017578125, + "height": 12, + "text": "Destroy" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLBdPFzWXGg=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzT/sk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 120, + "top": 24, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLBdPFzX7Kw=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzT/sk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 120, + "top": 24, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 584, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLBdPFzUtqg=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLBdPFzVTVM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLBdPFzWXGg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLBdPFzX7Kw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLBdPFzYl0A=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 632, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLBdPFzZMKQ=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 632, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLBdPFzaqUA=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 80, + "top": 16, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 584, + "width": 82.51593017578125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwLBdPFzT/sk=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLBdPFzYl0A=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLBdPFzZMKQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqFkkF9pQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLBdPFzaqUA=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLDMaFz6CG0=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLDMaFz5C14=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLDMaFz7zuA=", + "_parent": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "model": { + "$ref": "AAAAAAFFwLDMaFz5C14=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 349, + "top": 579, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLDMaFz8JJ4=", + "_parent": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "model": { + "$ref": "AAAAAAFFwLDMaFz5C14=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 349, + "top": 564, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLDMaFz92bU=", + "_parent": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "model": { + "$ref": "AAAAAAFFwLDMaFz5C14=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 349, + "top": 609, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwK/k1ly1mNU=" + }, + "tail": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "points": "318:600;380:600", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLDMaFz7zuA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLDMaFz8JJ4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLDMaFz92bU=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLFUbV0ScDI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqF0kiyCM=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLFUbV0TTdY=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFUbV0UvYs=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0TTdY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 209, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFUbV0V4oU=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0TTdY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 223, + "width": 72.51593017578125, + "height": 12, + "text": "Auxiliary" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFUbV0WLEA=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0TTdY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -336, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFUbV0XEPg=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0TTdY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -336, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 204, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLFUbV0UvYs=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLFUbV0V4oU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLFUbV0WLEA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLFUbV0XEPg=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLFUbV0YxWc=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 128, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLFUbV0Z3Xk=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 128, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLFUbV0aLJo=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -40, + "top": -224, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 204, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLFUbV0TTdY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLFUbV0YxWc=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLFUbV0Z3Xk=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqF0kiyCM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLFUbV0aLJo=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLFu9F06sWk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqGEk49nc=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLFu9F07mo0=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFu9F08FIY=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F07mo0=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 261, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFu9F09Ig0=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F07mo0=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 275, + "width": 72.51593017578125, + "height": 12, + "text": "Focus" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFu9F0+sYU=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F07mo0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -420, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFu9F0/2cA=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F07mo0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -420, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 256, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLFu9F08FIY=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLFu9F09Ig0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLFu9F0+sYU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLFu9F0/2cA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLFu9F1A690=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 152, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLFu9F1BAsU=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 152, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLFu9F1CLR8=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -40, + "top": -280, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 256, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLFu9F07mo0=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLFu9F1A690=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLFu9F1BAsU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqGEk49nc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLFu9F1CLR8=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLF4tF1iftI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqGUlOO9I=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLF4tF1jr/w=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF4tF1kg2Y=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1jr/w=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 313, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF4tF1la4E=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1jr/w=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 327, + "width": 72.51593017578125, + "height": 12, + "text": "Metaclass" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF4tF1mW9o=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1jr/w=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -480, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF4tF1ngPk=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1jr/w=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -480, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 308, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLF4tF1kg2Y=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLF4tF1la4E=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLF4tF1mW9o=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLF4tF1ngPk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLF4tF1oP5U=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 184, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLF4tF1pEYI=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 184, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLF4tF1qaMM=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -40, + "top": -320, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 308, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLF4tF1jr/w=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLF4tF1oP5U=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLF4tF1pEYI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqGUlOO9I=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLF4tF1qaMM=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLF/G12KFPg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqGUlk1Tc=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLF/G12LESY=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF/G12MFWs=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12LESY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 365, + "width": 121, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF/G12Nq6M=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12LESY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 379, + "width": 121, + "height": 12, + "text": "ImplementationClass" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF/G12OWK0=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12LESY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -564, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF/G12PipY=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12LESY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -564, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 360, + "width": 131, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLF/G12MFWs=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLF/G12Nq6M=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLF/G12OWK0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLF/G12PipY=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLF/G12QJs8=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 208, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLF/G12Rf8c=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 208, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLF/HF2Sm8E=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -376, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 360, + "width": 131, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLF/G12LESY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLF/G12QJs8=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLF/G12Rf8c=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqGUlk1Tc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLF/HF2Sm8E=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLGEPF2y6SI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqHEl6Zbo=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLGEPF2zyUI=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGEPF20OuI=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2zyUI=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 421, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGEPF21TcM=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2zyUI=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 435, + "width": 72.51593017578125, + "height": 12, + "text": "Type" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGEPF22f/8=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2zyUI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -624, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGEPF23oz0=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2zyUI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -624, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 416, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLGEPF20OuI=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLGEPF21TcM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLGEPF22f/8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLGEPF23oz0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLGEPF24D5Y=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 244, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLGEPF252Tg=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 244, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLGEPF26r38=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -416, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 416, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLGEPF2zyUI=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLGEPF24D5Y=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLGEPF252Tg=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqHEl6Zbo=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLGEPF26r38=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLGI813a/Lo=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqHEmQAJ4=", + "_parent": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLGI813bmDw=", + "_parent": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGI9F3c6dc=", + "_parent": { + "$ref": "AAAAAAFFwLGI813bmDw=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 477, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGI9F3dgjo=", + "_parent": { + "$ref": "AAAAAAFFwLGI813bmDw=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 491, + "width": 72.51593017578125, + "height": 12, + "text": "Utility" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGI9F3eWQw=", + "_parent": { + "$ref": "AAAAAAFFwLGI813bmDw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -672, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGI9F3fVUI=", + "_parent": { + "$ref": "AAAAAAFFwLGI813bmDw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -672, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 472, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLGI9F3c6dc=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLGI9F3dgjo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLGI9F3eWQw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLGI9F3fVUI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLGI9F3g9+w=", + "_parent": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 284, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLGI9F3hmIE=", + "_parent": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 284, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLGI9F3i+8k=", + "_parent": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -448, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 472, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLGI813bmDw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLGI9F3g9+w=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLGI9F3hmIE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqHEmQAJ4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLGI9F3i+8k=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLNej158NLk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLNej157D6Y=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNej1590I0=", + "_parent": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "model": { + "$ref": "AAAAAAFFwLNej157D6Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 233, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNej15+8jc=", + "_parent": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "model": { + "$ref": "AAAAAAFFwLNej157D6Y=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 248, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNej15/BRY=", + "_parent": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "model": { + "$ref": "AAAAAAFFwLNej157D6Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 203, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "points": "720:224;652:224", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLNej1590I0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLNej15+8jc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLNej15/BRY=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLNkZ16NQ/Q=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLNkZ16Mp7Y=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNkZ16OhBQ=", + "_parent": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "model": { + "$ref": "AAAAAAFFwLNkZ16Mp7Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 281, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNkZ16PBtY=", + "_parent": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "model": { + "$ref": "AAAAAAFFwLNkZ16Mp7Y=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 296, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNkZ16QvLQ=", + "_parent": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "model": { + "$ref": "AAAAAAFFwLNkZ16Mp7Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 251, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "points": "720:272;652:272", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLNkZ16OhBQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLNkZ16PBtY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLNkZ16QvLQ=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLNn916eDZQ=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLNn916d4Yc=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNn916fvYQ=", + "_parent": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "model": { + "$ref": "AAAAAAFFwLNn916d4Yc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 333, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNn916guUU=", + "_parent": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "model": { + "$ref": "AAAAAAFFwLNn916d4Yc=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 348, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNn916hjhM=", + "_parent": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "model": { + "$ref": "AAAAAAFFwLNn916d4Yc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 303, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "points": "720:324;652:324", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLNn916fvYQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLNn916guUU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLNn916hjhM=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLNr116vKpE=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLNr116u93k=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNr116weUM=", + "_parent": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "model": { + "$ref": "AAAAAAFFwLNr116u93k=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 385, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNr116xjvo=", + "_parent": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "model": { + "$ref": "AAAAAAFFwLNr116u93k=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 400, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNr116yGN0=", + "_parent": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "model": { + "$ref": "AAAAAAFFwLNr116u93k=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 355, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "points": "720:376;652:376", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLNr116weUM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLNr116xjvo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLNr116yGN0=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLNvdl7AF7U=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLNvdl6/WJI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNvd17Byl0=", + "_parent": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "model": { + "$ref": "AAAAAAFFwLNvdl6/WJI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 442, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNvd17Cmyo=", + "_parent": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "model": { + "$ref": "AAAAAAFFwLNvdl6/WJI=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 457, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNvd17DduQ=", + "_parent": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "model": { + "$ref": "AAAAAAFFwLNvdl6/WJI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 412, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "points": "720:433;652:433", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLNvd17Byl0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLNvd17Cmyo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLNvd17DduQ=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLN0fl7RscA=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLN0fl7QL9o=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLN0fl7SzeE=", + "_parent": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "model": { + "$ref": "AAAAAAFFwLN0fl7QL9o=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 498, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLN0fl7Tq3c=", + "_parent": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "model": { + "$ref": "AAAAAAFFwLN0fl7QL9o=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 513, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLN0f17UptI=", + "_parent": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "model": { + "$ref": "AAAAAAFFwLN0fl7QL9o=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 468, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "points": "720:489;652:489", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLN0fl7SzeE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLN0fl7Tq3c=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLN0f17UptI=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwLRECl7stC8=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLRECl7tsQE=", + "_parent": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "model": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLRECl7u5vE=", + "_parent": { + "$ref": "AAAAAAFFwLRECl7tsQE=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 561, + "top": 545, + "width": 92.85594177246094, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLRECl7vrCk=", + "_parent": { + "$ref": "AAAAAAFFwLRECl7tsQE=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 561, + "top": 559, + "width": 92.85594177246094, + "height": 12, + "text": "UMLComponent" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLRECl7wqHs=", + "_parent": { + "$ref": "AAAAAAFFwLRECl7tsQE=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "top": 504, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLRECl7xJrI=", + "_parent": { + "$ref": "AAAAAAFFwLRECl7tsQE=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "top": 504, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 540, + "width": 102.85594177246094, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLRECl7u5vE=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLRECl7vrCk=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLRECl7wqHs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLRECl7xJrI=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 540, + "width": 102.85594177246094, + "height": 261, + "nameCompartment": { + "$ref": "AAAAAAFFwLRECl7tsQE=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLR8CV8I99Y=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqH0nfZIU=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLR8CV8JFWY=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLR8CV8Knxc=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8JFWY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 549, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLR8CV8LWIw=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8JFWY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 563, + "width": 72.51593017578125, + "height": 12, + "text": "Entity" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLR8CV8Mvqc=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8JFWY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 504, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLR8CV8NdIc=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8JFWY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 504, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 544, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLR8CV8Knxc=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLR8CV8LWIw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLR8CV8Mvqc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLR8CV8NdIc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLR8CV8OpVY=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 748, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLR8CV8PW8k=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 748, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLR8Cl8QCTM=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 336, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 544, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLR8CV8JFWY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLR8CV8OpVY=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLR8CV8PW8k=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqH0nfZIU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLR8Cl8QCTM=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLSByF8w+gI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqIEn1Irc=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLSByF8x/Yc=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSByF8yMLo=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8x/Yc=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 597, + "width": 88.67578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSByF8zspI=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8x/Yc=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 611, + "width": 88.67578125, + "height": 12, + "text": "Implementation" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSByF80AnU=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8x/Yc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 420, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSByF81b24=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8x/Yc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 420, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 592, + "width": 98.67578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLSByF8yMLo=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLSByF8zspI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLSByF80AnU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLSByF81b24=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLSByF82e10=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 768, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLSByF83aE4=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 768, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLSByF84G88=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -8, + "top": 280, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 592, + "width": 98.67578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLSByF8x/Yc=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLSByF82e10=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLSByF83aE4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqIEn1Irc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLSByF84G88=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLSIN19Ytdk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqIUoLdrY=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLSIN19ZQ0U=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSIOF9a8kE=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19ZQ0U=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 653, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSIOF9bYBg=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19ZQ0U=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 667, + "width": 72.51593017578125, + "height": 12, + "text": "Process" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSIOF9cqZQ=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19ZQ0U=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 348, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSIOF9dI5U=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19ZQ0U=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 348, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 648, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLSIOF9a8kE=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLSIOF9bYBg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLSIOF9cqZQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLSIOF9dI5U=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLSIOF9ekq0=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 800, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLSIOF9fibc=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 800, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLSIOF9gUN0=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -8, + "top": 232, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 648, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLSIN19ZQ0U=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLSIOF9ekq0=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLSIOF9fibc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqIUoLdrY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLSIOF9gUN0=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLSO/1+AoeQ=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqIkohl1g=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLSO/1+BWGA=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSO/1+CG1s=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+BWGA=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 709, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSO/1+DoUc=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+BWGA=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 723, + "width": 72.51593017578125, + "height": 12, + "text": "Service" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSPAF+EVIo=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+BWGA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 312, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSPAF+FZR8=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+BWGA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 312, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 704, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLSO/1+CG1s=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLSO/1+DoUc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLSPAF+EVIo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLSPAF+FZR8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLSPAF+GnaI=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 844, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLSPAF+Ho/s=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 844, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLSPAF+I3E8=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -8, + "top": 208, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 704, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLSO/1+BWGA=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLSPAF+GnaI=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLSPAF+Ho/s=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqIkohl1g=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLSPAF+I3E8=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLSXP1+o0Kw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqIko3HYE=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLSXP1+peko=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSXP1+qR3g=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+peko=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 765, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSXP1+rnfg=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+peko=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 779, + "width": 72.51593017578125, + "height": 12, + "text": "Subsystem" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSXP1+sqCM=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+peko=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 252, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSXP1+t4Mc=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+peko=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 252, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 760, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLSXP1+qR3g=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLSXP1+rnfg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLSXP1+sqCM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLSXP1+t4Mc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLSXP1+uKrA=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 880, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLSXP1+vdxM=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 880, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLSXP1+woFc=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 168, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 760, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLSXP1+peko=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLSXP1+uKrA=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLSXP1+vdxM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqIko3HYE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLSXP1+woFc=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLV9gV/Ybio=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLV9gV/Xhk4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLV9gV/Z8CU=", + "_parent": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "model": { + "$ref": "AAAAAAFFwLV9gV/Xhk4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 569, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLV9gl/a23I=", + "_parent": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "model": { + "$ref": "AAAAAAFFwLV9gV/Xhk4=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 584, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLV9gl/b3BU=", + "_parent": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "model": { + "$ref": "AAAAAAFFwLV9gV/Xhk4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 539, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "tail": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "points": "720:560;658:560", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLV9gV/Z8CU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLV9gl/a23I=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLV9gl/b3BU=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLWA0V/pWEg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLWA0V/olVk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWA0V/q2AI=", + "_parent": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "model": { + "$ref": "AAAAAAFFwLWA0V/olVk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 621, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWA0V/rrYc=", + "_parent": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "model": { + "$ref": "AAAAAAFFwLWA0V/olVk=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 636, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWA0V/spgM=", + "_parent": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "model": { + "$ref": "AAAAAAFFwLWA0V/olVk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 591, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "tail": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "points": "720:612;658:612", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLWA0V/q2AI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLWA0V/rrYc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLWA0V/spgM=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLWEUV/6d1E=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLWEUV/5Qq4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWEUV/78Ig=", + "_parent": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "model": { + "$ref": "AAAAAAFFwLWEUV/5Qq4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 677, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWEUV/8eIM=", + "_parent": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "model": { + "$ref": "AAAAAAFFwLWEUV/5Qq4=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 692, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWEUV/9T0A=", + "_parent": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "model": { + "$ref": "AAAAAAFFwLWEUV/5Qq4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 647, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "tail": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "points": "720:668;658:668", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLWEUV/78Ig=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLWEUV/8eIM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLWEUV/9T0A=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLWIQWALE8M=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLWIQWAKKPo=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWIQWAMDo8=", + "_parent": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "model": { + "$ref": "AAAAAAFFwLWIQWAKKPo=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 737, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWIQWANo/A=", + "_parent": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "model": { + "$ref": "AAAAAAFFwLWIQWAKKPo=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 752, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWIQWAO6qA=", + "_parent": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "model": { + "$ref": "AAAAAAFFwLWIQWAKKPo=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 707, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "tail": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "points": "720:728;658:728", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLWIQWAMDo8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLWIQWANo/A=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLWIQWAO6qA=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLWMgWAcaQw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLWMgWAb2Sk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWMgWAd1rc=", + "_parent": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "model": { + "$ref": "AAAAAAFFwLWMgWAb2Sk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 789, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWMgWAeZ8k=", + "_parent": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "model": { + "$ref": "AAAAAAFFwLWMgWAb2Sk=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 804, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWMgWAfxqc=", + "_parent": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "model": { + "$ref": "AAAAAAFFwLWMgWAb2Sk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 759, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "tail": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "points": "720:780;658:780", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLWMgWAd1rc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLWMgWAeZ8k=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLWMgWAfxqc=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwL2WeWA5NQI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL2WeGA460g=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL2WeWA62bI=", + "_parent": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "model": { + "$ref": "AAAAAAFFwL2WeGA460g=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL2WeWA7mnk=", + "_parent": { + "$ref": "AAAAAAFFwL2WeWA62bI=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 61, + "top": 649, + "width": 98, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL2WeWA8/Wk=", + "_parent": { + "$ref": "AAAAAAFFwL2WeWA62bI=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 61, + "top": 663, + "width": 98, + "height": 12, + "text": "UMLDependency" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL2WeWA9NaM=", + "_parent": { + "$ref": "AAAAAAFFwL2WeWA62bI=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "top": 144, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL2WeWA+CiM=", + "_parent": { + "$ref": "AAAAAAFFwL2WeWA62bI=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "top": 144, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 56, + "top": 644, + "width": 108, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL2WeWA7mnk=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL2WeWA8/Wk=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL2WeWA9NaM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL2WeWA+CiM=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 56, + "top": 644, + "width": 108, + "height": 277, + "nameCompartment": { + "$ref": "AAAAAAFFwL2WeWA62bI=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwL4D0mBZIkY=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqJkp/rUc=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL4D0mBaqmw=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4D0mBbBNE=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBaqmw=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 649, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4D0mBc7go=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBaqmw=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 663, + "width": 69.380859375, + "height": 12, + "text": "Create" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4D02Bd3+g=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBaqmw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -48, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4D02BeWA8=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBaqmw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -48, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 644, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL4D0mBbBNE=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL4D0mBc7go=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL4D02Bd3+g=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL4D02BeWA8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwL4D02Bf0q0=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 664, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwL4D02BgYs8=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 664, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwL4D02BhsHw=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -32, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 644, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwL4D0mBaqmw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwL4D02Bf0q0=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwL4D02BgYs8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqJkp/rUc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwL4D02BhsHw=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwL4h4WCCAAY=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqJ0qVBvA=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL4h4WCD82Y=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4h4mCE1YI=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCD82Y=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 713, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4h4mCFbHY=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCD82Y=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 727, + "width": 69.380859375, + "height": 12, + "text": "Call" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4h4mCG+Bo=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCD82Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -108, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4h4mCHhD8=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCD82Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -108, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 708, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL4h4mCE1YI=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL4h4mCFbHY=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL4h4mCG+Bo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL4h4mCHhD8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwL4h4mCIEqs=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 708, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwL4h4mCJktQ=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 708, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwL4h4mCKdqI=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 708, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwL4h4WCD82Y=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwL4h4mCIEqs=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwL4h4mCJktQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqJ0qVBvA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwL4h4mCKdqI=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwL45WWCr3cU=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqJ0qrDxY=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL45WWCsDkc=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL45WWCtTBI=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCsDkc=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 769, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL45WWCuTW0=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCsDkc=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 783, + "width": 69.380859375, + "height": 12, + "text": "Instantiate" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL45WWCv18Q=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCsDkc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -192, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL45WWCwZzE=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCsDkc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -192, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 764, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL45WWCtTBI=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL45WWCuTW0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL45WWCv18Q=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL45WWCwZzE=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwL45WWCxsuk=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 736, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwL45WmCy+mU=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 736, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwL45WmCzW1Y=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -128, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 764, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwL45WWCsDkc=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwL45WWCxsuk=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwL45WmCy+mU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqJ0qrDxY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwL45WmCzW1Y=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwL5hQGDUxa0=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqKErBHOc=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL5hQGDVSBg=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL5hQGDWrwI=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDVSBg=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 825, + "width": 82.013671875, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL5hQGDXPFU=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDVSBg=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 839, + "width": 82.013671875, + "height": 12, + "text": "Responsibility" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL5hQGDYpi0=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDVSBg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -252, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL5hQGDZAt8=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDVSBg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -252, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 820, + "width": 92.013671875, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL5hQGDWrwI=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL5hQGDXPFU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL5hQGDYpi0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL5hQGDZAt8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwL5hQGDa1nY=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 772, + "width": 91, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwL5hQGDbixI=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 772, + "width": 91, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwL5hQGDcuS4=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -168, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 820, + "width": 92.013671875, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwL5hQGDVSBg=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwL5hQGDa1nY=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwL5hQGDbixI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqKErBHOc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwL5hQGDcuS4=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwL7KdWEqew0=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqKErXxgY=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL7KdWEr60A=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL7KdWEspPc=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEr60A=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 881, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL7KdWEt7g0=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEr60A=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 895, + "width": 69.380859375, + "height": 12, + "text": "Send" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL7KdWEum1Q=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEr60A=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -324, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL7KdWEv3Yk=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEr60A=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -324, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 876, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL7KdWEspPc=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL7KdWEt7g0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL7KdWEum1Q=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL7KdWEv3Yk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwL7KdWEwzHc=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 216, + "top": 804, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwL7KdWExRWs=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 216, + "top": 804, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwL7KdWEyL0Q=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -40, + "top": -216, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 876, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwL7KdWEr60A=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwL7KdWEwzHc=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwL7KdWExRWs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqKErXxgY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwL7KdWEyL0Q=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+LCGFgCjw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+LCGFfPQs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+LCGFhp5w=", + "_parent": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "model": { + "$ref": "AAAAAAFFwL+LCGFfPQs=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 347, + "top": 634, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+LCGFihK4=", + "_parent": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "model": { + "$ref": "AAAAAAFFwL+LCGFfPQs=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 347, + "top": 619, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+LCGFjcmE=", + "_parent": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "model": { + "$ref": "AAAAAAFFwL+LCGFfPQs=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 347, + "top": 664, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwK/k1ly1mNU=" + }, + "tail": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "points": "314:655;380:655", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+LCGFhp5w=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+LCGFihK4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+LCGFjcmE=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+O8GFxUF4=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+O8GFwbog=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+O8GFyCzY=", + "_parent": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "model": { + "$ref": "AAAAAAFFwL+O8GFwbog=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 677, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+O8GFzT+A=", + "_parent": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "model": { + "$ref": "AAAAAAFFwL+O8GFwbog=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 692, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+O8GF0qhg=", + "_parent": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "model": { + "$ref": "AAAAAAFFwL+O8GFwbog=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 199, + "top": 647, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "tail": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "points": "236:668;163:668", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+O8GFyCzY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+O8GFzT+A=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+O8GF0qhg=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+SkWGC/a4=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+SkWGBCOg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+SkWGDbeA=", + "_parent": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "model": { + "$ref": "AAAAAAFFwL+SkWGBCOg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 731, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+SkWGEkxM=", + "_parent": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "model": { + "$ref": "AAAAAAFFwL+SkWGBCOg=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 746, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+SkWGFVnU=", + "_parent": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "model": { + "$ref": "AAAAAAFFwL+SkWGBCOg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 199, + "top": 701, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "tail": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "points": "236:722;163:722", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+SkWGDbeA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+SkWGEkxM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+SkWGFVnU=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+WL2GTesQ=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+WL2GScgY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+WL2GUDZ4=", + "_parent": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "model": { + "$ref": "AAAAAAFFwL+WL2GScgY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 797, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+WL2GVfH8=", + "_parent": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "model": { + "$ref": "AAAAAAFFwL+WL2GScgY=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 812, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+WL2GW4Ys=", + "_parent": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "model": { + "$ref": "AAAAAAFFwL+WL2GScgY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 199, + "top": 767, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "tail": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "points": "236:788;163:788", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+WL2GUDZ4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+WL2GVfH8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+WL2GW4Ys=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+Z72GkT5Y=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+Z72GjzGw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+Z72GllyU=", + "_parent": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "model": { + "$ref": "AAAAAAFFwL+Z72GjzGw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 854, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+Z72Gm6K8=", + "_parent": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "model": { + "$ref": "AAAAAAFFwL+Z72GjzGw=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 869, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+Z72GnawI=", + "_parent": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "model": { + "$ref": "AAAAAAFFwL+Z72GjzGw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 199, + "top": 824, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "tail": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "points": "236:845;163:845", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+Z72GllyU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+Z72Gm6K8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+Z72GnawI=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+eh2G1gXM=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+eh2G01aU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+eh2G2oXg=", + "_parent": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "model": { + "$ref": "AAAAAAFFwL+eh2G01aU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 910, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+eh2G3GpE=", + "_parent": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "model": { + "$ref": "AAAAAAFFwL+eh2G01aU=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 925, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+eh2G4woY=", + "_parent": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "model": { + "$ref": "AAAAAAFFwL+eh2G01aU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 199, + "top": 880, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "tail": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "points": "236:901;163:901", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+eh2G2oXg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+eh2G3GpE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+eh2G4woY=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwMFq1GHZe+E=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMFq1GHYSKM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMFq1GHa5CM=", + "_parent": { + "$ref": "AAAAAAFFwMFq1GHZe+E=" + }, + "model": { + "$ref": "AAAAAAFFwMFq1GHYSKM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMFq1GHbxIU=", + "_parent": { + "$ref": "AAAAAAFFwMFq1GHa5CM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 561, + "top": 33, + "width": 93, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMFq1GHc3zA=", + "_parent": { + "$ref": "AAAAAAFFwMFq1GHa5CM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 561, + "top": 47, + "width": 93, + "height": 12, + "text": "UMLAbstraction" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMFq1GHdTFI=", + "_parent": { + "$ref": "AAAAAAFFwMFq1GHa5CM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMFq1GHeicg=", + "_parent": { + "$ref": "AAAAAAFFwMFq1GHa5CM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 28, + "width": 103, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMFq1GHbxIU=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMFq1GHc3zA=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMFq1GHdTFI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMFq1GHeicg=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 28, + "width": 103, + "height": 153, + "nameCompartment": { + "$ref": "AAAAAAFFwMFq1GHa5CM=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwMGle2H29zI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqKksmed8=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMGle2H3I+8=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGle2H4B8s=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H3I+8=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 745, + "top": 29, + "width": 110.396484375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGle2H5FWo=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H3I+8=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 745, + "top": 43, + "width": 110.396484375, + "height": 12, + "text": "Derive" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGle2H6wQw=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H3I+8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 252, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGle2H7ifs=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H3I+8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 252, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 24, + "width": 120.396484375, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMGle2H4B8s=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMGle2H5FWo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMGle2H6wQw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMGle2H7ifs=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwMGle2H8ZWU=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFFwMJPAWJ40Vg=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H8ZWU=" + }, + "model": { + "$ref": "AAAAAAFFwMJO92J1Y/s=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 745, + "top": 65, + "width": 110.396484375, + "height": 12, + "text": "+computation: String", + "horizontalAlignment": 0 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 60, + "width": 127.16787719726562, + "height": 22 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwMGle2H9VL8=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 824, + "top": 60, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwMGle2H+hpQ=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 168, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 24, + "width": 120.396484375, + "height": 58, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwMGle2H3I+8=" + }, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwMGle2H8ZWU=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwMGle2H9VL8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqKksmed8=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwMGle2H+hpQ=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwMGo6mIepMc=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqK0s9CwU=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMGo6mIfS5g=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGo6mIgcys=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIfS5g=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 745, + "top": 101, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGo6mIha40=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIfS5g=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 745, + "top": 115, + "width": 69.380859375, + "height": 12, + "text": "Refine" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGo6mIiGvE=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIfS5g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 276, + "top": 120, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGo6mIjVCs=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIfS5g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 276, + "top": 120, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 96, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMGo6mIgcys=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMGo6mIha40=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMGo6mIiGvE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMGo6mIjVCs=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwMGo6mIkY0Y=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 832, + "top": 172, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwMGo6mIlYhc=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 832, + "top": 172, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwMGo6mImbZE=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 184, + "top": 80, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 96, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwMGo6mIfS5g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwMGo6mIkY0Y=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwMGo6mIlYhc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqK0s9CwU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwMGo6mImbZE=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwMGrimJGJ0s=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqK0tTuyw=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMGrimJHZ7Y=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGrimJIfxU=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJHZ7Y=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 745, + "top": 153, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGrimJJ7uc=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJHZ7Y=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 745, + "top": 167, + "width": 69.380859375, + "height": 12, + "text": "Trace" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGrimJKI9M=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJHZ7Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 324, + "top": 168, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGrimJL3ag=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJHZ7Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 324, + "top": 168, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 148, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMGrimJIfxU=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMGrimJJ7uc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMGrimJKI9M=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMGrimJL3ag=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwMGrimJMCIQ=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 848, + "top": 240, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwMGrimJNPbE=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 848, + "top": 240, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwMGrimJOkXc=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 216, + "top": 112, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 148, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwMGrimJHZ7Y=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwMGrimJMCIQ=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwMGrimJNPbE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqK0tTuyw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwMGrimJOkXc=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwMLTm2KEAI0=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMLTmmKDF1M=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLTm2KFRRg=", + "_parent": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "model": { + "$ref": "AAAAAAFFwMLTmmKDF1M=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 61, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLTm2KGrkQ=", + "_parent": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "model": { + "$ref": "AAAAAAFFwMLTmmKDF1M=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 76, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLTm2KHZTE=", + "_parent": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "model": { + "$ref": "AAAAAAFFwMLTmmKDF1M=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 699, + "top": 31, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwMFq1GHZe+E=" + }, + "tail": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "points": "740:52;658:52", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwMLTm2KFRRg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMLTm2KGrkQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMLTm2KHZTE=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwMLXQmKVDuM=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMLXQmKUyu0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLXQmKW+3c=", + "_parent": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "model": { + "$ref": "AAAAAAFFwMLXQmKUyu0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 121, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLXQmKXpUQ=", + "_parent": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "model": { + "$ref": "AAAAAAFFwMLXQmKUyu0=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 136, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLXQmKYWOg=", + "_parent": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "model": { + "$ref": "AAAAAAFFwMLXQmKUyu0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 699, + "top": 91, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwMFq1GHZe+E=" + }, + "tail": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "points": "740:112;658:112", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwMLXQmKW+3c=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMLXQmKXpUQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMLXQmKYWOg=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwMLbmmKmAvI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMLbmmKloGE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLbmmKnMuM=", + "_parent": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "model": { + "$ref": "AAAAAAFFwMLbmmKloGE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 169, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLbmmKonTw=", + "_parent": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "model": { + "$ref": "AAAAAAFFwMLbmmKloGE=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 184, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLbmmKpbLQ=", + "_parent": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "model": { + "$ref": "AAAAAAFFwMLbmmKloGE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 699, + "top": 139, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwMFq1GHZe+E=" + }, + "tail": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "points": "740:160;658:160", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwMLbmmKnMuM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMLbmmKonTw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMLbmmKpbLQ=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwMYNEWK8jeA=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMYNEWK7ItA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMYNEWK9Wb8=", + "_parent": { + "$ref": "AAAAAAFFwMYNEWK8jeA=" + }, + "model": { + "$ref": "AAAAAAFFwMYNEWK7ItA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMYNEWK++fU=", + "_parent": { + "$ref": "AAAAAAFFwMYNEWK9Wb8=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 561, + "top": 833, + "width": 91, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMYNEWK/PY8=", + "_parent": { + "$ref": "AAAAAAFFwMYNEWK9Wb8=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 561, + "top": 847, + "width": 91, + "height": 12, + "text": "UMLPackage" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMYNEWLAHjA=", + "_parent": { + "$ref": "AAAAAAFFwMYNEWK9Wb8=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMYNEWLBm9I=", + "_parent": { + "$ref": "AAAAAAFFwMYNEWK9Wb8=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 828, + "width": 101, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMYNEWK++fU=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMYNEWK/PY8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMYNEWLAHjA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMYNEWLBm9I=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 828, + "width": 101, + "height": 101, + "nameCompartment": { + "$ref": "AAAAAAFFwMYNEWK9Wb8=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwMdnrWLZAY8=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqLUuNRhM=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMdnrWLaXkY=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMdnrmLbib0=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLaXkY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 729, + "top": 837, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMdnrmLclU4=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLaXkY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 729, + "top": 851, + "width": 72.51593017578125, + "height": 12, + "text": "Framework" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMdnrmLdBNU=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLaXkY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMdnrmLeF4I=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLaXkY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 832, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMdnrmLbib0=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMdnrmLclU4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMdnrmLdBNU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMdnrmLeF4I=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwMdnrmLf950=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 868, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwMdnrmLgzek=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 878, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwMdnrmLhmpQ=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 832, + "width": 82.51593017578125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwMdnrWLaXkY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwMdnrmLf950=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwMdnrmLgzek=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqLUuNRhM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwMdnrmLhmpQ=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwMeIHGMCTCk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqLUujT3E=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMeIHGMDiPY=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMeIHGMEN4g=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMDiPY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 729, + "top": 893, + "width": 75.345703125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMeIHGMFxQc=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMDiPY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 729, + "top": 907, + "width": 75.345703125, + "height": 12, + "text": "ModelLibrary" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMeIHGMG6CQ=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMDiPY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -60, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMeIHGMH2dQ=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMDiPY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -60, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 888, + "width": 85.345703125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMeIHGMEN4g=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMeIHGMFxQc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMeIHGMG6CQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMeIHGMH2dQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwMeIHGMI7hI=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 904, + "width": 85, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwMeIHGMJi90=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 914, + "width": 85, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwMeIHGMK1pc=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -40, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 888, + "width": 85.345703125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwMeIHGMDiPY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwMeIHGMI7hI=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwMeIHGMJi90=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqLUujT3E=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwMeIHGMK1pc=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwMevo2Mq4Ew=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMevo2MpIU4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMevo2Mr7wQ=", + "_parent": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "model": { + "$ref": "AAAAAAFFwMevo2MpIU4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 861, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMevo2Msv/w=", + "_parent": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "model": { + "$ref": "AAAAAAFFwMevo2MpIU4=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 876, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMevo2MtL5c=", + "_parent": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "model": { + "$ref": "AAAAAAFFwMevo2MpIU4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 690, + "top": 831, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwMYNEWK8jeA=" + }, + "tail": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "points": "724:852;656:852", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwMevo2Mr7wQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMevo2Msv/w=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMevo2MtL5c=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwMe0G2M7rmg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMe0G2M69PQ=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMe0G2M8gls=", + "_parent": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "model": { + "$ref": "AAAAAAFFwMe0G2M69PQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 917, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMe0G2M9WEg=", + "_parent": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "model": { + "$ref": "AAAAAAFFwMe0G2M69PQ=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 932, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMe0G2M+CD8=", + "_parent": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "model": { + "$ref": "AAAAAAFFwMe0G2M69PQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 690, + "top": 887, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwMYNEWK8jeA=" + }, + "tail": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "points": "724:908;656:908", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwMe0G2M8gls=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMe0G2M9WEg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMe0G2M+CD8=" + } + } + ] + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFElnFrT1S7Kic=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLClassifier" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFElnF1nFTY/Sw=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Realization", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFElnGGLFUFZFA=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "source": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "target": { + "$ref": "AAAAAAFElnFrT1S7Kic=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFElnF1nFTZHOU=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFElnJRglVKSoc=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Specification", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFElnKVuVV4pBU=", + "_parent": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "source": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "target": { + "$ref": "AAAAAAFElnFrT1S7Kic=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFElnJRglVLifA=", + "_parent": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFJsYgDTM+Z6E=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "entity", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFJsZx3DOCac8=", + "_parent": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "source": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFJsYgDTM/qY8=", + "_parent": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "width": 40, + "height": 40, + "content": "var w = rect.getWidth(),\n m = w / 10;\ncanvas.fillEllipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.ellipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.line(rect.x1 + m, rect.y2 - m, rect.x2 - m, rect.y2 - m);\n" + } + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFJsZbpDNobIs=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLClass" + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwKqhJFq06mA=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLArtifact" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKsvdVrRJUQ=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "File", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK5AeFyZpVg=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "source": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "isAbstract": true, + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKsvdVrSLo0=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKtwS1r6wew=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Document", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFFwKzkslvX4gU=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "source": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "target": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK4k1VxEEpM=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "source": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKtwS1r7XqE=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKuBulsidLQ=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Executable", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFFwKzsCVvo11g=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "source": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "target": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK4o4VxVx00=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "source": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKuBulsjhp0=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKuIMltKnQQ=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Library", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFFwKzxcVv56Dg=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "source": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "target": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK4tiVxmVJM=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "source": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKuIMltLkmg=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKuS0ltysPk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Script", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFFwKz3OVwK9hs=", + "_parent": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "source": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "target": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK41YVx3Hr0=", + "_parent": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "source": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKuS0ltz9pw=", + "_parent": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKueMVuaLXM=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Source", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFFwKz9mFwbfDg=", + "_parent": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "source": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "target": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK47MFyIL/c=", + "_parent": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "source": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKueMlubedY=", + "_parent": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwK/k1ly00Ec=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLBehavioralFeature" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLBdO1zQosE=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Destroy", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLDMaFz5C14=", + "_parent": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "source": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "target": { + "$ref": "AAAAAAFFwK/k1ly00Ec=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLBdO1zR7Ak=", + "_parent": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLFUbV0QQVA=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Auxiliary", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLNej157D6Y=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "source": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLFUbV0RoPU=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLFu8104he4=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Focus", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLNkZ16Mp7Y=", + "_parent": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "source": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLFu9F05JGE=", + "_parent": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLF4tF1g4No=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Metaclass", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLNn916d4Yc=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "source": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLF4tF1h94I=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLF/G12IJ54=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "ImplementationClass", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLNr116u93k=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "source": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLF/G12JIns=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLGEO12wqJ8=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Type", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLNvdl6/WJI=", + "_parent": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "source": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLGEPF2x7bg=", + "_parent": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLGI813YL3s=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Utility", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLN0fl7QL9o=", + "_parent": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "source": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLGI813ZPxY=", + "_parent": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLProfileDiagram", + "_id": "AAAAAAFFwLKxU14QPaE=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Robustness Stereotypes", + "ownedViews": [ + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLL0NF4VWXk=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqMEwRREE=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLL0NF4WzoE=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLL0NF4X88I=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4WzoE=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 217, + "top": 89, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLL0NF4YSt8=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4WzoE=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 217, + "top": 103, + "width": 72.51593017578125, + "height": 12, + "text": "entity" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLL0NF4ZQaQ=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4WzoE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -1065, + "top": -270, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLL0NF4asxs=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4WzoE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -1065, + "top": -270, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 84, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLL0NF4X88I=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLL0NF4YSt8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLL0NF4ZQaQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLL0NF4asxs=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLL0NF4bgXg=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 92, + "top": -28, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLL0NF4cZ88=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 92, + "top": -18, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLL0NF4dJaE=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -710, + "top": -180, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 84, + "width": 82.51593017578125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwLL0NF4WzoE=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLL0NF4bgXg=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLL0NF4cZ88=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqMEwRREE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLL0NF4dJaE=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwLMO8l44tWU=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLMO8l45ook=", + "_parent": { + "$ref": "AAAAAAFFwLMO8l44tWU=" + }, + "model": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLMO8l46Nac=", + "_parent": { + "$ref": "AAAAAAFFwLMO8l45ook=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 33, + "top": 33, + "width": 79, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLMO8l47xu4=", + "_parent": { + "$ref": "AAAAAAFFwLMO8l45ook=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 33, + "top": 47, + "width": 79, + "height": 12, + "text": "UMLClass" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLMO8l48V+s=", + "_parent": { + "$ref": "AAAAAAFFwLMO8l45ook=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -489, + "top": -414, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLMO8l490+g=", + "_parent": { + "$ref": "AAAAAAFFwLMO8l45ook=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -489, + "top": -414, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 28, + "top": 28, + "width": 89, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLMO8l46Nac=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLMO8l47xu4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLMO8l48V+s=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLMO8l490+g=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 28, + "top": 28, + "width": 89, + "height": 149, + "nameCompartment": { + "$ref": "AAAAAAFFwLMO8l45ook=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLMO814+17w=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFJsZx3DOCac8=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLMO814/vLk=", + "_parent": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "model": { + "$ref": "AAAAAAFFJsZx3DOCac8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 109, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLMO815A2sw=", + "_parent": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "model": { + "$ref": "AAAAAAFFJsZx3DOCac8=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 124, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLMO815BAcU=", + "_parent": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "model": { + "$ref": "AAAAAAFFJsZx3DOCac8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 164, + "top": 79, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLMO8l44tWU=" + }, + "tail": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "points": "212:100;116:100", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLMO814/vLk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLMO815A2sw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLMO815BAcU=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwx8Q/35wG9A=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqMUw9MBk=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwx8Q/35xpyY=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwx8Q/35yVU8=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35xpyY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 217, + "top": 37, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwx8Q/35z0VE=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35xpyY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 217, + "top": 51, + "width": 72.51593017578125, + "height": 12, + "text": "control" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwx8Q/3506PU=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35xpyY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -336, + "top": -312, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwx8Q/351cP0=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35xpyY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -336, + "top": -312, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 32, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwx8Q/35yVU8=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwx8Q/35z0VE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwx8Q/3506PU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwx8Q/351cP0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwx8RAH52xko=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 76, + "top": -4, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwx8RAH53MWs=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 76, + "top": 6, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwx8RAH54kik=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -224, + "top": -208, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 32, + "width": 82.51593017578125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwx8Q/35xpyY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwx8RAH52xko=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwx8RAH53MWs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqMUw9MBk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwx8RAH54kik=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwyAHeH6a9yk=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFwyAHeH6Znas=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwyAHeX6b9JY=", + "_parent": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "model": { + "$ref": "AAAAAAFFwyAHeH6Znas=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 61, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwyAHeX6cKyY=", + "_parent": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "model": { + "$ref": "AAAAAAFFwyAHeH6Znas=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 76, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwyAHeX6dvIk=", + "_parent": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "model": { + "$ref": "AAAAAAFFwyAHeH6Znas=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 164, + "top": 31, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLMO8l44tWU=" + }, + "tail": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "points": "212:52;116:52", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwyAHeX6b9JY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwyAHeX6cKyY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwyAHeX6dvIk=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFw0h1/QXNqo4=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqMkxa+TA=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFw0h1/gXOBI4=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFw0h1/gXPA/w=", + "_parent": { + "$ref": "AAAAAAFFw0h1/gXOBI4=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 217, + "top": 141, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFw0h1/gXQ/LI=", + "_parent": { + "$ref": "AAAAAAFFw0h1/gXOBI4=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 217, + "top": 155, + "width": 72.51593017578125, + "height": 12, + "text": "boundary" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFw0h1/gXRrB4=", + "_parent": { + "$ref": "AAAAAAFFw0h1/gXOBI4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 96, + "top": -360, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFw0h1/gXSVgA=", + "_parent": { + "$ref": "AAAAAAFFw0h1/gXOBI4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 96, + "top": -360, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 136, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFw0h1/gXPA/w=" + }, + "nameLabel": { + "$ref": "AAAAAAFFw0h1/gXQ/LI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFw0h1/gXRrB4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFw0h1/gXSVgA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFw0h1/gXTCRY=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 72, + "top": -20, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFw0h1/gXUu1g=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 72, + "top": -10, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFw0h1/gXVEL8=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 64, + "top": -240, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 136, + "width": 82.51593017578125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFw0h1/gXOBI4=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFw0h1/gXTCRY=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFw0h1/gXUu1g=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqMkxa+TA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFw0h1/gXVEL8=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFw0o5p5IVMGM=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFw0o5ppIUB2s=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFw0o5p5IW5Js=", + "_parent": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "model": { + "$ref": "AAAAAAFFw0o5ppIUB2s=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 165, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFw0o5p5IXSKA=", + "_parent": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "model": { + "$ref": "AAAAAAFFw0o5ppIUB2s=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 180, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFw0o5p5IY/GE=", + "_parent": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "model": { + "$ref": "AAAAAAFFw0o5ppIUB2s=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 164, + "top": 135, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLMO8l44tWU=" + }, + "tail": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "points": "212:156;116:156", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFw0o5p5IW5Js=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFw0o5p5IXSKA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFw0o5p5IY/GE=" + } + } + ] + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwLRECl7r1R4=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLComponent" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLR8CF8G68k=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Entity", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLV9gV/Xhk4=", + "_parent": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "source": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLR8CF8HOik=", + "_parent": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLSByF8umMo=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Implementation", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLWA0V/olVk=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "source": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLSByF8vzKA=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLSIN19WMnE=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Process", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLWEUV/5Qq4=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "source": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLSIN19XVng=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLSO/19+cMY=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Service", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLWIQWAKKPo=", + "_parent": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "source": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLSO/19/YUk=", + "_parent": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLSXP1+mTVk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Subsystem", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLWMgWAb2Sk=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "source": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLSXP1+njeI=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwL2WeGA460g=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLDependency" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwL4D0mBXwu4=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Create", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+LCGFfPQs=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "source": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "target": { + "$ref": "AAAAAAFFwK/k1ly00Ec=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+O8GFwbog=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "source": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "target": { + "$ref": "AAAAAAFFwL2WeGA460g=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwL4D0mBYXVU=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwL4h4WCAEkg=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Call", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+SkWGBCOg=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "source": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "target": { + "$ref": "AAAAAAFFwL2WeGA460g=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwL4h4WCBKPU=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwL45WWCpJ0o=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Instantiate", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+WL2GScgY=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "source": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "target": { + "$ref": "AAAAAAFFwL2WeGA460g=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwL45WWCq/8I=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwL5hP2DSEFk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Responsibility", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+Z72GjzGw=", + "_parent": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "source": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "target": { + "$ref": "AAAAAAFFwL2WeGA460g=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwL5hQGDTCjI=", + "_parent": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwL7KdWEoDhA=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Send", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+eh2G01aU=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "source": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "target": { + "$ref": "AAAAAAFFwL2WeGA460g=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwL7KdWEpx8M=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwMFq1GHYSKM=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLAbstraction" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwMGlemH0Tq8=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Derive", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwMLTmmKDF1M=", + "_parent": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "source": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "target": { + "$ref": "AAAAAAFFwMFq1GHYSKM=" + } + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFFwMJO92J1Y/s=", + "_parent": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "name": "computation", + "type": "String" + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwMGlemH1M8k=", + "_parent": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwMGo6mIcITc=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Refine", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwMLXQmKUyu0=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "source": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "target": { + "$ref": "AAAAAAFFwMFq1GHYSKM=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwMGo6mIdBMU=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwMGrimJEvvk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Trace", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwMLbmmKloGE=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "source": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "target": { + "$ref": "AAAAAAFFwMFq1GHYSKM=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwMGrimJF+z8=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwMYNEWK7ItA=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLPackage" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwMdnrWLXWLA=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Framework", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwMevo2MpIU4=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "source": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "target": { + "$ref": "AAAAAAFFwMYNEWK7ItA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwMdnrWLYFcM=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwMeIHGMAPDc=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "ModelLibrary", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwMe0G2M69PQ=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "source": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "target": { + "$ref": "AAAAAAFFwMYNEWK7ItA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwMeIHGMBKKk=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLProfileDiagram", + "_id": "AAAAAAFFwQCuI7bLjDk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "StandardProfileL3", + "ownedViews": [ + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwQHC9rbwK6A=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQHC9rbvUkk=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwQHC9rbx7Lo=", + "_parent": { + "$ref": "AAAAAAFFwQHC9rbwK6A=" + }, + "model": { + "$ref": "AAAAAAFFwQHC9rbvUkk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHC9rbyTUQ=", + "_parent": { + "$ref": "AAAAAAFFwQHC9rbx7Lo=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 45, + "top": 121, + "width": 107, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHC9rbzlgQ=", + "_parent": { + "$ref": "AAAAAAFFwQHC9rbx7Lo=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 45, + "top": 135, + "width": 107, + "height": 12, + "text": "UMLModel" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHC9rb0L9g=", + "_parent": { + "$ref": "AAAAAAFFwQHC9rbx7Lo=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -168, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHC9rb1XIk=", + "_parent": { + "$ref": "AAAAAAFFwQHC9rbx7Lo=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -168, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 40, + "top": 116, + "width": 117, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQHC9rbyTUQ=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwQHC9rbzlgQ=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwQHC9rb0L9g=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQHC9rb1XIk=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 40, + "top": 116, + "width": 117, + "height": 97, + "nameCompartment": { + "$ref": "AAAAAAFFwQHC9rbx7Lo=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwQHjjbcLQPM=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqN0zJrS0=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwQHjjbcMlRY=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHjjbcNrIk=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcMlRY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 229, + "top": 41, + "width": 115, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHjjbcOnWs=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcMlRY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 229, + "top": 55, + "width": 115, + "height": 12, + "text": "BuildComponent" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHjjbcPLIM=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcMlRY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 108, + "top": -48, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHjjbcQOtc=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcMlRY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 108, + "top": -48, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 36, + "width": 125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQHjjbcNrIk=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwQHjjbcOnWs=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwQHjjbcPLIM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQHjjbcQOtc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwQHjjrcRsYI=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 260, + "top": 56, + "width": 105, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwQHjjrcSCoc=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 260, + "top": 66, + "width": 105, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwQHjjrcTWEY=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 72, + "top": -32, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 36, + "width": 125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwQHjjbcMlRY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwQHjjrcRsYI=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwQHjjrcSCoc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqN0zJrS0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwQHjjrcTWEY=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwQIPLLc0Q7M=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqOEzfvr8=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwQIPLLc1jrg=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIPLLc2rps=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc1jrg=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 229, + "top": 121, + "width": 83, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIPLLc3wdo=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc1jrg=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 229, + "top": 135, + "width": 83, + "height": 12, + "text": "Metamodel" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIPLLc4SHA=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc1jrg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 108, + "top": -84, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIPLLc5Qvc=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc1jrg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 108, + "top": -84, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 116, + "width": 93, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQIPLLc2rps=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwQIPLLc3wdo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwQIPLLc4SHA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQIPLLc5Qvc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwQIPLLc63qc=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 260, + "top": 124, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwQIPLbc7y2w=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 260, + "top": 134, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwQIPLbc8jC8=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 72, + "top": -56, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 116, + "width": 93, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwQIPLLc1jrg=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwQIPLLc63qc=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwQIPLbc7y2w=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqOEzfvr8=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwQIPLbc8jC8=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwQIrDLddK/I=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqOEz1SWk=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwQIrDLdevJE=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIrDLdfcec=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdevJE=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 229, + "top": 181, + "width": 83, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIrDLdgsTM=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdevJE=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 229, + "top": 195, + "width": 83, + "height": 12, + "text": "SystemModel" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIrDLdhAR0=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdevJE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 120, + "top": -168, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIrDLdiiuQ=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdevJE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 120, + "top": -168, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 176, + "width": 93, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQIrDLdfcec=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwQIrDLdgsTM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwQIrDLdhAR0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQIrDLdiiuQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwQIrDLdjYt8=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 264, + "top": 156, + "width": 88, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwQIrDLdkEoo=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 264, + "top": 166, + "width": 88, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwQIrDLdlkbo=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 80, + "top": -112, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 176, + "width": 93, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwQIrDLdevJE=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwQIrDLdjYt8=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwQIrDLdkEoo=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqOEz1SWk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwQIrDLdlkbo=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwQLOH7eRZzI=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQLOH7eQuvE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLOH7eSzo8=", + "_parent": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "model": { + "$ref": "AAAAAAFFwQLOH7eQuvE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 145, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLOILeTl4U=", + "_parent": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "model": { + "$ref": "AAAAAAFFwQLOH7eQuvE=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 160, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLOILeU1qE=", + "_parent": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "model": { + "$ref": "AAAAAAFFwQLOH7eQuvE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 190, + "top": 115, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwQHC9rbwK6A=" + }, + "tail": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "points": "224:136;156:136", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwQLOH7eSzo8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQLOILeTl4U=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQLOILeU1qE=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwQLSp7eim6s=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQLSp7eh5o0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLSp7ejdqM=", + "_parent": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "model": { + "$ref": "AAAAAAFFwQLSp7eh5o0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 205, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLSp7ekT+I=", + "_parent": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "model": { + "$ref": "AAAAAAFFwQLSp7eh5o0=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 220, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLSp7el67w=", + "_parent": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "model": { + "$ref": "AAAAAAFFwQLSp7eh5o0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 190, + "top": 175, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwQHC9rbwK6A=" + }, + "tail": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "points": "224:196;156:196", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwQLSp7ejdqM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQLSp7ekT+I=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQLSp7el67w=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwQdYRLfPnZs=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwQdYRLfQc8o=", + "_parent": { + "$ref": "AAAAAAFFwQdYRLfPnZs=" + }, + "model": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwQdYRLfRm/U=", + "_parent": { + "$ref": "AAAAAAFFwQdYRLfQc8o=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 45, + "top": 41, + "width": 107, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQdYRLfSwyU=", + "_parent": { + "$ref": "AAAAAAFFwQdYRLfQc8o=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 45, + "top": 55, + "width": 107, + "height": 12, + "text": "UMLComponent" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQdYRLfTyV4=", + "_parent": { + "$ref": "AAAAAAFFwQdYRLfQc8o=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -702, + "top": -954, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQdYRLfUafY=", + "_parent": { + "$ref": "AAAAAAFFwQdYRLfQc8o=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -702, + "top": -954, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 40, + "top": 36, + "width": 117, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQdYRLfRm/U=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwQdYRLfSwyU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwQdYRLfTyV4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQdYRLfUafY=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 40, + "top": 36, + "width": 117, + "height": 41, + "nameCompartment": { + "$ref": "AAAAAAFFwQdYRLfQc8o=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwQgwnLf7u0w=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQgwnLf6Q+0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQgwnLf82nE=", + "_parent": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "model": { + "$ref": "AAAAAAFFwQgwnLf6Q+0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 64, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQgwnbf9bFo=", + "_parent": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "model": { + "$ref": "AAAAAAFFwQgwnLf6Q+0=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 79, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQgwnbf+ckE=", + "_parent": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "model": { + "$ref": "AAAAAAFFwQgwnLf6Q+0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 190, + "top": 34, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwQdYRLfPnZs=" + }, + "tail": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "lineStyle": 1, + "points": "223:55;157:55", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwQgwnLf82nE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQgwnbf9bFo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQgwnbf+ckE=" + } + } + ] + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwQHC9rbvUkk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLModel" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwQHjjbcJ4Ks=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "BuildComponent", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwQgwnLf6Q+0=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "source": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwQHjjbcKYjk=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwQIPLLcykEY=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Metamodel", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwQLOH7eQuvE=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "source": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "target": { + "$ref": "AAAAAAFFwQHC9rbvUkk=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwQIPLLcz/1A=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwQIrDLdbTko=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "SystemModel", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwQLSp7eh5o0=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "source": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "target": { + "$ref": "AAAAAAFFwQHC9rbvUkk=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwQIrDLdcjKw=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwx8Q/35u/80=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "control", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwyAHeH6Znas=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "source": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwx8Q/35vMf0=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "width": 40, + "height": 40, + "content": "var w = rect.getWidth(),\n h = w / 2,\n m = w / 8;\ncanvas.fillEllipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.ellipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.line(rect.x1 + h, rect.y1 + m, rect.x1 + h + m, rect.y1);\ncanvas.line(rect.x1 + h, rect.y1 + m, rect.x1 + h + m, rect.y1 + 2 * m);\n" + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFw0h1/QXL978=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "boundary", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFw0o5ppIUB2s=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "source": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFw0h1/QXM/ss=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "width": "50", + "height": 40, + "content": "var w = rect.getWidth(),\n h = rect.getHeight(),\n m = w / 5;\ncanvas.fillEllipse(rect.x1 + m, rect.y1, rect.x2, rect.y2);\ncanvas.ellipse(rect.x1 + m, rect.y1, rect.x2, rect.y2);\ncanvas.line(rect.x1, rect.y1, rect.x1, rect.y2);\ncanvas.line(rect.x1, rect.y1 + h/2, rect.x1 + m, rect.y1 + h/2);\n" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/doc/状态机.mdj b/app/doc/状态机.mdj new file mode 100644 index 0000000..5f1212f --- /dev/null +++ b/app/doc/状态机.mdj @@ -0,0 +1,45155 @@ +{ + "_type": "Project", + "_id": "AAAAAAFElm5XMFNoGY0=", + "name": "Untitled", + "ownedElements": [ + { + "_type": "UMLModel", + "_id": "AAAAAAFElm6BOFNpegQ=", + "_parent": { + "$ref": "AAAAAAFElm5XMFNoGY0=" + }, + "name": "Model", + "ownedElements": [ + { + "_type": "UMLUseCaseDiagram", + "_id": "AAAAAAF5P5m6Qk1jVXQ=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "UseCaseDiagram1", + "ownedViews": [ + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P5nMr01oLTI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P5nMr01pxLs=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P5nMr01qZlQ=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01pxLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 4528, + "top": 672, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5nMr01rWkA=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01pxLs=" + }, + "font": "Arial;13;1", + "left": 2284, + "top": 347.5, + "width": 62, + "height": 13, + "text": "check2C" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5nMr01srVY=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01pxLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 4528, + "top": 672, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5nMr01tKAI=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01pxLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 4528, + "top": 672, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 2279, + "top": 340.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P5nMr01qZlQ=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P5nMr01rWkA=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P5nMr01srVY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P5nMr01tKAI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P5nMr01u10s=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2264, + "top": 336, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P5nMr01vn/8=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2264, + "top": 336, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5nMr01wvTc=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2264, + "top": 336, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P5nMr01xNvU=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2264, + "top": 336, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P5nMr01yEgM=", + "_parent": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "model": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2264, + "top": 336, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 2264, + "top": 336, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P5nMr01pxLs=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P5nMr01u10s=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P5nMr01vn/8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5nMr01wvTc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P5nMr01xNvU=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P5nMr01yEgM=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P5saWE3J2FY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3K1ts=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "font": "Arial;13;0", + "left": 2186, + "top": 446, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 1, + "text": "+通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3LIi0=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 2224, + "top": 458, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3M7xA=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2196, + "top": 423, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3NmNI=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03GReQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2281, + "top": 393, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3Oy1k=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03GReQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2287, + "top": 404, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3PZiY=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03GReQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2267, + "top": 368, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3QKR0=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03HrLQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2149, + "top": 500, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3RVpc=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03HrLQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2159, + "top": 509, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5saWE3S3i0=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03HrLQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2128, + "top": 481, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P5saWE3TepE=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03GReQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2152, + "top": 160, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P5saWE3U3g4=", + "_parent": { + "$ref": "AAAAAAF5P5saWE3J2FY=" + }, + "model": { + "$ref": "AAAAAAF5P5saV03HrLQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2152, + "top": 160, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5StIJ55ESsdQ=" + }, + "tail": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "lineStyle": 1, + "points": "2292:371;2120:511", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P5saWE3K1ts=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P5saWE3LIi0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P5saWE3M7xA=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P5saWE3NmNI=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P5saWE3Oy1k=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P5saWE3PZiY=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P5saWE3QKR0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P5saWE3RVpc=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P5saWE3S3i0=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P5saWE3TepE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P5saWE3U3g4=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P56LZE6M/G8=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P56LZE6NeNY=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P56LZE6OE2I=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6NeNY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -464, + "top": -224, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P56LZE6PKW0=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6NeNY=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 205, + "top": 283.5, + "width": 103, + "height": 13, + "text": "【用户选择操作】" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P56LZE6QSXM=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6NeNY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -464, + "top": -224, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P56LZE6RMmU=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6NeNY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -464, + "top": -224, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 200, + "top": 276.5, + "width": 114, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P56LZE6OE2I=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P56LZE6PKW0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P56LZE6QSXM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P56LZE6RMmU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P56LZE6SLIg=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -232, + "top": -112, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P56LZE6TWFg=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -232, + "top": -112, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P56LZE6U8ts=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -232, + "top": -112, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P56LZE6VNIk=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -232, + "top": -112, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P56LZE6W1sE=", + "_parent": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "model": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -232, + "top": -112, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 176, + "top": 272, + "width": 161, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P56LZE6NeNY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P56LZE6SLIg=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P56LZE6TWFg=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P56LZE6U8ts=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P56LZE6VNIk=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P56LZE6W1sE=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P56tgE7IY7E=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7JO9U=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "font": "Arial;13;0", + "left": 1216, + "top": 36, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 1, + "text": "+未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7Kkjk=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1252, + "top": 51, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7LlPE=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1251, + "top": 7, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7MSF4=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7F7Yk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2273, + "top": 317, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7NsLs=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7F7Yk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2261, + "top": 323, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7OBww=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7F7Yk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2298, + "top": 304, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7PoMY=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7GNNA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 296, + "top": 253, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7Q0NM=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7GNNA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 308, + "top": 259, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P56tgE7RtW8=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7GNNA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 271, + "top": 240, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P56tgE7SCeE=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7F7Yk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P56tgE7TSmw=", + "_parent": { + "$ref": "AAAAAAF5P56tgE7IY7E=" + }, + "model": { + "$ref": "AAAAAAF5P56tgE7GNNA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "tail": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "lineStyle": 1, + "points": "2301:335;2064:16;440:40;269:271", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P56tgE7JO9U=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P56tgE7Kkjk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P56tgE7LlPE=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P56tgE7MSF4=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P56tgE7NsLs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P56tgE7OBww=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P56tgE7PoMY=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P56tgE7Q0NM=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P56tgE7RtW8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P56tgE7SCeE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P56tgE7TSmw=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P5/CAk98zZc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P5/CAk99r9g=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P5/CA09+uJY=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk99r9g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1056, + "top": -208, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5/CA09/h4M=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk99r9g=" + }, + "font": "Arial;13;1", + "left": 1260, + "top": 395.5, + "width": 62, + "height": 13, + "text": "Idle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5/CA0+AvMQ=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk99r9g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1056, + "top": -208, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P5/CA0+BODA=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk99r9g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1056, + "top": -208, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1255, + "top": 388.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P5/CA09+uJY=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P5/CA09/h4M=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P5/CA0+AvMQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P5/CA0+BODA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P5/CA0+CFD4=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": -104, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P5/CA0+DO7Q=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": -104, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5/CA0+EZ7w=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": -104, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P5/CA0+FMSM=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": -104, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P5/CA0+GOcA=", + "_parent": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "model": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": -104, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1240, + "top": 384, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P5/CAk99r9g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P5/CA0+CFD4=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P5/CA0+DO7Q=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5/CA0+EZ7w=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P5/CA0+FMSM=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P5/CA0+GOcA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P5/ask/ENuY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/FCi8=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "font": "Arial;13;0", + "left": 514, + "top": 360, + "width": 124.22798156738281, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 1, + "text": "+选择忽略or重测目标" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/GmBY=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 580, + "top": 346, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/H9Os=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 567, + "top": 389, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/ITgo=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/BASE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 347, + "top": 293, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/J3dw=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/BASE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 353, + "top": 281, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/KH+Q=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/BASE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 335, + "top": 319, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/LwxI=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/CwwU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 806, + "top": 427, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/MCSM=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/CwwU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 807, + "top": 413, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P5/ask/N7rw=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/CwwU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 802, + "top": 454, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P5/ask/OUQY=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/BASE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P5/ask/P3tM=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ENuY=" + }, + "model": { + "$ref": "AAAAAAF5P5/ask/CwwU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "lineStyle": 1, + "points": "318:307;827:455", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P5/ask/FCi8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P5/ask/GmBY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P5/ask/H9Os=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P5/ask/ITgo=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P5/ask/J3dw=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P5/ask/KH+Q=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P5/ask/LwxI=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P5/ask/MCSM=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P5/ask/N7rw=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P5/ask/OUQY=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P5/ask/P3tM=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P6Btl1DS04s=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P6Btl1DTuQ4=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P6Btl1DUbE8=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DTuQ4=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -1072, + "top": 160, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6BtmFDVnHI=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DTuQ4=" + }, + "fillColor": "#ffadad", + "font": "Arial;13;1", + "left": 74.5, + "top": 411.5, + "width": 207, + "height": 13, + "text": "【提示用户是否确定删除整个测回】" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6BtmFDW1Rc=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DTuQ4=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -1072, + "top": 160, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6BtmFDXJZ4=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DTuQ4=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -1072, + "top": 160, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 69.5, + "top": 404.5, + "width": 218, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6Btl1DUbE8=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P6BtmFDVnHI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P6BtmFDW1Rc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6BtmFDXJZ4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P6BtmFDYzoo=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -536, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P6BtmFDZfOA=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -536, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P6BtmFDabNE=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -536, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P6BtmFDbcVg=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -536, + "top": 80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P6BtmFDcrag=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "model": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -536, + "top": 80, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 24, + "top": 400, + "width": 308, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P6Btl1DTuQ4=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P6BtmFDYzoo=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P6BtmFDZfOA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P6BtmFDabNE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P6BtmFDbcVg=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P6BtmFDcrag=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P6ETu1Fw08c=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFFx1mw=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "font": "Arial;13;0", + "left": 199, + "top": 354, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 1, + "text": "+重测测回" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFFyw0s=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 241, + "top": 362, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFFzyRs=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 203, + "top": 339, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF0+lY=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1FtUvs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 244, + "top": 330, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF1ok8=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1FtUvs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 254, + "top": 339, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF2wKI=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1FtUvs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 222, + "top": 312, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF3tbw=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fuzfc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 214, + "top": 378, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF4Oc0=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fuzfc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 226, + "top": 383, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6ETvFF586k=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fuzfc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 188, + "top": 368, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6ETvFF6xek=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1FtUvs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6ETvFF7szs=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fw08c=" + }, + "model": { + "$ref": "AAAAAAF5P6ETu1Fuzfc=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "tail": { + "$ref": "AAAAAAF5P56LZE6M/G8=" + }, + "lineStyle": 1, + "points": "245:307;188:399", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P6ETvFFx1mw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6ETvFFyw0s=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6ETvFFzyRs=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P6ETvFF0+lY=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P6ETvFF1ok8=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P6ETvFF2wKI=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P6ETvFF3tbw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P6ETvFF4Oc0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P6ETvFF586k=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P6ETvFF6xek=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P6ETvFF7szs=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P6HZl1JC23Y=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JDZsQ=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "font": "Arial;13;0", + "left": 509, + "top": 426, + "width": 98.22798156738281, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 1, + "text": "+选择忽略or取消" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JECIw=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 559, + "top": 411, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JF8pk=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 555, + "top": 455, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JG0HA=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I/u/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 359, + "top": 410, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JHztQ=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I/u/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 362, + "top": 397, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JIPD0=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I/u/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 352, + "top": 437, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JJLUs=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1JAt1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 758, + "top": 441, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JKFgU=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1JAt1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 757, + "top": 428, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6HZl1JLM+Y=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1JAt1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 760, + "top": 469, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6HZl1JMru0=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1I/u/s=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6HZl1JNqZA=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1JC23Y=" + }, + "model": { + "$ref": "AAAAAAF5P6HZl1JAt1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "lineStyle": 1, + "points": "332:429;783:465", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P6HZl1JDZsQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6HZl1JECIw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6HZl1JF8pk=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P6HZl1JG0HA=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P6HZl1JHztQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P6HZl1JIPD0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P6HZl1JJLUs=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P6HZl1JKFgU=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P6HZl1JLM+Y=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P6HZl1JMru0=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P6HZl1JNqZA=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5P6IYDFMMeFQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5P6IYDFMNnzQ=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5P6IYDFMOOjk=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMNnzQ=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -1536, + "top": 544, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6IYDVMPgvc=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMNnzQ=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 125, + "top": 531.5, + "width": 103, + "height": 13, + "text": "【执行删除操作】" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6IYDVMQezU=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMNnzQ=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -1536, + "top": 544, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5P6IYDVMRBdM=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMNnzQ=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -1536, + "top": 544, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 120, + "top": 524.5, + "width": 114, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6IYDFMOOjk=" + }, + "nameLabel": { + "$ref": "AAAAAAF5P6IYDVMPgvc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5P6IYDVMQezU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6IYDVMRBdM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5P6IYDVMSZQE=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -768, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5P6IYDVMTe6E=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -768, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P6IYDVMUviY=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -768, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5P6IYDVMVT7Q=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -768, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5P6IYDVMWeEE=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "model": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": -768, + "top": 272, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 96, + "top": 520, + "width": 161, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5P6IYDFMNnzQ=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5P6IYDVMSZQE=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5P6IYDVMTe6E=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P6IYDVMUviY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5P6IYDVMVT7Q=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5P6IYDVMWeEE=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P6Jc6FQAXTQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6FQBsAA=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "font": "Arial;13;0", + "left": 161, + "top": 470, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 1, + "text": "+确认删除" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6FQCliU=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 205, + "top": 470, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6FQDs0Y=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 161, + "top": 471, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQErUI=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP9Ay0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 191, + "top": 455, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQFXc4=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP9Ay0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 204, + "top": 457, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQGACw=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP9Ay0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 164, + "top": 450, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQH5rw=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP+W/w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 191, + "top": 487, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQIDDY=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP+W/w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 204, + "top": 485, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6Jc6VQJXs0=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP+W/w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 163, + "top": 491, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6Jc6VQKiwE=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP9Ay0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6Jc6VQLymI=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FQAXTQ=" + }, + "model": { + "$ref": "AAAAAAF5P6Jc6FP+W/w=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "tail": { + "$ref": "AAAAAAF5P6Btl1DS04s=" + }, + "lineStyle": 1, + "points": "177:435;176:519", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P6Jc6FQBsAA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6Jc6FQCliU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6Jc6FQDs0Y=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P6Jc6VQErUI=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P6Jc6VQFXc4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P6Jc6VQGACw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P6Jc6VQH5rw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P6Jc6VQIDDY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P6Jc6VQJXs0=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P6Jc6VQKiwE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P6Jc6VQLymI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5P6KuWFYy590=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFYzBrY=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 995, + "top": 977, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY07+U=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1002, + "top": 964, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY1T2M=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 980, + "top": 1004, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY2uTU=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYvXto=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 237, + "top": 548, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY3Q0s=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYvXto=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 246, + "top": 538, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY4NMQ=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYvXto=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 220, + "top": 570, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY5sZg=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYwtmg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1752, + "top": 1407, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY62Oo=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYwtmg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1757, + "top": 1394, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5P6KuWFY78L8=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYwtmg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1743, + "top": 1433, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5P6KuWFYy590=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6KuWFY8wFs=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYvXto=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 376, + "top": -144, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5P6KuWVY9b40=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYy590=" + }, + "model": { + "$ref": "AAAAAAF5P6KuWFYwtmg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 376, + "top": -144, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5P6IYDFMMeFQ=" + }, + "lineStyle": 1, + "points": "208:555;1768:1439", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5P6KuWFYzBrY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5P6KuWFY07+U=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5P6KuWFY1T2M=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5P6KuWFY2uTU=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5P6KuWFY3Q0s=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5P6KuWFY4NMQ=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5P6KuWFY5sZg=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5P6KuWFY62Oo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5P6KuWFY78L8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5P6KuWFY8wFs=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5P6KuWVY9b40=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJWvCwgzk0M=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJWvCwg0EPw=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJWvCwg1NpM=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwg0EPw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1920, + "top": 2944, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJWvCwg2wKE=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwg0EPw=" + }, + "font": "Arial;13;1", + "left": 1752, + "top": 1875.5, + "width": 119, + "height": 13, + "text": "move2NextValidate" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJWvCwg3lvo=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwg0EPw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1920, + "top": 2944, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJWvCwg4tCw=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwg0EPw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1920, + "top": 2944, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1747, + "top": 1868.5, + "width": 129, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJWvCwg1NpM=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJWvCwg2wKE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJWvCwg3lvo=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJWvCwg4tCw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJWvCwg5PfY=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 960, + "top": 1472, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJWvDAg6ClE=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 960, + "top": 1472, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJWvDAg7Ros=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 960, + "top": 1472, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJWvDAg8tC0=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 960, + "top": 1472, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJWvDAg9Vl8=", + "_parent": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "model": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 960, + "top": 1472, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1720, + "top": 1864, + "width": 183, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJWvCwg0EPw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJWvCwg5PfY=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJWvDAg6ClE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJWvDAg7Ros=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJWvDAg8tC0=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJWvDAg9Vl8=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJesYRAYGmw=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYRAZQUY=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "font": "Arial;13;0", + "left": 1492, + "top": 300, + "width": 189.2279815673828, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 1, + "text": "+测站不闭合or半测回归零差正常" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYRAa+X8=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1589, + "top": 285, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYRAb41g=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1579, + "top": 329, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAcFHE=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAV/Pw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1415, + "top": 260, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAdnH8=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAV/Pw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1420, + "top": 247, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAeLA0=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAV/Pw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1405, + "top": 286, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAfocQ=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAWIno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1758, + "top": 340, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAgNDY=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAWIno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1758, + "top": 327, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJesYhAh4Q4=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAWIno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1756, + "top": 368, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJesYhAiBdg=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAV/Pw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": -144, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJesYhAjzjQ=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAYGmw=" + }, + "model": { + "$ref": "AAAAAAF5QJesYRAWIno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": -144, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5Ss1QmDKthXI=" + }, + "tail": { + "$ref": "AAAAAAF5Ssw/NBbRxlk=" + }, + "lineStyle": 1, + "points": "1387:275;1780:367", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJesYRAZQUY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJesYRAa+X8=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJesYRAb41g=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJesYhAcFHE=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJesYhAdnH8=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJesYhAeLA0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJesYhAfocQ=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJesYhAgNDY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJesYhAh4Q4=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJesYhAiBdg=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJesYhAjzjQ=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJjLZRML/gk=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJjLZRMMO54=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJjLZRMN0eQ=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRMMO54=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 784, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJjLZRMOGnw=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRMMO54=" + }, + "fillColor": "#8282ff", + "font": "Arial;13;1", + "left": 820, + "top": 467.5, + "width": 139, + "height": 13, + "text": "switchState2StandStill" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJjLZRMPJsQ=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRMMO54=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 784, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJjLZRMQZsw=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRMMO54=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 784, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 815, + "top": 460.5, + "width": 149.419921875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJjLZRMN0eQ=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJjLZRMOGnw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJjLZRMPJsQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJjLZRMQZsw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJjLZRMRZxg=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 392, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJjLZRMSuGM=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 392, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJjLZRMTa74=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 392, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJjLZRMUk04=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 392, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJjLZRMVcTY=", + "_parent": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "model": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 392, + "width": 10, + "height": 10 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 784, + "top": 456, + "width": 211, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJjLZRMMO54=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJjLZRMRZxg=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJjLZRMSuGM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJjLZRMTa74=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJjLZRMUk04=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJjLZRMVcTY=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJk5ohVYjKI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJk5ohVZ7LA=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJk5ohVaBvo=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVZ7LA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1040, + "top": -608, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJk5ohVbtSw=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVZ7LA=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 925, + "top": 267.5, + "width": 142, + "height": 13, + "text": "提示半测回归零检测失败" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJk5ohVc1ns=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVZ7LA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1040, + "top": -608, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJk5ohVdnqY=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVZ7LA=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1040, + "top": -608, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 920, + "top": 260.5, + "width": 153, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJk5ohVaBvo=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJk5ohVbtSw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJk5ohVc1ns=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJk5ohVdnqY=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJk5ohVeC3M=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 520, + "top": -304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJk5ohVfd1M=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 520, + "top": -304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJk5ohVg6Qc=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 520, + "top": -304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJk5ohVh4ZY=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 520, + "top": -304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJk5ohViitY=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "model": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 520, + "top": -304, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 888, + "top": 256, + "width": 216, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJk5ohVZ7LA=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJk5ohVeC3M=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJk5ohVfd1M=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJk5ohVg6Qc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJk5ohVh4ZY=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJk5ohViitY=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJmQwBdwdmk=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwBdxb3k=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "font": "Arial;13;0", + "left": 1117, + "top": 272, + "width": 85.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 1, + "text": "+没有通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRdyFDg=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1160, + "top": 287, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRdzOi4=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1158, + "top": 243, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd0cxc=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdt/Nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1189, + "top": 272, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd1+jk=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdt/Nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1188, + "top": 285, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd2je8=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdt/Nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1192, + "top": 244, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd3aOM=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdu0wk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1130, + "top": 274, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd4cEI=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdu0wk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1133, + "top": 287, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJmQwRd5h7I=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdu0wk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1125, + "top": 247, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJmQwRd6XO0=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdt/Nk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJmQwRd7bPQ=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdwdmk=" + }, + "model": { + "$ref": "AAAAAAF5QJmQwBdu0wk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "tail": { + "$ref": "AAAAAAF5Ssw/NBbRxlk=" + }, + "lineStyle": 1, + "points": "1215:262;1104:267", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJmQwBdxb3k=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJmQwRdyFDg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJmQwRdzOi4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJmQwRd0cxc=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJmQwRd1+jk=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJmQwRd2je8=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJmQwRd3aOM=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJmQwRd4cEI=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJmQwRd5h7I=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJmQwRd6XO0=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJmQwRd7bPQ=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJnHsRkO52k=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkPXt4=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 955, + "top": 373, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkQg5M=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 968, + "top": 380, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkRfd8=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 928, + "top": 360, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkS/7E=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkLdTo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 986, + "top": 314, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkTUvo=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkLdTo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 996, + "top": 323, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkU2kA=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkLdTo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 963, + "top": 298, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkVrbg=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkM5N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 924, + "top": 432, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkWL5A=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkM5N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 937, + "top": 437, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnHsRkXIlE=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkM5N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 897, + "top": 424, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJnHsRkYjF0=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkLdTo=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJnHsRkZRp4=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkO52k=" + }, + "model": { + "$ref": "AAAAAAF5QJnHsRkM5N4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5QJk5ohVYjKI=" + }, + "lineStyle": 1, + "points": "985:291;899:455", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJnHsRkPXt4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJnHsRkQg5M=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJnHsRkRfd8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJnHsRkS/7E=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJnHsRkTUvo=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJnHsRkU2kA=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJnHsRkVrbg=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJnHsRkWL5A=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJnHsRkXIlE=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJnHsRkYjF0=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJnHsRkZRp4=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJnk3hnngQ0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnoFuM=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1111, + "top": 411, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnpzsU=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1108, + "top": 396, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnqowI=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1116, + "top": 440, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnr2A8=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnk4S8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1011, + "top": 429, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnsPz4=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnk4S8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1011, + "top": 416, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnt7X0=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnk4S8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1012, + "top": 457, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnuPbw=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnlvxc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1210, + "top": 393, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnvOwA=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnlvxc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1206, + "top": 381, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJnk3hnwvuU=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnlvxc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1219, + "top": 420, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJnk3hnxCbA=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnk4S8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJnk3hny8xs=", + "_parent": { + "$ref": "AAAAAAF5QJnk3hnngQ0=" + }, + "model": { + "$ref": "AAAAAAF5QJnk3Rnlvxc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "tail": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "lineStyle": 1, + "points": "989:455;1239:410", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJnk3hnoFuM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJnk3hnpzsU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJnk3hnqowI=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJnk3hnr2A8=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJnk3hnsPz4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJnk3hnt7X0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJnk3hnuPbw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJnk3hnvOwA=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJnk3hnwvuU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJnk3hnxCbA=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJnk3hny8xs=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJ6ahiPXyXI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJ6ahiPYzM0=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ6ahiPZdhA=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPYzM0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -544, + "top": -656, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ6ahiPa2BQ=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPYzM0=" + }, + "font": "Arial;13;1", + "left": 419.5, + "top": 243.5, + "width": 96, + "height": 13, + "text": "checkReadData" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ6ahyPb1CY=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPYzM0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -544, + "top": -656, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ6ahyPcSJM=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPYzM0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -544, + "top": -656, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 414.5, + "top": 236.5, + "width": 106.8271484375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ6ahiPZdhA=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJ6ahiPa2BQ=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJ6ahyPb1CY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ6ahyPcSJM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJ6ahyPdwvQ=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -272, + "top": -328, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJ6ahyPeius=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -272, + "top": -328, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJ6ahyPfDuE=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -272, + "top": -328, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJ6ahyPgVJE=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -272, + "top": -328, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJ6ahyPhyOw=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "model": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -272, + "top": -328, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 392, + "top": 232, + "width": 151, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJ6ahiPYzM0=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJ6ahyPdwvQ=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJ6ahyPeius=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJ6ahyPfDuE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJ6ahyPgVJE=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJ6ahyPhyOw=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJ8m8Sf6ofY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJ8m8Sf7JBU=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ8m8Sf8/hc=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf7JBU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -1248, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ8m8Sf9x9A=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf7JBU=" + }, + "font": "Arial;13;1", + "left": 1252, + "top": 123.5, + "width": 175, + "height": 13, + "text": "isHalfCycleZeroCheckReady" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ8m8Sf+ddw=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf7JBU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -1248, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ8m8Sf/cbI=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf7JBU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -1248, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1247, + "top": 116.5, + "width": 186.2998046875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ8m8Sf8/hc=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJ8m8Sf9x9A=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJ8m8Sf+ddw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ8m8Sf/cbI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJ8m8SgAs+Y=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": -624, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJ8m8SgBoKU=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": -624, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJ8m8SgCMgY=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": -624, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJ8m8SgDeic=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": -624, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJ8m8SgEIBM=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "model": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 752, + "top": -624, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1208, + "top": 112, + "width": 263, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJ8m8Sf7JBU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJ8m8SgAs+Y=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJ8m8SgBoKU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJ8m8SgCMgY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJ8m8SgDeic=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJ8m8SgEIBM=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJ87PCkCJ2c=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkD2ew=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "font": "Arial;13;0", + "left": 817, + "top": 172, + "width": 111.22798156738281, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 1, + "text": "+单测量or通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkEHYk=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 870, + "top": 157, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkFD0M=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 877, + "top": 201, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkGBOM=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj/TJQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 566, + "top": 214, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkHciQ=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj/TJQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 567, + "top": 201, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkI53k=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj/TJQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 566, + "top": 242, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkJ5DY=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87OykA4RY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1180, + "top": 129, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkKd2s=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87OykA4RY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1176, + "top": 116, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ87PCkLnCE=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87OykA4RY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1188, + "top": 156, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ87PCkMizE=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87Oyj/TJQ=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ87PCkNuH0=", + "_parent": { + "$ref": "AAAAAAF5QJ87PCkCJ2c=" + }, + "model": { + "$ref": "AAAAAAF5QJ87OykA4RY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "tail": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "lineStyle": 1, + "points": "543:239;1208:147", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJ87PCkD2ew=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ87PCkEHYk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ87PCkFD0M=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJ87PCkGBOM=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJ87PCkHciQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJ87PCkI53k=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJ87PCkJ5DY=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJ87PCkKd2s=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJ87PCkLnCE=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJ87PCkMizE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJ87PCkNuH0=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QJ+mRitZ0H0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QJ+mRitad0o=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ+mRitbxtk=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitad0o=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 736, + "top": -560, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ+mRytcRUc=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitad0o=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 687.5, + "top": 291.5, + "width": 77, + "height": 13, + "text": "提示读数有误" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ+mRytdKoM=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitad0o=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 736, + "top": -560, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QJ+mRytecXk=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitad0o=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 736, + "top": -560, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 682.5, + "top": 284.5, + "width": 88, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ+mRitbxtk=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QJ+mRytcRUc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QJ+mRytdKoM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ+mRytecXk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QJ+mRytf9wc=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 368, + "top": -280, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QJ+mRytgl/8=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 368, + "top": -280, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QJ+mRythGBg=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 368, + "top": -280, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QJ+mRytiPDo=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 368, + "top": -280, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QJ+mRytjdZM=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "model": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 368, + "top": -280, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 664, + "top": 280, + "width": 124, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QJ+mRitad0o=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QJ+mRytf9wc=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QJ+mRytgl/8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QJ+mRythGBg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QJ+mRytiPDo=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QJ+mRytjdZM=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJ/UgywlH50=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/Ugywm6Cw=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "font": "Arial;13;0", + "left": 569, + "top": 253, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 1, + "text": "+未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UgywnNpM=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 608, + "top": 238, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UgywoaZM=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 600, + "top": 282, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCwpjOU=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywiha4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 571, + "top": 246, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCwqyBI=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywiha4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 575, + "top": 234, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCwrLDA=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywiha4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 562, + "top": 273, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCws+Vw=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/UgywjRPE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 640, + "top": 259, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCwtL5c=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/UgywjRPE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 640, + "top": 246, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/UhCwuYNo=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/UgywjRPE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 639, + "top": 287, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ/UhCwvaPk=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/Ugywiha4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ/UhCwwUDY=", + "_parent": { + "$ref": "AAAAAAF5QJ/UgywlH50=" + }, + "model": { + "$ref": "AAAAAAF5QJ/UgywjRPE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "tail": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "lineStyle": 1, + "points": "543:263;663:285", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJ/Ugywm6Cw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ/UgywnNpM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ/UgywoaZM=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJ/UhCwpjOU=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJ/UhCwqyBI=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJ/UhCwrLDA=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJ/UhCws+Vw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJ/UhCwtL5c=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJ/UhCwuYNo=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJ/UhCwvaPk=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJ/UhCwwUDY=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QJ/0PC0CShY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0DtlQ=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 817, + "top": 368, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0ETCk=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 828, + "top": 358, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0FS9M=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 796, + "top": 389, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0G2RA=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz/2CU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 770, + "top": 317, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0HEgs=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz/2CU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 781, + "top": 310, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0IKu8=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz/2CU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 747, + "top": 333, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0JtjU=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PC0AjHo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 865, + "top": 419, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0KkBY=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PC0AjHo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 873, + "top": 409, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QJ/0PS0LEUU=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PC0AjHo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 848, + "top": 441, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ/0PS0MAmo=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PCz/2CU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QJ/0PS0Nb0Y=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PC0CShY=" + }, + "model": { + "$ref": "AAAAAAF5QJ/0PC0AjHo=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5QJ+mRitZ0H0=" + }, + "lineStyle": 1, + "points": "742:315;872:455", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QJ/0PS0DtlQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QJ/0PS0ETCk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QJ/0PS0FS9M=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QJ/0PS0G2RA=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QJ/0PS0HEgs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QJ/0PS0IKu8=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QJ/0PS0JtjU=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QJ/0PS0KkBY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QJ/0PS0LEUU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QJ/0PS0MAmo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QJ/0PS0Nb0Y=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKE6Ojfzjv0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKE6Ojf0W9Y=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKE6Ojf12Ns=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojf0W9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 3008, + "top": -336, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKE6Ojf2D5I=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojf0W9Y=" + }, + "font": "Arial;13;1", + "left": 2110, + "top": 779.5, + "width": 110, + "height": 13, + "text": "checkSingleCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKE6Ojf3N+g=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojf0W9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 3008, + "top": -336, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKE6Ojf4rrM=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojf0W9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 3008, + "top": -336, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 2105, + "top": 772.5, + "width": 120.55712890625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKE6Ojf12Ns=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKE6Ojf2D5I=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKE6Ojf3N+g=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKE6Ojf4rrM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKE6Ojf5X6A=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -168, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKE6Ojf6i5o=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -168, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKE6Ojf7hDo=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -168, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKE6Ojf8oq8=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -168, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKE6Ojf9edk=", + "_parent": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "model": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1504, + "top": -168, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 2080, + "top": 768, + "width": 170, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKE6Ojf0W9Y=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKE6Ojf5X6A=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKE6Ojf6i5o=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKE6Ojf7hDo=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKE6Ojf8oq8=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKE6Ojf9edk=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKIG+T9Y4ko=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKIG+T9Zl2o=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKIG+T9a7vU=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Zl2o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2160, + "top": -1008, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKIG+T9bDug=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Zl2o=" + }, + "font": "Arial;13;1", + "left": 1762, + "top": 523.5, + "width": 129, + "height": 13, + "text": "isAllCycleCompleted" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKIG+T9cIfM=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Zl2o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2160, + "top": -1008, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKIG+T9dArI=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Zl2o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2160, + "top": -1008, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1757, + "top": 516.5, + "width": 139.314453125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKIG+T9a7vU=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKIG+T9bDug=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKIG+T9cIfM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKIG+T9dArI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKIG+T9e1Wk=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1080, + "top": -504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKIG+T9fRvU=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1080, + "top": -504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKIG+T9gBhM=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1080, + "top": -504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKIG+T9hA48=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1080, + "top": -504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKIG+T9inVI=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "model": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1080, + "top": -504, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1728, + "top": 512, + "width": 197, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKIG+T9Zl2o=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKIG+T9e1Wk=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKIG+T9fRvU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKIG+T9gBhM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKIG+T9hA48=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKIG+T9inVI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QKI4zEKHpSc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKIQ1c=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "font": "Arial;13;0", + "left": 1956, + "top": 662, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 1, + "text": "+通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKJdn8=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1976, + "top": 674, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKKTG0=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2004, + "top": 639, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKL0+I=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKEuw8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2110, + "top": 757, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKMDrE=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKEuw8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2100, + "top": 766, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKNoT0=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKEuw8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2130, + "top": 737, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKOx2g=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKFtZg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1861, + "top": 568, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKP85E=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKFtZg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1855, + "top": 580, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKI4zEKQLJU=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKFtZg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1874, + "top": 544, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QKI4zEKR1Nc=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKEuw8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QKI4zEKSZgo=", + "_parent": { + "$ref": "AAAAAAF5QKI4zEKHpSc=" + }, + "model": { + "$ref": "AAAAAAF5QKI4zEKFtZg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "tail": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "lineStyle": 1, + "points": "2140:767;1850:547", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QKI4zEKIQ1c=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKI4zEKJdn8=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKI4zEKKTG0=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QKI4zEKL0+I=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QKI4zEKMDrE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QKI4zEKNoT0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QKI4zEKOx2g=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QKI4zEKP85E=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QKI4zEKQLJU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QKI4zEKR1Nc=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QKI4zEKSZgo=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKuCwkzY630=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKuCwkzZLtk=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKuCwkzadw4=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzZLtk=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 2704, + "top": 112, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKuCwkzbRGU=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzZLtk=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 1879.5, + "top": 995.5, + "width": 77, + "height": 13, + "text": "提示用户选择" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKuCwkzc5kQ=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzZLtk=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 2704, + "top": 112, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKuCwkzd3VI=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzZLtk=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 2704, + "top": 112, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1874.5, + "top": 988.5, + "width": 88, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKuCwkzadw4=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKuCwkzbRGU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKuCwkzc5kQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKuCwkzd3VI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKuCw0zeMMo=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1352, + "top": 56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKuCw0zfhJM=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1352, + "top": 56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKuCw0zgO20=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1352, + "top": 56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKuCw0zhG3k=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1352, + "top": 56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKuCw0ziN7I=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "model": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 1352, + "top": 56, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1856, + "top": 984, + "width": 124, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKuCwkzZLtk=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKuCw0zeMMo=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKuCw0zfhJM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKuCw0zgO20=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKuCw0zhG3k=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKuCw0ziN7I=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QKvMIE8ZF/E=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8a1To=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "font": "Arial;13;0", + "left": 2013, + "top": 898, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 1, + "text": "+未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8bx7Y=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 2059, + "top": 909, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8c/MU=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2030, + "top": 875, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8df1Y=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8WKCE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2133, + "top": 825, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8e89E=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8WKCE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2140, + "top": 836, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8frKE=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8WKCE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2118, + "top": 801, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8gpg0=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8XsG8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1967, + "top": 971, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8hUUs=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8XsG8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1977, + "top": 979, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QKvMIU8iPfY=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8XsG8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1946, + "top": 953, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QKvMIU8jJRc=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8WKCE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QKvMIU8kteI=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8ZF/E=" + }, + "model": { + "$ref": "AAAAAAF5QKvMIE8XsG8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "tail": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "lineStyle": 1, + "points": "2143:803;1938:983", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QKvMIU8a1To=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKvMIU8bx7Y=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKvMIU8c/MU=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QKvMIU8df1Y=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QKvMIU8e89E=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QKvMIU8frKE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QKvMIU8gpg0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QKvMIU8hUUs=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QKvMIU8iPfY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QKvMIU8jJRc=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QKvMIU8kteI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKyR6VB+5F0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKyR6VB/sq8=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKyR6lCAlIw=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB/sq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 320, + "top": -240, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKyR6lCBFDc=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB/sq8=" + }, + "fillColor": "#ff8282", + "font": "Arial;13;1", + "left": 956, + "top": 747.5, + "width": 62, + "height": 13, + "text": "重测方向" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKyR6lCC81I=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB/sq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 320, + "top": -240, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKyR6lCDFwk=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB/sq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 320, + "top": -240, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 951, + "top": 740.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKyR6lCAlIw=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKyR6lCBFDc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKyR6lCC81I=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKyR6lCDFwk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKyR6lCEof0=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 160, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKyR6lCFl5A=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 160, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKyR6lCGLz0=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 160, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKyR6lCHKbg=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 160, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKyR6lCIqJE=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "model": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "visible": false, + "fillColor": "#ff8282", + "font": "Arial;13;0", + "left": 160, + "top": -120, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ff8282", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 936, + "top": 736, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKyR6VB/sq8=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKyR6lCEof0=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKyR6lCFl5A=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKyR6lCGLz0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKyR6lCHKbg=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKyR6lCIqJE=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKysH1F4naw=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKysH1F5Vw8=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKysH1F6t1U=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F5Vw8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 928, + "top": -464, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKysH1F7w44=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F5Vw8=" + }, + "fillColor": "#ffadad", + "font": "Arial;13;1", + "left": 1300, + "top": 699.5, + "width": 62, + "height": 13, + "text": "重测测回" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKysH1F8ews=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F5Vw8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 928, + "top": -464, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKysH1F9CVk=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F5Vw8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 928, + "top": -464, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 1295, + "top": 692.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKysH1F6t1U=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKysH1F7w44=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKysH1F8ews=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKysH1F9CVk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKysH1F+SbI=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 464, + "top": -232, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKysH1F/p8w=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 464, + "top": -232, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKysH1GAwRg=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 464, + "top": -232, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKysH1GBWy4=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 464, + "top": -232, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKysH1GC8OE=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "model": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 464, + "top": -232, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1280, + "top": 688, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKysH1F5Vw8=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKysH1F+SbI=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKysH1F/p8w=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKysH1GAwRg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKysH1GBWy4=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKysH1GC8OE=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QKzDRVJysxE=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QKzDRVJztrc=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QKzDRVJ0nsk=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJztrc=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 1072, + "top": -928, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKzDRVJ1z+Q=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJztrc=" + }, + "fillColor": "#8282ff", + "font": "Arial;13;1", + "left": 1398.5, + "top": 523.5, + "width": 226, + "height": 13, + "text": "resetSurveyorStateAndKeepPosition" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKzDRVJ29Q0=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJztrc=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 1072, + "top": -928, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QKzDRVJ3D90=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJztrc=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 1072, + "top": -928, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 1393.5, + "top": 516.5, + "width": 237.5634765625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QKzDRVJ0nsk=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QKzDRVJ1z+Q=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QKzDRVJ29Q0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QKzDRVJ3D90=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QKzDRVJ4vK0=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 536, + "top": -464, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QKzDRVJ5ijM=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 536, + "top": -464, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QKzDRVJ6ScY=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 536, + "top": -464, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QKzDRVJ71p4=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 536, + "top": -464, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QKzDRVJ8l2g=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "model": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 536, + "top": -464, + "width": 10, + "height": 10 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1344, + "top": 512, + "width": 335, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QKzDRVJztrc=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QKzDRVJ4vK0=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QKzDRVJ5ijM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QKzDRVJ6ScY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QKzDRVJ71p4=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QKzDRVJ8l2g=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QK2QmFlvdS8=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFlwJfE=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "font": "Arial;13;0", + "left": 1686, + "top": 768, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 1, + "text": "+忽略" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFlxSkY=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1691, + "top": 778, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFly6tM=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1725, + "top": 749, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFlzr3g=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lsCzU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1873, + "top": 967, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFl0RxM=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lsCzU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1862, + "top": 974, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFl1X3o=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lsCzU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1897, + "top": 952, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFl29pE=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1ltUBY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1531, + "top": 570, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFl39y0=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1ltUBY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1523, + "top": 580, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK2QmFl4Ns0=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1ltUBY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1549, + "top": 549, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QK2QmFl5muU=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1lsCzU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QK2QmFl6Y7A=", + "_parent": { + "$ref": "AAAAAAF5QK2QmFlvdS8=" + }, + "model": { + "$ref": "AAAAAAF5QK2Ql1ltUBY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "tail": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "lineStyle": 1, + "points": "1902:983;1526:547", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QK2QmFlwJfE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QK2QmFlxSkY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QK2QmFly6tM=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QK2QmFlzr3g=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QK2QmFl0RxM=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QK2QmFl1X3o=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QK2QmFl29pE=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QK2QmFl39y0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QK2QmFl4Ns0=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QK2QmFl5muU=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QK2QmFl6Y7A=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QK340l0Fv9Q=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0GnqQ=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1392, + "top": 471, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0Habc=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1384, + "top": 484, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0IZgE=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1407, + "top": 446, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0Jr30=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0ChAw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1450, + "top": 504, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0KziQ=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0ChAw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1441, + "top": 515, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0LSAI=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0ChAw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1467, + "top": 483, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0MEF0=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0D79M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1335, + "top": 438, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0NAX0=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0D79M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1331, + "top": 451, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QK340l0Obj8=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0D79M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1345, + "top": 413, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QK340l0PZLk=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0ChAw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QK340l0QvTM=", + "_parent": { + "$ref": "AAAAAAF5QK340l0Fv9Q=" + }, + "model": { + "$ref": "AAAAAAF5QK340l0D79M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "tail": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "lineStyle": 1, + "points": "1480:511;1321:419", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QK340l0GnqQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QK340l0Habc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QK340l0IZgE=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QK340l0Jr30=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QK340l0KziQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QK340l0LSAI=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QK340l0MEF0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QK340l0NAX0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QK340l0Obj8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QK340l0PZLk=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QK340l0QvTM=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QLdiXGHqtMU=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHrPm0=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1442, + "top": 883, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHsNrs=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1438, + "top": 898, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHtajM=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1449, + "top": 854, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHu5Ak=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HnzLc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1826, + "top": 985, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHvESE=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HnzLc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1820, + "top": 998, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHwu2c=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HnzLc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1837, + "top": 960, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHxgP0=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HodP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1059, + "top": 782, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHyZg0=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HodP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1058, + "top": 795, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLdiXGHzjfw=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HodP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1062, + "top": 754, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QLdiXGH0aoo=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HnzLc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": -72, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QLdiXGH1FM8=", + "_parent": { + "$ref": "AAAAAAF5QLdiXGHqtMU=" + }, + "model": { + "$ref": "AAAAAAF5QLdiW2HodP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": -72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "tail": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "lineStyle": 1, + "points": "1855:984;1038:767", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QLdiXGHrPm0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QLdiXGHsNrs=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QLdiXGHtajM=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QLdiXGHu5Ak=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QLdiXGHvESE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QLdiXGHwu2c=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QLdiXGHxgP0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QLdiXGHyZg0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QLdiXGHzjfw=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QLdiXGH0aoo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QLdiXGH1FM8=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QLwOJ2bPDnI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QLwOJ2bQ8Ro=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QLwOJ2bRPfA=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bQ8Ro=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 560, + "top": -528, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QLwOJ2bSTVM=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bQ8Ro=" + }, + "fillColor": "#5656ff", + "font": "Arial;13;1", + "left": 1090.5, + "top": 587.5, + "width": 93, + "height": 13, + "text": "resurveyPoints" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QLwOJ2bTKUY=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bQ8Ro=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 560, + "top": -528, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QLwOJ2bUBI4=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bQ8Ro=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 560, + "top": -528, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 1085.5, + "top": 580.5, + "width": 103.9326171875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QLwOJ2bRPfA=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QLwOJ2bSTVM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QLwOJ2bTKUY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QLwOJ2bUBI4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QLwOJ2bVEa0=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 280, + "top": -264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QLwOJ2bWae0=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 280, + "top": -264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QLwOJ2bXEAg=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 280, + "top": -264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QLwOKGbYe7A=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 280, + "top": -264, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QLwOKGbZQqo=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "model": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "visible": false, + "fillColor": "#5656ff", + "font": "Arial;13;0", + "left": 280, + "top": -264, + "width": 10, + "height": 10 + } + ], + "fillColor": "#5656ff", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1064, + "top": 576, + "width": 146, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QLwOJ2bQ8Ro=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QLwOJ2bVEa0=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QLwOJ2bWae0=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QLwOJ2bXEAg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QLwOKGbYe7A=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QLwOKGbZQqo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QLx6RGoNnGE=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoOcBM=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1050, + "top": 656, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoPkXM=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1039, + "top": 646, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoQUT8=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1071, + "top": 677, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoRB9A=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoKxZI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1009, + "top": 699, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoSk+A=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoKxZI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1001, + "top": 689, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoT8Lo=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoKxZI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1026, + "top": 721, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoUHro=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoLs1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1090, + "top": 613, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoVk68=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoLs1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1079, + "top": 606, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QLx6RGoW9No=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoLs1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1113, + "top": 629, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QLx6RGoXj7U=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoKxZI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QLx6RGoYmUk=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoNnGE=" + }, + "model": { + "$ref": "AAAAAAF5QLx6RGoLs1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "tail": { + "$ref": "AAAAAAF5QKyR6VB+5F0=" + }, + "lineStyle": 1, + "points": "1003:735;1119:611", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QLx6RGoOcBM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QLx6RGoPkXM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QLx6RGoQUT8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QLx6RGoRB9A=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QLx6RGoSk+A=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QLx6RGoT8Lo=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QLx6RGoUHro=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QLx6RGoVk68=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QLx6RGoW9No=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QLx6RGoXj7U=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QLx6RGoYmUk=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5QMaQUG/rlG8=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5QMaQUG/sv3A=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5QMaQUG/tkJ4=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/sv3A=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 1712, + "top": 1488, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QMaQUG/umGY=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/sv3A=" + }, + "fillColor": "#8282ff", + "font": "Arial;13;1", + "left": 1692.5, + "top": 1451.5, + "width": 216, + "height": 13, + "text": "switchState2RestartInCurrentCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QMaQUW/vdlU=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/sv3A=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 1712, + "top": 1488, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5QMaQUW/w0wQ=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/sv3A=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 1712, + "top": 1488, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 1687.5, + "top": 1444.5, + "width": 227.4580078125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5QMaQUG/tkJ4=" + }, + "nameLabel": { + "$ref": "AAAAAAF5QMaQUG/umGY=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5QMaQUW/vdlU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QMaQUW/w0wQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5QMaQUW/x48o=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 856, + "top": 744, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5QMaQUW/yJ84=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 856, + "top": 744, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5QMaQUW/z4XE=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 856, + "top": 744, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5QMaQUW/0u+w=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 856, + "top": 744, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5QMaQUW/13YU=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "model": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 856, + "top": 744, + "width": 10, + "height": 10 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1640, + "top": 1440, + "width": 321, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5QMaQUG/sv3A=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5QMaQUW/x48o=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5QMaQUW/yJ84=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5QMaQUW/z4XE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5QMaQUW/0u+w=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5QMaQUW/13YU=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QMbzEXNQ00I=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNR/aw=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "font": "Arial;13;0", + "left": 1450, + "top": 1009, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 1, + "text": "+开始重测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNSJUg=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1491, + "top": 1000, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNTTKw=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1456, + "top": 1028, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNUT2s=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNNh8o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1177, + "top": 616, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNVmq4=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNNh8o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1189, + "top": 610, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNWUrs=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNNh8o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1153, + "top": 629, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNX73U=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNOm6M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1782, + "top": 1403, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNYoLo=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNOm6M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1791, + "top": 1393, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMbzEXNZwIQ=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNOm6M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1762, + "top": 1423, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMbzEXNaGMo=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNNh8o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMbzEXNbVPI=", + "_parent": { + "$ref": "AAAAAAF5QMbzEXNQ00I=" + }, + "model": { + "$ref": "AAAAAAF5QMbzEHNOm6M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "lineStyle": 1, + "points": "1150:611;1786:1439", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QMbzEXNR/aw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QMbzEXNSJUg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QMbzEXNTTKw=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QMbzEXNUT2s=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QMbzEXNVmq4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QMbzEXNWUrs=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QMbzEXNX73U=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QMbzEXNYoLo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QMbzEXNZwIQ=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QMbzEXNaGMo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QMbzEXNbVPI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QMjEp4Xxm70=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4XyXqY=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1819, + "top": 1662, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4XzTSE=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1834, + "top": 1662, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X0hBs=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1790, + "top": 1663, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X1sYc=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXuicM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1815, + "top": 1494, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X2bX4=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXuicM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1829, + "top": 1496, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X3ebc=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXuicM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1788, + "top": 1490, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X4oDY=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXvKNs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1825, + "top": 1830, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X5UnY=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXvKNs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1838, + "top": 1827, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMjEp4X6pQM=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXvKNs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1797, + "top": 1835, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMjEqIX7oU8=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXuicM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMjEqIX8oCk=", + "_parent": { + "$ref": "AAAAAAF5QMjEp4Xxm70=" + }, + "model": { + "$ref": "AAAAAAF5QMjEpoXvKNs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 480, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "tail": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "lineStyle": 1, + "points": "1800:1475;1811:1863", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QMjEp4XyXqY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QMjEp4XzTSE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QMjEp4X0hBs=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QMjEp4X1sYc=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QMjEp4X2bX4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QMjEp4X3ebc=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QMjEp4X4oDY=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QMjEp4X5UnY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QMjEp4X6pQM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QMjEqIX7oU8=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QMjEqIX8oCk=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QMnaf4p31wI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p4YhA=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1532, + "top": 768, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p5heM=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1528, + "top": 782, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p6u/E=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1539, + "top": 739, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p7HWo=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p0R7o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1859, + "top": 975, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p8uO8=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p0R7o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1849, + "top": 985, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p9ZYk=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p0R7o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1877, + "top": 954, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p+8dA=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p1n0A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1403, + "top": 734, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4p/pOU=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p1n0A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1402, + "top": 747, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QMnaf4qAet8=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p1n0A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1406, + "top": 706, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMnaf4qBmzo=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p0R7o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 696, + "top": 8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QMnaf4qCCtY=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4p31wI=" + }, + "model": { + "$ref": "AAAAAAF5QMnaf4p1n0A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 696, + "top": 8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "tail": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "lineStyle": 1, + "points": "1889:983;1536:760;1382:719", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QMnaf4p4YhA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QMnaf4p5heM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QMnaf4p6u/E=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QMnaf4p7HWo=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QMnaf4p8uO8=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QMnaf4p9ZYk=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QMnaf4p+8dA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QMnaf4p/pOU=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QMnaf4qAet8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QMnaf4qBmzo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QMnaf4qCCtY=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QNAhapFuI7s=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapFvVXY=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "font": "Arial;13;0", + "left": 1437, + "top": 796, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 1, + "text": "+取消" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapFwVCE=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1459, + "top": 782, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapFxPvQ=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1442, + "top": 823, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapFyOWw=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFrudc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1378, + "top": 723, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapFz3Mw=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFrudc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1388, + "top": 715, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAhapF0mvQ=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFrudc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1356, + "top": 740, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAha5F1FkI=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFsZZ8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1852, + "top": 953, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAha5F2OJ8=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFsZZ8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1855, + "top": 940, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNAha5F3+WU=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFsZZ8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1846, + "top": 980, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QNAha5F4AZU=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFrudc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 744, + "top": -56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QNAha5F5UgE=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFuI7s=" + }, + "model": { + "$ref": "AAAAAAF5QNAhapFsZZ8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 744, + "top": -56, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "tail": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "lineStyle": 1, + "points": "1349:723;1448:816;1871:983", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QNAhapFvVXY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QNAhapFwVCE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QNAhapFxPvQ=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QNAhapFyOWw=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QNAhapFz3Mw=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QNAhapF0mvQ=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QNAha5F1FkI=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QNAha5F2OJ8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QNAha5F3+WU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QNAha5F4AZU=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QNAha5F5UgE=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5QNFL66Cbz6k=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66CcWkE=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "font": "Arial;13;0", + "left": 1393, + "top": 600, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 1, + "text": "+忽略" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66CdTo8=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1399, + "top": 589, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66Ce+u8=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1430, + "top": 621, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66CfR+U=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCY2AQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1357, + "top": 652, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66Cg04o=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCY2AQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1349, + "top": 641, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66ChcXw=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCY2AQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1373, + "top": 674, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66CipGA=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCZ01s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1462, + "top": 548, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66Cj6oQ=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCZ01s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1452, + "top": 540, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5QNFL66Ck0os=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCZ01s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1485, + "top": 565, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QNFL66ClLUo=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCY2AQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 696, + "top": 8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5QNFL66Cm8No=", + "_parent": { + "$ref": "AAAAAAF5QNFL66Cbz6k=" + }, + "model": { + "$ref": "AAAAAAF5QNFL6qCZ01s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 696, + "top": 8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "tail": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "lineStyle": 1, + "points": "1349:687;1492:547", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5QNFL66CcWkE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5QNFL66CdTo8=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5QNFL66Ce+u8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5QNFL66CfR+U=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5QNFL66Cg04o=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5QNFL66ChcXw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5QNFL66CipGA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5QNFL66Cj6oQ=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5QNFL66Ck0os=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5QNFL66ClLUo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5QNFL66Cm8No=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RVTun0vZBv0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vaxdo=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "font": "Arial;13;0", + "left": 1276, + "top": 542, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 1, + "text": "+重测失败" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vbxuQ=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1303, + "top": 527, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vcmj8=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1310, + "top": 571, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vdoCc=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vWQ0U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1233, + "top": 554, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0ved/I=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vWQ0U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1233, + "top": 541, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vfAMs=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vWQ0U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1233, + "top": 582, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTun0vg9C0=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vXr0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1377, + "top": 530, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTuoEvhMzo=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vXr0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1373, + "top": 517, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVTuoEviZLY=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vXr0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1386, + "top": 556, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVTuoEvjqMY=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vWQ0U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVTuoEvkZEE=", + "_parent": { + "$ref": "AAAAAAF5RVTun0vZBv0=" + }, + "model": { + "$ref": "AAAAAAF5RVTun0vXr0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKzDRVJysxE=" + }, + "tail": { + "$ref": "AAAAAAF5QLwOJ2bPDnI=" + }, + "lineStyle": 1, + "points": "1210:580;1406:547", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RVTun0vaxdo=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RVTun0vbxuQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RVTun0vcmj8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RVTun0vdoCc=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RVTun0ved/I=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RVTun0vfAMs=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RVTun0vg9C0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RVTuoEvhMzo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RVTuoEviZLY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RVTuoEvjqMY=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RVTuoEvkZEE=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RVWv21Zu6Aw=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv21ZvsKs=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1302, + "top": 1897, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv21ZwRzk=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1302, + "top": 1912, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv21ZxCSk=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1301, + "top": 1868, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv21Zyej0=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZro+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1693, + "top": 1891, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv21ZzuYg=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZro+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1691, + "top": 1904, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv3FZ0MPo=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZro+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1697, + "top": 1863, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv3FZ18no=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZs/XI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 912, + "top": 1904, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv3FZ21Iw=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZs/XI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 914, + "top": 1917, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVWv3FZ3nLg=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZs/XI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 907, + "top": 1877, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVWv3FZ4weo=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZro+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVWv3FZ58yM=", + "_parent": { + "$ref": "AAAAAAF5RVWv21Zu6Aw=" + }, + "model": { + "$ref": "AAAAAAF5RVWv2lZs/XI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "tail": { + "$ref": "AAAAAAF5QJWvCwgzk0M=" + }, + "lineStyle": 1, + "points": "1719:1882;886:1896", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RVWv21ZvsKs=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RVWv21ZwRzk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RVWv21ZxCSk=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RVWv21Zyej0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RVWv21ZzuYg=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RVWv3FZ0MPo=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RVWv3FZ18no=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RVWv3FZ21Iw=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RVWv3FZ3nLg=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RVWv3FZ4weo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RVWv3FZ58yM=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RVbpp1nKVhc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RVbpp1nLusg=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RVbpqFnM530=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nLusg=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 1504, + "top": -656, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RVbpqFnNEWc=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nLusg=" + }, + "fillColor": "#ffadad", + "font": "Arial;13;1", + "left": 1007.5, + "top": 843.5, + "width": 77, + "height": 13, + "text": "执行测回删除" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RVbpqFnO5/0=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nLusg=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 1504, + "top": -656, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RVbpqFnPMMU=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nLusg=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 1504, + "top": -656, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 1002.5, + "top": 836.5, + "width": 88, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RVbpqFnM530=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RVbpqFnNEWc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RVbpqFnO5/0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RVbpqFnPMMU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RVbpqFnQqa0=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 752, + "top": -328, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RVbpqFnRVaY=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 752, + "top": -328, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RVbpqFnSiyY=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 752, + "top": -328, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RVbpqFnTp/o=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 752, + "top": -328, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RVbpqFnUeVQ=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "model": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 752, + "top": -328, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 984, + "top": 832, + "width": 124, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RVbpp1nLusg=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RVbpqFnQqa0=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RVbpqFnRVaY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RVbpqFnSiyY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RVbpqFnTp/o=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RVbpqFnUeVQ=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RVcwNF0lj/I=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0m640=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1193, + "top": 784, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0n9pE=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1200, + "top": 797, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0osMg=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1180, + "top": 757, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0pne0=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0iVWE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1277, + "top": 742, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0qTm8=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0iVWE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1281, + "top": 755, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0rLrQ=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0iVWE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1269, + "top": 715, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0s558=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0jQf0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1110, + "top": 826, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0tAew=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0jQf0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1119, + "top": 837, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVcwNF0uE34=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0jQf0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1094, + "top": 804, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVcwNF0vsAE=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0iVWE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": 8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVcwNF0w5ls=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0lj/I=" + }, + "model": { + "$ref": "AAAAAAF5RVcwNF0jQf0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": 8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "tail": { + "$ref": "AAAAAAF5QKysH1F4naw=" + }, + "lineStyle": 1, + "points": "1294:723;1081:831", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RVcwNF0m640=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RVcwNF0n9pE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RVcwNF0osMg=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RVcwNF0pne0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RVcwNF0qTm8=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RVcwNF0rLrQ=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RVcwNF0s558=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RVcwNF0tAew=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RVcwNF0uE34=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RVcwNF0vsAE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RVcwNF0w5ls=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RVdEqmBOVoU=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBP7Mw=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1431, + "top": 1135, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBQ+G0=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1440, + "top": 1123, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBRwAI=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1412, + "top": 1158, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBSb60=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBL2Ro=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1096, + "top": 865, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBT13s=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBL2Ro=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1106, + "top": 856, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBU/V0=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBL2Ro=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1076, + "top": 884, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBVD2o=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBMaWs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1767, + "top": 1405, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBWru8=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBMaWs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1773, + "top": 1393, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RVdEqmBX1jY=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBMaWs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1753, + "top": 1429, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVdEqmBYqxc=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBL2Ro=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RVdEqmBZh5U=", + "_parent": { + "$ref": "AAAAAAF5RVdEqmBOVoU=" + }, + "model": { + "$ref": "AAAAAAF5RVdEqWBMaWs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5RVbpp1nKVhc=" + }, + "lineStyle": 1, + "points": "1067:867;1778:1439", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RVdEqmBP7Mw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RVdEqmBQ+G0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RVdEqmBRwAI=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RVdEqmBSb60=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RVdEqmBT13s=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RVdEqmBU/V0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RVdEqmBVD2o=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RVdEqmBWru8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RVdEqmBX1jY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RVdEqmBYqxc=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RVdEqmBZh5U=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RWbWiJQ+LqI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RWbWiJQ/pQw=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RWbWiJRAz/w=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ/pQw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -32, + "top": 2160, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWbWiJRBIu8=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ/pQw=" + }, + "font": "Arial;13;1", + "left": 1482, + "top": 1715.5, + "width": 167, + "height": 13, + "text": "doCalScheduleSingleCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWbWiJRCluw=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ/pQw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -32, + "top": 2160, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWbWiJRDVic=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ/pQw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -32, + "top": 2160, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1477, + "top": 1708.5, + "width": 177.603515625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWbWiJRAz/w=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RWbWiJRBIu8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RWbWiJRCluw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWbWiJRDVic=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RWbWiJRE0bA=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -16, + "top": 1080, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RWbWiJRF/Bs=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -16, + "top": 1080, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RWbWiJRG03U=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -16, + "top": 1080, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RWbWiJRHoKE=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -16, + "top": 1080, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RWbWiZRIksM=", + "_parent": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "model": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -16, + "top": 1080, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1440, + "top": 1704, + "width": 251, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RWbWiJQ/pQw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RWbWiJRE0bA=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RWbWiJRF/Bs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RWbWiJRG03U=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RWbWiJRHoKE=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RWbWiZRIksM=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RWiYh6tfjKM=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RWiYh6tg64I=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RWiYh6th8ec=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tg64I=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -352, + "top": 1872, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWiYh6tiGF8=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tg64I=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 1239.5, + "top": 1659.5, + "width": 116, + "height": 13, + "text": "该测回是否完成测量" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWiYh6tjmMc=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tg64I=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -352, + "top": 1872, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWiYh6tktDE=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tg64I=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -352, + "top": 1872, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 1234.5, + "top": 1652.5, + "width": 127, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWiYh6th8ec=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RWiYh6tiGF8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RWiYh6tjmMc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWiYh6tktDE=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RWiYh6tlfk4=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -176, + "top": 936, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RWiYh6tmr4M=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -176, + "top": 936, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RWiYiKtnqn4=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -176, + "top": 936, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RWiYiKtodLM=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -176, + "top": 936, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RWiYiKtpwlU=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "model": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -176, + "top": 936, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1208, + "top": 1648, + "width": 179, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RWiYh6tg64I=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RWiYh6tlfk4=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RWiYh6tmr4M=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RWiYiKtnqn4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RWiYiKtodLM=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RWiYiKtpwlU=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RWkDsK/8U8w=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsK/9X9k=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1427, + "top": 1701, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsK/+yfw=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1424, + "top": 1716, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsK//l9E=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1434, + "top": 1672, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLAAR6U=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/5hKI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1450, + "top": 1706, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLAB24o=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/5hKI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1445, + "top": 1718, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLACKmw=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/5hKI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1460, + "top": 1680, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLADQMw=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/6Fyk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1405, + "top": 1696, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLAEjZI=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/6Fyk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1404, + "top": 1710, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWkDsLAFuWM=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/6Fyk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1406, + "top": 1669, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWkDsLAGH8s=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/5hKI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1160, + "top": 208, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWkDsLAHEmo=", + "_parent": { + "$ref": "AAAAAAF5RWkDsK/8U8w=" + }, + "model": { + "$ref": "AAAAAAF5RWkDr6/6Fyk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1160, + "top": 208, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "tail": { + "$ref": "AAAAAAF5RWbWiJQ+LqI=" + }, + "lineStyle": 1, + "points": "1479:1703;1383:1683", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RWkDsK/9X9k=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWkDsK/+yfw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWkDsK//l9E=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RWkDsLAAR6U=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RWkDsLAB24o=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RWkDsLACKmw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RWkDsLADQMw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RWkDsLAEjZI=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RWkDsLAFuWM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RWkDsLAGH8s=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RWkDsLAHEmo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RWmAObijdJg=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObikqE4=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "font": "Arial;13;0", + "left": 1519, + "top": 1541, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 1, + "text": "+未完成" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObilnCo=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1536, + "top": 1527, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObima+o=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1553, + "top": 1568, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObinxIM=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObigyuY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1359, + "top": 1617, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObioxZQ=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObigyuY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1356, + "top": 1604, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObip4S4=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObigyuY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1365, + "top": 1644, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObiqN8s=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObih5u0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1726, + "top": 1465, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObir6/Y=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObih5u0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1719, + "top": 1453, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWmAObisLv4=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObih5u0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1740, + "top": 1488, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWmAObijdJg=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWmAObitY30=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObigyuY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -888, + "top": 512, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWmAObiuohI=", + "_parent": { + "$ref": "AAAAAAF5RWmAObijdJg=" + }, + "model": { + "$ref": "AAAAAAF5RWmAObih5u0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -888, + "top": 512, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "lineStyle": 1, + "points": "1341:1647;1756:1475", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RWmAObikqE4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWmAObilnCo=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWmAObima+o=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RWmAObinxIM=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RWmAObioxZQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RWmAObip4S4=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RWmAObiqN8s=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RWmAObir6/Y=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RWmAObisLv4=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RWmAObitY30=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RWmAObiuohI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RWo+Isgcitc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RWo+Isgdtvs=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RWo+Isge0Bo=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgdtvs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 1072, + "top": -480, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWo+Isgf4GU=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgdtvs=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 946, + "top": 939.5, + "width": 90, + "height": 13, + "text": "执行单测回检测" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWo+Isgg0Do=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgdtvs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 1072, + "top": -480, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWo+IsghCRI=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgdtvs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 1072, + "top": -480, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 941, + "top": 932.5, + "width": 101, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWo+Isge0Bo=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RWo+Isgf4GU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RWo+Isgg0Do=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWo+IsghCRI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RWo+IsgimWA=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 536, + "top": -240, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RWo+IsgjYQU=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 536, + "top": -240, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RWo+I8gkz+0=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 536, + "top": -240, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RWo+I8gl0UM=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 536, + "top": -240, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RWo+I8gmRYk=", + "_parent": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "model": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 536, + "top": -240, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 920, + "top": 928, + "width": 142, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RWo+Isgdtvs=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RWo+IsgimWA=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RWo+IsgjYQU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RWo+I8gkz+0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RWo+I8gl0UM=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RWo+I8gmRYk=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RWqc88vvIe4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88vwQ3o=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "font": "Arial;13;0", + "left": 1113, + "top": 1304, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 1, + "text": "+完成" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88vxT8A=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1115, + "top": 1310, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88vy9C4=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1156, + "top": 1293, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88vzWws=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svs8AE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1265, + "top": 1622, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88v0Sh0=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svs8AE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1251, + "top": 1626, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88v168Q=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svs8AE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1292, + "top": 1616, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88v2l68=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svtE1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 994, + "top": 986, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88v3ThA=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svtE1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 983, + "top": 994, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWqc88v4wsI=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svtE1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1017, + "top": 972, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWqc88v5V34=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svs8AE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWqc88v6Awc=", + "_parent": { + "$ref": "AAAAAAF5RWqc88vvIe4=" + }, + "model": { + "$ref": "AAAAAAF5RWqc8svtE1U=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "tail": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "lineStyle": 1, + "points": "1289:1647;998:963", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RWqc88vwQ3o=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWqc88vxT8A=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWqc88vy9C4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RWqc88vzWws=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RWqc88v0Sh0=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RWqc88v168Q=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RWqc88v2l68=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RWqc88v3ThA=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RWqc88v4wsI=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RWqc88v5V34=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RWqc88v6Awc=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RWvJyNWG+ro=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJyNWHf5E=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "font": "Arial;13;0", + "left": 1422, + "top": 952, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 1, + "text": "+未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWI+RY=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1459, + "top": 937, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWJFaw=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1457, + "top": 981, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWKHVg=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWDYLg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1088, + "top": 929, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWLzSM=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWDYLg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1091, + "top": 916, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWM5GE=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWDYLg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1082, + "top": 956, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWN+wY=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWEI/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1829, + "top": 974, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWO3W0=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWEI/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1828, + "top": 961, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RWvJydWPqsM=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWEI/s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1832, + "top": 1002, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWvJydWQnX8=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWDYLg=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RWvJydWRolw=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWG+ro=" + }, + "model": { + "$ref": "AAAAAAF5RWvJyNWEI/s=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "tail": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "lineStyle": 1, + "points": "1062:949;1855:997", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RWvJyNWHf5E=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWvJydWI+RY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWvJydWJFaw=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RWvJydWKHVg=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RWvJydWLzSM=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RWvJydWM5GE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RWvJydWN+wY=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RWvJydWO3W0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RWvJydWPqsM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RWvJydWQnX8=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RWvJydWRolw=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RWzzg+QpJu4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RWzzg+QqF0g=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RWzzg+QruaM=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QqF0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1360, + "top": 880, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWzzg+QscXo=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QqF0g=" + }, + "font": "Arial;13;1", + "left": 1021.5, + "top": 1747.5, + "width": 144, + "height": 13, + "text": "doCalScheduleAllCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWzzg+QtTVY=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QqF0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1360, + "top": 880, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RWzzg+QuN+0=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QqF0g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1360, + "top": 880, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1016.5, + "top": 1740.5, + "width": 155.208984375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RWzzg+QruaM=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RWzzg+QscXo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RWzzg+QtTVY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RWzzg+QuN+0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RWzzg+QvVhA=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 680, + "top": 440, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RWzzhOQwWI4=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 680, + "top": 440, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RWzzhOQxyn0=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 680, + "top": 440, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RWzzhOQy5lE=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 680, + "top": 440, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RWzzhOQzPbk=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "model": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 680, + "top": 440, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 984, + "top": 1736, + "width": 219, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RWzzg+QqF0g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RWzzg+QvVhA=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RWzzhOQwWI4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RWzzhOQxyn0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RWzzhOQy5lE=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RWzzhOQzPbk=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RXS1EJdHVug=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EJdIPgY=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1189, + "top": 1689, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EJdJc8o=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1183, + "top": 1675, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdKavs=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1200, + "top": 1716, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdLggY=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dEJJs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1152, + "top": 1704, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdMTYk=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dEJJs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1149, + "top": 1691, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdNexM=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dEJJs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1159, + "top": 1731, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdOTNQ=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dF2N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1225, + "top": 1673, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdPiGs=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dF2N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1217, + "top": 1662, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXS1EZdQDNw=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dF2N4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1240, + "top": 1697, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXS1EZdR8Jw=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dEJJs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXS1EZdSgUI=", + "_parent": { + "$ref": "AAAAAAF5RXS1EJdHVug=" + }, + "model": { + "$ref": "AAAAAAF5RXS1D5dF2N4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RWiYh6tfjKM=" + }, + "tail": { + "$ref": "AAAAAAF5RWzzg+QpJu4=" + }, + "lineStyle": 1, + "points": "1135:1735;1255:1683", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RXS1EJdIPgY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RXS1EJdJc8o=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RXS1EZdKavs=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RXS1EZdLggY=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RXS1EZdMTYk=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RXS1EZdNexM=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RXS1EZdOTNQ=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RXS1EZdPiGs=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RXS1EZdQDNw=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RXS1EZdR8Jw=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RXS1EZdSgUI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RXZT37eTFkI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RXZT37eUYGs=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RXZT37eVlUE=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eUYGs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -64, + "top": -608, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RXZT37eWL9s=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eUYGs=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 427, + "top": 555.5, + "width": 209, + "height": 13, + "text": "是否是doCalScheduleAllCycle状态" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RXZT37eXM1A=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eUYGs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -64, + "top": -608, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RXZT37eYXNc=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eUYGs=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -64, + "top": -608, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 422, + "top": 548.5, + "width": 220.208984375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RXZT37eVlUE=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RXZT37eWL9s=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RXZT37eXM1A=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RXZT37eYXNc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RXZT4LeZ09I=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": -304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RXZT4LeaFc4=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": -304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RXZT4Leb1Fs=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": -304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RXZT4Lec37Q=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": -304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RXZT4Led934=", + "_parent": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "model": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": -304, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 376, + "top": 544, + "width": 311, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RXZT37eUYGs=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RXZT4LeZ09I=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RXZT4LeaFc4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RXZT4Leb1Fs=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RXZT4Lec37Q=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RXZT4Led934=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RXgsFM1PXPQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1QsVQ=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "font": "Arial;13;0", + "left": 734, + "top": 758, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 1, + "text": "+通过" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1Ra4g=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 740, + "top": 769, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1S7Hk=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 769, + "top": 735, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1TpZY=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ml9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 938, + "top": 915, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1UfIs=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ml9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 928, + "top": 924, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1VQJk=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ml9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 959, + "top": 897, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1WeYo=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ncj4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 563, + "top": 601, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1XNlM=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ncj4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 556, + "top": 612, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXgsFM1Y+GY=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ncj4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 577, + "top": 577, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXgsFc1ZbPg=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ml9Y=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXgsFc1aqC8=", + "_parent": { + "$ref": "AAAAAAF5RXgsFM1PXPQ=" + }, + "model": { + "$ref": "AAAAAAF5RXgsE81Ncj4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "tail": { + "$ref": "AAAAAAF5RWo+Isgcitc=" + }, + "lineStyle": 1, + "points": "968:927;553:579", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RXgsFM1QsVQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RXgsFM1Ra4g=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RXgsFM1S7Hk=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RXgsFM1TpZY=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RXgsFM1UfIs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RXgsFM1VQJk=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RXgsFM1WeYo=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RXgsFM1XNlM=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RXgsFM1Y+GY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RXgsFc1ZbPg=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RXgsFc1aqC8=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RXiiXNaNYZA=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaOCjk=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "font": "Arial;13;0", + "left": 690, + "top": 496, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 1, + "text": "+不是" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaPvOQ=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 702, + "top": 481, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaQrNs=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 713, + "top": 525, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaRjEI=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aKkno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 625, + "top": 516, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaS5Dg=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aKkno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 624, + "top": 502, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaT/jE=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aKkno=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 628, + "top": 543, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaUStc=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aL3M4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 787, + "top": 476, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaVtIQ=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aL3M4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 781, + "top": 464, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RXiiXNaWcc8=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aL3M4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 797, + "top": 502, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXiiXNaXeGE=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aKkno=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RXiiXNaY4kk=", + "_parent": { + "$ref": "AAAAAAF5RXiiXNaNYZA=" + }, + "model": { + "$ref": "AAAAAAF5RXiiW9aL3M4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "lineStyle": 1, + "points": "604:543;816:491", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RXiiXNaOCjk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RXiiXNaPvOQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RXiiXNaQrNs=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RXiiXNaRjEI=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RXiiXNaS5Dg=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RXiiXNaT/jE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RXiiXNaUStc=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RXiiXNaVtIQ=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RXiiXNaWcc8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RXiiXNaXeGE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RXiiXNaY4kk=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RX4IzuDknh4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RX4IzuDlZLU=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RX4IzuDmg8A=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDlZLU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -240, + "top": -240, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX4IzuDnpIw=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDlZLU=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 69, + "top": 1043.5, + "width": 181, + "height": 13, + "text": "检测其他测回是否有待补测数据" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX4IzuDoCnY=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDlZLU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -240, + "top": -240, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX4IzuDpft0=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDlZLU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -240, + "top": -240, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 64, + "top": 1036.5, + "width": 192, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX4IzuDmg8A=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RX4IzuDnpIw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RX4IzuDoCnY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX4IzuDpft0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RX4IzuDqBSE=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RX4IzuDrpSs=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RX4IzuDsUmU=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RX4IzuDtPH4=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": -120, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RX4IzuDu2iA=", + "_parent": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "model": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -120, + "top": -120, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 24, + "top": 1032, + "width": 271, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RX4IzuDlZLU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RX4IzuDqBSE=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RX4IzuDrpSs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RX4IzuDsUmU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RX4IzuDtPH4=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RX4IzuDu2iA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RX50xuaSWVY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaTzmw=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "font": "Arial;13;0", + "left": 346, + "top": 808, + "width": 20.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 1, + "text": "+是" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaUoZk=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 368, + "top": 817, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaVv9g=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 333, + "top": 789, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaWjUs=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaPW6s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 513, + "top": 602, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaX0wc=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaPW6s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 522, + "top": 612, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaYr8k=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaPW6s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 493, + "top": 582, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaZPzE=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaQJxA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 200, + "top": 1013, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuaaRl8=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaQJxA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 212, + "top": 1019, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX50xuabK8k=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaQJxA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 176, + "top": 1000, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX50xuac8yw=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaPW6s=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX50xuadjR8=", + "_parent": { + "$ref": "AAAAAAF5RX50xuaSWVY=" + }, + "model": { + "$ref": "AAAAAAF5RX50xeaQJxA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "tail": { + "$ref": "AAAAAAF5RXZT37eTFkI=" + }, + "lineStyle": 1, + "points": "517:579;173:1031", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RX50xuaTzmw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX50xuaUoZk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX50xuaVv9g=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RX50xuaWjUs=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RX50xuaX0wc=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RX50xuaYr8k=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RX50xuaZPzE=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RX50xuaaRl8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RX50xuabK8k=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RX50xuac8yw=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RX50xuadjR8=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RX8e8+6VSP4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RX8e9O6W2xM=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RX8e9O6XR7Q=", + "_parent": { + "$ref": "AAAAAAF5RX8e9O6W2xM=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -16, + "top": -496, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX8e9O6YBmI=", + "_parent": { + "$ref": "AAAAAAF5RX8e9O6W2xM=" + }, + "fillColor": "#ffadad", + "font": "Arial;13;1", + "left": 487.5, + "top": 963.5, + "width": 77, + "height": 13, + "text": "提示用户选择" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX8e9O6ZG1Q=", + "_parent": { + "$ref": "AAAAAAF5RX8e9O6W2xM=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -16, + "top": -496, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX8e9O6aHT4=", + "_parent": { + "$ref": "AAAAAAF5RX8e9O6W2xM=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -16, + "top": -496, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 482.5, + "top": 956.5, + "width": 88, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX8e9O6XR7Q=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RX8e9O6YBmI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RX8e9O6ZG1Q=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX8e9O6aHT4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RX8e9O6brFw=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -8, + "top": -248, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RX8e9O6chUQ=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -8, + "top": -248, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RX8e9O6d2JQ=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -8, + "top": -248, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RX8e9O6ehSE=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -8, + "top": -248, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RX8e9O6fsgA=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "model": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -8, + "top": -248, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 464, + "top": 952, + "width": 124, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RX8e9O6W2xM=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RX8e9O6brFw=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RX8e9O6chUQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RX8e9O6d2JQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RX8e9O6ehSE=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RX8e9O6fsgA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RX9EYPFfH8Q=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFg5zI=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "font": "Arial;13;0", + "left": 338, + "top": 986, + "width": 20.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 1, + "text": "+有" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFh+Xw=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 345, + "top": 971, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFiQm8=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 355, + "top": 1015, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFj0XU=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFcd3k=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 263, + "top": 1004, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFkHH4=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFcd3k=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 262, + "top": 991, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFlEI4=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFcd3k=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "top": 1032, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFmXkk=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFdtmc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 434, + "top": 967, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFnjvk=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFdtmc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 429, + "top": 955, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX9EYPFoLfQ=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFdtmc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 444, + "top": 993, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX9EYPFp0GM=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFcd3k=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX9EYPFqX8k=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFfH8Q=" + }, + "model": { + "$ref": "AAAAAAF5RX9EYPFdtmc=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "tail": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "lineStyle": 1, + "points": "241:1031;463:983", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RX9EYPFg5zI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX9EYPFh+Xw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX9EYPFiQm8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RX9EYPFj0XU=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RX9EYPFkHH4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RX9EYPFlEI4=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RX9EYPFmXkk=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RX9EYPFnjvk=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RX9EYPFoLfQ=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RX9EYPFp0GM=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RX9EYPFqX8k=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RX+92/rtdeY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RX+92/ru5aU=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RX+92/rvMVo=", + "_parent": { + "$ref": "AAAAAAF5RX+92/ru5aU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 160, + "top": 32, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX+92/rwk7c=", + "_parent": { + "$ref": "AAAAAAF5RX+92/ru5aU=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 876, + "top": 1243.5, + "width": 62, + "height": 13, + "text": "切换测回" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX+92/rxBWI=", + "_parent": { + "$ref": "AAAAAAF5RX+92/ru5aU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 160, + "top": 32, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RX+92/ryOmk=", + "_parent": { + "$ref": "AAAAAAF5RX+92/ru5aU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 160, + "top": 32, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 871, + "top": 1236.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX+92/rvMVo=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RX+92/rwk7c=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RX+92/rxBWI=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX+92/ryOmk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RX+92/rzeck=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 80, + "top": 16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RX+92/r0UGE=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 80, + "top": 16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RX+92/r1dEM=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 80, + "top": 16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RX+92/r24rI=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 80, + "top": 16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RX+92/r3m0Y=", + "_parent": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "model": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 80, + "top": 16, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 856, + "top": 1232, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RX+92/ru5aU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RX+92/rzeck=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RX+92/r0UGE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RX+92/r1dEM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RX+92/r24rI=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RX+92/r3m0Y=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RX/wMv3JNxw=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3KAYY=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1343, + "top": 1329, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3L2sA=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1346, + "top": 1314, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3MDuY=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1336, + "top": 1358, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3NMMM=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3GM64=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 986, + "top": 1246, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3OaEE=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3GM64=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 991, + "top": 1233, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3P2uw=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3GM64=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 976, + "top": 1272, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3QkNM=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3HIz8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1701, + "top": 1412, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3RuyM=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3HIz8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1701, + "top": 1399, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RX/wM/3SQ5M=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3HIz8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1699, + "top": 1440, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX/wM/3TMvA=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3GM64=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RX/wM/3Udik=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3JNxw=" + }, + "model": { + "$ref": "AAAAAAF5RX/wMv3HIz8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "lineStyle": 1, + "points": "958:1261;1723:1439", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RX/wM/3KAYY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RX/wM/3L2sA=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RX/wM/3MDuY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RX/wM/3NMMM=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RX/wM/3OaEE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RX/wM/3P2uw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RX/wM/3QkNM=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RX/wM/3RuyM=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RX/wM/3SQ5M=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RX/wM/3TMvA=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RX/wM/3Udik=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYA6Lgau9u4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6LgavBvE=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "font": "Arial;13;0", + "left": 674, + "top": 1090, + "width": 98.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 1, + "text": "+跳转到相应测回" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6LgawDgk=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 732, + "top": 1078, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lgaxot4=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 706, + "top": 1115, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6LgayEWk=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaryvU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 578, + "top": 984, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lgazq+M=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaryvU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 588, + "top": 974, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lga0Sio=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaryvU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 559, + "top": 1003, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lga1FSA=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQashgM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 869, + "top": 1197, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lga2vcA=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQashgM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 875, + "top": 1185, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYA6Lga3b2g=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQashgM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 857, + "top": 1222, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYA6Lga4c4g=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQaryvU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYA6Lga51go=", + "_parent": { + "$ref": "AAAAAAF5RYA6Lgau9u4=" + }, + "model": { + "$ref": "AAAAAAF5RYA6LQashgM=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RX+92/rtdeY=" + }, + "tail": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "lineStyle": 1, + "points": "549:987;882:1231", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYA6LgavBvE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYA6LgawDgk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYA6Lgaxot4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYA6LgayEWk=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYA6Lgazq+M=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYA6Lga0Sio=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYA6Lga1FSA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYA6Lga2vcA=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYA6Lga3b2g=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYA6Lga4c4g=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYA6Lga51go=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYRxIyqNVJQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxIyqOsk8=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "font": "Arial;13;0", + "left": 658, + "top": 706, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 1, + "text": "+忽略或取消" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxIyqPdMg=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 682, + "top": 697, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxIyqQWvY=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 719, + "top": 723, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxIyqRHT4=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqKuUY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 541, + "top": 915, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxJCqS57E=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqKuUY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 531, + "top": 905, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxJCqTkAo=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqKuUY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 560, + "top": 934, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxJCqUXmw=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqLN6Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 848, + "top": 497, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxJCqVgEY=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqLN6Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 836, + "top": 491, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYRxJCqWNBU=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqLN6Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 873, + "top": 509, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYRxJCqXBjo=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqKuUY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYRxJCqYdsw=", + "_parent": { + "$ref": "AAAAAAF5RYRxIyqNVJQ=" + }, + "model": { + "$ref": "AAAAAAF5RYRxIyqLN6Y=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "lineStyle": 1, + "points": "538:951;876:491", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYRxIyqOsk8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYRxIyqPdMg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYRxIyqQWvY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYRxIyqRHT4=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYRxJCqS57E=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYRxJCqTkAo=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYRxJCqUXmw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYRxJCqVgEY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYRxJCqWNBU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYRxJCqXBjo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYRxJCqYdsw=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RYWBNj55r2s=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RYWBNj56ll8=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RYWBNj57vDo=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj56ll8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": 864, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYWBNj582Gg=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj56ll8=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 151.5, + "top": 1835.5, + "width": 155, + "height": 13, + "text": "检测其他测回是否有空数据" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYWBNj59CIs=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj56ll8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": 864, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYWBNj5+a6c=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj56ll8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -32, + "top": 864, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 146.5, + "top": 1828.5, + "width": 166, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYWBNj57vDo=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RYWBNj582Gg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RYWBNj59CIs=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYWBNj5+a6c=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RYWBNj5/meo=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -16, + "top": 432, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RYWBNj6ApFY=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -16, + "top": 432, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RYWBNj6BKos=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -16, + "top": 432, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RYWBNj6CyfU=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -16, + "top": 432, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RYWBNj6DzGw=", + "_parent": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "model": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -16, + "top": 432, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 112, + "top": 1824, + "width": 234, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RYWBNj56ll8=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RYWBNj5/meo=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RYWBNj6ApFY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RYWBNj6BKos=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RYWBNj6CyfU=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RYWBNj6DzGw=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYXKoUPzfpc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP0Xm4=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "font": "Arial;13;0", + "left": 197, + "top": 1437, + "width": 20.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 1, + "text": "+无" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP1/8o=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 222, + "top": 1436, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP2TmE=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 178, + "top": 1440, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP3dpE=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPwWeY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 178, + "top": 1085, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP4Dks=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPwWeY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 191, + "top": 1086, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP5sn0=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPwWeY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 150, + "top": 1083, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP6dKk=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPxCsE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 238, + "top": 1789, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP7hGo=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPxCsE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 251, + "top": 1786, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYXKoUP8Pbs=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPxCsE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 211, + "top": 1796, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYXKoUP9qJ8=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPwWeY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYXKokP+OFo=", + "_parent": { + "$ref": "AAAAAAF5RYXKoUPzfpc=" + }, + "model": { + "$ref": "AAAAAAF5RYXKoUPxCsE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "tail": { + "$ref": "AAAAAAF5RX4IzuDknh4=" + }, + "lineStyle": 1, + "points": "161:1067;226:1823", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYXKoUP0Xm4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYXKoUP1/8o=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYXKoUP2TmE=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYXKoUP3dpE=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYXKoUP4Dks=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYXKoUP5sn0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYXKoUP6dKk=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYXKoUP7hGo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYXKoUP8Pbs=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYXKoUP9qJ8=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYXKokP+OFo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYbKCEsNrL8=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsOHZ0=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "font": "Arial;13;0", + "left": 351, + "top": 1394, + "width": 20.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 1, + "text": "+有" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsP+kM=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 347, + "top": 1389, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsQdPM=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 390, + "top": 1403, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsRxi0=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsKkG0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 228, + "top": 1787, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsSIa0=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsKkG0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": 1781, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsTIOs=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsKkG0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 252, + "top": 1800, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCEsUoUc=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsLR+0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 496, + "top": 1000, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCUsVQTY=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsLR+0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 483, + "top": 998, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYbKCUsWC+U=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsLR+0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 523, + "top": 1005, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYbKCUsX4lU=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsKkG0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYbKCUsYcdA=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsNrL8=" + }, + "model": { + "$ref": "AAAAAAF5RYbKCEsLR+0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RX8e8+6VSP4=" + }, + "tail": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "lineStyle": 1, + "points": "234:1823;519:987", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYbKCEsOHZ0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYbKCEsP+kM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYbKCEsQdPM=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYbKCEsRxi0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYbKCEsSIa0=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYbKCEsTIOs=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYbKCEsUoUc=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYbKCUsVQTY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYbKCUsWC+U=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYbKCUsX4lU=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYbKCUsYcdA=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RYo1sZrzoek=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RYo1sZr0KlU=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RYo1sZr1HjQ=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZr0KlU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -256, + "top": 1584, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYo1sZr2W5c=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZr0KlU=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 511.5, + "top": 2147.5, + "width": 116, + "height": 13, + "text": "检测其他测回合法性" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYo1sZr3XYs=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZr0KlU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -256, + "top": 1584, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RYo1sZr4E80=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZr0KlU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -256, + "top": 1584, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 506.5, + "top": 2140.5, + "width": 127, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYo1sZr1HjQ=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RYo1sZr2W5c=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RYo1sZr3XYs=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYo1sZr4E80=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RYo1sZr5VvI=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -128, + "top": 792, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RYo1sZr6Veg=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -128, + "top": 792, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RYo1sZr7Dv4=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -128, + "top": 792, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RYo1sZr8TjI=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -128, + "top": 792, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RYo1sZr9JcM=", + "_parent": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "model": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -128, + "top": 792, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 480, + "top": 2136, + "width": 179, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RYo1sZr0KlU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RYo1sZr5VvI=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RYo1sZr6Veg=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RYo1sZr7Dv4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RYo1sZr8TjI=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RYo1sZr9JcM=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYqgkqO2MyI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO3BkI=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "font": "Arial;13;0", + "left": 379, + "top": 1979, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 1, + "text": "+无空测回" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO4B50=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 418, + "top": 1968, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO5Eu4=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 387, + "top": 2002, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO6Q3U=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOzOcA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 277, + "top": 1859, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO7HyE=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOzOcA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 287, + "top": 1851, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO8jmg=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOzOcA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 255, + "top": 1876, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO9LA0=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaO0Gyw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 539, + "top": 2100, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO+vZw=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaO0Gyw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 547, + "top": 2089, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYqgkqO/OQc=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaO0Gyw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 524, + "top": 2123, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYqgkqPAF8U=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaOzOcA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYqgkqPBTIk=", + "_parent": { + "$ref": "AAAAAAF5RYqgkqO2MyI=" + }, + "model": { + "$ref": "AAAAAAF5RYqgkaO0Gyw=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "tail": { + "$ref": "AAAAAAF5RYWBNj55r2s=" + }, + "lineStyle": 1, + "points": "248:1859;549:2135", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYqgkqO3BkI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYqgkqO4B50=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYqgkqO5Eu4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYqgkqO6Q3U=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYqgkqO7HyE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYqgkqO8jmg=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYqgkqO9LA0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYqgkqO+vZw=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYqgkqO/OQc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYqgkqPAF8U=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYqgkqPBTIk=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RYuGzq0zcW0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq00uWc=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "font": "Arial;13;0", + "left": 2069, + "top": 2029, + "width": 137.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 1, + "text": "+发现有测回未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq01kJ4=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 2122, + "top": 2032, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq02LjQ=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2166, + "top": 2022, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq03E1k=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0wl4I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 683, + "top": 2123, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq044hU=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0wl4I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 685, + "top": 2109, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq05NGE=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0wl4I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 681, + "top": 2150, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq06xW4=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0xzjs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1912, + "top": 1041, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq07gn8=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0xzjs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1899, + "top": 1046, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RYuGzq08/Nc=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0xzjs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1938, + "top": 1031, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYuGzq09BO0=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0wl4I=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RYuGzq0+Fys=", + "_parent": { + "$ref": "AAAAAAF5RYuGzq0zcW0=" + }, + "model": { + "$ref": "AAAAAAF5RYuGza0xzjs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKuCwkzY630=" + }, + "tail": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "lineStyle": 1, + "points": "659:2146;2152:2032;1921:1019", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RYuGzq00uWc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RYuGzq01kJ4=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RYuGzq02LjQ=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RYuGzq03E1k=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RYuGzq044hU=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RYuGzq05NGE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RYuGzq06xW4=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RYuGzq07gn8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RYuGzq08/Nc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RYuGzq09BO0=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RYuGzq0+Fys=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RY5M47VS/5M=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M47VTDWg=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "font": "Arial;13;0", + "left": 672, + "top": 1304, + "width": 85.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 1, + "text": "+全部通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M47VUjKA=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 699, + "top": 1301, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVVTlw=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 743, + "top": 1309, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVWBPw=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVPReU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 562, + "top": 2100, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVX2xY=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVPReU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 549, + "top": 2095, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVYskw=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVPReU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 588, + "top": 2110, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVZo0A=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVQGdM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 866, + "top": 507, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVaI9U=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVQGdM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 852, + "top": 507, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY5M5LVbdjo=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVQGdM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 894, + "top": 508, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RY5M5LVcoPg=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVPReU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RY5M5LVdBDo=", + "_parent": { + "$ref": "AAAAAAF5RY5M47VS/5M=" + }, + "model": { + "$ref": "AAAAAAF5RY5M4rVQGdM=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5RYo1sZrzoek=" + }, + "lineStyle": 1, + "points": "572:2135;886:491", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RY5M47VTDWg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RY5M47VUjKA=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RY5M5LVVTlw=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RY5M5LVWBPw=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RY5M5LVX2xY=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RY5M5LVYskw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RY5M5LVZo0A=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RY5M5LVaI9U=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RY5M5LVbdjo=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RY5M5LVcoPg=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RY5M5LVdBDo=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RY+P3cq78x4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RY+P3cq8lrU=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RY+P3cq9UVw=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq8lrU=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -192, + "top": 48, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RY+P3cq+inU=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq8lrU=" + }, + "fillColor": "#8282ff", + "font": "Arial;13;1", + "left": 956.5, + "top": 1331.5, + "width": 101, + "height": 13, + "text": "switchState2Idle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RY+P3cq/1Xo=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq8lrU=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -192, + "top": 48, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RY+P3crAIoY=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq8lrU=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -192, + "top": 48, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": 951.5, + "top": 1324.5, + "width": 111.8671875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RY+P3cq9UVw=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RY+P3cq+inU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RY+P3cq/1Xo=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RY+P3crAIoY=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RY+P3srBu6A=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -96, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RY+P3srCnMw=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -96, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RY+P3srDTrA=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -96, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RY+P3srE+P0=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -96, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RY+P3srFRq4=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "model": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "visible": false, + "fillColor": "#8282ff", + "font": "Arial;13;0", + "left": -96, + "top": 24, + "width": 10, + "height": 10 + } + ], + "fillColor": "#8282ff", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 928, + "top": 1320, + "width": 158, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RY+P3cq8lrU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RY+P3srBu6A=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RY+P3srCnMw=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RY+P3srDTrA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RY+P3srE+P0=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RY+P3srFRq4=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RY/lW9HunTY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9Hvi/A=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1133, + "top": 858, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9Hw6yM=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1119, + "top": 854, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9Hx5k8=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1162, + "top": 867, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9HyN1A=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9Hrql4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1004, + "top": 1283, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9Hz89k=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9Hrql4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 992, + "top": 1277, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9H0J0I=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9Hrql4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1029, + "top": 1295, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9H1ErY=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9HsN84=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1263, + "top": 433, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9H23xw=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9HsN84=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1249, + "top": 431, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RY/lW9H3Onc=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9HsN84=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1290, + "top": 437, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RY/lW9H46uE=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9Hrql4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RY/lW9H5+K0=", + "_parent": { + "$ref": "AAAAAAF5RY/lW9HunTY=" + }, + "model": { + "$ref": "AAAAAAF5RY/lW9HsN84=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "tail": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "lineStyle": 1, + "points": "1011:1319;1285:419", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RY/lW9Hvi/A=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RY/lW9Hw6yM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RY/lW9Hx5k8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RY/lW9HyN1A=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RY/lW9Hz89k=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RY/lW9H0J0I=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RY/lW9H1ErY=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RY/lW9H23xw=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RY/lW9H3Onc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RY/lW9H46uE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RY/lW9H5+K0=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RZAQqNi9KXs=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RZAQqNi+U5k=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RZAQqNi/3K4=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi+U5k=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -368, + "top": 1008, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZAQqNjAnDw=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi+U5k=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 770, + "top": 1891.5, + "width": 90, + "height": 13, + "text": "查找待补测数据" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZAQqNjB74E=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi+U5k=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -368, + "top": 1008, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZAQqNjCvdQ=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi+U5k=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -368, + "top": 1008, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 765, + "top": 1884.5, + "width": 101, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZAQqNi/3K4=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RZAQqNjAnDw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RZAQqNjB74E=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZAQqNjCvdQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RZAQqNjDBLs=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -184, + "top": 504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RZAQqNjEOXs=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -184, + "top": 504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RZAQqNjF53M=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -184, + "top": 504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RZAQqNjGCMk=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -184, + "top": 504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RZAQqNjHp8s=", + "_parent": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "model": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -184, + "top": 504, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 744, + "top": 1880, + "width": 142, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RZAQqNi+U5k=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RZAQqNjDBLs=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RZAQqNjEOXs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RZAQqNjF53M=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RZAQqNjGCMk=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RZAQqNjHp8s=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RZDsue7ftRY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7gCik=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "font": "Arial;13;0", + "left": 885, + "top": 1606, + "width": 20.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 1, + "text": "+有" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7h1YU=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 881, + "top": 1601, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7iQis=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 924, + "top": 1615, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7jDYo=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7cAPs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 814, + "top": 1843, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7kyAA=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7cAPs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 802, + "top": 1837, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7ll8Q=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7cAPs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 838, + "top": 1856, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7mtW0=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7dBLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 977, + "top": 1368, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7n/oo=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7dBLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 964, + "top": 1366, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZDsue7oje8=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7dBLs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1004, + "top": 1373, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZDsue7pTkA=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7cAPs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZDsue7qLNI=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7ftRY=" + }, + "model": { + "$ref": "AAAAAAF5RZDsue7dBLs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "tail": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "lineStyle": 1, + "points": "820:1879;1000:1355", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RZDsue7gCik=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZDsue7h1YU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZDsue7iQis=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RZDsue7jDYo=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RZDsue7kyAA=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RZDsue7ll8Q=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RZDsue7mtW0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RZDsue7n/oo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RZDsue7oje8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RZDsue7pTkA=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RZDsue7qLNI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RZEXNfhC2ho=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RZEXNfhDeUQ=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RZEXNfhE1JY=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhDeUQ=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -304, + "top": -48, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZEXNfhF08s=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhDeUQ=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 813, + "top": 1443.5, + "width": 64, + "height": 13, + "text": "查找空数据" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZEXNfhGZmc=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhDeUQ=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -304, + "top": -48, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZEXNfhHCVU=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhDeUQ=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -304, + "top": -48, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 808, + "top": 1436.5, + "width": 75, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZEXNfhE1JY=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RZEXNfhF08s=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RZEXNfhGZmc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZEXNfhHCVU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RZEXNfhIvoY=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -152, + "top": -24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RZEXNvhJXeE=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -152, + "top": -24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RZEXNvhKzwc=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -152, + "top": -24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RZEXNvhLfS4=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -152, + "top": -24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RZEXNvhM3lA=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "model": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -152, + "top": -24, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 792, + "top": 1432, + "width": 106, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RZEXNfhDeUQ=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RZEXNfhIvoY=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RZEXNvhJXeE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RZEXNvhKzwc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RZEXNvhLfS4=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RZEXNvhM3lA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RZE5Jvvk8+0=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vlq9g=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "font": "Arial;13;0", + "left": 804, + "top": 1665, + "width": 20.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 1, + "text": "+无" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vm7FE=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 799, + "top": 1664, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vn7vY=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 843, + "top": 1668, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/voHLE=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5Jvvh7eI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 801, + "top": 1846, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vpdnU=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5Jvvh7eI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 788, + "top": 1842, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vqSPU=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5Jvvh7eI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 828, + "top": 1852, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vrD3M=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvviTz0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 826, + "top": 1485, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vslRk=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvviTz0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 812, + "top": 1487, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZE5J/vtins=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvviTz0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 854, + "top": 1483, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZE5J/vuuHI=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5Jvvh7eI=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZE5J/vvgB0=", + "_parent": { + "$ref": "AAAAAAF5RZE5Jvvk8+0=" + }, + "model": { + "$ref": "AAAAAAF5RZE5JvviTz0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "tail": { + "$ref": "AAAAAAF5RZAQqNi9KXs=" + }, + "lineStyle": 1, + "points": "815:1879;843:1467", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RZE5J/vlq9g=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZE5J/vm7FE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZE5J/vn7vY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RZE5J/voHLE=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RZE5J/vpdnU=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RZE5J/vqSPU=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RZE5J/vrD3M=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RZE5J/vslRk=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RZE5J/vtins=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RZE5J/vuuHI=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RZE5J/vvgB0=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RZGEZgj/XLs=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkArOw=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "font": "Arial;13;0", + "left": 906, + "top": 1374, + "width": 20.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 1, + "text": "+有" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkB2TY=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 907, + "top": 1362, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkChVo=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 933, + "top": 1399, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkDRjc=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj8gpI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 882, + "top": 1397, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkERZ0=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj8gpI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 877, + "top": 1385, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkFONE=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj8gpI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 894, + "top": 1422, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkGzgA=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj9p0E=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 950, + "top": 1351, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkHVm4=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj9p0E=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 940, + "top": 1341, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZGEZgkIGXU=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj9p0E=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 969, + "top": 1371, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZGEZgkJQgE=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj8gpI=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZGEZgkK2ek=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj/XLs=" + }, + "model": { + "$ref": "AAAAAAF5RZGEZgj9p0E=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5RY+P3cq78x4=" + }, + "tail": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "lineStyle": 1, + "points": "870:1431;980:1355", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RZGEZgkArOw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZGEZgkB2TY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZGEZgkChVo=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RZGEZgkDRjc=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RZGEZgkERZ0=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RZGEZgkFONE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RZGEZgkGzgA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RZGEZgkHVm4=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RZGEZgkIGXU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RZGEZgkJQgE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RZGEZgkK2ek=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5RZHb+w38rbY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w39z3k=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "font": "Arial;13;0", + "left": 841, + "top": 954, + "width": 20.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 1, + "text": "+无" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w3+E8c=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 836, + "top": 953, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w3/cnc=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 880, + "top": 955, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4A7LA=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g35LNk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 831, + "top": 1398, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4BF6A=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g35LNk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 818, + "top": 1395, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4COx0=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g35LNk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 858, + "top": 1403, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4DS1Q=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g36Mvo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 871, + "top": 510, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4Efb8=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g36Mvo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 858, + "top": 511, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5RZHb+w4Fx+M=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g36Mvo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 899, + "top": 507, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZHb+w4GxWE=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g35LNk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5RZHb+w4HFa8=", + "_parent": { + "$ref": "AAAAAAF5RZHb+w38rbY=" + }, + "model": { + "$ref": "AAAAAAF5RZHb+g36Mvo=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5RZEXNfhC2ho=" + }, + "lineStyle": 1, + "points": "845:1431;888:491", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5RZHb+w39z3k=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZHb+w3+E8c=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZHb+w3/cnc=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5RZHb+w4A7LA=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5RZHb+w4BF6A=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5RZHb+w4COx0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5RZHb+w4DS1Q=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5RZHb+w4Efb8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5RZHb+w4Fx+M=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5RZHb+w4GxWE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5RZHb+w4HFa8=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5RZ6XBji6Gjs=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5RZ6XBji742g=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5RZ6XBji84Lo=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji742g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -672, + "top": 880, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZ6XBji96yI=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji742g=" + }, + "font": "Arial;13;1", + "left": 776, + "top": 2035.5, + "width": 79, + "height": 13, + "text": "doMoveBack" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZ6XBji+VvE=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji742g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -672, + "top": 880, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5RZ6XBji/AjM=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji742g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -672, + "top": 880, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 771, + "top": 2028.5, + "width": 90.18994140625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5RZ6XBji84Lo=" + }, + "nameLabel": { + "$ref": "AAAAAAF5RZ6XBji96yI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5RZ6XBji+VvE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5RZ6XBji/AjM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5RZ6XBjjASWk=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -336, + "top": 440, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5RZ6XBzjBtGc=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -336, + "top": 440, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5RZ6XBzjCvBw=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -336, + "top": 440, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5RZ6XBzjD9LY=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -336, + "top": 440, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5RZ6XBzjEkZ0=", + "_parent": { + "$ref": "AAAAAAF5RZ6XBji6Gjs=" + }, + "model": { + "$ref": "AAAAAAF5RZ6XBTi4yu4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -336, + "top": 440, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 752, + "top": 2024, + "width": 127, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5RZ6XBji742g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5RZ6XBjjASWk=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5RZ6XBzjBtGc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5RZ6XBzjCvBw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5RZ6XBzjD9LY=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5RZ6XBzjEkZ0=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5Sr6mnFdIbRQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Sr6mm1dGVLo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5Sr6mnFdJQes=", + "_parent": { + "$ref": "AAAAAAF5Sr6mnFdIbRQ=" + }, + "model": { + "$ref": "AAAAAAF5Sr6mm1dGVLo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5Sr6mnFdKY5o=", + "_parent": { + "$ref": "AAAAAAF5Sr6mnFdJQes=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": 96, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sr6mnFdL8fY=", + "_parent": { + "$ref": "AAAAAAF5Sr6mnFdJQes=" + }, + "font": "Arial;13;1", + "left": 414, + "top": 1723.5, + "width": 72, + "height": 13, + "text": "doSurveyor" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sr6mnFdMXvo=", + "_parent": { + "$ref": "AAAAAAF5Sr6mnFdJQes=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": 96, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sr6mnFdNGZc=", + "_parent": { + "$ref": "AAAAAAF5Sr6mnFdJQes=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": 96, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 409, + "top": 1716.5, + "width": 82.24267578125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5Sr6mnFdKY5o=" + }, + "nameLabel": { + "$ref": "AAAAAAF5Sr6mnFdL8fY=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5Sr6mnFdMXvo=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Sr6mnFdNGZc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5Sr6mnVdOubo=", + "_parent": { + "$ref": "AAAAAAF5Sr6mnFdIbRQ=" + }, + "model": { + "$ref": "AAAAAAF5Sr6mm1dGVLo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 48, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5Sr6mnVdPN3o=", + "_parent": { + "$ref": "AAAAAAF5Sr6mnFdIbRQ=" + }, + "model": { + "$ref": "AAAAAAF5Sr6mm1dGVLo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 48, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5Sr6mnVdQi1o=", + "_parent": { + "$ref": "AAAAAAF5Sr6mnFdIbRQ=" + }, + "model": { + "$ref": "AAAAAAF5Sr6mm1dGVLo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 48, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5Sr6mnVdRDJw=", + "_parent": { + "$ref": "AAAAAAF5Sr6mnFdIbRQ=" + }, + "model": { + "$ref": "AAAAAAF5Sr6mm1dGVLo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 48, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5Sr6mnVdS2zY=", + "_parent": { + "$ref": "AAAAAAF5Sr6mnFdIbRQ=" + }, + "model": { + "$ref": "AAAAAAF5Sr6mm1dGVLo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 48, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 392, + "top": 1712, + "width": 116, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5Sr6mnFdJQes=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5Sr6mnVdOubo=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5Sr6mnVdPN3o=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5Sr6mnVdQi1o=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5Sr6mnVdRDJw=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5Sr6mnVdS2zY=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5Sr+CM2cB5us=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5Sr+CM2cCGRA=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2cB5us=" + }, + "model": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5Sr+CM2cDzn0=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2cCGRA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -1104, + "top": -480, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sr+CNGcEr4Q=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2cCGRA=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 303.5, + "top": 1531.5, + "width": 194, + "height": 13, + "text": "检测其他测回是否有正在测量数据" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sr+CNGcFDPg=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2cCGRA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -1104, + "top": -480, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sr+CNGcG0MQ=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2cCGRA=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -1104, + "top": -480, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 298.5, + "top": 1524.5, + "width": 205, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5Sr+CM2cDzn0=" + }, + "nameLabel": { + "$ref": "AAAAAAF5Sr+CNGcEr4Q=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5Sr+CNGcFDPg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Sr+CNGcG0MQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5Sr+CNGcHJ2Y=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2cB5us=" + }, + "model": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -552, + "top": -240, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5Sr+CNGcILlE=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2cB5us=" + }, + "model": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -552, + "top": -240, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5Sr+CNGcJ/gk=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2cB5us=" + }, + "model": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -552, + "top": -240, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5Sr+CNGcKL4U=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2cB5us=" + }, + "model": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -552, + "top": -240, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5Sr+CNGcLiZA=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2cB5us=" + }, + "model": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -552, + "top": -240, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 256, + "top": 1520, + "width": 289, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5Sr+CM2cCGRA=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5Sr+CNGcHJ2Y=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5Sr+CNGcILlE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5Sr+CNGcJ/gk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5Sr+CNGcKL4U=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5Sr+CNGcLiZA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5SsC4MnfxyFI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnft0S4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsC4M3fycW0=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnft0S4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 409, + "top": 1630, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsC4M3fz5ec=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnft0S4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 394, + "top": 1634, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsC4M3f06c0=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnft0S4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 438, + "top": 1623, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsC4M3f1ynk=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnfuteg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 423, + "top": 1683, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsC4M3f212E=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnfuteg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 409, + "top": 1684, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsC4M3f3s5c=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnfuteg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 450, + "top": 1680, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsC4M3f4ln4=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnfv/lw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 396, + "top": 1577, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsC4M3f5q6U=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnfv/lw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 384, + "top": 1583, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsC4M3f6cyo=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnfv/lw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 422, + "top": 1566, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsC4M3f7Urg=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnfuteg=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsC4M3f8wRw=", + "_parent": { + "$ref": "AAAAAAF5SsC4MnfxyFI=" + }, + "model": { + "$ref": "AAAAAAF5SsC4Mnfv/lw=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5Sr+CM2cB5us=" + }, + "tail": { + "$ref": "AAAAAAF5Sr6mnFdIbRQ=" + }, + "lineStyle": 1, + "points": "444:1711;405:1555", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5SsC4M3fycW0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsC4M3fz5ec=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsC4M3f06c0=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5SsC4M3f1ynk=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5SsC4M3f212E=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5SsC4M3f3s5c=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5SsC4M3f4ln4=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5SsC4M3f5q6U=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5SsC4M3f6cyo=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5SsC4M3f7Urg=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5SsC4M3f8wRw=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5SsEjzYKBxwU=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5SsEjzYKCPow=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYKBxwU=" + }, + "model": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5SsEjzYKD6b8=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYKCPow=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -976, + "top": -688, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5SsEjzYKE6p4=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYKCPow=" + }, + "fillColor": "#ffadad", + "font": "Arial;13;1", + "left": 458, + "top": 1363.5, + "width": 129, + "height": 13, + "text": "提示用户是否删除数据" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5SsEjzYKFVEY=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYKCPow=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -976, + "top": -688, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5SsEjzoKGCs4=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYKCPow=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -976, + "top": -688, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": 453, + "top": 1356.5, + "width": 140, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsEjzYKD6b8=" + }, + "nameLabel": { + "$ref": "AAAAAAF5SsEjzYKE6p4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5SsEjzYKFVEY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsEjzoKGCs4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5SsEjzoKHLwk=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYKBxwU=" + }, + "model": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -488, + "top": -344, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5SsEjzoKIZyQ=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYKBxwU=" + }, + "model": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -488, + "top": -344, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5SsEjzoKJIsU=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYKBxwU=" + }, + "model": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -488, + "top": -344, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5SsEjzoKKdw8=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYKBxwU=" + }, + "model": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -488, + "top": -344, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5SsEjzoKLM3w=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYKBxwU=" + }, + "model": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "visible": false, + "fillColor": "#ffadad", + "font": "Arial;13;0", + "left": -488, + "top": -344, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffadad", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 424, + "top": 1352, + "width": 197, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5SsEjzYKCPow=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5SsEjzoKHLwk=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5SsEjzoKIZyQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5SsEjzoKJIsU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5SsEjzoKKdw8=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5SsEjzoKLM3w=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5SsGTy4vXB4s=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsGTyovTQIg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsGTy4vYy/Y=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTyovTQIg=" + }, + "font": "Arial;13;0", + "left": 425, + "top": 1438, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "edgePosition": 1, + "text": "+有数据" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsGTy4vZaQY=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTyovTQIg=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 436, + "top": 1429, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsGTy4va5YE=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTyovTQIg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 473, + "top": 1455, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsGTy4vbO0E=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTy4vUxm0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 416, + "top": 1483, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsGTy4vcDBs=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTy4vUxm0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 406, + "top": 1473, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsGTy4vdZI0=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTy4vUxm0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 435, + "top": 1502, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsGTy4veUmo=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTy4vVaZ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 481, + "top": 1393, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsGTy4vfcb0=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTy4vVaZ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 469, + "top": 1387, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsGTy4vgVyo=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTy4vVaZ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 506, + "top": 1405, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsGTy4vhc58=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTy4vUxm0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsGTy4vi4qg=", + "_parent": { + "$ref": "AAAAAAF5SsGTy4vXB4s=" + }, + "model": { + "$ref": "AAAAAAF5SsGTy4vVaZ0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5SsEjzYKBxwU=" + }, + "tail": { + "$ref": "AAAAAAF5Sr+CM2cB5us=" + }, + "lineStyle": 1, + "points": "413:1519;509:1387", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5SsGTy4vYy/Y=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsGTy4vZaQY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsGTy4va5YE=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5SsGTy4vbO0E=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5SsGTy4vcDBs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5SsGTy4vdZI0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5SsGTy4veUmo=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5SsGTy4vfcb0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5SsGTy4vgVyo=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5SsGTy4vhc58=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5SsGTy4vi4qg=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5SsIvCJpX8B4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pTO8k=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsIvCJpYDgw=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pTO8k=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 691, + "top": 909, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsIvCJpZ1dU=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pTO8k=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 677, + "top": 903, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsIvCJpaoIQ=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pTO8k=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 718, + "top": 920, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsIvCJpb9qM=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pUHxM=" + }, + "font": "Arial;13;0", + "left": 488, + "top": 1315, + "width": 72.22798156738281, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "edgePosition": 2, + "text": "+忽略or取消" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsIvCJpcPdE=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pUHxM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 513, + "top": 1308, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsIvCJpd7pc=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pUHxM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 548, + "top": 1329, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsIvCJpeUhk=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pVSwc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 858, + "top": 503, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsIvCJpfq/M=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pVSwc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 845, + "top": 500, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsIvCJpgY1s=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pVSwc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 885, + "top": 509, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsIvCJphgMc=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pUHxM=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsIvCJpi0FU=", + "_parent": { + "$ref": "AAAAAAF5SsIvCJpX8B4=" + }, + "model": { + "$ref": "AAAAAAF5SsIvB5pVSwc=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5SsEjzYKBxwU=" + }, + "lineStyle": 1, + "points": "529:1351;882:491", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5SsIvCJpYDgw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsIvCJpZ1dU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsIvCJpaoIQ=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5SsIvCJpb9qM=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5SsIvCJpcPdE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5SsIvCJpd7pc=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5SsIvCJpeUhk=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5SsIvCJpfq/M=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5SsIvCJpgY1s=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5SsIvCJphgMc=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5SsIvCJpi0FU=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5SsKfZ6cz6GA=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5SsKfZ6c0cw0=", + "_parent": { + "$ref": "AAAAAAF5SsKfZ6cz6GA=" + }, + "model": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5SsKfZ6c1If0=", + "_parent": { + "$ref": "AAAAAAF5SsKfZ6c0cw0=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -1504, + "top": -1264, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5SsKfZ6c22jM=", + "_parent": { + "$ref": "AAAAAAF5SsKfZ6c0cw0=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 188, + "top": 1195.5, + "width": 62, + "height": 13, + "text": "执行测量" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5SsKfZ6c3y80=", + "_parent": { + "$ref": "AAAAAAF5SsKfZ6c0cw0=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -1504, + "top": -1264, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5SsKfZ6c4/6w=", + "_parent": { + "$ref": "AAAAAAF5SsKfZ6c0cw0=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -1504, + "top": -1264, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 183, + "top": 1188.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsKfZ6c1If0=" + }, + "nameLabel": { + "$ref": "AAAAAAF5SsKfZ6c22jM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5SsKfZ6c3y80=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsKfZ6c4/6w=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5SsKfZ6c53s4=", + "_parent": { + "$ref": "AAAAAAF5SsKfZ6cz6GA=" + }, + "model": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -752, + "top": -632, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5SsKfZ6c6ce4=", + "_parent": { + "$ref": "AAAAAAF5SsKfZ6cz6GA=" + }, + "model": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -752, + "top": -632, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5SsKfZ6c7vSY=", + "_parent": { + "$ref": "AAAAAAF5SsKfZ6cz6GA=" + }, + "model": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -752, + "top": -632, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5SsKfZ6c8vrI=", + "_parent": { + "$ref": "AAAAAAF5SsKfZ6cz6GA=" + }, + "model": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -752, + "top": -632, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5SsKfZ6c9w5g=", + "_parent": { + "$ref": "AAAAAAF5SsKfZ6cz6GA=" + }, + "model": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": -752, + "top": -632, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 168, + "top": 1184, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5SsKfZ6c0cw0=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5SsKfZ6c53s4=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5SsKfZ6c6ce4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5SsKfZ6c7vSY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5SsKfZ6c8vrI=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5SsKfZ6c9w5g=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5SsLOnqvSnF4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvOHTI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLOnqvT9Zc=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvOHTI=" + }, + "font": "Arial;13;0", + "left": 272, + "top": 1370, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "edgePosition": 1, + "text": "+无数据" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLOnqvUkow=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvOHTI=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 282, + "top": 1377, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLOnqvVLTQ=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvOHTI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 322, + "top": 1355, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLOnqvWnnM=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvP3jk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 364, + "top": 1497, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLOnqvXr5I=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvP3jk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 351, + "top": 1501, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLOnqvYxHA=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvP3jk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 390, + "top": 1488, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLOn6vZ9lI=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvQ0Oc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 227, + "top": 1242, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLOn6vaP/I=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvQ0Oc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 216, + "top": 1251, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLOn6vbXrc=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvQ0Oc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 249, + "top": 1226, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsLOn6vcdQk=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvP3jk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsLOn6vdxGs=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvSnF4=" + }, + "model": { + "$ref": "AAAAAAF5SsLOnqvQ0Oc=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5SsKfZ6cz6GA=" + }, + "tail": { + "$ref": "AAAAAAF5Sr+CM2cB5us=" + }, + "lineStyle": 1, + "points": "390:1519;228:1219", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5SsLOnqvT9Zc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsLOnqvUkow=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsLOnqvVLTQ=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5SsLOnqvWnnM=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5SsLOnqvXr5I=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5SsLOnqvYxHA=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5SsLOn6vZ9lI=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5SsLOn6vaP/I=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5SsLOn6vbXrc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5SsLOn6vcdQk=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5SsLOn6vdxGs=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5SsLnBK6bZAc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsLnA66XUCE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLnBK6cpAA=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnA66XUCE=" + }, + "font": "Arial;13;0", + "left": 333, + "top": 1292, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "edgePosition": 1, + "text": "+确定删除" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLnBK6d5AU=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnA66XUCE=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 355, + "top": 1305, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLnBK6eFBA=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnA66XUCE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 377, + "top": 1265, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLnBK6fMJY=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnBK6Y5d4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 459, + "top": 1345, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLnBK6gP4A=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnBK6Y5d4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 450, + "top": 1356, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLnBK6hs3M=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnBK6Y5d4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 476, + "top": 1323, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLnBK6ibt8=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnBK6ZnVU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 266, + "top": 1238, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLnBK6j9qo=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnBK6ZnVU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 262, + "top": 1251, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsLnBK6kw2A=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnBK6ZnVU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 275, + "top": 1212, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsLnBK6lciw=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnBK6Y5d4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsLnBK6mW+g=", + "_parent": { + "$ref": "AAAAAAF5SsLnBK6bZAc=" + }, + "model": { + "$ref": "AAAAAAF5SsLnBK6ZnVU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5SsKfZ6cz6GA=" + }, + "tail": { + "$ref": "AAAAAAF5SsEjzYKBxwU=" + }, + "lineStyle": 1, + "points": "489:1351;251:1219", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5SsLnBK6cpAA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsLnBK6d5AU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsLnBK6eFBA=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5SsLnBK6fMJY=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5SsLnBK6gP4A=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5SsLnBK6hs3M=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5SsLnBK6ibt8=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5SsLnBK6j9qo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5SsLnBK6kw2A=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5SsLnBK6lciw=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5SsLnBK6mW+g=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5Ssd41L4Ykm8=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Ssd4074UW6o=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ssd41L4Zqt8=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd4074UW6o=" + }, + "font": "Arial;13;0", + "left": 298, + "top": 715, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "edgePosition": 1, + "text": "+测量成功" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ssd41L4aA68=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd4074UW6o=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 312, + "top": 711, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ssd41L4bzG4=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd4074UW6o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 356, + "top": 722, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ssd41L4cBd0=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd41L4V+18=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 215, + "top": 1148, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ssd41L4dOJQ=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd41L4V+18=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 202, + "top": 1142, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ssd41L4eN6A=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd41L4V+18=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 240, + "top": 1159, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ssd41L4fb84=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd41L4WIjg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 440, + "top": 282, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ssd41L4gSW0=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd41L4WIjg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 427, + "top": 281, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ssd41L4hw20=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd41L4WIjg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 468, + "top": 285, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Ssd41L4iA10=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd41L4V+18=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Ssd41L4jXng=", + "_parent": { + "$ref": "AAAAAAF5Ssd41L4Ykm8=" + }, + "model": { + "$ref": "AAAAAAF5Ssd41L4WIjg=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJ6ahiPXyXI=" + }, + "tail": { + "$ref": "AAAAAAF5SsKfZ6cz6GA=" + }, + "lineStyle": 1, + "points": "223:1183;462:267", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5Ssd41L4Zqt8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5Ssd41L4aA68=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Ssd41L4bzG4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5Ssd41L4cBd0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5Ssd41L4dOJQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5Ssd41L4eN6A=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5Ssd41L4fb84=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5Ssd41L4gSW0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5Ssd41L4hw20=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5Ssd41L4iA10=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5Ssd41L4jXng=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5Sseu4cD3uPk=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Sseu4cD1ALY=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5Sseu4cD4dEc=", + "_parent": { + "$ref": "AAAAAAF5Sseu4cD3uPk=" + }, + "model": { + "$ref": "AAAAAAF5Sseu4cD1ALY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5Sseu4sD5D+g=", + "_parent": { + "$ref": "AAAAAAF5Sseu4cD4dEc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1472, + "top": -1600, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sseu4sD6WNI=", + "_parent": { + "$ref": "AAAAAAF5Sseu4cD4dEc=" + }, + "font": "Arial;13;1", + "left": 340, + "top": 1067.5, + "width": 98, + "height": 13, + "text": "SurveyorFailure" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sseu4sD7TeQ=", + "_parent": { + "$ref": "AAAAAAF5Sseu4cD4dEc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1472, + "top": -1600, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sseu4sD8OGM=", + "_parent": { + "$ref": "AAAAAAF5Sseu4cD4dEc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1472, + "top": -1600, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 335, + "top": 1060.5, + "width": 108.9853515625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5Sseu4sD5D+g=" + }, + "nameLabel": { + "$ref": "AAAAAAF5Sseu4sD6WNI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5Sseu4sD7TeQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Sseu4sD8OGM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5Sseu4sD98rM=", + "_parent": { + "$ref": "AAAAAAF5Sseu4cD3uPk=" + }, + "model": { + "$ref": "AAAAAAF5Sseu4cD1ALY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -736, + "top": -800, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5Sseu4sD+mh8=", + "_parent": { + "$ref": "AAAAAAF5Sseu4cD3uPk=" + }, + "model": { + "$ref": "AAAAAAF5Sseu4cD1ALY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -736, + "top": -800, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5Sseu4sD/yw4=", + "_parent": { + "$ref": "AAAAAAF5Sseu4cD3uPk=" + }, + "model": { + "$ref": "AAAAAAF5Sseu4cD1ALY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -736, + "top": -800, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5Sseu4sEAhqQ=", + "_parent": { + "$ref": "AAAAAAF5Sseu4cD3uPk=" + }, + "model": { + "$ref": "AAAAAAF5Sseu4cD1ALY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -736, + "top": -800, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5Sseu4sEB2Lc=", + "_parent": { + "$ref": "AAAAAAF5Sseu4cD3uPk=" + }, + "model": { + "$ref": "AAAAAAF5Sseu4cD1ALY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -736, + "top": -800, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 312, + "top": 1056, + "width": 154, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5Sseu4cD4dEc=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5Sseu4sD98rM=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5Sseu4sD+mh8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5Sseu4sD/yw4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5Sseu4sEAhqQ=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5Sseu4sEB2Lc=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5SsfL8MfWulU=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fSWbs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsfL8MfXyQI=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fSWbs=" + }, + "font": "Arial;13;0", + "left": 264, + "top": 1119, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "edgePosition": 1, + "text": "+测量失败" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsfL8MfYdR0=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fSWbs=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 284, + "top": 1107, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsfL8MfZubw=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fSWbs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 312, + "top": 1142, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsfL8MfaQ2g=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fTiS4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 253, + "top": 1149, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsfL8MfbsfE=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fTiS4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 247, + "top": 1137, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsfL8MfcKqA=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fTiS4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 266, + "top": 1173, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsfL8MfdMu0=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fU9Fc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 334, + "top": 1088, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsfL8MfexH0=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fU9Fc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 324, + "top": 1079, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsfL8MffFqI=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fU9Fc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 354, + "top": 1108, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsfL8Mfg/Q0=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fTiS4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsfL8MfhnlI=", + "_parent": { + "$ref": "AAAAAAF5SsfL8MfWulU=" + }, + "model": { + "$ref": "AAAAAAF5SsfL78fU9Fc=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5Sseu4cD3uPk=" + }, + "tail": { + "$ref": "AAAAAAF5SsKfZ6cz6GA=" + }, + "lineStyle": 1, + "points": "242:1183;364:1091", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5SsfL8MfXyQI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsfL8MfYdR0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsfL8MfZubw=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5SsfL8MfaQ2g=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5SsfL8MfbsfE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5SsfL8MfcKqA=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5SsfL8MfdMu0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5SsfL8MfexH0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5SsfL8MffFqI=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5SsfL8Mfg/Q0=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5SsfL8MfhnlI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5Sst98wwqqgM=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5Sst98wwrk5U=", + "_parent": { + "$ref": "AAAAAAF5Sst98wwqqgM=" + }, + "model": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5Sst98wwsBT0=", + "_parent": { + "$ref": "AAAAAAF5Sst98wwrk5U=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 48, + "top": -160, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sst98wwtbtQ=", + "_parent": { + "$ref": "AAAAAAF5Sst98wwrk5U=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 1652, + "top": 51.5, + "width": 62, + "height": 13, + "text": "是否闭合" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sst98wwumLc=", + "_parent": { + "$ref": "AAAAAAF5Sst98wwrk5U=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 48, + "top": -160, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Sst98wwvQ7M=", + "_parent": { + "$ref": "AAAAAAF5Sst98wwrk5U=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 48, + "top": -160, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 1647, + "top": 44.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5Sst98wwsBT0=" + }, + "nameLabel": { + "$ref": "AAAAAAF5Sst98wwtbtQ=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5Sst98wwumLc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Sst98wwvQ7M=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5Sst98www8Oc=", + "_parent": { + "$ref": "AAAAAAF5Sst98wwqqgM=" + }, + "model": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 24, + "top": -80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5Sst98wwx3u0=", + "_parent": { + "$ref": "AAAAAAF5Sst98wwqqgM=" + }, + "model": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 24, + "top": -80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5Sst98wwya8E=", + "_parent": { + "$ref": "AAAAAAF5Sst98wwqqgM=" + }, + "model": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 24, + "top": -80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5Sst98wwzlK8=", + "_parent": { + "$ref": "AAAAAAF5Sst98wwqqgM=" + }, + "model": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 24, + "top": -80, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5Sst98ww0Wjc=", + "_parent": { + "$ref": "AAAAAAF5Sst98wwqqgM=" + }, + "model": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 24, + "top": -80, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1632, + "top": 40, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5Sst98wwrk5U=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5Sst98www8Oc=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5Sst98wwx3u0=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5Sst98wwya8E=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5Sst98wwzlK8=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5Sst98ww0Wjc=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5SsvDEBJ5KNQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ10hk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsvDEBJ65LU=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ10hk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1525, + "top": 68, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsvDEBJ7LZg=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ10hk=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1522, + "top": 53, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsvDEBJ8W1Y=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ10hk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1530, + "top": 97, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsvDEBJ9rec=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ2t9o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1447, + "top": 85, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsvDEBJ+YlY=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ2t9o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1446, + "top": 71, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsvDEBJ/9rs=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ2t9o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1448, + "top": 112, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsvDEBKANc8=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ3GSY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1602, + "top": 52, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsvDEBKBIh8=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ3GSY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1597, + "top": 40, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsvDERKCEpk=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ3GSY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1612, + "top": 78, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsvDERKDUNc=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ2t9o=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsvDERKE66g=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ5KNQ=" + }, + "model": { + "$ref": "AAAAAAF5SsvDEBJ3GSY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5Sst98wwqqgM=" + }, + "tail": { + "$ref": "AAAAAAF5QJ8m8Sf6ofY=" + }, + "lineStyle": 1, + "points": "1425:111;1631:68", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5SsvDEBJ65LU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsvDEBJ7LZg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsvDEBJ8W1Y=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5SsvDEBJ9rec=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5SsvDEBJ+YlY=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5SsvDEBJ/9rs=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5SsvDEBKANc8=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5SsvDEBKBIh8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5SsvDERKCEpk=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5SsvDERKDUNc=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5SsvDERKE66g=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5Ssw/NBbRxlk=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5Ssw/NBbSF2M=", + "_parent": { + "$ref": "AAAAAAF5Ssw/NBbRxlk=" + }, + "model": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5Ssw/NBbTP+M=", + "_parent": { + "$ref": "AAAAAAF5Ssw/NBbSF2M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1440, + "top": 192, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Ssw/NBbUxMs=", + "_parent": { + "$ref": "AAAAAAF5Ssw/NBbSF2M=" + }, + "font": "Arial;13;1", + "left": 1249, + "top": 251.5, + "width": 124, + "height": 13, + "text": "checkHalfCycleZero" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Ssw/NBbVQpo=", + "_parent": { + "$ref": "AAAAAAF5Ssw/NBbSF2M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1440, + "top": 192, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Ssw/NBbW1cU=", + "_parent": { + "$ref": "AAAAAAF5Ssw/NBbSF2M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1440, + "top": 192, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1244, + "top": 244.5, + "width": 134.28076171875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5Ssw/NBbTP+M=" + }, + "nameLabel": { + "$ref": "AAAAAAF5Ssw/NBbUxMs=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5Ssw/NBbVQpo=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Ssw/NBbW1cU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5Ssw/NBbXko4=", + "_parent": { + "$ref": "AAAAAAF5Ssw/NBbRxlk=" + }, + "model": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -720, + "top": 96, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5Ssw/NBbYUF0=", + "_parent": { + "$ref": "AAAAAAF5Ssw/NBbRxlk=" + }, + "model": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -720, + "top": 96, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5Ssw/NBbZSlY=", + "_parent": { + "$ref": "AAAAAAF5Ssw/NBbRxlk=" + }, + "model": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -720, + "top": 96, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5Ssw/NBbaO/g=", + "_parent": { + "$ref": "AAAAAAF5Ssw/NBbRxlk=" + }, + "model": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -720, + "top": 96, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5Ssw/NBbbK8k=", + "_parent": { + "$ref": "AAAAAAF5Ssw/NBbRxlk=" + }, + "model": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -720, + "top": 96, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1216, + "top": 240, + "width": 190, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5Ssw/NBbSF2M=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5Ssw/NBbXko4=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5Ssw/NBbYUF0=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5Ssw/NBbZSlY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5Ssw/NBbaO/g=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5Ssw/NBbbK8k=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5SsxY9RsnmvY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9BsjL0w=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsxY9Rso3zw=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9BsjL0w=" + }, + "font": "Arial;13;0", + "left": 1493, + "top": 164, + "width": 20.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "edgePosition": 1, + "text": "+否" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsxY9RspvS0=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9BsjL0w=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1510, + "top": 177, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsxY9Rsq3L8=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9BsjL0w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1488, + "top": 137, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsxY9Rsrf8M=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9BskgpI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1633, + "top": 94, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsxY9RssvXQ=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9BskgpI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1637, + "top": 107, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsxY9Rstlgw=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9BskgpI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1624, + "top": 68, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsxY9RsuHms=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9Bsl5Tg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1372, + "top": 233, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsxY9RsvAmg=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9Bsl5Tg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1381, + "top": 244, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SsxY9RswFu4=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9Bsl5Tg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1356, + "top": 211, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsxY9Rsx3zc=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9BskgpI=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SsxY9Rsy0lU=", + "_parent": { + "$ref": "AAAAAAF5SsxY9RsnmvY=" + }, + "model": { + "$ref": "AAAAAAF5SsxY9Bsl5Tg=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5Ssw/NBbRxlk=" + }, + "tail": { + "$ref": "AAAAAAF5Sst98wwqqgM=" + }, + "lineStyle": 1, + "points": "1649:75;1343:239", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5SsxY9Rso3zw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsxY9RspvS0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsxY9Rsq3L8=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5SsxY9Rsrf8M=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5SsxY9RssvXQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5SsxY9Rstlgw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5SsxY9RsuHms=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5SsxY9RsvAmg=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5SsxY9RswFu4=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5SsxY9Rsx3zc=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5SsxY9Rsy0lU=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5SsyaiR+SygU=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5SsyaiR+Tni4=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+SygU=" + }, + "model": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5SsyaiR+UDd8=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+Tni4=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 256, + "top": -288, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5SsyaiR+VLzI=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+Tni4=" + }, + "fillColor": "#ffff91", + "font": "Arial;13;1", + "left": 1775.5, + "top": 147.5, + "width": 77, + "height": 13, + "text": "执行归零检测" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5SsyaiR+WGNM=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+Tni4=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 256, + "top": -288, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5SsyaiR+XOgU=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+Tni4=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 256, + "top": -288, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 1770.5, + "top": 140.5, + "width": 88, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5SsyaiR+UDd8=" + }, + "nameLabel": { + "$ref": "AAAAAAF5SsyaiR+VLzI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5SsyaiR+WGNM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SsyaiR+XOgU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5SsyaiR+YmEc=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+SygU=" + }, + "model": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 128, + "top": -144, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5SsyaiR+ZFcg=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+SygU=" + }, + "model": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 128, + "top": -144, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5SsyaiR+aG70=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+SygU=" + }, + "model": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 128, + "top": -144, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5SsyaiR+bvEY=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+SygU=" + }, + "model": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 128, + "top": -144, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5SsyaiR+c1cI=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+SygU=" + }, + "model": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "visible": false, + "fillColor": "#ffff91", + "font": "Arial;13;0", + "left": 128, + "top": -144, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffff91", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1752, + "top": 136, + "width": 124, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5SsyaiR+Tni4=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5SsyaiR+YmEc=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5SsyaiR+ZFcg=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5SsyaiR+aG70=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5SsyaiR+bvEY=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5SsyaiR+c1cI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5SszpXCjo1EY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjkGRI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SszpXCjpTBg=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjkGRI=" + }, + "font": "Arial;13;0", + "left": 1745, + "top": 86, + "width": 20.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "edgePosition": 1, + "text": "+是" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SszpXCjqUQ0=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjkGRI=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1764, + "top": 74, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SszpXSjrtE4=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjkGRI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1738, + "top": 111, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SszpXSjsrPY=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjl/+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1736, + "top": 72, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SszpXSjtl3A=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjl/+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1746, + "top": 63, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SszpXSjuzIY=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjl/+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1716, + "top": 91, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SszpXSjvn8g=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjmncs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1776, + "top": 101, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SszpXSjwGS4=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjmncs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1782, + "top": 89, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5SszpXSjx7DE=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjmncs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1763, + "top": 126, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SszpXSjytaQ=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjl/+8=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5SszpXSjzLNw=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjo1EY=" + }, + "model": { + "$ref": "AAAAAAF5SszpXCjmncs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5SsyaiR+SygU=" + }, + "tail": { + "$ref": "AAAAAAF5Sst98wwqqgM=" + }, + "lineStyle": 1, + "points": "1707:75;1788:135", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5SszpXCjpTBg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5SszpXCjqUQ0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5SszpXSjrtE4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5SszpXSjsrPY=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5SszpXSjtl3A=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5SszpXSjuzIY=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5SszpXSjvn8g=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5SszpXSjwGS4=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5SszpXSjx7DE=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5SszpXSjytaQ=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5SszpXSjzLNw=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5Ss0jcC4eMnU=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4aijg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss0jcC4f1SI=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4aijg=" + }, + "font": "Arial;13;0", + "left": 1561, + "top": 210, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "edgePosition": 1, + "text": "+成功" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss0jcC4gpjw=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4aijg=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1580, + "top": 225, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss0jcC4hyOQ=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4aijg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1570, + "top": 181, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss0jcC4ik1U=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4bSQM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1728, + "top": 179, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss0jcC4j7WE=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4bSQM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1729, + "top": 193, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss0jcC4kJQ0=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4bSQM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1727, + "top": 152, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss0jcC4lZO0=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4cI98=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1425, + "top": 242, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss0jcC4mJoI=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4cI98=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1430, + "top": 254, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss0jcC4nP2o=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4cI98=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1415, + "top": 216, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Ss0jcC4oHMs=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4bSQM=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Ss0jcC4pyOo=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4eMnU=" + }, + "model": { + "$ref": "AAAAAAF5Ss0jcC4cI98=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5Ssw/NBbRxlk=" + }, + "tail": { + "$ref": "AAAAAAF5SsyaiR+SygU=" + }, + "lineStyle": 1, + "points": "1751:166;1397:239", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5Ss0jcC4f1SI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5Ss0jcC4gpjw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Ss0jcC4hyOQ=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5Ss0jcC4ik1U=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5Ss0jcC4j7WE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5Ss0jcC4kJQ0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5Ss0jcC4lZO0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5Ss0jcC4mJoI=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5Ss0jcC4nP2o=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5Ss0jcC4oHMs=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5Ss0jcC4pyOo=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5Ss1QmDKthXI=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5Ss1QmDKuZC4=", + "_parent": { + "$ref": "AAAAAAF5Ss1QmDKthXI=" + }, + "model": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5Ss1QmDKvWlI=", + "_parent": { + "$ref": "AAAAAAF5Ss1QmDKuZC4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 80, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Ss1QmDKwG90=", + "_parent": { + "$ref": "AAAAAAF5Ss1QmDKuZC4=" + }, + "font": "Arial;13;1", + "left": 1805, + "top": 379.5, + "width": 105, + "height": 13, + "text": "isReady2CCheck" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Ss1QmDKxdQY=", + "_parent": { + "$ref": "AAAAAAF5Ss1QmDKuZC4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 80, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Ss1QmDKy1Jk=", + "_parent": { + "$ref": "AAAAAAF5Ss1QmDKuZC4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 80, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1800, + "top": 372.5, + "width": 115.498046875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5Ss1QmDKvWlI=" + }, + "nameLabel": { + "$ref": "AAAAAAF5Ss1QmDKwG90=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5Ss1QmDKxdQY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Ss1QmDKy1Jk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5Ss1QmDKzPd4=", + "_parent": { + "$ref": "AAAAAAF5Ss1QmDKthXI=" + }, + "model": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -120, + "top": 40, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5Ss1QmDK0rgM=", + "_parent": { + "$ref": "AAAAAAF5Ss1QmDKthXI=" + }, + "model": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -120, + "top": 40, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5Ss1QmDK1URs=", + "_parent": { + "$ref": "AAAAAAF5Ss1QmDKthXI=" + }, + "model": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -120, + "top": 40, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5Ss1QmDK27BM=", + "_parent": { + "$ref": "AAAAAAF5Ss1QmDKthXI=" + }, + "model": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -120, + "top": 40, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5Ss1QmTK3KzQ=", + "_parent": { + "$ref": "AAAAAAF5Ss1QmDKthXI=" + }, + "model": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -120, + "top": 40, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1776, + "top": 368, + "width": 163, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5Ss1QmDKuZC4=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5Ss1QmDKzPd4=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5Ss1QmDK0rgM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5Ss1QmDK1URs=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5Ss1QmDK27BM=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5Ss1QmTK3KzQ=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5Ss1sYzc57Aw=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc1nBg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss1sYzc6gkg=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc1nBg=" + }, + "font": "Arial;13;0", + "left": 1826, + "top": 260, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "edgePosition": 1, + "text": "+未成功" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss1sYzc7Ydc=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc1nBg=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1864, + "top": 257, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss1sYzc8aaQ=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc1nBg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1820, + "top": 265, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss1sYzc9oVQ=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc28DU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1835, + "top": 187, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss1sYzc+1mo=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc28DU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1849, + "top": 187, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss1sYzc/qfo=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc28DU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1807, + "top": 188, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss1sYzdAwEk=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc3JbA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1863, + "top": 332, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss1sYzdBh5I=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc3JbA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1876, + "top": 327, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Ss1sYzdCSbM=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc3JbA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1837, + "top": 342, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Ss1sYzdDZ80=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc28DU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Ss1sYzdEJ2M=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc57Aw=" + }, + "model": { + "$ref": "AAAAAAF5Ss1sYzc3JbA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5Ss1QmDKthXI=" + }, + "tail": { + "$ref": "AAAAAAF5SsyaiR+SygU=" + }, + "lineStyle": 1, + "points": "1816:171;1854:367", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5Ss1sYzc6gkg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5Ss1sYzc7Ydc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Ss1sYzc8aaQ=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5Ss1sYzc9oVQ=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5Ss1sYzc+1mo=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5Ss1sYzc/qfo=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5Ss1sYzdAwEk=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5Ss1sYzdBh5I=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5Ss1sYzdCSbM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5Ss1sYzdDZ80=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5Ss1sYzdEJ2M=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5StBNjXab2vs=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaXraA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StBNjnack3k=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaXraA=" + }, + "font": "Arial;13;0", + "left": 2070, + "top": 347, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "edgePosition": 1, + "text": "+满足条件" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StBNjnadVQY=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaXraA=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 2098, + "top": 332, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StBNjnaesNQ=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaXraA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2102, + "top": 376, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StBNjnafXzY=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaYthc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1963, + "top": 356, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StBNjnagLn4=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaYthc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1965, + "top": 342, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StBNjnah5RQ=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaYthc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1961, + "top": 384, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StBNjnaisDA=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaZel4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2236, + "top": 337, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StBNjXab2vs=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StBNjnaj34U=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaZel4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2232, + "top": 324, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StBNjXab2vs=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StBNjnakOhM=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaZel4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2242, + "top": 364, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StBNjXab2vs=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StBNjnalJvg=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaYthc=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StBNjnamkmI=", + "_parent": { + "$ref": "AAAAAAF5StBNjXab2vs=" + }, + "model": { + "$ref": "AAAAAAF5StBNjXaZel4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P5nMr01oLTI=" + }, + "tail": { + "$ref": "AAAAAAF5Ss1QmDKthXI=" + }, + "lineStyle": 1, + "points": "1939:379;2263:357", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5StBNjnack3k=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5StBNjnadVQY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5StBNjnaesNQ=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5StBNjnafXzY=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5StBNjnagLn4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5StBNjnah5RQ=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5StBNjnaisDA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5StBNjnaj34U=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5StBNjnakOhM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5StBNjnalJvg=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5StBNjnamkmI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5StIJ55ESsdQ=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5StIJ6JETau4=", + "_parent": { + "$ref": "AAAAAAF5StIJ55ESsdQ=" + }, + "model": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5StIJ6JEUhEM=", + "_parent": { + "$ref": "AAAAAAF5StIJ6JETau4=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5StIJ6JEVqnE=", + "_parent": { + "$ref": "AAAAAAF5StIJ6JETau4=" + }, + "font": "Arial;13;1", + "left": 2051, + "top": 523.5, + "width": 96, + "height": 13, + "text": "doRecordClean" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5StIJ6JEWP7E=", + "_parent": { + "$ref": "AAAAAAF5StIJ6JETau4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5StIJ6JEXgV0=", + "_parent": { + "$ref": "AAAAAAF5StIJ6JETau4=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 2046, + "top": 516.5, + "width": 106.07177734375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5StIJ6JEUhEM=" + }, + "nameLabel": { + "$ref": "AAAAAAF5StIJ6JEVqnE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5StIJ6JEWP7E=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5StIJ6JEXgV0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5StIJ6JEYF5o=", + "_parent": { + "$ref": "AAAAAAF5StIJ55ESsdQ=" + }, + "model": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5StIJ6JEZA8U=", + "_parent": { + "$ref": "AAAAAAF5StIJ55ESsdQ=" + }, + "model": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5StIJ6JEaYwU=", + "_parent": { + "$ref": "AAAAAAF5StIJ55ESsdQ=" + }, + "model": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5StIJ6JEb/UM=", + "_parent": { + "$ref": "AAAAAAF5StIJ55ESsdQ=" + }, + "model": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5StIJ6JEcyow=", + "_parent": { + "$ref": "AAAAAAF5StIJ55ESsdQ=" + }, + "model": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 2024, + "top": 512, + "width": 150, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5StIJ6JETau4=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5StIJ6JEYF5o=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5StIJ6JEZA8U=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5StIJ6JEaYwU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5StIJ6JEb/UM=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5StIJ6JEcyow=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5StIhp5XCuNU=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5StIhppW+/2s=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StIhp5XDSVA=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppW+/2s=" + }, + "font": "Arial;13;0", + "left": 1961, + "top": 438, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "edgePosition": 1, + "text": "+不满足" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StIhp5XEOe8=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppW+/2s=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1992, + "top": 425, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StIhp5XFIgE=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppW+/2s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1969, + "top": 463, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StIhp5XGV44=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppW/3D0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1916, + "top": 397, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StIhp5XH9Wk=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppW/3D0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1925, + "top": 387, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StIhp5XIoUY=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppW/3D0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1899, + "top": 418, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StIhp5XJabQ=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppXAozs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2053, + "top": 478, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StIhp5XKQI8=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppXAozs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2058, + "top": 466, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StIhp5XLdHE=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppXAozs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2043, + "top": 504, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StIhp5XMnHk=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppW/3D0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StIhp5XNKZI=", + "_parent": { + "$ref": "AAAAAAF5StIhp5XCuNU=" + }, + "model": { + "$ref": "AAAAAAF5StIhppXAozs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5StIJ55ESsdQ=" + }, + "tail": { + "$ref": "AAAAAAF5Ss1QmDKthXI=" + }, + "lineStyle": 1, + "points": "1887:403;2068:511", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5StIhp5XDSVA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5StIhp5XEOe8=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5StIhp5XFIgE=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5StIhp5XGV44=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5StIhp5XH9Wk=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5StIhp5XIoUY=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5StIhp5XJabQ=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5StIhp5XKQI8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5StIhp5XLdHE=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5StIhp5XMnHk=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5StIhp5XNKZI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5StWKjad/ao4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad7sNs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StWKjaeAOMw=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad7sNs=" + }, + "font": "Arial;13;0", + "left": 1526, + "top": 470, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "edgePosition": 1, + "text": "+完成" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StWKjaeB8T4=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad7sNs=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1538, + "top": 485, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StWKjqeCMfI=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad7sNs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1549, + "top": 441, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StWKjqeD8dI=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad8hyI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1722, + "top": 513, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StWKjqeENZo=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad8hyI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1716, + "top": 525, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StWKjqeFObw=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad8hyI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1732, + "top": 487, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StWKjqeGRb0=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad96kQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1363, + "top": 427, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StWKjad/ao4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StWKjqeHI70=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad96kQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1362, + "top": 441, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StWKjad/ao4=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StWKjqeIy1Y=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad96kQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1365, + "top": 399, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StWKjad/ao4=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StWKjqeJDvE=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad8hyI=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StWKjqeKjN0=", + "_parent": { + "$ref": "AAAAAAF5StWKjad/ao4=" + }, + "model": { + "$ref": "AAAAAAF5StWKjad96kQ=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5P5/CAk98zZc=" + }, + "tail": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "lineStyle": 1, + "points": "1751:511;1342:413", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5StWKjaeAOMw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5StWKjaeB8T4=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5StWKjqeCMfI=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5StWKjqeD8dI=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5StWKjqeENZo=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5StWKjqeFObw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5StWKjqeGRb0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5StWKjqeHI70=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5StWKjqeIy1Y=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5StWKjqeJDvE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5StWKjqeKjN0=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5StaqW9rGSo4=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5StaqW9rHsAM=", + "_parent": { + "$ref": "AAAAAAF5StaqW9rGSo4=" + }, + "model": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5StaqW9rIMvI=", + "_parent": { + "$ref": "AAAAAAF5StaqW9rHsAM=" + }, + "visible": false, + "fillColor": "#ffc1ad", + "font": "Arial;13;0", + "left": -448, + "top": -496, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5StaqW9rJ3VU=", + "_parent": { + "$ref": "AAAAAAF5StaqW9rHsAM=" + }, + "fillColor": "#ffc1ad", + "font": "Arial;13;1", + "left": 1738.5, + "top": 715.5, + "width": 168, + "height": 13, + "text": "用户选择是否跳转到其他测回" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5StaqW9rK5Uk=", + "_parent": { + "$ref": "AAAAAAF5StaqW9rHsAM=" + }, + "visible": false, + "fillColor": "#ffc1ad", + "font": "Arial;13;0", + "left": -448, + "top": -496, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5StaqW9rLlM4=", + "_parent": { + "$ref": "AAAAAAF5StaqW9rHsAM=" + }, + "visible": false, + "fillColor": "#ffc1ad", + "font": "Arial;13;0", + "left": -448, + "top": -496, + "height": 13, + "horizontalAlignment": 1 + } + ], + "fillColor": "#ffc1ad", + "font": "Arial;13;0", + "left": 1733.5, + "top": 708.5, + "width": 179, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5StaqW9rIMvI=" + }, + "nameLabel": { + "$ref": "AAAAAAF5StaqW9rJ3VU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5StaqW9rK5Uk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5StaqW9rLlM4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5StaqW9rMapE=", + "_parent": { + "$ref": "AAAAAAF5StaqW9rGSo4=" + }, + "model": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "visible": false, + "fillColor": "#ffc1ad", + "font": "Arial;13;0", + "left": -224, + "top": -248, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5StaqW9rNzzg=", + "_parent": { + "$ref": "AAAAAAF5StaqW9rGSo4=" + }, + "model": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "visible": false, + "fillColor": "#ffc1ad", + "font": "Arial;13;0", + "left": -224, + "top": -248, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5StaqW9rON6o=", + "_parent": { + "$ref": "AAAAAAF5StaqW9rGSo4=" + }, + "model": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "visible": false, + "fillColor": "#ffc1ad", + "font": "Arial;13;0", + "left": -224, + "top": -248, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5StaqW9rPWX8=", + "_parent": { + "$ref": "AAAAAAF5StaqW9rGSo4=" + }, + "model": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "visible": false, + "fillColor": "#ffc1ad", + "font": "Arial;13;0", + "left": -224, + "top": -248, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5StaqW9rQ9mc=", + "_parent": { + "$ref": "AAAAAAF5StaqW9rGSo4=" + }, + "model": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "visible": false, + "fillColor": "#ffc1ad", + "font": "Arial;13;0", + "left": -224, + "top": -248, + "width": 10, + "height": 10 + } + ], + "fillColor": "#ffc1ad", + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1696, + "top": 704, + "width": 253, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5StaqW9rHsAM=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5StaqW9rMapE=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5StaqW9rNzzg=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5StaqW9rON6o=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5StaqW9rPWX8=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5StaqW9rQ9mc=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5StcY69+auow=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+Wpu4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StcY69+bJyw=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+Wpu4=" + }, + "font": "Arial;13;0", + "left": 1815, + "top": 619, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "edgePosition": 1, + "text": "+未完成" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StcY69+crMs=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+Wpu4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1853, + "top": 619, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StcY69+d1N0=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+Wpu4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1809, + "top": 618, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StcY7N+esYw=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+XtIs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1840, + "top": 567, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StcY7N+f1JY=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+XtIs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1853, + "top": 569, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StcY7N+gGlM=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+XtIs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1812, + "top": 562, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StcY7N+hLtM=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+Yoz0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1837, + "top": 671, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StcY69+auow=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StcY7N+i0N0=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+Yoz0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1850, + "top": 669, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StcY69+auow=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StcY7N+jJRk=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+Yoz0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1810, + "top": 675, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StcY69+auow=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StcY7N+k7Ks=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+XtIs=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StcY7N+lWqU=", + "_parent": { + "$ref": "AAAAAAF5StcY69+auow=" + }, + "model": { + "$ref": "AAAAAAF5StcY69+Yoz0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5StaqW9rGSo4=" + }, + "tail": { + "$ref": "AAAAAAF5QKIG+T9Y4ko=" + }, + "lineStyle": 1, + "points": "1826:547;1822:703", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5StcY69+bJyw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5StcY69+crMs=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5StcY69+d1N0=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5StcY7N+esYw=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5StcY7N+f1JY=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5StcY7N+gGlM=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5StcY7N+hLtM=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5StcY7N+i0N0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5StcY7N+jJRk=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5StcY7N+k7Ks=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5StcY7N+lWqU=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5StecvuuYlQs=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuUiTw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StecvuuZ8Fw=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuUiTw=" + }, + "font": "Arial;13;0", + "left": 1776, + "top": 1083, + "width": 98.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "edgePosition": 1, + "text": "+跳转测回后补测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StecvuuawiY=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuUiTw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1840, + "top": 1083, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StecvuubliA=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuUiTw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1796, + "top": 1082, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StecvuucS6Y=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuVcKw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1835, + "top": 759, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StecvuudsIs=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuVcKw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1848, + "top": 762, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StecvuueFws=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuVcKw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1807, + "top": 754, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StecvuufPVU=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuWIOM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1816, + "top": 1407, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StecvuuYlQs=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StecvuugcGo=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuWIOM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1830, + "top": 1405, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StecvuuYlQs=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StecvuuhAqk=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuWIOM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1789, + "top": 1411, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StecvuuYlQs=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StecvuuiooQ=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuVcKw=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Stecv+uj9kw=", + "_parent": { + "$ref": "AAAAAAF5StecvuuYlQs=" + }, + "model": { + "$ref": "AAAAAAF5StecvuuWIOM=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5StaqW9rGSo4=" + }, + "lineStyle": 1, + "points": "1821:739;1801:1439", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5StecvuuZ8Fw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5StecvuuawiY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5StecvuubliA=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5StecvuucS6Y=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5StecvuudsIs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5StecvuueFws=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5StecvuufPVU=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5StecvuugcGo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5StecvuuhAqk=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5StecvuuiooQ=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5Stecv+uj9kw=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5Stg/Ofb2A68=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/byEbA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Stg/Ofb3nog=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/byEbA=" + }, + "font": "Arial;13;0", + "left": 1315, + "top": 605, + "width": 72.22798156738281, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "edgePosition": 1, + "text": "+取消or忽略" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Stg/Ofb45tw=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/byEbA=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1347, + "top": 619, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Stg/Ofb5GmI=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/byEbA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1358, + "top": 576, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Stg/Ofb6tf0=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/bz2/4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1725, + "top": 704, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Stg/Ofb78vU=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/bz2/4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1719, + "top": 717, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Stg/Ofb8Jmw=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/bz2/4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1736, + "top": 679, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Stg/Ofb9zNg=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/b0VQA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 978, + "top": 506, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Stg/Ofb+I1M=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/b0VQA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 977, + "top": 519, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Stg/Ofb/AoU=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/b0VQA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 981, + "top": 478, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Stg/OfcA1lA=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/bz2/4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Stg/OfcBL2A=", + "_parent": { + "$ref": "AAAAAAF5Stg/Ofb2A68=" + }, + "model": { + "$ref": "AAAAAAF5Stg/N/b0VQA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QJjLZRML/gk=" + }, + "tail": { + "$ref": "AAAAAAF5StaqW9rGSo4=" + }, + "lineStyle": 1, + "points": "1754:703;957:491", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5Stg/Ofb3nog=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5Stg/Ofb45tw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Stg/Ofb5GmI=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5Stg/Ofb6tf0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5Stg/Ofb78vU=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5Stg/Ofb8Jmw=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5Stg/Ofb9zNg=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5Stg/Ofb+I1M=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5Stg/Ofb/AoU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5Stg/OfcA1lA=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5Stg/OfcBL2A=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF5Stp87Q6fs2Y=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF5Stp87g6gqlw=", + "_parent": { + "$ref": "AAAAAAF5Stp87Q6fs2Y=" + }, + "model": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF5Stp87g6h+fQ=", + "_parent": { + "$ref": "AAAAAAF5Stp87g6gqlw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 864, + "top": 48, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Stp87g6iB2Y=", + "_parent": { + "$ref": "AAAAAAF5Stp87g6gqlw=" + }, + "font": "Arial;13;1", + "left": 2518.5, + "top": 819.5, + "width": 151, + "height": 13, + "text": "isSingleCycleCompleted" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Stp87g6jrfo=", + "_parent": { + "$ref": "AAAAAAF5Stp87g6gqlw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 864, + "top": 48, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF5Stp87g6koqM=", + "_parent": { + "$ref": "AAAAAAF5Stp87g6gqlw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 864, + "top": 48, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 2513.5, + "top": 812.5, + "width": 161.708984375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF5Stp87g6h+fQ=" + }, + "nameLabel": { + "$ref": "AAAAAAF5Stp87g6iB2Y=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF5Stp87g6jrfo=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Stp87g6koqM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF5Stp87g6lk/c=", + "_parent": { + "$ref": "AAAAAAF5Stp87Q6fs2Y=" + }, + "model": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF5Stp87g6mFIA=", + "_parent": { + "$ref": "AAAAAAF5Stp87Q6fs2Y=" + }, + "model": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5Stp87g6nmy0=", + "_parent": { + "$ref": "AAAAAAF5Stp87Q6fs2Y=" + }, + "model": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF5Stp87g6oJMI=", + "_parent": { + "$ref": "AAAAAAF5Stp87Q6fs2Y=" + }, + "model": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF5Stp87g6p63M=", + "_parent": { + "$ref": "AAAAAAF5Stp87Q6fs2Y=" + }, + "model": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": 24, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 2480, + "top": 808, + "width": 228, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF5Stp87g6gqlw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF5Stp87g6lk/c=" + }, + "operationCompartment": { + "$ref": "AAAAAAF5Stp87g6mFIA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5Stp87g6nmy0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF5Stp87g6oJMI=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF5Stp87g6p63M=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5StrWhROp4Oc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOl298=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StrWhROqofY=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOl298=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2352, + "top": 658, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StrWhROrA94=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOl298=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 2360, + "top": 645, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StrWhROs2b4=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOl298=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2337, + "top": 683, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StrWhROtkZ8=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOmfyU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2157, + "top": 541, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StrWhROu87A=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOmfyU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2166, + "top": 531, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StrWhROvpPg=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOmfyU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2140, + "top": 562, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StrWhROw9lc=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOnvuo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2548, + "top": 774, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StrWhROxGek=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOnvuo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2553, + "top": 762, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5StrWhROy9qY=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOnvuo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2538, + "top": 800, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StrWhROzgAM=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOmfyU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5StrWhRO0+cw=", + "_parent": { + "$ref": "AAAAAAF5StrWhROp4Oc=" + }, + "model": { + "$ref": "AAAAAAF5StrWhBOnvuo=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5Stp87Q6fs2Y=" + }, + "tail": { + "$ref": "AAAAAAF5StIJ55ESsdQ=" + }, + "lineStyle": 1, + "points": "2128:547;2563:807", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5StrWhROqofY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5StrWhROrA94=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5StrWhROs2b4=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5StrWhROtkZ8=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5StrWhROu87A=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5StrWhROvpPg=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5StrWhROw9lc=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5StrWhROxGek=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5StrWhROy9qY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5StrWhROzgAM=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5StrWhRO0+cw=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5Styi5hf3vEY=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rfz3o0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Styi5hf45gs=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rfz3o0=" + }, + "font": "Arial;13;0", + "left": 2339, + "top": 811, + "width": 46.591796875, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "edgePosition": 1, + "text": "+完成" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Styi5hf51HU=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rfz3o0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 2361, + "top": 826, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Styi5hf6gvA=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rfz3o0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2365, + "top": 782, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Styi5hf7rXE=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rf0fJk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2451, + "top": 820, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Styi5hf8B7M=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rf0fJk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2448, + "top": 833, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Styi5hf95Ew=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rf0fJk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2458, + "top": 793, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Styi5hf+T+w=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rf1+Tk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2274, + "top": 804, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Styi5hf/4I4=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rf1+Tk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2275, + "top": 817, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5Styi5hgAAcY=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rf1+Tk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2272, + "top": 776, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Styi5hgBznc=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rf0fJk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5Styi5hgCPb4=", + "_parent": { + "$ref": "AAAAAAF5Styi5hf3vEY=" + }, + "model": { + "$ref": "AAAAAAF5Styi5Rf1+Tk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QKE6Ojfzjv0=" + }, + "tail": { + "$ref": "AAAAAAF5Stp87Q6fs2Y=" + }, + "lineStyle": 1, + "points": "2479:814;2250:793", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5Styi5hf45gs=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5Styi5hf51HU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5Styi5hf6gvA=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5Styi5hf7rXE=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5Styi5hf8B7M=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5Styi5hf95Ew=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5Styi5hf+T+w=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5Styi5hf/4I4=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5Styi5hgAAcY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5Styi5hgBznc=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5Styi5hgCPb4=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF5St1uUR+q0qc=", + "_parent": { + "$ref": "AAAAAAF5P5m6Qk1jVXQ=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+mHuk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5St1uUR+rshY=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+mHuk=" + }, + "font": "Arial;13;0", + "left": 2182, + "top": 1146, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "edgePosition": 1, + "text": "+未完成" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5St1uUR+sGjw=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+mHuk=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 2214, + "top": 1158, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5St1uUR+t4JQ=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+mHuk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2186, + "top": 1123, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5St1uUR+uiWE=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+nHko=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2559, + "top": 864, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5St1uUR+v1Ig=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+nHko=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2565, + "top": 876, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5St1uUR+wJBc=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+nHko=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 2545, + "top": 840, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5St1uUR+xuEc=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+oJAQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1852, + "top": 1428, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5St1uUR+yEoo=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+oJAQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1862, + "top": 1437, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF5St1uUR+zGSA=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+oJAQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1832, + "top": 1409, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5St1uUR+02pE=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+nHko=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF5St1uUR+1/EE=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+q0qc=" + }, + "model": { + "$ref": "AAAAAAF5St1uUR+oJAQ=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF5QMaQUG/rlG8=" + }, + "tail": { + "$ref": "AAAAAAF5Stp87Q6fs2Y=" + }, + "lineStyle": 1, + "points": "2570:843;1823:1439", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF5St1uUR+rshY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF5St1uUR+sGjw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF5St1uUR+t4JQ=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF5St1uUR+uiWE=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF5St1uUR+v1Ig=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF5St1uUR+wJBc=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF5St1uUR+xuEc=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF5St1uUR+yEoo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF5St1uUR+zGSA=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF5St1uUR+02pE=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF5St1uUR+1/EE=" + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P5nMrk1mLCw=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "check2C", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P5saV03F9So=", + "_parent": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P5saV03GReQ=", + "_parent": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "reference": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P5saV03HrLQ=", + "_parent": { + "$ref": "AAAAAAF5P5saV03F9So=" + }, + "reference": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P56tf07Epig=", + "_parent": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P56tgE7F7Yk=", + "_parent": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "reference": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P56tgE7GNNA=", + "_parent": { + "$ref": "AAAAAAF5P56tf07Epig=" + }, + "reference": { + "$ref": "AAAAAAF5P56LY06KFIA=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P5rmBE2WOV0=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "recordClean" + }, + { + "_type": "UMLUseCaseSubject", + "_id": "AAAAAAF5P5vlT04vpIc=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "用户选择操作" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P56LY06KFIA=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "【用户选择操作】", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P5/ask/ASWM=", + "_parent": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "name": "选择忽略or重测目标", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P5/ask/BASE=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "reference": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P5/ask/CwwU=", + "_parent": { + "$ref": "AAAAAAF5P5/ask/ASWM=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P6ETu1Fsgo0=", + "_parent": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "name": "重测测回", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6ETu1FtUvs=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "reference": { + "$ref": "AAAAAAF5P56LY06KFIA=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6ETu1Fuzfc=", + "_parent": { + "$ref": "AAAAAAF5P6ETu1Fsgo0=" + }, + "reference": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P5/CAk96MB0=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "Idle" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P6Btl1DQYFs=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "【提示用户是否确定删除整个测回】", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P6HZl1I+eIg=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "name": "选择忽略or取消", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6HZl1I/u/s=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "reference": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6HZl1JAt1Q=", + "_parent": { + "$ref": "AAAAAAF5P6HZl1I+eIg=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P6Jc6FP89fs=", + "_parent": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "name": "确认删除", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6Jc6FP9Ay0=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "reference": { + "$ref": "AAAAAAF5P6Btl1DQYFs=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6Jc6FP+W/w=", + "_parent": { + "$ref": "AAAAAAF5P6Jc6FP89fs=" + }, + "reference": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P6IYDFMK28k=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "【执行删除操作】", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5P6KuWFYuLA4=", + "_parent": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6KuWFYvXto=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "reference": { + "$ref": "AAAAAAF5P6IYDFMK28k=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5P6KuWFYwtmg=", + "_parent": { + "$ref": "AAAAAAF5P6KuWFYuLA4=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5P6I/oFN00qM=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "重新搜索目标开启新一轮测量", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJXgiQky2RI=", + "_parent": { + "$ref": "AAAAAAF5P6I/oFN00qM=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJXgiQkzVQM=", + "_parent": { + "$ref": "AAAAAAF5QJXgiQky2RI=" + }, + "reference": { + "$ref": "AAAAAAF5P6I/oFN00qM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJXgiQk0kU4=", + "_parent": { + "$ref": "AAAAAAF5QJXgiQky2RI=" + }, + "reference": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJWvCggxZrM=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "move2NextValidate", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RVWv2lZqu2A=", + "_parent": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVWv2lZro+8=", + "_parent": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "reference": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVWv2lZs/XI=", + "_parent": { + "$ref": "AAAAAAF5RVWv2lZqu2A=" + }, + "reference": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJc4CA2m0sA=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "checkHalfCycleZero", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJesYRAUeZI=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "name": "测站不闭合or半测回归零差正常", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJesYRAV/Pw=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "reference": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJesYRAWIno=", + "_parent": { + "$ref": "AAAAAAF5QJesYRAUeZI=" + }, + "reference": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJmQwBdscKg=", + "_parent": { + "$ref": "AAAAAAF5QJc4CA2m0sA=" + }, + "name": "没有通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJmQwBdt/Nk=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "reference": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJmQwBdu0wk=", + "_parent": { + "$ref": "AAAAAAF5QJmQwBdscKg=" + }, + "reference": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJeXAw9WAQQ=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "isReady2CCheck" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJjLZBMJQJ8=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "switchState2StandStill", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJnk3RnjFKU=", + "_parent": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJnk3Rnk4S8=", + "_parent": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJnk3Rnlvxc=", + "_parent": { + "$ref": "AAAAAAF5QJnk3RnjFKU=" + }, + "reference": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJk5ohVWyGc=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "提示半测回归零检测失败", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJnHsRkKHYc=", + "_parent": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJnHsRkLdTo=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "reference": { + "$ref": "AAAAAAF5QJk5ohVWyGc=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJnHsRkM5N4=", + "_parent": { + "$ref": "AAAAAAF5QJnHsRkKHYc=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJ6ahSPVJNg=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "checkReadData", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJ87Oyj+dCg=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "name": "单测量or通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ87Oyj/TJQ=", + "_parent": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "reference": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ87OykA4RY=", + "_parent": { + "$ref": "AAAAAAF5QJ87Oyj+dCg=" + }, + "reference": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJ/Ugywh52g=", + "_parent": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ/Ugywiha4=", + "_parent": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "reference": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ/UgywjRPE=", + "_parent": { + "$ref": "AAAAAAF5QJ/Ugywh52g=" + }, + "reference": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJ8m8Sf4R1w=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "isHalfCycleZeroCheckReady", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5SsvDEBJ10hk=", + "_parent": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsvDEBJ2t9o=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ10hk=" + }, + "reference": { + "$ref": "AAAAAAF5QJ8m8Sf4R1w=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsvDEBJ3GSY=", + "_parent": { + "$ref": "AAAAAAF5SsvDEBJ10hk=" + }, + "reference": { + "$ref": "AAAAAAF5Sst98gwopLY=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QJ+mRitXafY=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "提示读数有误", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QJ/0PCz+xYo=", + "_parent": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ/0PCz/2CU=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "reference": { + "$ref": "AAAAAAF5QJ+mRitXafY=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QJ/0PC0AjHo=", + "_parent": { + "$ref": "AAAAAAF5QJ/0PCz+xYo=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKE6OTfx/D4=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "checkSingleCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QKI4y0KDGow=", + "_parent": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QKI4zEKEuw8=", + "_parent": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "reference": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QKI4zEKFtZg=", + "_parent": { + "$ref": "AAAAAAF5QKI4y0KDGow=" + }, + "reference": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QKvMIE8VEZE=", + "_parent": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QKvMIE8WKCE=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "reference": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QKvMIE8XsG8=", + "_parent": { + "$ref": "AAAAAAF5QKvMIE8VEZE=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKIG+T9Wjdo=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "isAllCycleCompleted", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5StWKjad7sNs=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "name": "完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StWKjad8hyI=", + "_parent": { + "$ref": "AAAAAAF5StWKjad7sNs=" + }, + "reference": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StWKjad96kQ=", + "_parent": { + "$ref": "AAAAAAF5StWKjad7sNs=" + }, + "reference": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5StcY69+Wpu4=", + "_parent": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "name": "未完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StcY69+XtIs=", + "_parent": { + "$ref": "AAAAAAF5StcY69+Wpu4=" + }, + "reference": { + "$ref": "AAAAAAF5QKIG+T9Wjdo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StcY69+Yoz0=", + "_parent": { + "$ref": "AAAAAAF5StcY69+Wpu4=" + }, + "reference": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + } + } + } + ] + }, + { + "_type": "UMLUseCaseSubject", + "_id": "AAAAAAF5QKJM6UPX41c=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "UseCaseSubject1" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKuCwkzWMuI=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "提示用户选择", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QK2Ql1lrW/0=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "name": "忽略", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QK2Ql1lsCzU=", + "_parent": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QK2Ql1ltUBY=", + "_parent": { + "$ref": "AAAAAAF5QK2Ql1lrW/0=" + }, + "reference": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QLdiW2HmZcI=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QLdiW2HnzLc=", + "_parent": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QLdiW2HodP8=", + "_parent": { + "$ref": "AAAAAAF5QLdiW2HmZcI=" + }, + "reference": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QMnaf4pzXpA=", + "_parent": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMnaf4p0R7o=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMnaf4p1n0A=", + "_parent": { + "$ref": "AAAAAAF5QMnaf4pzXpA=" + }, + "reference": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKyR6VB8Gq8=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "重测方向", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QLx6RGoJ91g=", + "_parent": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QLx6RGoKxZI=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "reference": { + "$ref": "AAAAAAF5QKyR6VB8Gq8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QLx6RGoLs1U=", + "_parent": { + "$ref": "AAAAAAF5QLx6RGoJ91g=" + }, + "reference": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKysH1F2Xh8=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "重测测回", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QNAhapFq3kM=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "name": "取消", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QNAhapFrudc=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "reference": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QNAhapFsZZ8=", + "_parent": { + "$ref": "AAAAAAF5QNAhapFq3kM=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QNFL6qCXEtU=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "name": "忽略", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QNFL6qCY2AQ=", + "_parent": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "reference": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QNFL6qCZ01s=", + "_parent": { + "$ref": "AAAAAAF5QNFL6qCXEtU=" + }, + "reference": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RVcwNF0hcaI=", + "_parent": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVcwNF0iVWE=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "reference": { + "$ref": "AAAAAAF5QKysH1F2Xh8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVcwNF0jQf0=", + "_parent": { + "$ref": "AAAAAAF5RVcwNF0hcaI=" + }, + "reference": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QKzDRVJwpI4=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "resetSurveyorStateAndKeepPosition", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QK340l0BzRk=", + "_parent": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QK340l0ChAw=", + "_parent": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "reference": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QK340l0D79M=", + "_parent": { + "$ref": "AAAAAAF5QK340l0BzRk=" + }, + "reference": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QLwOJ2bN7N0=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "resurveyPoints", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QMbzEHNMUo0=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "name": "开始重测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMbzEHNNh8o=", + "_parent": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "reference": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMbzEHNOm6M=", + "_parent": { + "$ref": "AAAAAAF5QMbzEHNMUo0=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + }, + { + "_type": "UMLGeneralization", + "_id": "AAAAAAF5QMevPnTKBWs=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "name": "重测失败", + "source": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "target": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RVTunkvVKUs=", + "_parent": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "name": "重测失败", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVTun0vWQ0U=", + "_parent": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "reference": { + "$ref": "AAAAAAF5QLwOJ2bN7N0=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVTun0vXr0g=", + "_parent": { + "$ref": "AAAAAAF5RVTunkvVKUs=" + }, + "reference": { + "$ref": "AAAAAAF5QKzDRVJwpI4=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5QMaQUG/pf+g=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "switchState2RestartInCurrentCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5QMjEpoXtFac=", + "_parent": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMjEpoXuicM=", + "_parent": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5QMjEpoXvKNs=", + "_parent": { + "$ref": "AAAAAAF5QMjEpoXtFac=" + }, + "reference": { + "$ref": "AAAAAAF5QJWvCggxZrM=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RVbpp1nIOnU=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "执行测回删除", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RVdEqWBKDgY=", + "_parent": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVdEqWBL2Ro=", + "_parent": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "reference": { + "$ref": "AAAAAAF5RVbpp1nIOnU=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RVdEqWBMaWs=", + "_parent": { + "$ref": "AAAAAAF5RVdEqWBKDgY=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RWbWh5Q82SE=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "doCalScheduleSingleCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RWkDr6/4piw=", + "_parent": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWkDr6/5hKI=", + "_parent": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "reference": { + "$ref": "AAAAAAF5RWbWh5Q82SE=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWkDr6/6Fyk=", + "_parent": { + "$ref": "AAAAAAF5RWkDr6/4piw=" + }, + "reference": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + } + } + } + ] + }, + { + "_type": "UMLUseCaseSubject", + "_id": "AAAAAAF5RWdznZ2YK/Q=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "UseCaseSubject2" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RWiYh6tdXHE=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "该测回是否完成测量", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RWmAObifwr4=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "name": "未完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWmAObigyuY=", + "_parent": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "reference": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWmAObih5u0=", + "_parent": { + "$ref": "AAAAAAF5RWmAObifwr4=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RWqc8svr3pE=", + "_parent": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "name": "完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWqc8svs8AE=", + "_parent": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "reference": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWqc8svtE1U=", + "_parent": { + "$ref": "AAAAAAF5RWqc8svr3pE=" + }, + "reference": { + "$ref": "AAAAAAF5RWo+Icga7No=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RWo+Icga7No=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "执行单测回检测", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RWvJyNWC314=", + "_parent": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWvJyNWDYLg=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "reference": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWvJyNWEI/s=", + "_parent": { + "$ref": "AAAAAAF5RWvJyNWC314=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RWxGx9n5fHg=", + "_parent": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWxGx9n6uSs=", + "_parent": { + "$ref": "AAAAAAF5RWxGx9n5fHg=" + }, + "reference": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RWxGx9n7A0k=", + "_parent": { + "$ref": "AAAAAAF5RWxGx9n5fHg=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RXgsE81LcLM=", + "_parent": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "name": "通过", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXgsE81Ml9Y=", + "_parent": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "reference": { + "$ref": "AAAAAAF5RWo+Icga7No=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXgsE81Ncj4=", + "_parent": { + "$ref": "AAAAAAF5RXgsE81LcLM=" + }, + "reference": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RWzzg+QnXQo=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "doCalScheduleAllCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RXS1D5dDHCY=", + "_parent": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXS1D5dEJJs=", + "_parent": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "reference": { + "$ref": "AAAAAAF5RWzzg+QnXQo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXS1D5dF2N4=", + "_parent": { + "$ref": "AAAAAAF5RXS1D5dDHCY=" + }, + "reference": { + "$ref": "AAAAAAF5RWiYh6tdXHE=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RXZT3reRJjE=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "是否是doCalScheduleAllCycle状态", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RXiiW9aJDaw=", + "_parent": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "name": "不是", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXiiW9aKkno=", + "_parent": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "reference": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RXiiW9aL3M4=", + "_parent": { + "$ref": "AAAAAAF5RXiiW9aJDaw=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RX50xeaOm84=", + "_parent": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "name": "是", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX50xeaPW6s=", + "_parent": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "reference": { + "$ref": "AAAAAAF5RXZT3reRJjE=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX50xeaQJxA=", + "_parent": { + "$ref": "AAAAAAF5RX50xeaOm84=" + }, + "reference": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RX4IzeDinbw=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "检测其他测回是否有待补测数据", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RX9EYPFbm2U=", + "_parent": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "name": "有", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX9EYPFcd3k=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "reference": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX9EYPFdtmc=", + "_parent": { + "$ref": "AAAAAAF5RX9EYPFbm2U=" + }, + "reference": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYXKoEPvmVE=", + "_parent": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "name": "无", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYXKoUPwWeY=", + "_parent": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "reference": { + "$ref": "AAAAAAF5RX4IzeDinbw=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYXKoUPxCsE=", + "_parent": { + "$ref": "AAAAAAF5RYXKoEPvmVE=" + }, + "reference": { + "$ref": "AAAAAAF5RYWBNT536bM=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RX8e8+6Tpi8=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "提示用户选择", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYA6LQaqG8I=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "name": "跳转到相应测回", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYA6LQaryvU=", + "_parent": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "reference": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYA6LQashgM=", + "_parent": { + "$ref": "AAAAAAF5RYA6LQaqG8I=" + }, + "reference": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYRxIiqJIUE=", + "_parent": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "name": "忽略或取消", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYRxIyqKuUY=", + "_parent": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "reference": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYRxIyqLN6Y=", + "_parent": { + "$ref": "AAAAAAF5RYRxIiqJIUE=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RX+92vrrsgo=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "切换测回", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RX/wMv3F6d4=", + "_parent": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX/wMv3GM64=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "reference": { + "$ref": "AAAAAAF5RX+92vrrsgo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RX/wMv3HIz8=", + "_parent": { + "$ref": "AAAAAAF5RX/wMv3F6d4=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RYWBNT536bM=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "检测其他测回是否有空数据", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYbKCEsJsiQ=", + "_parent": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "name": "有", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYbKCEsKkG0=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "reference": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYbKCEsLR+0=", + "_parent": { + "$ref": "AAAAAAF5RYbKCEsJsiQ=" + }, + "reference": { + "$ref": "AAAAAAF5RX8e8+6Tpi8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYqgkaOybww=", + "_parent": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "name": "无空测回", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYqgkaOzOcA=", + "_parent": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "reference": { + "$ref": "AAAAAAF5RYWBNT536bM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYqgkaO0Gyw=", + "_parent": { + "$ref": "AAAAAAF5RYqgkaOybww=" + }, + "reference": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RYo1sJrxVxU=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "检测其他测回合法性", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RYuGza0vDqU=", + "_parent": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "name": "发现有测回未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYuGza0wl4I=", + "_parent": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "reference": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RYuGza0xzjs=", + "_parent": { + "$ref": "AAAAAAF5RYuGza0vDqU=" + }, + "reference": { + "$ref": "AAAAAAF5QKuCwkzWMuI=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RY5M4rVOVIM=", + "_parent": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "name": "全部通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RY5M4rVPReU=", + "_parent": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "reference": { + "$ref": "AAAAAAF5RYo1sJrxVxU=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RY5M4rVQGdM=", + "_parent": { + "$ref": "AAAAAAF5RY5M4rVOVIM=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RY+P3cq56es=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "switchState2Idle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RY/lWtHqafY=", + "_parent": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RY/lW9Hrql4=", + "_parent": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "reference": { + "$ref": "AAAAAAF5RY+P3cq56es=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RY/lW9HsN84=", + "_parent": { + "$ref": "AAAAAAF5RY/lWtHqafY=" + }, + "reference": { + "$ref": "AAAAAAF5P5/CAk96MB0=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RZAQp9i7BLM=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "查找待补测数据", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RZDsue7baAw=", + "_parent": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "name": "有", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZDsue7cAPs=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "reference": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZDsue7dBLs=", + "_parent": { + "$ref": "AAAAAAF5RZDsue7baAw=" + }, + "reference": { + "$ref": "AAAAAAF5RY+P3cq56es=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RZE5JvvgNmk=", + "_parent": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "name": "无", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZE5Jvvh7eI=", + "_parent": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "reference": { + "$ref": "AAAAAAF5RZAQp9i7BLM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZE5JvviTz0=", + "_parent": { + "$ref": "AAAAAAF5RZE5JvvgNmk=" + }, + "reference": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RZEXNfhA9nA=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "查找空数据", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RZGEZgj773A=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "name": "有", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZGEZgj8gpI=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "reference": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZGEZgj9p0E=", + "_parent": { + "$ref": "AAAAAAF5RZGEZgj773A=" + }, + "reference": { + "$ref": "AAAAAAF5RY+P3cq56es=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5RZHb+g34JOw=", + "_parent": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "name": "无", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZHb+g35LNk=", + "_parent": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "reference": { + "$ref": "AAAAAAF5RZEXNfhA9nA=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5RZHb+g36Mvo=", + "_parent": { + "$ref": "AAAAAAF5RZHb+g34JOw=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5RZ6XBTi4yu4=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "doMoveBack" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5Sr6mm1dGVLo=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "doSurveyor", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5SsC4Mnft0S4=", + "_parent": { + "$ref": "AAAAAAF5Sr6mm1dGVLo=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsC4Mnfuteg=", + "_parent": { + "$ref": "AAAAAAF5SsC4Mnft0S4=" + }, + "reference": { + "$ref": "AAAAAAF5Sr6mm1dGVLo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsC4Mnfv/lw=", + "_parent": { + "$ref": "AAAAAAF5SsC4Mnft0S4=" + }, + "reference": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5Sr+CM2b/I6Q=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "检测其他测回是否有正在测量数据", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5SsGTyovTQIg=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "name": "有数据", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsGTy4vUxm0=", + "_parent": { + "$ref": "AAAAAAF5SsGTyovTQIg=" + }, + "reference": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsGTy4vVaZ0=", + "_parent": { + "$ref": "AAAAAAF5SsGTyovTQIg=" + }, + "reference": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5SsLOnqvOHTI=", + "_parent": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "name": "无数据", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsLOnqvP3jk=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvOHTI=" + }, + "reference": { + "$ref": "AAAAAAF5Sr+CM2b/I6Q=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsLOnqvQ0Oc=", + "_parent": { + "$ref": "AAAAAAF5SsLOnqvOHTI=" + }, + "reference": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5SsEjzYJ/d3I=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "提示用户是否删除数据", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5SsIvB5pTO8k=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsIvB5pUHxM=", + "_parent": { + "$ref": "AAAAAAF5SsIvB5pTO8k=" + }, + "name": "忽略or取消", + "reference": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsIvB5pVSwc=", + "_parent": { + "$ref": "AAAAAAF5SsIvB5pTO8k=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5SsLnA66XUCE=", + "_parent": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "name": "确定删除", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsLnBK6Y5d4=", + "_parent": { + "$ref": "AAAAAAF5SsLnA66XUCE=" + }, + "reference": { + "$ref": "AAAAAAF5SsEjzYJ/d3I=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsLnBK6ZnVU=", + "_parent": { + "$ref": "AAAAAAF5SsLnA66XUCE=" + }, + "reference": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5SsKfZqcx8QM=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "执行测量", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5Ssd4074UW6o=", + "_parent": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "name": "测量成功", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5Ssd41L4V+18=", + "_parent": { + "$ref": "AAAAAAF5Ssd4074UW6o=" + }, + "reference": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5Ssd41L4WIjg=", + "_parent": { + "$ref": "AAAAAAF5Ssd4074UW6o=" + }, + "reference": { + "$ref": "AAAAAAF5QJ6ahSPVJNg=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5SsfL78fSWbs=", + "_parent": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "name": "测量失败", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsfL78fTiS4=", + "_parent": { + "$ref": "AAAAAAF5SsfL78fSWbs=" + }, + "reference": { + "$ref": "AAAAAAF5SsKfZqcx8QM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsfL78fU9Fc=", + "_parent": { + "$ref": "AAAAAAF5SsfL78fSWbs=" + }, + "reference": { + "$ref": "AAAAAAF5Sseu4cD1ALY=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5SsdYcrYFUTc=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "checkReadData" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5Sseu4cD1ALY=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "SurveyorFailure" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5Sst98gwopLY=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "是否闭合", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5SsxY9BsjL0w=", + "_parent": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "name": "否", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsxY9BskgpI=", + "_parent": { + "$ref": "AAAAAAF5SsxY9BsjL0w=" + }, + "reference": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SsxY9Bsl5Tg=", + "_parent": { + "$ref": "AAAAAAF5SsxY9BsjL0w=" + }, + "reference": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5SszpXCjkGRI=", + "_parent": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "name": "是", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SszpXCjl/+8=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjkGRI=" + }, + "reference": { + "$ref": "AAAAAAF5Sst98gwopLY=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5SszpXCjmncs=", + "_parent": { + "$ref": "AAAAAAF5SszpXCjkGRI=" + }, + "reference": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5Ssw/MxbPNVc=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "checkHalfCycleZero" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5SsyaiR+Q8s8=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "执行归零检测", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5Ss0jcC4aijg=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "name": "成功", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5Ss0jcC4bSQM=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4aijg=" + }, + "reference": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5Ss0jcC4cI98=", + "_parent": { + "$ref": "AAAAAAF5Ss0jcC4aijg=" + }, + "reference": { + "$ref": "AAAAAAF5Ssw/MxbPNVc=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5Ss1sYzc1nBg=", + "_parent": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "name": "未成功", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5Ss1sYzc28DU=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc1nBg=" + }, + "reference": { + "$ref": "AAAAAAF5SsyaiR+Q8s8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5Ss1sYzc3JbA=", + "_parent": { + "$ref": "AAAAAAF5Ss1sYzc1nBg=" + }, + "reference": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5Ss1QlzKrDlo=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "isReady2CCheck", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5StBNjXaXraA=", + "_parent": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "name": "满足条件", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StBNjXaYthc=", + "_parent": { + "$ref": "AAAAAAF5StBNjXaXraA=" + }, + "reference": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StBNjXaZel4=", + "_parent": { + "$ref": "AAAAAAF5StBNjXaXraA=" + }, + "reference": { + "$ref": "AAAAAAF5P5nMrk1mLCw=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5StIhppW+/2s=", + "_parent": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "name": "不满足", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StIhppW/3D0=", + "_parent": { + "$ref": "AAAAAAF5StIhppW+/2s=" + }, + "reference": { + "$ref": "AAAAAAF5Ss1QlzKrDlo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StIhppXAozs=", + "_parent": { + "$ref": "AAAAAAF5StIhppW+/2s=" + }, + "reference": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5Ss//822MKvk=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "check2C" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5StIJ5pEQ/FY=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "doRecordClean", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5StrWhBOl298=", + "_parent": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StrWhBOmfyU=", + "_parent": { + "$ref": "AAAAAAF5StrWhBOl298=" + }, + "reference": { + "$ref": "AAAAAAF5StIJ5pEQ/FY=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StrWhBOnvuo=", + "_parent": { + "$ref": "AAAAAAF5StrWhBOl298=" + }, + "reference": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5StaqWtrE9ro=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "用户选择是否跳转到其他测回", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5StecvuuUiTw=", + "_parent": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "name": "跳转测回后补测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StecvuuVcKw=", + "_parent": { + "$ref": "AAAAAAF5StecvuuUiTw=" + }, + "reference": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5StecvuuWIOM=", + "_parent": { + "$ref": "AAAAAAF5StecvuuUiTw=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5Stg/N/byEbA=", + "_parent": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "name": "取消or忽略", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5Stg/N/bz2/4=", + "_parent": { + "$ref": "AAAAAAF5Stg/N/byEbA=" + }, + "reference": { + "$ref": "AAAAAAF5StaqWtrE9ro=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5Stg/N/b0VQA=", + "_parent": { + "$ref": "AAAAAAF5Stg/N/byEbA=" + }, + "reference": { + "$ref": "AAAAAAF5QJjLZBMJQJ8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF5Stp87A6d2HY=", + "_parent": { + "$ref": "AAAAAAFElm6BOFNpegQ=" + }, + "name": "isSingleCycleCompleted", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5Styi5Rfz3o0=", + "_parent": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "name": "完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5Styi5Rf0fJk=", + "_parent": { + "$ref": "AAAAAAF5Styi5Rfz3o0=" + }, + "reference": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5Styi5Rf1+Tk=", + "_parent": { + "$ref": "AAAAAAF5Styi5Rfz3o0=" + }, + "reference": { + "$ref": "AAAAAAF5QKE6OTfx/D4=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF5St1uUR+mHuk=", + "_parent": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "name": "未完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5St1uUR+nHko=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+mHuk=" + }, + "reference": { + "$ref": "AAAAAAF5Stp87A6d2HY=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF5St1uUR+oJAQ=", + "_parent": { + "$ref": "AAAAAAF5St1uUR+mHuk=" + }, + "reference": { + "$ref": "AAAAAAF5QMaQUG/pf+g=" + } + } + } + ] + } + ] + }, + { + "_type": "UMLProfile", + "_id": "AAAAAAFElnEzslS1AuE=", + "_parent": { + "$ref": "AAAAAAFElm5XMFNoGY0=" + }, + "name": "UMLStandardProfile", + "ownedElements": [ + { + "_type": "UMLProfileDiagram", + "_id": "AAAAAAFElnFUQFS4mT4=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "StandardProfileL2", + "ownedViews": [ + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFElnFrT1S8vVg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFElnFrT1S7Kic=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFElnFrT1S9WOE=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S8vVg=" + }, + "model": { + "$ref": "AAAAAAFElnFrT1S7Kic=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFElnFrT1S+aHM=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": -44, + "top": -16, + "width": 1, + "height": 12 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnFrT1S/1HM=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 57, + "top": 59, + "width": 81, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnFrT1TAD0M=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerChangeable": true, + "containerExtending": true, + "left": 57, + "top": 73, + "width": 81, + "height": 12, + "text": "UMLClassifier" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnFrT1TBaUI=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": -44, + "top": -16, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnFrT1TCF/Y=", + "_parent": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": -44, + "top": -16, + "width": 1, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 52, + "top": 52, + "width": 91, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFElnFrT1S/1HM=" + }, + "nameLabel": { + "$ref": "AAAAAAFElnFrT1TAD0M=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFElnFrT1TBaUI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFElnFrT1TCF/Y=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 52, + "top": 52, + "width": 91, + "height": 101, + "nameCompartment": { + "$ref": "AAAAAAFElnFrT1S9WOE=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFElnF1nFTadPw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqCEfLOas=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFElnF1nFTbplQ=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFElnF1nVTcCng=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 60, + "top": -116, + "width": 1, + "height": 12 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnF1nVTd3xg=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 213, + "top": 55, + "width": 83, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnF1nVTewJM=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "font": "Arial;12;1", + "containerChangeable": true, + "containerExtending": true, + "left": 213, + "top": 69, + "width": 83, + "height": 12, + "text": "Realization" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnF1nVTfQRQ=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 60, + "top": -116, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnF1nVTgrV8=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 60, + "top": -116, + "width": 1, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 208, + "top": 48, + "width": 93, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFElnF1nVTd3xg=" + }, + "nameLabel": { + "$ref": "AAAAAAFElnF1nVTewJM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFElnF1nVTfQRQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFElnF1nVTgrV8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFElnF1nVThfqA=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 208, + "top": 86, + "width": 93, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFElnF1nVTiFXA=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 208, + "top": 96, + "width": 93, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFElnF1nVTjasU=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "model": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 60, + "top": -116, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 208, + "top": 48, + "width": 93, + "height": 38, + "nameCompartment": { + "$ref": "AAAAAAFElnF1nFTbplQ=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFElnF1nVThfqA=" + }, + "operationCompartment": { + "$ref": "AAAAAAFElnF1nVTiFXA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqCEfLOas=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFElnF1nVTjasU=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFElnGGLFUGHnM=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFElnGGLFUFZFA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnGGLFUH+8s=", + "_parent": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "model": { + "$ref": "AAAAAAFElnGGLFUFZFA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 174, + "top": 73, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnGGLFUIOR8=", + "_parent": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "model": { + "$ref": "AAAAAAFElnGGLFUFZFA=" + }, + "visible": null, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 174, + "top": 88, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnGGLFUJv6k=", + "_parent": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "model": { + "$ref": "AAAAAAFElnGGLFUFZFA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 175, + "top": 43, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFElnGGLFUGHnM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "head": { + "$ref": "AAAAAAFElnFrT1S8vVg=" + }, + "tail": { + "$ref": "AAAAAAFElnF1nFTadPw=" + }, + "points": "208:64;142:64", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFElnGGLFUH+8s=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFElnGGLFUIOR8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFElnGGLFUJv6k=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFElnJRglVMyB8=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqCkfpKls=", + "_parent": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFElnJRglVN/RI=", + "_parent": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFElnJRglVO7ow=", + "_parent": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 104, + "top": -176, + "width": 1, + "height": 12 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnJRglVPiBM=", + "_parent": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 217, + "top": 119, + "width": 74.73593139648438, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnJRglVQT1k=", + "_parent": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "font": "Arial;12;1", + "containerChangeable": true, + "containerExtending": true, + "left": 217, + "top": 133, + "width": 74.73593139648438, + "height": 12, + "text": "Specification" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnJRglVRdk8=", + "_parent": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 104, + "top": -176, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFElnJRglVSFic=", + "_parent": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 104, + "top": -176, + "width": 1, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 212, + "top": 112, + "width": 84.73593139648438, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFElnJRglVPiBM=" + }, + "nameLabel": { + "$ref": "AAAAAAFElnJRglVQT1k=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFElnJRglVRdk8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFElnJRglVSFic=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFElnJRglVTXPE=", + "_parent": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 212, + "top": 150, + "width": 84, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFElnJRglVUe0c=", + "_parent": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 212, + "top": 160, + "width": 84, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFElnJRg1VVWNU=", + "_parent": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "model": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 104, + "top": -176, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 212, + "top": 112, + "width": 84.73593139648438, + "height": 38, + "nameCompartment": { + "$ref": "AAAAAAFElnJRglVN/RI=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFElnJRglVTXPE=" + }, + "operationCompartment": { + "$ref": "AAAAAAFElnJRglVUe0c=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqCkfpKls=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFElnJRg1VVWNU=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFElnKVuVV5hVg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFElnKVuVV4pBU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnKVuVV6VLo=", + "_parent": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "model": { + "$ref": "AAAAAAFElnKVuVV4pBU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 176, + "top": 141, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnKVuVV7m9U=", + "_parent": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "model": { + "$ref": "AAAAAAFElnKVuVV4pBU=" + }, + "visible": null, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 176, + "top": 156, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFElnKVuVV8bvU=", + "_parent": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "model": { + "$ref": "AAAAAAFElnKVuVV4pBU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 177, + "top": 111, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFElnKVuVV5hVg=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "head": { + "$ref": "AAAAAAFElnFrT1S8vVg=" + }, + "tail": { + "$ref": "AAAAAAFElnJRglVMyB8=" + }, + "points": "212:132;142:132", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFElnKVuVV6VLo=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFElnKVuVV7m9U=" + }, + "propertyLabel": { + "$ref": "AAAAAAFElnKVuVV8bvU=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFJsZbpDNpnkE=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFJsZbpTNq6XM=", + "_parent": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "model": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFJsZbpTNrbHw=", + "_parent": { + "$ref": "AAAAAAFFJsZbpTNq6XM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 561, + "top": 209, + "width": 87, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFJsZbpTNsdGc=", + "_parent": { + "$ref": "AAAAAAFFJsZbpTNq6XM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerChangeable": true, + "containerExtending": true, + "left": 561, + "top": 223, + "width": 87, + "height": 12, + "text": "UMLClass" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFJsZbpTNtikk=", + "_parent": { + "$ref": "AAAAAAFFJsZbpTNq6XM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 1500, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFJsZbpTNuOXU=", + "_parent": { + "$ref": "AAAAAAFFJsZbpTNq6XM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 1500, + "width": 1, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 556, + "top": 204, + "width": 97, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFJsZbpTNrbHw=" + }, + "nameLabel": { + "$ref": "AAAAAAFFJsZbpTNsdGc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFJsZbpTNtikk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFJsZbpTNuOXU=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerChangeable": true, + "containerExtending": true, + "left": 556, + "top": 204, + "width": 97, + "height": 305, + "nameCompartment": { + "$ref": "AAAAAAFFJsZbpTNq6XM=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwKqhJFq1z2Y=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKqhJFq2eQM=", + "_parent": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "model": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKqhJFq3hUU=", + "_parent": { + "$ref": "AAAAAAFFwKqhJFq2eQM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 57, + "top": 209, + "width": 79, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKqhJFq4Vb4=", + "_parent": { + "$ref": "AAAAAAFFwKqhJFq2eQM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 57, + "top": 223, + "width": 79, + "height": 12, + "text": "UMLArtifact" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKqhJFq5GlQ=", + "_parent": { + "$ref": "AAAAAAFFwKqhJFq2eQM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKqhJFq6Fls=", + "_parent": { + "$ref": "AAAAAAFFwKqhJFq2eQM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 52, + "top": 204, + "width": 89, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKqhJFq3hUU=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKqhJFq4Vb4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKqhJFq5GlQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKqhJFq6Fls=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 52, + "top": 204, + "width": 89, + "height": 329, + "nameCompartment": { + "$ref": "AAAAAAFFwKqhJFq2eQM=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKsvdVrTyNI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqDUglDBo=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKsvdVrUE8w=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKsvdVrVvYg=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrUE8w=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 237, + "top": 209, + "width": 119, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKsvdVrW/Dg=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrUE8w=" + }, + "font": "Arial;12;3", + "containerExtending": true, + "left": 237, + "top": 223, + "width": 119, + "height": 12, + "text": "File" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKsvdVrXXrQ=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrUE8w=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 48, + "top": -12, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKsvdVrYnv8=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrUE8w=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 48, + "top": -12, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 232, + "top": 204, + "width": 129, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKsvdVrVvYg=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKsvdVrW/Dg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKsvdVrXXrQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKsvdVrYnv8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKsvdVrZA0U=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 248, + "top": 236, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKsvdlraVvA=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 248, + "top": 236, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKsvdlrbd2U=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "model": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 32, + "top": -8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 232, + "top": 204, + "width": 129, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwKsvdVrUE8w=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKsvdVrZA0U=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKsvdlraVvA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqDUglDBo=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKsvdlrbd2U=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKtwS1r8DQQ=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqDUg7My0=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKtwS1r9YJ4=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKtwS1r+fw8=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r9YJ4=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 313, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKtwS1r/Lsw=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r9YJ4=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 189, + "top": 327, + "width": 72.51593017578125, + "height": 12, + "text": "Document" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKtwS1sAGYA=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r9YJ4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 24, + "top": 24, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKtwS1sB7y4=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r9YJ4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 24, + "top": 24, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 184, + "top": 308, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKtwS1r+fw8=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKtwS1r/Lsw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKtwS1sAGYA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKtwS1sB7y4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKtwTFsC02k=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 192, + "top": 352, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKtwTFsD5lc=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 192, + "top": 352, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKtwTFsEQlE=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "model": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 16, + "top": 16, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 184, + "top": 308, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwKtwS1r9YJ4=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKtwTFsC02k=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKtwTFsD5lc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqDUg7My0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKtwTFsEQlE=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKuBulskCVg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqDkhRFFg=", + "_parent": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKuBulsld0g=", + "_parent": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuBulsmb/s=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsld0g=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 257, + "top": 357, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuBulsnKBI=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsld0g=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 257, + "top": 371, + "width": 72.51593017578125, + "height": 12, + "text": "Executable" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuBu1soKF0=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsld0g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 96, + "top": -48, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuBu1spOXA=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsld0g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 96, + "top": -48, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 252, + "top": 352, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKuBulsmb/s=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKuBulsnKBI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKuBu1soKF0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKuBu1spOXA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKuBu1sqPhk=", + "_parent": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 284, + "top": 372, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKuBu1srnoE=", + "_parent": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 284, + "top": 372, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKuBu1ssVVg=", + "_parent": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "model": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 64, + "top": -32, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 252, + "top": 352, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwKuBulsld0g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKuBu1sqPhk=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKuBu1srnoE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqDkhRFFg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKuBu1ssVVg=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKuIMltMJw4=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqD0hnnhc=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKuIMltNJK8=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuIM1tO63M=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltNJK8=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 321, + "top": 405, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuIM1tPj60=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltNJK8=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 321, + "top": 419, + "width": 72.51593017578125, + "height": 12, + "text": "Library" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuIM1tQD7A=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltNJK8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 132, + "top": -108, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuIM1tRSSY=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltNJK8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 132, + "top": -108, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 316, + "top": 400, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKuIM1tO63M=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKuIM1tPj60=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKuIM1tQD7A=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKuIM1tRSSY=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKuIM1tSiN4=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 360, + "top": 400, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKuIM1tTPjo=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 360, + "top": 400, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKuIM1tUHbM=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "model": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 88, + "top": -72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 316, + "top": 400, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwKuIMltNJK8=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKuIM1tSiN4=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKuIM1tTPjo=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqD0hnnhc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKuIM1tUHbM=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKuS0lt0dAE=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqEEh93KM=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKuS0lt1+MM=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuS0lt2XgE=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt1+MM=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 385, + "top": 453, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuS0lt36r8=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt1+MM=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 385, + "top": 467, + "width": 72.51593017578125, + "height": 12, + "text": "Script" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuS0lt4pP4=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt1+MM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 180, + "top": -180, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKuS0lt5mi4=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt1+MM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 180, + "top": -180, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 380, + "top": 448, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKuS0lt2XgE=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKuS0lt36r8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKuS0lt4pP4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKuS0lt5mi4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKuS0lt6gjg=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 424, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKuS0lt7fo0=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 424, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKuS0lt8w2A=", + "_parent": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "model": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 120, + "top": -120, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 380, + "top": 448, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwKuS0lt1+MM=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKuS0lt6gjg=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKuS0lt7fo0=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqEEh93KM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKuS0lt8w2A=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwKueMluc5bE=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqEUiTykw=", + "_parent": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwKueMludFfk=", + "_parent": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwKueMlueAco=", + "_parent": { + "$ref": "AAAAAAFFwKueMludFfk=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 445, + "top": 501, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKueMluflfo=", + "_parent": { + "$ref": "AAAAAAFFwKueMludFfk=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 445, + "top": 515, + "width": 72.51593017578125, + "height": 12, + "text": "Source" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKueMlughos=", + "_parent": { + "$ref": "AAAAAAFFwKueMludFfk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -108, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwKueMluhfws=", + "_parent": { + "$ref": "AAAAAAFFwKueMludFfk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -108, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 496, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKueMlueAco=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwKueMluflfo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwKueMlughos=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKueMluhfws=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwKueMluihu4=", + "_parent": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 500, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwKueMlujEyo=", + "_parent": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 500, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwKueMlukJo8=", + "_parent": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "model": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 440, + "top": 496, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwKueMludFfk=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwKueMluihu4=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwKueMlujEyo=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqEUiTykw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwKueMlukJo8=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFFwKzkslvYVdw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKzkslvX4gU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzkslvZbd0=", + "_parent": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "model": { + "$ref": "AAAAAAFFwKzkslvX4gU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 258, + "top": 267, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzks1vasdU=", + "_parent": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "model": { + "$ref": "AAAAAAFFwKzkslvX4gU=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 258, + "top": 252, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzks1vby/c=", + "_parent": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "model": { + "$ref": "AAAAAAFFwKzkslvX4gU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 258, + "top": 297, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzkslvYVdw=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "tail": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "points": "216:308;216:288;300:288;300:240", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwKzkslvZbd0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKzks1vasdU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKzks1vby/c=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFFwKzsCVvpt2A=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKzsCVvo11g=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzsCVvqAUg=", + "_parent": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "model": { + "$ref": "AAAAAAFFwKzsCVvo11g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 285, + "top": 289, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzsCVvrTi8=", + "_parent": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "model": { + "$ref": "AAAAAAFFwKzsCVvo11g=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 270, + "top": 289, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzsCVvsewQ=", + "_parent": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "model": { + "$ref": "AAAAAAFFwKzsCVvo11g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 314, + "top": 290, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzsCVvpt2A=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "tail": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "points": "300:352;300:240", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwKzsCVvqAUg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKzsCVvrTi8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKzsCVvsewQ=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFFwKzxcVv6A2c=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKzxcVv56Dg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzxcVv7wpA=", + "_parent": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "model": { + "$ref": "AAAAAAFFwKzxcVv56Dg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 327, + "top": 297, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzxcVv8NxM=", + "_parent": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "model": { + "$ref": "AAAAAAFFwKzxcVv56Dg=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 327, + "top": 312, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKzxcVv9X58=", + "_parent": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "model": { + "$ref": "AAAAAAFFwKzxcVv56Dg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 328, + "top": 267, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKzxcVv6A2c=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "tail": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "points": "356:400;356:288;300:288;300:240", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwKzxcVv7wpA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKzxcVv8NxM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKzxcVv9X58=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFFwKz3OVwLl+8=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKz3OVwK9hs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz3OVwMNB4=", + "_parent": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "model": { + "$ref": "AAAAAAFFwKz3OVwK9hs=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 357, + "top": 297, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz3OVwNd3E=", + "_parent": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "model": { + "$ref": "AAAAAAFFwKz3OVwK9hs=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 357, + "top": 312, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz3OVwODiI=", + "_parent": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "model": { + "$ref": "AAAAAAFFwKz3OVwK9hs=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 358, + "top": 267, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKz3OVwLl+8=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "tail": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "points": "416:448;416:288;300:288;300:240", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwKz3OVwMNB4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKz3OVwNd3E=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKz3OVwODiI=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFFwKz9mVwcos8=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwKz9mFwbfDg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz9mVwdsGc=", + "_parent": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "model": { + "$ref": "AAAAAAFFwKz9mFwbfDg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 391, + "top": 297, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz9mVweYvs=", + "_parent": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "model": { + "$ref": "AAAAAAFFwKz9mFwbfDg=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 391, + "top": 312, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwKz9mVwfOSk=", + "_parent": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "model": { + "$ref": "AAAAAAFFwKz9mFwbfDg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 392, + "top": 267, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwKz9mVwcos8=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "tail": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "points": "484:496;484:288;300:288;300:240", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwKz9mVwdsGc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwKz9mVweYvs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwKz9mVwfOSk=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK4k1VxFxwI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK4k1VxEEpM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4k1lxGUvg=", + "_parent": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "model": { + "$ref": "AAAAAAFFwK4k1VxEEpM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 161, + "top": 333, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4k1lxHABk=", + "_parent": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "model": { + "$ref": "AAAAAAFFwK4k1VxEEpM=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 161, + "top": 348, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4k1lxIpIg=", + "_parent": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "model": { + "$ref": "AAAAAAFFwK4k1VxEEpM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 162, + "top": 303, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4k1VxFxwI=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKtwS1r8DQQ=" + }, + "points": "184:324;140:324", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK4k1lxGUvg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK4k1lxHABk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK4k1lxIpIg=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK4o4VxWQBI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK4o4VxVx00=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4o4VxXVGc=", + "_parent": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "model": { + "$ref": "AAAAAAFFwK4o4VxVx00=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 195, + "top": 378, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4o4VxYgZc=", + "_parent": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "model": { + "$ref": "AAAAAAFFwK4o4VxVx00=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 195, + "top": 393, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4o4VxZqsQ=", + "_parent": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "model": { + "$ref": "AAAAAAFFwK4o4VxVx00=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 196, + "top": 348, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4o4VxWQBI=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKuBulskCVg=" + }, + "points": "252:369;140:369", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK4o4VxXVGc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK4o4VxYgZc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK4o4VxZqsQ=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK4tiVxnpno=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK4tiVxmVJM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4tiVxoTEk=", + "_parent": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "model": { + "$ref": "AAAAAAFFwK4tiVxmVJM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 227, + "top": 429, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4tiVxpG0I=", + "_parent": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "model": { + "$ref": "AAAAAAFFwK4tiVxmVJM=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 227, + "top": 444, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK4tiVxqKIY=", + "_parent": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "model": { + "$ref": "AAAAAAFFwK4tiVxmVJM=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 228, + "top": 399, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK4tiVxnpno=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKuIMltMJw4=" + }, + "points": "316:420;140:420", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK4tiVxoTEk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK4tiVxpG0I=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK4tiVxqKIY=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK41YVx4sZw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK41YVx3Hr0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK41YVx5rZ4=", + "_parent": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "model": { + "$ref": "AAAAAAFFwK41YVx3Hr0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 259, + "top": 473, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK41YVx6mfE=", + "_parent": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "model": { + "$ref": "AAAAAAFFwK41YVx3Hr0=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 259, + "top": 488, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK41YVx7lFo=", + "_parent": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "model": { + "$ref": "AAAAAAFFwK41YVx3Hr0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 260, + "top": 443, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK41YVx4sZw=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKuS0lt0dAE=" + }, + "points": "380:464;140:464", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK41YVx5rZ4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK41YVx6mfE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK41YVx7lFo=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK47MFyJhkk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK47MFyIL/c=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK47MFyKeH8=", + "_parent": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "model": { + "$ref": "AAAAAAFFwK47MFyIL/c=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 289, + "top": 521, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK47MVyL2Gg=", + "_parent": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "model": { + "$ref": "AAAAAAFFwK47MFyIL/c=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 289, + "top": 536, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK47MVyMJyk=", + "_parent": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "model": { + "$ref": "AAAAAAFFwK47MFyIL/c=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 290, + "top": 491, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK47MFyJhkk=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKueMluc5bE=" + }, + "points": "440:512;140:512", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK47MFyKeH8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK47MVyL2Gg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK47MVyMJyk=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwK5AeFyarms=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK5AeFyZpVg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK5AeFybX8s=", + "_parent": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "model": { + "$ref": "AAAAAAFFwK5AeFyZpVg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 185, + "top": 229, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK5AeFycm2c=", + "_parent": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "model": { + "$ref": "AAAAAAFFwK5AeFyZpVg=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 185, + "top": 244, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwK5AeVydbSU=", + "_parent": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "model": { + "$ref": "AAAAAAFFwK5AeFyZpVg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 186, + "top": 199, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwK5AeFyarms=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwKqhJFq1z2Y=" + }, + "tail": { + "$ref": "AAAAAAFFwKsvdVrTyNI=" + }, + "points": "232:220;140:220", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwK5AeFybX8s=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK5AeFycm2c=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK5AeVydbSU=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwK/k1ly1mNU=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwK/k1ly00Ec=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwK/k1ly236Y=", + "_parent": { + "$ref": "AAAAAAFFwK/k1ly1mNU=" + }, + "model": { + "$ref": "AAAAAAFFwK/k1ly00Ec=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwK/k1ly3kes=", + "_parent": { + "$ref": "AAAAAAFFwK/k1ly236Y=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 385, + "top": 585, + "width": 132, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwK/k1ly4Kb0=", + "_parent": { + "$ref": "AAAAAAFFwK/k1ly236Y=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 385, + "top": 599, + "width": 132, + "height": 12, + "text": "UMLBehavioralFeature" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwK/k11y5jis=", + "_parent": { + "$ref": "AAAAAAFFwK/k1ly236Y=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 972, + "top": 60, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwK/k11y6pH4=", + "_parent": { + "$ref": "AAAAAAFFwK/k1ly236Y=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 972, + "top": 60, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 380, + "top": 580, + "width": 142, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwK/k1ly3kes=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwK/k1ly4Kb0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwK/k11y5jis=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwK/k11y6pH4=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 380, + "top": 580, + "width": 142, + "height": 101, + "nameCompartment": { + "$ref": "AAAAAAFFwK/k1ly236Y=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLBdPFzSzQk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqFkkF9pQ=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLBdPFzT/sk=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLBdPFzUtqg=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzT/sk=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 589, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLBdPFzVTVM=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzT/sk=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 603, + "width": 72.51593017578125, + "height": 12, + "text": "Destroy" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLBdPFzWXGg=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzT/sk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 120, + "top": 24, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLBdPFzX7Kw=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzT/sk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 120, + "top": 24, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 584, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLBdPFzUtqg=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLBdPFzVTVM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLBdPFzWXGg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLBdPFzX7Kw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLBdPFzYl0A=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 632, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLBdPFzZMKQ=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 632, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLBdPFzaqUA=", + "_parent": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "model": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 80, + "top": 16, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 584, + "width": 82.51593017578125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwLBdPFzT/sk=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLBdPFzYl0A=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLBdPFzZMKQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqFkkF9pQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLBdPFzaqUA=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLDMaFz6CG0=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLDMaFz5C14=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLDMaFz7zuA=", + "_parent": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "model": { + "$ref": "AAAAAAFFwLDMaFz5C14=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 349, + "top": 579, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLDMaFz8JJ4=", + "_parent": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "model": { + "$ref": "AAAAAAFFwLDMaFz5C14=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 349, + "top": 564, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLDMaFz92bU=", + "_parent": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "model": { + "$ref": "AAAAAAFFwLDMaFz5C14=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 349, + "top": 609, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLDMaFz6CG0=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwK/k1ly1mNU=" + }, + "tail": { + "$ref": "AAAAAAFFwLBdPFzSzQk=" + }, + "points": "318:600;380:600", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLDMaFz7zuA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLDMaFz8JJ4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLDMaFz92bU=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLFUbV0ScDI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqF0kiyCM=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLFUbV0TTdY=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFUbV0UvYs=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0TTdY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 209, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFUbV0V4oU=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0TTdY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 223, + "width": 72.51593017578125, + "height": 12, + "text": "Auxiliary" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFUbV0WLEA=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0TTdY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -336, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFUbV0XEPg=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0TTdY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -336, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 204, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLFUbV0UvYs=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLFUbV0V4oU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLFUbV0WLEA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLFUbV0XEPg=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLFUbV0YxWc=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 128, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLFUbV0Z3Xk=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 128, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLFUbV0aLJo=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "model": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -40, + "top": -224, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 204, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLFUbV0TTdY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLFUbV0YxWc=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLFUbV0Z3Xk=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqF0kiyCM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLFUbV0aLJo=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLFu9F06sWk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqGEk49nc=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLFu9F07mo0=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFu9F08FIY=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F07mo0=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 261, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFu9F09Ig0=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F07mo0=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 275, + "width": 72.51593017578125, + "height": 12, + "text": "Focus" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFu9F0+sYU=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F07mo0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -420, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLFu9F0/2cA=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F07mo0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -420, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 256, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLFu9F08FIY=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLFu9F09Ig0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLFu9F0+sYU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLFu9F0/2cA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLFu9F1A690=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 152, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLFu9F1BAsU=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 152, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLFu9F1CLR8=", + "_parent": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "model": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -40, + "top": -280, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 256, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLFu9F07mo0=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLFu9F1A690=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLFu9F1BAsU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqGEk49nc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLFu9F1CLR8=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLF4tF1iftI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqGUlOO9I=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLF4tF1jr/w=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF4tF1kg2Y=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1jr/w=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 313, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF4tF1la4E=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1jr/w=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 327, + "width": 72.51593017578125, + "height": 12, + "text": "Metaclass" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF4tF1mW9o=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1jr/w=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -480, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF4tF1ngPk=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1jr/w=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -480, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 308, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLF4tF1kg2Y=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLF4tF1la4E=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLF4tF1mW9o=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLF4tF1ngPk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLF4tF1oP5U=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 184, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLF4tF1pEYI=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 700, + "top": 184, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLF4tF1qaMM=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "model": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -40, + "top": -320, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 308, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLF4tF1jr/w=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLF4tF1oP5U=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLF4tF1pEYI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqGUlOO9I=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLF4tF1qaMM=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLF/G12KFPg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqGUlk1Tc=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLF/G12LESY=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF/G12MFWs=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12LESY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 365, + "width": 121, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF/G12Nq6M=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12LESY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 379, + "width": 121, + "height": 12, + "text": "ImplementationClass" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF/G12OWK0=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12LESY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -564, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLF/G12PipY=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12LESY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -564, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 360, + "width": 131, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLF/G12MFWs=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLF/G12Nq6M=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLF/G12OWK0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLF/G12PipY=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLF/G12QJs8=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 208, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLF/G12Rf8c=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 208, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLF/HF2Sm8E=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "model": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -376, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 360, + "width": 131, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLF/G12LESY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLF/G12QJs8=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLF/G12Rf8c=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqGUlk1Tc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLF/HF2Sm8E=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLGEPF2y6SI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqHEl6Zbo=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLGEPF2zyUI=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGEPF20OuI=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2zyUI=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 421, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGEPF21TcM=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2zyUI=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 435, + "width": 72.51593017578125, + "height": 12, + "text": "Type" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGEPF22f/8=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2zyUI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -624, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGEPF23oz0=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2zyUI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -624, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 416, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLGEPF20OuI=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLGEPF21TcM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLGEPF22f/8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLGEPF23oz0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLGEPF24D5Y=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 244, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLGEPF252Tg=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 244, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLGEPF26r38=", + "_parent": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "model": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -416, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 416, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLGEPF2zyUI=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLGEPF24D5Y=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLGEPF252Tg=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqHEl6Zbo=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLGEPF26r38=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLGI813a/Lo=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqHEmQAJ4=", + "_parent": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLGI813bmDw=", + "_parent": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGI9F3c6dc=", + "_parent": { + "$ref": "AAAAAAFFwLGI813bmDw=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 477, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGI9F3dgjo=", + "_parent": { + "$ref": "AAAAAAFFwLGI813bmDw=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 491, + "width": 72.51593017578125, + "height": 12, + "text": "Utility" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGI9F3eWQw=", + "_parent": { + "$ref": "AAAAAAFFwLGI813bmDw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -672, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLGI9F3fVUI=", + "_parent": { + "$ref": "AAAAAAFFwLGI813bmDw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -672, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 472, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLGI9F3c6dc=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLGI9F3dgjo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLGI9F3eWQw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLGI9F3fVUI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLGI9F3g9+w=", + "_parent": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 284, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLGI9F3hmIE=", + "_parent": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 704, + "top": 284, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLGI9F3i+8k=", + "_parent": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "model": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -448, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 472, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLGI813bmDw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLGI9F3g9+w=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLGI9F3hmIE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqHEmQAJ4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLGI9F3i+8k=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLNej158NLk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLNej157D6Y=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNej1590I0=", + "_parent": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "model": { + "$ref": "AAAAAAFFwLNej157D6Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 233, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNej15+8jc=", + "_parent": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "model": { + "$ref": "AAAAAAFFwLNej157D6Y=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 248, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNej15/BRY=", + "_parent": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "model": { + "$ref": "AAAAAAFFwLNej157D6Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 203, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNej158NLk=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLFUbV0ScDI=" + }, + "points": "720:224;652:224", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLNej1590I0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLNej15+8jc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLNej15/BRY=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLNkZ16NQ/Q=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLNkZ16Mp7Y=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNkZ16OhBQ=", + "_parent": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "model": { + "$ref": "AAAAAAFFwLNkZ16Mp7Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 281, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNkZ16PBtY=", + "_parent": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "model": { + "$ref": "AAAAAAFFwLNkZ16Mp7Y=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 296, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNkZ16QvLQ=", + "_parent": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "model": { + "$ref": "AAAAAAFFwLNkZ16Mp7Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 251, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNkZ16NQ/Q=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLFu9F06sWk=" + }, + "points": "720:272;652:272", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLNkZ16OhBQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLNkZ16PBtY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLNkZ16QvLQ=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLNn916eDZQ=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLNn916d4Yc=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNn916fvYQ=", + "_parent": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "model": { + "$ref": "AAAAAAFFwLNn916d4Yc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 333, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNn916guUU=", + "_parent": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "model": { + "$ref": "AAAAAAFFwLNn916d4Yc=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 348, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNn916hjhM=", + "_parent": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "model": { + "$ref": "AAAAAAFFwLNn916d4Yc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 303, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNn916eDZQ=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLF4tF1iftI=" + }, + "points": "720:324;652:324", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLNn916fvYQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLNn916guUU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLNn916hjhM=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLNr116vKpE=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLNr116u93k=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNr116weUM=", + "_parent": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "model": { + "$ref": "AAAAAAFFwLNr116u93k=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 385, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNr116xjvo=", + "_parent": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "model": { + "$ref": "AAAAAAFFwLNr116u93k=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 400, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNr116yGN0=", + "_parent": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "model": { + "$ref": "AAAAAAFFwLNr116u93k=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 355, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNr116vKpE=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLF/G12KFPg=" + }, + "points": "720:376;652:376", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLNr116weUM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLNr116xjvo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLNr116yGN0=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLNvdl7AF7U=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLNvdl6/WJI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNvd17Byl0=", + "_parent": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "model": { + "$ref": "AAAAAAFFwLNvdl6/WJI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 442, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNvd17Cmyo=", + "_parent": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "model": { + "$ref": "AAAAAAFFwLNvdl6/WJI=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 457, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLNvd17DduQ=", + "_parent": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "model": { + "$ref": "AAAAAAFFwLNvdl6/WJI=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 412, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLNvdl7AF7U=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLGEPF2y6SI=" + }, + "points": "720:433;652:433", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLNvd17Byl0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLNvd17Cmyo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLNvd17DduQ=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLN0fl7RscA=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLN0fl7QL9o=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLN0fl7SzeE=", + "_parent": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "model": { + "$ref": "AAAAAAFFwLN0fl7QL9o=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 498, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLN0fl7Tq3c=", + "_parent": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "model": { + "$ref": "AAAAAAFFwLN0fl7QL9o=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 685, + "top": 513, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLN0f17UptI=", + "_parent": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "model": { + "$ref": "AAAAAAFFwLN0fl7QL9o=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 686, + "top": 468, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLN0fl7RscA=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFJsZbpDNpnkE=" + }, + "tail": { + "$ref": "AAAAAAFFwLGI813a/Lo=" + }, + "points": "720:489;652:489", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLN0fl7SzeE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLN0fl7Tq3c=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLN0f17UptI=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwLRECl7stC8=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLRECl7tsQE=", + "_parent": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "model": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLRECl7u5vE=", + "_parent": { + "$ref": "AAAAAAFFwLRECl7tsQE=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 561, + "top": 545, + "width": 92.85594177246094, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLRECl7vrCk=", + "_parent": { + "$ref": "AAAAAAFFwLRECl7tsQE=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 561, + "top": 559, + "width": 92.85594177246094, + "height": 12, + "text": "UMLComponent" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLRECl7wqHs=", + "_parent": { + "$ref": "AAAAAAFFwLRECl7tsQE=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "top": 504, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLRECl7xJrI=", + "_parent": { + "$ref": "AAAAAAFFwLRECl7tsQE=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "top": 504, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 540, + "width": 102.85594177246094, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLRECl7u5vE=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLRECl7vrCk=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLRECl7wqHs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLRECl7xJrI=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 540, + "width": 102.85594177246094, + "height": 261, + "nameCompartment": { + "$ref": "AAAAAAFFwLRECl7tsQE=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLR8CV8I99Y=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqH0nfZIU=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLR8CV8JFWY=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLR8CV8Knxc=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8JFWY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 549, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLR8CV8LWIw=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8JFWY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 563, + "width": 72.51593017578125, + "height": 12, + "text": "Entity" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLR8CV8Mvqc=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8JFWY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 504, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLR8CV8NdIc=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8JFWY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 504, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 544, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLR8CV8Knxc=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLR8CV8LWIw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLR8CV8Mvqc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLR8CV8NdIc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLR8CV8OpVY=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 748, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLR8CV8PW8k=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 748, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLR8Cl8QCTM=", + "_parent": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "model": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 336, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 544, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLR8CV8JFWY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLR8CV8OpVY=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLR8CV8PW8k=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqH0nfZIU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLR8Cl8QCTM=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLSByF8w+gI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqIEn1Irc=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLSByF8x/Yc=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSByF8yMLo=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8x/Yc=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 597, + "width": 88.67578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSByF8zspI=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8x/Yc=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 611, + "width": 88.67578125, + "height": 12, + "text": "Implementation" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSByF80AnU=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8x/Yc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 420, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSByF81b24=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8x/Yc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 420, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 592, + "width": 98.67578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLSByF8yMLo=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLSByF8zspI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLSByF80AnU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLSByF81b24=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLSByF82e10=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 768, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLSByF83aE4=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 768, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLSByF84G88=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "model": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -8, + "top": 280, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 592, + "width": 98.67578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLSByF8x/Yc=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLSByF82e10=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLSByF83aE4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqIEn1Irc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLSByF84G88=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLSIN19Ytdk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqIUoLdrY=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLSIN19ZQ0U=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSIOF9a8kE=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19ZQ0U=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 653, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSIOF9bYBg=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19ZQ0U=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 667, + "width": 72.51593017578125, + "height": 12, + "text": "Process" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSIOF9cqZQ=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19ZQ0U=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 348, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSIOF9dI5U=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19ZQ0U=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 348, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 648, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLSIOF9a8kE=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLSIOF9bYBg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLSIOF9cqZQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLSIOF9dI5U=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLSIOF9ekq0=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 800, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLSIOF9fibc=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 800, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLSIOF9gUN0=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "model": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -8, + "top": 232, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 648, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLSIN19ZQ0U=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLSIOF9ekq0=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLSIOF9fibc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqIUoLdrY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLSIOF9gUN0=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLSO/1+AoeQ=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqIkohl1g=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLSO/1+BWGA=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSO/1+CG1s=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+BWGA=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 709, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSO/1+DoUc=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+BWGA=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 723, + "width": 72.51593017578125, + "height": 12, + "text": "Service" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSPAF+EVIo=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+BWGA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 312, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSPAF+FZR8=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+BWGA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "top": 312, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 704, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLSO/1+CG1s=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLSO/1+DoUc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLSPAF+EVIo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLSPAF+FZR8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLSPAF+GnaI=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 844, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLSPAF+Ho/s=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 716, + "top": 844, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLSPAF+I3E8=", + "_parent": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "model": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -8, + "top": 208, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 704, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLSO/1+BWGA=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLSPAF+GnaI=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLSPAF+Ho/s=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqIkohl1g=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLSPAF+I3E8=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLSXP1+o0Kw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqIko3HYE=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLSXP1+peko=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSXP1+qR3g=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+peko=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 725, + "top": 765, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSXP1+rnfg=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+peko=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 725, + "top": 779, + "width": 72.51593017578125, + "height": 12, + "text": "Subsystem" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSXP1+sqCM=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+peko=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 252, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLSXP1+t4Mc=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+peko=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 252, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 760, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLSXP1+qR3g=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLSXP1+rnfg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLSXP1+sqCM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLSXP1+t4Mc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLSXP1+uKrA=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 880, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLSXP1+vdxM=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 880, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLSXP1+woFc=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "model": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": 168, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 720, + "top": 760, + "width": 82.51593017578125, + "height": 36, + "nameCompartment": { + "$ref": "AAAAAAFFwLSXP1+peko=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLSXP1+uKrA=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLSXP1+vdxM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqIko3HYE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLSXP1+woFc=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLV9gV/Ybio=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLV9gV/Xhk4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLV9gV/Z8CU=", + "_parent": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "model": { + "$ref": "AAAAAAFFwLV9gV/Xhk4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 569, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLV9gl/a23I=", + "_parent": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "model": { + "$ref": "AAAAAAFFwLV9gV/Xhk4=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 584, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLV9gl/b3BU=", + "_parent": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "model": { + "$ref": "AAAAAAFFwLV9gV/Xhk4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 539, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLV9gV/Ybio=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "tail": { + "$ref": "AAAAAAFFwLR8CV8I99Y=" + }, + "points": "720:560;658:560", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLV9gV/Z8CU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLV9gl/a23I=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLV9gl/b3BU=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLWA0V/pWEg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLWA0V/olVk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWA0V/q2AI=", + "_parent": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "model": { + "$ref": "AAAAAAFFwLWA0V/olVk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 621, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWA0V/rrYc=", + "_parent": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "model": { + "$ref": "AAAAAAFFwLWA0V/olVk=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 636, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWA0V/spgM=", + "_parent": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "model": { + "$ref": "AAAAAAFFwLWA0V/olVk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 591, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWA0V/pWEg=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "tail": { + "$ref": "AAAAAAFFwLSByF8w+gI=" + }, + "points": "720:612;658:612", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLWA0V/q2AI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLWA0V/rrYc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLWA0V/spgM=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLWEUV/6d1E=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLWEUV/5Qq4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWEUV/78Ig=", + "_parent": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "model": { + "$ref": "AAAAAAFFwLWEUV/5Qq4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 677, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWEUV/8eIM=", + "_parent": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "model": { + "$ref": "AAAAAAFFwLWEUV/5Qq4=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 692, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWEUV/9T0A=", + "_parent": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "model": { + "$ref": "AAAAAAFFwLWEUV/5Qq4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 647, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWEUV/6d1E=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "tail": { + "$ref": "AAAAAAFFwLSIN19Ytdk=" + }, + "points": "720:668;658:668", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLWEUV/78Ig=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLWEUV/8eIM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLWEUV/9T0A=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLWIQWALE8M=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLWIQWAKKPo=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWIQWAMDo8=", + "_parent": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "model": { + "$ref": "AAAAAAFFwLWIQWAKKPo=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 737, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWIQWANo/A=", + "_parent": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "model": { + "$ref": "AAAAAAFFwLWIQWAKKPo=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 752, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWIQWAO6qA=", + "_parent": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "model": { + "$ref": "AAAAAAFFwLWIQWAKKPo=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 707, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWIQWALE8M=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "tail": { + "$ref": "AAAAAAFFwLSO/1+AoeQ=" + }, + "points": "720:728;658:728", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLWIQWAMDo8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLWIQWANo/A=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLWIQWAO6qA=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLWMgWAcaQw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwLWMgWAb2Sk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWMgWAd1rc=", + "_parent": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "model": { + "$ref": "AAAAAAFFwLWMgWAb2Sk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 789, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWMgWAeZ8k=", + "_parent": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "model": { + "$ref": "AAAAAAFFwLWMgWAb2Sk=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 688, + "top": 804, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLWMgWAfxqc=", + "_parent": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "model": { + "$ref": "AAAAAAFFwLWMgWAb2Sk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 759, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLWMgWAcaQw=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLRECl7stC8=" + }, + "tail": { + "$ref": "AAAAAAFFwLSXP1+o0Kw=" + }, + "points": "720:780;658:780", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLWMgWAd1rc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLWMgWAeZ8k=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLWMgWAfxqc=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwL2WeWA5NQI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL2WeGA460g=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL2WeWA62bI=", + "_parent": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "model": { + "$ref": "AAAAAAFFwL2WeGA460g=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL2WeWA7mnk=", + "_parent": { + "$ref": "AAAAAAFFwL2WeWA62bI=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 61, + "top": 649, + "width": 98, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL2WeWA8/Wk=", + "_parent": { + "$ref": "AAAAAAFFwL2WeWA62bI=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 61, + "top": 663, + "width": 98, + "height": 12, + "text": "UMLDependency" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL2WeWA9NaM=", + "_parent": { + "$ref": "AAAAAAFFwL2WeWA62bI=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "top": 144, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL2WeWA+CiM=", + "_parent": { + "$ref": "AAAAAAFFwL2WeWA62bI=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "top": 144, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 56, + "top": 644, + "width": 108, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL2WeWA7mnk=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL2WeWA8/Wk=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL2WeWA9NaM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL2WeWA+CiM=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 56, + "top": 644, + "width": 108, + "height": 277, + "nameCompartment": { + "$ref": "AAAAAAFFwL2WeWA62bI=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwL4D0mBZIkY=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqJkp/rUc=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL4D0mBaqmw=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4D0mBbBNE=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBaqmw=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 649, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4D0mBc7go=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBaqmw=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 663, + "width": 69.380859375, + "height": 12, + "text": "Create" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4D02Bd3+g=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBaqmw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -48, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4D02BeWA8=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBaqmw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -48, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 644, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL4D0mBbBNE=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL4D0mBc7go=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL4D02Bd3+g=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL4D02BeWA8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwL4D02Bf0q0=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 664, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwL4D02BgYs8=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 664, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwL4D02BhsHw=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "model": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -32, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 644, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwL4D0mBaqmw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwL4D02Bf0q0=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwL4D02BgYs8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqJkp/rUc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwL4D02BhsHw=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwL4h4WCCAAY=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqJ0qVBvA=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL4h4WCD82Y=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4h4mCE1YI=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCD82Y=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 713, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4h4mCFbHY=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCD82Y=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 727, + "width": 69.380859375, + "height": 12, + "text": "Call" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4h4mCG+Bo=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCD82Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -108, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL4h4mCHhD8=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCD82Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -108, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 708, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL4h4mCE1YI=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL4h4mCFbHY=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL4h4mCG+Bo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL4h4mCHhD8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwL4h4mCIEqs=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 708, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwL4h4mCJktQ=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 708, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwL4h4mCKdqI=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "model": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 708, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwL4h4WCD82Y=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwL4h4mCIEqs=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwL4h4mCJktQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqJ0qVBvA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwL4h4mCKdqI=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwL45WWCr3cU=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqJ0qrDxY=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL45WWCsDkc=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL45WWCtTBI=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCsDkc=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 769, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL45WWCuTW0=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCsDkc=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 783, + "width": 69.380859375, + "height": 12, + "text": "Instantiate" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL45WWCv18Q=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCsDkc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -192, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL45WWCwZzE=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCsDkc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -192, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 764, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL45WWCtTBI=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL45WWCuTW0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL45WWCv18Q=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL45WWCwZzE=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwL45WWCxsuk=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 736, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwL45WmCy+mU=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 736, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwL45WmCzW1Y=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "model": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -128, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 764, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwL45WWCsDkc=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwL45WWCxsuk=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwL45WmCy+mU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqJ0qrDxY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwL45WmCzW1Y=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwL5hQGDUxa0=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqKErBHOc=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL5hQGDVSBg=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL5hQGDWrwI=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDVSBg=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 825, + "width": 82.013671875, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL5hQGDXPFU=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDVSBg=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 839, + "width": 82.013671875, + "height": 12, + "text": "Responsibility" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL5hQGDYpi0=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDVSBg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -252, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL5hQGDZAt8=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDVSBg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -252, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 820, + "width": 92.013671875, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL5hQGDWrwI=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL5hQGDXPFU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL5hQGDYpi0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL5hQGDZAt8=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwL5hQGDa1nY=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 772, + "width": 91, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwL5hQGDbixI=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 220, + "top": 772, + "width": 91, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwL5hQGDcuS4=", + "_parent": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "model": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -32, + "top": -168, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 820, + "width": 92.013671875, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwL5hQGDVSBg=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwL5hQGDa1nY=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwL5hQGDbixI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqKErBHOc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwL5hQGDcuS4=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwL7KdWEqew0=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqKErXxgY=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwL7KdWEr60A=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwL7KdWEspPc=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEr60A=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 241, + "top": 881, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL7KdWEt7g0=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEr60A=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 241, + "top": 895, + "width": 69.380859375, + "height": 12, + "text": "Send" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL7KdWEum1Q=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEr60A=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -324, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwL7KdWEv3Yk=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEr60A=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -60, + "top": -324, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 876, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL7KdWEspPc=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwL7KdWEt7g0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwL7KdWEum1Q=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL7KdWEv3Yk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwL7KdWEwzHc=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 216, + "top": 804, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwL7KdWExRWs=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 216, + "top": 804, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwL7KdWEyL0Q=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "model": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -40, + "top": -216, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 236, + "top": 876, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwL7KdWEr60A=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwL7KdWEwzHc=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwL7KdWExRWs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqKErXxgY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwL7KdWEyL0Q=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+LCGFgCjw=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+LCGFfPQs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+LCGFhp5w=", + "_parent": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "model": { + "$ref": "AAAAAAFFwL+LCGFfPQs=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 347, + "top": 634, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+LCGFihK4=", + "_parent": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "model": { + "$ref": "AAAAAAFFwL+LCGFfPQs=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 347, + "top": 619, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+LCGFjcmE=", + "_parent": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "model": { + "$ref": "AAAAAAFFwL+LCGFfPQs=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 347, + "top": 664, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+LCGFgCjw=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwK/k1ly1mNU=" + }, + "tail": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "points": "314:655;380:655", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+LCGFhp5w=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+LCGFihK4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+LCGFjcmE=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+O8GFxUF4=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+O8GFwbog=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+O8GFyCzY=", + "_parent": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "model": { + "$ref": "AAAAAAFFwL+O8GFwbog=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 677, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+O8GFzT+A=", + "_parent": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "model": { + "$ref": "AAAAAAFFwL+O8GFwbog=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 692, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+O8GF0qhg=", + "_parent": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "model": { + "$ref": "AAAAAAFFwL+O8GFwbog=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 199, + "top": 647, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+O8GFxUF4=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "tail": { + "$ref": "AAAAAAFFwL4D0mBZIkY=" + }, + "points": "236:668;163:668", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+O8GFyCzY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+O8GFzT+A=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+O8GF0qhg=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+SkWGC/a4=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+SkWGBCOg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+SkWGDbeA=", + "_parent": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "model": { + "$ref": "AAAAAAFFwL+SkWGBCOg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 731, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+SkWGEkxM=", + "_parent": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "model": { + "$ref": "AAAAAAFFwL+SkWGBCOg=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 746, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+SkWGFVnU=", + "_parent": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "model": { + "$ref": "AAAAAAFFwL+SkWGBCOg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 199, + "top": 701, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+SkWGC/a4=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "tail": { + "$ref": "AAAAAAFFwL4h4WCCAAY=" + }, + "points": "236:722;163:722", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+SkWGDbeA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+SkWGEkxM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+SkWGFVnU=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+WL2GTesQ=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+WL2GScgY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+WL2GUDZ4=", + "_parent": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "model": { + "$ref": "AAAAAAFFwL+WL2GScgY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 797, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+WL2GVfH8=", + "_parent": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "model": { + "$ref": "AAAAAAFFwL+WL2GScgY=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 812, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+WL2GW4Ys=", + "_parent": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "model": { + "$ref": "AAAAAAFFwL+WL2GScgY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 199, + "top": 767, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+WL2GTesQ=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "tail": { + "$ref": "AAAAAAFFwL45WWCr3cU=" + }, + "points": "236:788;163:788", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+WL2GUDZ4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+WL2GVfH8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+WL2GW4Ys=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+Z72GkT5Y=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+Z72GjzGw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+Z72GllyU=", + "_parent": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "model": { + "$ref": "AAAAAAFFwL+Z72GjzGw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 854, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+Z72Gm6K8=", + "_parent": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "model": { + "$ref": "AAAAAAFFwL+Z72GjzGw=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 869, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+Z72GnawI=", + "_parent": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "model": { + "$ref": "AAAAAAFFwL+Z72GjzGw=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 199, + "top": 824, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+Z72GkT5Y=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "tail": { + "$ref": "AAAAAAFFwL5hQGDUxa0=" + }, + "points": "236:845;163:845", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+Z72GllyU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+Z72Gm6K8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+Z72GnawI=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwL+eh2G1gXM=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwL+eh2G01aU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+eh2G2oXg=", + "_parent": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "model": { + "$ref": "AAAAAAFFwL+eh2G01aU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 910, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+eh2G3GpE=", + "_parent": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "model": { + "$ref": "AAAAAAFFwL+eh2G01aU=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 198, + "top": 925, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwL+eh2G4woY=", + "_parent": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "model": { + "$ref": "AAAAAAFFwL+eh2G01aU=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 199, + "top": 880, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwL+eh2G1gXM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwL2WeWA5NQI=" + }, + "tail": { + "$ref": "AAAAAAFFwL7KdWEqew0=" + }, + "points": "236:901;163:901", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwL+eh2G2oXg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwL+eh2G3GpE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwL+eh2G4woY=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwMFq1GHZe+E=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMFq1GHYSKM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMFq1GHa5CM=", + "_parent": { + "$ref": "AAAAAAFFwMFq1GHZe+E=" + }, + "model": { + "$ref": "AAAAAAFFwMFq1GHYSKM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMFq1GHbxIU=", + "_parent": { + "$ref": "AAAAAAFFwMFq1GHa5CM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 561, + "top": 33, + "width": 93, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMFq1GHc3zA=", + "_parent": { + "$ref": "AAAAAAFFwMFq1GHa5CM=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 561, + "top": 47, + "width": 93, + "height": 12, + "text": "UMLAbstraction" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMFq1GHdTFI=", + "_parent": { + "$ref": "AAAAAAFFwMFq1GHa5CM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMFq1GHeicg=", + "_parent": { + "$ref": "AAAAAAFFwMFq1GHa5CM=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -12, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 28, + "width": 103, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMFq1GHbxIU=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMFq1GHc3zA=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMFq1GHdTFI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMFq1GHeicg=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 28, + "width": 103, + "height": 153, + "nameCompartment": { + "$ref": "AAAAAAFFwMFq1GHa5CM=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwMGle2H29zI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqKksmed8=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMGle2H3I+8=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGle2H4B8s=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H3I+8=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 745, + "top": 29, + "width": 110.396484375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGle2H5FWo=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H3I+8=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 745, + "top": 43, + "width": 110.396484375, + "height": 12, + "text": "Derive" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGle2H6wQw=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H3I+8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 252, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGle2H7ifs=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H3I+8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 252, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 24, + "width": 120.396484375, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMGle2H4B8s=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMGle2H5FWo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMGle2H6wQw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMGle2H7ifs=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwMGle2H8ZWU=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFFwMJPAWJ40Vg=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H8ZWU=" + }, + "model": { + "$ref": "AAAAAAFFwMJO92J1Y/s=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 745, + "top": 65, + "width": 110.396484375, + "height": 12, + "text": "+computation: String", + "horizontalAlignment": 0 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 60, + "width": 127.16787719726562, + "height": 22 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwMGle2H9VL8=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 824, + "top": 60, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwMGle2H+hpQ=", + "_parent": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "model": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 168, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 24, + "width": 120.396484375, + "height": 58, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwMGle2H3I+8=" + }, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwMGle2H8ZWU=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwMGle2H9VL8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqKksmed8=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwMGle2H+hpQ=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwMGo6mIepMc=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqK0s9CwU=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMGo6mIfS5g=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGo6mIgcys=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIfS5g=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 745, + "top": 101, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGo6mIha40=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIfS5g=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 745, + "top": 115, + "width": 69.380859375, + "height": 12, + "text": "Refine" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGo6mIiGvE=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIfS5g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 276, + "top": 120, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGo6mIjVCs=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIfS5g=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 276, + "top": 120, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 96, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMGo6mIgcys=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMGo6mIha40=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMGo6mIiGvE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMGo6mIjVCs=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwMGo6mIkY0Y=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 832, + "top": 172, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwMGo6mIlYhc=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 832, + "top": 172, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwMGo6mImbZE=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "model": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 184, + "top": 80, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 96, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwMGo6mIfS5g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwMGo6mIkY0Y=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwMGo6mIlYhc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqK0s9CwU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwMGo6mImbZE=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwMGrimJGJ0s=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqK0tTuyw=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMGrimJHZ7Y=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGrimJIfxU=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJHZ7Y=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 745, + "top": 153, + "width": 69.380859375, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGrimJJ7uc=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJHZ7Y=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 745, + "top": 167, + "width": 69.380859375, + "height": 12, + "text": "Trace" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGrimJKI9M=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJHZ7Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 324, + "top": 168, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMGrimJL3ag=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJHZ7Y=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 324, + "top": 168, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 148, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMGrimJIfxU=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMGrimJJ7uc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMGrimJKI9M=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMGrimJL3ag=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwMGrimJMCIQ=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 848, + "top": 240, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwMGrimJNPbE=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 848, + "top": 240, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwMGrimJOkXc=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "model": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 216, + "top": 112, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 740, + "top": 148, + "width": 79.380859375, + "height": 36, + "autoResize": true, + "nameCompartment": { + "$ref": "AAAAAAFFwMGrimJHZ7Y=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwMGrimJMCIQ=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwMGrimJNPbE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqK0tTuyw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwMGrimJOkXc=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwMLTm2KEAI0=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMLTmmKDF1M=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLTm2KFRRg=", + "_parent": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "model": { + "$ref": "AAAAAAFFwMLTmmKDF1M=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 61, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLTm2KGrkQ=", + "_parent": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "model": { + "$ref": "AAAAAAFFwMLTmmKDF1M=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 76, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLTm2KHZTE=", + "_parent": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "model": { + "$ref": "AAAAAAFFwMLTmmKDF1M=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 699, + "top": 31, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLTm2KEAI0=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwMFq1GHZe+E=" + }, + "tail": { + "$ref": "AAAAAAFFwMGle2H29zI=" + }, + "points": "740:52;658:52", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwMLTm2KFRRg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMLTm2KGrkQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMLTm2KHZTE=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwMLXQmKVDuM=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMLXQmKUyu0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLXQmKW+3c=", + "_parent": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "model": { + "$ref": "AAAAAAFFwMLXQmKUyu0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 121, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLXQmKXpUQ=", + "_parent": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "model": { + "$ref": "AAAAAAFFwMLXQmKUyu0=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 136, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLXQmKYWOg=", + "_parent": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "model": { + "$ref": "AAAAAAFFwMLXQmKUyu0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 699, + "top": 91, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLXQmKVDuM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwMFq1GHZe+E=" + }, + "tail": { + "$ref": "AAAAAAFFwMGo6mIepMc=" + }, + "points": "740:112;658:112", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwMLXQmKW+3c=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMLXQmKXpUQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMLXQmKYWOg=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwMLbmmKmAvI=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMLbmmKloGE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLbmmKnMuM=", + "_parent": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "model": { + "$ref": "AAAAAAFFwMLbmmKloGE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 169, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLbmmKonTw=", + "_parent": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "model": { + "$ref": "AAAAAAFFwMLbmmKloGE=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 698, + "top": 184, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMLbmmKpbLQ=", + "_parent": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "model": { + "$ref": "AAAAAAFFwMLbmmKloGE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 699, + "top": 139, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMLbmmKmAvI=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwMFq1GHZe+E=" + }, + "tail": { + "$ref": "AAAAAAFFwMGrimJGJ0s=" + }, + "points": "740:160;658:160", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwMLbmmKnMuM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMLbmmKonTw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMLbmmKpbLQ=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwMYNEWK8jeA=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMYNEWK7ItA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMYNEWK9Wb8=", + "_parent": { + "$ref": "AAAAAAFFwMYNEWK8jeA=" + }, + "model": { + "$ref": "AAAAAAFFwMYNEWK7ItA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMYNEWK++fU=", + "_parent": { + "$ref": "AAAAAAFFwMYNEWK9Wb8=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 561, + "top": 833, + "width": 91, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMYNEWK/PY8=", + "_parent": { + "$ref": "AAAAAAFFwMYNEWK9Wb8=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 561, + "top": 847, + "width": 91, + "height": 12, + "text": "UMLPackage" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMYNEWLAHjA=", + "_parent": { + "$ref": "AAAAAAFFwMYNEWK9Wb8=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMYNEWLBm9I=", + "_parent": { + "$ref": "AAAAAAFFwMYNEWK9Wb8=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 828, + "width": 101, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMYNEWK++fU=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMYNEWK/PY8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMYNEWLAHjA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMYNEWLBm9I=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 556, + "top": 828, + "width": 101, + "height": 101, + "nameCompartment": { + "$ref": "AAAAAAFFwMYNEWK9Wb8=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwMdnrWLZAY8=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqLUuNRhM=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMdnrWLaXkY=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMdnrmLbib0=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLaXkY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 729, + "top": 837, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMdnrmLclU4=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLaXkY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 729, + "top": 851, + "width": 72.51593017578125, + "height": 12, + "text": "Framework" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMdnrmLdBNU=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLaXkY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMdnrmLeF4I=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLaXkY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 832, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMdnrmLbib0=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMdnrmLclU4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMdnrmLdBNU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMdnrmLeF4I=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwMdnrmLf950=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 868, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwMdnrmLgzek=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 878, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwMdnrmLhmpQ=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "model": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 832, + "width": 82.51593017578125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwMdnrWLaXkY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwMdnrmLf950=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwMdnrmLgzek=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqLUuNRhM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwMdnrmLhmpQ=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwMeIHGMCTCk=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqLUujT3E=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwMeIHGMDiPY=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwMeIHGMEN4g=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMDiPY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 729, + "top": 893, + "width": 75.345703125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMeIHGMFxQc=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMDiPY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 729, + "top": 907, + "width": 75.345703125, + "height": 12, + "text": "ModelLibrary" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMeIHGMG6CQ=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMDiPY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -60, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwMeIHGMH2dQ=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMDiPY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -60, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 888, + "width": 85.345703125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMeIHGMEN4g=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwMeIHGMFxQc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwMeIHGMG6CQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMeIHGMH2dQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwMeIHGMI7hI=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 904, + "width": 85, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwMeIHGMJi90=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 914, + "width": 85, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwMeIHGMK1pc=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "model": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "top": -40, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 724, + "top": 888, + "width": 85.345703125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwMeIHGMDiPY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwMeIHGMI7hI=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwMeIHGMJi90=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqLUujT3E=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwMeIHGMK1pc=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwMevo2Mq4Ew=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMevo2MpIU4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMevo2Mr7wQ=", + "_parent": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "model": { + "$ref": "AAAAAAFFwMevo2MpIU4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 861, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMevo2Msv/w=", + "_parent": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "model": { + "$ref": "AAAAAAFFwMevo2MpIU4=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 876, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMevo2MtL5c=", + "_parent": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "model": { + "$ref": "AAAAAAFFwMevo2MpIU4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 690, + "top": 831, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMevo2Mq4Ew=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwMYNEWK8jeA=" + }, + "tail": { + "$ref": "AAAAAAFFwMdnrWLZAY8=" + }, + "points": "724:852;656:852", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwMevo2Mr7wQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMevo2Msv/w=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMevo2MtL5c=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwMe0G2M7rmg=", + "_parent": { + "$ref": "AAAAAAFElnFUQFS4mT4=" + }, + "model": { + "$ref": "AAAAAAFFwMe0G2M69PQ=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMe0G2M8gls=", + "_parent": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "model": { + "$ref": "AAAAAAFFwMe0G2M69PQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 917, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMe0G2M9WEg=", + "_parent": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "model": { + "$ref": "AAAAAAFFwMe0G2M69PQ=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 689, + "top": 932, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwMe0G2M+CD8=", + "_parent": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "model": { + "$ref": "AAAAAAFFwMe0G2M69PQ=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 690, + "top": 887, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwMe0G2M7rmg=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwMYNEWK8jeA=" + }, + "tail": { + "$ref": "AAAAAAFFwMeIHGMCTCk=" + }, + "points": "724:908;656:908", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwMe0G2M8gls=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwMe0G2M9WEg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwMe0G2M+CD8=" + } + } + ] + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFElnFrT1S7Kic=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLClassifier" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFElnF1nFTY/Sw=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Realization", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFElnGGLFUFZFA=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "source": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "target": { + "$ref": "AAAAAAFElnFrT1S7Kic=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFElnF1nFTZHOU=", + "_parent": { + "$ref": "AAAAAAFElnF1nFTY/Sw=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFElnJRglVKSoc=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Specification", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFElnKVuVV4pBU=", + "_parent": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "source": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "target": { + "$ref": "AAAAAAFElnFrT1S7Kic=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFElnJRglVLifA=", + "_parent": { + "$ref": "AAAAAAFElnJRglVKSoc=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFJsYgDTM+Z6E=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "entity", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFJsZx3DOCac8=", + "_parent": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "source": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFJsYgDTM/qY8=", + "_parent": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "width": 40, + "height": 40, + "content": "var w = rect.getWidth(),\n m = w / 10;\ncanvas.fillEllipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.ellipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.line(rect.x1 + m, rect.y2 - m, rect.x2 - m, rect.y2 - m);\n" + } + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFJsZbpDNobIs=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLClass" + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwKqhJFq06mA=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLArtifact" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKsvdVrRJUQ=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "File", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK5AeFyZpVg=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "source": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "isAbstract": true, + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKsvdVrSLo0=", + "_parent": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKtwS1r6wew=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Document", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFFwKzkslvX4gU=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "source": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "target": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK4k1VxEEpM=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "source": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKtwS1r7XqE=", + "_parent": { + "$ref": "AAAAAAFFwKtwS1r6wew=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKuBulsidLQ=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Executable", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFFwKzsCVvo11g=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "source": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "target": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK4o4VxVx00=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "source": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKuBulsjhp0=", + "_parent": { + "$ref": "AAAAAAFFwKuBulsidLQ=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKuIMltKnQQ=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Library", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFFwKzxcVv56Dg=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "source": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "target": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK4tiVxmVJM=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "source": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKuIMltLkmg=", + "_parent": { + "$ref": "AAAAAAFFwKuIMltKnQQ=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKuS0ltysPk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Script", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFFwKz3OVwK9hs=", + "_parent": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "source": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "target": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK41YVx3Hr0=", + "_parent": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "source": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKuS0ltz9pw=", + "_parent": { + "$ref": "AAAAAAFFwKuS0ltysPk=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwKueMVuaLXM=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Source", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFFwKz9mFwbfDg=", + "_parent": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "source": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "target": { + "$ref": "AAAAAAFFwKsvdVrRJUQ=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwK47MFyIL/c=", + "_parent": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "source": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "target": { + "$ref": "AAAAAAFFwKqhJFq06mA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwKueMlubedY=", + "_parent": { + "$ref": "AAAAAAFFwKueMVuaLXM=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwK/k1ly00Ec=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLBehavioralFeature" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLBdO1zQosE=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Destroy", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLDMaFz5C14=", + "_parent": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "source": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "target": { + "$ref": "AAAAAAFFwK/k1ly00Ec=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLBdO1zR7Ak=", + "_parent": { + "$ref": "AAAAAAFFwLBdO1zQosE=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLFUbV0QQVA=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Auxiliary", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLNej157D6Y=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "source": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLFUbV0RoPU=", + "_parent": { + "$ref": "AAAAAAFFwLFUbV0QQVA=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLFu8104he4=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Focus", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLNkZ16Mp7Y=", + "_parent": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "source": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLFu9F05JGE=", + "_parent": { + "$ref": "AAAAAAFFwLFu8104he4=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLF4tF1g4No=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Metaclass", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLNn916d4Yc=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "source": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLF4tF1h94I=", + "_parent": { + "$ref": "AAAAAAFFwLF4tF1g4No=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLF/G12IJ54=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "ImplementationClass", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLNr116u93k=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "source": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLF/G12JIns=", + "_parent": { + "$ref": "AAAAAAFFwLF/G12IJ54=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLGEO12wqJ8=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Type", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLNvdl6/WJI=", + "_parent": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "source": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLGEPF2x7bg=", + "_parent": { + "$ref": "AAAAAAFFwLGEO12wqJ8=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLGI813YL3s=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Utility", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLN0fl7QL9o=", + "_parent": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "source": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLGI813ZPxY=", + "_parent": { + "$ref": "AAAAAAFFwLGI813YL3s=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLProfileDiagram", + "_id": "AAAAAAFFwLKxU14QPaE=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Robustness Stereotypes", + "ownedViews": [ + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwLL0NF4VWXk=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqMEwRREE=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLL0NF4WzoE=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLL0NF4X88I=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4WzoE=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 217, + "top": 89, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLL0NF4YSt8=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4WzoE=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 217, + "top": 103, + "width": 72.51593017578125, + "height": 12, + "text": "entity" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLL0NF4ZQaQ=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4WzoE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -1065, + "top": -270, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLL0NF4asxs=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4WzoE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -1065, + "top": -270, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 84, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLL0NF4X88I=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLL0NF4YSt8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLL0NF4ZQaQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLL0NF4asxs=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwLL0NF4bgXg=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 92, + "top": -28, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwLL0NF4cZ88=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 92, + "top": -18, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwLL0NF4dJaE=", + "_parent": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "model": { + "$ref": "AAAAAAFFJsYgDTM+Z6E=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -710, + "top": -180, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 84, + "width": 82.51593017578125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwLL0NF4WzoE=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwLL0NF4bgXg=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwLL0NF4cZ88=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqMEwRREE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwLL0NF4dJaE=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwLMO8l44tWU=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwLMO8l45ook=", + "_parent": { + "$ref": "AAAAAAFFwLMO8l44tWU=" + }, + "model": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwLMO8l46Nac=", + "_parent": { + "$ref": "AAAAAAFFwLMO8l45ook=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 33, + "top": 33, + "width": 79, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLMO8l47xu4=", + "_parent": { + "$ref": "AAAAAAFFwLMO8l45ook=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 33, + "top": 47, + "width": 79, + "height": 12, + "text": "UMLClass" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLMO8l48V+s=", + "_parent": { + "$ref": "AAAAAAFFwLMO8l45ook=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -489, + "top": -414, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwLMO8l490+g=", + "_parent": { + "$ref": "AAAAAAFFwLMO8l45ook=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -489, + "top": -414, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 28, + "top": 28, + "width": 89, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLMO8l46Nac=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwLMO8l47xu4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwLMO8l48V+s=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLMO8l490+g=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 28, + "top": 28, + "width": 89, + "height": 149, + "nameCompartment": { + "$ref": "AAAAAAFFwLMO8l45ook=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwLMO814+17w=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFJsZx3DOCac8=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLMO814/vLk=", + "_parent": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "model": { + "$ref": "AAAAAAFFJsZx3DOCac8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 109, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLMO815A2sw=", + "_parent": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "model": { + "$ref": "AAAAAAFFJsZx3DOCac8=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 124, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwLMO815BAcU=", + "_parent": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "model": { + "$ref": "AAAAAAFFJsZx3DOCac8=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 164, + "top": 79, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwLMO814+17w=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLMO8l44tWU=" + }, + "tail": { + "$ref": "AAAAAAFFwLL0NF4VWXk=" + }, + "points": "212:100;116:100", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwLMO814/vLk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwLMO815A2sw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwLMO815BAcU=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwx8Q/35wG9A=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqMUw9MBk=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwx8Q/35xpyY=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwx8Q/35yVU8=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35xpyY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 217, + "top": 37, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwx8Q/35z0VE=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35xpyY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 217, + "top": 51, + "width": 72.51593017578125, + "height": 12, + "text": "control" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwx8Q/3506PU=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35xpyY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -336, + "top": -312, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwx8Q/351cP0=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35xpyY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -336, + "top": -312, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 32, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwx8Q/35yVU8=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwx8Q/35z0VE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwx8Q/3506PU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwx8Q/351cP0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwx8RAH52xko=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 76, + "top": -4, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwx8RAH53MWs=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 76, + "top": 6, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwx8RAH54kik=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "model": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": -224, + "top": -208, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 32, + "width": 82.51593017578125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwx8Q/35xpyY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwx8RAH52xko=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwx8RAH53MWs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqMUw9MBk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwx8RAH54kik=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwyAHeH6a9yk=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFwyAHeH6Znas=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwyAHeX6b9JY=", + "_parent": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "model": { + "$ref": "AAAAAAFFwyAHeH6Znas=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 61, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwyAHeX6cKyY=", + "_parent": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "model": { + "$ref": "AAAAAAFFwyAHeH6Znas=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 76, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwyAHeX6dvIk=", + "_parent": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "model": { + "$ref": "AAAAAAFFwyAHeH6Znas=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 164, + "top": 31, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwyAHeH6a9yk=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLMO8l44tWU=" + }, + "tail": { + "$ref": "AAAAAAFFwx8Q/35wG9A=" + }, + "points": "212:52;116:52", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwyAHeX6b9JY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwyAHeX6cKyY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwyAHeX6dvIk=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFw0h1/QXNqo4=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqMkxa+TA=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFw0h1/gXOBI4=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFw0h1/gXPA/w=", + "_parent": { + "$ref": "AAAAAAFFw0h1/gXOBI4=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 217, + "top": 141, + "width": 72.51593017578125, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFw0h1/gXQ/LI=", + "_parent": { + "$ref": "AAAAAAFFw0h1/gXOBI4=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 217, + "top": 155, + "width": 72.51593017578125, + "height": 12, + "text": "boundary" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFw0h1/gXRrB4=", + "_parent": { + "$ref": "AAAAAAFFw0h1/gXOBI4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 96, + "top": -360, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFw0h1/gXSVgA=", + "_parent": { + "$ref": "AAAAAAFFw0h1/gXOBI4=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 96, + "top": -360, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 136, + "width": 82.51593017578125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFw0h1/gXPA/w=" + }, + "nameLabel": { + "$ref": "AAAAAAFFw0h1/gXQ/LI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFw0h1/gXRrB4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFw0h1/gXSVgA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFw0h1/gXTCRY=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 72, + "top": -20, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFw0h1/gXUu1g=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 72, + "top": -10, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFw0h1/gXVEL8=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "model": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 64, + "top": -240, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 212, + "top": 136, + "width": 82.51593017578125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFw0h1/gXOBI4=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFw0h1/gXTCRY=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFw0h1/gXUu1g=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqMkxa+TA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFw0h1/gXVEL8=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFw0o5p5IVMGM=", + "_parent": { + "$ref": "AAAAAAFFwLKxU14QPaE=" + }, + "model": { + "$ref": "AAAAAAFFw0o5ppIUB2s=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFw0o5p5IW5Js=", + "_parent": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "model": { + "$ref": "AAAAAAFFw0o5ppIUB2s=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 165, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFw0o5p5IXSKA=", + "_parent": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "model": { + "$ref": "AAAAAAFFw0o5ppIUB2s=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 163, + "top": 180, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFw0o5p5IY/GE=", + "_parent": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "model": { + "$ref": "AAAAAAFFw0o5ppIUB2s=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 164, + "top": 135, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFw0o5p5IVMGM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwLMO8l44tWU=" + }, + "tail": { + "$ref": "AAAAAAFFw0h1/QXNqo4=" + }, + "points": "212:156;116:156", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFw0o5p5IW5Js=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFw0o5p5IXSKA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFw0o5p5IY/GE=" + } + } + ] + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwLRECl7r1R4=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLComponent" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLR8CF8G68k=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Entity", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLV9gV/Xhk4=", + "_parent": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "source": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLR8CF8HOik=", + "_parent": { + "$ref": "AAAAAAFFwLR8CF8G68k=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLSByF8umMo=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Implementation", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLWA0V/olVk=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "source": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLSByF8vzKA=", + "_parent": { + "$ref": "AAAAAAFFwLSByF8umMo=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLSIN19WMnE=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Process", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLWEUV/5Qq4=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "source": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLSIN19XVng=", + "_parent": { + "$ref": "AAAAAAFFwLSIN19WMnE=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLSO/19+cMY=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Service", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLWIQWAKKPo=", + "_parent": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "source": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLSO/19/YUk=", + "_parent": { + "$ref": "AAAAAAFFwLSO/19+cMY=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwLSXP1+mTVk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Subsystem", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwLWMgWAb2Sk=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "source": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwLSXP1+njeI=", + "_parent": { + "$ref": "AAAAAAFFwLSXP1+mTVk=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwL2WeGA460g=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLDependency" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwL4D0mBXwu4=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Create", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+LCGFfPQs=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "source": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "target": { + "$ref": "AAAAAAFFwK/k1ly00Ec=" + } + }, + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+O8GFwbog=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "source": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "target": { + "$ref": "AAAAAAFFwL2WeGA460g=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwL4D0mBYXVU=", + "_parent": { + "$ref": "AAAAAAFFwL4D0mBXwu4=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwL4h4WCAEkg=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Call", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+SkWGBCOg=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "source": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "target": { + "$ref": "AAAAAAFFwL2WeGA460g=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwL4h4WCBKPU=", + "_parent": { + "$ref": "AAAAAAFFwL4h4WCAEkg=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwL45WWCpJ0o=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Instantiate", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+WL2GScgY=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "source": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "target": { + "$ref": "AAAAAAFFwL2WeGA460g=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwL45WWCq/8I=", + "_parent": { + "$ref": "AAAAAAFFwL45WWCpJ0o=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwL5hP2DSEFk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Responsibility", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+Z72GjzGw=", + "_parent": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "source": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "target": { + "$ref": "AAAAAAFFwL2WeGA460g=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwL5hQGDTCjI=", + "_parent": { + "$ref": "AAAAAAFFwL5hP2DSEFk=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwL7KdWEoDhA=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Send", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwL+eh2G01aU=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "source": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "target": { + "$ref": "AAAAAAFFwL2WeGA460g=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwL7KdWEpx8M=", + "_parent": { + "$ref": "AAAAAAFFwL7KdWEoDhA=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwMFq1GHYSKM=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLAbstraction" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwMGlemH0Tq8=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Derive", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwMLTmmKDF1M=", + "_parent": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "source": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "target": { + "$ref": "AAAAAAFFwMFq1GHYSKM=" + } + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFFwMJO92J1Y/s=", + "_parent": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "name": "computation", + "type": "String" + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwMGlemH1M8k=", + "_parent": { + "$ref": "AAAAAAFFwMGlemH0Tq8=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwMGo6mIcITc=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Refine", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwMLXQmKUyu0=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "source": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "target": { + "$ref": "AAAAAAFFwMFq1GHYSKM=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwMGo6mIdBMU=", + "_parent": { + "$ref": "AAAAAAFFwMGo6mIcITc=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwMGrimJEvvk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Trace", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwMLbmmKloGE=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "source": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "target": { + "$ref": "AAAAAAFFwMFq1GHYSKM=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwMGrimJF+z8=", + "_parent": { + "$ref": "AAAAAAFFwMGrimJEvvk=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwMYNEWK7ItA=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLPackage" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwMdnrWLXWLA=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Framework", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwMevo2MpIU4=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "source": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "target": { + "$ref": "AAAAAAFFwMYNEWK7ItA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwMdnrWLYFcM=", + "_parent": { + "$ref": "AAAAAAFFwMdnrWLXWLA=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwMeIHGMAPDc=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "ModelLibrary", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwMe0G2M69PQ=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "source": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "target": { + "$ref": "AAAAAAFFwMYNEWK7ItA=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwMeIHGMBKKk=", + "_parent": { + "$ref": "AAAAAAFFwMeIHGMAPDc=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLProfileDiagram", + "_id": "AAAAAAFFwQCuI7bLjDk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "StandardProfileL3", + "ownedViews": [ + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwQHC9rbwK6A=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQHC9rbvUkk=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwQHC9rbx7Lo=", + "_parent": { + "$ref": "AAAAAAFFwQHC9rbwK6A=" + }, + "model": { + "$ref": "AAAAAAFFwQHC9rbvUkk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHC9rbyTUQ=", + "_parent": { + "$ref": "AAAAAAFFwQHC9rbx7Lo=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 45, + "top": 121, + "width": 107, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHC9rbzlgQ=", + "_parent": { + "$ref": "AAAAAAFFwQHC9rbx7Lo=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 45, + "top": 135, + "width": 107, + "height": 12, + "text": "UMLModel" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHC9rb0L9g=", + "_parent": { + "$ref": "AAAAAAFFwQHC9rbx7Lo=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -168, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHC9rb1XIk=", + "_parent": { + "$ref": "AAAAAAFFwQHC9rbx7Lo=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -48, + "top": -168, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 40, + "top": 116, + "width": 117, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQHC9rbyTUQ=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwQHC9rbzlgQ=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwQHC9rb0L9g=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQHC9rb1XIk=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 40, + "top": 116, + "width": 117, + "height": 97, + "nameCompartment": { + "$ref": "AAAAAAFFwQHC9rbx7Lo=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwQHjjbcLQPM=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqN0zJrS0=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwQHjjbcMlRY=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHjjbcNrIk=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcMlRY=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 229, + "top": 41, + "width": 115, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHjjbcOnWs=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcMlRY=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 229, + "top": 55, + "width": 115, + "height": 12, + "text": "BuildComponent" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHjjbcPLIM=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcMlRY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 108, + "top": -48, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQHjjbcQOtc=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcMlRY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 108, + "top": -48, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 36, + "width": 125, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQHjjbcNrIk=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwQHjjbcOnWs=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwQHjjbcPLIM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQHjjbcQOtc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwQHjjrcRsYI=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 260, + "top": 56, + "width": 105, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwQHjjrcSCoc=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 260, + "top": 66, + "width": 105, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwQHjjrcTWEY=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "model": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 72, + "top": -32, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 36, + "width": 125, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwQHjjbcMlRY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwQHjjrcRsYI=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwQHjjrcSCoc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqN0zJrS0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwQHjjrcTWEY=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwQIPLLc0Q7M=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqOEzfvr8=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwQIPLLc1jrg=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIPLLc2rps=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc1jrg=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 229, + "top": 121, + "width": 83, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIPLLc3wdo=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc1jrg=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 229, + "top": 135, + "width": 83, + "height": 12, + "text": "Metamodel" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIPLLc4SHA=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc1jrg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 108, + "top": -84, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIPLLc5Qvc=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc1jrg=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 108, + "top": -84, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 116, + "width": 93, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQIPLLc2rps=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwQIPLLc3wdo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwQIPLLc4SHA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQIPLLc5Qvc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwQIPLLc63qc=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 260, + "top": 124, + "width": 81, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwQIPLbc7y2w=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 260, + "top": 134, + "width": 81, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwQIPLbc8jC8=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "model": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 72, + "top": -56, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 116, + "width": 93, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwQIPLLc1jrg=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwQIPLLc63qc=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwQIPLbc7y2w=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqOEzfvr8=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwQIPLbc8jC8=" + } + }, + { + "_type": "UMLStereotypeView", + "_id": "AAAAAAFFwQIrDLddK/I=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "subViews": [ + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF5P5kqOEz1SWk=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "visible": false, + "font": "Arial;12;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwQIrDLdevJE=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIrDLdfcec=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdevJE=" + }, + "font": "Arial;12;0", + "containerExtending": true, + "left": 229, + "top": 181, + "width": 83, + "height": 12, + "text": "«stereotype»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIrDLdgsTM=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdevJE=" + }, + "font": "Arial;12;1", + "containerExtending": true, + "left": 229, + "top": 195, + "width": 83, + "height": 12, + "text": "SystemModel" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIrDLdhAR0=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdevJE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 120, + "top": -168, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQIrDLdiiuQ=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdevJE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 120, + "top": -168, + "height": 12, + "horizontalAlignment": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 176, + "width": 93, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQIrDLdfcec=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwQIrDLdgsTM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwQIrDLdhAR0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQIrDLdiiuQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFFwQIrDLdjYt8=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 264, + "top": 156, + "width": 88, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFFwQIrDLdkEoo=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 264, + "top": 166, + "width": 88, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFFwQIrDLdlkbo=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "model": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 80, + "top": -112, + "width": 10, + "height": 10 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "left": 224, + "top": 176, + "width": 93, + "height": 37, + "nameCompartment": { + "$ref": "AAAAAAFFwQIrDLdevJE=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFFwQIrDLdjYt8=" + }, + "operationCompartment": { + "$ref": "AAAAAAFFwQIrDLdkEoo=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF5P5kqOEz1SWk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFFwQIrDLdlkbo=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwQLOH7eRZzI=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQLOH7eQuvE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLOH7eSzo8=", + "_parent": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "model": { + "$ref": "AAAAAAFFwQLOH7eQuvE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 145, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLOILeTl4U=", + "_parent": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "model": { + "$ref": "AAAAAAFFwQLOH7eQuvE=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 160, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLOILeU1qE=", + "_parent": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "model": { + "$ref": "AAAAAAFFwQLOH7eQuvE=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 190, + "top": 115, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQLOH7eRZzI=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwQHC9rbwK6A=" + }, + "tail": { + "$ref": "AAAAAAFFwQIPLLc0Q7M=" + }, + "points": "224:136;156:136", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwQLOH7eSzo8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQLOILeTl4U=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQLOILeU1qE=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwQLSp7eim6s=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQLSp7eh5o0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLSp7ejdqM=", + "_parent": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "model": { + "$ref": "AAAAAAFFwQLSp7eh5o0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 205, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLSp7ekT+I=", + "_parent": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "model": { + "$ref": "AAAAAAFFwQLSp7eh5o0=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 220, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQLSp7el67w=", + "_parent": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "model": { + "$ref": "AAAAAAFFwQLSp7eh5o0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 190, + "top": 175, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQLSp7eim6s=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwQHC9rbwK6A=" + }, + "tail": { + "$ref": "AAAAAAFFwQIrDLddK/I=" + }, + "points": "224:196;156:196", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwQLSp7ejdqM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQLSp7ekT+I=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQLSp7el67w=" + } + }, + { + "_type": "UMLMetaClassView", + "_id": "AAAAAAFFwQdYRLfPnZs=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFFwQdYRLfQc8o=", + "_parent": { + "$ref": "AAAAAAFFwQdYRLfPnZs=" + }, + "model": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFFwQdYRLfRm/U=", + "_parent": { + "$ref": "AAAAAAFFwQdYRLfQc8o=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 45, + "top": 41, + "width": 107, + "height": 12, + "text": "«metaClass»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQdYRLfSwyU=", + "_parent": { + "$ref": "AAAAAAFFwQdYRLfQc8o=" + }, + "fillColor": "#e2e2e2", + "font": "Arial;12;1", + "containerExtending": true, + "left": 45, + "top": 55, + "width": 107, + "height": 12, + "text": "UMLComponent" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQdYRLfTyV4=", + "_parent": { + "$ref": "AAAAAAFFwQdYRLfQc8o=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -702, + "top": -954, + "width": 150.64784240722656, + "height": 12, + "text": "(from UMLStandardProfile)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFFwQdYRLfUafY=", + "_parent": { + "$ref": "AAAAAAFFwQdYRLfQc8o=" + }, + "visible": false, + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": -702, + "top": -954, + "height": 12, + "horizontalAlignment": 1 + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 40, + "top": 36, + "width": 117, + "height": 36, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQdYRLfRm/U=" + }, + "nameLabel": { + "$ref": "AAAAAAFFwQdYRLfSwyU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFFwQdYRLfTyV4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQdYRLfUafY=" + } + } + ], + "fillColor": "#e2e2e2", + "font": "Arial;12;0", + "containerExtending": true, + "left": 40, + "top": 36, + "width": 117, + "height": 41, + "nameCompartment": { + "$ref": "AAAAAAFFwQdYRLfQc8o=" + } + }, + { + "_type": "UMLExtensionView", + "_id": "AAAAAAFFwQgwnLf7u0w=", + "_parent": { + "$ref": "AAAAAAFFwQCuI7bLjDk=" + }, + "model": { + "$ref": "AAAAAAFFwQgwnLf6Q+0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQgwnLf82nE=", + "_parent": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "model": { + "$ref": "AAAAAAFFwQgwnLf6Q+0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 64, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQgwnbf9bFo=", + "_parent": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "model": { + "$ref": "AAAAAAFFwQgwnLf6Q+0=" + }, + "visible": null, + "font": "Arial;12;0", + "containerExtending": true, + "left": 189, + "top": 79, + "height": 12, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFFwQgwnbf+ckE=", + "_parent": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "model": { + "$ref": "AAAAAAFFwQgwnLf6Q+0=" + }, + "visible": false, + "font": "Arial;12;0", + "containerExtending": true, + "left": 190, + "top": 34, + "height": 12, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFFwQgwnLf7u0w=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;12;0", + "containerExtending": true, + "head": { + "$ref": "AAAAAAFFwQdYRLfPnZs=" + }, + "tail": { + "$ref": "AAAAAAFFwQHjjbcLQPM=" + }, + "lineStyle": 1, + "points": "223:55;157:55", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFFwQgwnLf82nE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFFwQgwnbf9bFo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFFwQgwnbf+ckE=" + } + } + ] + }, + { + "_type": "UMLMetaClass", + "_id": "AAAAAAFFwQHC9rbvUkk=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "UMLModel" + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwQHjjbcJ4Ks=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "BuildComponent", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwQgwnLf6Q+0=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "source": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "target": { + "$ref": "AAAAAAFFwLRECl7r1R4=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwQHjjbcKYjk=", + "_parent": { + "$ref": "AAAAAAFFwQHjjbcJ4Ks=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwQIPLLcykEY=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "Metamodel", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwQLOH7eQuvE=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "source": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "target": { + "$ref": "AAAAAAFFwQHC9rbvUkk=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwQIPLLcz/1A=", + "_parent": { + "$ref": "AAAAAAFFwQIPLLcykEY=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwQIrDLdbTko=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "SystemModel", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwQLSp7eh5o0=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "source": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "target": { + "$ref": "AAAAAAFFwQHC9rbvUkk=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwQIrDLdcjKw=", + "_parent": { + "$ref": "AAAAAAFFwQIrDLdbTko=" + }, + "width": 40, + "height": 40 + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFwx8Q/35u/80=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "control", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFwyAHeH6Znas=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "source": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFwx8Q/35vMf0=", + "_parent": { + "$ref": "AAAAAAFFwx8Q/35u/80=" + }, + "width": 40, + "height": 40, + "content": "var w = rect.getWidth(),\n h = w / 2,\n m = w / 8;\ncanvas.fillEllipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.ellipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.line(rect.x1 + h, rect.y1 + m, rect.x1 + h + m, rect.y1);\ncanvas.line(rect.x1 + h, rect.y1 + m, rect.x1 + h + m, rect.y1 + 2 * m);\n" + } + }, + { + "_type": "UMLStereotype", + "_id": "AAAAAAFFw0h1/QXL978=", + "_parent": { + "$ref": "AAAAAAFElnEzslS1AuE=" + }, + "name": "boundary", + "ownedElements": [ + { + "_type": "UMLExtension", + "_id": "AAAAAAFFw0o5ppIUB2s=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "source": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "target": { + "$ref": "AAAAAAFFJsZbpDNobIs=" + } + } + ], + "icon": { + "_type": "UMLImage", + "_id": "AAAAAAFFw0h1/QXM/ss=", + "_parent": { + "$ref": "AAAAAAFFw0h1/QXL978=" + }, + "width": "50", + "height": 40, + "content": "var w = rect.getWidth(),\n h = rect.getHeight(),\n m = w / 5;\ncanvas.fillEllipse(rect.x1 + m, rect.y1, rect.x2, rect.y2);\ncanvas.ellipse(rect.x1 + m, rect.y1, rect.x2, rect.y2);\ncanvas.line(rect.x1, rect.y1, rect.x1, rect.y2);\ncanvas.line(rect.x1, rect.y1 + h/2, rect.x1 + m, rect.y1 + h/2);\n" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..28992b9 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,281 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\Users\Administrator\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} +-keepclassmembers class * { + public (org.json.JSONObject); +} +-keep public class cn.liuyanbing.surveyor.R$*{ +public static final int *; +} +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} +#混淆前后的映射 +-printmapping mapping.txt + +-keep class androidx.appcompat.widget.SearchView { *; } +-keep class cn.aigestudio.datepicker.**{*;} + +-keep class io.realm.annotations.RealmModule +-keep @io.realm.annotations.RealmModule class * +-keep class io.realm.internal.Keep +-keep @io.realm.internal.Keep class * { *; } +-dontwarn javax.** +-dontwarn io.realm.** + +-keep class com.tencent.mm.sdk.** { + *; +} + +-dontwarn com.tencent.** +-keep class com.tencent.** {*;} + +-ignorewarnings + +# Apache POI +-dontwarn org.apache.** +-dontwarn org.openxmlformats.schemas.** +-dontwarn org.etsi.** +-dontwarn org.w3.** +-dontwarn com.microsoft.schemas.** +-dontwarn com.fasterxml.** +-dontwarn javax.naming.** +-dontwarn java.lang.management.** +-dontwarn org.slf4j.impl.** + +-dontnote org.apache.** +-dontnote org.openxmlformats.schemas.** +-dontnote org.etsi.** +-dontnote org.w3.** +-dontnote com.microsoft.schemas.** +-dontnote com.fasterxml.** +-dontnote javax.naming.** +-dontnote java.lang.management.** +-dontnote org.slf4j.impl.** + +-keeppackagenames org.apache.poi.ss.formula.function + +-keep class org.apache.** {*;} +-keep class org.openxmlformats.** {*;} +-keep class org.etsi.** {*;} +-keep class org.w3.** {*;} +-keep class com.microsoft.** {*;} +-keep class com.fasterxml.** {*;} +-keep class schemaorg_apache_xmlbeans.** {*;} + +# ------------------------ leancloud sdk ------------------------ +-keepattributes Signature +-dontwarn com.jcraft.jzlib.** +-keep class com.jcraft.jzlib.** { *;} + +-dontwarn sun.misc.** +-keep class sun.misc.** { *;} + +-dontwarn alibaba.fastjson.** +-dontnote alibaba.fastjson.** +-keep class alibaba.fastjson.** { *;} + +-dontwarn sun.security.** +-keep class sun.security.** { *; } + +-dontwarn com.google.** +-keep class com.google.** { *;} + +-dontwarn com.avos.** +-dontnote com.avos.** +-keep class com.avos.** { *;} + +-dontwarn cn.leancloud.** +-dontnote cn.leancloud.** +-keep class cn.leancloud.** { *;} + +-keep public class android.net.http.SslError +-keep public class android.webkit.WebViewClient + +-dontwarn android.webkit.WebView +-dontwarn android.net.http.SslError +-dontwarn android.webkit.WebViewClient +-dontnote android.net.http.** + +-dontwarn android.support.** + +-dontwarn org.jivesoftware.smack.** +-keep class org.jivesoftware.smack.** { *;} + +-dontwarn com.loopj.** +-keep class com.loopj.** { *;} + +-dontwarn com.squareup.okhttp.** +-keep class com.squareup.okhttp.** { *;} +-keep interface com.squareup.okhttp.** { *; } + +# keep okhttp3、okio +-dontwarn okhttp3.** +-keep class okhttp3.** { *;} +-keep interface okhttp3.** { *; } +-dontwarn okio.** + +-keep class com.google.protobuf.** { *; } +-keep public class * extends com.google.protobuf.** { *; } +-dontwarn com.google.protobuf.** + +-dontwarn org.xbill.** +-keep class org.xbill.** { *;} + +-keepattributes *Annotation* + + +# ------------------------ ChatKit ------------------------ +-dontwarn cn.leancloud.chatkit.** +-keep class cn.leancloud.chatkit.** { *;} +-dontnote cn.leancloud.chatkit.** + +# ------------------------ picasso ------------------------ +-dontwarn com.squareup.picasso** +-keep class com.squareup.picasso.**{*;} + +# ------------------------ eventbus ------------------------ +-keepattributes *Annotation* +-keepclassmembers class * { + @org.greenrobot.eventbus.Subscribe ; +} +-keep enum org.greenrobot.eventbus.ThreadMode { *; } + +# Only required if you use AsyncExecutor +-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { + (java.lang.Throwable); +} +#--------------------------工具集----------------------------- +-keep class blankj.utilcode.** { *; } +-keepclassmembers class blankj.utilcode.** { *; } +-dontwarn blankj.utilcode.** + +-keep class com.chad.library.adapter.** { +*; +} +-keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter +-keep public class * extends com.chad.library.adapter.base.BaseViewHolder +-keepclassmembers class **$** extends com.chad.library.adapter.base.BaseViewHolder { + (...); +} + +# glide 的混淆代码 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +# banner 的混淆代码 +-keep class com.youth.banner.** { + *; + } +# 华测sdk + -keep class com.chc.gnss.sdk.** { *; } + -dontwarn com.chc.gnss.sdk.** +# 中国移动sdk + -keep class com.cmcc.sy.hap.** { *; } + -dontwarn com.cmcc.sy.hap.** +# 梦想CAD sdk + -keep class org.cocos2dx.** { *; } + -dontwarn org.cocos2dx.** + -keep class com.chukong.cocosplay.client.** { *; } + -dontwarn com.chukong.cocosplay.client.** + -keep class com.MxDraw.** { *; } + -dontwarn com.MxDraw.** +#agentweb + -keep class com.just.agentweb.** { + *; + } + -dontwarn com.just.agentweb.** + +#androidx + -keep class com.google.android.material.** {*;} + -keep class androidx.** {*;} + -keep public class * extends androidx.** + -keep interface androidx.** {*;} + -dontwarn com.google.android.material.** + -dontnote com.google.android.material.** + -dontwarn androidx.** + +# 南方坐标转换 + -keep class com.qxwz.sdk.** { *; } + -dontwarn com.qxwz.sdk.** + + -keep class com.bingce.device.rtk.configuration.** { *; } + -keep class com.bingce.device.rtk.model.** { *; } + -keep class com.bingce.totalstation.TsConfig { *; } + + #OkSocket + -dontwarn xuhao.didi.socket.client.** + -dontwarn xuhao.didi.socket.common.** + -dontwarn xuhao.didi.socket.server.** + -dontwarn xuhao.didi.core.** + + -keep class xuhao.didi.socket.client.** { *; } + -keep class xuhao.didi.socket.common.** { *; } + -keep class xuhao.didi.socket.server.** { *; } + -keep class xuhao.didi.core.** { *; } + + -keep class xuhao.didi.socket.client.sdk.client.OkSocketOptions$* { + *; + } + -keep class xuhao.didi.socket.server.impl.OkServerOptions$* { + *; + } + + #gsyvideoplayer + -keep class com.shuyu.gsyvideoplayer.video.** { *; } + -dontwarn com.shuyu.gsyvideoplayer.video.** + -keep class com.shuyu.gsyvideoplayer.video.base.** { *; } + -dontwarn com.shuyu.gsyvideoplayer.video.base.** + -keep class com.shuyu.gsyvideoplayer.utils.** { *; } + -dontwarn com.shuyu.gsyvideoplayer.utils.** + -keep class tv.danmaku.ijk.** { *; } + -dontwarn tv.danmaku.ijk.** + + -keep public class * extends android.view.View{ + *** get*(); + void set*(***); + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); + } + +# # keep rx +# -dontwarn sun.misc.** +# -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { +# long producerIndex; +# long consumerIndex; +# } +# -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { +# rx.internal.util.atomic.LinkedQueueNode producerNode; +# } +# -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { +# rx.internal.util.atomic.LinkedQueueNode consumerNode; +# } +# +# -keep class cn.liuyanbing.surveyor.model.base.SerializableStringArray { *; } + +-dontwarn com.yalantis.ucrop** +-keep class com.yalantis.ucrop** { *; } +-keep interface com.yalantis.ucrop** { *; } + +-keep class com.bingce.event.WxLoginSuccessEvent{ *; } + +# 友盟 + -keep class com.umeng.** {*;} \ No newline at end of file diff --git a/app/src/androidTest/java/cn/liuyanbing/surveyor/activity/MainActivityTest.java b/app/src/androidTest/java/cn/liuyanbing/surveyor/activity/MainActivityTest.java new file mode 100644 index 0000000..eed3c00 --- /dev/null +++ b/app/src/androidTest/java/cn/liuyanbing/surveyor/activity/MainActivityTest.java @@ -0,0 +1,19 @@ +package cn.liuyanbing.surveyor.activity; + +import android.util.Log; + +import org.junit.Test; + +public class MainActivityTest { + + @Test + public void initSound() { + Log.d("hwhw", "initSound"); + } + + @Test + public void onCreate() { + Log.d("hwhw", "onCreate"); + + } +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/HelloKotlin.kt b/app/src/androidTest/kotlin/HelloKotlin.kt new file mode 100644 index 0000000..02e7131 --- /dev/null +++ b/app/src/androidTest/kotlin/HelloKotlin.kt @@ -0,0 +1,49 @@ +import android.util.Log +import com.bingce.controlnetwork.http.RetrofitClient +import com.bingce.controlnetwork.http.sevice.CommonService +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import org.junit.Test + +class HelloKotlin { + + @Test + fun test() { + runBlocking { + + launch { + Log.d("hwhw", "请求1") + + delay(1000) + Log.d("hwhw", "请求1 delay") + + val apiCall = RetrofitClient.apiCall { + RetrofitClient.createService().getPassageData() + } + + apiCall?.let { + Log.d("hwhw", "请求成功1,$it") + } + } + + launch { + Log.d("hwhw", "请求2") + + delay(1000) + Log.d("hwhw", "请求2 delay") + + val apiCall1 = RetrofitClient.apiCall { + RetrofitClient.createService().getPassageData() + } + apiCall1?.let { + Log.d("hwhw", "请求成功2,$it") + } + } + + + } + } + + +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3a83811 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/README.md b/app/src/main/README.md new file mode 100644 index 0000000..ef62895 --- /dev/null +++ b/app/src/main/README.md @@ -0,0 +1 @@ +#controlnetwork diff --git a/app/src/main/assets/Roboto-Light.ttf b/app/src/main/assets/Roboto-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d43e943312e0f2c653815dd791d93f94f0abd73f GIT binary patch literal 162636 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

v_-2rcF-PPXC&3E_Kh$ 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 XpLxoEqDV@O#}+R!3HI=xso?(riteo( literal 0 HcmV?d00001 diff --git a/app/src/main/assets/Roboto-Medium.ttf b/app/src/main/assets/Roboto-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..87983419893a8952c3f286dc56d37fb94e320da0 GIT binary patch literal 160696 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/agreement_policy_summary.xml b/app/src/main/assets/agreement_policy_summary.xml new file mode 100644 index 0000000..28e3305 --- /dev/null +++ b/app/src/main/assets/agreement_policy_summary.xml @@ -0,0 +1,8 @@ + +

+ 欢迎使用导线助手App!我们将通过《用户协议》和《隐私政策》帮助您了解我们收集、使用、存储和共享个人信息的情况,以及您所享有的相关权利。 + • 为了向您提供语音播报、文件生成存储、头像上传、用户注册等功能服务,我们需要使用您的一些存储权限、音视频录制权限、相机权限、获取设备信息等权限及信息。 + • 我们会采用业界领先的安全技术保护好您的个人信息。 + 您可以通过阅读完整版用户隐私政策,了解个人信息类型与用途的对应关系等更加详尽的个人信息处理规则。 + 如您同意,请点击“同意”开始接受我们的服务。 + \ No newline at end of file diff --git a/app/src/main/assets/agreement_policy_summary_en.xml b/app/src/main/assets/agreement_policy_summary_en.xml new file mode 100644 index 0000000..4e76303 --- /dev/null +++ b/app/src/main/assets/agreement_policy_summary_en.xml @@ -0,0 +1,4 @@ + + + Welcome to the Surveyor App! Through the "User Agreement" and "Privacy Policy", we will help you understand our collection, use, storage and sharing of personal information, as well as your related rights. • In order to provide you with voice broadcasting, file generation and storage, avatar upload, user registration and other functional services, we need to use some of your storage permissions, audio and video recording permissions, camera permissions, access to device information and other permissions and information. • We will protect your personal information with industry-leading security technology. You can read the full version of the user's privacy policy to understand the more detailed personal information processing rules such as the correspondence between personal information types and uses. If you agree, please click "Agree" to start accepting our services. + \ No newline at end of file diff --git a/app/src/main/assets/default_tolerance b/app/src/main/assets/default_tolerance new file mode 100644 index 0000000..e13dc04 --- /dev/null +++ b/app/src/main/assets/default_tolerance @@ -0,0 +1,868 @@ +[{ + "name": "城市轨道交通", + "level": [{ + "name": "城市轨道交通精密导线", + "precision": [{ + "name": "I级", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "3", + "singleCycleDistanceDifference": "3", + "allCycleDistanceDifference": "4", + "cycleCount": "4" + }, { + "name": "II级", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "4", + "singleCycleDistanceDifference": "4", + "allCycleDistanceDifference": "6", + "cycleCount": "6" + }] + }] +}, { + "name": "铁路工程测量", + "level": [{ + "name": "铁路工程测量二等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "4", + "horCycleDirect2CDifference": "6", + "horCyclesDirectValueDifference": "4", + "hor2C": "6", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "2", + "singleCycleDistanceDifference": "2", + "allCycleDistanceDifference": "3", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "6", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }] + }, { + "name": "铁路工程测量三等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "4", + "horCycleDirect2CDifference": "6", + "horCyclesDirectValueDifference": "4", + "hor2C": "6", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "2", + "singleCycleDistanceDifference": "2", + "allCycleDistanceDifference": "3", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "2", + "singleCycleDistanceDifference": "2", + "allCycleDistanceDifference": "3", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }] + }, { + "name": "铁路工程测量四等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "4", + "horCycleDirect2CDifference": "*", + "horCyclesDirectValueDifference": "4", + "hor2C": "6", + "horCyclesDirect2CDifference": "6", + "distanceReadDifference": "2", + "singleCycleDistanceDifference": "2", + "allCycleDistanceDifference": "3", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "3" + }] + }, { + "name": "铁路工程测量一级导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "12", + "horCycleDirect2CDifference": "18", + "horCyclesDirectValueDifference": "12", + "hor2C": "18", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "2", + "singleCycleDistanceDifference": "2", + "allCycleDistanceDifference": "?", + "cycleCount": "3" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "12", + "horCycleDirect2CDifference": "18", + "horCyclesDirectValueDifference": "12", + "hor2C": "18", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "?", + "cycleCount": "3" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "12", + "horCycleDirect2CDifference": "18", + "horCyclesDirectValueDifference": "12", + "hor2C": "18", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "3" + }] + }, { + "name": "铁路工程测量二级导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "12", + "horCycleDirect2CDifference": "18", + "horCyclesDirectValueDifference": "12", + "hor2C": "18", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "2", + "singleCycleDistanceDifference": "2", + "allCycleDistanceDifference": "?", + "cycleCount": "3" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "12", + "horCycleDirect2CDifference": "18", + "horCyclesDirectValueDifference": "12", + "hor2C": "18", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "?", + "cycleCount": "3" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "12", + "horCycleDirect2CDifference": "18", + "horCyclesDirectValueDifference": "12", + "hor2C": "18", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "3" + }, { + "name": "6秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "18", + "horCycleDirect2CDifference": "*", + "horCyclesDirectValueDifference": "24", + "hor2C": "*", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "20", + "singleCycleDistanceDifference": "20", + "allCycleDistanceDifference": "30", + "cycleCount": "3" + }] + }] +}, { + "name": "水利水电工程测量", + "level": [{ + "name": "水利水电工程测量二等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "2", + "horHalfReturnZeroDifference": "4", + "horCycleDirect2CDifference": "6", + "horCyclesDirectValueDifference": "3", + "hor2C": "6", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }, { + "name": "1秒", + "horReadDifference": "4", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }, { + "name": "2秒", + "horReadDifference": "6", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }] + }, { + "name": "水利水电工程测量三等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "2", + "horHalfReturnZeroDifference": "4", + "horCycleDirect2CDifference": "6", + "horCyclesDirectValueDifference": "3", + "hor2C": "6", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }, { + "name": "1秒", + "horReadDifference": "4", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }, { + "name": "2秒", + "horReadDifference": "6", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }] + }, { + "name": "水利水电工程测量四等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "2", + "horHalfReturnZeroDifference": "4", + "horCycleDirect2CDifference": "6", + "horCyclesDirectValueDifference": "3", + "hor2C": "6", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }, { + "name": "1秒", + "horReadDifference": "4", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }, { + "name": "2秒", + "horReadDifference": "6", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }] + }, { + "name": "水利水电工程测量五等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "4", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "3" + }, { + "name": "1秒", + "horReadDifference": "4", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "6", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "6秒", + "horReadDifference": "12", + "horHalfReturnZeroDifference": "18", + "horCycleDirect2CDifference": "24", + "horCyclesDirectValueDifference": "24", + "hor2C": "24", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }] + }] +}, { + "name": "工程测量", + "level": [{ + "name": "工程测量三等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }] + }, { + "name": "工程测量四等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }] + }, { + "name": "工程测量一级导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "12", + "horCycleDirect2CDifference": "18", + "horCyclesDirectValueDifference": "12", + "hor2C": "18", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "12", + "horCycleDirect2CDifference": "18", + "horCyclesDirectValueDifference": "12", + "hor2C": "18", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "12", + "horCycleDirect2CDifference": "18", + "horCyclesDirectValueDifference": "12", + "hor2C": "18", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }, { + "name": "6秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "18", + "horCycleDirect2CDifference": "*", + "horCyclesDirectValueDifference": "24", + "hor2C": "*", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }] + }, { + "name": "工程测量二级导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }, { + "name": "6秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "18", + "horCycleDirect2CDifference": "24", + "horCyclesDirectValueDifference": "24", + "hor2C": "24", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }] + }, { + "name": "工程测量三级导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }, { + "name": "6秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "18", + "horCycleDirect2CDifference": "24", + "horCyclesDirectValueDifference": "24", + "hor2C": "24", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "10", + "singleCycleDistanceDifference": "10", + "allCycleDistanceDifference": "15", + "cycleCount": "2" + }] + }] +}, { + "name": "城市测量", + "level": [{ + "name": "城市测量三等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }] + }, { + "name": "城市测量四等导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "6", + "horCycleDirect2CDifference": "9", + "horCyclesDirectValueDifference": "6", + "hor2C": "9", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }] + }, { + "name": "城市测量一级导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "6秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "18", + "horCycleDirect2CDifference": "*", + "horCyclesDirectValueDifference": "24", + "hor2C": "*", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }] + }, { + "name": "城市测量二级导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "6秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "18", + "horCycleDirect2CDifference": "*", + "horCyclesDirectValueDifference": "24", + "hor2C": "*", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }] + }, { + "name": "城市测量三级导线", + "precision": [{ + "name": "0.5秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "1秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "2秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "8", + "horCycleDirect2CDifference": "13", + "horCyclesDirectValueDifference": "9", + "hor2C": "13", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }, { + "name": "6秒", + "horReadDifference": "3", + "horHalfReturnZeroDifference": "18", + "horCycleDirect2CDifference": "*", + "horCyclesDirectValueDifference": "24", + "hor2C": "*", + "horCyclesDirect2CDifference": "*", + "distanceReadDifference": "5", + "singleCycleDistanceDifference": "5", + "allCycleDistanceDifference": "7", + "cycleCount": "2" + }] + }] +}] \ No newline at end of file diff --git a/app/src/main/assets/features.hcc b/app/src/main/assets/features.hcc new file mode 100644 index 0000000..5ea2931 --- /dev/null +++ b/app/src/main/assets/features.hcc @@ -0,0 +1,574 @@ +[Group][Radio] +[Model][Valid] +Baudrate:1:4800,9600,19200:1,0,2 +Power:10:1,2,5,10,20:2,6,3,4,5 +Stepper:10:125,250:0,2 +[Model][RadioChannels] +High:456.05,456.55,457.05,458.05,459.05,460.05,461.05,462.05,462.55 +Middle:430.00,432.50,435.00,437.50,440.00,442.50,445.00,447.50,450.00 +Low:415.05,416.05,417.05,418.05,419.05,420.05,421.05,422.05,423.05 +[Model][Advanced For Satel] +Step-Protocol-Baudrate:125-8-9600 +Step-Protocol-Baudrate:125-16-9600 +Step-Protocol-Baudrate:125-2-4800 +Step-Protocol-Baudrate:125-4-4800 +Step-Protocol-Baudrate:250-8-19200 +Step-Protocol-Baudrate:250-16-19200 +Step-Protocol-Baudrate:250-2-9600 +Step-Protocol-Baudrate:250-4-9600 +[Model][Advanced For HuaXin] +Step-Protocol-Baudrate:250-1-9600 +Step-Protocol-Baudrate:250-1-19200 +Step-Protocol-Baudrate:250-2-9600 +Step-Protocol-Baudrate:250-4-9600 +[Model][Advanced For HuaXin-EX] +Step-Protocol-Baudrate:125-1-4800 +Step-Protocol-Baudrate:125-2-4800 +Step-Protocol-Baudrate:125-4-4800 +Step-Protocol-Baudrate:250-1-9600 +Step-Protocol-Baudrate:250-2-9600 +Step-Protocol-Baudrate:250-4-9600 +Step-Protocol-Baudrate:250-1-19200 +[Model][Advanced For HuaXin-EX2] +Step-Protocol-Baudrate:250-2-9600 +Step-Protocol-Baudrate:250-4-9600 +Step-Protocol-Baudrate:250-256-9600 +Step-Protocol-Baudrate:250-512-9600 +Step-Protocol-Baudrate:250-256-19200 +Step-Protocol-Baudrate:250-512-19200 +[Model][Advanced For HuaXin-SOUTH] +Step-Protocol-Baudrate:125-1-4800 +Step-Protocol-Baudrate:125-2-4800 +Step-Protocol-Baudrate:125-4-4800 +Step-Protocol-Baudrate:125-256-4800 +Step-Protocol-Baudrate:250-1-9600 +Step-Protocol-Baudrate:250-2-9600 +Step-Protocol-Baudrate:250-4-9600 +Step-Protocol-Baudrate:250-256-9600 +Step-Protocol-Baudrate:250-1-19200 +Step-Protocol-Baudrate:250-256-19200 +[Model][Advanced For D352] +Step-Protocol-Baudrate:125-1-9600 +Step-Protocol-Baudrate:125-2-9600 +Step-Protocol-Baudrate:125-4-9600 +Step-Protocol-Baudrate:125-1-19200 +Step-Protocol-Baudrate:125-2-19200 +Step-Protocol-Baudrate:125-4-19200 +Step-Protocol-Baudrate:200-1-9600 +Step-Protocol-Baudrate:200-2-9600 +Step-Protocol-Baudrate:200-4-9600 +Step-Protocol-Baudrate:200-1-19200 +Step-Protocol-Baudrate:200-2-19200 +Step-Protocol-Baudrate:200-4-19200 +Step-Protocol-Baudrate:250-1-9600 +Step-Protocol-Baudrate:250-2-9600 +Step-Protocol-Baudrate:250-4-9600 +Step-Protocol-Baudrate:250-1-19200 +Step-Protocol-Baudrate:250-2-19200 +Step-Protocol-Baudrate:250-4-19200 +[Model][Advanced For D352_CHCX] +Step-Protocol-Baudrate:125-1-9600 +Step-Protocol-Baudrate:125-2-9600 +Step-Protocol-Baudrate:125-4-9600 +Step-Protocol-Baudrate:125-2-19200 +Step-Protocol-Baudrate:125-4-19200 +Step-Protocol-Baudrate:125-4096-19200 +Step-Protocol-Baudrate:200-1-9600 +Step-Protocol-Baudrate:200-2-9600 +Step-Protocol-Baudrate:200-4-9600 +Step-Protocol-Baudrate:200-2-19200 +Step-Protocol-Baudrate:200-4-19200 +Step-Protocol-Baudrate:200-4096-19200 +Step-Protocol-Baudrate:250-1-9600 +Step-Protocol-Baudrate:250-2-9600 +Step-Protocol-Baudrate:250-4-9600 +Step-Protocol-Baudrate:250-2-19200 +Step-Protocol-Baudrate:250-4-19200 +Step-Protocol-Baudrate:250-4096-19200 +[Model][Advanced For HuaXin-SOUTH_CHCX] +Step-Protocol-Baudrate:125-1-4800 +Step-Protocol-Baudrate:125-2-4800 +Step-Protocol-Baudrate:125-4-4800 +Step-Protocol-Baudrate:125-256-4800 +Step-Protocol-Baudrate:250-1-9600 +Step-Protocol-Baudrate:250-2-9600 +Step-Protocol-Baudrate:250-4-9600 +Step-Protocol-Baudrate:250-256-9600 +Step-Protocol-Baudrate:250-256-19200 +Step-Protocol-Baudrate:250-4096-19200 +[Model][Advanced For HuaXin_SOUTH_ZHD_CHCX] +Step-Protocol-Baudrate:250-2-9600 +Step-Protocol-Baudrate:250-4-9600 +Step-Protocol-Baudrate:250-256-9600 +Step-Protocol-Baudrate:250-512-9600 +Step-Protocol-Baudrate:250-256-19200 +Step-Protocol-Baudrate:250-512-19200 +Step-Protocol-Baudrate:250-4096-19200 +[Model][Advanced For HuaXin_SOUTH_ZHD] +Step-Protocol-Baudrate:250-1-9600 +Step-Protocol-Baudrate:250-2-9600 +Step-Protocol-Baudrate:250-4-9600 +Step-Protocol-Baudrate:250-256-9600 +Step-Protocol-Baudrate:250-512-9600 +Step-Protocol-Baudrate:250-1-19200 +Step-Protocol-Baudrate:250-256-19200 +Step-Protocol-Baudrate:250-512-19200 +[Model][Features] +Size:19 +ID:1:RX +Range:450,470 +Baudrate:4800,9600,19200 +Stepper:125 +Protocol:1,2,4 +Power:NONE +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:0,0 +Sensitivity:0,0 +FEC:0,0 +Stepper:0,0 +CallSign:0,0 +ID:2:RXTX +Range:450,470 +Baudrate:9600 +Stepper:125 +Protocol:1,2,4,128 +Power:1,5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:0,0 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:0,0 +CallSign:0,0 +ID:3:Satel +Range:403,473 +Baudrate:4800,9600,19200 +Stepper:125,250 +Protocol:2,4,8,16 +Power:1,5,10 +[Model][Operations] +Frequency:1,1 +Baudrate:0,0 +Power:1,1 +Sensitivity:1,1 +FEC:1,1 +Stepper:1,1 +CallSign:1,1 +ID:4:LFS +Range:455,463 +Baudrate:9600 +Stepper:250 +Protocol:1 +Power:1,5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:0,0 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:0,0 +CallSign:0,0 +ID:5:RXTX-MOREBAUDS +Range:450,470 +Baudrate:4800,9600,19200 +Stepper:125 +Protocol:1,2,4 +Power:1,5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:0,0 +CallSign:0,0 +ID:6:LFS-MOREBAUDS +Range:455,463 +Baudrate:9600,19200 +Stepper:250 +Protocol:1 +Power:1,5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:0,0 +CallSign:0,0 +ID:7:LFS-Low +Range:412,422 +Baudrate:9600 +Stepper:250 +Protocol:1 +Power:1,5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:0,0 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:0,0 +CallSign:0,0 +ID:8:Satel-I80 +Range:403,473 +Baudrate:4800,9600,19200 +Stepper:125,250 +Protocol:2,4,8,16 +Power:1,2,5,10 +[Model][Operations] +Frequency:1,1 +Baudrate:1,0 +Power:1,1 +Sensitivity:1,1 +FEC:1,1 +Stepper:1,1 +CallSign:1,1 +ID:9:HX +Range:410,470 +Baudrate:9600,19200 +Stepper:250 +Protocol:1,2,4 +Power:5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:0,0 +CallSign:0,0 +ID:10:HX-EX +Range:410,470 +Baudrate:4800,9600,19200 +Stepper:125,250 +Protocol:1,2,4 +Power:5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:1,1 +CallSign:0,0 +ID:11:Satel-TR8 +Range:865,867 +Baudrate:19200 +Stepper:250 +Protocol:8 +Power:1,5,10 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:1,1 +Stepper:1,1 +CallSign:0,0 +ID:12:HX-EX2 +Range:410,470 +Baudrate:4800,9600,19200 +Stepper:125,250 +Protocol:2,4,256,512 +Power:5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:1,1 +CallSign:0,0 +ID:13:D352 +Range:410,470 +Baudrate:9600,19200 +Stepper:125,200,250 +Protocol:1,2,4 +Power:5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:1,1 +CallSign:0,0 +ID:14:HX_SOUTH +Range:410,470 +Baudrate:4800,9600,19200 +Stepper:125,250 +Protocol:1,2,4,256 +Power:5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:1,1 +CallSign:0,0 +ID:15:HX_865 +Range:1,8 +Baudrate:19200 +Stepper:125 +Protocol:1 +Power:5,10 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:1,1 +CallSign:0,0 +ID:16:D352_CHCX +Range:410,470 +Baudrate:9600,19200 +Stepper:125,200,250 +Protocol:1,2,4,4096 +Power:5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:1,1 +CallSign:0,0 +ID:17:HX_SOUTH_CHCX +Range:410,470 +Baudrate:4800,9600,19200 +Stepper:125,250 +Protocol:1,2,4,256,4096 +Power:5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:1,1 +CallSign:0,0 +ID:18:HX_SOUTH_ZHD_CHCX +Range:410,470 +Baudrate:9600,19200 +Stepper:125,250 +Protocol:2,4,256,512,4096 +Power:5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:1,1 +CallSign:0,0 +ID:19:HX_SOUTH_ZHD +Range:410,470 +Baudrate:9600,19200 +Stepper:125,250 +Protocol:1,2,4,256,512 +Power:5,10,20 +[Model][Operations] +Frequency:1,1 +Baudrate:1,1 +Power:1,1 +Sensitivity:0,0 +FEC:0,0 +Stepper:1,1 +CallSign:0,0 +[Group][NMEA] +[Model][Features] +Size:8 +ID:1 +Type:1,2,3,4,5,6,7,8,9,12,13,14,19,20 +Frequency:3,4,5,6,7,8,9,10,11 +ID:2 +Type:1,2,3,4,5,6,7,8,9,10,11,12 +Frequency:4,5,6,7,8,9,10,11 +ID:4 +Type:1,2,3,4,5,6,7,8,9,12,15,16 +Frequency:5,6,7,8 +ID:6 +Type:1,2,3,5,6,7,8,9,10,11 +Frequency:4,5,6,7,8,9,10,11 +ID:7 +Type:1,2,3,4,5,6,7,8,9,12,15,16 +Frequency:5,6,7,8,9,10,11 +ID:8 +Type:1,2,3,4,5,6,7,8,9,12,13,14,17,18,19,20,21,22,23,24,25 +Frequency:5,6,7,8,9,10 +ID:12 +Type:1,2,3,4,5,6,7,8,9,12,19 +Frequency:8,9,10,11 +ID:14 +Type:1,2,3,5,6,7,8,9,10,11 +Frequency:4,5,6,7,8,9,10,11 +[Group][Precision] +[Model][Features] +Size:5 +ID:1 +HP:0.2 +VP:0.2 +XP:0.2 +YP:0.2 +RMS:0.2 +Status:11 +DiffAge:-1 +ID:2 +HP:0.6 +VP:0.6 +XP:0.6 +YP:0.6 +RMS:0.6 +Status:-1 +DiffAge:5 +ID:3 +HP:0.6 +VP:0.6 +XP:0.6 +YP:0.6 +RMS:0.6 +Status:-1 +DiffAge:5 +ID:7 +HP:0.3 +VP:0.3 +XP:0.3 +YP:0.3 +RMS:0.3 +Status:11 +DiffAge:-1 +ID:8 +HP:0.2 +VP:0.2 +XP:0.2 +YP:0.2 +RMS:0.2 +Status:11 +DiffAge:-1 +[Group][EBubbleMatrix] +[Model][Features] +Size:4 +ID:1 +Type:-2 +Matrix:0,1,-1,0 +ID:2 +Type:-1 +Matrix:1,0,0,1 +ID:3 +Type:0 +Matrix:-1,0,0,1 +ID:4 +Type:1 +Matrix:-1,0,0,1 +[Group][StaticSampleFreq] +[Model][Features] +Size:4 +ID:1 +Type:0 +FreqList:7,8,9,10,11,12,15,16 +ID:2 +Type:1 +FreqList:4,5,6,7,8,9,10,11,12,15,16 +ID:3 +Type:2 +FreqList:6,8,9,10,11,12,15,16 +ID:4 +Type:3 +FreqList:8,9,10,11 +[Group][SmartGNSSPN] +[Model][Features] +Size:13 +ID:1 +Type:1 +Name:N72 +CalibrationType:1 +Main:72 +Sub:00,01,10 +ID:2 +Type:2 +Name:I80 +CalibrationType:1 +Main:80 +Sub:00,01 +ID:3 +Type:3 +Name:X10 +CalibrationType:1 +Main:80 +Sub:02,03 +ID:4 +Type:4 +Name:T8 +CalibrationType:1 +Main:80 +Sub:06,07 +ID:5 +Type:5 +Name:X9 +CalibrationType:1 +Main:80 +Sub:11,15 +ID:6 +Type:6 +Name:M6 +CalibrationType:2 +Main:80 +Sub:08 +ID:7 +Type:7 +Name:I70 +CalibrationType:1 +Main:80 +Sub:09,10,13 +ID:8 +Type:8 +Name:T7 +CalibrationType:1 +Main:80 +Sub:14 +ID:9 +Type:9 +Name:X360 +CalibrationType:1 +Main:36 +Sub: +ID:10 +Type:10 +Name:NX100 +CalibrationType:0 +Main:74 +Sub:12,24 +ID:11 +Type:11 +Name:NX101 +CalibrationType:0 +Main:75 +Sub: +ID:12 +Type:12 +Name:MC100 +CalibrationType:0 +Main:76 +Sub:00,01 +ID:13 +Type:13 +Name:NX200 +CalibrationType:0 +Main:77 +Sub: +[Group][SupportGNSSType] +[Model][SMARTGNSS] +Type:0 +MainBoard:0 +[Model][ARM] +Type:0 +MainBoard:0 +[Model][DIRECT] +Type:0 +MainBoard:0 \ No newline at end of file diff --git a/app/src/main/assets/network_error.png b/app/src/main/assets/network_error.png new file mode 100644 index 0000000000000000000000000000000000000000..c1fed830e8330b1bbf8636f8732b8e240f0bddc1 GIT binary patch literal 13792 zcmXwgbzD>5|Nk91(v6hfMma)|MjA(#Oa*D_1_9|*K?g{WmUsgL5eZ3YLsdGYuD%8hB`YNW05n>f7%ceN`|kxM1K-OZR^$Qz z0?@*!+z+ta3Z=-fP)og%Jw8gt-0n>lg~m|H!6BcR*25a!(xW~gZ2&`tbQVJmat=fF z`*&4XA|d9mmxhlS7`nX7I})Ev1kY=|q9c*0mdO`d0^&MIisa@mwok+P7ly6~%^My& z9+kh&+CnH=O!af#E|zb-UR24@D|J$Kz39{?>=&pP?xBEb8o1TZzy;d)<=?s(5lDmu z@F*A+1Oc9K+epKG5ld-*qI>Uj4FXk}xLo20N4VE@IM<&14jc$zg>w-{Xb7bC<@I!T zbDA_gL0=ua_1z^7XUqAo0Kut+1tUA=#dlletsCh-v!^ z+yW)wiRn7sl6+FC^_L#gQc+g6siBi5WW763%ts@?0~FLP35u zFWKe2q@!O>gy0rtrT5#gDt^=<2&&HnYGmUE~fl zfNzf%=b`)#Rf|jJ&&TX*E4gc1t5%dy)LYb&pWf6*6I{DqPFsr=Ts4IMpj&&P;}yAP zxshBH?vfN>BFHigMu?8fQ3A%uCB1BEPfqi;kW;Jd1E+FNAc9_RABrrF`||z!cWZij zdL7933taE_Z&`dFd&7fs8&WJVY-0{oia}yIsM{ApZT)T-dt{0rBGX~T?w}lRx zgxYMAui%O}qJM25)8|(*uTE~QBr7vw@MzqnZcJhLF9~X!V-juUu`pYAd&q#eBfY!3 z`(_U1A5oT>i(?~3`jOjhCookv zO>7%SU#+n6ix)5au5)oIF~f&}h#{Fiz5+7TB@WjnM0h9dZgyhvQv+@}bjo^2g6s*31ewz$IQ$BfF;f4<cwtSjHl z(>h+|^XD7sbS(h~)&~N>2VLl1$*N(+giAkeoex-tW+Bdr6v8jhQ_OBnX$F%zry09m zSfiRq;5mt5A-X+J0e=n;i#V5{gJP1 zZ*RBywts^#O}%zNv5*vydRZcI_`r^XK;8>(feLU7EUI8w?iePBiJDKfqTW!;$wGj? z_gaJyi{hBWv(*}HYS~vN2LM#symHFwci=)_qTo&mdrzQmo#}<`-F7^d|3o=DBy^~Z zf-Qm)x$XSGQ7u(OQW=l!L87wdA}t%vD1VA~N6pXAr$@D(SDOTv8<~*;7g8(qBN@vw z6`M`%nm!TxM9}^gzpa@laJ#li{``2@0RH}^#@EbyWfKeA?d=$a!Yatm%&jv&tZ9T( zxd@HQZuKD^zRJX%TI8TL$pG2Zj=#`U4yt*C<+BTiX+o z^A1h~$A(q+^H7l|mgBdVfA+H>gt8~k5QU^5XReB=491AXnMq-3BMlyHlYAm@1sTVo z*B6~b-1qvYHjmN+b9;`ezZl>TA0WHP3+;r&4A21Gp1f#jNm)=(kfK}AF!Y`sc&?^! zjS%tmSQHi(zGU~G^KzR@HxZyi%%RIAv$I;n^PgMMsfGwu5LL8ap7lK=r5f5Re{yP- zXl%9!?`EBN<9+!YScN!vIp>Spa&lH?>OlpnK&O-vH#fJNKBr68c8%xjnLcK9*Fp7w zkXaj@E8$2P#SvZ2yKkrg>-Vm8GfH$LD-eWr%Ac-u#>=!=;qp6HiTX%37U;Wc8?xCx`wgiB3iAa(dNcHiNPng zemB+DMz={hXdumQ8$my&@HE^Pix92pzaqKrLJLJsbF~qQ@V6=9r!5~>6;ytqfpx)t zGc6Cmq`_l89;~a|{_Z|vtLiBdU{5)Wm^N>~ZU7kSAbiYG(A+4svw%5YMAbv<7x};M zt~A}uUa7^O5dV@H+7R6^LIu48A&qId5tm2lM+V9@BG}cWo#@Ytr|Hwpw{PE0`*U=3 z;Yk^~yhUtQI-|Rs=Ptn-%=CUum`xeiJ7T)X_`UMd42gNO6O6xg5UTH?iV3T&<#m7W7!C zhD5GZPHpPQ51X;&SEdx(7qZG3RCJ+zNc9So*1lbi5OAjgZw%N&whWiaj(41reJQHCo#Q1 ztC;KM?yjiSL5+{`T~lyMQZ5Oj9&`TUXr9c@g=-8v{7ERMnHr(#V9?=P)C604ldy0-lkfh-U#!tWSh!^`Z& zh;i5r2@LgN$8z(IdZE{NwS9laW8pf6>Y#UYsysG(nmQfTM3H|>@J#@Gc*vIVhm=Rt zui|Z4pVi${{Bi{eA)HASQ#YaG`o`2@PMi|#RS1qA7HCqkUS2vB$*ET^9nSX14}M{& zoTJfQXQX#ev7&4M*z;uLqO2MS&4w*CJ8yIy|F+YQP!4*Cx~&*jb|q6?()R3R^=AX= zyuUa-63&quHJ^grkiy7!6-0I#CsY%6r6**fl{`j~i#N5<^flr$eEfgYWa2;ZEE*Z8 z(aKJZjCeh?vRbt8;tLcEyhqyGmnvxW_1m}8P1wRTyvHm4tx;J+1L{NRyW#I1p@-ZB z+hF8eUY?#JN;e#G zvEX@d#t-Z^Axfjy=X;!-Ob2OF=A%Vp&Yi8B=>=3(v)Z-f4OU>E!qxZvp)72DS6l2)b% zREq=hc4lfgr}y~ehS5^~@}pVcyV7%kKh9Pn+O2zN#$qB^p5=?s&hjo-!#hyB`5)iT z9AA)Sc)eI`tS)BICIxYD-FZ|l%iFvywPvRX+%|(M`|A~Mn|^@8$JU+Mez?y>pC)ok zUgq%mW)u79&6IIE0YR9*Y@TkWh435+nV zh;!oQSxxt*b%@5bVi*KJ=slyYF3Gx8OrEVn+#yb}F;EL_W}_b=(&08EKC=_RwDifj zU9w@i?0k&GPXh+0eT)TCn-zwa6RD+I-z$w2NU(2Z5i}_iC6TlurL&tE_nB?#{#L;X zR-g^eG>?50wsvX7>K091>pjK0{m3J9WnR&UiTaCb)QIt+Sn*h+G4`5iV9$9sbBI?O z>F$muw8i2)B`=0%+a;dO7nT10(li4H=db})FsQjFrwXN|&I+XD&O{W@6Y!I#EXExV zfxR5_jF7F*XSP@pORkR&m$%#Zk7dCF@3j}V_H@e74vqT(@4SlB6pqz8#LjP6h3^- z>4Y7L`MTrW+d`nFg}=ac?^t zsbYymbyOvyjqBD+iJB;Z;DC?MNP~-`=0x2E2yJn=Zu=aZB0u5$$wLmci-m4LmIbJ& z`OVpeCe$`=7Qb~V_azS}A$~@rpdckxAIxg`HtAodeS}^kJCtY;!L>iz_4bsA9a@s& z9)x??Mv%DIyoiE5-GhydTW8psvlcxU^5ls)xi8!jbbVO~He!li8F3asys3bZ#s7_j z1+VbxB>T-UA}(M4Qa2O&BP1N67ewm~GO7DUNtz(XEe# z$YY|M+2ad0#5x7MU%-|&4L7s1L|_PAtM-E-Iq^?Xac)hx30qQB*y8AqJPIU{MOcb} zz@YaQEx0pyaRJ3@{EaPdr5iZ9%0Daq#`YQWaI`Cf-N}Fyh`(nUGx6yv$b=iqsKw9f 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 + + 本政策仅适用于河南冰测科技有限公司的导线助手产品或服务。 最近更新日期:2023年9月8日。 + 本政策将帮助您了解以下内容: + 一、我们如何收集和使用您的用户信息 + 二、我们如何使用 Cookie 和同类技术 + 三、我们如何共享、转让、公开披露您的用户信息 + 四、我们如何保护您的用户信息 + 五、您的权利 + 六、您的用户信息如何储存及如何在全球范围转移 + 七、本政策如何更新 + 八、如何联系我们 + + 我们深知用户信息对您的重要性,并会尽全力保护您的用户信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的用户信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则等。同时,我们承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的用户信息。 + 请在使用我们的产品(或服务)前,仔细阅读并了解本隐私政策。 + + 一、我们如何收集和使用您的用户信息 + (一)您使用我司产品或服务过程中我们收集和使用的信息 + 我们仅会出于本政策所述的业务功能,收集和使用您的用户信息,收集用户信息的目的在于向您提供产品或服务,您有权自行选择是否提供该信息,但多数情况下,如果您不提供,我们可能无法向您提供相应的服务,也无法回应您遇到的问题: + 在您使用我们的服务时,允许我们收集您自行向我们提供的或为向您提供服务所必要的信息包括:账号密码信息、电子邮件地址、手机号码、设备信息、外接设备连接信息、设备信息(IMEI/MAC/Android ID/IDFA/OpenUDID/GUID/IP地址/SIM 卡 IMSI 信息等)、位置信息、网络身份标识信息、应用列表、剪切板、读写存储设备SD卡。 + 以下对我们用到的信息做详细说明: + 1.您的账号密码信息将被用来登录您的账户,保证您个人数据的安全,防止被其他用户盗用。 + 2.您的邮箱地址将被用来做为登录方式之一,也可以做为找回、重置账户密码的方式。 + 3.您的手机号将被用来作为登录方式之一,也可以用来作为找回、重置账户密码的方式。 + 4.您的设备信息将被用来优化软件的适配,比如手机的屏幕分辨率可以优化软件界面的布局、手机网络模式用来优化节约用户流量信息。 + 5.您的外接设备连接信息和外接设备状态将被用来优化软件与第三方设备的适配,比如外接gps、北斗定位设备时,可以通过设备型号,发送不同的通信指令,以便提高通讯的可靠性。 + 6.您的位置信息将被用来识别定位差分信息,我们的软件为了提高定位精度,采用的gps、北斗等卫星定位系统差分技术,此技术可以将定位精度提高到厘米级,但是此技术需要把用户的位置信息传送到差分服务提供商的服务器,以便获取合适的差分数据。同时,软件为了连接第三方gps、北斗设备,需要用蓝牙通讯,而蓝牙搜索时,安卓系统需要使用定位权限,因此,蓝牙搜索连接也会需要定位权限。 + 7.您的网络身份标识信息将被用来降低账号的异地登录、盗号等风险。 + 8.您的应用列表信息将被用来验证是否安装我们公司开发的其他软件,以便我司软件间的数据共享、调用。 + 9.您的剪切板信息将被用来在软件不同的界面间,快捷复制粘贴数据,提供您的工作效率。 + 10.读写存储SD卡权限将被用于读取CAD文件、读取用户要导入的文件、保存用户导出的私人数据、备份用户的私人数据。 + + 您提供的上述信息,将在您使用本服务期间持续授权我们使用。在您停止使用推送服务时,我们将停止使用并删除上述信息。 + 我们保证会依法对收集后的用户信息进行去标识化或匿名化处理,对于无法单独或者与其他信息结合识别自然人个人身份的信息,不属于法律意义上的个人信息。如果我们将非个人信息与其他信息结合识别到您的个人身份时,或者与您的个人信息结合使用时,我们会在结合使用期间,将此类信息作为您的个人信息按照本隐私政策对其进行处理和保护。 + 为了更好运营和改善我们的技术和服务,或出于商业策略的变化,当我们提供的产品或服务所需的用户信息收集、使用、处理超出上述范围或者要将收集到的用户信息用于本隐私政策未载明的其他用途,或当我们要将基于特定目的收集而来的信息用于其他目的时,我们会在获取用户信息后的合理期限内或处理用户信息前通知您,并获得您的授权同意。 + + (二)征得授权同意的例外 + 请您理解,根据法律法规及相关国家标准,以下情形中,我们收集和使用您的用户信息无需征得您的授权同意: + 1、与国家安全、国防安全直接相关的; + 2、与公共安全、公共卫生、重大公共利益直接相关的; + 3、与犯罪侦查、起诉、审判和判决执行等直接相关的; + 4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的; + 5、所收集的您的用户信息是您自行向社会公众公开的; + 6、从合法公开披露的信息中收集的您的用户信息,如合法的新闻报道、政府信息公开等渠道; + 7、根据您的要求签订或履行合同所必需的; + 8、用于维护软件及相关服务的安全稳定运行所必需的,例如发现、处置软件及相关服务的故障; + 9、 个人信息控制者为新闻单位且其在开展合法的新闻报道所必需的; + 10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的。 + 11、法律法规规定的其他情形。 + + 二、我们如何使用 Cookie 和同类技术 + (一)Cookie + 为确保网站正常运转,我们会在您的计算机或移动设备上存储名为 Cookie 的小数据文件。Cookie 通常包含标识符、站点名称以及一些号码和字符。借助于 Cookie,网站能够存储您的访问偏好数据。 + 我们不会将 Cookie 用于本政策所述目的之外的任何用途。您可根据自己的偏好管理或删除 Cookie。您可以清除计算机上保存的所有 Cookie,大部分网络浏览器都设有阻止Cookie 的功能。但如果您这么做,则需要在每一次访问我们的网站时亲自更改用户设置。 + + (二)网站信标和像素标签 + 除 Cookie 外,我们还会在网站上使用网站信标和像素标签等其他同类技术。例如,我们向您发送的电子邮件可能含有链接至我们网站内容的点击URL。 + 如果您点击该链接,我们则会跟踪此次点击,帮助我们了解您的产品或服务偏好并改善客户服务。网站信标通常是一种嵌入到网站或电子邮件中的透明图像。借助于电子邮件中的像素标签,我们能够获知电子邮件是否被打开。如果您不希望自己的活动以这种方式被追踪,则可以随时从我们的寄信名单中退订。 + + (三)Do Not Track(请勿追踪) + 很多网络浏览器均设有Do Not Track功能,该功能可向网站发布Do Not Track请求。目前,主要互联网标准组织尚未设立相关政策来规定网站应如何应对此类请求。但如果您的浏览器启用了 Do Not Track,那么我们的所有网站都会尊重您的选择。 + + 三、我们如何共享、转让、公开披露您的用户信息 + (一)共享 + 我们不会与其他的任何公司、组织和个人分享您的用户信息,但以下情况除外: + 1、在获取明确同意的情况下共享:获得您的明确同意后,我们会与其他方共享您的用户信息。 + 2、我们可能会根据法律法规规定,或按政府主管部门的强制性要求,对外共享您的用户信息。 + 3、与我们的关联公司共享:您的用户信息可能会与我们的关联公司共享。我们只会共享必要的用户信息,且受本隐私政策中所声明目的的约束。关联公司如要改变用户信息的处理目的,将再次征求您的授权同意。 + 4、与授权合作伙伴共享:仅为实现本政策中声明的目的,我们的某些服务将由授权合作伙伴提供。我们可能会与合作伙伴共享您的某些用户信息,以提供更好的客户服务和用户体验。我们仅会出于合法、正当、必要、特定、明确的目的共享您的用户信息,并且只会共享提供服务所必要的用户信息。为了更好运营和改善技术和服务,您同意我们和授权合作伙伴在符合相关法律法规的前提下可将收集的信息用于其他服务和用途。 + 以下列举了具体的授权合作伙伴,并提供了该第三方的隐私政策链接,我们建议您阅读该第三方的隐私政策: + + (一)统计服务供应商:由北京锐讯灵通科技有限公司提供统计技术服务,我们可能会收集您的设备信息(IMEI/MAC/Android ID/IDFA/OpenUDID/GUID/IP地址/SIM 卡 IMSI 信息等)提供给北京锐讯灵通科技有限公司,用于为您提供统计技术服务。详细内容请访问《友盟统计隐私政策》。友盟统计隐私政策链接:https://www.umeng.com/page/policy + (二)广告、媒体:我们可能会将收集到的信息共享给广告、媒体以及我们的其他授权合作伙伴,用于包括优化广告投放和提升营销效果等商业化用途。 + (三)推送服务供应商:由美味书签(北京)信息技术有限公司提供推送技术服务,我们可能会将您的设备平台、设备厂商、设备品牌、设备识别码等设备信息,应用列表信息、网络信息以及位置相关信息提供给美味书签(北京)信息技术有限公司,用于为您提供推送技术服务。 + 对我们与之共享用户信息的公司、组织和个人,我们会与其签署严格的保密协定,要求他们按照我们的说明、本隐私政策以及其他任何相关的保密和安全措施来处理用户信息。 + + (二)转让 + 我们不会将您的用户信息转让给任何公司、组织和个人,但以下情况除外: + 1、在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的用户信息; + 2、在涉及合并、收购或破产清算时,如涉及到用户信息转让,我们会再要求新的持有您用户信息的公司、组织继续受此隐私政策的约束,否则我们将要求该公司、组织重新向您征求授权同意。 + + (三)公开披露 + 我们仅会在以下情况下,公开披露您的用户信息: + 1、获得您明确同意后; + 2、基于法律的披露:在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的用户信息。 + + (四)共享、转让、公开披露信息时事先征得授权同意的例外 + 请您理解,根据法律法规及相关国家标准,以下情形中,我们共享、转让、公开披露您的用户信息无需征得您的授权同意: + 1、与国家安全、国防安全直接相关的; + 2、与公共安全、公共卫生、重大公共利益直接相关的; + 3、与犯罪侦查、起诉、审判和判决执行等直接相关的; + 4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的; + 5、您自行向社会公众公开的信息; + 6、从合法公开披露的信息中收集的,如合法的新闻报道、政府信息公开等渠道。 + + 四、我们如何保护您的用户信息 + (一)我们已使用符合业界标准的安全防护措施保护您提供的用户信息,防止数据遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的用户信息。例如,在您的浏览器与“服务”之间交换数据时受 SSL 加密保护;我们同时对网站提供https安全浏览方式;我们会使用加密技术确保数据的保密性;我们会使用受信赖的保护机制防止数据遭到恶意攻击;我们会部署访问控制机制,确保只有授权人员才可访问用户信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护用户信息重要性的认识。 + (二)我们会采取一切合理可行的措施,确保未收集无关的用户信息。我们只会在达成本政策所述目的所需的期限内保留您的用户信息,除非需要延长保留期或受到法律的允许。 + (三)互联网并非绝对安全的环境,而且电子邮件、即时通讯、及与其他用户的交流方式并未加密,我们强烈建议您不要通过此类方式发送用户信息。 + (四)互联网环境并非百分之百安全,我们将尽力确保您发送给我们的任何信息的安全性。即使我们做出了很大努力,采取了一切合理且必要的措施,仍然有可能无法杜绝您的用户信息被非法访问、被非法盗取,被非法篡改或毁坏,导致您的合法权益受损,请您理解信息网络的上述风险并自愿承担。 + (五)在不幸发生用户信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知用户信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报用户信息安全事件的处置情况。 + + 五、您的权利 + 按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们保障您对自己的用户信息行使以下权利: + (一)访问您的用户信息 + 您有权访问您的用户信息,法律法规规定的例外情况除外。如果您想行使数据访问权,可以通过以下方式自行访问:www.bingce.com + 如果您无法通过上述链接访问这些用户信息,您可以随时使用我们的 Web 表单联系,或发送电子邮件至liu@bingce.com。我们将在30天内回复您的访问请求。 + 对于您在使用我们的产品或服务过程中产生的其他用户信息,只要我们不需要过多投入,我们会向您提供。如果您想行使数据访问权,请发送电子邮件至liu@bingce.com。 + + (二)更正您的用户信息 + 当您发现我们处理的关于您的用户信息有错误时,您有权要求我们作出更正。您可以通过“(一)访问您的用户信息”中罗列的方式提出更正申请。 如果您无法通过上述链接更正这些用户信息,您可以随时使用我们的 Web 表单联系,或发送电子邮件至liu@bingce.com。我们将在30天内回复您的更正请求。 + + (三)删除您的用户信息 + 在以下情形中,您可以向我们提出删除用户信息的请求: + 1、如果我们处理用户信息的行为违反法律法规; + 2、如果我们收集、使用您的用户信息,却未征得您的同意; + 3、如果我们处理用户信息的行为违反了与您的约定; + 4、如果您不再使用我们的产品或服务,或您注销了账号; + 5、如果我们不再为您提供产品或服务。 + 我们将会根据您的删除请求进行评估,若满足相应规定,我们将会采取相应步骤进行处理。当您向我们提出删除请求时,我们可能会要求您进行身份验证,以保障账户的安全。当您从我们的服务中删除信息后,因为适用的法律和安全技术,我们可能不会立即从备份系统中删除相应的信息,我们将安全存储您的信息直到备份可以清除或实现匿名化。 + + (四)改变您授权同意的范围 + 每个业务功能需要一些基本的用户信息才能得以完成(见本政策“第一部分”)。对于用户信息的收集和使用,您可以随时给予或收回您的授权同意。您可以通过以下方式自行操作:在安卓系统设置应用管理中找到本应用,找到权限管理,可以打开或关闭某些权限。 + 当您收回同意后,我们将不再处理相应的用户信息。同时也请您注意,您撤销授权同意可能会导致某些后果,例如我们可能无法继续为您提供相应的服务或特定的功能,但您收回同意的决定,不会影响此前基于您的授权而开展的用户信息处理。 + + (五)用户信息主体注销账户 + 您随时可注销此前注册的账户,您可以通过以下方式操作:发送邮件到liu@bingce.com,我们将提供人工服务。在注销账户之后,我们将停止为您提供产品或服务并依据您的要求,删除或匿名化您的信息,法律法规另有规定的除外。这也将可能导致您失去对您账户中数据的访问权,请您谨慎操作。 + + (六)用户信息主体获取用户信息副本 + 您有权获取您的用户信息副本,您可以通过以下方式操作:发送邮件到liu@bingce.com,我们将提供人工服务。在技术可行的前提下,例如数据接口匹配,我们还可按您的要求,直接将您的用户信息副本传输给您指定的第三方。 + + (七)约束信息系统自动决策 + 在某些业务功能中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制作出决定。如果这些决定显著影响您的合法权益,您有权要求我们作出解释,我们也将提供适当的救济方式。 + + (八)响应您的上述请求 + 为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。 + 我们将在三十天内作出答复。如您不满意,还可以通过以下途径投诉:向有关部门投诉。对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情况收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际的请求,我们可能会予以拒绝。也请您理解,出于安全保障的考虑、相关法律法规的要求或技术上的限制,对于您的某些请求我们可能无法做出响应,例如以下情形: + 1、与用户信息控制者履行法律法规规定的义务相关的; + 2、与国家安全、国防安全直接相关的; + 3、与公共安全、公共卫生、重大公共利益直接相关的; + 4、与犯罪侦查、起诉、审判和执行判决等直接相关的; + 5、用户信息控制者有充分证据表明用户信息主体存在主观恶意或滥用权利的; + 6、出于维护用户信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的; + 7、响应用户信息主体的请求将导致用户信息主体或其他个人、组织的合法权益受到严重损害的; + 8、涉及商业秘密的。 + + 六、您的用户信息如何储存以及如何在全球范围转移 + 原则上,我们在中华人民共和国境内收集和产生的用户信息,将存储在中华人民共和国境内。我们只会在本政策所述目的和用途所需的期限内和法律法规规定的最短期限内保留您的用户信息,超出上述保留期间后,我们会根据适用法律法规的要求删除您的用户信息或匿名化处理。法律法规另有规定,或出于公共利益、科学历史研究等的目的,或您的另行授权同意的除外,我们可能需要较长时间保留相关数据。 + 由于我们通过遍布全球的资源和服务器提供产品或服务,这意味着,在获得您的授权同意后,您的用户信息可能会被转移到您使用产品或服务所在国家/地区的境外管辖区,或者受到来自这些管辖区的访问。 + 此类管辖区可能设有不同的数据保护法,甚至未设立相关法律。在此类情况下,我们会确保您的用户信息得到在中华人民共和国境内足够同等的保护。例如,我们会请求您对跨境转移用户信息的同意,或者在跨境数据转移之前实施数据去标识化等安全举措。 + + 七、本政策如何更新 + 我们的隐私政策可能变更。未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更。 + 对于重大变更,我们还会提供更为显著的通知。本政策所指的重大变更包括但不限于: + 1、我们的服务模式发生重大变化。如处理用户信息的目的、处理的用户信息类型、用户信息的使用方式等; + 2、我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等; + 3、用户信息共享、转让或公开披露的主要对象发生变化; + 4、您参与用户信息处理方面的权利及其行使方式发生重大变化; + 5、我们负责处理用户信息安全的责任部门、联络方式及投诉渠道发生变化时; + 6、用户信息安全影响评估报告表明存在高风险时。 + 我们还会将本政策的旧版本存档,供您查阅。 + + 八、如何联系我们 + 如果您对本隐私政策有任何疑问、意见或建议,通过以下方式与我们联系: + 电子邮件:liu@bingce.com + 电  话:13657190002 + 我们设立了用户信息保护专职部门,您可以通过以下方式与相关人员联系:liu@bingce.com + 一般情况下,我们将在三十天内回复。 + 如果您对我们的回复不满意,特别是我们的用户信息处理行为损害了您的合法权益,您还可以通过以下外部途径寻求解决方案:向有关部门投诉。 + \ No newline at end of file diff --git a/app/src/main/assets/privacyPolicy_en.xml b/app/src/main/assets/privacyPolicy_en.xml new file mode 100644 index 0000000..414dac4 --- /dev/null +++ b/app/src/main/assets/privacyPolicy_en.xml @@ -0,0 +1,45 @@ + + + This application respects and protects the personal privacy of all users of the service. In order to provide you with more accurate and personalized services, this application will use and disclose your personal information in accordance with the provisions of this privacy policy. However, this application will treat this information with a high degree of diligence and prudence. Except as otherwise provided in this Privacy Policy, this application will not disclose this information to third parties or provide it to third parties without your prior permission. This app will update this privacy policy from time to time. +When you agree to this application service use agreement, you are deemed to have agreed to the entire content of this privacy policy. This privacy policy is an integral part of this application service usage agreement. + +Scope of application +(a) when you register for this application account, the personal registration information you provided in accordance with the requirements of this application; +(b) +When you use this application web service or visit this application platform web page, this application automatically receives and records information on your browser and computer, including but not limited to your IP address, browser type, language used , Access date and time, software and hardware characteristic information, and web page records such as your requirements; +(c) User personal data obtained by this application from business partners through legal channels. +You understand and agree that the following information does not apply to this privacy policy: +(a) the keyword information you enter when using the search services provided by this application platform; +(b) relevant information and data collected by this application and released by you in this application, including but not limited to participation activities, transaction information and evaluation details; +(c) Violations of laws or violations of this application rule and the actions this application has taken against you. +2. Use of information +(a) This application will not provide, sell, rent, share or trade your personal information to any unrelated third party, unless you have obtained your permission in advance, or the third party and this application (including this application affiliate) alone or jointly To provide you with a service, and after the service has ended, it will be barred from access to all of this material, including its previous access. +(b) This application also does not allow any third party to collect, edit, sell or disseminate your personal information by any means. If any user of this application platform engages in the above activities, once found, this application has the right to immediately terminate the service agreement with that user. +(c) +For the purpose of serving users, this application may provide you with information that is of interest to you by using your personal information, including but not limited to sending you product and service information, or sharing information with this application partner so that they can send you Information about its products and services (the latter requires your prior consent). +3. Information disclosure +Under the following circumstances, this application will disclose your personal information in whole or in part according to your personal wishes or legal requirements: +(a) disclosure to third parties with your prior consent; +(b) in order to provide the products and services you have requested, your personal information must be shared with third parties; +(c) disclosure to third parties or administrative or judicial bodies in accordance with the relevant provisions of the law or the requirements of administrative or judicial bodies; +(d) if you have violated relevant Chinese laws, regulations or this application service agreement or related rules, you need to disclose it to a third party; +(e) If you are a qualified intellectual property complainant and have filed a complaint, you should disclose it to the respondent at the request of the respondent so that both parties can deal with possible disputes over rights; +(f) In a transaction created on the application platform, if any party to the transaction fulfills or partially fulfills the transaction obligations and requests for information disclosure, the application has the right to determine the necessary means to provide the user with the contact method of the counterparty Information to facilitate the completion of a transaction or the resolution of a dispute. +(g) Other disclosures that this application deems appropriate in accordance with laws, regulations or website policies. +4. Information storage and exchange +The information and data collected about you by this application will be stored on the server of this application and / or its affiliates. Such information and data may be transferred to your country, region or outside the country where the information and data are collected by this application and in Accessed, stored and displayed overseas. +5. Use of cookies +(a) If you do not refuse to accept cookies, this application will set or access cookies on your computer +So that you can log in or use the services or features of this application platform that rely on cookies. This application uses cookies to provide you with more thoughtful personalized services, including promotion services. +(b) +You have the right to choose to accept or decline cookies. You can refuse to accept cookies by modifying your browser settings. However, if you choose to decline cookies, you may not be able to log in or use the web services or features of this application that rely on cookies. +(c) The relevant information obtained through the cookies set by this application will apply this policy. +6. Information security +(a) +This application account has security protection functions, please keep your username and password information properly. This application will ensure that your information is not lost, misused and altered by security measures such as encrypting user passwords. Despite the aforementioned security measures, please also note that there are no "perfect security measures" on the information network. +(b) When using this application network service for online transactions, you must inevitably ask the counterparty or potential transaction pair +7. Changes to this privacy policy +(a) if we decide to change our privacy policy, we will post those changes in this policy, on our website, and where we deem appropriate, so that you understand how we collect and use your personal information and who can access it, And under what circumstances we will disclose this information. +(b) The company reserves the right to modify this policy at any time, so please check it frequently. If major changes are made to this policy, the company will notify through a website notification. +Party to disclose their personal information, such as contact information or postal address. Please protect your personal information and provide it to others only when necessary. If you find that your personal information has been leaked, especially the user name and password of this application, please contact the customer service of this application immediately so that this application can take corresponding measures. + \ No newline at end of file diff --git a/app/src/main/assets/service_default.html b/app/src/main/assets/service_default.html new file mode 100644 index 0000000..a5a2796 --- /dev/null +++ b/app/src/main/assets/service_default.html @@ -0,0 +1,51 @@ + + + + + + + + + +
+
+ +
点击刷新
+
+
+ + + \ No newline at end of file diff --git a/app/src/main/assets/supplierconfig.json b/app/src/main/assets/supplierconfig.json new file mode 100644 index 0000000..5f5f8e0 --- /dev/null +++ b/app/src/main/assets/supplierconfig.json @@ -0,0 +1,13 @@ +{ + "supplier": { + "vivo": { + "appid": "100215079" + }, + "xiaomi": { + }, + "huawei": { + }, + "oppo": { + } + } +} \ No newline at end of file diff --git a/app/src/main/assets/template_tolerance b/app/src/main/assets/template_tolerance new file mode 100644 index 0000000..0cc2af3 --- /dev/null +++ b/app/src/main/assets/template_tolerance @@ -0,0 +1,93 @@ +[{ + "createDate": "Jan 27, 2021 9:37:42 AM", + "hor2C": 5.0, + "horCycleDirect2CDifference": 5.0, + "horCyclesDirect2CDifference": 5.0, + "horCyclesDirectValueDifference": 5.0, + "horHalfReturnZeroDifference": 5.0, + "horReadDifference": 5.0, + "id": "20210127093742841174", + "isTemplate": true, + "name": "限差模板0", + "singleSurveyor": true, + "slopeCycleDistanceDifference": 5.0, + "slopeLensDistanceDifference": 5.0, + "slopeReadDifference": 5.0, + "surveyorCycleCount": 2, + "verCheckWhenAngle3": true, + "verCycleDirectIDifference": 5.0, + "verCyclesAngleDifference": 5.0, + "verCyclesIDifference": 5.0, + "verIDifference": 5.0, + "verReadDifference": 5.0 + }, + { + "createDate": "Jan 27, 2021 9:37:43 AM", + "hor2C": 5.0, + "horCycleDirect2CDifference": 5.0, + "horCyclesDirect2CDifference": 5.0, + "horCyclesDirectValueDifference": 5.0, + "horHalfReturnZeroDifference": 5.0, + "horReadDifference": 5.0, + "id": "20210127093743841174", + "isTemplate": true, + "name": "限差模板1", + "singleSurveyor": true, + "slopeCycleDistanceDifference": 5.0, + "slopeLensDistanceDifference": 5.0, + "slopeReadDifference": 5.0, + "surveyorCycleCount": 2, + "verCheckWhenAngle3": true, + "verCycleDirectIDifference": 5.0, + "verCyclesAngleDifference": 5.0, + "verCyclesIDifference": 5.0, + "verIDifference": 5.0, + "verReadDifference": 5.0 + }, + { + "createDate": "Jan 27, 2021 9:37:44 AM", + "hor2C": 5.0, + "horCycleDirect2CDifference": 5.0, + "horCyclesDirect2CDifference": 5.0, + "horCyclesDirectValueDifference": 5.0, + "horHalfReturnZeroDifference": 5.0, + "horReadDifference": 5.0, + "id": "20210127093744841174", + "isTemplate": true, + "name": "限差模板2", + "singleSurveyor": true, + "slopeCycleDistanceDifference": 5.0, + "slopeLensDistanceDifference": 5.0, + "slopeReadDifference": 5.0, + "surveyorCycleCount": 2, + "verCheckWhenAngle3": true, + "verCycleDirectIDifference": 5.0, + "verCyclesAngleDifference": 5.0, + "verCyclesIDifference": 5.0, + "verIDifference": 5.0, + "verReadDifference": 5.0 + }, + { + "createDate": "Jan 27, 2021 9:37:45 AM", + "hor2C": 5.0, + "horCycleDirect2CDifference": 5.0, + "horCyclesDirect2CDifference": 5.0, + "horCyclesDirectValueDifference": 5.0, + "horHalfReturnZeroDifference": 5.0, + "horReadDifference": 5.0, + "id": "20210127093745841174", + "isTemplate": true, + "name": "限差模板3", + "singleSurveyor": true, + "slopeCycleDistanceDifference": 5.0, + "slopeLensDistanceDifference": 5.0, + "slopeReadDifference": 5.0, + "surveyorCycleCount": 2, + "verCheckWhenAngle3": true, + "verCycleDirectIDifference": 5.0, + "verCyclesAngleDifference": 5.0, + "verCyclesIDifference": 5.0, + "verIDifference": 5.0, + "verReadDifference": 5.0 + } +] \ No newline at end of file diff --git a/app/src/main/assets/userAgreement.xml b/app/src/main/assets/userAgreement.xml new file mode 100644 index 0000000..519f577 --- /dev/null +++ b/app/src/main/assets/userAgreement.xml @@ -0,0 +1,117 @@ + + + 本协议是导线助手手机应用程序(以下简称导线助手或“本应用”)与应用使用人(以下简称“用户”或“您”)所达成的协议。为使用导线助手应用的服务,您应当阅读并遵守本《用户服务协议》(以下简称“本协议”)。请您使用本应用以前,务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款、管辖与法律适用条款,以及开通或使用某项服务的单独协议。限制、免责条款可能以黑体加粗或加下划线的形式提示您重点注意。 + 您使用本应用的服务即视为您已仔细阅读并充分了解前述协议的内容,并同意接受上述协议的约束。除非您已阅读并接受本协议所有条款,否则您无权使用本应用所提供的服务。 + 如果您未满18周岁,请在法定监护人的陪同下阅读本协议,并特别注意未成年人使用条款。 + 我们的产品会传输用户已安装应用的相关信息。在使用这些信息之前,我们会先获取用户的授权,经许 可后,才会进行下一步。我们不会将这些信息用于任何其它非法用途。 + 一、使用者非个人化信息 + 我们将通过您的IP地址来收集使用者非个人化的信息,例如您的操作系统的版本、运行环境、运营商等,以优化在您手机屏幕上显示的页面。通过收集上述信息,我们亦进行客流量统计,从而改进本应用的管理和服务。 + 这些无关个人身份的信息能帮助我们辨别导线助手最受欢迎的地区并确定我们推广活动的有效性。此外,我们也可能将这些信息披露给我们的客户,使他们知道点击他们广告的人数。 + 二、个人资料 + 当您在本用于进行用户注册登记、参加网上论坛等各种活动,或者在使用本应用特定服务时,本应用可能会通过注册表格等形式要求您提供一些个人资料。这些个人资料可能包括: + 个人识别资料:如姓名、性别、年龄、出生日期、身份证号码(或护照号码)、电话、通信地址、住址、电子邮件地址等; + 个人背景:如职业、教育程度、收入状况、家庭状况、征信记录等; + 个人经历:如个人职业经历、社会履历等。 + 特定情形下,需要您按照本应用的要求提供所需个人资料后才能继续使用本应用的全部或部分服务,请您务必按照要求提供个人资料。否则,可能无法继续 + 使用本应用的全部或部分服务。在前述情形下,本应用会提前向您提醒并说明。除非适用法律法规、政府机关、司法机关或者其他第三方对本应用作出强制要 + 求,本应用不会对您提供的信息进行实质审核,如果您提供的信息错误或者不准确,由此产生的责任由您自行承担。 + 请了解,在未经您同意及确认之前,本应用不会将您为参加本应用之特定活动所提供的资料利用于经您同意的用途以外的其它目的。惟有按下列第六条规定按照政府及法律要求披露时不在此限。 + 三、信息安全 + 本应用将对您所提供的资料进行严格的管理及保护,本应用将使用相应的技术,防止您的个人资料丢失、被盗用或遭篡改。但因计算机系统和网络技术的限制,本应用可能会因受到第三方的攻击或破坏,导致用户的个人信息被恶意篡改、盗取或泄露,本应用将采取合理措施防止类似事件的发生,并将配合国家机关和第三方对类似事件进行调查或提起必要的行动(包括但不限于诉讼等)。对于非因本应用过错原因而导致的信息安全问题,您同意给予谅解并豁免本应用可能承担的任何责任。 + 四、用户权利 + 您对于自己的个人资料享有以下的权利: + 随时查询及请求阅览; + 随时请求补充或更正; + 随时请求删除; + 请求停止电脑处理及利用。 + 五、限制利用原则 + 本应用惟在符合下列条件之一,方对收集之个人资料进行必要范围以外之使用: + 已取得您的书面同意; + 为免除您在生命、身体或财产方面之急迫危险; + 为防止他人权益之重大危害; + 为增进公共利益,且无损于您的重大利益。 + 六、披露个人资料 + 当政府机关依照法定程序要求本应用披露个人资料时,本应用将根据执法单位之要求或为公共安全之目的提供个人资料。在此情况下之任何披露,本应用均得免责。 + 七、Cookies + Cookies是指一种技术,当使用者使用没有Cookies装置的本应用时,本应用之服务器会自动发送Cookies至您的浏览器内,并存储到您的手机硬盘内, + 此Cookies便负责记录日后您访问本应用的种种活动、个人资料、浏览习惯、消费习惯甚至信用记录。 + 运用Cookies技术,本应用能够为您提供更加周到的服务,本应用将会运用Cookies追访您的喜好,从而向您提供感兴趣的信息资料或存储密码,以便您造访本应用时不必每次重复输入密码。 + 八、未成年人隐私权的保护 + 本应用将建立和维持合理的程序,以保护未成年人个人资料的保密性及安全性。本应用郑重声明:任何18岁以下的未成年人参加网上活动应事先 + 得到家长或其法定监护人(以下统称为“监护人”)的可经查证的同意。 + 监护人应该承担保护未成年人在网络环境下的隐私权的首要责任。 + 本应用收集未成年人的个人资料,仅为回复未成年人特定要求的目的,一经回复完毕即从记录中删除,而不会保留这些资料做进一步的利用。 + 未经监护人之同意,本应用将不会使用未成年人之个人资料,亦不会向任何第三方披露或传送可识别该未成年人的个人资料。本应用如收集监护人或未成年人的姓名或其它网络通讯资料之目的仅是为获得监护人同意,则在经过一段合理时间仍未获得同意时,将主动从记录中删除此类资料。 + 若经未成年人之监护人同意,本应用可对未成年人之个人资料进行收集,本应用将向监护人提供: + 审视自其子女或被监护人收集之资料的机会; + 拒绝其子女或被监护人的个人资料被进一步的收集或利用的机会; + 变更或删除其子女或被监护人个人资料的方式。 + 监护人有权拒绝本应用与其子女或被监护人做进一步的联络。 + 本应用收集未成年人的个人资料,这些资料只是单纯作为保护未成年人参与网络活动时的安全,而非是作为其它目的来利用。本应用保证不会要求未成年人提供额外的个人资料,以作为允许其参与网上活动的条件。 + 九、用户违法行为 + 您在使用本应用服务时须遵守法律法规,不得利用本应用服务从事任何违法违规行为,包括但不限于: + (1)发布、传送、传播、储存危害国家安全统一、破坏社会稳定、违反公序良俗、侮辱、诽谤、淫秽、暴力以及任何违反国家法律法规的内容; + (2)发布、传送、传播、储存侵害他人知识产权、商业秘密等合法权利的内容; + (3)虚构事实、隐瞒真相以误导、欺骗他人; + (4)发布、传送、传播广告信息及垃圾信息; + (5)其他法律法规禁止的行为。 + 如果您违反本条之约定,有权国家机关可能会对您提起诉讼、罚款或采取其他制裁措施,并要求本应用给予协助或支持,由此产生的责任均应当由您自行承担。造成损害的,您应依法予以赔偿,本应用不承担任何责任。 + 如果在您使用本应用服务时违反本条约定,本应用有权进行独立判断并采取技术手段予以删除、屏蔽或断开链接。同时,本应用有权视您的行为性质,采取包括但不限于暂停或终止服务,限制、冻结或终止注册账号等,追究法律责任等措施。 + 如果您违反本条约定,导致任何第三方损害的,您应当独立承担责任;导致本应用遭受损失的,您也应当一并赔偿。 + 十、遵守法律和监管政策 + 您在使用本服务过程中应当遵守当地相关的法律法规和监管政策,并尊重当地的道德和风俗习惯。如果您的行为违反了当地法律法规或道德风俗,您应当为此独立承担责任。 + 您应避免因使用本服务而使本应用卷入政治和公共事件,否则本应用有权暂停或终止对您的服务。 + 十一、合法传播和第三方投诉处理 + 您通过本服务发送或传播的内容(包括但不限于网页、文字、图片、音频、视频、图表等)均由您自行承担责任。 + 您发送或传播的内容应有合法来源,相关内容为您所有或您已获得权利人的授权。 + 您同意本应用可为履行本协议或提供本服务的目的而使用您发送或传播的内容。 + 如果本应用收到权利人通知,主张您发送或传播的内容侵犯其相关权利的,您同意本应用有权进行独立判断并采取删除、屏蔽或断开链接等措施。 + 您使用本服务时不得违反国家法律法规、侵害他人合法权益。您理解并同意,如您被他人投诉侵权或您投诉他人侵权,本应用有权将争议中相关方的主体、联系方式、 + 投诉相关内容等必要信息提供给其他争议方或相关部门,以便及时解决投诉纠纷,保护他人合法权益。 + 十二、免责 + 除上述第六条规定属免责外,下列情况时本应用亦不需承担任何责任: + 不可抗力或意外事件等风险因素,导致本应用服务发生中断。 + 由于您将用户密码告知他人或与他人共享注册账户,或者您操作不当而导致的任何损失; + 任何由于计算机问题、黑客攻击、计算机病毒侵入或发作、因政府管制而造成的暂时性关闭等影响网络正常经营之不可抗力而造成的个人资料泄露、丢失、被盗用或被篡改等; + 用户或本应用的电脑软件、系统、硬件和通信线路出现故障; + 本应用的网页上有与其他网站网页的链接,包括网页上的广告。本应用对其他任何网站的内容、隐私政策或运营,或经营这些网站的公司的行为概不负责。在向这些网与本应用链接的其他网站提供个人信息以前,请查阅它们的隐私政策。 + 用户通过非本应用授权的方式使用本服务; + 由于与本应用链接的其它网站所造成之个人资料泄露及由此而导致的任何法律争议。 + 由于用户使用第三方服务而导致的损失或产生的任何争议。其他本应用无法控制或合理预见的情形。 + 由于用户粗心、图纸错误、放样方法错误等个人原因或第三方原因导致的损失。 + 由于用户上传具有保密级别数据而导致的泄密行为 + 您理解并同意,在使用本服务的过程中,可能会遇到网络信息或其他用户行为带来的风险,本应用不对任何信息的真实性、适用性、合法性承担责任,也不对因侵权行为给您造成的损害负责。 + 十三、第三方服务 + 您在本应用平台上使用第三方提供的产品或服务时,除遵守本协议约定外,还应遵守第三方的用户协议。 + 您已知悉并了解,本应用平台上所链接或嵌入的第三方服务并非本应用提供,如果您对第三方服务有异议,可以直接与第三方联系,也可以向本应用反馈。本应用将协助您联系第三方并转达您的需求和意见。 + 您确认并同意,在您使用第三方服务时,除非适用法律有明确规定,您和第三方的纠纷应由您和第三方解决。根据适用法律的规定,本应用需要承担责任的,本应用和第三方对可能出现的纠纷在法律规定和约定的范围内各自承担责任。 + 十四、协议的生效与变更 + 您使用本应用的服务即视为您已阅读本协议并接受本协议的约束。 + 本应用有权在必要时修改本协议条款。您可以在相关服务页面查阅最新版本的协议条款。 + 本协议条款变更后,如果您继续使用本应用提供的软件或服务,即视为您已接受修改后的协议。如果您不接受修改后的协议,应当停止使用本应用提供的软件或服务。 + 十五、服务的变更、中断、终止 + 本应用可能会对服务内容进行变更,也可能会中断、中止或终止服务。您理解并同意,本应用有权自主决定经营策略。 + 在本应用发生合并、分立、收购、资产转让时,本应用可向第三方转让本服务下相关资产;本应用也可在单方通知您后,将本协议下部分或全部服务转交由第三方运营或履行。具体受让主体以本应用通知的为准。 + 如发生下列任何一种情形,本应用有权不经通知而中断或终止向您提供的服务: + (1)根据法律规定您应提交真实信息,而您提供的个人资料不真实、或与注册时信息不一致又未能提供合理证明; + (2)您违反相关法律法规或本协议的约定; + (3)按照法律规定或主管部门的要求; + (4)出于安全的原因或其他必要的情形。 + 您有责任自行备份存储在本服务中的数据。如果您的服务被终止,本应用可以从服务器上永久地删除您的数据,但法律法规另有规定的除外。服务终止后,本应用没有义务向您返还数据。 + 十六、管辖与法律适用 + 本协议的成立、生效、履行、解释及纠纷解决,适用中华人民共和国大陆地区法律(不包括冲突法)。 + 本协议签订地为中华人民共和国上海市静安区。 + 若您和本应用之间发生任何纠纷或争议,首先应友好协商解决;协商不成的,您同意将纠纷或争议提交本协议签订地(即中国郑州市)有管辖权的人民法院管辖。 + 本协议所有条款的标题仅为阅读方便,本身并无实际涵义,不能作为本协议涵义解释的依据。 + 本协议条款无论因何种原因部分无效或不可执行,其余条款仍有效,对双方具有约束力。 + 十七、激活许可 + 导线助手内部有两种激活形式,激活后可以使用部分限制功能 + 1.绑定手机硬件(主板)形式,软件里可以自助激活,或找客服人员索要,换手机或更换主板需要重新购买 + 2.按服务周期购买形式,供购买的服务周期分为月、季、半年、年,分别对应30天、90天、180天和365天。服务到期后,部分功能将无法使用,您可以选择再次购买一个服务周期。 + 本平台可能会对服务内容进行变更,也可能会中断、中止或终止服务。您理解并同意,本平台有权自主决定经营策略。 + 如果发生本平台未能在服务周期内提供应许内容的情况,您有权申请退还剩余服务周期对应的款项。 + 如您因发布广告等其他垃圾信息被注销账号,本平台将不对您购买的服务周期另做补偿。 + 如果因安卓系统等第三方更新导致导线助手无法识别手机硬件信息而导致用户无法继续使用付费项目的,导线助手有权停止服务。当用户降级系统或撤销更新,手机回到购买时状态时,导线助手应继续免费提供相应的服务。 + + 导线助手对以上条款保有最终解释权。 + \ No newline at end of file diff --git a/app/src/main/assets/userAgreement_en.xml b/app/src/main/assets/userAgreement_en.xml new file mode 100644 index 0000000..a911fda --- /dev/null +++ b/app/src/main/assets/userAgreement_en.xml @@ -0,0 +1,116 @@ + + + This agreement is an agreement reached between the surveyor's mobile application (hereinafter referred to as surveyor or "this application") and the application user (hereinafter referred to as "user" or "you"). In order to use the services of the Surveyor Application, you should read and abide by this User Service Agreement (hereinafter referred to as "this Agreement"). Before using this application, please read carefully and fully understand the content of each clause, especially the clauses of exemption or limitation of liability, the provisions of jurisdiction and law, and the separate agreement to open or use a service. Limitations and disclaimers may be highlighted in bold or underlined. +Your use of the services of this application shall be deemed that you have carefully read and fully understood the contents of the foregoing agreement, and agree to be bound by the foregoing agreement. Unless you have read and accepted all the terms of this agreement, you are not authorized to use the services provided by this application. +If you are under the age of 18, please read this agreement with your legal guardian and pay special attention to the terms of use for minors. +Our products transmit information about apps that users have installed. Before using this information, we will obtain authorization from the user, and then proceed to the next step after permission is obtained. We will not use this information for any other illegal purpose. +I. User non-personalized information +We will collect non-personalized information of users through your IP address, such as your operating system version, operating environment, operator, etc., to optimize the pages displayed on your mobile phone screen. By collecting the above information, we also perform passenger traffic statistics to improve the management and service of this application. +This non-personally identifiable information helps us identify the most popular areas for surveyors and determine the effectiveness of our promotional activities. In addition, we may disclose this information to our customers so that they know how many people click on their ads. +Personal data +When you are using this application for user registration, participating in online forums and other activities, or when using specific services of this application, this application may ask you to provide some personal information through registration forms and other forms. These personal data may include: +Personal identification information: such as name, gender, age, date of birth, ID number (or passport number), telephone, mailing address, residential address, email address, etc .; +Personal background: such as occupation, education, income status, family status, credit history, etc .; +Personal experience: such as personal professional experience, social resume, etc. +In certain situations, you need to provide the required personal information in accordance with the requirements of this application before you can continue to use all or part of the services of this application. Please be sure to provide personal information in accordance with the requirements. Otherwise, you may not be able to continue +Use all or part of the services of this application. In the aforementioned situation, this app will remind and explain to you in advance. Unless applicable laws and regulations, government agencies, judicial authorities, or other third parties mandate this application +Request, this application will not conduct a substantive review of the information you provide. If the information you provide is wrong or inaccurate, you will be responsible for the resulting responsibility. +Please understand that without your consent and confirmation, this app will not use the data you provide for participating in specific activities of this app for purposes other than those for which you have agreed. Except when the disclosure is required by the government and the law in accordance with Article 6 below. +Information security +This application will strictly manage and protect the information you provide. This application will use corresponding technology to prevent your personal data from being lost, stolen or tampered with. However, due to the limitations of computer systems and network technologies, this application may be attacked or damaged by third parties, resulting in the user's personal information being maliciously tampered with, stolen or leaked. This application will take reasonable measures to prevent similar incidents, and Will cooperate with national authorities and third parties to investigate similar matters or initiate necessary actions (including but not limited to litigation, etc.). For information security issues that are not caused by the fault of this application, you agree to understand and waive any responsibility that this application may assume. +User rights +You have the following rights regarding your personal data: +Enquiries and requests for viewing at any time; +Request supplements or corrections at any time; +Request deletion at any time; +Request to stop computer processing and use. +V. Restricted Use Principle +This application can only use the collected personal data beyond the necessary scope if it meets one of the following conditions: +Has obtained your written consent; +To relieve you of imminent danger in life, body or property; +To prevent major harm to the rights and interests of others; +To promote the public interest without prejudice to your major interests. +6. Disclosure of Personal Information +When government agencies require this application to disclose personal data in accordance with legal procedures, this application will provide personal data at the request of law enforcement agencies or for public safety purposes. Any disclosure in this case shall be exempt from this application. +7. Cookies +Cookies refer to a technology. When a user uses this application without a cookie device, the server of this application will automatically send cookies to your browser and store them on your mobile hard disk. +These cookies are responsible for recording your various activities, personal data, browsing habits, spending habits and even credit history of your future access to this application. +Using cookies technology, this application can provide you with more thoughtful services. This application will use cookies to follow your preferences, so as to provide you with interesting information or storage passwords so that you do not have to repeat each time you visit this application enter password. +Protection of the privacy of minors +This application will establish and maintain reasonable procedures to protect the confidentiality and security of minors' personal data. This application solemnly declares that any minor under 18 years of age should participate in online activities in advance +Obtain the verifiable consent of the parent or his legal guardian (collectively referred to as the "guardian"). +The guardian should bear the primary responsibility for protecting the privacy of minors in the online environment. +This application collects the personal data of minors for the purpose of responding to the specific requirements of the minors. Once the response is completed, it will be deleted from the records without retaining these data for further use. +Without the consent of the guardian, this application will not use the personal data of the minor, nor will it disclose or transmit to any third party personal data that can identify the minor. If this application collects the name of a guardian or a minor or other online communication materials for the sole purpose of obtaining the consent of the guardian, if no consent has been obtained after a reasonable period of time, such information will be actively deleted from the record. +With the consent of the guardian of the minor, this app can collect the personal data of the minor, and this app will provide the guardian with: +Opportunities to review information collected from their children or guardians; +Opportunities to deny the further collection or use of the personal data of their children or guardians; +How to change or delete personal information of their children or guardians. +The guardian has the right to refuse this application to make further contact with its children or ward. +This application collects personal data of minors. These data are only used to protect the safety of minors when they participate in online activities, and not for other purposes. This app guarantees that minors will not be required to provide additional personal information as a condition to allow them to participate in online activities. +Nine, user illegal behavior +You must abide by laws and regulations when using this application service, and you must not use this application service to engage in any illegal acts, including but not limited to: +(1) Publishing, transmitting, disseminating, and storing contents that endanger national security and unity, undermine social stability, violate public order and good customs, insult, defamation, obscenity, violence, and any content that violates national laws and regulations; +(2) Publishing, transmitting, disseminating, and storing content that infringes on the intellectual property rights, trade secrets, and other legal rights of others; +(3) Fictional facts, concealing the truth to mislead and deceive others; +(4) Publishing, transmitting, and disseminating advertising information and spam; +(5) Other acts prohibited by laws and regulations. +If you violate the provisions of this article, the competent state authority may file a lawsuit, fine or take other sanctions against you, and ask for assistance or support for this application, and the resulting responsibility should be borne by you. If it causes damage, you should compensate it according to law, and this application will not bear any responsibility. +If you violate this agreement when you use this application service, this application has the right to make independent judgment and take technical measures to delete, block or disconnect the link. At the same time, depending on the nature of your behavior, this application has the right to take measures including, but not limited to, suspending or terminating services, restricting, freezing, or terminating registered accounts, etc., and pursue legal responsibilities. +If you violate this agreement and cause damage to any third party, you shall be solely responsible; if you cause losses to this application, you shall also pay compensation. +X. Compliance with laws and regulatory policies +In using this service, you should abide by relevant local laws and regulations and regulatory policies, and respect local morals and customs. If your actions violate local laws and regulations or ethics, you are solely responsible for this. +You should avoid getting the app involved in political and public events as a result of using the service, otherwise the app has the right to suspend or terminate the service to you. +Eleven, legal dissemination and handling of third-party complaints +The content (including but not limited to web pages, text, pictures, audio, video, graphics, etc.) that you send or disseminate through this service is your responsibility. +The content you send or disseminate should be from a legitimate source, the content is owned by you or you have been authorized by the right holder. +You agree that this application may use the content you send or distribute for the purpose of fulfilling this agreement or providing this service. +If the app receives notification from the right holder that the content you sent or transmitted violates its related rights, you agree that the app has the right to make independent judgments and take measures such as removing, blocking or disconnecting the link. +When using this service, you must not violate national laws and regulations and infringe on the legal rights and interests of others. You understand and agree that if you are complained of infringement by others or you have complained of infringement by others, this app has the right to change the subject, contact information, +The necessary information such as the content of the complaint is provided to other dispute parties or relevant departments in order to resolve the complaint dispute in a timely manner and protect the legitimate rights and interests of others. +12. Disclaimer +In addition to the exemption provided in Article 6 above, this application does not need to bear any responsibility in the following situations: +Risk factors such as force majeure or accidents cause the application service to be interrupted. +Any loss caused by you telling your user password to others or sharing a registered account with others, or your improper operation; +Any personal data leakage, loss, theft or tampering caused by computer force, force majeure that affects the normal operation of the network due to computer problems, hacking attacks, computer virus intrusion or outbreak, temporary shutdown due to government control, etc. +The user or the application's computer software, system, hardware, and communication lines have failed; +The web pages of this application have links to the web pages of other websites, including advertisements on the web pages. This application is not responsible for the content, privacy policies, or operations of any other website, or the behavior of the company that operates those websites. Please review their privacy policies before providing personal information to these websites and other websites linked to this application. +Users use the service in ways not authorized by this application; +Personal data leakage caused by other websites linked to this application and any legal disputes arising therefrom. +Loss or any dispute arising from the use of third party services by the user. Other situations beyond the control of this application or reasonably foreseeable. +Loss due to personal care or user's carelessness, wrong drawing, wrong stakeout method, etc. +Leaks due to users uploading confidential data +You understand and agree that in the process of using this service, you may encounter risks brought by network information or other user behaviors. This application is not responsible for the authenticity, applicability, legality of any information, and is not responsible for infringement Liability for damage caused to you. +Thirteenth party services +When you use products or services provided by third parties on this application platform, in addition to complying with this agreement, you should also comply with the third party's user agreement. +You know and understand that the third-party services linked or embedded on this application platform are not provided by this application. If you have any objection to the third-party services, you can directly contact the third party or provide feedback to this application. This application will assist you in contacting third parties and communicating your needs and opinions. +You acknowledge and agree that when you use third-party services, unless you are clearly required by applicable law, your dispute with the third party shall be resolved by you and the third party. According to the provisions of applicable laws, if this application needs to bear responsibility, this application and the third party shall bear their own responsibility for possible disputes within the scope stipulated by law and agreement. +14. Effectiveness and changes of the agreement +Your use of the services of this application is deemed that you have read this agreement and are bound by this agreement. +This application reserves the right to modify the terms of this agreement if necessary. You can find the latest version of the agreement terms on the relevant service page. +After changing the terms of this agreement, if you continue to use the software or services provided by this application, you are deemed to have accepted the modified agreement. If you do not accept the modified agreement, you should stop using the software or services provided by this application. + 15. Change, Interruption and Termination of Services +This application may change the content of the service, and may also interrupt, suspend or terminate the service. You understand and agree that this application has the right to determine its own business strategy. +When the application merges, splits, acquires, or transfers assets, the application can transfer the relevant assets under the service to a third party; the application can also transfer some or all of the services under this agreement to a third party for operation after the unilateral notification Or fulfill. The specific transferee is subject to the notification in this application. +This app reserves the right to interrupt or terminate the services provided to you without notice if any of the following situations occur: +(1) According to the law, you should submit true information, and the personal information you provided is not true, or is inconsistent with the information at the time of registration, and fails to provide reasonable proof; +(2) you violate the relevant laws and regulations or the agreement of this agreement; +(3) In accordance with legal regulations or requirements of competent authorities; +(4) For security reasons or other necessary situations. +You are responsible for backing up the data stored in the Service yourself. If your service is terminated, this application may permanently delete your data from the server, unless otherwise provided by laws and regulations. After the service is terminated, the app is not obliged to return data to you. +16.Jurisdiction and application of law +The establishment, entry into force, performance, interpretation and dispute resolution of this agreement shall be governed by the laws of the People's Republic of China (excluding conflict of laws). +This agreement was signed in Zhengzhou, People's Republic of China. +If there is any dispute or dispute between you and this application, it should be settled through friendly negotiation first; if the negotiation fails, you agree to submit the dispute or dispute to the jurisdiction of the people's court in the place where this agreement is signed (ie Zhengzhou, China). +The headings of all the terms of this agreement are for convenience only. They have no actual meaning and cannot be used as a basis for interpreting the meaning of this agreement. +No matter what the terms of this agreement are partially invalid or unenforceable, the remaining terms are still valid and binding on both parties. +Seventeen, pay +Charge for some functions in surveyor +Binding mobile phone hardware (motherboard), and automatically generate an activation code after payment, or ask for customer service personnel, you need to pay for a new phone or motherboard +This platform may change the content of the service, and may also interrupt, suspend or terminate the service. You understand and agree that the platform has the right to independently determine its business strategy. +In the event that the platform fails to provide the promised content during the service period, you have the right to apply for a refund of the amount corresponding to the remaining service period. +If your account is cancelled due to other spam information such as advertising, this platform will not make additional compensation for the service cycle you purchased. +If a third-party update such as the Android system prevents the surveyor from recognizing the hardware information of the phone and the user cannot continue to use the paid item, the surveyor has the right to stop the service. When the user downgrades the system or cancels the update, and the phone returns to the state it was in, the surveyor should continue to provide corresponding services for free. + +Surveyors reserve the right of final interpretation. + \ No newline at end of file diff --git a/app/src/main/design.sketch b/app/src/main/design.sketch new file mode 100644 index 0000000000000000000000000000000000000000..244c413ccabc1a90584d7903b30705902af64586 GIT binary patch literal 1353649 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
sZl$gG|vj5%Eap> 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 z zB085?jZ74NYTNN(^nPb+cdrp0%(qrn7Uo08KHS~i+ueulKOEb;u^;Mts&Yv zSWy=xl)0TC%|P#Jcl6Ky^;@mbIqVLsu({Dej8V7HJ3{@(C*bpVXE@$Zd;jeFNi9D} zOV6sU><^r7mmSH{Z?qZhXP-Yc>|E;ix4-|^&d;uImjwZ$J6O@2Svmb5|NU>GCc3() z{_L81{pQx`C%)7hc5&u|1O%c5SHX_kV4$I6wj1|eyEFdzoww{)+H;G`^9zff=Z=T{ zLAOKX?}OeDg1t-RhA2b|gv~V;1UMUJ7>aeSgJEvG(TiW*jI5FR=?}NYecYd~z#81{ zmA8Mf;k@n4m%Z%f<)yHg4~rl>C`UW^2#D&~fGlkdP}^!BX8!&FxmDmrE!?L%2Rm&% zyf+v2GdEm5hhulEzI1w}IT-eFe~MgzA_zq)EQ)MPK-$u}dR~%FE>i$AE+)bV#xkq| z6Y-`Ttqrp7Ywz3&qJ{8i5ud;N;oKH zH-tYvLD@0y5vI3})gqi7W<+9Egf4zxMPs*>*St;<4bYOS)fzRdwpG_^4cz&(rVh$F zTxQ;!i{M6(W4O)CpR@7k3O_;q(E?nhY(hCf>d#q?pqnc=iaZJtRS~FHAkl=K=2Don zWqFeFWulaY7>>~ady7I3wk}j5Xgsc6MYv&2lo*Geau&~ykW*M0kuDm|6@nB~40ssJ zuOIfhSR8PDX+a_QV-evz3+Foh9xb=0)ag0ZX5}KVFV};)ZZDa~K15+~6}7eR>|3;& zKi3zl^#B~HlU`)#sn|TA^eg-SvPuXyqG9G+_W)S}G>gJt%EHj*uSB}E8@4O;mR2AF zQopmGb#B(|!&7S*UWV<3ZfAVZ!z!fRzdgh{sBjh#UzS7??sm{tJGWMQ>g>Ae<_k3p zY;Z@>r<+kGbP=!I7Kg$5s7g|uf84he%Rx3bj&alJ22q^0ZtZ31sMm`(&z@UeKIQl= zb!ttmt$E{oHO*GpWmq7-S)8Ca=)l^*l#)fph!d$<#+;?yIrDB|iS%?v%TZPK7ve6$ zn}iTJFddlH_0i7q2<#(^EBrK`7$n{ewFuRYCJe}#9!R$VC_bE5RU&6(TyGz!x8C0P z#kI|A2jgPywBKCB<5`SOIxdnuqHN;8kgkW)DuX~qpYB?+j^jZ)?pw>}pJ4a&PhL|$ z{Q0|V7?ewkostfOW9~sK@|PA?&})1B&7Jq&9qz|Xx3=U34dgWJU*J;=lU9`X;GEKo zO(gP`W@NpWXb63t{BM&y%CO!zyESVl+~@B zJtoH+w>IOrkDf8np$Do_Mz|lscPF8vS$w_jPA6Q6k}~}9+qYkSe-~FIt);aMLObHQ zm^e&g`jt}ak3Wv4b>K_x)qG@)iD1G0Ec>sH4@1Trfs4S*&x2aF zd)VDWm4D};*%tM$-oajXZ|kx1XHt9;l{I3@VM2|x03!rs4kB&x@KA*TfjzeU%NzTf zoq61qZElQeUfqutK&_h*;$ocH@nY6{vUTd&FI{};g++Gj@;*3`E&u_(C+_2l@?R&Rv-$-~lsJ)ieBu9xbzlQv&`V(I+isnu0=Zeiid`ojK! z>h{XR?(ojmoif6a6l9gZwmNtEO#A$~=CbZL@AcFxmq)L@y>aI-OPpruMSvial1#EP z8A7Vbv?fHMMA6eT5`9dcp`}KwP`h|_Pj>fVg3;sJ;2R!bpl%M;=AhNd(GLpVyqPUr z4AR{a(b3JG+D?{7MY)?5zj#0O&(;q2-1*b${l3~66TiaWOUl=-je>K*Zf96O-?%nb zci<|Duv;RW@73M<4ZJv<^KV0S$|1060-qx5-wcgBAM_IT;OP_4x6RP*?5dkf>JFTG z>54vNfp9^+v8&?nlHCrw!z}{itk;UQCA*s`N*Jg0gOSAldih;-3Bkp(+D+73soG1u zy^)o>{?FdQ!b+W9QG2<1C+E6PXGehe^K0sCO`TcBNrSpNQ2p3H>{~TLixMcE{syzh zE>;ng!mr_7m*q#sa)l~GSWZa76`^2haXHsiETa|Q`w>B2=?`^$MZr+ThrRLkyT1C9 zcKY0<#S2TP^0r7huHNXr{`Py9-x;-@`R1J8c9BhthHy`hoo>DK6?Jiu4x(=EsbRlo z)qT%b`?>nTD|hyCqK^2o6zM~DKcp83OwqT4wI=M@af=3gR4N)_LLFb=1ZPu)~i~{Zc z4z9(|@SQwxEv(wGgmY1)b3_F_lDH{oK@c7xCswT#2mzZgr9~YukSk{aSu*y_XcBhGcs$4S32;P00)S@gnbkTIlA*}St3h0V=q{p ze16P6DQjMoGvQynV&E zfKMYjv7I8}92K}9q;$wmnYhpegVGbbFC^2_=*O`(=LUh9N5H!9KOqm8l>-t7A7AY2 zU{a43HS<8_6g4P@HJfpWY@gM)=*0yg9dTOPw0bQEPN6mMR|jrgR9YFD7;&a~J>5Tx zDPL~~0m~pOy6if(m-f53`CnwqbFLA^{X;iTnxQx9?zd_YyEeQTA0(*I%4#mNoHMrC z2~I_EM>yKGtx-_-_T%Irx9$1$y|Imd(72l~S?O{ySjsx-_H|sa?2bl>*R)%w%I2xv z#Mx!F_alPVk9#<4p?1t^OmwU!qHM*+CbP)V#38e`K3GV^-ZjUMdx29E+#scRbP;Nz ztmRpt*A`janS_OQ)Zg>1R_E{_Pm)Hx&K@Nz1g=$T3ro8L*;%Pl$|JH)$utF{Li8^^ zjSI!Vf*VHY^tS+(+tZ>6HRf0~%vN&3vt{l$>)2M-uJ;c1u@7j6 z!Ca$>75XSCv0*@mO9%o9z7RX`&6%!M%iSz#Ie6>ZT|aehdv9n*^Ri`*kwhdzA?e}Ybi3_#YenB0 z=5w{Bx#i`ncQ(Sg`7JajgD7!=T`V)gmTd)2=|Z?L!{~?{uqAO?>?(IkI+BCJ?7-0@ggfWSGXj?ryS+$GNu)0o7`r z>TcQ25NkjMUln&>ZMat-Z)M+p`mu9o&#XU&|1H@T?iCUngi5R|5gHG_Sxj9j;t@8e zB|fHl@5Y_CZtcB#1G{Ip!t&+qT&;@2F$jwt3Qf|DH3Ry~q0poDc8E8f(?6SvBWXHEU|^gEqBg zYjYx>b$59kX}z6jV(->E;l;sqoCMuCT`3aEQBp%i#3d!~0&{Pu7I@WQjI-B)T4)Fq z0Loc$_MN}XX=~E?>wRIny@Sd=>#I`iI=8f@uL!*B-S*UJ6|`h=9;cAx4mLfWZR~Jj zS7P%%*pZW~uoACrowsXkDmfZI~eDWtQe{%cWJfokL9NwYp>T6}DQ@Lp+C>GlENa z!xZ6k;G0R5mndosyf%!!70d|*-0qLQ)&7+EdaELV8WoozDyp)Hkblhb@Fk4s2#KC z(J`E!%9FV&Gr8_J5I!Dm&kfLOlP??dfx@!9;Rt}G-(dd&J{Z~on%io#EpEPa*KG}w z=pg6AEQI+0nJrQ6I4umLhzZ$!S_K`?h^M6yhi2l{uD6e8)CI9{mr4YPvDJy(f>S=0 zOr@kzZ64)2M%YlO4MB*uR!G*L@$Ajh#0iapfj>|Q;pg1#XbKUbGfzGO1Yv?iBSP{L>Isg6qOMPa7@co7>@-nd(YfZck%3KSv4#k3~&ubN97PJ&TP`3yr zipdzghEt$iW%u0}q|>)XI@7)cV9SF+u#HSFqC(p!G(rJGb!KZ_E#e9@PYTtqGko9o zJoutlxWgejh(qm8M4iX_eS6zY|5I@K%ESkf0Q|?l_J1T z8?s)&3zZx&dWRVRkk-J@loacfE|KDe@VU4Q%E^5nK+~$P-Am?IdGyIZ0`^Ex7HDda%2A ztO`|FRWH{%fF{F;LoeMYrvL(p-;a;r2lAGL0lgYMxX$)>!eY;zfhG>W$-bNawp!Xe zCAyR)_T)O8axHIm^M#eO<47NNA%=nd)!Qr`&t`M)+45x|8Y~Y1=QLwK;H^CD&)}^@ zTk%Nl(9$G7(B&z7L-UYkf8D0Au{M6Na2$n%m?(nIl_DXcq@=txjgAvyKc)|rve>|5w!=}gF3{!hs3eyO`tyDsfI+Fst;^HUp58~bPsshfQ-{ka!h=Vn z`A`K-b=SZra%u#scCqi<$+@-9phb?3PQ*E$br|nhOo$sfZ4DmGs`yJX;{D~|67kj? z4I&d(W%5MVg3h%_cgA9TM-D{uTIXw7M3*Vr3j-xb07jbgHUi-^>;dB$*Fch%Ur4V; z!F{Ug)4S_#)1$L>m&cX8w-+LqbLqz8XnzwY2F#rzDJ6X=8fT%Dw=V+Cm=Sio_vno* z=8`C3UC0nB(4=Q-3CD-1HI&d?s9i)=8aOzz6B(S!w@2X6n%UBW-dU05aZ#F0E<&-f z@LMUclVNwmn_9;>R#s=$^TEx|j6DyJnQ(0Z2RU}9_x=O&&l-PsANmxlskt9>r`ts= zddx(au)D4}!g69W7jNVa!YR^&N#5Zsjhrw*x)dNLQu+C)CB~9TO+QRD;n0}*xJHt) zf8S}7l#Dx{^%X7Um?M_7GA~3(veJkEBs1ww#Ke0PJym52Zma5(2Bb}ya`$Ona4XZS z3hN|BF~o?|+r&hjJt3QLe}Q&<&K#OPaY(4I#k%8gUgWj4ru zFNwiJWWrE}OE<3Yhl9lB=I;4Yja~2E)Mj5yr}1UWE8A@lNmUHV^RsdilUf2JvxBz` zg*5z6Er7$;-AWO&#I1^M+1i%f=Zsr1)bGdnZ;QBUqJ~aNxZ>Wj?KATH$*VLsH;7yy z%H(eKqkgn@ZG6w9Z!M9q7lPzcpN4J8d3j=j_afEEOp&F)VZC1Fa( z3oJnWuBClKJD?m*LG;iv9Tcq^rj2`p;-Hv|4wW+}2WQY@Fl!yxP&dogQRf)UDei2f zY4$v;zr-o!=H4G#_;|1`31HUFi1M!T6!fd0ln7Y#16K zoKH8vJow`x6c*AGMl!w)JgPhcb>cwSD0NQ`1hhPesUko#(i{y5X}Q&)3Xwf^ub*SA zG;zNnPVAZ@QfqNnFePwC^4hWE)PF3+`rw$}izus|YcG=4XC0kfNTD6p<156q47)^f zoV~B%+ucR1_WRh+@DefVBR~n(nfn|w_0i3Uh(=mA87-+-z#*umot)p2OpGK629Gc& zV#^iNGE`}Bsx?rWlB=LKAk7yb_9tzx0F^4$ZBKT-m!v*6n}ia7J?r2==uah5?0lh+ zy{5&L!1>)B>1@I8oaA{I30ri6c7lU30)`5RakK(^7*b3t7_#RA@FcwPgx7hwN)wA} z)qsRBlXxvMILw_{vAbL&lH1nFpGea6M7Jk1caPV|??m-g^*fkZmqv73ZB$}z>xit( zUKQioH%Mt%(H4ZuUROK2^fQOE{^D3_5Zj7IUSHRm_*f|n-b7B4?v7hR=Q%N^#Aiz4 z(f(nazAwFaX~N)i2_9$|Uj3GjtgY>BgpdH&d4-x^doW5;4irA;NQf`*(vEm7bGg01t zLFrXKTX_ZW%`kr3?meAq4Bq>cUFK3cJKp7ZPmGmJASr;LOqa(`P*u;q#l5so6&9f6OW2HkYU|Q@vs#m|K6tDWN~<8_KXWF2?9^Q9uk64nkfZ`k}s(?o6l> zi!hB*qBztLz9f#Srt3+N}>~T5~J-_>7V`lsx`Lgni83YA-Ubwr{z_rNtx5bR_l&&%jur}6^+ zs~3!-b|hex95jAWeEaUT*iES>;ULzV@Ay=yWW_mFgZEac0CBs;0=Wga`?KQ|qSE`R zzanih5|`$Z+{-n6y;HXE3SmE8b1TeZKB4~j=I9~r9#)){?6<;CvUC#k0sfDtsR=0d zEVXhsM@YKUNL88(#{`)KG|H7)aWHPi7nz- z?>QA*)Lt?(S4__%+V4f5lHXg2v`Zy9IO9-eg*M6@W_>Ce;7L=9S;)cs)J647Fj0SS zWBIy=Zh(g-JntRVC1AxWd%GN}$b1(o`u%z#Zyqzs^!#oIh>pj9rG5j5!8NlDW&phK znL-EyyB7V##OuYX`(&Cmwv-!_biW1J)$ARt5J&WAdp#xCO@XA7w7pWUTas%(9&Jo- zN+i!lzuPTVIId+CXY!PNuHDbwEr=oiR8V2Ri-{>t%c9(g~8j@Hi7$uQ}Gd@NZkF)vXq2bsOI$CXTc28RcT z`1|!C7!t-AZj~ox5DDH+%?cp04+AGfwPPXy|MbA$>oxzFh5316lzzKTdf3v%-pMCZ zRzY-GV-0YUbKX-2@Y`W- zd%n~6&Qtai^_k4c^9$=sXA@nAWH0jn7!Ytc*9oa572`a8{SEQ`(~+xVk@;YyAhf6R z_0KS&-JIWr_sP-A_2GrAgX86Hwdy1P#l^5T|LA={cS7PL)eLyp1=s7qH67-Ln01a^ z-_KT7$`SIJ7ku|OK1qdrx3{w0!`X8DZt-eqavdLEtW+@yL4F9Y%*s6c;4urz%p_E` z8+FW$im+q9NvsVnVQ;x#wD^B4(m%s8*O*P)o)B^P(r*GthF2dAb3cxD9~D1-x}G3g z%h>Z}@3=zpzwPXn6}w!x*||R&$+Gwm)x+r&i(vIt*NR`mEAMTa;ml*Dx+7Vkbb$gh z*F_QSi)kKog**Jg0#x|y?*>?3jn%jRS@dd@!|%L-tVt*N7%%!%UUKipG536)u%lkDri$#DDy#@-8TNGkqhZZo~m%(DypRBI3CQZzu33{Nhhs z?@PgSzyN^(0t4hi>`UuQq!x7sfhdMvLShzEESzRYEuuNCzh$rs56S;+6!wbMx8xCt z{`-NeIASSFR{5xTaZq%xShQ$?1Ug``a$DqW4-s=H56)S6E-wH8IAPQVX?9*txg-(M;J;{(A>_ zivy34gZ0-3c>E!L1lJePldTw3M&2cRIgF>))eg4;ixypZzU?zHZ%;y^TXGP_m%>*6 zLZ)hQe?SB|&#PhDVfqEFq^wj3TS-Oq97i@B;KtS`h*aaNzux~tE7Q8SK?&>#o|moI zAMATTPZ*&dMiO$sjS+J>M(D0vpD08a0iV7a9ABU3n$&%S(wT+I>F{+WN6K0>ocB(Z zy!}vTq?P-Z=kH%LjQUncF)c55Czu7Dq%giRzy?|Xti02eH3i$6Eo+yi%;gp-MU+_< zlb-I=#{E^yH}A)fLJEUK`$h*c%h=G>C)pVmnEq*wA!O+)#NMKTT@WAImkS|zH$}(* zUxBR#!5#*x9Ml>3r)IRFF4#Rc(O)^8xog!3g@clp-9hP$uer>M zlRBn7&Aj_7w}0eo7*Vgw4~z5yDudK@ zqKQ-vhB;^f6P1r7MLc6?N%ie;6bGor9}7dj=h8=a|LJx786EgL;>{^q_7lazAxc&% zAS4S9U44Wra8X{RYJ+1(p?vagur!yl=xeH1ZNy*f`_l=DSNcs5nPj`LVG!0C<0RhSHfYDDjA#D2tL%^|i}V zQ=Idk1L13BZ?KbpiN_Zcyb%~8N8fW@uDoCwg5XWVh!`6KzFGVtb-$@R)9qiDZf%R?ri<5RIy0uG z;Lo#=Y|b*%Sw?_nsSNwJNG_n)m9q~Eh4?l)6OMW-eN&+@zrdb@_Jzsk##r8C&$J_QlHR+slrBNEFIz(SzA#!MpaXADKVjiZwq4Z_ zryOFUH`UIQARwXM0o~?Ntjgh_(5id+T?P2Fy0bt}l4qNrg+WQKpMc`{S z#Ps9~BXGRLgBdOeOFPQ^|FQ`4Uo677(!F-7{9s!2`GM}QmY$`J_2Q?o8@bO!O71tIDKq40PF%+l`6>qCu-l?i6In_4om%*x zNLPo>pr6O&=Vto)p>;zT8vY~ypAZ<` zw7UYGRR~j>Iz;4BZk`DeiCe<5heY=emQSl=;{ojSwCrT1o1nwihMO1tgxKsOe5<@7 zo57Uy9GK>WYBTuvC|7!aN9nzK`K^e5uD7AfY2h+^ zz^Y2*k5b3!D>2<@uFNPK*CL%I;H7VA3H33C@I#j9rYT$?$sw8i8HbmAU5Eo+(Am7^ z@h+!8^PuKy_4E*0b-&~-l)iC%(6*maKlj^fv$TZ|c%D>2U{qc8q@b&fj0Pw3J@qN~(BKsz*pCb9QCj<2 zh^I!xo~a3(f1&d4!uL@*|8}=(3Zabp7ZLyKQ4hhlFNtSd|F0f@o2i^%q%t|k z7(f~Q?~ncSrs&|^U;O`9KfQy$BaO3$QO5rFqpvqHP-nqmfc~38zcit*1!i6(DgN=_ zkG@9GSCYp64|@MSGZVP){iWkt38_GTVf$bGz9!`LUxfW_{{IvDV%Y!d99m1Gj{9%n z>FJOB@w}DPfcJ)YJAjV&#d*)|j47r6U~vyRtRMJ}GEB;ih~)+{RgL^R7a@TR+kZ*M zSF;E3ual&IX7B$)tTPe5(7^fsQpcUrOq^sg^8bXI-|LSayG#ZA!mMmtYjrZCQLmoI z5faA8QR3OT;{5-Zvk9=@v>C`xpbi6kT-1p8;$th6sYC;^zc7_%37`!8-!SzP1OKju z!jTZp3Ap8vh!@1y$Kc~4NKOAx_`7LI5i&vk7t~~tzArkJL`n|k=YAUkNObk@-4BX= zfm!#BjfM3;PGaeEUjWo`6I32Tc~%n9Q^`oRKNoo7%Kttxcnmtl znSC|T%k`0u{O1i3aODcTPM@9ZeH5@^+bySj8Q*f%J-Yi;kgU};?38s-T`v>iwRpe# z?6ua$Qvq%JwhTY&Tr*r)%{6!}c9C>-VL5BR;k7&a_MRK`#xiDb!}c$g9?b6#z8|>G zAVNt`LQl0`B9IMGz*n)u{nuAzOnDLwAH)WKq(~F}S33@}*b+J{r}#mmXV$?r+;6Pg+<<5De?> zKnEe3RTgG#Lzq5Cz~ee^G>OWgk1;3pzDny{8y8}3W9#LQM=UROfF!`4Sj^1wDD4X@ zyriUCbU-&rf~NgZ%TL)NM|`RuPFXg1i~CtRshLM}?OHczJib56iCc<5l&#}yw5E!Z zZQeg(Ow>qc&7E!v8UPLWU0!DgVcD`!Qcls|UbhM@bSQ`KHp04AjZFU8&l{qDG+otA zp6n;hZ<#Gmjo}of++QsztLTpTAI(~(?yFUwwsr05tJjG3&#AO&A2jP!NZ45&KU2VQ zg%pg{!yE^BwYTH1yM=!G`&PG1G5802s+OAd?UWuAmR*eMnnj5Hya3#}}3WoM5AVjQ{kab|DpzSCg$?d;R`O4^CIJ<@D&;oH^Av zFPDh;a*Vp04VoGiq2$hmeS{nZq&x3es9)Dp?mtFp-YUI`G~kHpDw(dJcx6mE8=s`f zhL7Yba)FN7kR&Vgv$kmP7rUygzKq~EfN!Dzxs9X4Dz&n85+)z~{nw2_Tq9~|jn2L# zc3Wb!&l%cHeh9uzkXq^)8UUdBwNaguf{#*OxL5d`%cbBNA$ZDlwH1gOmreypwzuDr zLr79qO`H>Fq-Oq%&rnht9m$l%cV;@V*ezou?=(puG0fuhDbh=zl9hFpgGyC2j36BM zdUm@B@f}+&@>T$QUI0!gr;e=%mtRkMh~G@Gv%4{7l0kR&X8kR*1R`E#qQ5scu$Iq44C7HgvgfVcg7m0_mTv01U@k`%V6CxdRxJSG* z@*@+N{3x49n`+^qWG~-^(Dpu#SmW`(p#U7-xR_uh)l<-#9)a+R`CdbVe*h~q0wInB zYEhxi<>-Gjw?9j=W1T77rue=e>rDV$o1anSF#^}g zLjIX2?1Vh_C*p~Ta`d7LKQLKWs=)vy z=2z0ZP>H-ta6d3c$eeuLZnT!qR&eYVv|Tsnh4A2%GGmXuvDspXGqux6f1hGAF>!31 z%E1+`5r57LbP@N}{JEo#mQkLn%c}^7Bl@9#)%*3@pc(z2cp|veCwGy8(3u~&iBvF3 zaeE?c&S&-vILXZojm@qOhTZcPUzzGs7THxp{X}@dQ3njFoVT^4nMe-bn@mdkCFcb% z7pgL%7S`5IR;=0253AAD9|$04g}6>a)iuG0sM4$6Pb-UC@d3r6kAjG@J5frOyy( z`uZvkwQmY5Bp!ES967YbCdOo@P2_XOqAFDk=An)IA2JbF_YdJs%G+EDYf|&2vz4H3>1IHg#=)fVL1jdZuH9(6W^^KKd|%mTmdV8nK@4sna4phG zT++1U$~xAsqp-D~cDWPbj!V2(+QKTb`W|TpMR19y^O=1z;9`5h1Z4mXSzmb1eN8$j zed>_n$0us``=CD;mMR!Y=25-A)=&~8__PzgdI{@R3cd*h?8b@(x3sQ*y8N*g{6Eb69+SONS+H-PZbLf^q)MbdrI27x_JURxkiMY z6A_ty+a8m)nQ$*cf9?;kqBmi7NbsY?qE#*b)cmL{>7U#<(Ai?lLJcz9uTE-{-FX>( z0GB{3DqxBM&Wm^OmCfRDmNa|mgSHyG$KjGN*_Y7R6JZ(+UM8>$kx>pT!glw&oQG~n zUe&Mm&yN(dFp4ouVu~Y_m#55!MV;;BQI-qKC+Q%#Yv7UEHTqSy&n3%)!!+bTw!-5S z!)EJx*AHC~daQyONi(v?Lv}B#uuN0GVs&aw?oTjC}O2Z&vizGr=86yO_ z6@FweA{tGCqOmbi9NLfES1MJL@8JMdc_YO3qtK_0TiJ=zf+%JGbT7Kx05wFIRX?rJ zi99H7TePF!=%y-!Oc9HTrmM*4A5#F>-?LvGb5Czo_TgTH)%Q}+dvvD9Jwgv;NZ8G) zB2Ko3pi+xQQ;;W?k0N-&(?-3FwaKz!Wzm20eI+P*@$)02BTL@R+ldb*zpAQAqX57K z46o2BizcS-XymmYV^rdhsH|{tyvcRk|Dmkh?Mx1q1ptXz8jW{G~;T=t#F z4>fPtAuH>7?qNDgAHtWChihHqTY*xh0Za~?1q5+8gzKZb8bB`U&jj>)2 z-i#akp@%k;#GKTyX-exG2U$88$?u{AsU$s(!^L>LATPwmx8Fo)4+A$A$uWV3-4&~S zqr4INfIdDH_vScA6q>)%;4X@fj0GFKzG4#{wRh@ zY2XN<&#~f1evEezJ20#d*w)7{ia)@C)GpRiHv<1wl(5M~q4p zPRuk8nWUD2uaAZ&PfvzWGsUt#A1j&DnOizpvC&zrhf5GOit+?MhnYC3^%sJT$Bl@u zlya9qQV>=l@AQN+SI~~V4Dr^FFYix7QBhms+k;wd{T5UYiG-@knWF3CWmnC(Xbqm{ zz#;v5Jz|egR_n&a$#Nsc&-YLR_GEbJ9nNkNEI-W)pcj)*ChGAw*acP&2IF5N^x~=m z8dr6M56mp;7R>777UbC%?3Hof3nNrUwBX#ML23lZ{g?_BmT&(41hGj3B)UP1Kha`a ze0+~gJy>a4D8@fOY$Q->VNzic?ptungRLGS>2AECT?%>%{b0May0L<};)gsjpD&vE z9Mah*sod|Bf{yMEo<@z$U<5i(9mt(QrmdSd3<`{Y1B^U z1=AsV|NBHPhS&32y2S#VfhBdFOT!s~$dMsxXxbTr&;b!m%bjg{+E?vBI@Ch`(+wJ2 ziCc1M_I#7#b7$dpS|XVB&m#|cMyOH!c~$d)fWbFf&1~<@#U|18P#w z0hK~@2F0%)!-88Z!PxojnyoYAaZ1Ri(%+zgDoK<&I|iY^YCYc#iR)pft!X5Ic0>A! zXBcarV)fE#woT(JxOKQbZE#jyUx~_!z;@Z>VRVjm017jn23->FWzi7Fwr`>7j4|RS z?;J{Bsmz2CLN;~2B9#A~OPeLn;P^WQ3*>rmFWasVgajt8U?$+(wy(khaDDkC@zq4F zZ*bA%+4~q;M>U_^UUr1NQFhj*9o`$1I=6Ba*U}tU*pgpT z{PEd@siy1W`F?t+#HZl#6)wY1r)@-g@y)}tkf)Q82JwM>#vTnyeZ-`a2$MKK2QvQi zh2P!kws>VZVsrhh+w)fqy6L2+9;ZM!9)=YL7-s1GD9%@+3tw~4*~oE;MP_1E`{s=T z`7*cim~Q*i9CJ*~In4Y%?)@mNlN;Uv_S+ zoYR^!Wk!-!Kxbny-TOlW|MPCAkK2B`i+hk0czP^q_+V_6g*aRnK#X2)YhY~4$VebD z>3W)@w5+-|XdiN9*R@nUp2sg2%Z*N0-re>6#9uSp+X_)%HF7t1y4e!kyMQq`80|$R zJA2R1DISVKB4SSNm4|y5-S`-T6>XEJcZugEK6hj{QLuZ zw(jc*vV}yMqLjsP4IN!q^V5dP^~D6Y3*6((Z{%QsD)r!rIMy||h-?lAWaK1ijvr$d z1n6`F0{T?HAwtxS<&*Me)qXqL5jU_80d&$_nC2UIHIziz^0AKDD9ljZEJ!;`DTrMC zg|pIBWoMe=(HzXtR#i0BV26tc8)$loYmq_oG^2<5`yaF()}Be*@irI_h@7k?f~ra3 zzVRgO5iOT;09!!jRw97;i7*zj~Zn+rtE(%fjd6uxLKzH-;` z;=9WuJfa4(=39Y{X}eyjB?$*nMI48pafP``rlPIeI#L~2z7vOh7ut<_P6J>)PKZ7J z{O#vPPG#3tVi0UHS*C;Pxa`=HbM$(x(~2@t5o)9h7Vs4h_%AEk*0exw`or|kp|X@p ztxDkfw#ezQ4Zy4;;%Q2yf#9)z9#Dk84iI$60sWHN91^O0k)HOzNrO0c^@$~j+sT>R zyytcp?cwPIx~Adw*k@ak;V57SK2b+fxN(k*uGNDq7SRO6%rX zF+HZ$i|igHLr zjAL;&S>No{tOP1O!!)+1bA%#KDIc*gtvZ1UKyyfpO-ewoyhw1ACLj!xtX(l5K%<>* zsjH>hN*s!86lc*?{IPI*a-#l9-a8Yc+wJLP%1&kZGmHCiFUWzO_m+gsabU`>@K|wA z%}8q)O_$S9xnB<_K6CL1#3FYtO6%QK(d!e}>Dj%8T~F|Iajou>i*n(G631j~2O5Jv zY=J|eiA1?duFOu%jhZu9@q4GJM&am<5#7txQ4+`P;Ts# zb(f804ztGWG+j02L2-+(-_leG^^*t;wz!|F4?N1@VIn zHY>E~do-wBXvvEeOFgQZIex9ykM5$KLX6o>h9)avs+|N;73fm1ZJIy>G|}LF&X(m} zVh|E)sP@e=_k+8)?v}0x)6Zel1<7hi-r}&pOlmuHp`MJc>EEzamLe{6p z=(}-jguCzeBQ`xvyz2-H=`x2XrQSPjz&GDUp+9%vH$A_kykKG)nZ7DPL~8X1gUd2h zth_%JqDP~$yP@M$=m7w0luyYxcgTT?XlJx6eWkOlZcPiP4}gdBHnI63x)7Cu?tl6D z{NT~joNxbo;pSGJeazy#eFeKhbZ--DV4{faCeoUJP+*e-bC(RpW#OC9hu9p9A?M<#T=`4wpaK|4B5dIy zcIk_&d*hz8!rh)yOEgBp&TNw49?<7{bIXyLcWtJ4{gk)0tMHk=iHeZB0G8wFP|3{N z6cK@6+wZ3x=G(6FUK}_c_gt`P#Kv*X$)D}tu#yw-g2|O}6Jq{Ri##PEj$oylr~I>e zZJnGTor0~F`sGb$+8P#ay55@(eO@(t`Co=>8X~%DKgRF9y*+AFb+tQd^B-zV^a-2G z*@iY<_Yy%tRZ~Z#XxQ#TppBh~u1T<6T(iXlTm@cZwP3_GAF68*`!+|FhK4-yNy@v#25FGubfd`TVgwrN))?_+V zn)Uh|m)&l_icIx!{K;&{i&P8N67(Cwm{K;T;3pag)FfwU+Mt0`yOx`)hZ_vWQ=Z$8@hJHXjEKQu5xr3r-#Ua9D&1h?U|*kx=Ax z3W?FSWZoBxBA{|MV0&q(%bZX;ritld+!Y?79w%)?ZBzCiLyB^ry`uRW9ZgJl+Yhaq zk?|wLR@we}gH(=9OXqpAWUzsHDCj#JFE<+Z?Md+0lFcgAYrT_F-486vxg?&}7ctFT zb}oD5lS{V&y?#iGVHm%*n6MR{Jqawo6Ig^7Si2bi(t&N(EdRWx=l$q&Ko9svsF%)- zq7vKYDEfY{>$Cm&3gA|?`EBQZ4yfh;iJf9F&)!*Cs~=jr0dI0wh2d``*6T%<2gR3% zxm8Bu0QlP^-S4bPzSeX*ns~{xc&=i3ojBBkgPQcfYj$H%$o&<_ArL?*0EMUwE>G6JNG z<0k=+8s#awp!T8-p;gJp(?Sztx{^`8q`Rz}6KTg{8wjfx)E^-<0 zjRwx7&n;SvD4*sB#srGRm-$I)Pem@WVZ(VQCg4r)zHCeC9Q266(fO!M*=JYt(O^k% z&wI*!2{H7K!9-OiPpx~!Qnt&ypmtQ!-%z%bb8%R>$J%=&L=yM-zApSE8-?)%dO+oY zS{-@)W6i2asit{BJtS;nStOwuhbQ`550^Ze+;7;r>K%@Geu2hq zO6LN2@a+O@YBl&gs*=E@T^0+#b1`&5v=Eo>}pjN`Uoi(_0znU^ z6yDySL8u_oINMlWG?;3u|N|K@l1{rfTHEVx-HG(?4178gH=fw70Ev zUObDd$eFvhboH@r+G(9cVtCh1Cy@_khX(gc{-$yWnx>31EkQO~Pm8@Op_jZK>t_I9 z&VE~k`F;{XlaQ0qdN9+jjx^`WDzgscVHI-qo-{U(wo7UpL2+!?;QHdr2V%_uPAp_Y zC}A-hSIOOP2U_Smfn`Gpl}lj&5ji9AaoMr5tUW485=idWb(deoThJTsfn{>7+ zvb4N5O;KjP$CbN$tQ098H6yKb4h67{Rz#;9Mr{bxuFEWHSPk#l#YYbT7)X7+6jnlI zr&b1FKrtcUkj+)r6H*6u*7~07ent)zC$(O8ElPc*m%Z?i5oqwd$f~|CH%;cTnl2t* z=hbPc>i8q;^YH3P?1%Y?$iGNJ+68%U8A5OLde~&!lx{x1M4T=an>9CQlzqPb*?ft9 zoGD^0BS<*2;q7KR!TIfdn*8Nj^&xc1NaQz`1l)jJ4fNsnR=PgKZ;*h~=k+WIv>XoX zVo5_1>dB#6x`Jc}M)ZI-sG*z`l0O9{rcQi|j6f)FBtiw_^U6k$$9VL;K=65HMI^Vc z#XG{K0Rva&x%OA0XWab9OV2P10kIz7V8CQ?SsVs7EkP@rv@v)}+zQLvIy2<8kVK!Nn zJV-;(IQ_g$dH;7Kl*j{ljW%xkL=kfeTu9wObRZFm9ZY2S2467;d1ny&7_2Xmd*&er zczK(5RL@esHMExt+dZL9-BDPbh8`k3PbTmnrpa%DWs5vV(-LziSXD-ccEkx-U&-I}AAgWZA<*`_j(6Ma@qj_uqX?@w-g zJZxJJ)1|E3mo}$rOmM_}POO64IB&j1UA_gMmgRixjbf+NR8IWqzlt)`{we}8*Eg!M z1`Sa+L)!dWdSrB++qB@I3~U$Tp+h)(=g*;Bpm6=mLjYyYi@nNNe{Ylp{QM&955jT} zWt^}_Us`TiP#ESk9y6+>I_QYxIMHvDn$?`g9Zq(q5bo}e9T$lo)cH;iimk;HEUDbT zUMCt`LPVtcu}s~xmYVva4KPqU&5<<UA+{LN?AKujPf_>aI^v z{0_PW!{NvW71LT?SXpwg#-T##j-4An6`tEMg5Q8WtdpXioAVAyBKs`bt-!b5&j{#S^Eib#h zP>>vpw6o2fnEnOY;)4JAy=4B8?Q?#to5Snk_(Pn=Gwf4djgv5SP&?9Ia32=|i&Mc) z?sd6i@l~bu_gj)FnzEDwgOyodw5PeUQ@8z#ErYvdMG71|ZnBX4vGX8{?>f&zoXB+U z%2|f`oNTM!PGq?r{j}k8Fh}1jdadAiVV_5B4gg#e{|!mXmP;JvfoRw;G+GIQozSkL z--P}yQ0jr&l${!MMi?H9eB0WB{k&~1njP$+N=d&iIueSzq7fkig>TD47)H5qx+b!> zlPPx{!`&6LUkTH>QHX|rjkzsf%aKFLV_jgXJmFh_cW|H)0qum3I|M$j#bwgDkjpOx z#i~!yF&tcDPMjUlsRm023HdXVu9$?4Qh8`>_Kuc~cK24*P4mU~ip8&R(le!r(?JVu zse&sjRvPO|xClG%p>lfK3Giix)6(sY2Z{;Js_g?z)8U6jQbCjsdcTu4kojIGYd5{5 zR(KN)|C`6bLP+<`2}uxLgVR30oXSAgD_4OjPY5k?*fD2l!zOX&VJy1EIm4!x1nO;B zny=!C^J6V@#Tr^y$)3Tjzlzpzsn0{Q1LD!hSaw{cEPkTbLI~!Z>poAAqkkT-54tS> zg1N9f8T#=)#_waP#eG{+)4dw~7D4?d77-4(%UzOl)7`@5a#&NO9rclEV8MGGZXk1G z)Wfe<&x-LHDvUS`7vfToWg}G+*SWH5H>Rq0V_{<(zti8XGl$HH7vpYGyHnOhO8c>U z09_i{jZB=Tj>>*jwfX|(!t+;NwA>P892D}T%FQCfsD+-?5i!GHx9|Tou^>OCv6r_EP0)019@ax4%ZvoW;MuF&^n7b*wnhjdxl$F zG8u?abQG<34*P3Q=%uGMmkp>-Q&U(4gIMZ2k+kB|0nV8F4)7$38FPQ>(b3Al@Q*Y` zC^UDE-cyfJAI0adEV@99F&5J3*pR)Z2i6_1Y*Dl6LcyS*IT z1N}NImw!S!1%Kg|*7_lQyNR^x*+L3~${3vr10fpdypc#YJh&|{HI%8fSW%g+iA)O! z0Ol_jp^aqBWE2n=Zaj@#OUi9ql3@37X0GObjmouVEeJ5;zZb0wA8_Y$bF1{$5uJSF zJY2S^^n8>snB}{@@p}o`9IJ0Fsi)QawWtZa3JX2cu#B$`TwE;NB=wqnm`^P}OfhR0 zx82kyDM_w^w>-m-;h)NEjFF6U-JYDJumdB@QNCY*5u(xkd@prZ8eG$S&FU@F*}zJ3 z_y<3nKq!mTY2ni5pdc>BA+lb;us}6<1%ICW=beGB>&;sCEA~$sFo@g&_uT6Hxkp_* zE&k9|OX@V$ZqNPEpBl?8Ih?Z^IzLce-^}klHb0tjHlo2VUATFjc_qo9?BMZ-Sv4_G z^ZDbM6|KQ$iQ<&C9)z836SblJUnqzAWRp!9;o4M?GI>I`Ku4&LRpt%LF*W|M4ucPS z{akZpFI2dnHZ*qP#S_U79;kKm)L1xaq4`PbTpf_rMvnK-OeQ)c(74uZ0D++QjrCR_9eW>Por0&cEjxvQTExs=uQrgmSiS#TG z%Q@K2=W_v<{1o36ZcqL|^p_QkZFW>@>;{FldZLl-P!%rMIy)$v*ED%f&;Oz79k?qC zyJpdJk`6nzI<{@wwrx8*HaoU$t7F^g*v5|S^Z4$3{`rzxUXY(ThK_UkG$BzM>5^ocaaOv%lb-LY2X@8v-XB3Nw2 zzfFU_QkGY(8@pV=oK{KTIFj%ID>pnla_3d0ue^tUoNMcRMyz|wIou{JcknfE4eJ5^ z3?q&cS_a1b0r{e=O!?1!xg7!FU6={r1Nlgc-UBz>fV-S;3M6+8KYGFos_^zs8^%vR zYNGksU}c(HpSu+~_2X#-*lQbefk?YzW;Y<#)VL+(bHVN;N7r+I9-vq zMJU%=oXK!=a!G>B4MaokN=0O_0AYqZwB*M(1SGOgU%>e!M3vO0A>78h&CP&n6z6G} zjzGoxRvcgGZ@~$Q?V%Q{**_7K?QTcA1?eNx?#&|D_Qaccc0KEc;~(0{$lS8so<+54T=gH-SC zdeooR$5oR6dtN%Cz81gU>7>Q=hX2|dDw>5nqIzwg%tpP=^$C`)EI7~b-R&>irxg6y7jg(9TQ8_`PYxI_Y{EA5R+?nJV6rgO zmnHb??#AW!I9;I-f!$PH1+}por|Esg=3rP)>o{he0WR zQ$sf+HX+C@hNRN>d9nj1$jP^>=VjPg_P%s*x3x^qwTcCy%bS(1RgAO-KE0%qLOmuR zb?1|v4%FV{aB~zobCiDtG|irF{GC0 zao1`;sr~lVxBa}nZ}_a3;}aaMFi&*4Kwu9oudh~l%8J@1a(XO5@8(!L}UwA_8V z-7jFtwZ2Zxj{$&*?Q`v~4}|1nDj#!Wy6w#6j@9vX`QP_nTYfjqA?^Q8ACw!{S{GyK zE9^g>FDTgH3Z*h+*&BdU|1vw4KV$7XUCoW}8s+iRtru;Qc>#HRUsrgae%q)p1ah!*VMb8%ap5o!^`g-G^G1YS#P#KE{wmPw{2>Et{DJE7;mu% zH%3TSTC%)sSP@jLT}NUAU961uZiq*6d~5Ri*UuR&)=k5Mtww+s?osw1J2Aj>q^gw@ zGYU+j&fmqz##6o$e~@$Xz1eh_&l9N)k$ep~owr;bhLSI}-RXQ@7j98X&1P_sn;)|~ zfQzl}c2$@6cT&|yMoFnGXvs=~KX)&LlZ5au@vA{Mq#+#F&TNW;dnIgTcbBGJ#F?!_ z6a(@jn5&5HNaVTV7xr=6S)I!w^2A?PNBGFXetkqA?DAU@iSdVV$3iQhA9u&9Iy59J zgDQ7L2g`pFcB!_@`I}Od2Fi}Ji<3?LKN53%N@eKVw-!= zl<~)mz>4=}!u=~7K|0PPFj6pXzIiT2jHQ(RJ1%m2aD0-(S-R-TT*+K{m=>meKx6mm z1|3HU4XJoD$tkP-nq)7GvbQOq5_CQ)Bhjl^E2dlv*`d0oT9viTy|JuoF&(p}$KmtY zWU5B%(Mi;=S%KeEd+4CNBV)V6xd!bESg0(nyJ%f;e6)~C^RV@kb)AX~qGR=9x%++a zw&!aRLxKjYmqn)%+3fM75}1kcv@{vCCS(g~>nqnxd0s}#+6ab;P#Uyg5pSOBL0+Dk48{RiBsD$GPJbIMF&#EeoWi zM&+7F@G_^s{NN?WqM4cDb2fW%l!)vjx8n^SXr%e=;3@5M)_e(QeIzTv5T1isL9EX< z6dQIUgQE!2GpR&*I6(1}O#@)dWvRM5YH zwZi?OXWO5=3E0MegDeZLgL<-`{GD7C%R}2h5@rQ=ZM243_CvTZFh74!c?^brn#x0k zVdWU2NiKQ{lE``<%Ld~;_6e&9#arirU9XhYmP3UY*2`&)xjmEb?&_>{JNKA!$?n$+eht5;YF2<%o7#QU=k)C<@x+MP zI;H04AW6k)i`Um{2+d~sLNoAu@;m(kFctCOCPzjvApMVVS zjEO1aBV~OVdNVu?9G>1;ihOFW<@?hxqYnQHWG+2>uz8Aks_E)kMaWF7zkI2=T+?#5 z0No>aZSY}-L392A4WeQ+K!G(`7LmMgJ4(d#H(c5sy^WSgNI2*>LF2VhayUFbhRV-C z!@3lSBH#?41=JT=n*Y$Jse+?hz ze@&r21$1AveGGSft#?@Ev4mk_SO=|MYAPA3%xQcQlr* z#9qAeV^`pXL8`z;(Zinze5@Yp>qgwH#|1qqw-c|D%QKU~N^eW$TQ7Kws@(=wh~4c- zQVB)QRjI%zpjkr04375mSgq&U&6D5J6Osh>W92D{`3x+`@cwX8W>~AS7yKzA8za;R zElBtZ>P5Vb5oqLfh9MyI_OpzDX4t)CH6Fq;vAFctS*OIIAJC>(4DlFwDo_&3c9cS= zl3)mvN0mA zND?!^6Td@ILWRI9f1bBK4iQVo3Qzl7A&ljoS2q# zyPdcBV;%wF*D|))>*S4dF5qZ_*)=4#d29X$v3={}cikri44;@w6b2T4nQJ?4xTIL20yiS;(pCJiLs=Zdt~g15sRJ14TJF z_y?2J}><}eE4_98=KF5n^wR&2T*%@cD?xBvMeOixReN;wWs3kZq zY;03u2Z)x&QK%?>>B+tN8$4ouA^`>t%&IuFwMwGSD^XDC%tB7ezcvw#f%LsM@l7c` z;ctkpQbt-3b^jCtar}}|_sEJ(SkL?XcTP6OYQ#!6&)RP(^ z%_hVJJ9>HEGRsrTwcT#TXI>$wt6k}?Yh?3zg#L=;GC6C>#xj$rADje22H!^<(PDs> zNzDIDcTBtFrvlGByf{7i-%7cXKgGO4@ig#3h=A(WClki{mL-VpkEuw0In*R z)}3jn+Q(Jee;y2f*VhUku0bf81SQ7O;HD>Do~P2bUGI^)-+kOMCypTCecre2N4dU~ zL9#V0RNFobq}p|PT2@=nq&E*W*^h_kC=59)8Zl12=ivbdFy+n&rtR(QH+|oldv4Ei zKljY>2`S)*f2bGJXO*>wmE6JtlchJa-PF@r2kOeegA@`d+=@F7d_2e;in1VVK=R>t zZ=s?##3`RXBo1eBZ7~Salwc0sFZK6{ADS4>=OCRZXF0lYF?&2>CZbLW;HYaQtW6{j z2<1|9k6-c2k@ge+_wQ8?{@4s|0!jCQNg*S0`0X!(LmY~}NSn2(<@5nKJ9}Cw&b;>A z*>}6UKc#Pb8zwA3k#Di>mmT4Axc~KXx|wU2{Z)^3?4T*d@pT)mU-?QK$&CTVs>5Cp zCXv_EQ0jXNyilj##^HHN!2$)laoIaVE z&hB=e@O-g5290p$ZD()T)EubQLRDC-7L*`Z!EcmvrVSjI(*MC&dywV55VVEV6eKEW zM(OV!tXc#B=@iZBBRJNyW5WEE4=24Zj52KR4eVtevDyn$1P-t5RJ(7bUpILzW|Y4z zTzh^lfbQyP2dqslWVd*o9xmtbu=wqb-a5}@-^n)DqsYo}sY>f=M)}pw72k5j_0ce)+^u_rf|qnBab{Yk*FoL0Yi zoTHlg@tVgzx^Iy5VQdvr9pVO08EGJ7M>R&P-HN=)-seRNmSW68 zB`)py@~4y0tMUEaoIgE~v;J>fi7Ij_5{P6M>KLfdF>Z2;RZP?_ey_V0we0tq-|pX+q4fDL z6+mo8{c{qV!3@GoKC*^#u3f191IfAsCmt)o?tkjrzNW|hAvp1Rh2gTmzous9g#>9%{&FPGotcDM8(XWqCO3$x7We>T@7dji2JTQjgn z=8YGgJW45*9JhPpjQdW25x+vNi97KiwH0qyuh{;hiz=T$Da%|kNruIGCR_Xcz8?F1 zsDrXhdeMxk=bgHTi`f|OT4k16%WY{eR@@X#zIq5)?Cz%A@m(sybvMXahBCK7nU;{` z7@@ZDb|}xkw+Ku(Ygw@%yDS#W z;dvY+hE2wD@e{HK0H}UPg6K+1H!@(u%ScyhbEajX63|5iD`yK)_gC{E!_9Wl?Cd89 z%MW7Y)i+TcI`}8?(ajEh3`u|!8o!$3L&fBbkEu z`(iPhK`Vp5d(rOeGj^NPXwt{D&jCjkv_}}3$Tkw;s0NJxPkd2`xfG`ve2am4EqdF- zQpsx&d%OCj+pE{Wwf4uxY2Qj>ri$GdIOfgSp&30F7yWOxBqAevPd?HbK_z90`VtRU zq&Cr6hp5A#>f*!VK%*sXAW#a>)rA5Pa#0uY1$w^n22qwoj10HfsxnXq|95fVyP&Z! z?Zz3oBAf#$gLpGChDlkJMbS*?(lkC*i3pdRu)!A*a+(=0R<0mDeV56QAXwKnOuNgX zkk`NsS`CSb#}K5jXN)Nnwlk{$p^O({@Aub5?UMJK&_k+Z}B{v&+)l1ifC%v9dmCUc3j;CqfuN49{%d(?0;O*x75We?Ydg(N;qZ9li zkOm%MnO5CNH(Y7*j=}*~nDlg(guPVsuLXGuf*6PSiMEuN=-103kiNx3lxF3}8m7+;!S9zv;M zrP3U;!Ra~0IqdgLra#HpJm7;d4~RjaIVWaAGuQ}{CB`9O0|z6n%tT28s^K=&56b&7 z28TjW)B6ZG4vBTNxXity|3ixek`O2azzL`j)RQ=yAC?H*r(Q0RU)s8pSNzM^*VkK5 z%gKTCewY7xKa2T#c0MM<$-)vU4KgN;afQ_PVT=Y_zF$>SXb%PFKO6Qs`8r!x>;4?? zT0PuH3BzD?MZOW`1RLHEC5@fy1whq zb^XfhdEzu8o*l&Hp&@xWZ|Z(hz8JxfyuDE%54JG(!~cf+P#|=)H?AWT?HwKK)IE=j zBYtm^gayt7hRq_ai6?mpZ1s<#09_SEi& z?o;`^cSlMV*E!HbRspsjmG3&sUq5*@mkQ_I8DY4D?8$m0noJnY6as~rsZh2(Pn*v$ znvdo1p8H>drrI|sZq!Gw?{b~waeeP|eHsCdw(OX0do~7XX~z>miUMK@W~W*pI)tv? z_m4eq%x8JWo(qmw4_=zM%cbP|9Nu>iIJusmy<+4v8E`x#xT2hA14pK79R2II;Y}a&u8vm(|&apYrrQxNxJSAsaZTecE(o7>A7Ut5Ooa#C#6|q zTx@jIC?9W%c6)4<$QZ1_G>&n6Bf}MELL}~Zduxo#!%V-wFDGs3A%(yg_O08q>d<3^ zj*h+bMIq#;uSFc(qoBZr|hay&_WKZhy0pR~Z z{Dw&a<(T2@zAks94nLT#1<30<2B2C1rJT$X4}Wu6j;B9czut?#PFlNfi$}%^)HnT^ z2+(~&=7<;qlOZ$VOS;q_M|14`jz6-;7mQLzi#;TkoSIehAH87~k>J4{ck47`eitGJ zG8x_)uEryBs2LNFMtfBwKR#u+>XQ=~1NIwdvOcS4WZ0NgokbW0s%-We6RloX$=Z6i zJ!-R2y(*6q*Jm%DTsIwb=p#{(8=e-gH}$J2V`c&};ix_Vu)g)R8vP&0qT5CnC2SE@kZ zs}w%YxeAi?BUbm`s3hzP5C2XT2eE>crL00z4ZBJ(gk|t^)qwmFqzFpFEc{Vl1BIP zWczPTI{^4GvHnqpUb;F#UBN_aX!Q#LQbYDp0vZjIs#BQH%LG~|QBj2twnhP{mgklw zR_kQbwcO=Q3;57$RhskZv5OzpN7ckdx;n(x{Pzz#WmMK5#-VQTp14h=F+V#|??h7| zKN^G~=4B@y1Kcv__tZ0Qd1k?~RU4;7w$Pmn?5ohUIV=5?ykCn&y)=?`bQBruJ5*|% zjDV#7uJs1gltW`2?9tu@3C(0&r|4?*Un9y}{gF5kL%a19wI{8g@F~c6VCm7Z4Q* zV(iwdH>|7%2X6~DJTeQSk?2qfPP5p>Pl8sc&~yP`(tAl975nrQa3U?MlI(Vt+>tH# zIVXra6>7zTJ@7dSeceYN`-#U|$8%xmf&G#cY%1;jhX%JnC+UZQl~3(5gYI_j+GQz5 zjs1m7L9?Ob_5J%s@cqUV>$extm|jBi>qe(?E*K8BBZ9;nC5Pl$B)mB8Xoh?iNu-aY z5Cb)E@QvmX%@PTgbl4AF8cfNOmtAI(;lr@b459n&@gYF5rw;iNPC3xXeG71tSO3=P z`_ae|7uF{GjwKVm?e)-w(;>RwTd!AYt!|Ce(V_3hxmv)bipp}<$UF72w0P~_4Nxwq z9*pk~0_?Wc60xu~CF7Xe zkZMBkUE9Et!>NGvy4FRii_MM&>PHT<{Gj(Y$@+7>KPKkCjbQ=qq@tPUPa2nvR?|Q^ zxhF}7@kcV7^voO#jZWSfH)LBP4?{OlIUcg0C|2Nn1FuXa>%7yzxi5p1u#XAOx0?@u zc{KL?d*pxkF!^?HlR~s$f)0Ow$T4-wFEqAMCs;Pwgfr=B9Tp?vdFw5myQ$186YXW3 zxv?Q~^ws8kF(;c$=>?x#kcD+_Ai2Gbe&@QTv^Hyl8f#U0u~}~p@hxf~J*6}Gv=3XJ zk~PJ8uNjNg7`ZO+@FN+AxkZ%Zk0|~VluPA8BcHd!=N#!A?hbf^1bcE78jQd#zYAZp zvh(YF!g|c@-|ZHHAIwuElI6qsQG!l>c;7^9^g)7qM@LO64!qqj=!YlZ!iELXZ4cO) z7AN8l=4c7&PyiBU#`SQD@U7rz@}Qw_$n&UgN%&FzDrF2u;j$b!Dx|Viqi;77=-%AjQu?LT`^^QWoOZd{WY_X zq{%u>=9;t5xgjyp-2VvN@khXP`cBvKo?oq(pPatdexrxim54Vwex0lamCErUiyIoP zJ|(^OnYx;$CPY4DzzavfCcn*IvxS|?$>ga^XQus9e#&mHV{`=d;t-TFO+aSR#Po{( zYc@+J^i&v88f=5IkMuJmgBZDCWg@H3RSp`>WuGE<>Y=h7jbYKVOL zLT0Q((piqm>(6s2sofe0Tb3cp1zD9;RzxF*0MS4-L^`}MMl%v%ti#IAKb!WvvL@+E3qHswTHh>5b zGDL`Y1!*p;1**r{km^P;|K>ptq{|@)iZ!uxHZ!z0P zynjKI>{Mo23_r?A2q%e=*NfBar1L|Ho&?IjQ=Zk9Y{@C4?F>eKmVvz8H@vQOC#-*h zQc-w)P}q2|HB;KPhS}S{vFbMS3^!S|BclhOmsJ{3tgE3x&?r(2&POLzKoY7Qjh(1d z0Lep~pW&37(I1S>b35DGg9>9HqC#mKLuSM*a#9hN@8deq0Fu!2BJfOTW=BWR2iB1F z)1&IF18)5+Gi!7FA3@e)2SvQfcO}}&%9cIbXVo_L=eXJj-s$2+0cbxJ#ey+B%MP8| zzP~mUO19a#Ltnr~&)CU)QHW;ij-I z{*RX15R2=gm7S|RO>8u5N&n+mB`K|(896+ZwE(6PsnO8}h8ZF3@T*LVii%@wyZADa zh5HA?_kRa`W9KsckK!3kdJUZ@5TO+8P^l6ym>y^~s5fqV#K}X~AlTn4R0Z;-Km{T< zHT_y$im>=KzAv7`&v>fLCy$2oit4DF!hF&?mnJ{Ms(jT8jCEVGYeH!>0xqcUH_T2M z1flZ#QVRbnZum-~GJ;O=pq$#-i3p>h%snXV5VZx*o_t@sZS3&fQ;f%v^-6=Luwbp?HpzrZ}JBmbWYMlcHGW^-a6#5MQi>kyO z$Q2ZaEgFiXkpCGA*fX{!V~+V0{-zWE4p3YSYnd%4@gtpnnz4Vsu)ld+P%C+Q)V(~? zvffV))p)vpl>Vzi43@Iqnb=fstZ=G*AedrkkZ7*P^p@n2`;$eTK{%*G)-h_ z@0RV|WgB6P8hCh^ci?BGY{=Z|GUM9z1qW<_lIR#MI3YLOIQdv^G|*HN*A4zYqpFhm zcC#pr*tYJV4I&l4;j?nsHMqH}XH>1rC3y`(5WrLSGjV|8>XEq{zvFmJEWsUoJS6;l zH~^mq_$)akuadiDD_stXian$gtp2JQ2O7H9Y|SJGGEAqdQA!aFIQb6|DE*9!Fm$_5t-8+fuDWdD10mN%XEVJPWJytKi@WYVo9SrC0&=B2uTz z0RrD50--!RHg8@97l^JVOl-@h*2eS-Y(f_zvU0^y&DmpM$)RW@gGY07@g9X3-X2(B zw+G$8Jz|EA!x!#HN-(UbQCv(m2HnK|6vy`*!nqADtX8xXl)pfM37_~-)0 zPwXD$>G{J`Mmgw638;}qEO-reF$Gh6$;pH#@}$Uypmo!n^Yg+1NmNyG!#|35AJPQI zYQ_PlHjA0rS^GqLa`BMKrx8g`hlI1JiIWyD#K_V7hvMSRYUA67<OzWes zL+;}#vvi*R9xR)^U(v)v1kJJJ1Hq%xwdyj5_T*mD>Bsm!=jX;Gy_HtQzKx0AUrx7| zn+%UfT;OUqWr!Rh(xK1w-W<4l6H9j_IOi`lrldhOw$<;7An{F!;T$)7h5Lm!)(H}| z@p}P@;aa)~9dxxQZL@ky)_#SaX8P`ZO5DMA3t{ zC}+g2adkhwLQyLX)d0wV&V)Oma6rTUY~L70juyJT3U*qHc=<4(HSpn~#cuJ2>=2sf zCyNx-v+s)KWCsEp=65xiAtPN=zAAn%EXY!ljc3|`fkDaC!7Fz}QCSimJxrZ$mrhsqy)&BshH2ss3xdEUW?oYPoD!bcs@=AWeI%o z=j9AEJg64XY?lvF1FCNM`9K@htO#=qvZ_#=BUt;I;1!@r?pRxrhk*j3!qQ+{KO2b- zv(W`=b)L#^lL2oF__1kG_RvmpEG;tn+vE=R+Rd~aP9^!sjg$)LG@O{hdt_3Xe08?P zY;HodGu?#1JdF=V%xkigVN<|XaI439ZPS>y!f{6K0LB3Q& zk|wVI-Jss=Tx2JaatwIdj^X-C3CGqL!8oOK3=w8DLv0$aMfG)w}rMPd~ zWe`c~F{lpZMnO8I*)L1V)(M3^6j+c#8tB&K;n|$QXL+yk#p-oH2---AtpGW$aA@c; zQE$KD0IyE@UN2OTpeKFN732NT4*CG$>d%D0PVIl~u+^t8B{F0yk&ajFKrqpkE(|A-c1(Sbg z+FhzmrKdO#U-Z-!VH@g;`h*avm*;IMveQI1V1cHuYPra((mR=#JZiQuKaxIDbyK$QQUK3)Pa*1)A%%thu{tTe!-#EbYqRTj zv~%+7=Q8Mmip5##q=XA>w|`4jF8LkJi+x8L)t(^9OfkQYw7g^%N_SVSBV!#j|d1Fl_y^}g#&n-s@H&a8DV^P689SOf;6u;Ji^0rL1WRD~& zfn_8wy25&3J-fx7*eHEgL{yR*i5Hv7haU#w&11bTx0Z|tv?yM}P*BC$#nC9csR2D- zw8G0!>)I`EA~f4@sNPDIJEEn*BeCkQ*P(_5U{mKOqU=IvK2l;yyfrJ!D~QJcDJ{Ta zH^||-g2d;LtP;(S3Fg%>>(?*HN0@Uul@OZfA8q&)@A+z17Hpoz9Q4R_Rg5gI7T-;D zG|3|IV{ZbR8-kk%_asitjpZAXji+m&-QAvE!>`GAu*VfbHLNr$+YO&%S6_W~WilF; ze&+7wd$dz5f9PgZkIlPpKAK(jZ||h1^#Pw8&9Vi0IPHytnOn-L&p`w8PfQ_itS4n# zp+}RyU{}Vkz&MJ)icsibs3`_kkRH1Kv zSQ1n5U|AR?Qr$rbGW8pR^a-0(xT(`F?T2=k{#@4Q;C*?Kr)6-ZaH!?{-89kjG~cCO zV@I|`v}1f$MTt zS5UQWER-N8c|J;l90M78_#)1YIE`G{O_0ei$3P?wi_i!k|Ns6uqre%yuaZz1Z0yTA zGRiX*TqG4*R}v}r5pQQ34C8+$d)+Lgr}ubnTr$opTU#-HKDSNKc{($szfARbBWB0wjUAMFDW(9Z{=RJa&s$nDh&@ukfARU7h zz&RGY2A3&9mcEH|0ePuR*@a^~&WOqOr$`tZFZ$Y~{>asPz480d@6LlOs&gGe!bj05 z*?v1cqQ+SE{>r;1JS-X+hDTNVtJ4r&_4+|p{{gBZ=9F)McS<4hna6)x_X}y*f-|X# z*f?G4x;P`uhu86zVp^Cvw*Fa+!iEWv-wcYQo#-{?S{SS3>_y}m8cgqW0=y+mkl-~l zcqpyENPCH^Xrc`XwfSRd3ZaTO9PBIA!&N*7d=jfLPI2Iof+JR6bO~O0G%%{nUUYq8 z3M%xfz!)-UD0)XS(}BcAPf4>3oqnpQlbd%O?T27zz;p~s9}Ps&R&k`z>C*+tQ?p+= zd;|=F&79(gW9iN>bTy7_36f`D$+bl5TW|%*G2(_%Nk%9rZmyV1Id#3|+sXPcKLIvGvBnctMEuU{CS!Mipm4GM)~#o>5b%4pwI z_L&+8DKO-e1nmw!4y*t5(?rN}yzJ^^w+hAQ6W06)2ROd?EN;KKrrW_(pf`L0DH9jsBQgxa-%|*TB;s+$>$a3=*2tOE0IFCE&PRElxU`e#^}V zea81RD)=jSffk~B7M$mO4Bapwgsp;T8AU|e%PiOJIAQ*LXt&N1aDwurBHhGm_)HUx z5e1o=nAn@{;%4Z@whOt$7qLu}7=uCXdykaA$M_T-i&>iWhE6I%GDYD(YB@iiNH&05 z#G?OECo2#n5zvDhC4!nPhU{|4eXUx@n zX3XK|rOu<|pQ1;YQ~?Gpq&hX*Sq--UuXA^~Zz|S(DD94E<0)sSB{=UNUqJhC*-+8i z_xw%*k2FE0tYWU7T?2+{SL=!}3UKXxw{wN2?uBoX+M?=V?6M z|F2laV}lHmn$$OVo`LBB?MWCKkcN^VH@8a!N>nD|?b7`?bSKUSPzl6X(RC9}bJ2}N zbmv|@yV~M$*}+mKcW5iQ_u^)#srqG@$?2X(g(^0X0aFfFvanks#n)Via*!=u36Ml^ zk5pxSBNhKH8ZxoEM8Mfmm#Lx^>`hcC@$0ym%le5$~N) zJ6B8c!;j{C{9I{%f>kiIVYG|DJ{1)6uLwaHdX)a4aK;;P$>J7*)Hwo)laV*&z4?}A z?L;A7fg}9C6;b-+riy%uLNdY<)Pj?s7E~=VLzNkIdj5@+Mej)zCH{g5{rMsLjDnyy z>g}lkZ|7Fj9{D1&aC5s<&LLtSf>gdf{&b&|HebYVNt(;sxROn`)Y`OckKz7iNq)ZS zs2>Hj@1&s)UWm@iOU}p>T!vu|#z)f$Hrb@(KGrL)jX^DVYH3J|JH@!cYR6XwrXt3K z(L|Da{ck?c$zzn+KfyszE8Uu`(wH^V+Af=4>*aiZ@en(l!s4n*jx{r9pU?S|#`nh< z7$p)?_53SGU?6Yh!*lt_4ppvBLtvy9HO^$|U(DHC?)djC!^-cAu(GXKs*a#CPF<>- z;$}#}O>xR!?w!9)2ZU0yP<5Ou)K%GL#SGvQlI)TEsRtrMQ%8$BEtm3;>qoge$9W4H z_E-Ub8#pZaU0r<37k6Mm$bYLZEo8PnE|njgsq0G1ClCbQuM(1YKtUGS-e1@-7{leJ z*?x{gQ$h_HPF7AeN^{?IO$_KIEk)s`qVkjHdoV$gZ2hWJ+Cw^Z#pO0YUB#2J>l&0l zG#!@zzwdM^_)4__936XQLr(h2N!b{jA^mscVjDQODZBH1la9}6Hmk=G0+gblIQfKPcG#?C`&{5W91xl9Csye z;ihN_0!CSdg~DMZmGAK;Tu4&AwSh;+=cg|B+=qxe^5!D$MzTn!1owD2Mq0KAb&0K0 z-VY4R)hm2Jlo)>S#k2D4kFW4P{-`u2Iu^SZ#N)C0bfDwHO+|~lh-nR5 zXA;~pcMBQ}GQscigY&xE0M+|Vq7>u`sR1A9C6A)M;4^fuNlx(3wgeM;LDNI~o8Mc> zvol`PK0cZ579iCx#*T{QFhsCYo#LKiY#rvB4-rfGZM*h-KF=b|%?{kulsMb5!d3&N zq~xI@@jrx&7T49X0h!j7*0m#zskOs^kDXW1vkrPSXtRI&0n%rIkKO~iZH}kc{rC1C zK=m1ZM#A&aZoAj5?N|JsDT}^CF=BB}t16h=KbB#VHS50}Z4F^oBVy04fzx$P*Bnq- zANmTIr4huLwM0^Fl%90kShT_%aaEnAVb;n^*Ehm<$0_E#$q4!A{}!wHD*Zfs$j^@L zHt$Cd2;V}-W5tT&M@Y61ZlTayrVLwF+gMK~b2ZXxkxRUK8~J_OeLGs~T+4lGTa|lr zWE>dz2AHrUcM|_9StzY;o7xg;i4Ni>imGvM;Tw+dqrX2d{%7eS*9R>C8_ki%bn8=t z-RJWjY=;O@(IDwko?zDhSlDweeYZrz`p_OkFntmJ=Vq8BM3<9P z9pWkv6+67O0;K8Z+NtGmp3^nnP}2-&*mBdAG?Q09Y=-3OZA!Fjw_KWIE{I5qbJD9K zF=q1dKt54G%L}n=NV^gXsf_g>HXWWHjlAU_a4MX z$9gK>7!qDGSp>zCeu0H*tC`?JzWJ^!j(~V#YQ<)aSYPV3w)l^*uQ)}MbWuo0F;Ml} z=QD}BM8lNKg3isf5H{W%9a&PiraYy)*DE$AK+2B>-k!j1IDlMg)dUU_u`E*Ks_#sP z<~?_lo^*YVUghF~^$y4>{v*2}%SsU?{i;@&PGPQI{*W`z)7)NNvmLnZ-rUue{O}}U zy;^^c5;iTArvH?)RrAL-@l5YVm=@y?NG}MnLXN3O%_UxAIRGla|LH3ieSmU`P*_iAoI3v<76SJhrsFCpC|E5m~l`NaG8ZjlvJ z1w{RSUB&!A7*PVW0k6(nvWz_kP6z{;YAR78%fn2qvEaq>nBDjEz#LvuPikTPzFbTP z)rLLQ=piO`K^mimUQT`)UPBusRfN@t5$TpPq$dWb!mYCXJQwnq4fOjw6wfZ0;ImFn z8UHE%aciz+*Z44g2p5^5*cTVu_9CmH3Fy?>?nl#o``9($cr zsw{XxfvXLzUj7q4MuGO%hhO0dP65fd>Xvf43qv((ONrIzRpKs08I~NKB!v-1q!#V2 zg~Ibmm1G*f>ux95rd;_Qch171A%nhNz}*YDC=IN(22=u0W<;)-X|ftF5Ngog-p8vH zaEZN@LUkfIBEgq~Wh)?hi5VqXJmMK3e|i&{pQ9>N~N z2;&Un`B zr4a2$9n9>AEyJ<4^8;vvu1AB@WzP9z{{ALO;Ozh+X2BP6vcIK%cR-bap7dWTGZr!g zbhXrlHy{}Q6AHi!E%*%2d;F-k_m4a=P$5RB7@m!CFKsyR&&RK2!yxS^C*cz7mkHM= z^n%RjP^v1CD7y#{AEE-Kp2}`wwpKIj7gJaD{r z0;; z4LfUZd_!co?`;ChHR$GUr6a4}661Q+GNfK4qqK;`aK%@r?Vi5f9zAw4vhq(%53g?* zx!r&_JMIg##efQuVG|9G^nf$L#uGiqyozCg$}&PU=R#Pw~!;`hmO|Scd z!P7*@lj7=bt7G7JO1p#QkkuGBT@FD$jQ=1O7Nf-9l39v`g+Bm_UTHbzkarz&k*M4R zR*YBpwkTx0q=0ZxwQzP-O02I=kruhRr>4H!jfM0?=l5|vKwjHaj7pbRvi{5(gR5fU zd_D=Rt8LMJiJbzb(j!!`pqOl$XFX^3;ENu8%$80%r;pXJ@`sRYCh#Bm!mw`jKOCE5 zG^lV(X3>ju&<3y#ehn@$PD$c@wA{GbFLJ)Goz9z{|A56@59m5&kr26dGS?$-+A{4A zEOIToj62nf3G-|(EJ&p9^6<%qWqtkamrFnaBZ=L@Y+yu1MtrscO}vQp zGSB&U3p!&dSq2*Yi5s`jAI%J)!5SLsfE&IMx~OBG80cCa1z~ZPrx`I`*XJPY=KxMp zhnPEPF#%i@*PQ3}48V8E=jeJ&Tt0`RjUw`2ru%~Y_EtMq(|XOeFe%a|ph(%zBirZ6 zs0SoD-T>3q?YA5IWhkv}Lj!}V=&H;$Y60cg4qB+e3JgPpa}pKO>5`_bp6@xBlZ&h{ z+--rO(x$d8dBP!o{=$5;ZtL8!5M_)MzA=AqqYx*C%?|Ov$H-P%yvyThBMp2WmjTYa zz`#+T(eB&lmX-VowOGol&KaI{tNsj6Zkx|Bkh2n=#5K z)t=ZEd!CN~HL6jN)--?R*ak~kcF)KWXtTIk+y0jMKIw04j0P?~YPFtCE|E|#I4=8%OfMp6!?qZh1uiU zh_Rl?fS@pxTE|&_Ubb#2m!3E}9aS|OUWu}vtOxB%%|I=-}`O+}*%Iu1g>@ z<@eASW?$1)-?$v4-p@!{5pUv+nQaJLwzQB(zp2X?Opxbt>%B9uRto02QS~2^2a@1N z{h1YJJlHdfB!FF&7q0p;I|HBB?{gzHmuuWiYK)2PWKu!pNh@l>eOvzPW<#v+x3bL>g8%bJH8s(lAxyDscqf=jhcbp0bIiQsj=ZkOh>Xn0*Sfk{xN;>jKlI1AhxNKB8Xm8Mv0agD zVMG)H%XkHe6G(~KD($Q{kszhF3|XQ$1%xl z1V5ct<*Mo|SS)#w_6&|{n1o3yg}qC#(x0cW)=rP`TT7p^g?WJ`ODJ)<*2gNGP4hDp zKs6Alv}tb23Hl(L=DRC23ft;hm{qi#UlUXNiFJ#|eSTE4)!E;6^d0KpLFbNtD=x-u zf2uvlPAM;yU~M#+zyV3=bQW=eb_nvtn-Yc$P+9*4)7K;Pc3LRwpCWA)`-Vt9qc6{Z zR3&9bKg`JaUEhzK+%qKa+#;@OV^ylbTof!tXut^q6(K3X+$GpG~f6aP_4Eb9~;hpU?W`eHkM1 zrrbLp59C(XEyWHi#OGj@R|p1G`7zPFEZcqq<_T%irIywtNCS!|QXmO^UvTd%1+oxE z6ebj*z6+wj5bgIVX=XQB$-UCA>fEjz!!qT?BLe&YBL+Q+UH1}EKiwZ+ti6)?%+8X( z&VR#m?@Oz!G5GiSDjL@BzV9UEm%z?0C0S$r#|Kly z0soX5V39qn=Ij-GQ`ULkmYIQ6>CI{AMj4MBL-j%40ow7VHTm|9_nVj?pCa6f%zotA zbU&W|`2e`narfJETo@_LOJQ+Y#RuKE`?jl=MVZ(AeG+ZOL#jm43cXrJEZ+y+BT&<2 zvvn$w85`ADviW?FF@;Q4y4RVvL;rww$R;>&5HEfhC&3|a&C9XK#Yg=r4v`!ZI}MOP zzw-igs zX#Tq&5(y8I_&Apjnc>APX~$P(!2UT+R(Mr@4<2JwsVyOP86tpI%XL4?h0azME>a@Q zdNJSlWQs@7W+Z`{GP2n|-Y8d@4E9BT5&$vfIq^#EmR5K+!x{}YKSMq1iv*{Hu0T}Z z)CP{q7~{V6I#SpgW4YGOqO#*-a=gKdjE2IzR=+K;kIfBGz~uztp;VY=ws{!)25gPb zL#LNa_#g8p84Y~ND(>Uq2*azkS>Mv83Xa<)drd^{i)Z}lI=&68Yj&T*^}D3Qt0XUG z=>MipHD1wb*@ju^WKk_&`Qo`q6csft7gW*arF(}frD{|jjE@!cs2O|eIgkUb$63v8 z#g7e0wXmv+!z#_zcxTWcIrSstxacajBM`qHINFAA*ho?tjrFaqj`NOYS^>~91POn> zm?VaAzrmes{$fty@0kenW>d50mViH>XZYgVlEL5&3>E}edjpGAYV5u3KUs^O*mFq)9Dp}lYW}zn7-gh;t(Olh*|)? zf!BRF(>om!G2U#e`6{?ul!Cli7sn4AjTuy;(;%Eexg+fp5^l=;^5Hi@`_uM~>7Q*J zaH70O-$RO!fi{jzmqHN(m*DV@-w z{}JXVs7OAuy?tLR+C^mOVk+%&QZg$dgT-_ARGUiO0gy4w7((GkePDi*u}ITIIG&Y$ z$+uskU@XPYZitE@w3j4r^5|X+gJ_NWd)%XLcKIxX`OdlU6N0&~k#CeBFLF5Q(CG&4xsovS>T$P2k`#gkqsk8`vn&4JmsK z#1ZV_P_bULI+vKl*0dD0IgcTnZ#&O(TV!GJrE}yOul%8I9&g(i--N3cBrL&0`6*cT zW2rSxxJPqTI@h_m&7pYt?fg(i(x<@c_Cq?)}31wNhU47R>h7gVUg~zM?LhVhCcVsq0dONlxXkUA85w zAu$okR50*d)8DhR{L64h_9b%=zkBPPz0l$@mD%zB_j+j%&{EwETq24ud3%1B>m<5EAfdhr>PW=Q!+7YuG5BYv02r8qM}?=A|S$#JuPl*rbaY^7ymwR$L(9BfR6uIG~{PG-r0Fz znz8*M@j;5d$w?N9W)TTumYsJ9N`i6gU_@fr#ZgZ1Q|lPTlZyb6BLa3D`{<`W%7~TB ztwn@7^Q3Z9=iPi!p(yzX5sR6X!FRtg1sN>vX3LL_OP$vGn%gJFu3!5L;tr0Dn`W;< zOUrTmVQL1ANlI9oOB-!*=7@zSr2j>n$us{BUs>7Fu(i`z#l@+gNYBxyT_@ z&~f2uRi>7lc?XJnKKcC)E0m`Km+ z+^DP4)_^rwuLVEz<-qG5@JSQEArM7Z%|mWKAR~p2o2X2BgrSylf4SQUX}uX;!=X~D z(p2W@a877pY+D1%BNBVqq79r(8I6`qKp;`03v6>)0HBJ!HpNIZBcKZ!qdf{DS5R~4 zvn=XxVBFBkP))yeK%pv_kSwm~i(4&Ab7}+;kUz};51xh4lIgd`gOSd~*)9nDkZ$L% z4Y?|~{?D$uD^cD=k6wT)i#=N~zQ~Iv<(Iz8PB+?W3K`E6n^6VUz?0XXmmMzm+R4md zKvB#Mb@M;b5qhX>L2`M$m6qhe z6;xQ=yfMqTvHSAWO7(m_s<9=Q7y|3yRb7Hzd+>ae&~j^>>~4FpDNZ1AMELCliNPLB zG9(o=Wr&^$Omh<~N1+1flvr#c(*al6vjc(?J${{GX3PKf|3xL9f+(nxEKC}Rj%m;K z{FUiQlWq_iCeUXI9s6yd%lgqDe}yat$Nz@=8XRw-ZoaiDmRev~+JC2Ko?7yADU#6w zW+Xq+5IqIqD88W11o!?_M_1v37IeS=39fATlJQ_9EUUuxP?{Pp*$`87rllk2!n!^z zWS@-yp4*Wkf$g%ORp3p&V8c`ql+ixnaDoQGH6CjILRN|iQ^)0Esl~6?a>>Kp#i7jO zXPLbdZ7Q9-d-}X(760LpG|z0dY<+ z@HBlrd6`9ElWZI0EMbM0W3H$1ad+I%ngVrlZCI$!0BKahETy81%T=ruSwm}HE?G(G zT-f8AVNfew(P3#=rL*XRUBimPPfazg^8>_N#`6lc2jqFV;Uk;zV!j&LNr*?~%Fg@W z<+n@63d|x3QPRb$Ll_pT8E$(%KvoI4SKqUFyNPA_>T6GG-AUIoG6oX&{V7&7wUTSQ zp3V>_GgI+621I}SHf?vedJ6hFi7{jSqs4vAE6AZ$LJQm%Ig*di`a+-yGhK)zV_mmVh zXQ|qnBh8XjKhzj<3VZLQEyvb(A2gT`z@gixqJPffc*1~(&(XHuM;aAGFBrC5%H${7 za;#x%o@#}x%D9)__hmWixE%_cv%rkez@^Mw9Qr#)P~?O_tA}e6az$DN*ug2jP)wb( z#m%{#g&o3NF(q`j1Ey%=h4Ek_GwJzUiEzL+{T}fQ5_qqq~I^}wl(TONbjC}a< zJ`l>P24y~OUi`Xv6I!CympSeG%*zP!#L~x#|dmN9vv|>@7fNswYVYMNJiafe>^bTBxlvfDzy2YF}roOCuqs=9k^h zv5z5>#qR!a#1}}=2b{S5waMSsjdTVRw2`0EpHhOHlX`DW^*XZ17rpMZtxx??_)*{O z;^=3zpC1RHE7(D^(G3)f zo13A?Iv~elk@p79B-(<|I5u6?JEe5$Vwl@Z#2Vg;uvq?l?^yTTF1#>gWnmaCm!#!4 zp9OzHNX-#O7R%hXa95d;m$D4+oSlp{k!!@j|+$1Onk*hDDj zg!c=CkIk4R^GXz}K;Mv=*lMrD@<`PJo~n2RjAyvK21Q^WtQ2ECe#s_J01G3=`Thjf zCx$S~)jCm&77El70x*Wc@CFeBAqWQBP)*ltfBj|?DhdokiRsC?PB(pph18nte}L7f zA>aAi%pWHFJq;Y+UZOTcf~+eF=;d1)L7A8sK3TjkVLXGY$k4SSQ71Zc7=XLZZ9|KT z&OT99+CgTCr@K>IF|OF^`GVlAJFA^^TxFYpHSEBIYdAAGQ2h%nd{S} z`;ld@_wh^YmleocYD|bL9T&k0=nNirm%e(j^Twv8UOp-{*S3*H4#un#Pn9gOYs4+n zFh}!)?2B2eW(1^VH1_#O-MVhd!CYgDD-xNP>CF$0F0G1r%OL|L1IHV@N&m$+Wgexb zk^nnGmwV$wb&b@Uo|PE2!@8(3?6laPse$#3Qp%s5=Ag$hDSl0k zmAE(RIMpmCKZLu?p$fyc(=n+f7ht87O}>1hVGtYYwwKx>ZjZ6m_P9gr8#QyQQVnlN3-w^>r2&pmLq8O~I2b=6II#)voxh0l>O05>u5=Y!+7 zyty`7_Ni_ntk`&Y?juGzaNLM1w8=3q+g1sFXc+N;#Uybxo^eufU%SC|81VZ9 z*ZJyjJ+!s9RtKByt={mCy3S6ASLt=1`@$b%cDeY)AEpQS(?iMIU>CHown5=`J0Y6A zvP}hdZkP|3A6N30Jb+e4<-uGmWXKhm7&Lx8HmYSWcAn2$5XEQ7vX^dV!b$FAnULb+ zPYQ^Fb}5N^C=UnPkH6QSw(8eSOjr%uqQGfzrxBu0?6s_{oqEacEq~LPRwJxNT7kz^ z;_P-(z`6qJd3wuSI8ExbQ$3=}`n>iq=-Q%y;z$k<;G$Qu0oZE6brHq^=tiUPOY+VD z7|MQ~YVd!$7MH1%5DWR?&@QKg|BdvJe<$F#Fde*+dSawMLcx{Fat7{C%!k)`*=*b4 zUi6GuK$Vj@;~qOi#aiv@PDUOxsrlZn=TXuaCARR({pGgAS9v*~*GI6Akp#DULpqay zi-|Oo^p1&x71|8foh0r@GnB$g?)SmKm+jT{)fZp0Nz1eP&z{fw_pXQM+bo_gf8UQq znXfry2q zQ@@9b(HHAi#v)kv``Mu=6%gdXz{1UTyY~ynPkWKmEFM;~m@)lDu#D7_eT69l^mwm^ zV4#3N$nDyS?_EupE@e1go-VKdMR6!*e64O0g9D&b}&9Vlk|!oy%A->J>0O)M7wd z@JXl>gxq*PHABM9+TTsNioj3df(Xttw??CTZD}DdH|+L5*FO(rXr!=zKvIOrGfwBg z<@pwjDXWqu7Z*rL(l~9Bk)ZysbX%4?crfr(jT;c1u1MKjzxU)|FNmeH=Q!pA*#=r4 zj#^sjH!~1%Tr!#5<6Yj%%Vus3$JO9s0I30E7BTP?Jr#Wg4W*NTvad{KE@cKdbfgSD zwg7dYG+18O0p<8(uyqWVrZKwEGS42kC|EMWS2P6UzJ&7Ne9wuX12OS=aT) zy&L6%&U=J`e<32UzoHyZHt|!B%nzRCddx$Gz+HowJuUtKZ_0Q4LiI{w^`0X*k3AV| zFYwrc<<}E9LaUI#0wt(cd7@zOD4d-RuPaZAmrQ5*JxJKA;exe?&#o-)w~ktenTYl$ ziKBMd)$62d-`4`%U>83ziI?N=MG*9SB?|su7h-%GTy~_MiPmyKNNN_)&^UQJas7)jbuGq+{Omf3UL$E9C-0b#N)s|)d24+&1gWC1nE}~e{osyi6 zM>VhW-e>&tqr{LS^SoY0aN2zU+I3avH8E-Zh4!$P9uYY{VR!A;h@h>7K4egiZ^M;1KW0yJmb|@Z3H&^Y}eRn&D(--rf z7I5W{84=b~L(Q-QWTV_PooDY0Hw9H(9%pT|?bjJ5D4Cfd`5i!R5;KcBZuh@9^e7QP zMLtTKb8`lJgaV3T@1X0w&f-Obso~MWmw10xE(nSri!V7J!gg}E{CXeodfy;jR@jtO z1Mk&UgevP!Ae5p+iK3lrcl>e080Y4&2e$zLn?9%xAD!`Z=>Jfvr$eD1e2pC=+f&Ou z&_^_#n@rwLYw>Nya3?=(AEk=`IeucHkuXhcP^@e7kWG|6ZnSiHCF`SSG}&c-ty<1@ z!}<8`6}6J&{k$av(Spk{58URGuZm#fjsasJ?<2=xfJp#0)SDn1j0{kQ2=MBgZ2c=c z{xi$oE|jged@!Bf!m-++xSa{fow-sMddod$cRgSFF*%7-jog;nUR2a#Mwj#C^OLoa z@k2Vtky>Yp-9Wa$Fs9Iop*hQ2vfhYrQdGZAPWLxV#nPQZyvjUn9@-|5metUZ&%52n zjN8L>MulEach}M9E5H3R)>e907cFW&fLn>0?T%f~(ojO+%HfC5STNW{TcKWF<_??J$+#p-6tWx+%Sw8^pc z;ll5QdkziO%f`i37kikNz9_~hj|*E8^+M#m@KgGbY~zlW3LexKPM5 zzCK-s^i(GEh!}GRVtW$55?fScAA`H)Ber{t*S67#kc7fM62{Lx8Er3<*-xaF2~J+W za~-%rPbU`-t2(cyV;F7DHs>=+G7Cmy{rVUp!6kThu<#4H0@B>HQwcJ_e?jdG+9!xkzyO1+0F3}&#ju5X z)VH*+ajZooKiNFo!c^O7*0U{3F}#LV1MPEMqio%gP0PZusgd-m6zOZ)7lprh^!b7N zBpyi0b3KvmLm{r|rPWRhM%gWHutEMZk?qg-!sB)KXxS~>6V!uRWo@f+WiDrs>YzyZ z#D$gj-RH0eNzoDboU-SXvgFs|B2O@?5L*nHQf=rYdO1w!Wow7{tHkId-zvDvk#{{EE2FGbbM1+#>Lnh~f`}SGLtjS3+gZcHF zq8)>IR{F2kAsMV9)p+(aa5pCcJ|zKM%o=6?g**nA%y3dp9GGGQUe; z4mOs)ln^4*+Wig@IGw1Pai$Zx_FaZ%JCoDj;*a|#m{%9|EjvL}My4MAT0%Ao6wIb)&bDHL5$X0>y&nsb_EBP+L+~!7IT-g|iV{xPs;duaWuwCKR{J z>-d4S>w}7ifCGY2?X3rQ!5TL6LOU7u)a4$&cf||GCVpgFZ@;iaJf0?W=I9=HQ z8B)4lOXx)%0*(T*LV{Bs^LqJ$S5Y7xb|4?peq6jqCGC#f>SUDw$w~_Z3=&hgvG@Y! zQc?zZhKqq>s<>H(L_mWb?9Qt$uw(mvqu%WFcpa?8^uG-wH8DO^t6Yj+h|^>8tZFkJQhr{|r^+OqRk`cB)c)APlj5t04Lcf1u5`j8l&ih@S3?Mbus z_zsdqxvJVoR5`E!GazAP{^6wSr7dd7J|8tttT-`2jJCLDNYtmu89rBO_zf<~fkdVr zv3lo75wyg~#pQO#+)orkGOi4p^dbSDW2vsr`l8&LoznMGsshr{Zc6H*{aV=zi7;AEjc(VzX8d$o%AruoK+XydQumn%m6YF2^7&HAoK$Z;EPkNDKN4QUMmInT@#y5`YjdJexCEH{%qUsWCL^5N8549);d! zSrb={ym3p|{s6Am(q~%}kJ{yHM9OX%riR&)rlw{vhgPOPf>|prK+cV7GGTFWZ$BXw zO=Jyp6PSUXcIbm6#(28xOFyH_vEHIbTJ^w}QFV6SD9yIxiG4W-7xWerNH#k_nJ&Ka z?MFBK$=Ae>*E?^0?e%sv;nZ2wD#W=O5C?`Gt`tOWU z%n1(M3a?+s>Kqk&4eVo;AkN2mtoWirq3H@KmSd!5PG)VlJp~2j&u^?ccFyga4${;# zzgTWYQF+orZVsh0GY`O32(Eswcn%0XcN+(fdK`9yNuRJ*uZt7C(7Ls_b>b3#?8$%K zM^hVBEb`56ZM`G9LsIu0eNr=FJ!VW>6sR{=p^Mw&WI1BaIVN=v{+Ut$du|`HiEbH8mR5=VBNezJ~ z^C3mcGh*#XS}Fr!nr}>oIK&Shlj9{$Qc}_|*-;NG9WT?tJ{ag8K3=wzDGmjP6r46I z$?5gE;A882@~2FeMTq#ogJNutaWNNCoPrP=>zw_fgX7xKm2<|Cy8C zGU0jid`XLdoCjQf=|@^6CxJ{j4(Mfhe?BfQ2aHm(u4qqM5NQ)1;Jg-R15e$V0%dPC z+Xw`1>n$C%@D356z>bbu$exFgFX;I>vSRAmsAQ#=D%tJc8te~>puWv-C`J5M3HwBp zZHrN&laGyZct?qVI0?pdYI4J*G)0xk)LdIzlcu<(O!JE;A9>6j>|YsN3ChySFirP* zRvRP9!2N8)WW8KlKPs5+|D|Sj$3=^>>2%%NEda_9w)b-0p!|4OV^%b8zmyvzvd9w0k#VCu)Yg3L>25VzGUh^_wq2cO zDoX^^lS>Z0CLT*Pzy{F;!_$XJYe(H zD$JZ+7j=W_UZH%QB92RP^d^-wCK4WtVb51r-x@rPacjFcRk_c2e)2o(`*IL! zaHyUB_EW;Wv-PrChMnij!9bQ*>j~3jNVRTyb@)~{s;v_tm8*k3zUb-c`?z-M*g~P- z!7ur_K2zz91haHtIo({D!4r%vB`cRt|qo zV&eVJ%t8hfOfeFxm)c)G^xRMqF<#Nc?Xzi1cG#H1ZpYBVf8cm0!OBW1Nj53}yJ9$(LvYs4k z8Wd?=Z{wIH6My*mQ)8pbWNCD^b-KG9_xGNy%?WO7X8vj-=~#GpDZLCD4>3c+{_d5F zI#v#qn^5U>Hg*id(e_x2v4Q&R4K2_buu5(eM=qJe&ja<9Nm(V-4G7-pig5&IPfs1=mEwZFSGpV z%Z=Hr5BTHNsFrT^tcg{CR!5^n%K7=b(^WB5Xa;H(A_1t!SSZvdvY z;(Yg(v7!6eviye`>{@j3f~(MCMTlM!ndH(O&WLzF6bVT_ZD(p&Fnp~PA)*SknG6CT z?;Q@oJlm3phh}r#4nEpQc;h`x7#Ysu8!9B4cCK!q&C|?RvFcb zFgzl4GU3((`}Az5F0W^7aWPD*M}9+ydB7d(j%b)NvPE! ze?bb<>?bl>(`cXt?I)hED7eik1GxS$QI5wo(qX^N_8Xq&-a~iQfHu*r#YWjMB*|P@j>?HL zLQ|r%lI4c!*J3RdE(Y;xY$}n^v<*qjc2MuvU2X$IoC6lShkpFu)r7dWNM7$#T~bgG zl+gRT*M_j5QhvvMv*0kcN;SZ+Xumpls8pr*b(AbvRagd*!yforO2fi&k=@87iOh^` z+LG$C>qfpA4O-L-2;4Fg&a8<_rYPYv2eJ3fPl>(%E3W-l%)yBS5Dc0At^T{beo07r zvnpKh`u&w)FuhX?;50%n1Ro-Q#W6P!5Td{-pD@@*azV}FwwZ1X)OjORAl)~;7~w0r zAigUOs?@AkPsDdSUO2kCFuD?ks^kypzA>a;pX0y?Jfl{hRpEu8GUFm>bmCah8gKF- zbcjia&g~ZL8jJkr;9B`5M|a8J$sL5t$}?xVev*h=fqVdhjd0|^UI@1d6!{;u!L~@0 zMtw*N_uI)KT|&uKlH9}8Gjyt+y-q#*3faTpXL6>$Am)rI1QDtUv4oxB^!=UAKoYL$IwOoOE~j9SjUq7lpoN4XxL334%`*?8lbcpf95&Db%WN za~SAv_G}#`S@vw6F+HTi8UEA8E4&!~Av-&lkcWiEa zX)NMYpHQ2FUZ*rtEfyrfm>DBBwd29^qp&wWOK&*eG2MBXwFGLc5($27yxS}0`X=Z8 z2`fcY3=-Qwc)6|lh$DVveb4|y!3sz0UNTm}@EAnBQR0WnY0qJIvjb&gc_5k%Q5yZ8Fi|vvDO&P820{P!ffx#1+-B$&E`Ik+cl<$xR5~- z#``NGyI4~d$?d{tg6m|!fNxiWhB2sg1pZ@6-81)KvfW|Rk|q7^kt3D?(bs+qB>>Wq z8zGvxUx`Anfow&E<`II)-;*P-q?6|IK>t>6Cl&x$N&_k#Q-=L?0on?Yd`J#yuTE4j zEHFiY3sNank-95>%D1T`x~HeI3;S#*=@Fo)S6^5J`9Ry$G_4>_thoovdd_-x5q; z7C~-2PAkH8@<8KnbuL@EB|{fVj`{AjQQnx6Va;eG5BJM}h=U(a-~j<(ge?(*J=m6g zV6`;T+ot+(?1E^~Eo0@)Q0N{v5VKLbe9xI0dEd-=mwS2l2u7I1GWDPga1Pj)Oi=o# zePK;l?kc(o>~oNrgl}`1gevWrNaf2taLuYxWTYgTrTd~Y_JB*mc=fVtn@n zYIf~4IB!CDu9kNOHfot8anQjj4lbf4{VkgaE*ysyZVXZm!?}eSMl_PMqK+rn28SU- zxy5Utbwo?2^8c|J-rxM&sK8%|>*p!Xq506^1#((;p(9>3*wpsgj;hv#Goc$ofg4zj1(8K?${VM!5x=5`wxAM#G%D@v5TIx_ek+kX zVK~qzWQ##84qlZnvAo46C4$JO4~9Mh4IfYeV6_Up_f7YZ-ve01U<42cnEOdxZpbxM zKk-s5+opC>)80Hn643yQM5TTeusGDSzCi6(c5OBkGnc1k=kNBLH!{D5tM=m}f730;3YK`T5E>@UKUsJcMG(%)LF{94{7 zs*2U$+XQ!Bn_<)DYl%}Aup zQkbOIt_M=X?8ZDssAd7>LGhv`P=fQJ{miEYWRG8Wv?tZ!UAnu+Aounvo+;w0kf_9@ zpZhFy=Y_SDu^1x#1WxHF?@}7YxWM!|^%GR~SlM79V{3&j(8gsC)-9ifx6qZvtj%ae z2;Ed;Ml|E?oHt0~g_ISjP{$mpgq34fq=?&VH97v702jXuErP}{cVKcFk^bt)qXe*+mUaM|Bbg5 z^0WThI6CuM!!2U3_gBUIGhEy@hxECSh5^UpUcfXiv9;cz$kAW{a>h)-?SbWvyE69c zW`qN7{-7GIQ1qrFtgB2^0V)(@w0aWdWD%cqAWp#&1{3l9IqQ8`AozZGH<(cx`y%Xl z=jpIL0;lGv{$5D*2dzCOh-~!!AAJ`R`o1+o5N_fGwD6=$!Nj>&^iOCOG}+leTL?Mc zgb_!t$lPP3zTUwkdrkatz`}(%yDbxhnmHFaFTE4Ic4oyO{^ZwRKIwoX22IfN~LuG#83SOlAKx= z*bozzC>0$B%J_wKIG(xp zQ4&{_d8+i{NWu^deo&-+)P0477}>0Jp5z4I(TtZPX+}uDkBwOv`-g19=lbfM7SJr2 z5D}Zjr2tika2U+iEBs>VwOy^DbcKuI%r{jicG1?3`Yb%Q^GbHcF^XhsmU!5Pj2#a~ zuSYLHAhyMHdiI8(Yhd_E(J*p`AClK?b4i$+ip-hcaFDqdZ*EqoS$#hmLJhb!mQSq% zu!&@G6P1OrkJYr!O?H#uB2k(4gH3#!<0RIeyS{&IXDGo#&RLuyVQdYdAjvGjEP1bQ zdgx79;6%T2)%aKr{>z*AYYFFx05C9`@8?)4-Y>!6*c{25MPpXOVFU~TuTIrqZFGD* zRdgM-@2NH%2mKo$0^cvm7&n99qAIcWx>}=t^L;qLxUQBj^o&vW$>-wp{EG(&UD*dDt*nJUh0x6lIprMm9gwN`Vo! z+O;g!A%OJ_W$Ozj=|!R17b}T<)mGxPM3fJL)-lGAWHD=OVg9YBJ+fegi*6MClO)c= z#9l!dF?>(9wv*ivLH8jqmL5b?u#-*V1U}cy^T57#%C$RLHl9Uh$_D*)(5P)j_1vi+iY{^N)?%HI)&r=6%7i)N zpkQSYM9{~ex&H0; zlL2zT!C~O{PavoX&{LgPBUworI&$U~>4bK3{kA}lg?HF^=M$*AbhoIvCyoc{!T*XdRK+;xv%>Gm2xS?v^0} zlS`zcPb6Z@MyJwEhv@Nwd2O_=?wwjL%Sc$SwQ|lnaxp{6x2F@^XlL9`pakUAk6mty-_oh{_nKle?F>Zz>2eL zWq2)^|MT6y1FUK%AVt|_4&_vZKYDxs2S8SQ05`1={|{_;5(l9x~|6|EwJTGu~u?uK~PUNaimMI=U8I|B>Zy*02Kk zR#QFv|I6Eu+aaT5_9xx4!M<{+x(r=)P3fr;|3xGZe!OIg#D@}!|3bPihU0H_YQ(#Z zmbCm0v46133;)F-Up1#J^O-+^{nbba$j5blNnd8H@c)G(fRL^ioJ}3WW>#uF%HJ&c zpQ-3y|2+ir(wUk$?{MiCEdTM?FE-hXDrOu%f?NC-iNAgtP5h-pk#eTAKgR|U&~Fx$|d|uP4Hyng@0J%*Py=)bx^~?KN0#r zHr!3{OHEvW{|#E7e;Mk}>Vsf9+uLRu8$SR{Xl`>!!YZRfp+ngVpS!omIKs z_c6X~0MBb`yDV^OUw!(Bv~Z)=xFrYdVg}s(D965R8kEK5d;<$7*`jqpOz8?z3sQLY zfW2tuqB-g$_i|T~LGl@j@J?A3>2Tnj=DARBc>>qE0& zX>a%?RG_0N4&yx$W%l$G349S2uB*MHQ!YE^)H{*-pLf|GN8 zwwKsii(MiJU%++zT&50-bCcdq)INT?i9tjN>UFSN)T`zLNuKXO5P}e?j4#lLKFo%q zUHOqK($;nOuA=3_=+Yg{>JoB2a+HDN%ovxFv^j#ap;PF|@dJ#L*V6Hrl90->${nxo z=s@6;fdbun%`;me$}P*#d22%eauzeR8(%Q=ujjqUEw)~FnxFDAg0hQkbna1|Zy#VD}cGK`6*%%O{o?fW2d2yF*NB7#Id z$Niu|>X}p^WoMghFA#0(%)y;;7Oc!QM4_8WY`0Be6YGi&(>`{oM1AqxYv#kZ4C8}Z zn6m8!VO(Gc>?P(3QNkTE9N`!?Nb&p2`ornlI% zc`}p=bb$jgm+&%%l+`G7sl1~5DuQZUuqozOX)4OX64U}|*(r7*y&c!LYY2bSK&ah>P+_a`kFUF?@Wo)ZzhB|Jyxa&G#Pq!PpZeuLjmp+L|Q7tbyOA?7)-RhKpg zK^;W!&;!zkks|X~&X;`tIE7>xDIDD8ZB%tsx9&|i^O{xLY$1rXz4*DRF#^aPY@_M5 zSM9tSepr||Qkxh27pVW4#Ovn9YKXa!$Msp5Ik zn<1UyR1un}%0oJi00xdmZ)f>M1Ml>tME;5=aPBP_qrSu8qQ)Vj8m~jaD;ILImM=^f z>=`XgzJ?c)O|-N9OyYZA0`xNlWxX%H!F}Y)5r8e(oe)NK3GMfY?7R%XZ$)H{cufc5 z^Jh8$DUNtjq0&y^w%M~c|KthV5}C^UNph5VPr<2n#rjg@Z%CChYQ}qFrDEtq=DhBD0t)K zIhBWhJDu49Hz^A$rDI>69L{?g7?w6r_)k>+fhXvr>%;*@#*P*meXzx`Y6KC113P#z zJSE{kRwSQGsM%~@cX|SdQu{qzH6FCc>h-|IW_d0-AWt5!t#iuA8@A6-v|jP6YDU<$ zEIMt?+&E+D)L8>HdWUd}^UESv>isLcFYhDIv+Ua<^c-2h*yfP}#A2U9rpy@9<#x)> zuTTP+olq6!=~`52R3&2trXz-a7-3hmkroSgk`%I;xt>PI-AUtdvpI?wg>885Bh^_x zsslh`*Co&vv7C_DOPp~|w5qa-Cv!M7aLitOF^2UE?L#_?diVXxHS~2j5OL9jacdm+ zCB3_0Sq%Dp2`>3!B-1L1WnqavBR3I4WU0_@L?3Tayv8@*5M_I8jPnc%6IR6SOVal~M`DOWF=r7O#wn=AZj!~Pv*w;0s zFD&n>*4t~^+uJ*8me)7V8roKC7JnN8k5YM@Yu|WkCtSZr=V(Cfsqra3q4t2wVBE zMOrS**{elgCKV7K#NA*&xvSaCWXSD6Z8fgzQihvt6{A{-26n=b;cDdL)lr_|LPG8(- zLjsT}WQqh=XS3)PzS8cuJ1#slPvG)7x^`$I39;pEiQx{}#v;pYjko#Xw*PuKD;Y@A zcK%q?58(9%tCi)QqipEDO%c%r9#4~F@CqPG-JJ@%we1K>ben?DCJi0{$L%|vqKqaJ zEMCH|1oNuj?W5$v8{^y|w({yrKqK^6-Oaa@78$7oTNP)o6(1Up7Bb3X$J(Fi`f@si zb%&f|6c`)X7~t|>Z}siu3JrHg!W_Ed8qy6V67#2%>wcVr*5DG+SS*d5B2W5ULiVOJ zTTLQ5(WhJ}@H81b!}aA$@eqL-X3kFRI3`-(xt{u2lS*9&-DAVP#v9y+1h^XHOq*5% z2*x10P|Xcg8J>0MJJ$)^{2u_aKuy1j+RWb%0xGENj-wq6VKH#JZKqOm>Qg<(SudU2 z9p@*%zW#6j`X}w&Z_XX_qUvV1(@)~CS|QeNmL~YC>|WwmadihH_h9uYCSNdfMybMy z8-$g>pD+8h)=IPDV*~b|{EL77#40>^+S;L7dEpob4oEKe0;%X%%P{U3s#h4}&_ZtC!SGWp{QqW;0>0mIZR4P%O z@Gwq-g3}{*c1oYCMHQZ^tlyA0gKRCzZ+~{ac+Gu=y%r{ko89W_+sPONv}DRdbk}P(aj?1X4_dpUqLeAgHi+m1Je`izCsM=cT3o%5cJ!v zz;sD)aC#h@81?cDftvk)iacxgdlbd;K)qUVZn`yn z^67Bu#QOGz6HEr-bP!HqOolfzD_1zxMh;c&N*nVC+80v>ywf#Y^Vw^ecD zsyp!A7`0yJ`nfX**eb!vd_s~k|4SevTvdLB45)ax;^hWEjd&&EA)lLM|^)Nw& zRcf}N&smd$z4N>J6J@*sp{^E}``iv)Lp9Que@-uW(yR)pla4=Z6*nJ4VoNldM-4 zf3V(1FhO#`IEHa2yqu^-x=x-Ht*vBp$=P12rRzcHPX;w7>vXnTFciB*7fX}!fej&KdCQb z3~?YtL=h@s%!+kNKbXJeV{VlSDvt!%4U^u$otnVz>&NeY^s@_}4WeqTF^yM!4ORG{ z7YqiCiE6bGr8p#p;dG^zY_YQY)e9>2t?at;u5XB-g7sIDB=C79LG+7m(eK7(E%WM? zpc+jd>us-GzPWtz;-&Maj-8(wg))Zqlb7RYOJ(}dqzK$YAjNk#5^l$W8q49Kt4B;e)i49b+#MIqOZv~JRZXL)F%JV z2&ka4JA_vKoqAylM|sD2|K|2j-udwA>Q*?lh=Xp@Yo~*)dY+w}pM2r@GmEEZgSr#e zyxD34t9)VO55`o_6fhj^UwBJI6l?lL;IFN%t((`ces=Nlg|+s!%Nq<%OwHn{GH9)Q z^4XsSU7!To zhk-)_YKmk0+2!Y53)hQ^z+pr{`ZjV$$)aiN(oKp@^-o{FhroFGN^jd5cZAG#yO@j+&q{ z?&;Rq;@*$Wcra=BhnbqQ)OEt?=w|Hv^uy0@Z1?=>c^tn6?e_8dR1_yKoSgmME6=?C z>gi+0Mc79?sX6QeEXs#*HTNp`D$d~59@dgfqP`5dy6nuc_2cy`Cue`vp7@{Myu7-# zG1aKfR2s->ch)vOx^UqeFPuMrd|KYn%qd^Rt7x4E7Xd4lTMb53t%g-McSDwbQK#J9 z-umeB#j8sb2)zc;)!>kpt`H#jRG7cmVCv>EUAKg?PfmEm8{FJ;(&&3s#9@NQ?muU0N#hgqonAERT|yFw zZw0@Fr*LvN@JsugD0RXczNaA+4v$nk%OrUf0J%Zx-gcx!|Zs$cxAh|%EqU8I^W`O{e zN?C^NMT#kXr4mG8+#lRt-`sll&i49x|CR15=bl~&CnlQ{ZZC<}dVH3`c0_uw~}29u$G!1_2BW@vtKPFfxfxL~Uf0 z(MOam1Sg`@!V7cJr68zaJ3L%l{cUP{yw40rh>Q_CIPR$K>b@cS7crRjDyZD+l+p`#cGsO>AGp4= z!`@%O&O35mvSuNE#-?cg5YCb#ugDR$kpPvYxHJ0_oGBrMWm*5{-*@7>3oF;yAf`Q4 ztxV5MwBzk-tDA72Sby0F#qzwkxXHv~m9r1ltKXj#1Wf0-_cCL?-(DZz9d^UgL9!qS zQ9n+4LD`GERuQ+otnU~9`M>=0su$FK0)T}qk0oB&E3+Jy%WOVuE098D_{oPLbmTN~ z=A3%1hV}fNmE~KPKEL_-=bv1?^x5UhuRiy}AAj!;Us^a@YX*b>tDvD_G)oDFm@(iP z=Tf5l*Q5v>Fa(%^$BW0TY?&oxQR72<#C4cXEIgZZUk>Ijij*?(@`0Pj;*^5^WczOa z_UD_IKG?W*@zivs?q-oQaEl(!Dza9Phr-#FP9>~Vh&j<8B<)SN7l%bTRgYHJmffg2 z6IH5+HE!42y0Q6rXZcR&l|P!#ohpqe%82!DVIZZQw1|H+gM}{$sAVW2m(uQC!xx03-Z%iofN z&lg{uYjV+K8$V^UQNF2XeEBGz92G&u{xLfZMf&_yl^S*s5j7vyutZzlcY z6V+o-;ZHM{S(6&FB2*_HGSVHD#NL-X8@G7jKiCtva zM+l(nGZ=(Au-KFYZt6pk26r8FC4*LW^K$pjb+5I$kl(3?t;x(~!bVun%d8Ciyiz4D zUYR5fw+mT<^Q*Y7H_SZ=FJ@MI_|J~{H-)J0v z#VhCYY%-|U@YW~FN>pP!ra{SvU5aRO#9AM^(E^TAlOph2Apk!^(0W#OrQ;f+!gydU znLfqQY%ncaacz?_;k?L$NCpkb%M5dR3oPfS>X!t!S<3y{Zy(W@zt_r9PfRM{4JzRme(W?u4W8ro2Z(^(SEpVll^MX zDIA%MCwNsd#C@k6ltlH4Dp)P&86%%@-eUIyD#M)X0 z6{RMY4tPQ)4WXfO ztnO^Bd-D_XQ`2YNxl=V~h8Z2{nE@w0D#0whuNW{x3k8Cm$_kIIQP_VNuM@U=q}xNT zsFF^{2i1S0{MxfGHRfmBYVEzxKK*q0ru)k`yRXFGI{7p~kef5JQmQnxM2O}Iq#_}7 zniPQpihz(L(NTzqVxrkeJNfPg>?Q&CMt7FUUv^4CRuS@2iP7LYYj@J^o55h!Pd6gB zTdm}N5wq~jSV7!D4Z_xtktaJ4MLE0@reZ8)QI=H4SQE8~jApp3GQ>t8&-^^8=lxo- zo<*H>^HX#w?o8DWXIYrS+@@M1!Z!&=V^Qa7kW0K&=t@h?A$ z$~-DFx>)FNl4S8}FHi7n5EW?!A3He5Cwv{9+YB5F7iux&yv)!w)tJ#N zo!ih1p(FQd4$hx@woKzj;GR7;_sn8YtBJ;EyOUrKkPcEf!CF-e1AwGoq=P()Sc$9E zWuN*48pQ_VNtS2CjWI=1u(Z^CzmfX8!G}Lf5L`y|y zg0k|{E0+*I+;04hm%eGm_=`7}I)k3SFm=Q4tyYUOwexIXk2X;T4LM<(M2HDoBxkb> zjG7Qxn4>UZl#dqT;IeUY%x0P&SqsM zz5}u&q|5?BKPe4v%0$GlO_g#rDFVMY1crU{!SbY=i7fEo^{?E6 zBM!j)@nN^PVxn1>urg%<1r*5zrgSjqv-?Fj z@fE({!KwOaiEFIRRz;l-e@;T7j-22orQcXBLvlQx8b_VHWqzw6IV zw3`0yLF?CUC0|-&z+jxu{whrRSRghk)p}U@Z~yE6hSH<~aAuN0&anq@yk6a{KjqB- z>DT_SQEk5U%eQadUi!O@_Dr?@#K6HCXfX^m)9`1&$CZ$emZR_ss*4oM>=3Nncce^phA$cwaC6E9l3h^89usz`; zMgUL<#;O@UJBG60LA^%y=d#=(Co2U$yVIwGertVeZD}T)^J@zPkrDoo|5i|;P>j>8 zrSStLN~xL@f!_duL)wF6)y%9c+mR(i%8Vjj$I2kxes8)t!O&%0d7~RAnBO$I@OSWai7tJs=A;K&Fn^dMwk<2p{%6jrCa zAR>}5X0|Nd#;m-$&b6-d=6hG)|M7@G^mwEYpm$jbm7jmyP32_QWUq_*!`XDQ>&eE=)jLlu zo_uOz_FOP4>q1cl$KF;RPes$Ozw+8kMb^5#^4c3efSKAUsMIUfS{T`mZATFW^OeMM zZY?WYB^LG*Gfw3XpZ|kuP<`tczgoJs^z#qjtye0~99yhbaKe<#L^sB`KMEL+niPS9 zh=6o#)3@o~W?0EMvqKHZLj)DkU*thhqOr&G3NQJ1`C4~#1=sjmwOXxUIO%rNc+lhv}#r|JsPMvMbH~qN@wCwmCTjK45Ajav zcY0_RC?LeI(D#xAX{SulyAwCBQ*t`azPE>)V^%OE-IQdGX@npa1E1PE9z3 zQz|7?Oowm+LgNzI3&s+yv6Nyqu~5l==Pz?q&S6C8qQm*uGEnB#rDyHT2h|W4Dnb)6`5Q7|csL{$D#eg%HflKi&dSzCFg@FF!dIVuc`%4ChLw+QT%Mnw zYfd)K&d#G6728fUoGdmUl^M=}sE5Oa0Dao9Ao53sff)*B>B_28n9+S#ws&-h^fhQZ zz4h&t8-ChGBVNadS)3Lb8AY6?l?dgbm~V+!J|c?iXP78Up=2A@@}<~NnxAE11@S1} z=-zE@Of+ZaDH*F~4`&w9s6gT%L9&_4xV>LmtY%OIo=61XB4L`~jbuTM5n)J`2r8x1 zlt@KRFDVB;fha0)nD4Dz`>S95^m=QvJLvb??Ia#Vo;SU=^wzb{F$egU|G}TlRqAto z9c2o}_Ib>bco0Sre)dl!bie6K9UU?*^QuIFWRZ&Bp8iF00~82%V`n*b{OCe_8HnDM{_>@3atoDzkMK&&<_Na@l#R&No)X!5YXuk zQkN0XoIf=cCh6rn8&@t~nVFpa<8MBHc18@n$QsD&6j(*NwVD-CxM&qAvf3?WYdVSu z*dKn>4W*-UE*~q-j=CI|Z1?NuMdEokv%43rU3LS%S%%+!?&WIcpsXW?-igyso$hYD z_1?Qb|J6VI;p^Xy2mQIpS$dvyJ~mV_{T<&!zA}pBqOHpSPo-?^1J5=a)f3n2%2*4h zo#?sepRd*G|JT(k*H)Kbik~~}uq!KJzxp*Iuc9^8o_iF#?csT6x;3+_98F)h1IlGW zHoc#9F&4=PfgWj_6JK>lc~BtU2Ptlg5z?LNP7L7oz0tTcP4)E z(^tNXQV@G^lKd*K}FtJCRhng5bV2=oew*vl~~jhU~0wefRv=PBy0NNY{h1Q}m+A#?vo6 z|I7E@Sy@`HechX%obAbAlrbPCD==g%3K)~az!Tk}U8Axco4!m%`PzoRFgI5t2(g1* zFLsc#!A$;??P3! z$p|xtre6BBT}(DKKqvvsR-WM`BYjmIE5#6i_>xghFfQ538){@bv88I%$QIz_#LO|m z#gaYs^1RpYx03wk+Sbb21`-vaVcNv`N{ddB_d0{Rll<>L`kT4=fAPvOzfzxBxpnFI z$;I0ABoWVu)jSvsC=8=7PNJ!5)*U&px<|UT_ShYYE|Uj zb{bdfjSJo7x8Hqdb8USls{QcW-}Mj`2oqG4je4D66@e4{vp@T@fBirF&)2V9J^$>} zsaG`pYCG#s1~t^1Nt&|WwA$L3p2S{^ks!m#%-Av(h}Gy;s|=4c#qoAZ}rO z>_+b9%B}ifJ#w?Svqfb13Q83s0`&)R4?|1*E^)Z`!ysT&hC#;kFPe8`7({;xm!K#n z7%DUc^$YGT{cevVGklUV<}eMGR1ohXPNJyJazR%1>d|E1>2+IotH+-bt7bxGilRmY z6=|@LExV7FG+mP-aAXk}k6Yp93`5s!RN|gcucg8EN^A4d?VEkS>|;ZTVWnA;U>rfW z@JM0XW5O0q9H0B(;-{~ieWtpQzc_uYQ5W}=B*ry?vNat!3vOdkDCWF`OYzu!j`i1@ zYunwz-{{B9nd3oTvIRZi<6b%U)NAKX{^02oFV594(RGR7E0)3zd=No>2|X89Wuhk8 zK59=`8Q!CyVjdMi1y+yVOd)pa=O`y8QQFQ;#x4x^Yx=o$}(X>w|tD7U_-GUY)Hr zCa}6CD5Hr$L?4!q>EiMrCSGxp)}su*EU1NUxYk{-R~wU)Q@waV6_QY5N@vbv!pxJG zfZ#+>A-)BB9Hj%8u9_1}g-tS2AmLi+_J${u(rr_Z=5MEOeee+wWwq_3^j4H0rq6PP zae*%`SFrnnlaWqMOqaBaUM0l09-~K@_YwZZ!ycIg=Sg0cyaNZ#3bYwdonsAn$^Sz;s~wg4AHhm{1b=E-Dl+%&@!n>E%KvEIAsTB>2JelqVs&VJ>MN`=A7wGgEa= zpL0%4pL8>*lDkHvyrS$TF|6K3zw`dZ%U^qGk@v1mOm>{#z-UdX*Yu<#Ku<%ipo@(K z6_Hg;e+Q2Z^9QM+QWWUhl2TmseL;uiv~u$zxrj3^6z(y1JR%n`yRKt)Dq_cK+1qg%c-f z0R_U*A-{*7#4eU_7iL_Dgu`f*v13Lle>Eur2MhsvwscZN5<8_MXfUR@!d%Zxj!&d< zIdSqt7O3)mnGKNAMX5obM@T@3LG^(LWuCJ6H7m39b(!UbK5#DayyODES6g&^QfL?g&pKe^!`}-bD33WR6Z3iT)Ewu zJU($|+WGElr`gW&7aw1|d}kF3R%z5a{q0Y$TwmS#_SAgTbgI2Un~l6RDFR~zL@c3; z8FMcys|@=mi$Fem5IHH^?1)$qFd7h4R-EpepM7wBc_~ba*Pnm(nW1vIo1pEvZ&STh&M1*$R5H{;V~Qpb*H@g z(MNYaX&qZ%`}a?r#1aKT#bqNP-zP>&3Lj=oUKo$Ya&bJA#&4u2iogLwK&ET{%O68R z(5!GO23w-7%n8dVJ}Sk)E8@^A#L1pJEStgc$b2s!Baj<$2M;e1bBLbDNA#T(3JW9` zDVBWD2-)*G7ay<@8?-}E5q+nWFI#EDN%gQwDbh|h=!7-d(O4KS8Yb-|dM1N@m|xnY zNf9_=2*^k?JE%a;Y!Y&5&LBY8QZiNor*da=jfJ$3fL=w(KE&K&89)Y+$tnY#frP!j z>#r}b*D5szl?=_o!KgBrz^6#W0i7iMQq*?Rv1B#NiwcAo>3Fug zN}gR4x1~iQrSOqLl<5Zs~gYGEFuaOgVa+&MScfO zLj-Jxv|1E<9CvLQ6sS{B35sQwEb^|F+gCQ0e}3V8><3Rw%zXdFuT{D!+b?Xi`_ogk zK`acEXjCwpL^;XMjDdvqYQ?=zKl$X^%^P!bb1%L8^68Uj7)_+HxKGIp4l_O&An9|j zJpbOWe!X;S<>K|LGt=`FG{nE|Fcb?9UD;cdAj-=ts=pRMkpd!G~poc>R zOjj3bfI5R?lSW0TDyI#1_BAcMMY)c0Gn{Ud+F=o&&<3W3VzB#TC+GBe%G^^8T;T&0IkJB35pfkvmZm$yzTC)>X zOqD&i!DDC6IL*mwn#X?V7g@nVxSRPKD;vQxi+E;MWd|5dihv+Mzhc6LDY5bieNuY4 z{TPJkdid$4tm&c_MDlmi8!NXzSh{$1^X_*}KJ(i2nO7Fi1g!y^6>S$8ipd1mU!zeW zRI%)-;yS%hq>;%myztS-VXgXuAN=6N?6IDcZfZcB7j; z{@l5(?e?vurKiuFr$sm?qNu66K}*6TiJ*evj7;}pRZ}3cFtE_(3}3-C{&zY^L4pKH z35kJ055FY>_YWyMyiE5(I+0z8p(iA|HAl{YDm z;fSCTd3c&I?Mpu;H*yDM$)E^=YNdjWKzqBz4I``&DvU8A1PIdsMztFt@JQ93pJPx7 zZImG{S755FT`@xp1*#1pZXdM+f^$uZzyU>I%=VjM@jErrmOz2%Qf${3LMekt#;=?p z;$xNRR3KyvCl*(>mf|#a;MOFiES+?0xwNQ-r2>I2s7+ymkS*ea^_T& zD-)EC777R|UQ`*BCDS#`Q>*W+ZEn;X^#SgPgr(2YnqQp?UBa4%`M^o>MW3qAEHEYG zBHZo`2wR^rMY{p>y(~UiHcqDR;SgZEk_;zf(^CcAFH1(Amaa}wbZ*NOVtFr&6@FB* zZHqrO=~U5`cuuYA*PJCmKe)KYC@U`9B-;x@2qV#c;C#K^lBJJT9f~sRhV;AkBmW^#?_84=-($10XnuZ zh&S&>ALnNu{qpcQ85Z>HA|%&}cF|e7vwY#o=gvfxdHL&SUuinQWOagW-I$u##@W|* z>0^E_re6pubb2xU!szSfQhRgj+pm28tt zk4TQmwaa0g{oct)0@@|Fxilt?;|!L=`` z$ac8q5>Y=FVk0^b?lVfnV5AyVAQo}Vo(+gG;*!hKEf!)(`3wTNhV+r=WJgfpDh8I& z6X*oP3L7xdw*)@B+>?lG**A_Z&>NO_&DLPKY(_sE9x|c~sbctAK}8nDG${fH6M-*I zzqXy@>%Ze{%rM|XqMR{NFvD0ZZm5Nev6DUh!gC+LzlMid6-O2JZe>&&KQtcXar+=U zRWK4?c=08MD@BGF=HNMP77WN>DzR-pqQ|2ps1Oaf=6P|>QjjbVb>gDkPlL(%tcO)R z(IET%e#utZjz827b3`B5XP))GV(bap~lpdHfR zOqpn1ej`XlD3Pvb43jyfYf1=+vh258(~bI>6N@iB_w38hKX>|sU$4pXaw+>v(3wTO zV}nInG6Kc;Y-#1EKmYj$AATIC$+IuL`tSYl2Y+&Yp*b~AJf*<#`=v8*oo2P#Y&6*9 zvERc#*!& zP9ip7@I5X&u2hgZR2PkG1cXL|4c-#@ywwowafwaHrF^^=fgD)=}=r;^Qr5W*Q9Y@i*$ZArVO^YSsH z#?Xclh1mJi$p9RE=aF%eesAap8EhVoa!rC^n0q@&iM=Ja4FR(!dQ=3yh=A=&W@U;F zBpnAjz)~0=BoXOZ$OG)zTM&!8Q)ca=j4|gjF@fpTh~h-s6R$}hqX2Y?V)0j8IGl9Ou>Jr{BgsbC5s`QH;uRd0DcohUO9~gs)gNE1`zX(tZB)8MdpZ zc|LYA(p+&c7&rUTjd`-~{zhE&A%=pUL!SuPwlV8Bf*Siduv^^Bw3m5Rj8_JEUaf?F zHDF?{%s06^$omuXQ|uwacG^Gt?9Q9-T<#=(GIeg%9h6~X?)b^2poVDP0ggwcfDsqI~C&Pm=&KAPv<|y%-wja!0Tv=V}>^l-H{_FE^%)|UN8gNnl zbZi99awBxJB6Y2SVLxb8E1*wh&W$9T>#u+O4}bE;TeFQe8rpDfhB7|y8@=DGT)BAZ z()x`%)+m{qnT1pP$>d%r!gc<|Kxfp2{CoBQXESqGPXdg1Bq-Q&t^W(Am zV6bWD<&5JNX-3>iH7?9JC+|v>C1E${C0SHtq|NB%86Gpdp~hW}%KX(_6-C32KDB+8 z3yQSpZ)`5j%r&UpO>`F*ImT!-GMe;LVf;j0jSWYbKZ*Y@&`)#8gh+HpbgQHzwokPj z(ofx zYdZI85|f!-?eQ%{qK2#Y+2!KNWuNvMx_@L0W_&y{RW2E16LP+oo@E9k)f=aCxNzmh zDa&__=6`tcjlcixFaK%fgSBq6*=UjI2%>GdUb5LM`=h0xwcvNYaqi_)3rlk>UgE+N zv92^wPK$-JZfeTg6JX%4EsPdRKq0vow~-a$MZ{KY2_PvVv6PyJ@5h4fh^iRp6Qe(j zA5g14F74)AVmHRQz4f3Mc9-N1U?;JLL`Gp?kyOKMKzH!?@l9VNp^d`dur%Oe!!Xn+ z>7q)*hM!b%G#+8;xxaR2b#!>K2_YqO(_XSe#1E4i;O!DHa13S;ZPC9TpO3; zVtDn|=*R+V8|nC^ch)zAcoEp;77GVt9Mwcv60rwQGf7~Kd_vdq2zdv!l^t2<^mFC- zB>GDot2fUt1h9D!FpGggh)1>Dst|+uLFzo=^l{}XEMyEguEZv0&}t=SGc{d7Q&BgS z7RiDN<&=eWLnd^*D2MP`czLB_Q7Kvh$&3)Qd5C9)_l@Fbw=P_|`N6L*y?dgw_|glf z4((gU-F|VfdU55}&Aa#F)nVT>&b|6l8hU=Gtt=$ffZ|4>oe*ROX~RX)uQ+BJxnsF) zdwno=TMfoRVvJ#4t>^LG^;I3qs0mKqPc@bZiCyD$;P|G?m|%Zp9NB+xC68|3{$Q@v zX}NyW3)`;iw3}qF(Dy?6nzBThy`u@CPJd2-IQ?0F?^y_d319`d0nP||Oz{ou<0JlF z4y2a`EDKg)Y^_Jprtea(NX56y`ob)X0D=#f-0pz!;^{@N+aGpG#Sbd-;Sz;<@}y}K zH!cnfnWB|oB;tDl){DcLSYWJ-0AQ=a0Srrx)N+CDlM+Q29l}Y8b`GPZ>SWsewCno2 zhQO|afTlPh1x+MsdY4Ily2EiuNE3=&^aM>2uXLc8F`-<#S1S);D5*hQaA^<|ygz8Y zar#Av)R(iJpRL|zRg5+U<6%U_;&y2*1m` z;*1$bwp}dGG?%)Kz^p>U48oROB090K;E%7lDUrGOkmY`{>E&_cl@#eRLff2cc^wy- z1?G?ogxge078V~7tETTRVjKJ7(X)f2`pD3?X+`gB|NO{>^?~OI0%{ruaUM2sUX0xe zP^(Bl2WB#JcpesO5&(AntA4eD_B` z?g6_>#jySQ&}17rh&%kW8Vyk~aj)1c_x4 zl78$YN2+-A84B#s4kW1?7>lwD6o!&82U@n;cdan38A4+3Gs}V$eD=yKv^f;jh2=a?^BJrx-(l+N~lV z2I@X>mf?!9YICmpm0+tjF_WkJ&=!Z`x5XW%#(Nx%058hIK~Hz5iP?! z-tkY)H8yYGj9224V%U~%565Q?98?Gje^2BH6;4FU6uD-EZTtxkOJ9R;A|LuGMOG5+ z8MsY{$V+RtE_p@Vb}QuUBa2MPK7RJV?0iE41XxS(*}LHdhrn=P- z*a3lu7{T854~;i!>fdp#-sK`WtuL2pmyZg_9anko;ejby+Od&dy?A-;`t6fvPXD{t z|L8crVE8nW^1{d$JK>D8Z~vKDQd<1&PyXrJwQDEbF0Lu4c_HSe;fDdlTIC6XiRv7^ zK~ZLoy{4Qzx$FlQe|3B1-mfoRuzhb~dEeTgug0r}1m>%;VP)q7ZOUgt2$KuaDBd@} zV78n)@p$#Y2j$(XH{#7h%ZtZMl`mY@CKxv%PKzW;BzRTD!ueUZ8UmjL0YNiG2>Jqz zgzU3J*~Kv#ialAd`u$N9p^ZgVC98xap{HOmwN3HmqIP4NP{L7UhKFcN$AZ2nzmiPn zme9!la3EToMlwNSLH=ROe(5*~C01-R^jy>R9SU(3UY1qE1WF@{F?VpV7Zn$y5~dE3 z23e`*q8@^^-rHpmkZD|qLAB|QKDfQ*9Q(4JUZ8$GcB5`k8=+y99bB##{~S@>nU3Vv zE0T)hN9Ncl*Nx)p;C_E?^D9e7Pai)q-|Sdf-nQMQVYf|Zk*t@(_`yLEdtVZ!;yPGX zP$}ziJ$58}PUVn!mEdqs=gp)z4RkRS|l%v z>5K+IO|X{IabCdGkGw9OO?vMe$peed;Gm)gx) zpCUo#*_U5Eee%R&J1~;5D6d5kF15mJi83I23|nL)d@M`;i@>JnWHRhe9sS;*jruJ= zKL}_PgSQ$M2;d|s^1=GMckf=maupNGAAI#2Glt_E6=CwN%142m_wvLoJimDJm2X{I zx%1xTOV->hPAQa|pb{k58~Oo>$TI4%Vj87ER%o1k`++g=jOMlE{)P81_oGqJ4BK;5 zcWq(jd?l0s06+jqL_t)w)NjW~^d!Jfawtm*ST#6$VcpV97zc8*3}@TaQ5p{za=tkp zT)6T64}ScQhraPWBoiWbP;JwLY`IIno_;{Rts(Fc2y7z=$R>-Cxk^n*sjY?E{h`hvJ{H^aLbgy)GYSdwP1ZZ!mU zD+ILcp|Sr%`yAY+itU}JdJmyhxk35vOT@A`$cT>&PYV1vj)>=U{IF+4Kf8PB=kHw@ z-rt-lyjSK9oa!DWTN4S8a3WxfP-5Z=kR(=$){Ye7o~W!@-S8g^IIpLNryAPxcJba5 zR3ul4BVOqqNA$T?EOj+`ZRZTi-V`_tm54I|iBQGP`g^ewQp> z#!O{JwvQv@!NZ3TRL}tvu#PG?A?%l6;vhi5%*;L|BqY^rbICq3`q7TG5TR=w$sJ3zjpWDrC-0B zy!s}Em|W^AnFJHyk|QZ!VdSQL)ZaA(J`n;6(*$8B4P=w49nF#8kLQwe3lgxpGYjV6 zL7Mi++0x(Y7gBRUDxk;`zzmOyOOcO4T(vf+1&D4%-6rZOdVBZ~{VYTjc0gAeR+%hG zSRts|;1e?zlK?aJ+^jR}5j+p46}V83FM2phNyJB%Ag-4#>Q+Nww?Y8Yg0}%zHOBJA z{?4}jiyirVm`ZkD`^dh&QC$uZpsf~>MR+Rl&{3UPMn;*skW?7PgJSsW>+fH_ePbcA z?p;|K9ypoJ?nmq9qho`si=?1L%lEOB+OCH~v!-SPFHDO2i6B!qVF3106P$%Rm#G%S z(x}OfW>z>REWH>QXc+N`tFNNXHNrdmu(J@lbB!5p6dy0c8}X$&;c7n82?7Ia#w4~@ z&OWB`Xu3+BD#Z<0bYXIa@+@^EyktDKiWF^EoD7rkD8;1WU?fzOCtrH0ko!>d zhUAy5suKs6WRS{0Ga78R1nuRuXdD+Uo4mgyZI$dTNI3FQq`^3921`Ixw=WI?jYdOC zKqyQGhpViZZFQKfp(eaps!?uQXq~{>9JebDa_PRMCD<&IYoP`vPZzU%={mlL${CLs z%qSvq3;$MPi!r*T(Xx!y-(30AH{blqS6^!zkdM)?qJ|j?`S18}oX+`hw<4EEfWUIW z(;@o8$V1%C4CBJ}%m4USf0L%993wtPbw$=DQ81efLo3}&{?cdo-Nc19h6t+Z&Fl&odLu4CqHI&@)3Uvkh`NvO* z>lKUr$28=8jzTgjRvtweKUnUpl)RWI4@}>2L(}%+BwrtGtfu3)Uix+xkdXpCodD`U z6~9zWM#F^&tFSTgltbo|s3gi_oJnLMOF=43eY=G{x)(Sw+Y`U z+?&J^2&X0b13o3u^M;PUD5U9o4N)I%ve-Y+z$n*Axue# zZur|!78ogo(;<0=T-UP#Nt`6tJT&l&oI@~uyM=0bG#+=mU4Cv32IRJDwYzCL#FmH$ z8~yWMN@8In-%3Og_b;)i2n=d5MPOUEFAM@8VJB=>q&USR6B@`1A0&6(t-R+sZ9DYE z(UFKN@ZEQlz#v)$%wOnIxztR?q#7pjN+LtJ7eaySLQddna9PstDXaRj70QwI{`vif z4;hl%8?u@=L-E|7E@KQs$ODTgu3s`2d<^-VA7c={ zX&;(fI50DZ1})2Q<{zhovRLA}4+#^IKo_OBatf2@QQ_NlD0TE{qu3MY_m-d{SS8Z$ zgfCHlVZmFDL~#tV5bjY>b)FNXQY8{GO`EQG&xg&9-xOmvA9xhS zUH{`3zY5*JQ61R7oc$tSSz84=VSq-sQkrGA?SrOkIRZCUN1IyrfAyFD_mKk!^E;ck zVD>Q zoD=ZQ;w3_|%62E>GS+h8%Q)Wok z7SsIT=DmOZ?fW0BjmO>`9+c3MUZF&LhOZ-fg*>+{T#V~hLts}zfS{`0P_k$F9vL7+ zcLcFODpfV9bEO#`v|AV+g+dU%pF;3vl^9AK3K7CsC_QKbDA4=3Dq_jwk1E0b>;Lw* zxB45%A}ueRbvpm^U;GDD;2BzQ%W6`38$uPj&7II!OkG)dmhH2g>eq&YTuf_~!m?e$I#fzJy9 z3e`aOwjbJgm8EgR3->QA9X@pE((0Wb{`ALx_N_mjv)!_7_L;~rbhsW=$>(moI(V=i zwi{+|fN)R2dnET59TuyQP!PGj#Xg8mivwtV`9Kt+{^g@cM-l8t2uP#8keGU7p|Kr} zLXgNjILN44!l;xvC;h1o;rwW-b6s?TFcsa)jvngW8Ui1IfJPuz4vx|cLPLQRPHa4@lm#z-NO0BT#@Rtp5jC(OM*jxfMS5y_LF7lH#-OT}Wtho-k` zS2oj!@-0ik^yl_@*?IJq4`0IX8(1HyoQe=nL5ai|;WZhw`Il$#SxTmw#N=?Ttd)=S zUjL{e@OeT2s%ZtGfo3*NTrWJhZ~5H0b62)je)RL7?q6Phao^#fF^|50S)1ZPw~gq* z#{FOY=x6C*bo}U%@p?=qMlQI+9#83E&CG{nt@u63Z)Q1Zy7r{rN zzN{IOrs)Wi4QqplHj3Qji+z?5$!A}Aj*%ewNa;IPJA)3%oWb(vNQzeyx1yz(%pjR%r0%6c)^=% z%}caO$=XHIA>qEjN|0UT6(y+fSa6l>V2CK&Lx4FGu|!-=6pFGA3frbuGx4zxy9;vx zh~8~_-VoO>FK8_vJNfPJd~Y<2%CI3d=v1sPH;AcH^~+mK_O>5W@6-_3B@h7l;hxCz zD%vFKYYWA(3SjsUjeyXXB00)?+jhgkdH<IXmn z>4ViZJ|v`g^V_fd`)~f4=+Y)nKrER)9a0tT*HlnZl*=^0XzQjSuxA9733i|nElR=# zDd#BoDwVSlvN5o^UI4#zuRr|9w}1WK6?gpLHdz=(S+P18gUCwU~oAR4Zbd&GtNFNGUkM;B*B=Ba0+P8OuUck+mYBevmMIBDXN>am_Y?@sipCg4rLf zw5ByEVM=sDN2&B<&8LX^mkbAanot1+76~sb=|-z! z+0vt=lcb)iJVKE9(dKx{WeXb6A6b5^zzhw4hH}Hg*fp&4U-_ChcX;8**_U2@aaV`U}k-MbN3=0;M^A3ejxVuO(-M5G(}C_EE;jO+^>MNlE;-nGUK3No3> zAK&yfzQk7vj)R@kKDl?B%G5KZqsb9^<)rjIIWR$SeTSg9dhqll*Hu?9UdPHGk-fz* zyYow?*D4*-xdeHfsoGu8F)nU00;OeUTelhlUl0U9x;RgfE=by?AGt6;|LV)HbmnG% z^Y%MiS8iVQel;^QgW=*@ym>bpHWKsY6Q}l{ICggbsT=k$s+3@Q6IB>DBaNduLyE|% zg01-WDrsao@3W>b@5={VpWwTCB>OO1+eZ+XH1Tr#HXU&RLJn6UuFyH+3i~kyiLk_O zZIRrS0Ayhj$@DE1^lV%JkiNbkAl8q0mLVYXIYQ5XZ4v8Ms#vPx=EP&C>B85fw_jz184C z;Mi`QlE;Jk!FZHOwMWKO8v73)T{`xH)mmW5gt^1}QLPr@9w~+x290HAyOVmShQKa^ z0G3Fr;h}sY?@F3clYt7^sGN$-EK)JIOVvB<;Y`=0`!@5K#4SV^ek${(-jXFiF2q;^ z3B*-Fp&@E`Wu)*{@y2qh(V$Xla~z*rKKkvKzxu+#V`WTgFErUg?%VvHP^z$hLiR$! zLVM!e!k(h&T?W%HX*hdDPysV&Dk24Qinx&TL3UPBiZC3*(V)|6mqD2O4KMK82ae2j z+HM)VzZQWo$~z311U#1@5=kJTunl|@oKszcWm#&aDoNL;Vwgg4f)l9*jD1g}6l9($ z2CKD7P#Nsi-Rt4&@v~}x&NTg4+2f~Z&txkgaHl~WXaW{rDx&1YdI>o|W)qi38NX1S8jDt=!Mi~W`UN!YOSp~!o3^XGEnC5wYfBimg z$_U@i{QTG6`0hXb;>QRomESg;26cjpGA@vcgaBDum=><&!3+5W3bV zY-BO|-|Z&Pg-^TWjxUdS?MpR|vDj|6!QR+C`LjeT6Zxow>O$NOH!Vqgd{*|mnDe7F27#>da zA9@W%J#t>83K1px<3ZpPXX)ejl@{@8(qA{SEw@T|uwnnvpZ%%ROHMQwPR=bK3qvd_ zMJh1|a_eNFp)=VNmoQO#i;My*$9kln@S*4L*`IqwP*JGII)IW1DTP@UHeJltOyxR8 zh4NZtWyGI%E6F#;{j9&a5ohK5C_%_YeRvK{@Hl79nm$!y`(zM11r@=4bqBhF&C%Gd zyf`lh<0!T>C&;$O>2MIuG+GEM;vl^(s6Zlht0Axh0%|(dzcnW#`)X!oJHdRA208-W zKsjx2lph>X*Qs4~U?SM7+Z8Lu1>9&geAHbDxmYZhpCtS07-7Q?kAL%Dl&_CtampVc zsANlRZ~x*UqeZAA@ha;^N_t{XtQS%NHAPbf2c?p+BC9~%s2h^(MgPUVsug? z#P=&x{D})HW6im93Cqfa_ZX~b-Aw`666-F$_tIBK7OvWS%Tsfq~ z7%%Y2_U+;j4Z1rhmr*vCB>i@&ROH&8q&0%_3-P*?TQJv5h-A`P{Z&I?_do#G+(9u$ zCu@c-dFs$3jf}Kc4u<2=ty{M!w&+_9VOTTG7R9?}!#0Vzu*d6_;gj%svh1mgSiCz;}T3-I|*u`F)B`N??Wo;pxRE(R$iHfM$#~#8Uou85Pv2SD#V5;*diu3oq}7GP|TzdQmlgAVOzM^FG?c4KxQxr4oX-j zxy__x0}F+4Od^Vy zmxRT!K~Kh<;mw2%oMW=m7^YbnR$gTy=wOqS3@$=YxW&*9o_-98Nh zO!bl~SWrevS}Szp7g%PFBLW^VN6zHw6tNP zO&@U*DU=4C>4ud8++>MBO)N_sC9koCh*3p1$b{8w+5~C2i94%orqhWw*3$8?)oj^e z+pOF&b!^YWMMla!aFcTM=LVNY!F0*Oqi&w|R)5zJ*aZ*}oP?;Xq_jgyc6;cP`bKqe z^VTmfynFTf2h7_kf_|I^wsT-<-`Ue=UOsc~d~^Q{@rJO7>ILXRh(hfPkEGTGAsa=a z5bW4CS(P3{o0l)W_x7a=mv7(Nz?3rIb{1w)ZGZnqKfZtSUMDiT|Mq{J>n=DQKlBV1 zI@Kj)F5RhamEKOCBEL8x>y$*4@gO-;Hz2TA1Qp>{U^0+VsG;aMnQh`r$jdv_R48ox zHsE^l)s?cpad6-4e8-B%LwBoJf_1Zpz#MET0E=~HiaQ#EG!8#RBrr}fErMbXkACu= zSarnOCr!Q-movpp@OZkbE>IiI2+{eJfF6C4JXPJqn0Zyd969;G8?1T5XtvSl%$g5+ zxBG)^Y5CatASQzVLBf`i;r=D-4R1?9$tjce@R{}AUW9<4kt?+nr6m{>1mlF~7iU4k z9Q22?-Ol~tIBWO=Yzam+(+KZfxw_bzbB!#qjZqqVt&?ODa-2c58`RHfm%<8egTfZSHM8UmjP z0YNUODx|uwOu2Sux{Ac)2F{Tp0*`tl8}8rV9j@NCd?PBNhMAu`Fhd#ZD(O2mdNijn ziX<9BkwTk#>Q|N#5E2xHa)|U*^{&OHLdq^WX9-d37?(_%!gDrA`>C;UC$#JkkIKqP zBP!2X1*Ie@GuaBMGC4*ZvhcBV%+RBN3;Fe3M>NEBt0AzfAOI;r4`FKhV`poW*o$7z zF#h|McYbi;oonk4tiZQ?*Ti9WhA6Az=GOX8-ud|}@!&5Gzx1#6A0MvvtI%tA19GMI z`y-5ujnKiwh=wd0W|;AdB*ofj`^NpzV9;#;<>g=g_@_TJd_OpSIElF=p&~u{tNr_r zrK!=2lmG3n{_^gdZ+++Fc}T8>q6_twuy#T>3{o{w2&$$J$WgUd)0PIyo)J_guggqb z66?w&FH<{0g?RA7xUf*kLlMHN2q}u9oBn;~GJo2~thggGrY= zzoyu>^Vs9}MSObLcB1aXqmNwi$n_7e`RE>f!Q>5nYwQMLFQtfACw7~E|BH)T@4PqI zT;;UVBO{>b{$)pK=#$^>qtB?1Jg*SY6TJ$Wk}U5zwmd-&O)L^e3)R44RZUV(SOg*7 z+`2Q^+?esa6N^ij*$YG$_$W{Kbr1{BUx~(2s0BObV_|{Y;sV3ymQK|lFS;`rK<=-v z%m&S+W-Ez`c0eW-m@CDD(F>FdQ|21)57&;h7WQ{%`x~1KvN=D4{Y30J)O@sI{K~W_ zIMP6S%xWOk6*dw^N%2VDLPnx%M!?2R32U2dCkI3dnUH}{ks=HRug>Z-Y}HX>yfDJz zQo}FB{>f>T{#7ohTMdCvfWS`r!i5m4oM?))eL@-TM5Iu*eS%f6s8pFtbsn6q2-i}$ zDaB8P0Oc~$3iBpJA6>d|FHf_% zS;>h)pT$;! zFE2DC-yHbL=|}NMj{Lrw?)i7@@I%96YrD*-4FNr23MY?bqGnyin7{$4@OR&|FsTos!G+(vJLvUaTt0B( z)G43&9}b=rLLRZ}gb${8h1n%cmf)!<2tY}dAlx^MGY5`5c>hNK)PuuwOI<<|)52*Q zULz636Hj7-q1-zU?#Ed=x46*sy$$i{l?3)y;3ZK!$`S+>ifrYQ zgiDmlJXCl!#k&cn@A%uYuSsvRFgz-$>nmmZ$@GcwMCT(WfS#dhDMg3W?|4qVTSMUE zAs~pkjggSXHbzd6$uV3%2pgm+DkCnN3oVIXE?wSWlT}WYv(NqNI?3mAcgs*p(2F#KXQZvW%O< zt)E_e=fd^(jm25NJrfNudnBQ6i6Bvw6l5gLQnI%B^TEBpUR-?hwKw2}uB?7AjK-AY zj*^%%_T#~DVRjBvJYg+V{aR>s&oqxjhW++C@2uXxPvs&w>71p9a7(Dq5v>}kJy=c8 zv7#iodF$5U`Gprww5PPWP4gcExW}FQn9KLXp}i%jAYe1`l9pGblnD!?RZGnDWtzk} zVzKfH!-X-4Dl3@eQh7#EhhdXdDb6I-1lCU2Ez8mdny+iJvr0 zZT1BA*Dv{a2u%5NQSiW*Xpa%_hvS&T$3)pu;t;Xn_U$W|-wR#;{J9qnA2^5tHZEe2 zDa13LfDKC5u@W$U^Mg4Y8@fm-1ayf#_h0_uAOC-U{Wm}V@lTfj)t}GL%xtZ1ZuUoD z>P)A(jfX<2$Sg2MhOs}KegFQ=pZxg8RD?Wu2)9g1W+#r@!1v5;hNC3z$7685^z4L6 z!J4?YUvm3>rrex9Gm%oZFJqX~D|a0G_+6wFEtbGoBC8-rsRT>5Bmt{i4S~l(04&=^ zazz}1=hGdL&_!nO1G~}kOOl^fBqOH2C>MyJqAewgs^mh!Saq`!s}sVBq-PoYQ$6H~M^j%|L*RFTfS$l($Ji3y$Gg^l za4+sBB!?h%yjhO(1dm`QY;oGnvWDxn8eu#hZEf}b%jI9pzIHk-^8fP7A8z!vaHffq zIK(GqYin_C9_**$N|oiu4jwL+=g1{_<@(j$a6o!}%Xc!VKvZCUM45n95>`{hebda- z^v=q?Tle=BCthF#Lf|#kJmp_^j|nO=wc=~8?Cd+{SnwtuN5*)VxJ8-ckS}q%o(0zB z7M{I&Mt(}j?uN@@)I!_xd4)oZ^zeDu?OodAh$~V{k=!dpqEA0`yEM1&#F^9YUB3LopZ(;!-+ZexKP%57iOP7)Q^eV&;)7jK z3>Kumhh6)J|Ni&!*4B6aHGYFD1Ki`vCX=- z-9G=v)=zkTARtjwg2-UKA~d~+%p$@)x?R@@Tkuydb?9?y^|E9m!pN$`ZQL@sQ+k{t z^|gBs*4M%&QIiCgRHG_2<3T(cmuZ%xFYv6>@wykZHwQgby>2LuUo253b%!MsQ-U_x z$?}q#M67y)!C-A`gHkRK*XRB2&t?C6PEY}BVBfd>zVt*6>jhVZZd8i#WaKewggzw~ zY!X9wk|~9&CNuf7f&@wjEpiB1@B_mpFcT6X3?RUUZ<#5{FBQ8f<`m1qb%xw9E<4ZI zTRtm)jc0Y7;5~Q(Qou*aM^OUYKL??p!Y0H$z3|?p+qZ9b8qHVEy|_P^=P;L{cGB8c zrTbO+vJ}&$qfX#=kX6{yf6s`|f9m9LyXeRgYYV|HmSG|aVX1lvSmQvf}R#&paWRBAD}uFtn=;Y2?} zSWDGvbIRun^yj5_uv9NDG8v1xUnqj6#TK!sh>MkNcp(ldW|CA%Kxq>_x2qe~)w0<^ zsY-~@hqg~Y@eURhGE-2G$R=Mnt_P(0LQrx105gj`gC=5<42vNvq3DVGt}m=1@I^sj zd#NHGd1xfp?%t&4L^<0UjK;09;e?(;l1NGotHPymnPG>A^+Tc7G(#)N+P-&aZlNFp zzT;t3@hU3}nhn>dD>S~9Z+9h+H)~S@9gru6Kzp1rS*@@>67|e}lBX?FzhsG-7Y&Rk zwi#z}hRZ#^Xmxvf2<#m}g=rS-g?E=#fX}q4#e#$5fFc|rr8FDpY#D|c4EJcuRMntCM`cfRHxPA$ZsikNNmioJffKZGGDoR8VmLH7K zYE;7O`Dr;tm0!Pkv)}I@I(huu(bMGTjpK0;G^y{)G5|k=m7J=-RQwe-M>Xk<7!~z_ z-|>i1w2gCL`^suG_@{S&_3N8gZP&TK`an`~BR>=MXjVy8L?z`Mite!d!&9&R;TvzA zI&!S#n*EgMdXZ$1i%55j?-@_YVgj-x_bRcB(`QZ|{ds&Lm^_Y8&+1Y`uZ+hoO++xNq9$@ytd zAOGBsKZ?_r6eD6q5J3eRl?soJXHajO%rlU);5WlkPh-76w4$kBAKzhpw1&W!0s$cb zc`%0k(6C9y6~`!@yAo{WIXNjB(R`JeC&t1C!HjFk5ToV3!Z>0!+w0Mh6U)t4-@G|{ z5I+DYDI?6%vO+&d79!vEu%RDZTsqs>f6eIQdLxNbvoym0MpWG%H_$)C%tDrtzmgo{ zWcu#3Tu%~u*X^@GVDAVj0v|n{e;882W)P-`Q2~sl_*^8_uCSw&g)8QiXA-$I>%@}P z2?7_Dm|>BgkAsAE`K~j@*-NRNAt$jfDM5u;XO=$NGx@@5P z9l;h=IAtVd4>5Dwo5Mb{`Tm8)dBY<@B#1LBXcF^YfK6Dwb3PPG$zgbQjtx}g1Ez8G ze!PA#T>PK@^nZBg*2S$}FKjih-?tP8PSyw~oB@mE*^`3;X(9 zvyGraI^elRIIJ=sSsbiRxkpAn?%8u~cR$y0Z}Ro?78$)$;Mqu{%NN zb3`@7hBPKyTesrgm!Po{W;;dn467r(|{IB40GLrGwzWKz@qQv>(Q zyn#0qr8O>+Ncve;Vl9$d*(sH@$0N(5EU~<}tdM;44>?k|8Uha?z;w@a4AT$c2<;%Q za1usESRo1OT^(+c_?iOo2bT7as^n0B;)voWOvczagu${MH$)?Anh85T?dY4ptMNI!M)cHpDPc`6JI~}5{%HDd}G#`yK8LvM)O8?|Nr>k|MOda z@aJca9+w2ITvQqjKgcOLABIDG8ck;=Y?A6L?xP#Sj}fddiO`~F+*xp8QN`+H>?}Ey zzQdR1;d}lLd)vYE^dUXl6vy*8h`91Q^jhD#w;-U*Ddf%8bSA44@&M9429BacY1$l~03`&>r1P`e%sUh$MK|oUiwdfbj;L2#_-+u2;(jR^Q zmmk~+X1kmB9~?YzaASRgM6Y;T_Qrz*gNs=NuzgYP_w$#Q4s|4z<=Bkk`MEh*7F55A}tADHWuCHvE>8T9^7X=oSmQV#qsSMx5IY(^r=(tU%WiX))yO%rq}4N zu62C>`0|0SR5M1oP`9Usz}^v5WX4v?CrZmt!hB`MRb09{uBLXGeC0|#7c(>C6U-46 z?5GYuBO5(tyCR~Pur6`xg1m%toP=SrxIi!ZLqOGxCDoq2P3;((A||xHPKX_^8jwn_;TNtI;Q-(8o2J`BhGz0s zm+>GTLWlh1IT_*clC<9LSl(7tg@ZKUk>Ykz%CXfS2XQgm=;T`)6egaZUnt@f*DTj}x~*2jGYbmUXT!6{&(1Yk z80xXW5TJtf1p1O%zlsKh4r#1+EL1qs8|HUj{aW>lpIyB4UYwM(bF;y|14*6_@2ni| z%z5xrz0qhensvPwjvqO>cwp~v+X9{6Yuj6(li9q25kko-Q>Uojs!v(BdqE zpD-huLPS`QpeCdSBnmZSi*FcnH--wqEQLWrU}}d>B&{4-!brpA*&{>>-`UFJ+{1g= zXyD@(i!=g-6O0OzvwPs1s8K+AMnlxKk1VxdrA!SQpZKM?3 z0jg4njD-u;8Av!O~_P{ z`}9oxT|;1ZKtQ7=OHvm>go@X}%xkA#SQ!qZjsC3XA3D4=9FB;>BA75sM#KJ~2*gt> z2>f%ezY;9WV6)F%GK2Y~wIs$81sJ7-6=BMH#|{x&Xb4~+&(9oNUtZa~ac^}vw7g`t z)fyG$V6)e1wj8{b`;nLACzp@Baqi{Q^9QMN3`y#Kb_blEnNjR9K?OJ9D#NAA!Z(B! z0E8n?k073&Z)FBn<_DM|keq{4F6x<^k6ED@Gg69B6CY`M)nYsK_R_M7sI%2aFLnCb zdRs$4VUWTjfdw-(9}opzYAUFRMTH|^7|!(K;r_4*_9?moy||2@h$LRK%~U;hs{2uY zJ&#xq#3rJ<)we1{gefaV*j+>z^0F%M4L8ceLU^#TGUHHQi!v-+n^{tomGF5|BN5Hg zi^sz>CjOqM5Qwja_Han`UJZfW1_2=vXhXsSr{abD)Wg)NU&N@QjvK_<&K~R0$1oEqzJ{5BqtNm)3)@k`j+IH}FEoZ#Z6Px@e7|Z0T}`0Yy`` z9{Q7XUSCr~;7fo2SewUj?pluRfAcG^_ln{NZ~r3Rh~_Adml}yKqpzUOLUg>oI1i{T+#N?I zQq9w1Qhoh%2>}p78YHm&QM-aVN@ft(FD0lT*$aC#ZJKB%qOfJGjR$U{%>~>wEVJCV zM`qDCjIJ+y5Lmce*zK6mEdz451W2bO>O_S?5^+#)$kquB~QL=bO(YjJ6L`Lz@0 zzqNRV^maIwj1pF-ihRVB)gv1WWgc1dwxtxhrLiSgAGJZlTUdVe+c=fI`~LfV=|; zlc>nb;=D*~G`|(LLnWLDmhZrGZus=Z^}0cGEPzDL`>x+`y})uwbzzfxn*~yJt6V9$ zWFno&jdDxfY6yIB5O^Y-RtpGMVr{I*%he5AQ8m63twgSK=J4_3hmKu-_u|^^dv;n7 zh%(!1?%%h#@4)`KxtW&WGh#_4HpGH0@s1+6_?1bHOU?-;YUW8g$Cg!HW6yd<+N^ywd^t0K>1n?mXiGCY-Uqy7lL3H9u zNgi?`88BN?)O;52a1`r%K0v~cY3 zZ!TSMo8hgE2mdu0H#7z%~$kLCxnao^JrW5$1B#N`NKOU{Njjh$2TUX66H;AhD z2~(kJ3W5rT6hxW8zSCRJL${wNzkcuH-NN1PwO)DUmFdWPXWgi_ho-)<0N&DF8dVU4Zh)-fktq)X#4}%9Gj-}q>4ZfT8#zVj5UA%Jfzy0Fpw|iSB&%OBP-}^Uz`0_V8 zFB9QanWL!V2Q$8)F*m>sk4L>`vlTdDRb(N)CbG^s)Wdcu*994=kCIhLktdqnG)^iC zI@->R6V9|kt}0NZHM)2KkS0$QYM3Lbx^3bnRvJle5bh#`S+}Qyz+MqlCYT|3#yn2^ zxRORdLWz|ZU9d3p!nlC0vPdW#S@N?2%*oRAVg&snm56%tRc&`!{aNnE%m z0#pE}ka`By*uyZQUaF5I|w+uije7;R&0*R1?l8k&h6dhUOD?T3@zjAOPkmG<=A1f{S`W zW_}hl71Gcsq>%{3w>acBET8%iV-nm^fDw+1g1!pRG!1E*k{;ASI$$lEtY+dECVkPn z(1pZgLKl)Q%t|TC?X^r)z;=KS7*dcDR3vnGVo#AjjmC7Lc{SQS^Vh0h^vi|-6So*i zRC`D>ie5C;=rddaiGcAv%NVuhuN(azU%hnW!ToWRtlzp557+j$mfDCAcm+2bcAA^x zf@Jz|LiivXN#-^!SA4XTQh=l4)2yC0d9v_Ng8ITp8l(s#*(Gb-s4SyW0=&42f{%zU z)Z#1RqBk723Da*h=sg;4IWs)DZchz?y&|Zn`5I)#(ZtPcKVec9cM(KoTuAsJIEyp8 zm={Rt%Z?GbV66%F1&BB^Mbf8+@RxOij2VSMX=TtLsyL`k6ydTa5$*-639TXRyA=up zc|+E@iO@13{4ZcR(1SI3Inxc^eP!0)VfJ3>_aE-t+s9qAA##rYsMSFza2ond> zw=$BXuAIeuNdv>6snBhXTFyqcWgJ-`g7H`$fQpF{WYj~{rRpK9u@-@ zloqK)ji+8J^dGI>ejyM*O39TnOvwlnT%106B7lRl7!#S{6QjItS67Yv2UmV};qLW= z`xeVvD^+hWZ`e(vq>d^WOtw6#dy&N$FE19a!nEw}Oh)o=5M8PoNx~LWoR%RGw$gS^ z>FmqT0up19Ldr+xR~NYi23N8UQjC74P3ABO!^9NYZ3{iCOX|&2K|q+)J<$|?sT}h} z=!yi4N0%_}Fjv~B!rUz=q`4sWv^p5`_vHAq1||J2P#T4X(YQfTn$lQl*nukf2a6^9 z>eUcnY6^PR{>Y#6cv%!+qo4$2cPu9e^qOX{X^@f&bkXtjkPhSpN`YG-k)V;Fmxv(T z0sSz`kUWJix6>R1b}-X@?eOxym^<0@y`-RQAq|TfOlGP2bmB)( zIKJ6!w6_KW#H68J{nKyXxgGa5$AkN${?X2?6490BSPf0|)OwJURYyHv7%=^)PaMfd zPjHib)SZ+4M_=ZnBqh(O+n$GjMgwh5`527QNCmGWWF$?*3y8>cn94D9Q0Ii7rrj`u z+-c>$eU)o5E@K%o{n z&-HxCGasV2bTK6nH9$2mMFO%{w;BSUGXy|C&{xD{!9{tP?CBjuYOL!;6(j!r#-(BC_+TUz{=hfG{rqvZ2yZFlp(<4YN%pd)*rm4zB((eTIC*8}l zXjAmpztj=APRN3E6FVWKBdCBQlgU-^QZPmVNDeD? z>Z1tBIl-t$_?agI=&rd+Q;NI@A6`ViuNoew)JG2KeZ8Yj)|(mv+YnImwIGoCOuy9p zt0WL)T!dZDLQ$etQU_%TQFaD|9FDODa1GVkyM}RKZgFGyARotb`)6J_ajqj`^iwqK z@vc!4VV|iRl}TQ3n_)1KrHf)CT{q(U8|&-u^_sa^j$)IvEPC*dK8G=?@#>R1em#2G z@AylvroUq+_3h6q1V9g2igvU|5r%VMrnJf0#i}G}zDgQA6EK?x$?bv?)O2=-MYnm$iG{NY9qZ+py- zj`rbY^uQp|9lz< z>={Aju|RnYE^3s0=4ND}4n;bTeeaK)d<-Bya&3L!`G>#`er1A9Qw$NUt@Lb<|l|h&*C9K7k$d(h!hkpC+-NEWcvN%#1=WK7{9rh`(q)VRcRfSu?pHY%d zf)iCG6;XrnNt4v|JkN9pv!AEr{U`}4GaXWPWx}0($^$;zX$1`hfX{Y+eb-)xz^Bd9 zQ+m^k6oNY5D&T#of)CLmd!G0Ncvg@n8D+TB7+wi8rm~Wwg41-PlyQQlh%jR7BtqT_ zJ*RTXY*aXo<+`>l{$i4PO#TV2J*Iuym>+X%eX54Q?*ai(PlO3R%0w>yj0#sxVj3Mc z6gNt;us9S#G44mhD=SyFZrpW8q<+kg%q_is?xlTRD@$UQB*9_fk#rAJGTAY-&xGV^ zEIT^UyPv76kMy#)57dIn-v0a7Z(l>;;~<~~UFKc+D7~*(%BLI*2bt^jN6sP)prxIf zU(|20qQEV23MUoZ;ZgTG4d>|c!S4HwJR0G`5*SjM-jI+Jx$N;xkH;^Cw<3&8d!u2) z(Zgd50Q>(00B(stFai;BkGat77*T55#`=R*vM!SfU6*g&_|?0=Ovk-BCv^Iw zuYcp^ubg_JC<@Yi5wa!DkP6i&LQ9SIyBk?*L1lOUed^KG5cu*SfB?XJPGcI^HWNq9 z?;O|OR!9cOAsE?VaR?pZ8p+t8ng}Xt_7~GiVcbQwRsaA%07*naRFrW>*7}3U zKO7ZNVitu{S^@crlpr*@?GwJ}2~8T|@XE=)qFgotiMFW7GNmH1cp@<>B#2n*&IJzT zh|NKt1*>i~1fClR2vY`+C5m9g3<-~)Y6ybR8WR<4W;w1crE8*G<`=;%#PcG~XeyCo zTA4iP4|2;lLx=ku&o}(Q#0!j~5v6jce{KL)zsPe10lgdvM)O)M99okmTg#!;A~Evh zF$IIyi|G2=%I%xC(T>e|jk$%+*Ur8)V_3s}KbXbi*vgenQkE43AH999K=pjROf9H9 zUw_Z~ZE6Vo{vg2gtrml+ph962HKTJ7MU=RHsaO;$IKV(5sNnr2Mh(@tPl7bt*{}vyu?pS2oK_6>*53EkgW?2%o2^U$TDOvDpCUG zC9aFCVAx-%QwN8Zmu3{Fc*wZq$KbFOR~1si%A$9k6L{6H@!UZ`1a6T}^qQfNpSj;O zf_8IUksz2N))q)SDD!@qA;*&-V#W!+_v$x}&n`j_A$l<-iL*AzN=0{5W!!TIs^{v3 zYC+|>`g7JVQ$yhQ2!ZWMeBx*#W^(DC4HJialtqPw0lrDng7=p=fQcIz_7XWuK2#E-icn*W#}Sl5l{pbq zgjmX=#Aw1TSX#(|Z1WLW1)F3_l8Yn=rC?FrY6$E?2uMhYT7f`h0_jP`4c>z25*}$8 zo-KvQmle zm=xnuNZSd0k{?x;AI^4G*6w>&IEV+Wpc_T7Yk0bt<8j=u9nZ7NY_dpwxzMejUPIu? zAONOIlU&0T1p@6M8YPa{QXq&}uPDx_03ns+k>4p`hmDhc50Ct^$g?ENbCFIQ!G72F z{bn~MIfWaDlp-dYieQy64C!5H{K@E152@bP5ct9%5RIa4vz3=9IWU4jO?f_c$H3EK5oN znjWaXcN+w1L1nl7Me6a?5ZEmc5avi(#zj3V8YqcELFV8`mE>+<;nFVEt&stm4byR@ zdSekc@+$EC2B%37IU3~^i6fBj zq@2)nAJ}t*zoNV;rk+NCD_UNaX_`{2Ql30*JNKu@>hBr?&j17<8%8M>L=h!KXMhQX zZ+J7}=}oGsC=o*h7zs7OctXN%#1%q^p-$ID#Bt=?uzhuVw<&wl;oo;oY^-V5PU!Ph+PUE*v~?^w`lO-MMp1 z%d7?@AS3zZn`4g-?_Wp#+sit10o0 zMLCWmtQtEch{wG!9Vqrph9QEA(t&XUK{7bGAQ90aCLOL}fLzn+cFNmTR^+46sO&7F zE!MrOg5NbW_Bc@2=XNm!R6v#*pO#4^R13KT`5h?*0Kh;$zq6tgf|LWwJFFn2i==ws zJh{EFr3lTEj2ObTJe6!uk&AL66C;X{B6L=_8Uni%0{AZawwVxmg~Ot4N2K=Jy!)ez z?_9ifeN^V-A|Ja|f{_J#d4FU0e!6102jBc|IX}nya6=Tw&;g}~v^b8GBI^>UFQ*0f zYwX{pe|Y6*zH7%;53Ghj4S_Ee0y2@y0N5at+Wp6Y@kZ_SMSRrJs_>`u{ zz|$Fn41bZL2;uOV2rBx0HAPL=lwApfJvyk`qOwQ- z@bzog5O{J3Fm?0M)(p9eAB9omY1eOk?X|D2^|n5^eto#I?&3Uu_Vm%l!p!W#TGZQ0 zhMwP*yNrs+6_u{bXwS|N>7FFT)_9l}xo3Nt;d=aF;Gtv;)1^g^fg2HhbmlSX1cr+| z`bs;tG&j#Fq?cZ=hxZG-8n-YKq!gl#S?Y)_e*6>bvo!>E4+Mmr0>ed1Ac|jQ{ZK#P zx+Ka3;RJk_OSC9X)jJM?n((_J)uNrcDB6-9~X2AJjPNHASUNFF-JGlvsfp~=#{Iikh_5GTrCQ^!!mL@QDdgnFM$7*J78}%oHd3brf zS3}_Qfq<+Z8CDe$H&&D0uWwwv+FPym&lHVDWRi5dDAU5pu%w%g<$0DHlvcVmytQ)g z#=Sd-I&+e6r6@z_!E+=lixyO%8HK_^Jljb9`Ha8r^)o}D7F1+ze}3^(mLG8qP)(EK z^mXOb^aBL8ui7S8RxG{rNq!~O!OpE5cz)rgUUv^~_{$2?O#Z-P41vdaIFnNe-t#@v zAeNEK&YXXt)oTAkoUZq`(sa~>DSA0y-gl^BH_9T3(b%sU}&y#4k-kiQ&Xt>PR@{oYC?MQj?kE;Rx1@ zB&_l}j6p3*B`L$?z(g@UVg1xIf!Zw+HnQuQ9v-AbB zW$GsLu%bn?;Cek(i|j(iZ-fuN#d)7Zd$4JkSp3SC`YLjxBqfFb#Y0kr9k8Eg>7@YQ zOCe45TaHc$Kz3*{EVVjpk4;tudAOoTbxpmgA@JEDpb_s$?ng5vY3~YI0@eq;)nPC8 z46hsZiny00ECJ-Rqkd_TR^uc|<53)?N4uSkUhnSx`=g_$LN~06LbADdF61MEiab@Y zzeZ+(!7grlPEe7#S@A_v@({1z?KyZlU2~Bf-g#yh{}DfNXevEYh90>xU1(Ag`B`>> zH?uejlungfW$slO=Nt^Ds+1m=DNO_JpyYeyVn==Cb``XY8?*pNKT&`Utvy!o#Bo6&z@_w?XZ`Q+FtXRH}lfz{qdQb@7=zdIMt6X{(5z5>wACv zM@MImJ9cB!j3lK{!=R=KSQNrUl@=cIn`XY{RxO|M4&pBS_{MpVHn*ji7dvoO;*U>W zFDWsJAHG!8P8GTj&0@@jMhH(=*wv`O8z5(=0N2gJHKigYe$FV}z+Q;I)GHQ06#KK5guef3y1Ro`e9HBM1Z`X&M77!7`0e3hfl0D`FF5 zRQPXZV6Vb9Iix;9lH>|E;N9?v$tprmjDk27_&E_&VCtyB4PPfYjzo|VAq6^yMYEXh zi^@V|&-s{UhIz7JRZ!vh>bdfF!EOnCi1u0C$`R#mDOv(WA{3SsQrNy;?x|Z1fhUH5 z#-0hrD@@uxBDkvh+1@g(+nzxc-=R_VlPEJQvQ1(=9Bi&OX1iii#NI-pZNqH(LDP3z z-6~Du{>s*a;YLhe38zt_Arl6Wz9$Vd79E^Wn2@6IMs?eL5ZF6{icIx_`Fh%&&aARF z2ssFP@?SK^60b#*vJCQ1pOCL-tI7LXRN}$9w_PFM+!hWT>hGPQaNt!_U+BFTVDzt6zQjKYssjdRg@I`#0`>|8HM@ z`IX~Gj*)~V9^7v<8ktBH;rs8tdnlN(_Zyo@@uRKVhwTJT>*2cb*a4zZYxw?XFbspB z;rZjiz%0u~AQirFB&&SKYg5A39^bfi=jQPK&`GMc-77~&%w?`z8*JjT zToO>vT%fG~g4jxkLbr^Ej9@p5)`TOI0m%dbzb4nK>7&B;K=z+-*wRJaY6yH30tnOk z;KaZO8X`Hsa1k8ujFLEtGCyntz7%1^vvF)0w>IOWvw=^^Af%6B=@~`PbbBlJd?)v; zd~POm(jqKVsYOqQVk<9_k-}0G(JXC9FP3uP$15xqM@l<$+|0zRX~nF4acMhN^Y+@- z!om!?2~=EU_AcVI?V5Iuy1~ff1QK=|U6ztzWV9Qo3K(=jBFT@Ypf-)*$T!+)l0_2T2)bO_M?+COKZIzoE!lveqo>pV~yh9$j<$R#>&;r zjjV5mXr>V0@jI3jkurUY6t3oWxlhIb&QG#Ke#W<{Z~MF;uy+I%1wp0$QB)v51^GoU zG~qY4u~rrji84fQq!3xIeKwoeNae$;@ujGdrBSp8<3Yb;741gYZZ;g3vaOk61zvlG z_uL#uc+W`UecyLoZ#WosZHQd+Yofx_du-)k-JVAXfc-RzyYmgk;6|kzKT*4~t@4z0 zf|=cO;9}5p1+8Xxx?eO^)f$}qO_WQL!dOMHunN$1DW=5~VH=?vQb05paf#4ktFXQQ^*{Zeh3S6x5B~7P!5JPM zXNFT4U9?(xgu7XxHsCLO|iF;Hm!TUSwaP@%C{&)AAD>b;1Do z84PbXTjXrnT#wUHLb219T83B^yvl-Ru)J4UP8yYQGH!GlGjm;v2hjl;U=UL>R**2z zmVC$#G^TT=ceZugoe3n|EL?Nw`nxyvnJ{(bmypOL#hy(g_b57AX993Vl7q{1Pu5w;BXtB1Zivu~jp1Xr(K+uYn5 z#*yW^Cbj8}BC)E?JT|(Gng5@?|A4dfy6eOL+waWWY1?^i5tRW2p2~L*P0|+J~9QKH3b3$pH@h~H1t|@1_YD| zYMHZTAMh|;%V>ILT zfR)OXFqs8tC5L(QzO3OgS+d9I^99IatyCT>7IakcS9C+yCT8~j(y#vJJKz1j*S_|3 zU;EWxedGR`{l({-%Z*al-B^Z$4sKYTI}=LCN2b6Zn*xauHq0ing{MXleY(-c#NzLp zoS8Aw*d6q`UDCd({+ay|)l`^O-(hF;nGfDQk>v`eM#cwVp zexD(Zzb0?A7WJRT*& z^VOnU&ht%yk%o8*tdxSGu6NcjI+b7})Lw68ywbm>P~Ts@_U1cg&s=lM{Nkcn^JU$_ zWA*vwlK$IfuiNZ)C#EKSE8E7wdrD)|y@1RwXz(P)ZF9QEe0inZS#FvNGt+1&cX@H4 z-D)2^bg+`^Hm1G~l=GbW1#E(kO8JyUy!qSFZKzG&WUH3D*F7Zj>@`-YYFn-Oo2;M0A_|3QivEZ6dd2shZKaW z5yz>fohYm#fp?Q$3WfU~S@`%P$KU;tyC1&i-r92WOK-WoG7iX7E9IVQT z#&t|}`&IDgk*tJqa+v`rowX`%hTdx>WS?P8H%a`m=5tt$$nF7xT1@J_4RE+J1H7Mo6 z{_)9O_3@ew>^SK4@mAmXiKU0VuuqC#sa&g->l~9a=dU?%WMS+vj-38dRshyW~{w*)&7|~UUc;sM`fiG9Tfywo81|- zZD#HrjF4wt^@^ES@sI=C%A|Pz_Acwn?G}Cdx3s&kdv|ks&}J=#@5~k2y8=+Sx#qC| zO_)lyd(~FkOdX^RiX>v#nNBj9WhVGIw$5+Q)awh&txBU*H4)7${1`J#l__*j?O&KF zOioqCrfVD(-+c`8^uzpof1`C~EJZHCIE<-Q;rvWchd6N*(OJ~6%Y?-{Vak6#G6kMJ z1%N3a$`PiYgy~cPiUHwSaAXGm0GP{tc_QzjY`=P zuee!;#q@>3=bxG@H1-_Yf2|}R`Rs$Az31MCAH1RRb#FW}Tc2r6Q5+1xFdV60nxhgj ze)i4JDKiB&Nr413o^;iwDa-B3RDE}8;?`@gJJVde|J+kgo;W!+4aw!O03{BN`=GEs zt3tbbbY|bphpxSP*S;~sl0j%Ep&yilAJ61z;UAxDvOYQ5^Gt#4s65XEe_o5z^E+6n z`PyD$NIYromY>b^&AJIIC`;8do#N+Oh4y0Mp$AWY_QB(yd*rE7y%EgN&Qhf{x2w{- z_3C3srVC?(ZowK&Q@>Wtv!tN1ntEPe==Ld$lcF-d*x&j7Z=7Sb#m1f3Wn^zu(gxo==dGiXj6OQlY4jN!arDOo1&>APz~xUz(<2#j zsgHf~vyVP`a=vfsV|9AEVbXoSJT})Xth5VL##O50eUrK3sEJi$VP{8%nvJ{+e{_~r zD18MI$cskGIT-~qe!5s4E03Ad)!?^?qaM7Y*&{cc|Kvl*A3ZhY*mKobssFM29)A3h zpZme@d+Xr?rCMB(&*=#h#ma`{<2d6MTAZV13OsuXgw>IDh-ll2xIaBL@$#d$)Fvm2 zAHVDIkKa|pH?>OaBjbSB{ccdu8#UK_&8uE<%T?DLnb^fqDZ{r#S5$+ZvsyWgoD=J5 zASL-N&%Saw<>jP6c2q7WbzjK5=^Z>sCp~=xo(zi6B$v>=RvjC+;OwE3=YHpX6Hh*N z{LHD7r_au_G574-+iotdbeDG33pebWedVpkCJOyp@KUT$OWh7Jr>8T{S63Vbbk~ND zyob$%LT7F8Tf$&Pq0p%7b>-8B$ydIsRkNpR*lzB0e|f3ZdH4I?dv0;DRIi?&n;UCP zobET&anbPouF0vVjz6|%YWiEh{u}p?O_F8N;941U zx?y>-EmwQ?dZ{fBS{-v7?ZRrfzf!7jqI9+;*F(PPNEgFf08dA{2n-XhBKm{97Z@No zEh*A4*=nNvCsW`HQ6Rtx=R^k~45zq=!a1e$T@*Wd70xZJ{N5kD|6T9>P{V^?Cbjt^j_Q~h)(cxfc6}uhZ3g+V}W0&rTKZL zz;i=^B!Z2Z7i(dr`b?pG^WJNFFCBpPqi0Sn_qt2V?cShQt<@USyY?QOy{1^X^X8Wv zZp=>E6F;#UhS5Vi)kp#znnRvJ83Y}auAiH_=3Jgr3S>v+IVI;d%M9zq>GYwuEU@C* zPc+_I}jPr3NQebr^i9favvX4sNs>VUBw=y;{#f&#Wg!UNJi(HiXLVvE?YSbF1 zOTAAY|NIlDPuZc%q{GSf)QP#XW4opkI5$H?CQ@s0X}msW-`1JQsoCz*@sp2UQ#!Of zRykGZv$^c1TC?q>9g)pa4klITJuaH*-?23kH!3(6tg*09a&WMs&86TWiietN?IQT} zeqpki1aTX*kVBZMvyPcIQ}-MvQ{W;Bz)|p3f|s&}Ldb*Ma@V(i0J>T{J-5tx*mdyW zpg!^7@#9BtxZ(U0Pc*ysKWQ|k3-hf)vs2*G7#$hdX4o)e{1l|mNt9g_+H5wXh<3&^ z0kc@GSU?~5k_e@Qnf}4!j%BMtSie=6@2vDH5oU)V)0%mJAK&lv@{;;pmi#-=ALwTdP6%S-c(#`vrE-FWlskG=2Hcbz7%k()dQR9 zID5{Tlr!2K1+F+pg;muVbZnEN}c2Yqh%J zGrv3d2)*4pxNAO>YPIloqcLfUXS>;IRBO$1XD59q zqt$%TRo8sY>t40LZsesIm1&rnA9~}gq%4Qe?S;;8M9jyPM*&^48Vy~}##L(N8l%d0 z;zJ*=Z#Wo*uZJn`92HD9S#6vtv}Y^RCl}85t%V=2@7upeFYnQEb-HRy{tF+}iISFT zh4Yh*>6w{YrE>1{nZTIdr7OzO+JEF9$_X;X3OuY2XD^7T!RJC7Ym|h9ZC8H_zZntUo zaGUHws-3(e8_|4Rq2R(N@&_j7;jDx&Wz{FA=a%iyS7=N$+Di-b&CVFFzf#vzJw6_G zpwOK?R;#*Y?ct#-`vvCKKd%(vd5_Od63E1?RffAJ8v2h+^VnS|f8A}bhGK9Gz+bzt zHrI!KeB?1~Y#hcP%^PF27z#8(X$@HTL4HUD*^&K{w5Jia$w9YnlbXD+)!5Ni__HBh z=ogL08Zu)~DWt|3EY6TIHfFm<4mZia8u{6jv@O!C@F_Z`2e2Nw7}Y|xK4Hai*rQm- zbJ3K}>Ugad`x#bBgT5*Lm3r;W9ZSdc2_{_@#H;@uHhvysI)( z>NRIp!fcXYS6%X8IZ+{V)xwEFO99nF<>b=I#~yv;qj%lKwccBpo?BTc7sopbb5m2h z`pd1_q)E$_>crTYV1St{g zR-2xRepi@~)2o&nwehy?_`6-=!g0yE=ZBdBqbU%O7IjQSV89ulC2al`#A@&g{OmZ~ zEBYv7wM#&o)GFC0soRmdVGqq`(#DsOU*r z34U~RL?AXEZj-g)PABnXouIevU6_TxE#KPaE9HABMeS`_C{Pb${?+k@eewIP-uOgA z2XJR;F)XhSOY2(&pXBRR4j;Pq$k8Kr+;Y{|zv=da#!gliJI$r>iRps5%SC9>i(JCt z^l7x>aCTI(o3Bxh`Nc?qq$+}8)#{P@)~6WYs87@;%3)B2hj4Dt_VM__*~L<8Wwuki zsx+|+aw-j97=@vvL@q%XAd~l0_|;^nBVl}E*SYq?%_mOtg63OiuO8cNXr?-~$I@U! zHeq7Dc;h~vJ+{#4*$}x~q~yYOt-W$s^WOvJsO^RbPSsG83x26ql86vH@N{yI>7Hxi zE1k+_)tF@#j@9v{OSB?C$`n{nf#3k>8uKscoq)U$5<7ZXTx);?*RaDJ1jf!^oy7W? z*icIFW{S*Ms?mnrGCYqBHxYFL}|;HyphAx?mLQ4X^aO^>O=Gme9fmVnIjwg^z~OgJ!wFPttxn zlSsMN&k+S8+QJU^-9pmVZi^)`SYje=ic+74?MDPwmLP@D;H1CpKnY9cvMcQ`z_gkv9C^O&~)*<8VAZ^INJ0nf^VsT2sYe^TEYEpi71ydmUCBaLvN)Ysn z`Jt9M)GH+z?9r1&-bFf|t-S|tsN*aL?En@ld z)<5U|tSN9MIx2)eJQL-1k2l4<)V7^f=n)M&q7)0~&Yde9366@XxuKhMXCHd#=%mmN z-O0;?!cw>2rp(G!i#1KCpBby(cI|;%ui1Zay1H+2eD~Dh1AB_I6M-^|=g-$m&8c9| z70;ZRo18fi7#lUPv|pIdtfSnOxcRu!DL_?VmAP7Bxz+#@UhIj&(q}&Zz-Jz~|M4@Y zn%v!nWh3Hz)aJ^otWdf7hU?$`;rD;~$w#ZR zla}v4apsg9l5&FJr1M-vyKqg@1(1g$MW`0b%X9Oyjj1Ug7n@&fHe2;l`RJiT1c)J( zAU@)elH_xyz-B1G#PSssS_i-AFtfhbXBllXY{-9A@dTqQcpvc`yblB5yzjKjd~{T7 zHy;2T)|doS4O;yV$>hM@tueFbK+8gx$nC*y3%`EoJrA2IIfU&r`fPK)+-cRLBOs1} z;~R@UFp6dDbA7tCc;6F`&NY{3_w9M)$;YSc)3tk-4Z=E|&Y8vKe!Fw7z1#|$qelI6 z$tI^b_N4TU`2|aSTg~&$rQ&#XX3wl{HX|DrvoH5Li>FWZ7ME9SKwK#M2IVsRSA7Sv z^19c*@qxKhAO7qo&pdf z{RKj7wRR4ZzBmu&^2Xtmo=*u?!gcD2vbsJ@fiX{PSU5Zr+8%Q?_!dwakKm|8?7Q zBSsTk`6sKgI>m{}oPx0fqtQKq>;!J%!M%=qcEi6Y`lka>5XfXqnhShN<*aXkdkO z|Ho}pPXAm|;7W5;f;|#CpBNwUXUpwUyR9?Sm)a-C>cwvR#FI}fwZ3G^_p;b0;bRfc zCApusyb@zmY%BeCwNmAQ`S$#oxx%S)bBnFc)XdZhgR9#H?=z+L&q~2{0D&6to zM5QpcZ%{k1Qh)I^N51SUUbA<4ua4OLg{gDh#mTDAhxQuPu`_2+H>N;svj-J2T^oC1 z;rztZv}N(lLbqC|FBX>Th1ybg?&QOde&T%}?4O;#rWBUGv|7bxvE8iLB{^&tapOyF zS!k5)kKCIY>vE>*)u7M(qEZYK0Mrk{>9#f1rCOc`JI+vKsaV-NU9C6Hw@)^9PhWrR z`m6Trz3Q5)IVw6e^kzFk{9tnCsb8CYp;vf3hyg;73G72H=~l80*gyvn!mNqb0ILx0 zZma5bW3=5JJgK?8aolg5mr zyCjF|N}I3316uQi?44ppr`~|XF2T2o)d?diX=P2wDIb{v&w>I8rt1<0=tfYIy5P;y zux6_g&>HrMz#C!X(FpKh#|3}~w*oZ%FhJ-_jh;VrVi~)B*_b$FI4mOan#fW)LUGZg z2|`|pktK$4pYw}UXexJ@d8*s+k?_^)P|5I6b3-Gq?BmLDRN|`!-2uxbjP+TM%g{EH zgj}}#0u$IHXr)^^JHI&J^35RQ3bodX%^6c~SAx?H0!yf{@gV)idX-)4LRfBf7M2#e zotEXqW0PacO9n)A%k_YuGH~{(`oWaxGQGlJX}(nL6(%NU$7cwKGxJNesRlN7u;={Z zR^;|;N@4LqK3%~SNP@JoQrumgw8|W!T7`bo@ZFj7`}ZHXcKR^Doa>#lrm5fSHmZEz z3KX@*#%HTzkh)1ZESglkPN!BVjRmu8&?+pmqIMN(`>OjoV`n?_%X24A^_M#pGqmiO zY%A4z`H6+O*{PXVUVqz5uD|83M?U?;+?hw8da~LW50+Ov{7s4~DZHQuW0k_+wec3q zZFV1=+CQ`ViP|HF_Z_(N<*#5M9;i&KPuO9}k~SJKdMPo>e99Eq6a_#U-khWP?_BCr zMeZXAqm9KfgU{qGa1HErWE=2muT(bGzGv}C*t;UQ90|q|x#2ec8&rZP6DEw=|0@Ko z9xl>#I7j16U$s*C>ON~9-1f31_+cu4Fc8g*4ztZ-CBsy*5ZBK>Eo<4V<(vOz3T&PN z@RQa}@une(_znG`&3H-v~gdED7OQDl#11=3A+(>t4NOiMM%gqiND}* zC!l&{bI5wJ6tsR&%UeJu==H^n37X zCcxF#-j=$S6J*mlDFJ7DB6UgX&_XP}#*{FDx&c z=NJTbFu>qEcoZ}{LEf%*mTOfX|0&igmei-B7;S-LQVk=R!=@;zKuw(QSNoH@7nYX0 z%RVnwHk`h6=3KkISel-gEA)LWa?IC+6xC{%#wO?sN+NJYP!wSxad_VO8)gQIGOLD)sbcYQjIo*`#Eg+e6E3!Mh!*byf-l37%Cg2%AAr)+(0v&ES*v#2 zhm+c!1H1S7!ktbrTT<3bm6u+BZM84T8n0f4itUsvuN+4uzL5mdVqwy^w0xDWR=D9v z@#t0iAAab%_IlC{CsbhJ88ojyPK$Vca!OG&%v9|{)# z8fw<7oG(bfq)w8WiC#)Toj}rmrarN<)M}lb+g)#*Id{IcYZr9-hJ9tAvy4?1V)~!d zQnew5+a+3vydanEz%9T!I4NGw27wst2swD|9-Xk-o+B z{X+T3)wQjR!W91G-zKb|Dn+9fa;p&n2BJ7cD!f$<|KGx`ZKIrSbt4-94or&>! zCrRG?g;Rc)ew;3Iv%UITyq9e;QE-W@z&rxOt>2U z-2G7#nb(Yjng)Q`O=Vfzc`Q}3!2oM_%>(EzEQ?bqmiJ9f*T*X_J8%#u4>itnSEC)4 z)0N_=u!{l;i@u}aqlS|{@6a?as!+Igcj301uYK=F-dAZ%*+g}r+Y8?SZg&3Yo<|-& z-#jus`RZG52_pZZ5tSXWc9zC^BsQ{sc(()q=)nca!&Bh!X{w>9n!WLP_dt-H%?v__XJ_isdmepI6HrK;&< z^95quQiCW_zpxayN_rgZ3);l}7tGj4rR(X1|Heraw2uwSC!?d%!I9|3HN*K`y!zpps zW7M@nOr^{SWB`VlU!H~t@vz0^1?2b0fXiTUUa7@alQ$EV;9JVL+$#2a<$ma#j?;4@ zFD038-b@}!ynv4RcGDDqb%S_*{1oW54QWT`R=Zv3toSGv$GtNM-CIljPIIMWcl*Ig zsWr|aUvGSDy08~CB6h)kY1XC|tuE+~y}xc9Pqxn*LaDTy-OjR3Hy_D3-y75q?uy#$ z1+Dt_DEvZcwLNNe`D)QCR7`g?Fy0uemY0}Q<-$$ZPrdB+>+gN+#9VXEhp`&dyTd-J zt=7Z$ofzx1Km6%OqXN*~6b>~@=WXt&q&oYg@l)rQ!bcyi#2Mc^R;f@}W)@d^?U`En zrfaUccK?I{6bcXTV1KE?RGP?C&wK}wnVuPx?=l636bLp9qs2&yfl9ONd;NO3aO1(l zM-Ch?lYYf;eeA&%2iU@o_YgaZBur_CS&h6%aU@Tv2>10fxWbHl zt~;XB>V{>&X4EH4ujMPNd}Io26AIKU_>DXO&juU0C?-vDB0A>Lho0s_wG70)UTbN2 zey%e&KWKKW8L9UteTR3Yx0karUNP=5!OS!B%0NhTRe~Uw+-jG|mo5YAq(9CVAE`ge zLNT$H1C;&lCK`G&NPVJf8- z#ws;~lchm#_tf~*c&$!*+W;k`35zJPM#wLAq{VB~y^8%#pYx+zEiE9?xUyZqJbva8 z{hGio{j(>F^Jl|k`ktAts|gnG9(l1vBR(Q{Y)sAi^-Kzt z`ZiE(SOjJ2VXZvyEd>k_zJMA)U9E<>ia5e-;-F)a+<(^PKJN)roiPy3!bA1~cb(R# z1fDl~WZHeV<7vO!X%Bj>p6iw6LX+e2yjONR7I>vNDyxDy$Zxo3?*K`=UTk+di_^8q zR~&AfdDEAF;8PEN^xj9$oIF_=o9S03%GJqEd2C|;;b>8j?IDlhd7F=@L|d-ZElzX> z^)a1o-KF;8xz^byr>cV^dm4uhU;m~%Z@c60_=L#={dU+iCVXbBTdj}n$o`7$$XQon zor3=G>7hzl_gKwlD{*AMHCSmjEzAv~CUBlUv-PvTRylK1PYJn)OLpGRl42f`R?+eQkbe-^_?sqCrX`DVRcDZNn#&Y#!#1N zk4xO2(YO(gN?^^fT}q?7v}=XUSeq(WmWzXlYPnaf&QwdYwR)pcwX`>M67Wy3TwvzZ z(~xeSQAEDU6!?M^AkW9c=hzDMZoj;+T2*uhiSa?N&u87!nCuiPOJT-fyPZVdrQzv zn7%PS)$g{O?Uv1)d!Rh}1Bji>bv$uy?Bdp?sXjktK#|D z6(d!!<-#gtIi(|XR@pZxS!;r9U~Hvvm{y;UOo44mfuK=%75-2zW_eZ0+>ppbgW!CW z3X@}%nTeX;O10E$H&2I(`MSLSFU;mX~asAcTR3@i;R%g6o{HQolt~Jbr!)4o}@-J*HieX;R zm2hz0fx>pZi;J_f)2-IRa&u|du3gw*vEP|*_a`QHohuX`n=9P&$k~s4=HYuDdLn#H zrCuHs+v{DFo#Uv)mpU*#V4|})SL`etn6BS`{oz;Ka{X=B9Xi;+{ey{esnuK(kB4Sz z!1?p%_xf-+6%<$_=+Jy*3T%=B+!6o6M;Cmf$K*<#!-GM)+v)Us6B83-HdKvsZHZ|= zzDj`DvlhUCkE53oC4MyQLJvZ}-#3$g_w3Z!)93f>nYHC*Z^g{|&`IszCL6NVXn7mf ztx_z<4-|;{DC|~>BjPkjE`8S#9F>w)g-e~@%xsu8`S9t%i8JSS@84~x(k%ViiNfMs zVR>=>w(F<$GTKcZyS0~>cFkH$zsgmKBNT$sn)B!RJk?s=mr3!6{xzRA=Bm`|CUdPn zg3MPbnLK%>SGQ-LX*Q`Rt5DFTb^3`j*B;yx3W%Fxv|5F+$*`Gn_#UJooY(O?XA}xxpv>!luomDXQjP7qa#ivqb^j9?JRMF>Bn{*4vW=N>Yak& zT+i)5fq)s)PNJz3>H|*0;SNwt50a#I4%iFui-*U<>$R{8|E`a-))5u@rNS6aC~KI3 zp5zGZkU@x;mMRBs$VaBYwxIxw!e$uvSdUCjHLeLCu;UIGFibyMDhXu^LyUn-5Jo1Q zWBR~N>v9R~koYNVN$e+&G~M~qZI`H6p$P^i3>SRE#n0FGGnoMyl8zA@2$y!3( zXR^yH#B$j1N{7~e92DH|V6(dyu$*cmK+-dHm!q*``VUf4IcQ%etsGdk}B4y&4EO|%lh zE|VaBS{!R;#OTnO*-X2GHMEurT>XM!7tey97UnUIn7$ohdE#oC%@mO1WC}bl6j(Dp z!k%;rj3-Eqj!N`Z^q(brXz7dy2CGFhvCFCtItRO zkxCBru)^0>#n-_*ac?4-Qh?S-fIu04+Nn5T4D zc2w5B*|%d}^B=RKAc7O1KX@&WU@Xz40TmvL0rEnr+HSJk$I9bXyLA@}&2nKO0w%6c zd1m2BKRh#R``l@%3R)MyMJX3-P~Pk=EG~E3wNlYM$S}XSR23uqi$`Lf?Nk3;lbuF^ z03^aU3|c$ZfE7ahk8oUNx@hdAID+xx=8w=b9ODO@?jkQmZn5lS_Jwlscs#aJ#^!62 zV`d8c@hFh2vB(_39D(1|-->%8be(K;5>Rc1n6nY@>Uz$KytNAYwVJH)U$~Fn&Dz5J zL&g9AKmbWZK~#fH{l#E`O^YiQwFDQ%p%VBfjGXA#rYkMh592N&Uf`=x>rG{yBV`J# zqd=0$(HAjc*cVbDoGk`To<#p7p)19UVZoE(LI>FGOvt6SAVR2qx`{1KcX%B03J$-p z(RdgPjmPSrbaQ2%4J}+jhZi0cKz#3kC4vGVk;!G3fWeC|+PA*YUoI?$xMiCaS8XMi zQapoDJ7NxQB{<~JzT(psV^urg+v?6}{o1f<@Y5`^46ZyJBs=mMjm$Th0$Za1UI|B% ztbv7+Z2wa0UkN`SUu(l~??!&V1X^3>inlIOqMlmd_(mpjJgT|op#AP0npA;S=mp2r@x z%1W=yTL?kY1ttr>bqm9ueIr9bp}gb)1&1mAVxVvu(T|U07jTSbwXbE3wiJ8z1?H4j zG6jO@j%J6M=z503c386cm@Bx{EcP8-G+M!wD2>lVEiL1ZB z(_*9}JqjCZ1PbKiN^?}&3^L+~piE)G=_8pm-!EbGsI>8b0z*it}_y-N2~o@!;uUa+w7H03P>y@@dd0D^Ni8I z&?zMhWu))8M2nD7C_M6zjbW`mi;hZINMH*lTQgY*9Up$7%=7b1fsquj>2Nm~CBYie zlRETOAlhyX!BmMr51x$lQQD{Jh$C~`&Vh-K@E7mPb@;{RI0sI?RMju}@KOoCsGeOZ zjtVf)3bvOh6_#B0$b2qIp=vvLTY(vCDb*)v03Q`9_xt6+plTT|)+m)4Q@eKL3y)gM zlE0sg{nTxwz zL_r)X14rwi6ol@Y;Pp57&e51!3)`^z5zaxT50%+!<}rojA&1pJ!KMp%k7l6YRJRy0 zpE3ou69v{Vy0+_m;+80^L*Fq32R9~QJ6JQiSL420p#>g<*;&!<2|y1Zzo=zGBJ*AR zx67rz5ASJ4&}BYU9DbqCdr%mwu1bLrj~EDTOurD2k4%AQL4g3E^j)QWleLQcnh#W0bU`PQ_2D6B>fcLQKDc-nVf22oH#!-oUvHsys zx>onpGx_Q9TOGn2*AhvORHnmF)&6=zahzJh?Hj)M* z`*$`>f(IXGFh}-&x-IcGHZw3z>^lo>HMW8pWkD%I=8sH)Em9x|-KTMuu9F~Mmr)Yd z0xpcbF3#x7bqqNIqEX2W6Rs7zzBO#8O=X40bXjTLhniIm&AAGD;W2^yRtGU5WL)QSrXd*F38>K4h6ht`>3 z7c|C6zD|n!*MsLUK&5by6SCZJ8srH5^vCF3HqJ{l#K<2o@QhM4U2+s}ranJ_so$PP z-J?<9Sk@opTP{MC+cIcYV*{hb^P-&RNAzATd;-0m^{6FF4S*3H#h~)5pxAA=)DU&;&=9HCAD{ecM_uc4_PBhfT#=ZZoo%aT=ACX544lT9 z5;=b?<1QZ_qt40~o6`QH{C<=fqXg_QRx!>bWuvCY+^VP&vSnK~b%H85)0(N1%I0jP z(*9+dYXq!S-T556pRu?ewjX&_-bOlc6Rr|1z)|7M3IiXg>>qbsDApA=6YRgH z_mA1$DqT+?phof^+r3pI;iF5>8|?`B@0|W`$@028oBTcTN|!GJZ1Pp}`cX8%n~Q&XSMgO_kTJw5&H!w)X= z*DrhosM?%1@2Qy?xs3S^AUC8NNfeTY-XBC1acSNEJ?gt^?*Jdmj z`4*RgFste8IbIo6e2L_57EIqe-LTe_I4)hXdEF*z&_+~nSJJIh4wE91Pm^o0v9Oqg zez?NUP(tQQxWkHWTMl-^3kArK$hR3bqa-+8{4prgb3RO%rBoCR;%3U14kM3;z^9SL zE#=P%6>Hqg7I3+6YEb!w{&@sGYFg@}ezw`+3KpmnA;y8-sNmd;cL#Sfq*hURrYRDI z4tfRSEO0wpjv*wGEE|~~QHLZZiKTEmTc4U5yPi7KMh)5BMS*XCl5uv~HHuU#a9c=9 zCo?CVUmi3VsTiDkMYSsNKZqSX)YH8S!hs0l@-A&D+g+P)FD_)ed*XKeS>JRl#L` zg9Xw$_)Ag*ODH0#VF-$L`eeOi!vw8ln24(t!@~-+^j_YTZ`U05QZF?NCJpiw!%a}_v6TC*#Wve{io?^74RhqThXN zZC&i`~^=ehZHR;%vB7Mao|-^8lv#*IOxH7dcaD{$xV`g z;uy0C^?`_jAhWx=-VGZ3JS6e=xY~xaJi6sbmhT#d)^Y;s)g+GW+DdR+NAfgYIx#hJ z-~MoC9KUr@L&LsEZto#6|5ylyMs6=5O1UW9`V07OYPyMxoVax|GqXoHrUSQ1`RLC7v67;IhaIaO8@ ze+x{2j)a<;8u=Zz)k>|7{V8o28GQn%zgam(-uC^_uf{>hirGY+l73QrDq82rjF-7P z;lPM_IvB6HgkuC2L&VddhKq>uhG8(_k}(_e8sSA!yf@HqB&2|m)YO}shQu2#IErnv zIT10`%gPiEl^&uH#ue~Z3;6SMD0{N_si@aGbu|J9~BimQ)=&N{jMizr-^Y zN>ArOwSvLTn>(EflBu;BT)Dv6G^pD8XoEGjdLjHuAom|B1bM*k11Lt{DZG=aRY9s`8P zp}tK%CJ0e08Fw!S%?nki%0O9E+7LBN+jPwgl!O!|lznkHu$&^!0!FJ5tTGYNo+Bs^ zBw>C+M<){fg)Xv&KUHr+IT!z>KLC2hHmRMYp`dU8|CTmDtxR!%9rAkBES{LhMH_PI zw_1fb`(rs+I1-_32{j9~dei)2KDn{^M~UK|?6CN)hunaEkddm-A{MdNlEMXBUkt@n zDkb~E&z($jb?sK+T2Z?(k zE}-IN#a~1s?Nvm;PkWjRL^641IU3Qxc}7lQ2F2~lYRUpPm#_2{O_f+WVvJV@uyS2l zodhBHwgG)ZRtWlz7M?M6dR(*Z1d2x~Q^Qcl6n#6L}VG_NZPANL!*#&yREEy5;N{VLBg55nbT=eY&~N&;SDTaKa%n(u(kDA$^)*p}*6!cLnVZv>Zpeti*Qx6@k zCr4sP2eTZCL05q967lj(n>UBaN`E)nkelk+B!W!_vr%?=C@c~s)%gdRpJ_@42~DYX z#GJ|R#y;6p2q)l~0Y+$<6qlK&r45B6_F8WpOw+Oip>SGxKiX5z_cM47y-EXC3ecsH zf!u}0$A*^TIz@gsN2_wH_ zJ^B24&-=Q&9zq8Hsxo}2{N>O|E0PGdkR5S;2J>vJ|JmgKID>%c_p##tF=_b7)=@vs^iX^M}TIMhZ831gBQ z`2<6~3(Dhg)%OJoLRGQ=6oU?KKvn8MA=eYZn}ma^2blsf?8L!+K?}S%s<&281qa`+ zORUH@X!%CD~G7+3$(>t_-5q6I7IXGifKJ<*~YC)s1mKo1cf~22xC#= zgtI1=cnDQQA0uI)p394MAM165JT8Y)euq+$XtG@adCOfFwOyZg{+}}|M*bfj{!bou zsDRiQX5|kxM?w#ILL$#y&^wAVk<^a2zg_;HC;o;;{X4IE{?YQ%X;zJK7!+($qFdIg z5NZO8(lPJweb><(>sme|T0Z0HKI4){aR~mW1>v7_La$PtbiH41eP6#F{n*JO(mbuq z-*X0~incZr6<+sYLeSiWB*{|Nj&Nvk;gmTW15uDebJ1EhO|LMad5wG@P;W?)!JTkH zL{|ozP7!|Y213UZ@`WX1W7iZQY$>vhZN$)nRc7F z4EcC;{CYfy7y9g6>0#p8*G-4wEiWvH8<5iuG7;~kp&a*}nBtsP`JrlG8CWMzn%`rd zlyW2e8bOlk&096Z*tS^+!?7mK8b3t=-Mfns;I#g=b>%nn_0jkBB*E-Gm-o5gpEYd$ z!|Nd+u~G^YB!lbc^RsoP98&Q^e>ruA^~r8ZtZiY z)V}J+zgzH%x6T3O!MVyqayT3-`mPVYPg_rO@qQ^+&d=8-I^$zHn(LuW+0ML)zcc-3 zer^X>^xe|;vBg@_tg8)4REo5fsCaf)m#l(b0jOJ^_Fv25gkL4aoDg>;BeVKc;t926 zIT!a*>$=q(OeYB5?9G)8^-Yo1kT9f?*dtHAcZLyf-u!!p*ZVS|-%S1&dOLKpA~>RK z#`fw~Aky&xDD;%M@G?IpPvS#~r;Qx*sHvuhp9hmpA zmM3F?Y#!u;CW2;xR_3U#WKn^`nsiz$Ar|#Lg(6%?2m|CBiOMpy(91Zo@2Qx1-O8)g z*PlFrAE)`kADZpKm(H;0MjXx=+M5Vh&$&MZp@)pgVacuJYFJc%H*$HbNC(*l&`*_< z{@`h<(+8yGfBvx&x;Ud`!%m(E=5Por?b*ky10H#ONrw2D6c(Whs-Ze|S3W0vJof$v zj_-&sKz}Mr#UZ*c&Y9Q*{&xC?M*7Mw!i_>gL&DW9!S_Du_zpD*7yW%nWlx8+0?EN^ zAHx?^I_m7(Jo7nAqrnE_b(E{R-&wk!%nW^evR2Iy>|h4D;iV*-fE%ZQ>u*l^wz}8K zy1~rxcG3t^8HYaLCb_bhlyV3->MrqkNB$fT0(Y;9Bq|b>z+MsxKJEbs z?yy#e9Ey{mr1HpHF3=Uw^)LZN{^e)7jeUP zIYP-GzlR9;{TcH^m{jR$l&Fm*KyHbB;iA;K-`IZq)*B`35DCL`3$F-T&SGBOcJ}W~ z$kaiN1)blfy$0Dk5&H7-G!|vG>pkG>&4Eqf2fa2E6VB56WEY9CI2`4Y=BMOw{=d_Z zcumsyZTsqD8z_a-atk`R^IEe5CU=@j+6v}*4NeV*d=bbY95;0mO#F_bB?94tm{6JG zjd)Fa3f9V_(;l zboFT(g=>*`k_dfMp zg>vA`mcSvfROdQyq2=a6IUBW*ORU<#ESkMfTM6D}UcL2RZKⅆ?!pEeM$M>OS$0! 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

In2s$YETteu@e$zi|p;qqGK+JE*i zZ6A}xJB#8KZyUpqz$*br^K2afjl`vZ3(4pJ1W-8MoTQZO<)Ho6AATQ&?2@H7tM=-p zDf5b?_wQ2R6!td z9H;9dB{{_iI8YEUDB4kwWk`v_9b(5zKr60dIMmRdYK$$!NEbgVzi)sqsuE1#(Bt@d ztBzXNdT#Z=^WOt9KElNMN?}vTMGXbK24E|;l}GJ{AWTxUF!^anbYOdg$tm1_gc2!% z{GRm|m+jYo{t^`qSYLQo1JF9=3t{_HLODKsumjr*K$mOeQ{+$x9=8Arq<~a1BiJzK ziQ@ttL75M+Zlh%B^cB+B1;pgb8_1fg;L)xkW0gCilLfpBBWrMa%C=DSgV8uuGf)mI zRCyr`BfxrB%zGGl5$AnT#49N5GH7H}OCfK#d=LDE98qa(dAeZ}Qyv>Igtgp8thN%n z)v4oHK&~c0b+?h-uV3l5m3+hIKe%hr-U)JO^w>TI=00F@nfx0;-17aMfD73t7?3OW z?mNHYuCIJ|h+@0DN^Cl^J%TrHZ)Mre;Gt_nsg=Qrcp}6GN;CBCc4F<@x(979TeT!W zLk9|U?t4@lkf5S`W&@C9aj$H7I^tv0wJipqjWCOb%8@bx z0U5ZuE^52H#9|1^7@+_N7ia!a0$t%Q6%>AkOpan_^i&J`RDbE?SL|0j*n;d?a?=h7 zcWm#%8f+UO_tTPP?^98vbIb-_GMnH+9dkar7@M@;y8B~0Gk(ryPYpOPY0sg?v9^TK zu;I6DERO=$?5BQl43B6bze_vEtd}XD#^CZ-doXecprZ2{B>TpCk%^AMuIezf85FLY zPOSotG$@4-m2oVvfKZbnb1cNZk^uy9Ia**Y`N&}t=6=Jvf7l1@guf_^iwh9OMFo}; ziAi@K*%{VKG6!?h4=^Ss47A7^eZ4^lO+OBbP>kF)AW~7<<%5NjCX50i0Ykvp5lZ1_ z%zQj$LjhILybY@o^a zs!Uk$LI(tLd(O1nV^V(ihii88=0m_MLif<=+R*jNxY$F47Q|WCHNes;vaCU$H_2UA zC%=juW6F_I1(0pxka|kxm?wXH-A+usWbeKauyMwp6gwnMX8r)OrX@)kD?utsyz1v1 z?SMpLuKk-FU@R^SSwM|K3`4BLBqdZwDS@ZzN;;0J$SJ%><*D@uVE8NKB8?267@2~_ zQne+J)o|^$#jcLnslf}Bj6DMgq$Hn|G^V#!i+fa(S|t=_A0kxUdI0yr;joLiuNZTe~&emCoGV#YlWMjGsY0~bwCb3GTR4GA;3x)X;VtH zW+wWg4{$>H>>LY_ab`QwvLx(;Jq5k442YxTzI&ooFs7P+s>;<#e!Mb?PLnX7V<1>1 z!YSLJA&0o<>_OTxdz;AWpq-kXv-8snRrIXmU{hyZMv&h8q{Ou&EkE#+|$q$=kpriK0XAFokfm%R{2VhnJ+ z!rq)G$!lHVIozX?OSg_z543vV`Rsv1b>sPL++WoyA=%nokvVK)1ehQs7ivJQkUKic8Z`0iika zUGLDV&;N2e5*wEH&gY*A@1W~>pU@l_8v;!h7MB2aUa}Nb7{;e&NEDi9^W{!xQ=IaG zQji^3fmS0UEz!~K(ES)7QE%UXi^YEYMBdXuLUkzJJ3Pwnh!UvGhg?Uk`17j7pa08i zf9u~?54>1CaFjF+v&9*fOmnxm6k{z)w_kMaEJ@(-6?MVJ2+N~NiNE2#F1vhb#wJ+f zF^s(;@<|oz?(Ue~Bum~-Aw+^@6f)xI<9Ng5jV^I+mY$=WgIU04;|Ex{e!>$%D9kco zmAj~lyIV3%O0-i@k*h%|)_fhU6mtb|g4YU(kTE5Xu;)>v>4yf6jAQ{B3L`wcDgsv9 z4Il8H`yMZeh9M^gZ^JH;?C61_5G0>S085LoXOw4wHvv0A$=BKC0W$v+OHb%v6uDb> zUOv}d7)E*8y-#>cf}BRY$7OYUcb}H65(0p3@8_QQAV`%D`XryCL}uPcm><{2^?&Z- zN$a0IX)F5;yYqC#9uU@&1hmO7Z`d{ndM&U^;%3TRD~TT7%OD19iR`6SI--devx01` zK^d>}tR$22*9$oQbP@d>WxcGh8g8>fY-5Cyvfq6DoW1exRe)%ZqW)~1IqKX}81J`GKgE2_`STk$8KP(t_4 zQ}*N@a*NPs+>5db)G>A%^@1CB%@i>Vtl{llS`SL9=u^%C7zqJNduVQGp7MsT z>m*_1I(4$RDo2Ob5w;!YSDU#sR|A5l9ozx$HL>a%04VxQ%mx9LK!|vosa8T?$MBeA z8d-)t*)ce13BPh@@}7C={`Ph}{rmahy>_4QQh6`PyUOh|X3~9>JXrKq7*!$Yo^4QT z8o0*mfJQ<80d)RJ8yKD;;W?#!|9B6t{|1a8%}VcHxraM9{pRIp;Z2&T>u5~C zKVhygRsge}S6yfD`a&~Jcccm}M-Q!kX+>V^^{;x(Nj&%3dxsI$HTa%qGU^$|SO$+j z@2SM>^7@9|o2PvINlM8AzOX#)|NhQH<^|=2dk1ZQgGxuls7wwKk}x|>C~%b0&s|hm zQmJCvO<$Gy4WtI!V7=|Ym|fl`ZwoBB8VNd;v*9k4J$7>acIA@UrCDK*8_*I=7WbWiYILQ4*w!oXrK5^mFvkc|T-o`D6k znOnwbw@Y4)G_r#d(>?vRO~R6q{wd@Qtiai`$SUR%EhwP378*$aA@aKs+7&`)7E-I^ ztw<4oYDQ1%3kR3RN%=k`+f`9Tx~9r^Ywqwr_czQs93jCnNmPA=?E$8#jILq z?`i;kXtoF}QJx;Pu`YlRR$r8){2c(lL&&)kGclVP6Try1=@xu>uIdy8rEpX-hv`?b zI=Z@;QH;6t)lsU)NRNJ;tlK^zYcm4?fykVAyFg#Y7batqaV3ovPEK-iEFiA{0u{}Z z12HVK=$kkXeK41Fz99E5dqDHIb+me*)dSC84BGld=< zv0Z50pFCKzsj)F?jkA$(oATn+F&Ns0@xUOJ1UQfIfy#6FpcM$9aFjYe+t??`79N2T z<@`#7n&?qMA(E)p#?nN2z{R-O002M$NklIo<;g;gm1GVB-&KG2Nyf~ zxb@uXffuR=WR{64E~Vb9Hh?mV5-X3VqzwN^?Y{j4qQ!2XhQ%+G^_Y;+LHB85*LdKq2l%#Jt;QNG3p6xOOjAE2{_t8yc*;=C%b2medkUdv+V78 z!cGX^AhB|gPz`Kyluh~%Z*>`O?A*ySP_AhgjUk7f-Msq@x^o9~^I(IjH0bpF< zno3x$0->r(qp%{~i|Yq@G5PBU-@8NUTFQ$O62q-p3I$rptODZr>ut`mi;B$4m&-XZ(=_CqSm zjPRY116x!vgv=CfEYu!nPSWApvm`NP;5(3m*Ume z9RZTA%FzLc(7@Og$f8vu@4i3}fqiw&N3N~4rgkbRs;WX9eXap;ulc3!>x+j2Y}EKK z9{QWF>6=GA;ck#V%L8gC$4RV>^2iv+b@p|a%o80T2>8|>&yzH>X5%rRz46MZjWWM? zIp4Q`v}Ff?WpcB7?WC=o-#xgH7(Qw{!D63%e$?ip`*6XvEHtGc&|C`0xx=%YH>`DU z?IX){|Hu@ld$>CWT;e_5t6!iASCLWdh3jYr>d@UXuK)+z&;b}Z+t@y^Yd7v&HaQB& z=VLt6jH^H$oM)8K~a|1m#Cey80& z=(LXj79THfW5g=lDQruG_W7Dr+AH+i9`xD$-8^A04JvBD_#p2{10bXd&?yit!20l7 zs@8tFLtp^p5_CT9lRoUg+OGkCbpi11?ZGP0nPDhZNogM-V5BZ;4c5F^BO!pkAnd<( z$vS?MNOalo_=p|v9_Lq-y4_y3hj$)3wrduh@EDG@QEE$1w-4DQC7A0QDLWusJIDg8 zSM%Ctti9V$)x9n<-oS#kU0X>#qCfU=?4{T{u<}VH&9J&PsE|gV<{oQFb2z~I3h+88 zxd-smAmOMK>=K}J6Q-0eG|VuZLz!Ace5EWeyLG6?l zc%l(XCgut?d$gXk_wNkYOUJ@?f=x{~E2Up5i4JXgI0P-TwPK^gLkN155;hcV;A{Ii z5MdHuq5PLoW|b|R{S8@$Fz1&-(Dj!xN!KLg+1z16vL9g>aAF^2)qHFm*=;C<{Rw;R z!knF&^RB6QX?YR|QMMm{xMdHQNcB{~J4>uGyl)gRvUZEQhlCDwx7jkWDWA;aIfN!n zfdOxm<{DB)`nV}DbxLmWH-di@*G2-$H@Q`vcVKr{$O5Ven@JhZtW=f&%0&a|9B}kH z8u70=j)07#uQ;%S^XWe+Gc&WtY38^}NJ* z?lNqoYQ^D2-E-@oRu8;5Js@9|JiMCCE+hpBCBLOJ%y?Jc(VB8o5I7vgLslgixEHYE z>e*xV@|mFZ!h9f#!5vi8v>)Bd+NaMl7~rE8Ahcy~XO%Lfm?%(u%c#qB5_HP0BX^x+ zcB%SB4DAqa151b*5 zY?IBW2lkg|z+k*M&#o*Q*1v!q2XN4GdCPLphjop9a*W`BqeSBpjJTTp+`9;EE(=4L zQlo$ZGa-zeZYw~=u0qLg61D-~gNu}4qd`dr@R&P3<~+4oI|5RKftk4c82r@H-)Wlt+}mBYwby0jEVLVsmhArO0bWk} zn6MZD*&08uLIg%H?bP7`1!5T})CF31C~cQtKIZnF3jL&Hh(j|GV&+kzmpSizn*2^V zz$O|IAruBCNCn_PVHu8O!#M@0HvwuCx+o67Ch~p`d5N8EbH`5EdpDlAgn5l%uLI4Z z+>Ge&SP8TXmW4d(Zf1$G1M`8oCB}mcSZ_yU*17SL7nZTqYwdBkKO4kSYCBS>l4ffM z8(f@$S0x1{eM)7u7u2DW$800LW8eGu8ht!tZ(f{oxk3WW!F5jc@y(2VbYq3Q0x%zY z*~p*=H37`RBwAI$uu$Ruy*yUp#HY+DJ?+OU?kt|Vr4)I(1F(2qz zlUwYOcF!o+e#(R9dh7VJ*V>~6ZV31~G>F`t0k(K&p|!e_+ueArXYP)+dVr4iK5rg= zL+#ZsxL-cfr#1ASFd>_&j6r@|<|CeFIBX@!GI-YR zK3PM)Fzac+Ch}opdy#nokXiJ@`V!~}D?xe}^0I=_tHi%5T>MoJG29l(IdksyF;|^v zl4Nb4K3E~Nn#y{KQ5XdtxTKK9CV+uJgC=YS$E0B-1kQ=oq-4%M27lt%Br{osVqsG~ zyh&1b!W5YsDMHw?B+nn1{06@wFU9DP&2K$s(BOChjAY63+&?hk*i7fnpW_U$+?Xl% zp4>;?czHI&Tx!B*ZXy_JtaVj7X&{4@u-9dHW9)nadn6NhU1!Y@bjJ6XM}&?0ZJYt6 z`c(;VmSn=^0*og5^VqRDH{M#U>+6)YX8ip;0th2jTG3Hs+!}x>0v00F6qj?d1k+=O zF!4a060XEjH8MMZCtSO@3v&sF9)haK`Yx~zl!RYrx^X{cfA-N`yYq0<`UXZhf4d9u z+aunuijLofND>S3{abna@ZJ(ENUlw8y()6bhmE2Cf{eXuFy|G^L@Y6{m9D9+e_B1z z>VfB|2Rtp|Icm_CX^OVsFknCg@1hXp5&|uVN6nA2USxAWfCcgWPacwRZ_1LVI;o7} zbSf7sEA~JTrS0htzYAy(vr|*#y?}cvoiK%*+(8LT;|(jJ$a?Xb-Ucfr&=Z&5Q&DII zLR@VKvDwI%7i7b=3ivy5!2=}DdjoLe)r%Yqq+ZvSZ`Zc5E78gH2os-&BDhwLxw8jd>da$FD#J& zk^Vsux%$d$wzj!z_wU@MjGC(3cx}|b-h+3zwqCb3moJV;>-CG&12Xi**pLB$s)PbB z(?#A){VRi%Fge2E0(fQvga9Z5{Ds*8yGnHl@*TRlzt6gU1hR1{ntcGL%_gF z#z2P270e?j@IsXjI2(!KSTI^QqVIOM_aPgIi6-HKDo?1)W&;m&BM^lJ;C)Z)ixeJM zA}Dq!tu@?jVJUnVJ|PrcAA%HTs;e|514r`F*@K7AerM1l+<3mr3^>*46 zr7cg)9(SN~6N7{9bH~#K*bLYANk&>hVW(s`C`%o1BTu-F$}fU9xj1(63_2jG6Xr-A z;G)pX+T&FcP17#e)pqLm4An?>$OlCS0}#|;U=S3 zR6;=pwbXRIFJ_Ja5SgP&6evcdW@YlANFR8tppot_TUpt`A+X08sjkBWkS94xNKJuo zo~JuZ$Ol=>tcsmKE4GW-6W!~*6u;@bb-N6B-HZ2K56s{LcQ%c}(MWi0)+gS<^|&W@kF-H|qqUsCYaKxEU||CC0TS_< zfDSQB6ndi)@fS`q|9DULb&w&CPpA*34G0;4V3~8eHgh=v8K1R_dvH}xmLS zeqKeM%4iq3;YdJA)bJG#-Rr`GC5r)YsPB$b(PeNTVGnS)bt01*MX@6Q&$yPt&6qKE zEQT1>oFw~$v2JA5l(I7clGJTIb71Sqw3R{mDgaDXSU?Su}0lhj$`PHEBfY9XuoL__-ArBF`Q zuc>~;AIe8kWgb-6Z56Zsvj=n}OxbXH6WUiZ&v0$?mTcmNdU<^SdxcNF?h6 z#H_OUDC}Kp)XhsdG|{OMUWiZRC!e&ARu8m#;Q8wT$$=O4P$qRhG3j9>Y*-33lu=Pq zB`j+spztFQGsS(o@nppomg*?!EayrJA=QIczW3pQAMYG;OD;v8(OD08AJufQA5 zz~-oc>N@3>jaTB$ZQ@)rMEq})J= zn6zQejib^fQv&?8rPXEo;KTctFOZ93Aci2u6Go+iG_JBhoR~wD$uPU#4pizsHd^#F z+u7N)XA66F=l-Y-_KlE?3pKU?fU|OoFrB(}UOGn-F}#^*#!8TdjJBO!5=x=)O0iRI zbWzR4+)%EN0BE!T1*cp6C9~j&v7zsL26Q;((TRGH{~=p?^4LE9^d?~`Y5RMB_p<$$ z|MfSxp4o5wkKZG6{){trXm99e*n52 zRQjaMG*sWcgMFN}laB4>`UyEVHau*R6^tS&kpx1^D;k5Q8zV4Wt6StLF$DI>v!K{y zX`WTIdc|SOQ!b+~h%i$^QhCvx(ZUa9*z-epb>t0dNyDW7Q1bCao6&>6zo2{s)T|F*4CjtLdF!e8rUDG zI)it;nmw?I(ICUhKx#RmT0Ha4h5mBOOaP! zk!uk!0lH)VzSUE9HREj7I8a+t6u@qK4x%V^ZV z(Ap#8T+fafBEyp32ncX~dF`w8DdvUCU*LzjxW2k+XQ#=vL0e|XVRhriGG6QhK$Q*a zotVVX28btcy@*j0r!vY`sm-=N-6b?})UgY9_VxfYFvh88T*4?Ul#>{VfDP;WO=U zpdO!T{i`>;XT8s;F-ZEEo;5b=fFtLGzULSq+_&ba1ELO}UAPK;8^iscV~ysacrg;l zn+Tu`U;_Y#4CF|v40zaSh(;2rqW2}`_<@N=L&()>&r)^5_X32MpdUi#=%GI*lyjkL z2wf1T6EaTWUJ&E#%p7@uid1GI5$$F=$J~G!fCJ5ko)kohn-TkT&nMRHvKvc$JZf4XLNOBvjlM@8mM5xj4vElfx4~xA4>!40}auvf{60tMR z{03w$;uyo^2SSMR=;Hl$@{wd=+!4kCO)f!27Bos1hNrm{B78821FuF28j3qxgY45+ zFJI;yDv(No`e%#uBLINFXcuwl2AW$r|H%OYk@?}8gp+ch?zu*ao%w?xoB@F zL^w8k-L9(5j3->>BSlNkgKp>X%8}w49a*_P$n7R(HgrLO=#G)Z z+RcFWrcqj}fL;~yg{<#UQ3~f~kh$DW$j+IwL+J8^c+)0eb2nGNdwUz;>ZuFYR-(Ng zsss)8^}C!r2Ou0OFRt%je*(+w(T43(2G%-<0l{%sR#;W6eSvKRKRXvDMdsWX( z7#EFNC!V}0$}7U1a(d0;fpwGCd2X=NriVN2jnhO=La)S50EtF9KPZzGf5{#`ehf8` z?{*A;dV@rO2uJbwbpqD-QM>{e5)JO7J=zI{mu&B7#|a62yiMsWvD(Q43=^svM0ZGD zRdK1!_rLKY;_Acp_x`Il?7#c5AFjUfY0foO99kN>c0Qnl$ZF;EJUOz*13)-uM zq=S6@<+&L7c{-678?Y2$abPKRkc{~>iAdE7PKV)bwzj$ra4-lPqw2uvE|mTnp3OF5 zbY8kRf>DbxEwq_EWPNSLb~eZrwDj0=YY%MuLD<$t`t9wvUcnedv1O<1_Grg4ZOV_RM85zV?ve4Yr!0EW1ood9OoRE>6Rej=>&nC z0_uMV<4F$c3fp5Rx1`W34R5##&7MnySXc5?hpHr)C8=eQH|4=sl0~sPlmt^P@g4v~ z7=`NAqjrc1;{K*RGXLD?d|!up-&+?N74QCZuik8NpYSC2}P z7w_Syt%slMs``$;ulvwFsXhGdJ@mJXetj;0%v<}qC+}~^UuCZAZzavtd1WlB4+V1Y zOP&RO$~1NT!apILRWr~*>mV|05ZOfzVVhrS*!`sy z`|!ykl`{e`82CPo??gYE9_Y7IW1}#uBIsvc|EIYQ={(5Cz?kFF_m}nw?Z`VI%w3b# z`j{gD!j8q)Qe_;CTr&<)#dZ~m#hGV#_Ms0=AoB|Bnt_bs5c{La)rOH+L zT8&AQIqwJP^ZNkM$#z`x!*XG6avGlb9#BfXDYjrYeKkUq8+vkyDt=TfY6GuB{rs|TLX9?-gdp^pY0D<%37 z$}FY1hT)#Yb0K8i53O-?Yr_IiiaQX%abh~;RrB*0>WkY13c<^l=WK8c7Q()SDkZ_# zIG<8RD+xVND1kQeutTXKlf&AGI^|UgEQ%z8yn>()ll(~vS{;DHM_IN3YF3?}?6XT} z`W!0Ho@nSqFfLH`@W$S}{xO-a0Vf9Vx}ij7tHf!uQS_5cs}DdUkB2TzJvUJ^2ic4j z$DPcliN6n1W)K{nq*`^#qxhj^w-LWQIXY&SuU@q=l8$ar7qMCh+8)=uc8|Dhb`T#M zoGKzXLrSOw|JOiUgvL8c#g~`?j>Ume;{8X-IA!3b2K&zTmd#94IuA{1Wo^y=_y6NQ z$ybZ^>;J`Nd;Nd-Y5T|jk_rLO=ACjgJ2PXy_RB-IMH_$j_YUm#z5A5)#nU-CZBtOW z7Z#UkS03Pr_*z1Jw8Jp8JiNB+K90OVU!v))ueN&Nx$6OE(x5PDQTj0gWe5Z@`og%n zBB~To*t65;r|tFgB;ZAPM>oVEpd@p4o1|=8cIU%qR4|>j$?gQ9c*_{@2PmukBvnJ5 zMb;2x2S`!J;8l4(6f_Utbm136g8>_E$H*?`kdMSuM`|`g<$)n=B6)l>=yr%w%d12t z$cWTi0Uct2iABH}Q5cVm7!S12t;itMgRh_qqB3)CC0Qi!0%IBl7$p{Vxcg2Yp2dwV z!Ycq_(YeV(G~~|Ni1gq=+lA$J-7e3*=3=FjB7kS=@<}T1(r@`td8O?HnAw~U3lvDsjd~ldw=pI9$#c)KX;nRhwVm?`Zyi+EIWuB*uPbT`8&p%lA}NFN_zAC6ekkW#<7{~;Y$>%_g!_Pfnfba6R+tYY2q&>c%QqrvF^YgFnY!El7!$)`hfAI5r^}LHzWh- zCn+JiD-Zm@L$A4Zc%SZP{NoHscM{f18c>QdcTren74(S^OxpyYXa%NfYHtFljHz zKf`tJ%$My?KN8ajcbR}8O)~mefO7yRlAmWKnN_%*UkV+J4kf45=zf)>O88AK*l$0$ zwQ8>ca46h(oCNq+&(7HDvkzeXhDbQS%QXaA)3eOKCb@Yk%^udr2z_0r9Q3Z0_X<=L znX~&3^8g#e?B2awfJp$A^sNAZ3gB@SkW*pcIuud_8miX^612Mbo>zUgW(7O4pe0yU`J1diZFnf3MCW>Po7wpfcu~Q_H}zk zMZ|VOS;~azWcHUWesbKV#`zpsEFb3mHM5`GUa}{fNm$PSw@~Opg!V)_f#ub9`atY$ za2$8fKK9e2mHAc1z4e<`543vV|DPUs!2u4$Y?~4pA^4U22cf4}*BG8U(Ibob9E^vI z%|e0p!&wfL(+JnP_4hlo){6kE&hVQ56{%IPT^?~MUipe$*FU@O{L z-?ar84o{ZXoPpArAmLvH&sQD>Mh9v(biNAS#h`X~sv9_pEaeRwP%MWM(B%Lmx?ph} zY|c{#4bK4^?a)ZXUVG^cn;sp;I~FjUcNWCkt9|*&)3n`wvJ6HuL=F*RO85K(nv0IcfW9qRjc!PQ<*D0V|VP?Tf_ z^a7>lzy14vN;%6*_Uh|{_BVfd&|PMC+w5E4%~3hvCWe?iHz4u=CHjrLq6w0%>UsZw z?A^K<`cQw%bI1Q|@?2kvrRdoF)>CxdsayZFdf}luitJltOS?_qWQLX39zFGeYvA=)O>_cq;~cJbCCA+m@Ukk zy^Ud$LJ=N97ys$kMqr1$WFP+N4=Ev=qY496tEk$tzmui9KmvmRkYkVj2k}uk!89zH z2-Ty?gsSwRtcyt~;5-hip|rQfUR1PmXQu77OT@inRDu!M`bOIBk*)OED&U{e=Nq7`v>qviTHb|68TUSC%CrF*-M4kiwE7qSzW5fyM zP!GfI;2t}=Vagm}^%KkRFTcNQ-*{VqgW0?9ylvnA;HGUq&2s-U){jRvO%;j~MyM)c ziM5l?r!Z>Z5wSPt@XA){yEwG}K2Qu9|5ZwW1{$z5s17qRIc8t~`U&UV-NNYk(N8d3 zq8*0}4gd~W8Ha}hXPBk(qk6JmyP9T(z(EZv& z6qZtl@-^(EM}(mGli*j0c$EtygfZLzY#JaBOAh^_jfxLSsu~Q%sEeUPd$8{9GnnSH zzcp4B^p85{@4~Ucgm>p_BaBR;Or0np1F*JUIW}SMTwz>TfDjsNgM0ZuuV06W)k#8J zm58Msyr&*g@?D(%*48y(E9ANAfEvZemWHl1#26k>KGjd1%@`pdIe^b7&yoj4*420) zjLj85Doz&V2Fn0c0pt+T4pdJ|0kZVi@*epWn9~u!q$)~G1FKN8NdSifJal)=H=h<1 zfP=T1b@zu40UiQDw7+xzQ3Q%~0L{<q8a- zP%M#zHH2LGPk!|RK&9FL^!MMh>B(XH+yCiR`{2*k?CzZ{!h6YM0T3!(QF%qgG?fGB z$myo%i0YsIB}Wx~bqVBiq-)Z?^#il7T{WBFy9r9;6<;}JpM1K&+|4;)pbS`9A_O|0 zsRDQq!W?VNL~Tx0mg85;$#FM zUl5j77+I>7NOBWGqe(o9)Yo{`sRm`RomO{(e5VKSP*q?eHb6d*j7n6y!By z@af%c*hU$Ck6hqB;|XL5`P*XMl#*p~)?pXc1)%Z$2n-x0pHrn4&FDG|Br%bLB-DH3 zjjN0s>y9t7RP3MqU)O94c5tEx#~TS-m5(ICyqzFFoaQ`OzWrp$?AF4rJzCqN94z@u z2wiGJ-_A0rw^`4s{-n7n77NSP$t}%G$xnsCd7tvsI$Ax@>VfC32P7q4*h7keVsRy{ zK9ALv@R8V&=LGfzT1H=IyS?+Zuek~&ZG49Q;VO*CQzLUC$$Oh9HTPDb#iE3+prL26 z5&}pyDNLfr9Utz%i#lUhj-lir^e9XK*fD0CfCVX%-TBH;Y{@8p`ox4?x!8vn6)zX< zQmIyzaT_3cS{Sdu;KU5cOlcp2Jb-c(r!*J)C>t;M2nrWb9Cqs=w7SRCK_^CXdp`we z0Yd~f$q-4kF1~fl&eH}_wukr~Ke2scIFl$KI5nM7!9H!*9<3sz@vyOps)U`VAabKR z)J42>@1ab5^+UZZg;>H~2LfLTivB_o(I*w+`mf!%1CwUhW+tcH-mtQ~WLq1A48b62 zLc5e{=h}049;vH3pPu!v8cdVD2Y-5AADv&HwT@N~yqG@}lBwcA$X(4#@>X4+b6p1PWOS&hEmh z5^=^YcnVrC@Sa|4)C2Ktb~vhL%e-qm>gLeSi~@BfVjwe zCu+I0ZY~4c1jU;7_EJ<$c<{_R_{}*yZ`e@okRkW-*#UcSo8Q51yKw3o?tR3GeR5BR z7~Wls{19F~8NLk+RhMNSV5SV%yR}7G(?pxSGD4fx4&wTHTu@)_6Ozupg@7^ zN6FXiWX%o;b1cypRbqU&l(mz?L4bowHOewp%)aFG$>B*9`4PhGkpJ|nLVcbtZrJ-D zUAKL-@ROHbwac%ZhJA|I8EEsAM~lD9UlP-@EgXspU;A; zPi%`%Z~D#0B#id@e-7~g_VB0I7?s60r*rdTJrsMj7jP?P)@ReF|5RlwQ>&Q4?v7Z zI|hl26hHe{gHX<($}Ix+=(0gjv?htT$HzL^H)q{^l(S(4d}xbtC;EbODh6Iah7Rvv z_mVm7KyPPk=pBVM=hkQe~0 zQ}S1~WZI{yUJ>Ru>kc+e0qT61XL)=5SWksAdvgg;jthdXJCCv-W`SP&+02UoQ8^Z5 z0S8G4-9dn0-LV_EXT0(?*Z>9AMyj0?>Y&TLup7pO`#E~8T~A@QA=ph-fWkVS`6AC* zDqC~|ctk1P`OEK~x7p5sO#&#Avzw3{4i<03pP}CwUA*tgZzC3|rk9fyOx&7)3z$eX zHeTr;HN4W?Ci)5*5w$WkN7VMZ!ZP^03jM1_t`vQ4gyyQz0e}w41Oclho;9p_F?Tdy zkrRHBU%Jw~?%p{$^33T7+@lym?miF4@3ZlB`iS;+9rOhcz1HXMwK~}yGB07|!p@Ku zm@HA6exGZg$EA`OW8%wYh z^0q~?-y#eFe*l?A^_frOCy{s4Z=SFc)|!K zv4oSncl*IZcb*)8ut3THAXS*~>GT1qf21OXL70DX}P6>iuInhLW9 z)NN|=F{hg7u6}Bm_r@k*EmKaL5XuSU>(^hEW6@z0B=X0hct2xL)^?4q2M{E?4eQ3o zo~1k=Dif;ShD?%A7<{K26%d>-!i z#ZSD?TmQCtpw$DfJKv!Pb;LTs(2toLgJHh`fZ z$=1*Qthhh+H-~PoqE+2r7LuE^g*}oOQ65(H>}9x1smSe-D}&8)gx?QHSzx0?UOQ!I zb|y?%NQb2<2P+?0K#T_(u!Xnp0Kqtn5kXEfzKa3|z!5_QVJl*5c3ZtI5T_gzMVZ84 zu(h2Iz&>UL=*f9d@XmOzXFR}0k(XqAw9{R;s?Ca$vI&$=^60rp6Dfz+7R|o%!zp9~uv0y{K{N1%tN;v8)$`&^cNYWR_ zz!nHWJF&z=7)PQSSMe^_Xn;z4CU9vhB!v_QB=Gaj*E2#z4~#6`hboxpE>%S&f??Mc z2Bs09!u0|!L_-(GkRY6)q__sULAv?G*fC3%ckLN9`$nb(@HiXBy@PR+JBOgjup`n84^T+B0-8Z6TvE3ham8?fWuW6pp97jXA3 zS;N&`IFCRHnFl)nK9AO__Go$AwkcCdFCx@IALyqxlyWNp+$atm3VRbb`uOCeUA@w2 zu*KcjEUyEe-(9g=fXYuWvOw zAh!qy!oUTn8b9v9Eb=0{lDpGW)InJ3vo!mRkID!eBsg*avg9l0t?QW|%ORk9l|do} zUS-a`t84b@dt8G@10yyPW0Eijmv_o`{T^(Bo~TXGUuRA;79!jV+f zEELuL?)8T&>q?_O?;q9&ZKs(W`j>qTPrv&%m4`?W%Ppv%HLrrOIO6~Z zast=rsWhQK9T@HS0^IzHVbRjHuIf#;whKc;`9e4!^Nl;i%S>)8rmw~#MUH?pfK>uU zjiy8gpn>XGsHCJ?T>_{}Qj5O3owd#Nx;rqoxQf<-=9arR+U(YbI-K`CJ;u8?B|{$~ zPAZoy5@Hp_NkYXM7THg|Gi;O0^|RbpKZ6tHdXYeqfBPLxKX3Lo z&&TbbUxP*Z2am0-f5cWO(-gru)iFFkvPzN$(=UlOg-H-@#vu1`-C>xq#yk;#bYX}! zc!Oq$UMMVR|okbSSMmQNPklKT7@5_U~~v5MNFfU z!gwJ6g{!XAAdegGOAdl?ajqhvjU=2+(Mf<)F1LojI)FIf6P#nnczW8Up5QA2H#7*! z!=VMBYc>E9ePV0^m)lg?X#W~LephjwQH+6>WVZ}dJfA&)lzXucr@SF-oaf_E0D4=Z3bRaMKhQ+|xnb@$4pE z8p0=#vFb2+QygllRKe zo(Ex_6FzqH}++@M3c55W!5dNmHBY4!~c zJ5VBd4xgn_-n7Z<;dCE0h8J{?zQ*wvTE~0d*s}RZfpuSUU(}adN2>>3 zxE|1KZ))N2EEUe1^CJC{xt(`l%wnjbTk{E`$;lEaT6L^jg_<1c&~hT`wahA=M@EUh zSL91oyx>&~#R3e9hbYS>h}Fq_)JCaPGBW}j17U{K-HX%b9ONXmTTeFaqkD^XfZWow=MjKZN$eKdoU8Kx)J(DDSEoZ(C40k+oQ4B0G+!KENQIv%6Jxd zQRCTFfs~k&h6M&)!U&7UX-YwfRX_$=U#+-%sw* zrVz{z;10qmedJCF#FUSL`Ny^Q_V9W~x{P8#8OI(83~fH(T?h+D+AMQJcpX(f&7e$Qwu#hFf=X~f(k_!sU7=&g!Gfub~uW7C|Nz7g$ zlrGjirPJ7@3A0r~mYy+42UH;GB!nqMC{>xc8dBa3jP*i#%lvd6gaVvT0ZY*d5N}-Q z9x9E!3aE4M56NMoHKmvc4gnnkH(V)Pg!0k*?!&+EkAQ|86+5u4(J7fPFo8e5xn$-2 z9;#&x!x}cbcqU}W&LE#Q2FP_oGUVhwtSWLvr2Q5Zu(6$?iWO`xkO1kdssx2ZM~2cn zVgce^Q!WebF{)am;2z~)^Rd39kP5JCqP&I(`&HT`~;UFb@1b?Za#K1p@4 z1I~NvTHPMZZ`pFHVv}Of9l+4R$?1cE(ngNG;ZeYiUB>>=vfX~R128s(zTX9KNK#ZL zkFH-+!W!KN{TXz??~#nr{PY5KJpCEH^{_28sCBe@pw$DU6bEVj5ZNm?V;^+L+1rWLcQ5tFLzUBA)Qq%M3ek`ddk5$eUSayU>)n~s!Y zo!Nm7I-67v3>n6tOpJYnhc=_KIIwya(nC9nP&55_yu2FY`iM5_;Xc(k>d=|>N`LD! z@3sE+9z3;RE3Dd|(XXMMH&^cfN$ju0R(4dfPa(^bV_#!=Z)& zRK|MGuOtagArDVmfT|#U#O;%05ydz~DbM}gJq%F%+NCC*HGqo{C0vQ^4muA!>M=5i z;(4?|><#(VA{c~#u+Z|q{ryF%6yOac!&?Av*cM*Ns-RxN6PiBJ^=TIdL>Vh#4*~Z3 zKP1+_P8A0k6aW!Qj+mrup#YLN;Uj(wu<>*KTD1+g%=uF8U&bf?Xt;N1pHuRohBsb5tndnj~tdBd6>sUr?RB#!7!#BdudF^M_eb4&Nbnl2VL=vl z0XWFzK}C^hf|9gQH_8CjNzg5F2{O9u10*Q~bjJuc@2|$Px#!jps>OAAsjFYc~ zc*QL2f|@`m=8HV9lKe8he@GCs6aF#MJ{HC~-FFtY9imkt}-Mo>1>Glh^#kD8l%z<+cfLAUPzSU8V%NDoWPY z8-SV9X~(8UsfdFS!F4yV%x~XgKb~K;-7Mh}0yo&;RFy%iL$Y2*jwkhXCmwrA`JY_7 z*=v-{(-}mpALSY0id2{I_FLHgR80wB?6Q_Pn;aCXnn6t(D{{LrmI=JvaqALX`82y4MP) zQv37VbD(FOa2Ar63y|Tx1fgQ6B94Ku$8$5x{Xz{(FlP_=yI+nII)+n_iviGr1iJf# zaz&9N`n^JK$(`=NjCJ~<8sT$*y>p_MF-Kh(pZcmwDbWLfpmhMW z3``EHf|6IE+sfp8+0UjeM}pw=2Kl}6$dbS?^9%qF*_q9$tZES8x5ti;!^Fwr;NrKC zSO@{30vz*C`QFqYq|%|%1`p=pS3MM_Q!P>DgtabKT$S8w>-$9jU)Z}C{tM&XhIm5` zz#JZ7jJTIleS|qN;#k2k#*36cMx|``w?e@*w>7zmEOKlX$Kas51%RtpU2m%k)rY)K zsubrOBl3wq#i#=4VUH1DTmbl}6J9L`n|`N5V+dB@Lh49WXGtE2IX5Kg39Sh|G`IQ4 zT~n9Rdehu|%4B)?c;9X>Y}r#1;x}O!wkL3Su}_phr_0FXIM)oLV0%yk@{6^t|Cq|& z8euL;M)_IiRe-gjsaXfKeTaka{TuVl2SEA$LB@&D8Y&vrU>bE%f_k8bIY8U*J;>Yg zeA@OZy!EM$liX}Lxg$OIX#R3@t)tZg ztsZ!;dceuU=c+|tu`v=qo_9y$RDwr`4|WAC0TlN4uMqm2-y z6>4!6a7G)1m&siUqP96tLDVa4Lhda+f9b>ZI=|w+q~tqgnX~FvozdoptVX%s2Q-Ua z=os=r@=Ehsht{i%IX|xYj?rW0r;0!oK%*WMV1d#FyQ><8J`G*DF4{l83louKy znC$2fP_gp>3uzLp9$;AbNMexaq)(8`88SwusZcO8F^Ymre`$Y!xe_P8tdaRJ|?kF@`rhs(pp;W|b(AaDy_TiEViPXFLBN_TDVk z((AhOTW22cJk>m~$YPP=D3TIIQIl=SmK_C1>;#E}Mi3xCMx+DepM}<3`zmY zWe>bJa~r`$s6R1fOT-druHzO!tdl0?DiTa}{>D|}9_?2v3$Hl7#?P7~wHg^>s?hkf z3Vn0qb7+@nMM{~ufzQbR)prc7ywj}OyI0>q;l57YP1qOjnMQS!-H5j zkbMP`Vr`>A?4<>i0dOKa%rt?w_YoNPAikbQkEBV1shNY-RFtciU*E9PZ;+-JrKgp} z%7(TgD<)aQsAq(}LBG(qF#7XB`;?kjq(<_L+9%>&bGOn;;yq((_B5BE2rhC%^e4lZ z2`d*YBkCn$T8JbVHEwTH_s~?A`*wiBVXT4@G;V7+@SP1mzxy?yUus{L)d&jE}I0vkc)EErkXU zfO5;d%5$}dkFY^bRK-nsnR4C7dHP)$EmZDREDIL-JOU~C63@-zdN75Md(;K?uhJ(L zQ7$`JJ-ov2N9h)WX|7K>u5BW($W4OJ`EiX;YHf^1%>5#!Vy$CEqfsto>j9jwsfFJD z(oW9S1+-DGann9(oI_?%096eHqK7V^a?r{DNIYDR0!sP6YO>V?ibo zobshNa9tY1GK|Y8z@vLP!V-QQ;%Yjg$yXKC6qXJBcU= zpLHw;60@3dkvV|6C__Z%==WWoL)TNL7m*XXo~{wCH--db?E>S@F@i1UDgU`k@7m0G1zD2}P1O=(I}3s5 z=^vK}oV~_io1cXs8-obKqKSUiVSX9lo|30NOU!9S(hoI|%heyFTc2iS$?qbFH6~#x zGaQp*;ry>7;0Wv{1X9QU*Ud15?509})Ut@skWkOC%7BdE&%hW31_?g+0utH3OyssS zQM8LlH42bbgCW*&N*N}Lh!I79X25FZr&w*l{~O^Ig99cT26HZ5!hH2GSy#HGWn|fu z0S_}<7~TTRvr-OLF~h8}A~}u^dK2P7sqaRyZ*FX?*eF73kx6!d8K2Uq^%+DpSZegv zyV7a3@DWV0%GkxEIEBAs2|<5@C4)7Drrg9n1Sq&|qJ`Iq96rh{Hp%MV1i9?G3-7{8 zXYm29p@gt9IZArP>I}q4#uhj>jUYZrB*Dg(h#z5rwM1A~ixY)}3z;Ox9P|m|VTu}l zQL|uTVU@PWGxeBNy9BDjwarZ?WzxMta4ZkqRJ1>A;d~tykWwkbgdAsU%FbbV1dS4cNT#UtY1EBoL*E>M zJ%)g2jP7uyJoF#+qG30PJrS`Ti-#=zzC}M5@iBrQd5_?7ZA{h+_~bXpbfJ@EuAE0m zR9Z{*?GAmS$&y}^v8c`1H=w`ek!&k;p(0~go`{}GAvz!?z|zJVtL>zU#mZv>k~NE> z(8S705$XHGpli~@a-<1NF&k!m?0DMgP1!xf+%+( zNtR$Ax)3dWVhqXpS;MsyOs$ZwBmHK|lmW7&%8K3E!jc`@e<+yvXIVj(54f^hFub9# zqGT|ZWyrWOLU2XYQcDs0VzM-0Q&V$x;p$b~0VYr=xA6NXl_I{>OZeL46q%JVf@ls{ zieL^7T!Ku2Iz_DXdc-YY2$Ok19|A;mqSeka_hm8D)*-|*kTPbOdz6rgqWx;;q{ z%x51zXvDC#S#Va}D>$j#0nm-@ZKj?V-|9oIuMqD^)(u>fxuc8X(k8aZBq`5HJ_Aru z5s?ls!-{*8^ew3lW3AF#ip=23ZR%E}cZ<5||y*DfvFwOWeQ#AI#BqBycDKcL9`lPLk z&|&>Mx|B+R;`w+;W!M?eRtQcL++A{5Fim3NDU-MF_b~ z#*Rb#sy1D~lIq&4K^9ttTq{hSu&el)hFQQOtVMtBn4RT58HlxUusvABvf;*CR;HaTEfFtb@|ayE_+@%( zzu_rB{h^RkB?bDq+M+Cj8o0119!v(CmXMM-)T#!*Si5`(pS35{Ibi6sh_|E-NWm3} zm}UIwGhS8k9Uj4@LImM}fS|L}dAok~tbP02U$w7)6<0OR{Mn0Z_R8tEh&_TVR-Chi z1~E}!2>QLN^no_+ztgrKlJ=R0$L!lr)8;wn+Wf%&`9J;F$ZA>pZ~oDDZJsggAOFuU zLGTo;Oi+^^ed_itAvYw$C=1M4>N5tp7bZ6fv_M(F6&`A(CuMO*Svr` z(!lOLT(x^=#_Tw<;Ni-o9VFvYVFY&zF5aa28Qy8xDPZVtG`w3gi5EnA?~i zZV-b?)*__PQLyMX?Mcs}1wf=(UX%gZmKMQ%g_%fT5kAQ1l6R?VjtF{&TB6*UBv=(PiCNL1n(sR%WdL+IgKM>iEDM6oggUI5srxq9|GRV z40^!zbC?TfS#j+moo+C|YsEt*z^1@lD*z0@O(N#E5VQuE%T7&~f+?j| zQ(~-&0MGDG#46bnCcETIc)x8=I5eOdutby$6HA~TG~pg$j1S)RWeBB*^M>jNhUA>I&lSxu|A5W}-0Z@Vt6v z;TabAILD?u||(h&JhCw zBloeG=piVE>uKzwYohBzR*-I#V1g-xwXV`>Lt3QM5G4>E8z^6}wZT{GcT+_OY#QbNm{s*J)OnxfNyB zN?Or2Ab1oLWNdWIR=LlaU%qa0hYn&HMru{Yzapf@wX4@{5=VKB7vaz{<0-YR)raz#dleM!6RBIb#z<4FtK|?VuRAD0L%i5R^g% zPHlmc0Iy;-*MI=(prDk=iU23fm`;6iN)uwdg{w;+B4j|Y)-u+AW3$Imq;J@T%h$;E zvCp1){IH!kf^xv+&=u_!vT40}dBrZ^xZX;SvSN-)1S_6-h^r~w3a(to6^Uw55K;vl zRs4`T)*J;CNGVDRb}4Ha(dlYWT6GjLkd@#b8XWC~`VoPnqt$joGYr1xSkJofk(u+HEDltY31rnwq=M_gT|zTx*# z4C0C}VK!Jz-LkW9zG+tp;=M$Cl2jFvr9?W(K6L>A8Hk_|tT8E7C>R&y8k!wcR?QB> z5{J1!dqq-dqR_m-tV=u-6c>o85v);CkS8@3BI>k(V!J%do{$fL5f{NbjY7Inud)D}aYzNyzKXe`IZ5ee-5b{=S@aZeftV(K1u05%E4Vso z0R^H4v-ulZOJYG_sXK;(ipfinRt8ZfIVC*Q@Oh*#X`h}^ZE>?*hj^5m7YZS6J7oxm zEnKu(xYQDw2C^S(7lMgr>DP7YXoF?_0pmmt&2Nzm7OSl_8|{;SX?B8zloh%#*)?cG zO=6H}6{oSfL0wg?GJ`cKDT>>qot7*EPe=dhK(21sEQHDEG$cWvSQfb5C_YY;zPFC` zX$OmyFi2E~hpFQ{blKuRGEHD_K7!Mi*V#Ps?^x5s_Vnr5}l`Dq%5LqK+`Equ+Gl>}XeGa>JxO zQ+73q&@%Lyz4|61coVYf5>~=9$EKMB3uI4OvJotIrWmJMjaA0vLR{D+74U0sU$Xm8 zJ;B&QR-GjXcFk#$wHdRr>Z;y`>*jB|LX`i z0=ol&J#E1e%;AQ^k0!+s6M}bb8ho_k8O0n8LUBM00uU2yoJ6(yBfgp;9U(A~95O!} z4qh=^M>P9R1gYdc5~B2ZIOK+FgnMdl7>$!(;{d3#-oC{WMd34ELsLxL8nwW)OB2)@Q6wfEL1ebZ4& z)g_Tb@ig@6b8o%$SzC|a-*Z;De0=u!d&D;!%%9|*$#+4eQ{Hop;g8xU23-@hUcyk( zxyukjddbzOCGuz}FeTUYcSm3^AfR3nUZL^xC-j~7mi+d95kKELNd2-eZIvyJ(5N^I zA<8}9=@!Em$Ix*^1ZrH;;X(10EX)`Y#~JAa!_wTmyzZ8a7P^DJMUhx)N}`0xaxRRQ zj0aIx-*={#LYDyzn1y|Ygb zHY{ft2YDuyKx2YRD@9jlCdcVL{0qh85376nn9Loqbn%J-uW%JziKFyCjH~gQDye+Z z^@GOjfU~}-Na2s_gy$aKGu}tXN-5G)u@=Z!Dz~EeO!^F&!acRAEMZ<^Zi=ghagMq< zCk&r8T$f|@Kb)m{4&~;$)JwcxC}_Y%*NtN)`(&!9@+l?)Bv81BFpV0Oy(k+KYna6`u+=8}|=CjMBiuJG{;1WdY>+O(i`8+(UdW>ys}HISvWRS<^lNO0G6%M% zvN8z2%UYJ~y>(Zd&C)L%2<}es!QI{6-5FeiySoJmI=F@41P=`E?jg9l6C8r;A@{!b zyZ3XRy+6QN>-}riHPdrdb@i{RtE;=KW*yU+fTkrUayalf`N_%_6SdOwFiZ3nllBt1 zzkcR@IaVp{L0uYDUs+0QX|3PCQQn+a8GqW8SK;X8&!IK4y6q7|B-7XSSA;FI|K!@M z=nk=}=^k|XbAF*%G|5>*s~gAw#B{IEveTkMg+1%}XV2%&F>VGSyDR64Hz4(iN$@Ep71WQkpA8t2p4iRh|S=!5K$ij9h12&xSnh*H`;+F-lK44Xi zxF;EH-R|fujCI=pFC3?eujB=2bMegSmv}5%K63{3z4-Wv7zNs=wCRJg43 z0DDlY-afnH_km-w`ZGn`{bq#IcXPW5|7+eAHe;+aQUQlCOcN})!7#ICuwz^hd37t= z!Zg(2X~<K%0CEeJ@7*$L@Ju=|;@1v*n2J4nzfak;K(1uSt6Rf)Ew8l|o z+TpYC@amZ>ey&i25O3w-bq1UgoAz+a4-k?djM%`9@KM)XKG8I1u-QHm)0m|(2WX|PI4;a8)~ua~+` zl=r>s!gP*+$6;4oG%2huV(m75DxT9D%*W@y=-xd6HWK^yzg3+b$XfV#^Ec;>v$?*- z#|gdRB8KW5UoSD}V4&ol06t{RoiZr)EsZiL7Sb{%WK8Uy>wmq#3F?#yQWyRN?N;*R zCg}m4kdVEfOJ*NXCyj*ved~bj;@bseLyAU)6&el)dYzA=^v`VPkGb$0r$UMAC$67F z^m7w9HBA$`sE4_aC#h^hj1n%a9B|kvpalmgcly)tyWR8WtQHrrE=+e^ceCCiSv-(& zT~*>;@Nov(l&$3=7%G@z;*_n~#~=WxTSBcky3-yJ^3?GWomXr>aDs|VT+d~FIUf1Z zVSO`)=#Qk|7)F59g;?*=HjJZ}2nWnsun^VUW<;dX{{5Eo%n@EWe9yeC}S79}#(o{>${Bh%6$Xw0_#Ek8#F=ZA8n zYSG>Mdw}~dQiQ<IoPw+aCE_dzO9 zp@G{bc!Wxl=2r4DaXSVL1bC9FS7UGNzKMCGiVP4E%E5z%O_ukWKX^3i0Qqg3<+{FFa%gXM=0VuJ_k_NP-dVHE!t*2XeIS)Rm7ltQ5;ViHK|wg>g11 z4D=kvTWK(Fg~wUHX-onkyBd?JBx)r7iNpnWIG*mBqcU?(Y#LJBM7324?mF>~*>roG z-R(wuRfW5;PO0Ts)P@a^(~sEjoq=;#ujo|Dhl78P&8nnv?z>MT6utJ?VrmdD*fA=b zaQuZ>nt;PL7ZtW}TO*jXWUOxJ6tIK|Vsgf})d^-Lrs5RrdV;e3=>GW>RV?` zniuWSB%0ziJv+pDeQKXQ`*Cb(S&k-pX3*XLp)m^vfB0-YG@DP^dxnx$>-uz{(o%y; z#sfk~R1etpjT3Prsrx1LxnD{R2N(u5iUxJup!K$)@VCAl!MRmWpiQFJ-sHX;$qd~f zkZY8?qMC|IgqD}fHv|z+5EtfaR3W018W4~g6gtLrDUkwP#6=|??ZsQfU10f_3&WWb zD=S5-S0Kt6i)?rk3C45*XXdYO3i%I=o{DdT){m}g8!}HCNC8N(-IhPiOjw@G-y#K+ zlE^q6Y^;N2IS#-GmnLLliS@g4f|@v5FOc4sCYG*cbOhsA)C(i;(+HjFwE+9q<3Ab|MDBEp<`lAhYSK=9b|uQn zaV2t=gxc^L!{+(|Vr10YyR|2if)V^ouH@8)ivN1}mll4D4+^0!0&on0@-@$sA){U9 zId&x7CCPyrFZxFvZ%}z)*h|m*8T3@xf*7cd;pIDR>G2?!VZ1*Os;Q7SoaB?FFkN8sF z4=Fw8YjfQ0hyFzr@GDPxjzlu<^QUkbZfwfp_*vhn`~rS0yVkrg*iA|JxFm9q9rUN- zzq`>14MEKlfXLGESU`6EwLUK1M~z1*Ulhx|(S6AtmRh^XJ}uDgZ(+}%!}US$ND+o* zz(P(|-WxYD(?mB8#p=lw#;H(*ZW0@Gy;(da^4yzw>a_Tf^^qQ$I(>Y1tE{?Js|+mJ zSQ(G=tjJiCQS6#;b`E^K|1{96VSfyCxlkL&-z>dNFVZ3$QhZGrDjGw`w0^3BF&`hf zr=wtZS?OYi(d9ZRd*eHPE?+AjLO=8So4D)0UoFz7!(W|-MR5fs;NGzO;?`a~>e=adq(SouX%KU)7q-H!ok>wurI zn-dm^k!MTtKETy$j`bmt(D$f;8@0K9RG1gi6COfe6~JNI8rCLL!4nP@u4`*m^8~+> z-LaDF4!P@`_7=Bv{)faCm>`v$>~L9yUj*TxAU0Ad9>1;&jihC+amn?NAPO+AEqj$+64YN#Q)Hte?3*(|4}_I^MH_l=*0j1 z``ZQ@*Pj;loLjqp3+{hW3$`bJ)1wB`-zxNhG+IacT%xFLK1ohv9wqXCK#j;J`==L8={-4M! zOTD>R_Tqcg|K<0%E{8u(*s2z}A@P4D!}SM$1Z=|H|G>ciWb@CH2f5=I0RLHKy1s>VZI~JI zT(gefP7?(yqe3)p++9^))ARplRL6B0h`ph<6{>E1;J<-INbrxL{(t5r0N=FJ?SESQ z|7nyKOrY2@Vvu1%&(%~NUMtQ@HRK#Scp-f;-Ym$CdA)bu-wUFDHzW%}kg-zapbunx zQ@^gpw8iY)__9xoX2#!i75wo5c? zNuD3^L+0SW{ngKA;vwumQ8a)vuU))FBZRLZ)yDR}8AD$f{bQceY{y4W|F?PS;zB#{ zXysm2GapN6yS(=U@JP7b?ZF*u{;|*Hocp^T|Cs##T@=Pya6_Du6ycF5{mWi~AXRjt zKVrcCBL@8l@3X1O?M!bw}YQXG1R^> zg@kbVb)Nb(x!+1h+bP9kdyfXAF0l(JJHJcVuY9TM6ziSq&&(0$cTJbl_CkOL$(328 zG&ASbGa`@ED_n2c)^5*=u6-FyGP$3BN-mJdKdg0N#v_i8ab8!cZ>x7Ujtx-nrkUXN z@+MOoYQ|UD{=$x*JoD**82_#eA7Em{Bejc@d5m|X-fla+29@@;KQ9^`K!}U7q5KJu z`g${daa+jn5FTH87;<#b!e0}n7S4x0WUN4{;Yp|0r#rqXem=o3J&5_X+}X zBJ|Jb!5j8AYU6?mp@tI@AwX~CRVkDupQ#c$!xJ@<-9eKf=B&xMSCy*Yfm}&!K%1E4 zODtsFyOk+S7ls=F2YN#!iC-LsJrbpwtU$`)Iq&Z-qBi$ld zJn3~(=L9_e*h$L{Sf7T97>Z>~A7Hu$L2NTH(>m7ZlGS~l!cFGG8urTx?&53X4o#eu z(d-4(U}7iC8Dn8_Brx{cmwb}j6s`Rn8iLQvEC`$my4K(1UB7J`ws?9j0OZDzqzp=Q z$J@iI^rnJQihWamvWc>UsZf{IXi!;NxAQc%H-Fp}u=9+A&s}bmD(}yDUykLf#kij? z!gV(nCWAH%YVe@4t&E|HY1_4m#ynx9cRNZY;gFnnwu`#?(kN91X|38IB|PrkY+`+v z!bM&zm^}t`2Gy$4TRnk~PB_a^mr|LNE7lKm^Ac(nC(-o`s}`>|qZlz+%1V8^M)cZk zDXGdCc7gjBwF>6#C((FLsRZlW7ya2i?w3MhW8$2RJg!@`c7cy$Ey%i@@6&Z

Y7rNduAw~33 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'duc1XCGfy6Zd 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ࠤ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%0D#EBJI@V{<<8 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

oJrg7{KE+4T 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 z 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 literal 0 HcmV?d00001 diff --git a/app/src/main/doc/测绘云流程图.mdj b/app/src/main/doc/测绘云流程图.mdj new file mode 100644 index 0000000..2ba0b6c --- /dev/null +++ b/app/src/main/doc/测绘云流程图.mdj @@ -0,0 +1,12064 @@ +{ + "_type": "Project", + "_id": "AAAAAAFF+h6SjaM2Hec=", + "name": "Untitled", + "ownedElements": [ + { + "_type": "UMLModel", + "_id": "AAAAAAFF+qBWK6M3Z8Y=", + "_parent": { + "$ref": "AAAAAAFF+h6SjaM2Hec=" + }, + "name": "Model", + "ownedElements": [ + { + "_type": "UMLClassDiagram", + "_id": "AAAAAAFF+qBtyKM79qY=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "Main", + "defaultDiagram": true + }, + { + "_type": "UMLUseCaseDiagram", + "_id": "AAAAAAF2+mcHh6BjMLk=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "UseCaseDiagram1", + "ownedViews": [ + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+mcRVqBoffw=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+mcRVqBpas8=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBoffw=" + }, + "model": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+mcRVqBq5fo=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBpas8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -208, + "top": -512, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mcRVqBrTyU=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBpas8=" + }, + "font": "Arial;13;1", + "left": 86, + "top": 67.5, + "width": 72, + "height": 13, + "text": "doSurveyor" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mcRV6BsSvw=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBpas8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -208, + "top": -512, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mcRV6BtFlw=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBpas8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -208, + "top": -512, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 81, + "top": 60.5, + "width": 82.24267578125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+mcRVqBq5fo=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+mcRVqBrTyU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+mcRV6BsSvw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+mcRV6BtFlw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+mcRV6Bu9xo=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBoffw=" + }, + "model": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -104, + "top": -256, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+mcRV6BvRaU=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBoffw=" + }, + "model": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -104, + "top": -256, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+mcRV6BwxMs=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBoffw=" + }, + "model": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -104, + "top": -256, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+mcRV6BxmtM=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBoffw=" + }, + "model": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -104, + "top": -256, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+mcRV6ByVVo=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBoffw=" + }, + "model": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -104, + "top": -256, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 64, + "top": 56, + "width": 116, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+mcRVqBpas8=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+mcRV6Bu9xo=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+mcRV6BvRaU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+mcRV6BwxMs=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+mcRV6BxmtM=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+mcRV6ByVVo=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+mdRV6CXVyE=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+mdRV6CYpcE=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CXVyE=" + }, + "model": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+mdRV6CZOus=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CYpcE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -320, + "top": -272, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mdRWKCaX8Q=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CYpcE=" + }, + "font": "Arial;13;1", + "left": 134.5, + "top": 147.5, + "width": 111, + "height": 13, + "text": "checkReadData" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mdRWKCbUZ0=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CYpcE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -320, + "top": -272, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mdRWKCcYaU=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CYpcE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -320, + "top": -272, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 129.5, + "top": 140.5, + "width": 121, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+mdRV6CZOus=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+mdRWKCaX8Q=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+mdRWKCbUZ0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+mdRWKCcYaU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+mdRWKCdx0Q=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CXVyE=" + }, + "model": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -160, + "top": -136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+mdRWKCeh8A=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CXVyE=" + }, + "model": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -160, + "top": -136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+mdRWKCfFBs=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CXVyE=" + }, + "model": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -160, + "top": -136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+mdRWKCgSTk=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CXVyE=" + }, + "model": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -160, + "top": -136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+mdRWKChHfo=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CXVyE=" + }, + "model": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -160, + "top": -136, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 104, + "top": 136, + "width": 172, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+mdRV6CYpcE=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+mdRWKCdx0Q=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+mdRWKCeh8A=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+mdRWKCfFBs=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+mdRWKCgSTk=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+mdRWKChHfo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+memFaDHSqA=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+memFKDDSP0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+memFaDI0Ig=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFKDDSP0=" + }, + "font": "Arial;13;0", + "left": 150, + "top": 97, + "width": 33.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "edgePosition": 1, + "text": "+成功" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+memFqDJfpw=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFKDDSP0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 177, + "top": 87, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+memFqDKHFY=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFKDDSP0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 143, + "top": 116, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+memFqDLP6k=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFaDE9N8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 164, + "top": 94, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+memFqDMvYQ=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFaDE9N8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 175, + "top": 87, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+memFqDNR6U=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFaDE9N8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 140, + "top": 109, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+memFqDO+bI=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFaDFhUw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 168, + "top": 99, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+memFaDHSqA=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+memFqDP+fU=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFaDFhUw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 176, + "top": 89, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+memFaDHSqA=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+memFqDQoeo=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFaDFhUw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 150, + "top": 120, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+memFaDHSqA=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+memFqDRZjQ=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFaDE9N8=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+memFqDSnhY=", + "_parent": { + "$ref": "AAAAAAF2+memFaDHSqA=" + }, + "model": { + "$ref": "AAAAAAF2+memFaDFhUw=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mdRV6CXVyE=" + }, + "tail": { + "$ref": "AAAAAAF2+mcRVqBoffw=" + }, + "lineStyle": 1, + "points": "136:91;174:135", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+memFaDI0Ig=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+memFqDJfpw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+memFqDKHFY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+memFqDLP6k=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+memFqDMvYQ=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+memFqDNR6U=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+memFqDO+bI=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+memFqDP+fU=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+memFqDQoeo=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+memFqDRZjQ=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+memFqDSnhY=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+mkD1KIJSsk=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+mkD1KIKN1Y=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIJSsk=" + }, + "model": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+mkD1KILUvM=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIKN1Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1424, + "top": 800, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mkD1aIMgv4=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIKN1Y=" + }, + "font": "Arial;13;1", + "left": 1116, + "top": 899.5, + "width": 98, + "height": 13, + "text": "SurveyorFailure" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mkD1aINBig=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIKN1Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1424, + "top": 800, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mkD1aIOP5w=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIKN1Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1424, + "top": 800, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1111, + "top": 892.5, + "width": 108.9853515625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+mkD1KILUvM=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+mkD1aIMgv4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+mkD1aINBig=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+mkD1aIOP5w=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+mkD1aIPWB4=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIJSsk=" + }, + "model": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 712, + "top": 400, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+mkD1aIQdMs=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIJSsk=" + }, + "model": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 712, + "top": 400, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+mkD1aIRjCw=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIJSsk=" + }, + "model": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 712, + "top": 400, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+mkD1aISQKk=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIJSsk=" + }, + "model": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 712, + "top": 400, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+mkD1aITnSE=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIJSsk=" + }, + "model": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 712, + "top": 400, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1088, + "top": 888, + "width": 154, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+mkD1KIKN1Y=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+mkD1aIPWB4=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+mkD1aIQdMs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+mkD1aIRjCw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+mkD1aISQKk=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+mkD1aITnSE=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+mntyKOOOdo=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+mntyKOPRlw=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOOOdo=" + }, + "model": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+mntyaOQPU8=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOPRlw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1424, + "top": 272, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mntyaORm4U=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOPRlw=" + }, + "font": "Arial;13;1", + "left": 60, + "top": 235.5, + "width": 175, + "height": 13, + "text": "isHalfCycleZeroCheckReady" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mntyaOSZzs=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOPRlw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1424, + "top": 272, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mntyaOTchM=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOPRlw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1424, + "top": 272, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 55, + "top": 228.5, + "width": 186.2998046875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+mntyaOQPU8=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+mntyaORm4U=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+mntyaOSZzs=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+mntyaOTchM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+mntyaOUZOw=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOOOdo=" + }, + "model": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -712, + "top": 136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+mntyaOVKGs=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOOOdo=" + }, + "model": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -712, + "top": 136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+mntyaOWiEg=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOOOdo=" + }, + "model": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -712, + "top": 136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+mntyaOXRTU=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOOOdo=" + }, + "model": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -712, + "top": 136, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+mntyaOYDwo=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOOOdo=" + }, + "model": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -712, + "top": 136, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 16, + "top": 224, + "width": 263, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+mntyKOPRlw=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+mntyaOUZOw=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+mntyaOVKGs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+mntyaOWiEg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+mntyaOXRTU=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+mntyaOYDwo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+moC5KQPBko=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQL07Q=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+moC5KQQceg=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQL07Q=" + }, + "font": "Arial;13;0", + "left": 152, + "top": 197, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "edgePosition": 1, + "text": "+通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+moC5KQRJ/g=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQL07Q=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 195, + "top": 203, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+moC5KQSRfg=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQL07Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 154, + "top": 184, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+moC5KQT7kk=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQMlXg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 182, + "top": 194, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+moC5KQU3fw=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQMlXg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 193, + "top": 202, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+moC5KQV8KI=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQMlXg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 159, + "top": 179, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+moC5KQWyNA=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQNhhs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 180, + "top": 199, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+moC5KQPBko=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+moC5KQXfeg=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQNhhs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 193, + "top": 203, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+moC5KQPBko=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+moC5KQYo5E=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQNhhs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 153, + "top": 192, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+moC5KQPBko=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+moC5KQZHbs=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQMlXg=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+moC5KQar0s=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQPBko=" + }, + "model": { + "$ref": "AAAAAAF2+moC5KQNhhs=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mntyKOOOdo=" + }, + "tail": { + "$ref": "AAAAAAF2+mdRV6CXVyE=" + }, + "lineStyle": 1, + "points": "180:171;156:223", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+moC5KQQceg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+moC5KQRJ/g=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+moC5KQSRfg=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+moC5KQT7kk=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+moC5KQU3fw=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+moC5KQV8KI=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+moC5KQWyNA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+moC5KQXfeg=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+moC5KQYo5E=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+moC5KQZHbs=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+moC5KQar0s=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+mq6h6SuwYA=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+mq6h6Sv0Ic=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6SuwYA=" + }, + "model": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+mq6iKSwPhE=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6Sv0Ic=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 400, + "top": 1008, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mq6iKSxaL0=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6Sv0Ic=" + }, + "font": "Arial;13;1", + "left": 1035.5, + "top": 763.5, + "width": 136, + "height": 13, + "text": "doDeleteCurrentCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mq6iKSyJ1A=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6Sv0Ic=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 400, + "top": 1008, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mq6iKSzjnI=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6Sv0Ic=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 400, + "top": 1008, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1030.5, + "top": 756.5, + "width": 146.5380859375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+mq6iKSwPhE=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+mq6iKSxaL0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+mq6iKSyJ1A=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+mq6iKSzjnI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+mq6iKS0rdE=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6SuwYA=" + }, + "model": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 200, + "top": 504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+mq6iKS1PJ4=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6SuwYA=" + }, + "model": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 200, + "top": 504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+mq6iKS2Mes=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6SuwYA=" + }, + "model": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 200, + "top": 504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+mq6iKS3ZVY=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6SuwYA=" + }, + "model": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 200, + "top": 504, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+mq6iKS4Kqg=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6SuwYA=" + }, + "model": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 200, + "top": 504, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1000, + "top": 752, + "width": 207, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+mq6h6Sv0Ic=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+mq6iKS0rdE=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+mq6iKS1PJ4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+mq6iKS2Mes=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+mq6iKS3ZVY=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+mq6iKS4Kqg=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+mrOv6VKaJI=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VGNxM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mrOv6VLPnA=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VGNxM=" + }, + "font": "Arial;13;0", + "left": 535, + "top": 107, + "width": 267.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "edgePosition": 1, + "text": "+未通过检测提示目标两次读数超限请重新测量" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mrOv6VMamw=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VGNxM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 667, + "top": 92, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mrOv6VN3Ss=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VGNxM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 669, + "top": 136, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mrOv6VO7dE=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VHNRw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 301, + "top": 125, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mrOv6VPrV4=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VHNRw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 302, + "top": 112, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mrOv6VQWxU=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VHNRw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 298, + "top": 153, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mrOv6VRiCs=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VIVq0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1036, + "top": 88, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mrOv6VSM/w=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VIVq0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1033, + "top": 75, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mrOv6VTlbY=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VIVq0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1042, + "top": 115, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+mrOv6VUz6Q=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VHNRw=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+mrOv6VV49g=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VKaJI=" + }, + "model": { + "$ref": "AAAAAAF2+mrOv6VIVq0=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "tail": { + "$ref": "AAAAAAF2+mdRV6CXVyE=" + }, + "lineStyle": 1, + "points": "276:148;1063:108", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+mrOv6VLPnA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+mrOv6VMamw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+mrOv6VN3Ss=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+mrOv6VO7dE=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+mrOv6VPrV4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+mrOv6VQWxU=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+mrOv6VRiCs=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+mrOv6VSM/w=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+mrOv6VTlbY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+mrOv6VUz6Q=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+mrOv6VV49g=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+mvXKaZ9JcA=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+mvXKaZ+a7s=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ9JcA=" + }, + "model": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+mvXKaZ/YSQ=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ+a7s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1664, + "top": 544, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mvXKaaAI84=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ+a7s=" + }, + "font": "Arial;13;1", + "left": 73, + "top": 643.5, + "width": 124, + "height": 13, + "text": "checkHalfCycleZero" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mvXKaaB8qQ=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ+a7s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1664, + "top": 544, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mvXKaaCW0M=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ+a7s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1664, + "top": 544, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 68, + "top": 636.5, + "width": 134.28076171875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+mvXKaZ/YSQ=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+mvXKaaAI84=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+mvXKaaB8qQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+mvXKaaCW0M=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+mvXKaaD/VM=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ9JcA=" + }, + "model": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -832, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+mvXKaaE660=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ9JcA=" + }, + "model": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -832, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+mvXKaaFnDM=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ9JcA=" + }, + "model": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -832, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+mvXKaaGOXs=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ9JcA=" + }, + "model": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -832, + "top": 272, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+mvXKaaHvGE=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ9JcA=" + }, + "model": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -832, + "top": 272, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 40, + "top": 632, + "width": 190, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+mvXKaZ+a7s=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+mvXKaaD/VM=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+mvXKaaE660=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+mvXKaaFnDM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+mvXKaaGOXs=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+mvXKaaHvGE=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+mvs0qc0M6s=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcw0ng=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mvs0qc1wM8=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcw0ng=" + }, + "font": "Arial;13;0", + "left": 125, + "top": 439, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "edgePosition": 1, + "text": "+满足条件" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mvs0qc202A=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcw0ng=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 169, + "top": 439, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mvs0qc3e6M=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcw0ng=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 125, + "top": 438, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mvs0qc4Drs=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcx6HM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 160, + "top": 279, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mvs0qc5vMI=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcx6HM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 173, + "top": 282, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mvs0qc6Rdg=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcx6HM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 132, + "top": 274, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mvs0qc7l5k=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcyuaY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 150, + "top": 599, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mvs0qc8asw=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcyuaY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 164, + "top": 597, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mvs0qc9HoU=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcyuaY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 123, + "top": 602, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+mvs0qc+Nck=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcx6HM=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+mvs0qc/jzw=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qc0M6s=" + }, + "model": { + "$ref": "AAAAAAF2+mvs0qcyuaY=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mvXKaZ9JcA=" + }, + "tail": { + "$ref": "AAAAAAF2+mntyKOOOdo=" + }, + "lineStyle": 1, + "points": "146:259;135:631", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+mvs0qc1wM8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+mvs0qc202A=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+mvs0qc3e6M=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+mvs0qc4Drs=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+mvs0qc5vMI=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+mvs0qc6Rdg=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+mvs0qc7l5k=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+mvs0qc8asw=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+mvs0qc9HoU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+mvs0qc+Nck=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+mvs0qc/jzw=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+mwCOqh1UGk=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+mwCO6h22P0=", + "_parent": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "model": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+mwCO6h3Ono=", + "_parent": { + "$ref": "AAAAAAF2+mwCO6h22P0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 928, + "top": -640, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mwCO6h4ZQA=", + "_parent": { + "$ref": "AAAAAAF2+mwCO6h22P0=" + }, + "font": "Arial;13;1", + "left": 1084, + "top": 99.5, + "width": 62, + "height": 13, + "text": "Idle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mwCO6h565A=", + "_parent": { + "$ref": "AAAAAAF2+mwCO6h22P0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 928, + "top": -640, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+mwCO6h6b3M=", + "_parent": { + "$ref": "AAAAAAF2+mwCO6h22P0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 928, + "top": -640, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1079, + "top": 92.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+mwCO6h3Ono=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+mwCO6h4ZQA=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+mwCO6h565A=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+mwCO6h6b3M=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+mwCO6h75qU=", + "_parent": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "model": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 464, + "top": -320, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+mwCO6h8WBM=", + "_parent": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "model": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 464, + "top": -320, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+mwCO6h9qfA=", + "_parent": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "model": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 464, + "top": -320, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+mwCO6h+cG0=", + "_parent": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "model": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 464, + "top": -320, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+mwCO6h/PzE=", + "_parent": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "model": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 464, + "top": -320, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1064, + "top": 88, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+mwCO6h22P0=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+mwCO6h75qU=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+mwCO6h8WBM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+mwCO6h9qfA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+mwCO6h+cG0=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+mwCO6h/PzE=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+mw/iqlHhw8=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+mw/ialD1P0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mw/iqlICrw=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/ialD1P0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1093, + "top": 430, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mw/iqlJZUA=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/ialD1P0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1078, + "top": 430, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mw/iqlKnVA=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/ialD1P0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1122, + "top": 431, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mw/iqlLEKc=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/iqlEWtE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1088, + "top": 718, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mw/iqlMafs=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/iqlEWtE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1075, + "top": 716, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mw/iqlNnYc=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/iqlEWtE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1115, + "top": 723, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mw/iqlOQrw=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/iqlF64M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1098, + "top": 142, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mw/iqlPlDs=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/iqlF64M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1085, + "top": 144, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+mw/iqlQdOY=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/iqlF64M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1126, + "top": 138, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+mw/iqlRtpI=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/iqlEWtE=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+mw/iqlS6xc=", + "_parent": { + "$ref": "AAAAAAF2+mw/iqlHhw8=" + }, + "model": { + "$ref": "AAAAAAF2+mw/iqlF64M=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "tail": { + "$ref": "AAAAAAF2+mq6h6SuwYA=" + }, + "lineStyle": 1, + "points": "1103:751;1114:123", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+mw/iqlICrw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+mw/iqlJZUA=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+mw/iqlKnVA=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+mw/iqlLEKc=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+mw/iqlMafs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+mw/iqlNnYc=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+mw/iqlOQrw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+mw/iqlPlDs=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+mw/iqlQdOY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+mw/iqlRtpI=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+mw/iqlS6xc=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+m3Ng67WXiU=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+m3Ng67Xic8=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67WXiU=" + }, + "model": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+m3Ng67YH00=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67Xic8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1744, + "top": 368, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+m3Ng67ZMKU=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67Xic8=" + }, + "font": "Arial;13;1", + "left": 261, + "top": 355.5, + "width": 105, + "height": 13, + "text": "isReady2CCheck" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+m3Ng67aYAg=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67Xic8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1744, + "top": 368, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+m3Ng67b7tk=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67Xic8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1744, + "top": 368, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 256, + "top": 348.5, + "width": 115.498046875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+m3Ng67YH00=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+m3Ng67ZMKU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+m3Ng67aYAg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+m3Ng67b7tk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+m3Ng67cquY=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67WXiU=" + }, + "model": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -872, + "top": 184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+m3NhK7dOGY=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67WXiU=" + }, + "model": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -872, + "top": 184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+m3NhK7ePSk=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67WXiU=" + }, + "model": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -872, + "top": 184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+m3NhK7f3Bg=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67WXiU=" + }, + "model": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -872, + "top": 184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+m3NhK7gUrI=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67WXiU=" + }, + "model": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -872, + "top": 184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 232, + "top": 344, + "width": 163, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+m3Ng67Xic8=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+m3Ng67cquY=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+m3NhK7dOGY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+m3NhK7ePSk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+m3NhK7f3Bg=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+m3NhK7gUrI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+m3lu6/DOUc=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6+/SvE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m3lu6/E2Do=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6+/SvE=" + }, + "font": "Arial;13;0", + "left": 181, + "top": 491, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "edgePosition": 1, + "text": "+通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m3lu6/FDO0=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6+/SvE=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 197, + "top": 483, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m3lu6/Gi08=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6+/SvE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 235, + "top": 506, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m3lu6/Hf44=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6/AYdA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 146, + "top": 595, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m3lu6/IqJw=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6/AYdA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 135, + "top": 586, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m3lu6/JdkM=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6/AYdA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 167, + "top": 613, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m3lu6/KoQg=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6/BCoQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 275, + "top": 387, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m3lu6/LFko=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6/BCoQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 263, + "top": 382, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m3lu6/MT0A=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6/BCoQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 301, + "top": 397, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+m3lu6/N6Ng=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6/AYdA=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+m3lu6/Ooek=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6/DOUc=" + }, + "model": { + "$ref": "AAAAAAF2+m3lu6/BCoQ=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+m3Ng67WXiU=" + }, + "tail": { + "$ref": "AAAAAAF2+mvXKaZ9JcA=" + }, + "lineStyle": 1, + "points": "145:631;302:379", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+m3lu6/E2Do=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+m3lu6/FDO0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+m3lu6/Gi08=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+m3lu6/Hf44=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+m3lu6/IqJw=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+m3lu6/JdkM=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+m3lu6/KoQg=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+m3lu6/LFko=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+m3lu6/MT0A=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+m3lu6/N6Ng=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+m3lu6/Ooek=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+m4Cd7DQ378=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DMOyM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m4Cd7DRAVE=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DMOyM=" + }, + "font": "Arial;13;0", + "left": 579, + "top": 687, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "edgePosition": 1, + "text": "+未通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m4Cd7DScfk=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DMOyM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 617, + "top": 672, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m4Cd7DTMTY=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DMOyM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 612, + "top": 716, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m4Cd7DUVcI=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DNh98=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 257, + "top": 643, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m4Cd7DVlvI=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DNh98=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 261, + "top": 630, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m4Cd7DWLMQ=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DNh98=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 249, + "top": 670, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m4Cd7DXhyw=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DOnkA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 975, + "top": 731, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m4Cd7DYDkU=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DOnkA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 974, + "top": 718, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m4Cd7DZShc=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DOnkA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 975, + "top": 759, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+m4Cd7DaWVU=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DNh98=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+m4Cd7Dbwu8=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DQ378=" + }, + "model": { + "$ref": "AAAAAAF2+m4Cd7DOnkA=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mq6h6SuwYA=" + }, + "tail": { + "$ref": "AAAAAAF2+mvXKaZ9JcA=" + }, + "lineStyle": 1, + "points": "230:661;999:756", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+m4Cd7DRAVE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+m4Cd7DScfk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+m4Cd7DTMTY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+m4Cd7DUVcI=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+m4Cd7DVlvI=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+m4Cd7DWLMQ=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+m4Cd7DXhyw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+m4Cd7DYDkU=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+m4Cd7DZShc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+m4Cd7DaWVU=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+m4Cd7Dbwu8=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+m6507J/Zuo=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ78WY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m6507KAvO0=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ78WY=" + }, + "font": "Arial;13;0", + "left": 215, + "top": 282, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "edgePosition": 1, + "text": "+不满足" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m6507KBRDQ=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ78WY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 247, + "top": 270, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m6507KCcvI=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ78WY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 221, + "top": 307, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m6507KDh+o=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ8zw4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 201, + "top": 256, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m6507KECBE=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ8zw4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 211, + "top": 246, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m6507KFH0o=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ8zw4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 182, + "top": 275, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m6507KGgnk=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ9BDM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 275, + "top": 309, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m6507KHvxk=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ9BDM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 281, + "top": 297, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m6507KIBfg=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ9BDM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 263, + "top": 334, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+m6507KJ9Bk=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ8zw4=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+m6507KKLw0=", + "_parent": { + "$ref": "AAAAAAF2+m6507J/Zuo=" + }, + "model": { + "$ref": "AAAAAAF2+m650rJ9BDM=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+m3Ng67WXiU=" + }, + "tail": { + "$ref": "AAAAAAF2+mntyKOOOdo=" + }, + "lineStyle": 1, + "points": "172:259;288:343", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+m6507KAvO0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+m6507KBRDQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+m6507KCcvI=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+m6507KDh+o=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+m6507KECBE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+m6507KFH0o=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+m6507KGgnk=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+m6507KHvxk=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+m6507KIBfg=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+m6507KJ9Bk=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+m6507KKLw0=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+m+73bQ4m2I=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+m+73bQ51AA=", + "_parent": { + "$ref": "AAAAAAF2+m+73bQ4m2I=" + }, + "model": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+m+73bQ6nXw=", + "_parent": { + "$ref": "AAAAAAF2+m+73bQ51AA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1408, + "top": -752, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+m+73bQ744s=", + "_parent": { + "$ref": "AAAAAAF2+m+73bQ51AA=" + }, + "font": "Arial;13;1", + "left": 492, + "top": 203.5, + "width": 62, + "height": 13, + "text": "check2C" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+m+73bQ8TTM=", + "_parent": { + "$ref": "AAAAAAF2+m+73bQ51AA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1408, + "top": -752, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+m+73bQ9+Mw=", + "_parent": { + "$ref": "AAAAAAF2+m+73bQ51AA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1408, + "top": -752, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 487, + "top": 196.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+m+73bQ6nXw=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+m+73bQ744s=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+m+73bQ8TTM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+m+73bQ9+Mw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+m+73bQ+qzE=", + "_parent": { + "$ref": "AAAAAAF2+m+73bQ4m2I=" + }, + "model": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -704, + "top": -376, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+m+73bQ/52s=", + "_parent": { + "$ref": "AAAAAAF2+m+73bQ4m2I=" + }, + "model": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -704, + "top": -376, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+m+73bRAXBQ=", + "_parent": { + "$ref": "AAAAAAF2+m+73bQ4m2I=" + }, + "model": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -704, + "top": -376, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+m+73bRBpqA=", + "_parent": { + "$ref": "AAAAAAF2+m+73bQ4m2I=" + }, + "model": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -704, + "top": -376, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+m+73bRCY/s=", + "_parent": { + "$ref": "AAAAAAF2+m+73bQ4m2I=" + }, + "model": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -704, + "top": -376, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 472, + "top": 192, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+m+73bQ51AA=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+m+73bQ+qzE=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+m+73bQ/52s=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+m+73bRAXBQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+m+73bRBpqA=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+m+73bRCY/s=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+m/aRbZnCCE=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZjsQw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m/aRbZoX2c=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZjsQw=" + }, + "font": "Arial;13;0", + "left": 379, + "top": 266, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "edgePosition": 1, + "text": "+满足条件" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m/aRbZpYP8=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZjsQw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 399, + "top": 254, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m/aRbZq7mM=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZjsQw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 425, + "top": 291, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m/aRbZrfg0=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZkwdI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 350, + "top": 309, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m/aRbZsE+c=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZkwdI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 344, + "top": 297, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m/aRbZtnbI=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZkwdI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 362, + "top": 334, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m/aRbZuIZ4=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZlRAA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 467, + "top": 224, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m/aRrZv/So=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZlRAA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 457, + "top": 214, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+m/aRrZw+Wc=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZlRAA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 486, + "top": 243, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+m/aRrZxzMY=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZkwdI=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+m/aRrZyYfg=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZnCCE=" + }, + "model": { + "$ref": "AAAAAAF2+m/aRbZlRAA=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+m+73bQ4m2I=" + }, + "tail": { + "$ref": "AAAAAAF2+m3Ng67WXiU=" + }, + "lineStyle": 1, + "points": "338:343;497:227", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+m/aRbZoX2c=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+m/aRbZpYP8=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+m/aRbZq7mM=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+m/aRbZrfg0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+m/aRbZsE+c=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+m/aRbZtnbI=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+m/aRbZuIZ4=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+m/aRrZv/So=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+m/aRrZw+Wc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+m/aRrZxzMY=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+m/aRrZyYfg=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+nB7EcWvyhg=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+nB7EsWwrGE=", + "_parent": { + "$ref": "AAAAAAF2+nB7EcWvyhg=" + }, + "model": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+nB7EsWxRXc=", + "_parent": { + "$ref": "AAAAAAF2+nB7EsWwrGE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1632, + "top": 896, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nB7EsWyp7A=", + "_parent": { + "$ref": "AAAAAAF2+nB7EsWwrGE=" + }, + "font": "Arial;13;1", + "left": 606.5, + "top": 627.5, + "width": 151, + "height": 13, + "text": "isSingleCycleCompleted" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nB7EsWzuj0=", + "_parent": { + "$ref": "AAAAAAF2+nB7EsWwrGE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1632, + "top": 896, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nB7EsW0vEM=", + "_parent": { + "$ref": "AAAAAAF2+nB7EsWwrGE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1632, + "top": 896, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 601.5, + "top": 620.5, + "width": 161.708984375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nB7EsWxRXc=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+nB7EsWyp7A=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+nB7EsWzuj0=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nB7EsW0vEM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+nB7EsW1O74=", + "_parent": { + "$ref": "AAAAAAF2+nB7EcWvyhg=" + }, + "model": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -816, + "top": 448, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+nB7EsW24Ak=", + "_parent": { + "$ref": "AAAAAAF2+nB7EcWvyhg=" + }, + "model": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -816, + "top": 448, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+nB7EsW3La4=", + "_parent": { + "$ref": "AAAAAAF2+nB7EcWvyhg=" + }, + "model": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -816, + "top": 448, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+nB7EsW4CYw=", + "_parent": { + "$ref": "AAAAAAF2+nB7EcWvyhg=" + }, + "model": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -816, + "top": 448, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+nB7EsW5ziA=", + "_parent": { + "$ref": "AAAAAAF2+nB7EcWvyhg=" + }, + "model": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -816, + "top": 448, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 568, + "top": 616, + "width": 228, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+nB7EsWwrGE=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+nB7EsW1O74=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+nB7EsW24Ak=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+nB7EsW3La4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+nB7EsW4CYw=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+nB7EsW5ziA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+nC6Y8gyCOM=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nC6YsguVIY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nC6Y8gzGbk=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6YsguVIY=" + }, + "font": "Arial;13;0", + "left": 423, + "top": 400, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "edgePosition": 1, + "text": "+通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nC6Y8g0Btw=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6YsguVIY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 466, + "top": 406, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nC6Y8g1YTc=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6YsguVIY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 425, + "top": 389, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nC6Y8g2LKo=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6Y8gvJw0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 517, + "top": 250, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nC6Y8g3efU=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6Y8gvJw0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": 258, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nC6Y8g4m7s=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6Y8gvJw0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 493, + "top": 235, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nC6Y8g5UNs=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6Y8gwxpA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 389, + "top": 551, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nC6Y8g6C1c=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6Y8gwxpA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 402, + "top": 554, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nC6Y8g7AZQ=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6Y8gwxpA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 362, + "top": 544, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+nC6Y8g8U9U=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6Y8gvJw0=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+nC6ZMg9Wfs=", + "_parent": { + "$ref": "AAAAAAF2+nC6Y8gyCOM=" + }, + "model": { + "$ref": "AAAAAAF2+nC6Y8gwxpA=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+nIha+T0PKc=" + }, + "tail": { + "$ref": "AAAAAAF2+m+73bQ4m2I=" + }, + "lineStyle": 1, + "points": "514:227;365:575", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+nC6Y8gzGbk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nC6Y8g0Btw=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nC6Y8g1YTc=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+nC6Y8g2LKo=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+nC6Y8g3efU=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+nC6Y8g4m7s=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+nC6Y8g5UNs=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+nC6Y8g6C1c=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+nC6Y8g7AZQ=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+nC6Y8g8U9U=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+nC6ZMg9Wfs=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+nIha+T0PKc=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+nIha+T1GkI=", + "_parent": { + "$ref": "AAAAAAF2+nIha+T0PKc=" + }, + "model": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+nIha+T2NuQ=", + "_parent": { + "$ref": "AAAAAAF2+nIha+T1GkI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1504, + "top": -304, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nIha+T3MZE=", + "_parent": { + "$ref": "AAAAAAF2+nIha+T1GkI=" + }, + "font": "Arial;13;1", + "left": 291, + "top": 587.5, + "width": 133, + "height": 13, + "text": "doRecordClean" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nIha+T42aU=", + "_parent": { + "$ref": "AAAAAAF2+nIha+T1GkI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1504, + "top": -304, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nIha+T5gIo=", + "_parent": { + "$ref": "AAAAAAF2+nIha+T1GkI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1504, + "top": -304, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 286, + "top": 580.5, + "width": 143, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nIha+T2NuQ=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+nIha+T3MZE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+nIha+T42aU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nIha+T5gIo=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+nIha+T6I/s=", + "_parent": { + "$ref": "AAAAAAF2+nIha+T0PKc=" + }, + "model": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -752, + "top": -152, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+nIha+T7f88=", + "_parent": { + "$ref": "AAAAAAF2+nIha+T0PKc=" + }, + "model": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -752, + "top": -152, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+nIha+T8JnQ=", + "_parent": { + "$ref": "AAAAAAF2+nIha+T0PKc=" + }, + "model": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -752, + "top": -152, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+nIha+T97Co=", + "_parent": { + "$ref": "AAAAAAF2+nIha+T0PKc=" + }, + "model": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -752, + "top": -152, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+nIha+T+yMo=", + "_parent": { + "$ref": "AAAAAAF2+nIha+T0PKc=" + }, + "model": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -752, + "top": -152, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 256, + "top": 576, + "width": 203, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+nIha+T1GkI=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+nIha+T6I/s=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+nIha+T7f88=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+nIha+T8JnQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+nIha+T97Co=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+nIha+T+yMo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+nJuA+o1SCQ=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+oxvHQ=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nJuA+o2CrU=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+oxvHQ=" + }, + "font": "Arial;13;0", + "left": 313, + "top": 468, + "width": 72.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "edgePosition": 1, + "text": "+不满足条件" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nJuA+o3+MU=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+oxvHQ=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 364, + "top": 465, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nJuA+o4dNs=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+oxvHQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 320, + "top": 473, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nJuBOo5VPw=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+oyVzg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 335, + "top": 395, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nJuBOo6yNA=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+oyVzg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 349, + "top": 395, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nJuBOo7uM0=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+oyVzg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 307, + "top": 396, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nJuBOo8SD0=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+ozWP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 363, + "top": 540, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nJuBOo9a+E=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+ozWP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 376, + "top": 535, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nJuBOo+Ck4=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+ozWP8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 337, + "top": 550, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+nJuBOo/2Pk=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+oyVzg=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+nJuBOpAePc=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+o1SCQ=" + }, + "model": { + "$ref": "AAAAAAF2+nJuA+ozWP8=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+nIha+T0PKc=" + }, + "tail": { + "$ref": "AAAAAAF2+m3Ng67WXiU=" + }, + "lineStyle": 1, + "points": "316:379;354:575", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+nJuA+o2CrU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nJuA+o3+MU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nJuA+o4dNs=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+nJuBOo5VPw=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+nJuBOo6yNA=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+nJuBOo7uM0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+nJuBOo8SD0=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+nJuBOo9a+E=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+nJuBOo+Ck4=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+nJuBOo/2Pk=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+nJuBOpAePc=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+nQJoxCDdok=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohB/pjc=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nQJoxCEJ/4=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohB/pjc=" + }, + "font": "Arial;13;0", + "left": 629, + "top": 524, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "edgePosition": 1, + "text": "+未通过" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nQJoxCFIAk=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohB/pjc=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 637, + "top": 526, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nQJoxCGzfs=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohB/pjc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 681, + "top": 521, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nQJoxCHSY0=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohCAKVI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 660, + "top": 585, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nQJoxCIs3Y=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohCAKVI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 647, + "top": 584, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nQJoxCJhbQ=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohCAKVI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 688, + "top": 585, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nQJoxCKIrE=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohCBbxs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 644, + "top": 464, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nQJoxCLFVw=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohCBbxs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 631, + "top": 468, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nQJoxCMLbI=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohCBbxs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 671, + "top": 456, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+nQJoxCNff4=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohCAKVI=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+nQJoxCO0rE=", + "_parent": { + "$ref": "AAAAAAF2+nQJoxCDdok=" + }, + "model": { + "$ref": "AAAAAAF2+nQJohCBbxs=" + }, + "visible": false, + "font": "Arial;13;0", + "top": -184, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+n8X9HOVNKs=" + }, + "tail": { + "$ref": "AAAAAAF2+nB7EcWvyhg=" + }, + "lineStyle": 1, + "points": "679:615;656:443", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+nQJoxCEJ/4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nQJoxCFIAk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nQJoxCGzfs=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+nQJoxCHSY0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+nQJoxCIs3Y=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+nQJoxCJhbQ=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+nQJoxCKIrE=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+nQJoxCLFVw=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+nQJoxCMLbI=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+nQJoxCNff4=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+nQJoxCO0rE=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+nRKkx5Vaw4=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+nRKkx5Wffo=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5Vaw4=" + }, + "model": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+nRKkx5X/zo=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5Wffo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1904, + "top": 720, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nRKkx5Y40M=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5Wffo=" + }, + "font": "Arial;13;1", + "left": 894, + "top": 531.5, + "width": 110, + "height": 13, + "text": "checkSingleCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nRKlB5ZYRU=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5Wffo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1904, + "top": 720, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nRKlB5aPXo=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5Wffo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1904, + "top": 720, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 889, + "top": 524.5, + "width": 120.55712890625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nRKkx5X/zo=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+nRKkx5Y40M=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+nRKlB5ZYRU=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nRKlB5aPXo=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+nRKlB5bsGs=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5Vaw4=" + }, + "model": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -952, + "top": 360, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+nRKlB5calY=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5Vaw4=" + }, + "model": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -952, + "top": 360, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+nRKlB5doOk=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5Vaw4=" + }, + "model": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -952, + "top": 360, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+nRKlB5eoWY=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5Vaw4=" + }, + "model": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -952, + "top": 360, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+nRKlB5fYaI=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5Vaw4=" + }, + "model": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -952, + "top": 360, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 864, + "top": 520, + "width": 170, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+nRKkx5Wffo=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+nRKlB5bsGs=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+nRKlB5calY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+nRKlB5doOk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+nRKlB5eoWY=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+nRKlB5fYaI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+nS1vB//BAk=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/7hWk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nS1vCAA1/w=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/7hWk=" + }, + "font": "Arial;13;0", + "left": 779, + "top": 564, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "edgePosition": 1, + "text": "+满足条件" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nS1vSABc/8=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/7hWk=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 803, + "top": 550, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nS1vSACp60=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/7hWk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 819, + "top": 593, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nS1vSAD2nc=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/8CFI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 750, + "top": 586, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nS1vSAE3Cg=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/8CFI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 748, + "top": 572, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nS1vSAFUjQ=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/8CFI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 755, + "top": 613, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nS1vSAGNTg=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/9vRE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 868, + "top": 543, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nS1vSAHtw0=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/9vRE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 861, + "top": 531, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+nS1vSAIfWc=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/9vRE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 881, + "top": 568, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+nS1vSAJTTM=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/8CFI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -8, + "top": 8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+nS1vSAK/NU=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB//BAk=" + }, + "model": { + "$ref": "AAAAAAF2+nS1vB/9vRE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -8, + "top": 8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+nRKkx5Vaw4=" + }, + "tail": { + "$ref": "AAAAAAF2+nB7EcWvyhg=" + }, + "lineStyle": 1, + "points": "731:615;898:555", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF2+nS1vCAA1/w=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nS1vSABc/8=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nS1vSACp60=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+nS1vSAD2nc=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+nS1vSAE3Cg=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+nS1vSAFUjQ=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+nS1vSAGNTg=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+nS1vSAHtw0=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+nS1vSAIfWc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+nS1vSAJTTM=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+nS1vSAK/NU=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+nWEKyMwAMc=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nWEKyMuLhQ=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+nWEKyMxf1Q=", + "_parent": { + "$ref": "AAAAAAF2+nWEKyMwAMc=" + }, + "model": { + "$ref": "AAAAAAF2+nWEKyMuLhQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+nWEKyMyBP8=", + "_parent": { + "$ref": "AAAAAAF2+nWEKyMxf1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 800, + "top": -992, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nWEKyMzemE=", + "_parent": { + "$ref": "AAAAAAF2+nWEKyMxf1Q=" + }, + "font": "Arial;13;1", + "left": 2066, + "top": 11.5, + "width": 129, + "height": 13, + "text": "isAllCycleCompleted" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nWEKyM01LQ=", + "_parent": { + "$ref": "AAAAAAF2+nWEKyMxf1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 800, + "top": -992, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nWEKyM1r1Q=", + "_parent": { + "$ref": "AAAAAAF2+nWEKyMxf1Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 800, + "top": -992, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 2061, + "top": 4.5, + "width": 139.314453125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nWEKyMyBP8=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+nWEKyMzemE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+nWEKyM01LQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nWEKyM1r1Q=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+nWEKyM2sSI=", + "_parent": { + "$ref": "AAAAAAF2+nWEKyMwAMc=" + }, + "model": { + "$ref": "AAAAAAF2+nWEKyMuLhQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 400, + "top": -496, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+nWEKyM3PmE=", + "_parent": { + "$ref": "AAAAAAF2+nWEKyMwAMc=" + }, + "model": { + "$ref": "AAAAAAF2+nWEKyMuLhQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 400, + "top": -496, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+nWEKyM4Ihc=", + "_parent": { + "$ref": "AAAAAAF2+nWEKyMwAMc=" + }, + "model": { + "$ref": "AAAAAAF2+nWEKyMuLhQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 400, + "top": -496, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+nWELCM5C+g=", + "_parent": { + "$ref": "AAAAAAF2+nWEKyMwAMc=" + }, + "model": { + "$ref": "AAAAAAF2+nWEKyMuLhQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 400, + "top": -496, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+nWELCM6KvA=", + "_parent": { + "$ref": "AAAAAAF2+nWEKyMwAMc=" + }, + "model": { + "$ref": "AAAAAAF2+nWEKyMuLhQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 400, + "top": -496, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 2032, + "width": 197, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+nWEKyMxf1Q=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+nWEKyM2sSI=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+nWEKyM3PmE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+nWEKyM4Ihc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+nWELCM5C+g=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+nWELCM6KvA=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+nfCMZ3BUsM=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+nfCMp3C1RI=", + "_parent": { + "$ref": "AAAAAAF2+nfCMZ3BUsM=" + }, + "model": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+nfCMp3DNmU=", + "_parent": { + "$ref": "AAAAAAF2+nfCMp3C1RI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1456, + "top": -2448, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nfCMp3ECXU=", + "_parent": { + "$ref": "AAAAAAF2+nfCMp3C1RI=" + }, + "font": "Arial;13;1", + "left": 882, + "top": 403.5, + "width": 129, + "height": 13, + "text": "isAllCycleCompleted" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nfCMp3FeYo=", + "_parent": { + "$ref": "AAAAAAF2+nfCMp3C1RI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1456, + "top": -2448, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nfCMp3Gpdk=", + "_parent": { + "$ref": "AAAAAAF2+nfCMp3C1RI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1456, + "top": -2448, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 877, + "top": 396.5, + "width": 139.314453125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nfCMp3DNmU=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+nfCMp3ECXU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+nfCMp3FeYo=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nfCMp3Gpdk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+nfCMp3Hk/w=", + "_parent": { + "$ref": "AAAAAAF2+nfCMZ3BUsM=" + }, + "model": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 728, + "top": -1224, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+nfCMp3Ipoc=", + "_parent": { + "$ref": "AAAAAAF2+nfCMZ3BUsM=" + }, + "model": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 728, + "top": -1224, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+nfCMp3J3MA=", + "_parent": { + "$ref": "AAAAAAF2+nfCMZ3BUsM=" + }, + "model": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 728, + "top": -1224, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+nfCMp3KD9I=", + "_parent": { + "$ref": "AAAAAAF2+nfCMZ3BUsM=" + }, + "model": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 728, + "top": -1224, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+nfCMp3LjAc=", + "_parent": { + "$ref": "AAAAAAF2+nfCMZ3BUsM=" + }, + "model": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 728, + "top": -1224, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 848, + "top": 392, + "width": 197, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+nfCMp3C1RI=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+nfCMp3Hk/w=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+nfCMp3Ipoc=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+nfCMp3J3MA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+nfCMp3KD9I=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+nfCMp3LjAc=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+nmf8//Gfbw=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+nmf8//HI2g=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//Gfbw=" + }, + "model": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+nmf9P/I6yI=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//HI2g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -960, + "top": -1456, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nmf9P/JtnQ=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//HI2g=" + }, + "font": "Arial;13;1", + "left": 541.5, + "top": 315.5, + "width": 105, + "height": 13, + "text": "doDeleteAllCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nmf9P/KQDY=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//HI2g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -960, + "top": -1456, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nmf9P/LlNA=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//HI2g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -960, + "top": -1456, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 536.5, + "top": 308.5, + "width": 116.20263671875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nmf9P/I6yI=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+nmf9P/JtnQ=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+nmf9P/KQDY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nmf9P/LlNA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+nmf9P/MVYQ=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//Gfbw=" + }, + "model": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": -728, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+nmf9P/N0tE=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//Gfbw=" + }, + "model": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": -728, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+nmf9P/OUoc=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//Gfbw=" + }, + "model": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": -728, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+nmf9P/PSrQ=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//Gfbw=" + }, + "model": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": -728, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+nmf9P/QKKU=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//Gfbw=" + }, + "model": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": -728, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 512, + "top": 304, + "width": 164, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+nmf8//HI2g=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+nmf9P/MVYQ=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+nmf9P/N0tE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+nmf9P/OUoc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+nmf9P/PSrQ=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+nmf9P/QKKU=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+nq2QxzFIJA=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+nq2QxzGCOI=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzFIJA=" + }, + "model": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+nq2QxzHPGg=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzGCOI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 816, + "top": -1376, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nq2QxzIGSU=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzGCOI=" + }, + "font": "Arial;13;1", + "left": 473.5, + "top": 899.5, + "width": 87, + "height": 13, + "text": "checkAllCycle" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nq2QxzJNkI=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzGCOI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 816, + "top": -1376, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nq2QxzK1gc=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzGCOI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 816, + "top": -1376, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 468.5, + "top": 892.5, + "width": 98.16259765625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nq2QxzHPGg=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+nq2QxzIGSU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+nq2QxzJNkI=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nq2QxzK1gc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+nq2QxzLAgw=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzFIJA=" + }, + "model": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 408, + "top": -688, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+nq2QxzMb90=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzFIJA=" + }, + "model": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 408, + "top": -688, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+nq2QxzN8NY=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzFIJA=" + }, + "model": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 408, + "top": -688, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+nq2QxzOrKA=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzFIJA=" + }, + "model": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 408, + "top": -688, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+nq2QxzPhCY=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzFIJA=" + }, + "model": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 408, + "top": -688, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 448, + "top": 888, + "width": 138, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+nq2QxzGCOI=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+nq2QxzLAgw=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+nq2QxzMb90=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+nq2QxzN8NY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+nq2QxzOrKA=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+nq2QxzPhCY=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+nsueip2TzQ=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+nsueSp07D8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+nsueip3gdc=", + "_parent": { + "$ref": "AAAAAAF2+nsueip2TzQ=" + }, + "model": { + "$ref": "AAAAAAF2+nsueSp07D8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+nsueip4ids=", + "_parent": { + "$ref": "AAAAAAF2+nsueip3gdc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1360, + "top": -1696, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nsueip54uU=", + "_parent": { + "$ref": "AAAAAAF2+nsueip3gdc=" + }, + "font": "Arial;13;1", + "left": 772, + "top": 915.5, + "width": 62, + "height": 13, + "text": "Finish" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nsueip60ls=", + "_parent": { + "$ref": "AAAAAAF2+nsueip3gdc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1360, + "top": -1696, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+nsueip7mbo=", + "_parent": { + "$ref": "AAAAAAF2+nsueip3gdc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1360, + "top": -1696, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 767, + "top": 908.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+nsueip4ids=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+nsueip54uU=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+nsueip60ls=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+nsueip7mbo=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+nsueip8654=", + "_parent": { + "$ref": "AAAAAAF2+nsueip2TzQ=" + }, + "model": { + "$ref": "AAAAAAF2+nsueSp07D8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 680, + "top": -848, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+nsueip9KyQ=", + "_parent": { + "$ref": "AAAAAAF2+nsueip2TzQ=" + }, + "model": { + "$ref": "AAAAAAF2+nsueSp07D8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 680, + "top": -848, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+nsueip+40A=", + "_parent": { + "$ref": "AAAAAAF2+nsueip2TzQ=" + }, + "model": { + "$ref": "AAAAAAF2+nsueSp07D8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 680, + "top": -848, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+nsueip/CZI=", + "_parent": { + "$ref": "AAAAAAF2+nsueip2TzQ=" + }, + "model": { + "$ref": "AAAAAAF2+nsueSp07D8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 680, + "top": -848, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+nsueyqAa5A=", + "_parent": { + "$ref": "AAAAAAF2+nsueip2TzQ=" + }, + "model": { + "$ref": "AAAAAAF2+nsueSp07D8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 680, + "top": -848, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 752, + "top": 904, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+nsueip3gdc=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+nsueip8654=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+nsueip9KyQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+nsueip+40A=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+nsueip/CZI=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+nsueyqAa5A=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+n3z7GQDM/o=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+n3z62QBjMI=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+n3z7GQEn4U=", + "_parent": { + "$ref": "AAAAAAF2+n3z7GQDM/o=" + }, + "model": { + "$ref": "AAAAAAF2+n3z62QBjMI=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+n3z7GQFG64=", + "_parent": { + "$ref": "AAAAAAF2+n3z7GQEn4U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 1072, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+n3z7GQGJmk=", + "_parent": { + "$ref": "AAAAAAF2+n3z7GQEn4U=" + }, + "font": "Arial;13;1", + "left": 913.5, + "top": 907.5, + "width": 87, + "height": 13, + "text": "doRecordSkip" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+n3z7GQHHNY=", + "_parent": { + "$ref": "AAAAAAF2+n3z7GQEn4U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 1072, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+n3z7GQIaUk=", + "_parent": { + "$ref": "AAAAAAF2+n3z7GQEn4U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 1072, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 908.5, + "top": 900.5, + "width": 98.12451171875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+n3z7GQFG64=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+n3z7GQGJmk=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+n3z7GQHHNY=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+n3z7GQIaUk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+n3z7GQJ098=", + "_parent": { + "$ref": "AAAAAAF2+n3z7GQDM/o=" + }, + "model": { + "$ref": "AAAAAAF2+n3z62QBjMI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 56, + "top": 536, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+n3z7GQKV2I=", + "_parent": { + "$ref": "AAAAAAF2+n3z7GQDM/o=" + }, + "model": { + "$ref": "AAAAAAF2+n3z62QBjMI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 56, + "top": 536, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+n3z7GQLZiI=", + "_parent": { + "$ref": "AAAAAAF2+n3z7GQDM/o=" + }, + "model": { + "$ref": "AAAAAAF2+n3z62QBjMI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 56, + "top": 536, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+n3z7GQMex8=", + "_parent": { + "$ref": "AAAAAAF2+n3z7GQDM/o=" + }, + "model": { + "$ref": "AAAAAAF2+n3z62QBjMI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 56, + "top": 536, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+n3z7WQNVSc=", + "_parent": { + "$ref": "AAAAAAF2+n3z7GQDM/o=" + }, + "model": { + "$ref": "AAAAAAF2+n3z62QBjMI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 56, + "top": 536, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 888, + "top": 896, + "width": 138, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+n3z7GQEn4U=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+n3z7GQJ098=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+n3z7GQKV2I=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+n3z7GQLZiI=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+n3z7GQMex8=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+n3z7WQNVSc=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2+n8X9HOVNKs=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2+n8X9HOWLww=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOVNKs=" + }, + "model": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2+n8X9XOXkdk=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOWLww=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -976, + "top": -320, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+n8X9XOY3/k=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOWLww=" + }, + "font": "Arial;13;1", + "left": 587.5, + "top": 419.5, + "width": 135, + "height": 13, + "text": "doMove2NextValidate" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+n8X9XOZd4c=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOWLww=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -976, + "top": -320, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2+n8X9XOalho=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOWLww=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -976, + "top": -320, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 582.5, + "top": 412.5, + "width": 145, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2+n8X9XOXkdk=" + }, + "nameLabel": { + "$ref": "AAAAAAF2+n8X9XOY3/k=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2+n8X9XOZd4c=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+n8X9XOalho=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2+n8X9XObuaA=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOVNKs=" + }, + "model": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -488, + "top": -160, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2+n8X9XOc/uM=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOVNKs=" + }, + "model": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -488, + "top": -160, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2+n8X9XOdBOU=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOVNKs=" + }, + "model": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -488, + "top": -160, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2+n8X9XOeXy8=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOVNKs=" + }, + "model": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -488, + "top": -160, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2+n8X9XOfF+Y=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOVNKs=" + }, + "model": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -488, + "top": -160, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 552, + "top": 408, + "width": 206, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2+n8X9HOWLww=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2+n8X9XObuaA=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2+n8X9XOc/uM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2+n8X9XOdBOU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2+n8X9XOeXy8=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2+n8X9XOfF+Y=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF2+oUnoB1S/NM=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1ORxs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3GYHfzyUBIH8=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1ORxs=" + }, + "font": "Arial;13;0", + "left": 826, + "top": 246, + "width": 98.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "edgePosition": 1, + "text": "+计算下一个目标" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+oUnoB1U2Yg=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1ORxs=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 866, + "top": 234, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+oUnoB1V4II=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1ORxs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 892, + "top": 271, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+oUnoR1Ww1E=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1PoOw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 692, + "top": 373, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+oUnoR1XLyA=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1PoOw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 687, + "top": 361, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+oUnoR1Y5p0=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1PoOw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "top": 398, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+oUnoR1ZY1E=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1Q1uk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1058, + "top": 119, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+oUnoR1aRTo=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1Q1uk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1048, + "top": 109, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF2+oUnoR1bUzg=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1Q1uk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1077, + "top": 139, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+oUnoR1cIHg=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1PoOw=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF2+oUnoR1d4qE=", + "_parent": { + "$ref": "AAAAAAF2+oUnoB1S/NM=" + }, + "model": { + "$ref": "AAAAAAF2+oUnnx1Q1uk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "tail": { + "$ref": "AAAAAAF2+n8X9HOVNKs=" + }, + "lineStyle": 1, + "points": "680:407;1088:123", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF3GYHfzyUBIH8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF2+oUnoB1U2Yg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2+oUnoB1V4II=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF2+oUnoR1Ww1E=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF2+oUnoR1XLyA=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF2+oUnoR1Y5p0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF2+oUnoR1ZY1E=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF2+oUnoR1aRTo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF2+oUnoR1bUzg=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF2+oUnoR1cIHg=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF2+oUnoR1d4qE=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF2/55prhrf+xg=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF2/55prhrgemE=", + "_parent": { + "$ref": "AAAAAAF2/55prhrf+xg=" + }, + "model": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF2/55prhrh4Oo=", + "_parent": { + "$ref": "AAAAAAF2/55prhrgemE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 48, + "top": 448, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2/55prhrinco=", + "_parent": { + "$ref": "AAAAAAF2/55prhrgemE=" + }, + "font": "Arial;13;1", + "left": 619, + "top": 899.5, + "width": 96, + "height": 13, + "text": "doRecordDirty" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2/55prhrjBVk=", + "_parent": { + "$ref": "AAAAAAF2/55prhrgemE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 48, + "top": 448, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF2/55prhrkkxo=", + "_parent": { + "$ref": "AAAAAAF2/55prhrgemE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 48, + "top": 448, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 614, + "top": 892.5, + "width": 106, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF2/55prhrh4Oo=" + }, + "nameLabel": { + "$ref": "AAAAAAF2/55prhrinco=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF2/55prhrjBVk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF2/55prhrkkxo=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF2/55prhrl5zY=", + "_parent": { + "$ref": "AAAAAAF2/55prhrf+xg=" + }, + "model": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 24, + "top": 224, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF2/55prhrmK5A=", + "_parent": { + "$ref": "AAAAAAF2/55prhrf+xg=" + }, + "model": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 24, + "top": 224, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF2/55prhrnGxY=", + "_parent": { + "$ref": "AAAAAAF2/55prhrf+xg=" + }, + "model": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 24, + "top": 224, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF2/55prhroX/Q=", + "_parent": { + "$ref": "AAAAAAF2/55prhrf+xg=" + }, + "model": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 24, + "top": 224, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF2/55prhrpOzg=", + "_parent": { + "$ref": "AAAAAAF2/55prhrf+xg=" + }, + "model": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 24, + "top": 224, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 592, + "top": 888, + "width": 150, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF2/55prhrgemE=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF2/55prhrl5zY=" + }, + "operationCompartment": { + "$ref": "AAAAAAF2/55prhrmK5A=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF2/55prhrnGxY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF2/55prhroX/Q=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF2/55prhrpOzg=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF3AAi3NvRv3KY=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRr6EY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAi3NvRwDN8=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRr6EY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 847, + "top": 193, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAi3NvRxRCk=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRr6EY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 841, + "top": 179, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAi3NvRypxI=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRr6EY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 858, + "top": 220, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAi3NvRziZA=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRsLF0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 654, + "top": 273, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAi3NvR0i3M=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRsLF0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 651, + "top": 260, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAi3NvR1v00=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRsLF0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 660, + "top": 300, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAi3NvR27EA=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRtPso=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1041, + "top": 113, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAi3NvR3NBA=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRtPso=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1034, + "top": 101, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAi3NvR46nA=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRtPso=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1055, + "top": 136, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3AAi3NvR5srI=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRsLF0=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3AAi3NvR6YUo=", + "_parent": { + "$ref": "AAAAAAF3AAi3NvRv3KY=" + }, + "model": { + "$ref": "AAAAAAF3AAi3NfRtPso=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "tail": { + "$ref": "AAAAAAF2+nmf8//Gfbw=" + }, + "lineStyle": 1, + "points": "636:303;1071:123", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF3AAi3NvRwDN8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF3AAi3NvRxRCk=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3AAi3NvRypxI=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF3AAi3NvRziZA=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF3AAi3NvR0i3M=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF3AAi3NvR1v00=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF3AAi3NvR27EA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF3AAi3NvR3NBA=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF3AAi3NvR46nA=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF3AAi3NvR5srI=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF3AAi3NvR6YUo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF3AAkuEf3u4rc=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3qL3g=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAkuEf3vFUU=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3qL3g=" + }, + "font": "Arial;13;0", + "left": 786, + "top": 136, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "edgePosition": 1, + "text": "+重新测量" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAkuEf3wr8I=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3qL3g=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 812, + "top": 121, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAkuEf3x3Io=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3qL3g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 820, + "top": 165, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAkuEf3yj1w=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3rpYI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 596, + "top": 174, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAkuEf3zA9Y=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3rpYI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 596, + "top": 161, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAkuEf30kh0=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3rpYI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 597, + "top": 202, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAkuEf31ZFk=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3seOw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1034, + "top": 97, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAkuEf32s54=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3seOw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1030, + "top": 85, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAkuEf33mtU=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3seOw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1043, + "top": 124, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3AAkuEf341iM=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3rpYI=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3AAkuEf35gXc=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3u4rc=" + }, + "model": { + "$ref": "AAAAAAF3AAkuEf3seOw=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "tail": { + "$ref": "AAAAAAF2+m+73bQ4m2I=" + }, + "lineStyle": 1, + "points": "574:200;1063:114", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF3AAkuEf3vFUU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF3AAkuEf3wr8I=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3AAkuEf3x3Io=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF3AAkuEf3yj1w=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF3AAkuEf3zA9Y=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF3AAkuEf30kh0=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF3AAkuEf31ZFk=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF3AAkuEf32s54=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF3AAkuEf33mtU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF3AAkuEf341iM=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF3AAkuEf35gXc=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF3AAllGAV4vW0=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV08Nw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAllGAV5JwE=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV08Nw=" + }, + "font": "Arial;13;0", + "left": 540, + "top": 250, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "edgePosition": 1, + "text": "+清空测量" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAllGAV6J1c=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV08Nw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 582, + "top": 242, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAllGAV7E+E=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV08Nw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 544, + "top": 267, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAllGAV8Fz4=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV1sLI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 559, + "top": 234, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAllGAV9EBE=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV1sLI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 572, + "top": 229, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAllGAV+La8=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV1sLI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 534, + "top": 245, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAllGAV/WHE=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV2oyY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 580, + "top": 267, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAllGAWA3ZU=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV2oyY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 590, + "top": 257, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3AAllGAWB0W0=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV2oyY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 559, + "top": 285, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3AAllGAWCqYI=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV1sLI=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3AAllGAWDVu4=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV4vW0=" + }, + "model": { + "$ref": "AAAAAAF3AAllGAV2oyY=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+nmf8//Gfbw=" + }, + "tail": { + "$ref": "AAAAAAF2+m+73bQ4m2I=" + }, + "lineStyle": 1, + "points": "533:227;582:303", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF3AAllGAV5JwE=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF3AAllGAV6J1c=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3AAllGAV7E+E=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF3AAllGAV8Fz4=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF3AAllGAV9EBE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF3AAllGAV+La8=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF3AAllGAV/WHE=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF3AAllGAWA3ZU=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF3AAllGAWB0W0=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF3AAllGAWCqYI=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF3AAllGAWDVu4=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF3ABeWIk8op44=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8kkqs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3ABeWIk8pzMQ=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8kkqs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 514, + "top": 591, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3ABeWIk8qvK8=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8kkqs=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 516, + "top": 576, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3ABeWIk8rXNY=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8kkqs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 511, + "top": 620, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3ABeWIk8sd3M=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8l/nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 486, + "top": 588, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3ABeWIk8tucs=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8l/nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 490, + "top": 575, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3ABeWIk8uDSU=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8l/nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 479, + "top": 614, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3ABeWIk8v4Ak=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8mwTw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 542, + "top": 595, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3ABeWIk8op44=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3ABeWIk8wWtM=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8mwTw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 542, + "top": 581, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3ABeWIk8op44=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3ABeWIk8xBTc=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8mwTw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 544, + "top": 622, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3ABeWIk8op44=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3ABeWIk8yQcs=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8l/nk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3ABeWIk8z5Rc=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8op44=" + }, + "model": { + "$ref": "AAAAAAF3ABeWIk8mwTw=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+nB7EcWvyhg=" + }, + "tail": { + "$ref": "AAAAAAF2+nIha+T0PKc=" + }, + "lineStyle": 1, + "points": "459:606;567:619", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF3ABeWIk8pzMQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF3ABeWIk8qvK8=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3ABeWIk8rXNY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF3ABeWIk8sd3M=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF3ABeWIk8tucs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF3ABeWIk8uDSU=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF3ABeWIk8v4Ak=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF3ABeWIk8wWtM=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF3ABeWIk8xBTc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF3ABeWIk8yQcs=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF3ABeWIk8z5Rc=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF3FYXf89UtfGE=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3FYXf8tUp5SY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYXf89UuSck=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf8tUp5SY=" + }, + "font": "Arial;13;0", + "left": 903, + "top": 467, + "width": 59.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "edgePosition": 1, + "text": "+通过检测" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYXf89Uv0GE=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf8tUp5SY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 917, + "top": 467, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYXf89UwhBk=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf8tUp5SY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 961, + "top": 466, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYXf89Ux8/0=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf8tUqXjA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 932, + "top": 487, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYXf89Uyiek=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf8tUqXjA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 919, + "top": 485, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYXf89Uz1EE=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf8tUqXjA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 960, + "top": 491, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYXf89U0nxQ=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf89Uremo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 931, + "top": 447, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYXf89U16n8=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf89Uremo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 918, + "top": 449, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYXf89U2Rmk=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf89Uremo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 958, + "top": 442, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3FYXf89U3eCA=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf8tUqXjA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3FYXf89U4/vg=", + "_parent": { + "$ref": "AAAAAAF3FYXf89UtfGE=" + }, + "model": { + "$ref": "AAAAAAF3FYXf89Uremo=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+nfCMZ3BUsM=" + }, + "tail": { + "$ref": "AAAAAAF2+nRKkx5Vaw4=" + }, + "lineStyle": 1, + "points": "948:519;946:427", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF3FYXf89UuSck=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF3FYXf89Uv0GE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3FYXf89UwhBk=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF3FYXf89Ux8/0=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF3FYXf89Uyiek=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF3FYXf89Uz1EE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF3FYXf89U0nxQ=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF3FYXf89U16n8=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF3FYXf89U2Rmk=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF3FYXf89U3eCA=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF3FYXf89U4/vg=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF3FYY3Odi5Qvo=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3FYY3ONi1k54=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYY3Odi62oY=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3ONi1k54=" + }, + "font": "Arial;13;0", + "left": 993, + "top": 243, + "width": 46.864990234375, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "edgePosition": 1, + "text": "+未完成" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYY3Odi7tcE=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3ONi1k54=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1003, + "top": 236, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYY3Odi8lBY=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3ONi1k54=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1043, + "top": 258, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYY3Odi96UE=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3Odi2Kgc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 955, + "top": 355, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYY3Odi+RAs=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3Odi2Kgc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 944, + "top": 346, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYY3Odi/zVk=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3Odi2Kgc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 977, + "top": 372, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYY3OdjAr2E=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3Odi3/4g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1078, + "top": 132, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYY3OdjB8MY=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3Odi3/4g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1065, + "top": 128, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYY3OdjC1b8=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3Odi3/4g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1104, + "top": 141, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3FYY3OdjDoGI=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3Odi2Kgc=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3FYY3OdjEpKI=", + "_parent": { + "$ref": "AAAAAAF3FYY3Odi5Qvo=" + }, + "model": { + "$ref": "AAAAAAF3FYY3Odi3/4g=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "tail": { + "$ref": "AAAAAAF2+nfCMZ3BUsM=" + }, + "lineStyle": 1, + "points": "956:391;1104:123", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF3FYY3Odi62oY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF3FYY3Odi7tcE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3FYY3Odi8lBY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF3FYY3Odi96UE=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF3FYY3Odi+RAs=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF3FYY3Odi/zVk=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF3FYY3OdjAr2E=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF3FYY3OdjB8MY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF3FYY3OdjC1b8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF3FYY3OdjDoGI=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF3FYY3OdjEpKI=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF3FYZbFNuAuzw=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3FYZbFNt+k4c=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF3FYZbFNuBlYE=", + "_parent": { + "$ref": "AAAAAAF3FYZbFNuAuzw=" + }, + "model": { + "$ref": "AAAAAAF3FYZbFNt+k4c=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF3FYZbFduC04Q=", + "_parent": { + "$ref": "AAAAAAF3FYZbFNuBlYE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 16, + "top": 464, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF3FYZbFduDcAk=", + "_parent": { + "$ref": "AAAAAAF3FYZbFNuBlYE=" + }, + "font": "Arial;13;1", + "left": 852, + "top": 843.5, + "width": 62, + "height": 13, + "text": "需要补测" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF3FYZbFduER9s=", + "_parent": { + "$ref": "AAAAAAF3FYZbFNuBlYE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 16, + "top": 464, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF3FYZbFduFXxc=", + "_parent": { + "$ref": "AAAAAAF3FYZbFNuBlYE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 16, + "top": 464, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 847, + "top": 836.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF3FYZbFduC04Q=" + }, + "nameLabel": { + "$ref": "AAAAAAF3FYZbFduDcAk=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF3FYZbFduER9s=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3FYZbFduFXxc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF3FYZbFduGvug=", + "_parent": { + "$ref": "AAAAAAF3FYZbFNuAuzw=" + }, + "model": { + "$ref": "AAAAAAF3FYZbFNt+k4c=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 8, + "top": 232, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF3FYZbFduHXxg=", + "_parent": { + "$ref": "AAAAAAF3FYZbFNuAuzw=" + }, + "model": { + "$ref": "AAAAAAF3FYZbFNt+k4c=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 8, + "top": 232, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF3FYZbFduIknI=", + "_parent": { + "$ref": "AAAAAAF3FYZbFNuAuzw=" + }, + "model": { + "$ref": "AAAAAAF3FYZbFNt+k4c=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 8, + "top": 232, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF3FYZbFduJrfE=", + "_parent": { + "$ref": "AAAAAAF3FYZbFNuAuzw=" + }, + "model": { + "$ref": "AAAAAAF3FYZbFNt+k4c=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 8, + "top": 232, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF3FYZbFduKuNA=", + "_parent": { + "$ref": "AAAAAAF3FYZbFNuAuzw=" + }, + "model": { + "$ref": "AAAAAAF3FYZbFNt+k4c=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 8, + "top": 232, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 832, + "top": 832, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF3FYZbFNuBlYE=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF3FYZbFduGvug=" + }, + "operationCompartment": { + "$ref": "AAAAAAF3FYZbFduHXxg=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF3FYZbFduIknI=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF3FYZbFduJrfE=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF3FYZbFduKuNA=" + } + }, + { + "_type": "UMLUseCaseView", + "_id": "AAAAAAF3FYeGO+xbgps=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3FYeGOuxZC7s=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAF3FYeGO+xcNdU=", + "_parent": { + "$ref": "AAAAAAF3FYeGO+xbgps=" + }, + "model": { + "$ref": "AAAAAAF3FYeGOuxZC7s=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAF3FYeGO+xdFmg=", + "_parent": { + "$ref": "AAAAAAF3FYeGO+xcNdU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 208, + "top": 144, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAF3FYeGO+xeMok=", + "_parent": { + "$ref": "AAAAAAF3FYeGO+xcNdU=" + }, + "font": "Arial;13;1", + "left": 1324, + "top": 795.5, + "width": 62, + "height": 13, + "text": "补测" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF3FYeGO+xfBVg=", + "_parent": { + "$ref": "AAAAAAF3FYeGO+xcNdU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 208, + "top": 144, + "width": 78.28593444824219, + "height": 13, + "text": "(from Model)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAF3FYeGO+xgJBc=", + "_parent": { + "$ref": "AAAAAAF3FYeGO+xcNdU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 208, + "top": 144, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1319, + "top": 788.5, + "width": 72, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAF3FYeGO+xdFmg=" + }, + "nameLabel": { + "$ref": "AAAAAAF3FYeGO+xeMok=" + }, + "namespaceLabel": { + "$ref": "AAAAAAF3FYeGO+xfBVg=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3FYeGO+xgJBc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAF3FYeGPOxh8UQ=", + "_parent": { + "$ref": "AAAAAAF3FYeGO+xbgps=" + }, + "model": { + "$ref": "AAAAAAF3FYeGOuxZC7s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 104, + "top": 72, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAF3FYeGPOxiyA8=", + "_parent": { + "$ref": "AAAAAAF3FYeGO+xbgps=" + }, + "model": { + "$ref": "AAAAAAF3FYeGOuxZC7s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 104, + "top": 72, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAF3FYeGPOxjOfM=", + "_parent": { + "$ref": "AAAAAAF3FYeGO+xbgps=" + }, + "model": { + "$ref": "AAAAAAF3FYeGOuxZC7s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 104, + "top": 72, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAF3FYeGPOxk208=", + "_parent": { + "$ref": "AAAAAAF3FYeGO+xbgps=" + }, + "model": { + "$ref": "AAAAAAF3FYeGOuxZC7s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 104, + "top": 72, + "width": 10, + "height": 10 + }, + { + "_type": "UMLExtensionPointCompartmentView", + "_id": "AAAAAAF3FYeGPOxlhv8=", + "_parent": { + "$ref": "AAAAAAF3FYeGO+xbgps=" + }, + "model": { + "$ref": "AAAAAAF3FYeGOuxZC7s=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 104, + "top": 72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1304, + "top": 784, + "width": 102, + "height": 35, + "nameCompartment": { + "$ref": "AAAAAAF3FYeGO+xcNdU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAF3FYeGPOxh8UQ=" + }, + "operationCompartment": { + "$ref": "AAAAAAF3FYeGPOxiyA8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAF3FYeGPOxjOfM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAF3FYeGPOxk208=" + }, + "extensionPointCompartment": { + "$ref": "AAAAAAF3FYeGPOxlhv8=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF3FYfmnPCIr84=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CEg44=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYfmnPCJbKg=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CEg44=" + }, + "font": "Arial;13;0", + "left": 676, + "top": 471, + "width": 216.61895751953125, + "height": 13, + "alpha": 0.1884747434719145, + "distance": 17.26267650163207, + "hostEdge": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "edgePosition": 1, + "text": "+未通过检测,将补测数据标识为dirty" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYfmnPCK6BE=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CEg44=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 790, + "top": 503, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYfmnPCLgus=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CEg44=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 806, + "top": 460, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYfmnPCMTXU=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CF45U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 871, + "top": 517, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYfmnPCN6dg=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CF45U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 864, + "top": 529, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYfmnPCO0WE=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CF45U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 885, + "top": 493, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYfmnPCPTs4=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CGlMo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 719, + "top": 460, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYfmnPCQ4ZQ=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CGlMo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 717, + "top": 473, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYfmnPCR0YI=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CGlMo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 725, + "top": 433, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3FYfmnPCS3/Q=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CF45U=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3FYfmnPCTkR4=", + "_parent": { + "$ref": "AAAAAAF3FYfmnPCIr84=" + }, + "model": { + "$ref": "AAAAAAF3FYfmm/CGlMo=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+n8X9HOVNKs=" + }, + "tail": { + "$ref": "AAAAAAF2+nRKkx5Vaw4=" + }, + "lineStyle": 1, + "points": "901:519;701:443", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF3FYfmnPCJbKg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF3FYfmnPCK6BE=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3FYfmnPCLgus=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF3FYfmnPCMTXU=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF3FYfmnPCN6dg=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF3FYfmnPCO0WE=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF3FYfmnPCPTs4=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF3FYfmnPCQ4ZQ=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF3FYfmnPCR0YI=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF3FYfmnPCS3/Q=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF3FYfmnPCTkR4=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF3FYiOTvpbRvo=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpXxUA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYiOTvpckKI=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpXxUA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 875, + "top": 246, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYiOTvpdswc=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpXxUA=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 866, + "top": 234, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYiOTvpeCiY=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpXxUA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 892, + "top": 271, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYiOTvpf64s=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpYHAk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 692, + "top": 373, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYiOTvpgCV4=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpYHAk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 687, + "top": 361, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYiOTvph4mg=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpYHAk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 704, + "top": 398, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYiOTvpiVXw=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpZRGM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1058, + "top": 119, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYiOTvpj6rs=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpZRGM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1048, + "top": 109, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYiOTvpkLlM=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpZRGM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1077, + "top": 139, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3FYiOTvplKeU=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpYHAk=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3FYiOTvpmbVY=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpbRvo=" + }, + "model": { + "$ref": "AAAAAAF3FYiOTvpZRGM=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mwCOqh1UGk=" + }, + "tail": { + "$ref": "AAAAAAF2+n8X9HOVNKs=" + }, + "lineStyle": 1, + "points": "680:407;1088:123", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF3FYiOTvpckKI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF3FYiOTvpdswc=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3FYiOTvpeCiY=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF3FYiOTvpf64s=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF3FYiOTvpgCV4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF3FYiOTvph4mg=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF3FYiOTvpiVXw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF3FYiOTvpj6rs=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF3FYiOTvpkLlM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF3FYiOTvplKeU=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF3FYiOTvpmbVY=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAF3FYjyg/5tJuM=", + "_parent": { + "$ref": "AAAAAAF2+mcHh6BjMLk=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5pmRs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYjyg/5u2LA=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5pmRs=" + }, + "font": "Arial;13;0", + "left": 907, + "top": 613, + "width": 163.864990234375, + "height": 13, + "alpha": -2.906930651480722, + "distance": 49.64876634922564, + "hostEdge": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "edgePosition": 1, + "text": "+未通过检测,选择清空测回" + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYjyg/5vWMM=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5pmRs=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1049, + "top": 630, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYjyhP5wgnA=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5pmRs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1012, + "top": 655, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYjyhP5x/LY=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5q+Kw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 986, + "top": 562, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYjyhP5yX1g=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5q+Kw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 999, + "top": 556, + "height": 13, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYjyhP5z07A=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5q+Kw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 961, + "top": 573, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "edgePosition": 2 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYjyhP502Qw=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5rtgo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1089, + "top": 715, + "height": 13, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYjyhP51mnU=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5rtgo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1098, + "top": 705, + "height": 13, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + } + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAF3FYjyhP52OCQ=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5rtgo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1068, + "top": 733, + "height": 13, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + } + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3FYjyhP53e10=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5q+Kw=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAF3FYjyhP54iWg=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5tJuM=" + }, + "model": { + "$ref": "AAAAAAF3FYjyg/5rtgo=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAF2+mq6h6SuwYA=" + }, + "tail": { + "$ref": "AAAAAAF2+nRKkx5Vaw4=" + }, + "lineStyle": 1, + "points": "960:555;1091:751", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAF3FYjyg/5u2LA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAF3FYjyg/5vWMM=" + }, + "propertyLabel": { + "$ref": "AAAAAAF3FYjyhP5wgnA=" + }, + "tailRoleNameLabel": { + "$ref": "AAAAAAF3FYjyhP5x/LY=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAF3FYjyhP5yX1g=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAF3FYjyhP5z07A=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAF3FYjyhP502Qw=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAF3FYjyhP51mnU=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAF3FYjyhP52OCQ=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAF3FYjyhP53e10=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAF3FYjyhP54iWg=" + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+mcRVqBmJfY=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "doSurveyor", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+memFKDDSP0=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "name": "成功", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+memFaDE9N8=", + "_parent": { + "$ref": "AAAAAAF2+memFKDDSP0=" + }, + "reference": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+memFaDFhUw=", + "_parent": { + "$ref": "AAAAAAF2+memFKDDSP0=" + }, + "reference": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+mglyqGKrLA=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "name": "测量失败次数过多", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+mgly6GLeNY=", + "_parent": { + "$ref": "AAAAAAF2+mglyqGKrLA=" + }, + "reference": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+mgly6GM4vI=", + "_parent": { + "$ref": "AAAAAAF2+mglyqGKrLA=" + }, + "reference": { + "$ref": "AAAAAAF2+mgPp6E+Z94=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+mlDdqJrvAs=", + "_parent": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "name": "测量失败,又没有允许重复尝试", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+mlDdqJshZY=", + "_parent": { + "$ref": "AAAAAAF2+mlDdqJrvAs=" + }, + "reference": { + "$ref": "AAAAAAF2+mcRVqBmJfY=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+mlDdqJtw60=", + "_parent": { + "$ref": "AAAAAAF2+mlDdqJrvAs=" + }, + "reference": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+mdRV6CVRE8=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "checkReadData", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+moC5KQL07Q=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+moC5KQMlXg=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQL07Q=" + }, + "reference": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+moC5KQNhhs=", + "_parent": { + "$ref": "AAAAAAF2+moC5KQL07Q=" + }, + "reference": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+mrOv6VGNxM=", + "_parent": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "name": "未通过检测提示目标两次读数超限请重新测量", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+mrOv6VHNRw=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VGNxM=" + }, + "reference": { + "$ref": "AAAAAAF2+mdRV6CVRE8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+mrOv6VIVq0=", + "_parent": { + "$ref": "AAAAAAF2+mrOv6VGNxM=" + }, + "reference": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+mgPp6E+Z94=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "RecordDirty" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+mkD1KIH4O4=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "SurveyorFailure", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+n5IxmZmfb4=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "name": "决定跳过", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+n5IxmZn2bs=", + "_parent": { + "$ref": "AAAAAAF2+n5IxmZmfb4=" + }, + "reference": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+n5IxmZowY8=", + "_parent": { + "$ref": "AAAAAAF2+n5IxmZmfb4=" + }, + "reference": { + "$ref": "AAAAAAF2+n3z62QBjMI=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+n7Ipmp5/TQ=", + "_parent": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "name": "取消跳过", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+n7Ipmp6n4I=", + "_parent": { + "$ref": "AAAAAAF2+n7Ipmp5/TQ=" + }, + "reference": { + "$ref": "AAAAAAF2+mkD1KIH4O4=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+n7Ipmp7myU=", + "_parent": { + "$ref": "AAAAAAF2+n7Ipmp5/TQ=" + }, + "reference": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+mntyKOMDSM=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "isHalfCycleZeroCheckReady", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+mvs0qcw0ng=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "name": "满足条件", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+mvs0qcx6HM=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qcw0ng=" + }, + "reference": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+mvs0qcyuaY=", + "_parent": { + "$ref": "AAAAAAF2+mvs0qcw0ng=" + }, + "reference": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+m650rJ78WY=", + "_parent": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "name": "不满足", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+m650rJ8zw4=", + "_parent": { + "$ref": "AAAAAAF2+m650rJ78WY=" + }, + "reference": { + "$ref": "AAAAAAF2+mntyKOMDSM=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+m650rJ9BDM=", + "_parent": { + "$ref": "AAAAAAF2+m650rJ78WY=" + }, + "reference": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+mq6h6Ss6fQ=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "doDeleteCurrentCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+mw/ialD1P0=", + "_parent": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+mw/iqlEWtE=", + "_parent": { + "$ref": "AAAAAAF2+mw/ialD1P0=" + }, + "reference": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+mw/iqlF64M=", + "_parent": { + "$ref": "AAAAAAF2+mw/ialD1P0=" + }, + "reference": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+mvXKaZ71tg=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "checkHalfCycleZero", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+m3lu6+/SvE=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+m3lu6/AYdA=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6+/SvE=" + }, + "reference": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+m3lu6/BCoQ=", + "_parent": { + "$ref": "AAAAAAF2+m3lu6+/SvE=" + }, + "reference": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+m4Cd7DMOyM=", + "_parent": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+m4Cd7DNh98=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DMOyM=" + }, + "reference": { + "$ref": "AAAAAAF2+mvXKaZ71tg=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+m4Cd7DOnkA=", + "_parent": { + "$ref": "AAAAAAF2+m4Cd7DMOyM=" + }, + "reference": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+mwCOqhz6ko=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "Idle" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+m3Ng67UQ3Q=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "isReady2CCheck", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+m/aRbZjsQw=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "name": "满足条件", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+m/aRbZkwdI=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZjsQw=" + }, + "reference": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+m/aRbZlRAA=", + "_parent": { + "$ref": "AAAAAAF2+m/aRbZjsQw=" + }, + "reference": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+nJuA+oxvHQ=", + "_parent": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "name": "不满足条件", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nJuA+oyVzg=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+oxvHQ=" + }, + "reference": { + "$ref": "AAAAAAF2+m3Ng67UQ3Q=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nJuA+ozWP8=", + "_parent": { + "$ref": "AAAAAAF2+nJuA+oxvHQ=" + }, + "reference": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+m+73LQ2jlo=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "check2C", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+nC6YsguVIY=", + "_parent": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nC6Y8gvJw0=", + "_parent": { + "$ref": "AAAAAAF2+nC6YsguVIY=" + }, + "reference": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nC6Y8gwxpA=", + "_parent": { + "$ref": "AAAAAAF2+nC6YsguVIY=" + }, + "reference": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+owe6Cfh2+U=", + "_parent": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "name": "忽略错误", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+owe6CfiblE=", + "_parent": { + "$ref": "AAAAAAF2+owe6Cfh2+U=" + }, + "reference": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+owe6CfjEGs=", + "_parent": { + "$ref": "AAAAAAF2+owe6Cfh2+U=" + }, + "reference": { + "$ref": "AAAAAAF2/55prRrd34g=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF3AAkuEf3qL3g=", + "_parent": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "name": "重新测量", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3AAkuEf3rpYI=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3qL3g=" + }, + "reference": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3AAkuEf3seOw=", + "_parent": { + "$ref": "AAAAAAF3AAkuEf3qL3g=" + }, + "reference": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF3AAllGAV08Nw=", + "_parent": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "name": "清空测量", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3AAllGAV1sLI=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV08Nw=" + }, + "reference": { + "$ref": "AAAAAAF2+m+73LQ2jlo=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3AAllGAV2oyY=", + "_parent": { + "$ref": "AAAAAAF3AAllGAV08Nw=" + }, + "reference": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+nB7EcWt+n8=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "isSingleCycleCompleted", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+nQJohB/pjc=", + "_parent": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "name": "未通过", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nQJohCAKVI=", + "_parent": { + "$ref": "AAAAAAF2+nQJohB/pjc=" + }, + "reference": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nQJohCBbxs=", + "_parent": { + "$ref": "AAAAAAF2+nQJohB/pjc=" + }, + "reference": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+nS1vB/7hWk=", + "_parent": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "name": "满足条件", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nS1vB/8CFI=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB/7hWk=" + }, + "reference": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nS1vB/9vRE=", + "_parent": { + "$ref": "AAAAAAF2+nS1vB/7hWk=" + }, + "reference": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+nIhauTyfGU=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "doRecordClean", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+n9ElngPQXA=", + "_parent": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+n9ElngQC7s=", + "_parent": { + "$ref": "AAAAAAF2+n9ElngPQXA=" + }, + "reference": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+n9ElngRO/w=", + "_parent": { + "$ref": "AAAAAAF2+n9ElngPQXA=" + }, + "reference": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF3ABeWIk8kkqs=", + "_parent": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3ABeWIk8l/nk=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8kkqs=" + }, + "reference": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3ABeWIk8mwTw=", + "_parent": { + "$ref": "AAAAAAF3ABeWIk8kkqs=" + }, + "reference": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+nRKkx5T21c=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "checkSingleCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+nhS8LdviJA=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nhS8bdwtKo=", + "_parent": { + "$ref": "AAAAAAF2+nhS8LdviJA=" + }, + "reference": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nhS8bdxqW4=", + "_parent": { + "$ref": "AAAAAAF2+nhS8LdviJA=" + }, + "reference": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+nm/XgG9mDY=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nm/XgG+7Ao=", + "_parent": { + "$ref": "AAAAAAF2+nm/XgG9mDY=" + }, + "reference": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nm/XgG/cLw=", + "_parent": { + "$ref": "AAAAAAF2+nm/XgG9mDY=" + }, + "reference": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF3FYXf8tUp5SY=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3FYXf8tUqXjA=", + "_parent": { + "$ref": "AAAAAAF3FYXf8tUp5SY=" + }, + "reference": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3FYXf89Uremo=", + "_parent": { + "$ref": "AAAAAAF3FYXf8tUp5SY=" + }, + "reference": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF3FYfmm/CEg44=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "name": "未通过检测,将补测数据标识为dirty", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3FYfmm/CF45U=", + "_parent": { + "$ref": "AAAAAAF3FYfmm/CEg44=" + }, + "reference": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3FYfmm/CGlMo=", + "_parent": { + "$ref": "AAAAAAF3FYfmm/CEg44=" + }, + "reference": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF3FYjyg/5pmRs=", + "_parent": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "name": "未通过检测,选择清空测回", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3FYjyg/5q+Kw=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5pmRs=" + }, + "reference": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3FYjyg/5rtgo=", + "_parent": { + "$ref": "AAAAAAF3FYjyg/5pmRs=" + }, + "reference": { + "$ref": "AAAAAAF2+mq6h6Ss6fQ=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+nWEKyMuLhQ=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "isAllCycleCompleted" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+nfCMJ2/R+8=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "isAllCycleCompleted", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+nkxU+qk8wM=", + "_parent": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "name": "不满足条件", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nkxVOqlU+M=", + "_parent": { + "$ref": "AAAAAAF2+nkxU+qk8wM=" + }, + "reference": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nkxVOqmmi4=", + "_parent": { + "$ref": "AAAAAAF2+nkxU+qk8wM=" + }, + "reference": { + "$ref": "AAAAAAF2+nIhauTyfGU=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+nsWEifnmc4=", + "_parent": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "name": "满足条件", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nsWEifod44=", + "_parent": { + "$ref": "AAAAAAF2+nsWEifnmc4=" + }, + "reference": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nsWEifpM0I=", + "_parent": { + "$ref": "AAAAAAF2+nsWEifnmc4=" + }, + "reference": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF3FYY3ONi1k54=", + "_parent": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "name": "未完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3FYY3Odi2Kgc=", + "_parent": { + "$ref": "AAAAAAF3FYY3ONi1k54=" + }, + "reference": { + "$ref": "AAAAAAF2+nfCMJ2/R+8=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3FYY3Odi3/4g=", + "_parent": { + "$ref": "AAAAAAF3FYY3ONi1k54=" + }, + "reference": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+nmf8//EQJ0=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "doDeleteAllCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+nnjTAPYxiQ=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nnjTAPZd8A=", + "_parent": { + "$ref": "AAAAAAF2+nnjTAPYxiQ=" + }, + "reference": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nnjTAPaO1I=", + "_parent": { + "$ref": "AAAAAAF2+nnjTAPYxiQ=" + }, + "reference": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF3AAi3NfRr6EY=", + "_parent": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3AAi3NfRsLF0=", + "_parent": { + "$ref": "AAAAAAF3AAi3NfRr6EY=" + }, + "reference": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3AAi3NfRtPso=", + "_parent": { + "$ref": "AAAAAAF3AAi3NfRr6EY=" + }, + "reference": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+nq2QxzDZ/U=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "checkAllCycle", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+ntEUyxG5GE=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "name": "通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+ntEUyxHkJg=", + "_parent": { + "$ref": "AAAAAAF2+ntEUyxG5GE=" + }, + "reference": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+ntEUyxITXI=", + "_parent": { + "$ref": "AAAAAAF2+ntEUyxG5GE=" + }, + "reference": { + "$ref": "AAAAAAF2+nsueSp07D8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+nt66S40Bz8=", + "_parent": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "name": "未通过检测", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nt66S41kFQ=", + "_parent": { + "$ref": "AAAAAAF2+nt66S40Bz8=" + }, + "reference": { + "$ref": "AAAAAAF2+nq2QxzDZ/U=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+nt66S42nQw=", + "_parent": { + "$ref": "AAAAAAF2+nt66S40Bz8=" + }, + "reference": { + "$ref": "AAAAAAF2+nmf8//EQJ0=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+nsueSp07D8=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "Finish" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+n3z62QBjMI=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "doRecordSkip", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+n81lnZzRwY=", + "_parent": { + "$ref": "AAAAAAF2+n3z62QBjMI=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+n81lnZ00eg=", + "_parent": { + "$ref": "AAAAAAF2+n81lnZzRwY=" + }, + "reference": { + "$ref": "AAAAAAF2+n3z62QBjMI=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+n81lnZ1tkU=", + "_parent": { + "$ref": "AAAAAAF2+n81lnZzRwY=" + }, + "reference": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2+n8X9HOTo5I=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "doMove2NextValidate", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2+oUnnx1ORxs=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "name": "计算下一个目标", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+oUnnx1PoOw=", + "_parent": { + "$ref": "AAAAAAF2+oUnnx1ORxs=" + }, + "reference": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2+oUnnx1Q1uk=", + "_parent": { + "$ref": "AAAAAAF2+oUnnx1ORxs=" + }, + "reference": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF3FYiOTvpXxUA=", + "_parent": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3FYiOTvpYHAk=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpXxUA=" + }, + "reference": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3FYiOTvpZRGM=", + "_parent": { + "$ref": "AAAAAAF3FYiOTvpXxUA=" + }, + "reference": { + "$ref": "AAAAAAF2+mwCOqhz6ko=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2/55prRrd34g=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "doRecordDirty", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2/57X7ycUMD0=", + "_parent": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "name": "单测回完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2/57X7ycVqls=", + "_parent": { + "$ref": "AAAAAAF2/57X7ycUMD0=" + }, + "reference": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2/57X7ycW028=", + "_parent": { + "$ref": "AAAAAAF2/57X7ycUMD0=" + }, + "reference": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF3ABn9InDG0I8=", + "_parent": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3ABn9InDHYy0=", + "_parent": { + "$ref": "AAAAAAF3ABn9InDG0I8=" + }, + "reference": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF3ABn9InDIm3A=", + "_parent": { + "$ref": "AAAAAAF3ABn9InDG0I8=" + }, + "reference": { + "$ref": "AAAAAAF2+nB7EcWt+n8=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2/+4lLTMZ3R0=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "isSingleCycleCompletedAfterDirty", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2/+8EZEWEVSo=", + "_parent": { + "$ref": "AAAAAAF2/+4lLTMZ3R0=" + }, + "name": "单测回未完成", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2/+8EZEWFV4M=", + "_parent": { + "$ref": "AAAAAAF2/+8EZEWEVSo=" + }, + "reference": { + "$ref": "AAAAAAF2/55prRrd34g=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2/+8EZEWGccA=", + "_parent": { + "$ref": "AAAAAAF2/+8EZEWEVSo=" + }, + "reference": { + "$ref": "AAAAAAF2+n8X9HOTo5I=" + } + } + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAF2/+8rLEgaoTY=", + "_parent": { + "$ref": "AAAAAAF2/+4lLTMZ3R0=" + }, + "name": "满足", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2/+8rLEgb+jA=", + "_parent": { + "$ref": "AAAAAAF2/+8rLEgaoTY=" + }, + "reference": { + "$ref": "AAAAAAF2/+4lLTMZ3R0=" + }, + "navigable": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAF2/+8rLEgciEE=", + "_parent": { + "$ref": "AAAAAAF2/+8rLEgaoTY=" + }, + "reference": { + "$ref": "AAAAAAF2+nRKkx5T21c=" + } + } + } + ] + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF2/+6bzj11GxQ=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "checkSingleCycleAfterDirty" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF3FYZbFNt+k4c=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "需要补测" + }, + { + "_type": "UMLUseCase", + "_id": "AAAAAAF3FYeGOuxZC7s=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "补测" + } + ] + } + ] +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/App.java b/app/src/main/java/com/bingce/controlnetwork/App.java new file mode 100644 index 0000000..e398f30 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/App.java @@ -0,0 +1,183 @@ +package com.bingce.controlnetwork; + +import static com.bingce.AppChannel.customChannel; + +import android.content.SharedPreferences; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.util.Log; +import android.widget.ImageView; + +import androidx.preference.PreferenceManager; + +import com.bingce.AppChannel; +import com.bingce.RepositoryBaseApp; +import com.bingce.controlapphelper.datasource.database.SurveyorDataBase; +import com.bingce.controlapphelper.datasource.database.ToleranceTemplate; +import com.bingce.controlapphelper.util.DatabaseProvider; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlnetwork.activity.NotificationActivity; +import com.bingce.utils.DES; +import com.bumptech.glide.Glide; +import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader; +import com.mikepenz.materialdrawer.util.DrawerImageLoader; +import com.umeng.commonsdk.UMConfigure; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import org.polaric.colorful.Colorful; + +import blankj.utilcode.util.ActivityUtils; +import blankj.utilcode.util.Utils; +import cn.leancloud.LCInstallation; +import cn.leancloud.LCLogger; +import cn.leancloud.LeanCloud; +import cn.leancloud.push.PushService; +import io.reactivex.functions.Consumer; +import io.reactivex.plugins.RxJavaPlugins; + +public class App extends RepositoryBaseApp { + + /** + * 试用次数 + */ + public int tryCount = 0; //非setting + /** + * 上次手动点击跳过首屏广告的时间 + */ + public long lastSplashShowTime = 0;//非setting + /** + * 磁偏角,用于校正指南针 + */ + public float magneticDeclination = 0; + /** + * 蓝牙是否连接 + */ + public boolean isBluetoothConnected = false; + /** + * 蓝牙是否重连 + */ + public boolean isBluetoothReconnect = false; + /** + * 退出软件后是否关闭设备 + */ + public boolean isCloseInstrumentAfterExit = false; + /** + * 用户状态发生变化,例如登录 + */ + public boolean isUserStatusChanged = false; + /** + * 注册码第二版 + */ + public String registerCodeV2 = ""; + + public String wifiChatClientIp = ""; + public String lastPhoneLocation = ""; + + private static App app; + + @Override + public void onCreate() { + customChannel = AppChannel.CUSTOM_PUBLIC;//; + super.onCreate(); + app = this; + + initThemeDark(); + + RxJavaPlugins.setErrorHandler(new Consumer() { + @Override + public void accept(Throwable throwable) { + Log.e("rxThrowable", String.valueOf(throwable)); + } + }); + + UMConfigure.preInit(this, "62c2c24705844627b5d6f943", "public"); + + // 在 LeanCloud.initialize() 之前调用 + LeanCloud.setLogLevel(LCLogger.Level.DEBUG); + + LeanCloud.initialize(this + , DES.decryptIt("//HYY/P0uNjW2bvmcfWVsRqUZcBGI1mjKeLw17mtlc4poF3nDQzo0Q==")//id,BvjcpX3kNB69xP8N0fHxDQav-gzGzoHsz + , DES.decryptIt("LBk6WfZhiDVIlf/vpesX6s8j4ik+d23atgE0QGuwyw8=") + , "https://leancloud.bingce.com"); + + PushService.setDefaultPushCallback(this, NotificationActivity.class); + PushService.setAutoWakeUp(true); + PushService.setDefaultChannelId(this, "normal"); + LCInstallation.getCurrentInstallation().saveInBackground().subscribe(); + + DrawerImageLoader.init(new AbstractDrawerImageLoader() { + @Override + public void set(ImageView imageView, Uri uri, Drawable placeholder) { +// Picasso.get().load(uri).placeholder(placeholder).into(imageView); + Glide.with(App.this).load(uri).into(imageView); + } + + @Override + public void cancel(ImageView imageView) { + Glide.with(App.this).clear(imageView); +// Picasso.get().cancelRequest(imageView); + } + }); + + restorePrefs(); + + if (customChannel == AppChannel.CUSTOM_CONTROL_PRO) { + Colorful.config(this).primaryColor(Colorful.ThemeColor.BROWN).apply(); + Colorful.config(this).accentColor(Colorful.ThemeColor.BROWN).apply(); + } + + + initControlApp(); + } + + private void initThemeDark() { + Colorful.defaults() + .primaryColor(Colorful.ThemeColor.BLUE) + .accentColor(Colorful.ThemeColor.BLUE) + .translucent(false) + .dark(SettingValueUtil.isThemeDark()); + Colorful.init(this); + } + + private void restorePrefs() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + registerCodeV2 = prefs.getString("registerCodeV2", ""); + lastSplashShowTime = prefs.getLong("lastSplashShowTime", 0); + wifiChatClientIp = prefs.getString("wifiChatClientIp", ""); + isCloseInstrumentAfterExit = prefs.getBoolean("isCloseInstrumentAfterExit", false); + magneticDeclination = prefs.getFloat("magneticDeclination", 0); + lastPhoneLocation = prefs.getString("lastPhoneLocation", ""); + } + + @Override + public void onTrimMemory(int level) { + super.onTrimMemory(level); + if (level == TRIM_MEMORY_MODERATE) { + //开始自杀,清场掉所有的activity + ActivityUtils.finishAllActivities(); + } + } + + @Override + public String applicationId() { + return BuildConfig.APPLICATION_ID; + } + + public static App getApp() { + return app; + } + + @Override + protected void initTtsManager() { + TtsManager.getInstance().init(this); + } + + private void initControlApp() { + Utils.init(this); + //加载限差配置 + ToleranceTemplate.setup(); + //数据库 + DatabaseProvider.init(SurveyorDataBase.getInstance()); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/AboutActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/AboutActivity.java new file mode 100644 index 0000000..5474ffe --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/AboutActivity.java @@ -0,0 +1,133 @@ +package com.bingce.controlnetwork.activity; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; + +import com.bingce.activity.PrivacyPolicyActivity; +import com.bingce.activity.UserAgreementActivity; +import com.bingce.controlnetwork.util.CheckControlUpdateUtil; +import com.bingce.surveyor.agentweb.AgentWebActivity; +import com.vansuita.materialabout.builder.AboutBuilder; +import com.vansuita.materialabout.views.AboutView; + +import org.polaric.colorful.ColorfulActivity; + +import blankj.utilcode.util.ToastUtils; +import blankj.utilcode.util.Utils; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.util.CheckControlUpdateUtil; + +public class AboutActivity extends ColorfulActivity { + private Toolbar mToolbar; + + @SuppressLint("SourceLockedOrientationActivity") + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_about); + mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + final FrameLayout flHolder = findViewById(R.id.activity_about_frame); + AboutBuilder builder = AboutBuilder.with(this) + .setAppName(R.string.app_name) + .setPhoto(R.mipmap.avatar_liuyanbing) + .setCover(R.mipmap.profile_cover) + .setLinksAnimated(true) + .setDividerDashGap(13) + .setName(R.string.liuyanbing) + .setSubTitle(R.string.bingce_tech) + .setLinksColumnsCount(3) + .setBrief("很荣幸能帮到您,我们一直致力于让测量工作者更轻松,工作更高效,设备更智能,希望我们的软件能帮到行业里的辛勤劳动者!") + .addEmailLink("liu@bingce.com") + .addWebsiteLink("https://www.bingce.com") + .addFiveStarsAction() + .setVersionNameAsAppSubTitle() + .setActionsColumnsCount(2) + .addLink(R.mipmap.license, R.string.user_agreement, new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(AboutActivity.this, UserAgreementActivity.class)); + } + }) + .addPrivacyPolicyAction(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(AboutActivity.this, PrivacyPolicyActivity.class)); + } + }) + .addIntroduceAction(new View.OnClickListener() { + @Override + public void onClick(View view) { +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", "android_url_introduce_video"); +// startActivity(intent); + AgentWebActivity.navigation2( + AboutActivity.this, "android_url_introduce_video"); + } + }) + .addHelpAction(new View.OnClickListener() { + @Override + public void onClick(View view) { +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", "android_url_control_network_docs"); +// startActivity(intent); + AgentWebActivity.navigation2( + AboutActivity.this, + "android_url_control_network_docs" + ); + } + }) + .addChangeLogAction(new Intent(Utils.getApp(), ChangelogActivity.class)) + .addAction(R.mipmap.icon_download_fill, R.string.check_update, new View.OnClickListener() { + @Override + public void onClick(View view) { + CheckControlUpdateUtil.checkUpdate(AboutActivity.this, true); + } + }) + .addAction(R.drawable.icon_log, R.string.log_collect_activity, v -> LogCollectActivity.start(AboutActivity.this)) + .setWrapScrollView(true) + .setShowAsCard(true); + + AboutView view = builder.build(); + flHolder.addView(view); + } + + @Override + public boolean onCreateOptionsMenu(@NonNull Menu menu) { + getMenuInflater().inflate(R.menu.menu_activity_about, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + break; + case R.id.menu_debug_switch: + Utils.isTest = !Utils.isTest; + if (Utils.isTest){ + ToastUtils.showShort(R.string.debug_on); + }else{ + ToastUtils.showShort(R.string.debug_off); + } + break; + } + return super.onOptionsItemSelected(item); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/BaseActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/BaseActivity.java new file mode 100644 index 0000000..93d121d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/BaseActivity.java @@ -0,0 +1,55 @@ +package com.bingce.controlnetwork.activity; + +import android.os.Bundle; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; + +import org.polaric.colorful.ColorfulActivity; + +import com.bingce.controlnetwork.R; + +public abstract class BaseActivity extends ColorfulActivity { + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public void setContentView(View view) { + super.setContentView(view); + Toolbar mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + @Override + public void setContentView(int layoutResID) { + super.setContentView(layoutResID); + Toolbar mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + super.setContentView(view, params); + Toolbar mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + } + return super.onOptionsItemSelected(item); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/ChangelogActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/ChangelogActivity.java new file mode 100644 index 0000000..ee63361 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/ChangelogActivity.java @@ -0,0 +1,38 @@ +package com.bingce.controlnetwork.activity; + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.view.MenuItem; + +import androidx.appcompat.widget.Toolbar; + +import org.polaric.colorful.ColorfulActivity; + +import com.bingce.controlnetwork.R; + +/** + * 更新日志 + */ +public class ChangelogActivity extends ColorfulActivity { + private static final String TAG = "ChangelogActivity"; + private Toolbar mToolbar; + + @SuppressLint("SourceLockedOrientationActivity") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_changelog); + mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + } + return super.onOptionsItemSelected(item); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/LogCollectActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/LogCollectActivity.java new file mode 100644 index 0000000..8f211f7 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/LogCollectActivity.java @@ -0,0 +1,26 @@ +package com.bingce.controlnetwork.activity; + +import android.content.Context; +import android.content.Intent; + +import com.bingce.activity.AbstractLogCollectActivity; + +import com.bingce.controlnetwork.App; +import com.bingce.controlnetwork.BuildConfig; + +public class LogCollectActivity extends AbstractLogCollectActivity { + @Override + protected String applicationId() { + return BuildConfig.APPLICATION_ID; + } + + @Override + protected boolean isLandscape() { + return ((App) getApplication()).isLandscape(); + } + + public static void start(Context context) { + Intent intent = new Intent(context, LogCollectActivity.class); + context.startActivity(intent); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/MainActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/MainActivity.java new file mode 100644 index 0000000..0658939 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/MainActivity.java @@ -0,0 +1,1210 @@ +package com.bingce.controlnetwork.activity; + +import android.annotation.SuppressLint; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.util.Log; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.WindowManager; +import android.widget.CheckBox; +import android.widget.CompoundButton; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.preference.PreferenceManager; +import androidx.viewpager.widget.ViewPager; + +import com.afollestad.materialdialogs.DialogAction; +import com.afollestad.materialdialogs.MaterialDialog; +import com.bingce.AppChannel; +import com.bingce.BaseApp; +import com.bingce.activity.BaseMainActivity; +import com.bingce.controlapphelper.event.DatabaseReadyEvent; +import com.bingce.controlapphelper.event.ProjectChangedEvent; +import com.bingce.controlapphelper.event.SwitchPageEvent; +import com.bingce.controlapphelper.util.InterfaceUtil; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlnetwork.App; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.backup.BackupExportActivity; +import com.bingce.controlnetwork.activity.backup.launch.BackupImportHelper; +import com.bingce.controlnetwork.activity.user.LoginActivity; +import com.bingce.controlnetwork.activity.user.RegisterActivity; +import com.bingce.controlnetwork.activity.user.UserInfoActivity; +import com.bingce.controlnetwork.fragment.ConfigFragment; +import com.bingce.controlnetwork.fragment.MainSurveyFragment; +import com.bingce.controlnetwork.fragment.ProjectListFragment; +import com.bingce.controlnetwork.fragment.ServiceFragment; +import com.bingce.controlnetwork.util.CheckControlUpdateUtil; +import com.bingce.data.sync.GlobalFlowCenter; +import com.bingce.data.sync.utils.LeanCloudConfigLoader; +import com.bingce.data.sync.utils.LeanCloudUserLoginStateUtils; +import com.bingce.device.Device; +import com.bingce.device.ui.manager.DeviceConnectManager; +import com.bingce.device.ui.manager.DeviceRemindManager; +import com.bingce.device.ui.manager.DeviceRequestManager; +import com.bingce.event.CountDownEvent; +import com.bingce.event.OpenShortUrlEvent; +import com.bingce.surveyor.agentweb.AgentWebActivity; +import com.bingce.totalstation.TotalStation; +import com.bingce.ui.TabEntity; +import com.bingce.utils.ActivateUtil; +import com.bingce.utils.ColorUtil; +import com.bingce.utils.CrashCollector; +import com.bingce.utils.DateUtils; +import com.bingce.utils.LCDeviceUtil; +import com.bingce.utils.SdkUtils; +import com.bingce.utils.ServiceDateUtils; +import com.bingce.utils.SoundPoolUtil; +import com.bingce.utils.StringUtil; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.utils.Util; +import com.bingce.utils.VipManager; +import com.daimajia.numberprogressbar.NumberProgressBar; +import com.flyco.tablayout.CommonTabLayout; +import com.flyco.tablayout.listener.CustomTabEntity; +import com.flyco.tablayout.listener.OnTabSelectListener; +import com.jkyeo.splashview.SplashView; +import com.mikepenz.iconics.IconicsDrawable; +import com.mikepenz.material_design_iconic_typeface_library.MaterialDesignIconic; +import com.mikepenz.materialdrawer.AccountHeader; +import com.mikepenz.materialdrawer.AccountHeaderBuilder; +import com.mikepenz.materialdrawer.Drawer; +import com.mikepenz.materialdrawer.DrawerBuilder; +import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; +import com.mikepenz.materialdrawer.model.ProfileDrawerItem; +import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem; +import com.mikepenz.materialdrawer.model.SecondaryDrawerItem; +import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; +import com.mikepenz.materialdrawer.model.interfaces.IProfile; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; +import com.umeng.commonsdk.UMConfigure; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; +import org.polaric.colorful.Colorful; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import alibaba.fastjson.JSON; +import alibaba.fastjson.JSONObject; +import blankj.utilcode.util.ActivityUtils; +import blankj.utilcode.util.ServiceUtils; +import blankj.utilcode.util.StringUtils; +import blankj.utilcode.util.ToastUtils; +import blankj.utilcode.util.Utils; +import cn.leancloud.LCException; +import cn.leancloud.LCFile; +import cn.leancloud.LCObject; +import cn.leancloud.LCQuery; +import cn.leancloud.LCUser; +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; + +public class MainActivity extends BaseMainActivity implements Device.IDeviceConnectListener, Device.IDeviceRequestListener, Device.IDeviceRemindListener { + public MainActivityUtils mainActivityUtils = new MainActivityUtils(this, () -> this); + private final DeviceConnectManager deviceConnectManager = new DeviceConnectManager(this, this); + public final DeviceRequestManager deviceRequestManager = new DeviceRequestManager(this, this); + public final DeviceRemindManager deviceRemindManager = new DeviceRemindManager(this, this); + public final static String MAIN_IN_ACTION_NAME = "cn.liuyanbing.surveyor.main_activity_local_receiver"; + private Toolbar mToolbar; + private AccountHeader accountHeader = null; + private Drawer drawerLeft = null; + private NumberProgressBar cutDownProgressBar; + private CheckBox powerOffCheckbox; + private final List mFragments = new ArrayList<>(); + private String[] mTitles; + private final int[] mIconUnSelectIds = new int[]{R.drawable.ic_tab_project_unselect, R.drawable.ic_ruler_unselected, R.mipmap.tab_home_unselect, R.mipmap.tab_service_unselect}; + private final int[] mIconSelectIds = new int[]{R.drawable.ic_tab_project_selected, R.drawable.ic_ruler_selected, R.mipmap.tab_home_select, R.mipmap.tab_service_select}; + private final ArrayList mTabEntities = new ArrayList<>(); + private ViewPager mViewPager; + private CommonTabLayout mTabLayout; + private BackupImportHelper backupImportUtil = new BackupImportHelper(this); + + @SuppressLint("SourceLockedOrientationActivity") + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (ActivateUtil.encrypt(this, "control", AppChannel.customChannel) == null) + finish(); + + EventBus.getDefault().register(this); + + if (isThemeDark()) { + setTheme(R.style.CustomThemeDark); + } + Colorful.applyTheme(this); + setContentView(R.layout.activity_main); + initWidgetListener(savedInstanceState);//初始化组件和监听器 + + ((App) Utils.getApp()).tryCount = 0; + IntentFilter filter = new IntentFilter(); + filter.addAction(MAIN_IN_ACTION_NAME); + + fetchSplash(); + + if (LCUser.getCurrentUser() != null && LCUser.getCurrentUser().isAuthenticated()) { + VipManager.getInstance().controlSdkRefresh(this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() { + @Override + public void onRefreshSuccess() { + if (!VipManager.getInstance().checkReg() + && ((VipManager.getInstance().level > 0 && VipManager.getInstance().isInExpireDate) + || (VipManager.getInstance().eduLevel > 0 && VipManager.getInstance().isEduInExpireDate) + || (VipManager.getInstance().intlLevel > 0 && VipManager.getInstance().isIntlInExpireDate) + || (VipManager.getInstance().controlLevel > 0 && VipManager.getInstance().isControlInExpireDate)) + && !VipManager.getInstance().isControlBoundDevice) { + new MaterialDialog.Builder(MainActivity.this) + .title(R.string.hint) + .content(R.string.unbind_old_device_first) + .positiveText(R.string.unbind_device) + .onPositive((dialog, which) -> + startActivity(new Intent(MainActivity.this, UserInfoActivity.class))) + .negativeText(R.string.not_now) + .show(); + } + if (!StringUtils.isEmpty(SdkUtils.attach())) { + JSONObject attach = JSON.parseObject(SdkUtils.attach()); + if (attach != null && attach.containsKey("sessionTokenInvalid")) { + boolean sessionTokenInvalid = attach.getBooleanValue("sessionTokenInvalid");//如果改了密码,sessionToken变了,需要退出登录 + if (sessionTokenInvalid) { + LCUser.logOut(); + LeanCloudUserLoginStateUtils.onLogOut(); + updateHeaderResult(); + VipManager.getInstance().controlSdkRefresh(MainActivity.this, ((App) Utils.getApp()).registerCodeV2, null); + } + } + } + } + + @Override + public void onRefreshFailed(int errorCode) { + + } + }); + } + + updateHeaderResult(); + + LCDeviceUtil.updateDeviceInfo("controlnetwork", ((App) Utils.getApp()).registerCodeV2, null); + + checkAgreementPermission(); + + //解决某个版本的bug: + //由于升级数据库,导致限差方案丢失,所以启动的时候检测所有project,为没有限差的项目重新添加限差 +// DatabaseFixUtils.changeDefaultTolerance(); + //尝试上传crashLog + ThreadPoolUtil.execute(() -> CrashCollector.tryUploadCrashLogInWorkerThread(this, CrashCollector.APP_LABEL_CONTROL)); + LeanCloudConfigLoader.loadLeanCloudConfig(); + } + + /** + * 初始化组件和监听器,屏幕方向发生改变时执行一次 + */ + private void initWidgetListener(Bundle savedInstanceState) { + mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + setTitle(R.string.app_name); + //set the back arrow in the toolbar + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(false); + getSupportActionBar().setDisplayShowTitleEnabled(true); + } + cutDownProgressBar = findViewById(R.id.cut_down_progressbar); + mViewPager = findViewById(R.id.activity_main_viewpager); + mTabLayout = findViewById(R.id.activity_main_tab_layout); + if (isThemeDark()) { + if (mTabLayout != null) { + mTabLayout.setBackgroundColor(Color.DKGRAY); + mTabLayout.setTextUnselectColor(Color.LTGRAY); + mTabLayout.setUnderlineColor(Color.BLACK); + } + } + mTitles = new String[]{getString(R.string.project), getString(R.string.survey), getString(R.string.label_manager), getString(R.string.service)}; + mFragments.add(new ProjectListFragment()); + mFragments.add(new MainSurveyFragment()); + mFragments.add(new ConfigFragment()); + mFragments.add(new ServiceFragment()); + for (int i = 0; i < mTitles.length; i++) { + mTabEntities.add(new TabEntity(mTitles[i], mIconSelectIds[i], mIconUnSelectIds[i])); + } + + mTabLayout.setTabData(mTabEntities); + mTabLayout.setOnTabSelectListener(new OnTabSelectListener() { + @Override + public void onTabSelect(int position) { + mViewPager.setCurrentItem(position); + } + + @Override + public void onTabReselect(int position) { + if (position == 0) { +// mTabLayout.showMsg(0, mRandom.nextInt(100) + 1); +// UnreadMsgUtils.show(mTabLayout_2.getMsgView(0), mRandom.nextInt(100) + 1); + } + } + }); + + mViewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager())); + mViewPager.setCurrentItem(0); + mViewPager.setOffscreenPageLimit(4); + mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + setCurrentTab(position); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + + accountHeader = new AccountHeaderBuilder() + .withActivity(this) + .withCompactStyle(true) +// .withHeaderBackground(R.drawable.drawer_header) + .withProfileImagesClickable(true) + .withCurrentProfileHiddenInList(true) + .addProfiles( + new ProfileDrawerItem() + .withEmail(getString(R.string.not_log_in)) + .withIcon(R.drawable.app_logo) + .withIdentifier(1003), + new ProfileSettingDrawerItem() + .withName(getString(R.string.log_in)) + .withIcon(new IconicsDrawable(this).icon(MaterialDesignIconic.Icon.gmi_sign_in).paddingDp(5)) + .withIdentifier(1000).withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { + @Override + public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { + Intent intent = new Intent(Utils.getApp(), LoginActivity.class); + intent.putExtra("finishTo", UserInfoActivity.class.getName()); + startActivity(intent); + return false; + } + })) + .withOnAccountHeaderProfileImageListener(new AccountHeader.OnAccountHeaderProfileImageListener() { + @Override + public boolean onProfileImageClick(View view, IProfile profile, boolean current) { + if (LCUser.getCurrentUser() == null) { + Intent intent = new Intent(Utils.getApp(), LoginActivity.class); + intent.putExtra("finishTo", UserInfoActivity.class.getName()); + startActivity(intent); + } else { + startActivity(new Intent(MainActivity.this, UserInfoActivity.class)); + } + return false; + } + + @Override + public boolean onProfileImageLongClick(View view, IProfile profile, boolean current) { + return false; + } + }) + .withOnlyMainProfileImageVisible(true) + .withSavedInstance(savedInstanceState) + .build(); + + IDrawerItem[] items = new IDrawerItem[]{ +// new PrimaryDrawerItem().withName(R.string.update_database).withDescription(R.string.update_database_description).withIcon(MaterialDesignIconic.Icon.gmi_upload).withIdentifier(14).withSelectable(false), +// new PrimaryDrawerItem().withName(R.string.video_tutorial).withDescription(R.string.video_tutorial_description).withIcon(MaterialDesignIconic.Icon.gmi_collection_video).withIdentifier(15).withSelectable(false), + new PrimaryDrawerItem().withName(R.string.docs).withIcon(MaterialDesignIconic.Icon.gmi_help_outline).withIdentifier(16).withSelectable(false), + new PrimaryDrawerItem().withName(R.string.tech_customer_service).withIcon(R.mipmap.icon_program_customer_service).withIdentifier(17).withSelectable(false), + new PrimaryDrawerItem().withName(R.string.app_data_backup).withIcon(MaterialDesignIconic.Icon.gmi_info_outline).withIcon(R.drawable.ic_backup).withIdentifier(24).withSelectable(false), + new PrimaryDrawerItem().withName(R.string.app_backup_import).withIcon(MaterialDesignIconic.Icon.gmi_info_outline).withIcon(R.drawable.ic_import).withIdentifier(25).withSelectable(false), + new PrimaryDrawerItem().withName(R.string.about).withIcon(MaterialDesignIconic.Icon.gmi_info_outline).withIdentifier(19).withSelectable(false) + }; + //Create the drawer + drawerLeft = new DrawerBuilder() + .withActivity(this) + .withToolbar(mToolbar) + .withAccountHeader(accountHeader) //set the AccountHeader we created earlier for the header + .addDrawerItems(items) + .addStickyDrawerItems(new SecondaryDrawerItem().withName(R.string.settings).withIcon(MaterialDesignIconic.Icon.gmi_settings).withIdentifier(20).withSelectable(false)) + .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { + @Override + public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { + if (drawerItem != null) { + switch ((int) drawerItem.getIdentifier()) { + case 14: + new AlertDialog.Builder(MainActivity.this) + .setTitle(R.string.confirm_update_database) + .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + EventBus.getDefault().post(new ProjectChangedEvent()); + } + }).setNegativeButton(R.string.cancel, null).show(); + break; + case 15: + showTutorialListDialog(); + break; + case 16: +// Intent intent16 = new Intent(); +// intent16.setClass(Utils.getApp(), AgentWebActivity.class); +// intent16.putExtra("short_url", "android_url_control_network_docs"); +// startActivity(intent16); + AgentWebActivity.navigation2( + MainActivity.this, + "android_url_control_network_docs"); + break; + case 17: +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", "android_url_tech_support"); +// startActivity(intent); + AgentWebActivity.navigation2( + MainActivity.this, + "android_url_tech_support" + ); + break; + case 19: + Intent intent17 = new Intent(Utils.getApp(), AboutActivity.class); + startActivity(intent17); + break; + case 20: + Intent intent18 = new Intent(Utils.getApp(), SettingsActivity.class); + startActivityForResult(intent18, 331); + break; + case 24: + BackupExportActivity.start(MainActivity.this, BackupExportActivity.class); + break; + case 25: + backupImportUtil.doImport(MainActivity.this, success -> { + if (success) { + restartApplication(); +// initProject(); + } + }); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + drawerLeft.closeDrawer(); + } + }, 60); + + break; + + } + } + + return false; + } + }) + .withSavedInstance(savedInstanceState) + .withSelectedItem(-1) + .build(); + } + + public void setCurrentTab(int position) { + mTabLayout.setCurrentTab(position); + } + + //查询/显示广告 + private void showSplash() { + if (SplashView.hasNew) {//有新广告 + SplashView.showSplashView(MainActivity.this, 3, null, new SplashView.OnSplashViewActionListener() { + @Override + public void onSplashImageClick(String actionUrl) { + if (actionUrl != null) { + AgentWebActivity.navigation2(MainActivity.this, Uri.parse(actionUrl)); + } + } + + @Override + public void onSplashViewDismiss(boolean autoDismiss, boolean skipDismiss, boolean clickImageDismiss) { + updateSplashLog(autoDismiss, skipDismiss, clickImageDismiss); + } + }); + + ((App) Utils.getApp()).lastSplashShowTime = System.currentTimeMillis(); + Util.putPreference("lastSplashShowTime", ((App) Utils.getApp()).lastSplashShowTime); + } else if ((VipManager.getInstance().checkVipReg() && System.currentTimeMillis() - ((App) Utils.getApp()).lastSplashShowTime > 24 * 60 * 60 * 1000L) + || (!VipManager.getInstance().checkVipReg() && System.currentTimeMillis() - ((App) Utils.getApp()).lastSplashShowTime > 4 * 60 * 60 * 1000L)) { + //没查到新广告,就显示上次广告 + //会员如果距离上次显示广告超过24小时,再次显示广告 + //非会员如果距离上次手动跳过广告4小时,再次显示广告 + SplashView.showSplashView(MainActivity.this, 3, null, new SplashView.OnSplashViewActionListener() { + @Override + public void onSplashImageClick(String actionUrl) { + if (actionUrl != null) { + AgentWebActivity.navigation2(MainActivity.this, Uri.parse(actionUrl)); + } + } + + @Override + public void onSplashViewDismiss(boolean autoDismiss, boolean skipDismiss, boolean clickImageDismiss) { + updateSplashLog(autoDismiss, skipDismiss, clickImageDismiss); + } + }); + ((App) Utils.getApp()).lastSplashShowTime = System.currentTimeMillis(); + Util.putPreference("lastSplashShowTime", ((App) Utils.getApp()).lastSplashShowTime); + } + } + + private void fetchSplash() { + String queryUrl = "splashUrlControl"; + //查询是否有新广告 + LeanCloudConfigLoader.findInBackground(queryUrl, instance -> { + if (isFinishing()) + return; + if (instance != null && StringUtil.isNotEmpty(instance.value)) { + String splashUrl = /*avObjects.get(0).getString("value")*/instance.value; + String[] array = splashUrl.split(",", -2); + if (array.length == 2) { + SplashView.updateSplashData(MainActivity.this, array[0], array[1]); + } + } + }); + } + + private void updateSplashLog(final boolean autoDismiss, final boolean skipDismiss, final boolean clickImageDismiss) { + if (AppChannel.customChannel != AppChannel.CUSTOM_CONTROL_PUBLIC) + return;//只统计公版 + final Date today = DateUtils.reverse2Date(DateUtils.getTodayStartTime()); + new LCQuery<>("SplashLog") + .whereEqualTo("date", today) + .findInBackground().subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(List avObjects) { + if (avObjects != null && !avObjects.isEmpty()) { + avObjects.get(0).increment("showTimes"); + if (autoDismiss) + avObjects.get(0).increment("autoDismissTimes"); + if (skipDismiss) + avObjects.get(0).increment("skipTimes"); + if (clickImageDismiss) + avObjects.get(0).increment("clickTimes"); + avObjects.get(0).saveInBackground().subscribe(); + } else { + LCObject splashLog = new LCObject("SplashLog"); + splashLog.put("date", today); + splashLog.saveInBackground().subscribe(); + } + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } + + /** + * 读取项目文件 + */ + @Override + public void initialize() { + //友盟统计 + UMConfigure.init(this, "62c2c24705844627b5d6f943", "public", UMConfigure.DEVICE_TYPE_PHONE, ""); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {//安卓10以下,请求读取硬件信息 + mainActivityUtils.requestPhonePermission(); + } + try {//微信插件实例化 + if (Utils.getApp() instanceof BaseApp) { + IWXAPI wxApi = WXAPIFactory.createWXAPI(this, "wx8b41ad369eba83a9"); + wxApi.registerApp("wx8b41ad369eba83a9"); + ((BaseApp) Utils.getApp()).setWxApi(wxApi); + } + } catch (Exception ignored) { + } + CheckControlUpdateUtil.checkUpdate(this, false); + EventBus.getDefault().post(new DatabaseReadyEvent()); + + if (LCUser.getCurrentUser() == null) { + VipManager.getInstance().controlSdkRefresh(this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() { + @Override + public void onRefreshSuccess() { + Log.d("controlSdkRefresh", "onRefreshSuccess"); + } + + @Override + public void onRefreshFailed(int errorCode) { + Log.d("controlSdkRefresh", "onRefreshFailed--errorCode--" + errorCode); + } + }); + } + + GlobalFlowCenter.Companion.getInstance().onMainActivityInitial(); + } + + // this piece of code is show how to press twice back button to exit App + private long exitTime = 0; + + public void ExitApp() { + if ((System.currentTimeMillis() - exitTime) > 2000) { + ToastUtils.showShort(getString(R.string.press_again_exit)); + exitTime = System.currentTimeMillis(); + } else { + if (((App) Utils.getApp()).isBluetoothConnected) { + if (TotalStation.getInstance().isSupportPowerOff()) { + showPowerOffDialog(); + } else { + finish(); + } + } else { + finish(); + } + } + } + + public void showPowerOffDialog() { + MaterialDialog dialog = new MaterialDialog.Builder(this) + .title(R.string.hint) + .customView(R.layout.dialog_power_off, false) + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + if (((App) Utils.getApp()).isCloseInstrumentAfterExit) { + TotalStation.getInstance().powerOff(); + } + finish(); + } + }) + .positiveText(getString(R.string.confirm)) + .negativeText(getString(R.string.cancel)).build(); + + powerOffCheckbox = dialog.getCustomView().findViewById(R.id.dialog_power_off_checkbox); + powerOffCheckbox.setChecked(((App) Utils.getApp()).isCloseInstrumentAfterExit); + powerOffCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + ((App) Utils.getApp()).isCloseInstrumentAfterExit = isChecked; + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Utils.getApp()); + SharedPreferences.Editor editor = prefs.edit(); + editor.putBoolean("isCloseInstrumentAfterExit", ((App) Utils.getApp()).isCloseInstrumentAfterExit); + editor.apply(); + } + }); + dialog.show(); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (drawerLeft != null && drawerLeft.isDrawerOpen()) { + drawerLeft.closeDrawer(); + return true; + } + + if (mViewPager != null) { + Fragment viewPagerFragment = getViewPagerFragment(this, mViewPager.getId(), mViewPager.getCurrentItem()); + if (viewPagerFragment instanceof InterfaceUtil.ICustomGroup) { + if (((InterfaceUtil.ICustomGroup) viewPagerFragment).isEditModel()) { + ((InterfaceUtil.ICustomGroup) viewPagerFragment).cancelEditModel(); + return true; + } + } + } + ExitApp(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + public static Fragment getViewPagerFragment(AppCompatActivity activity, int viewId, int index) { + String tag = "android:switcher:" + viewId + ":" + index; + return activity.getSupportFragmentManager().findFragmentByTag(tag); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + //add the values which need to be saved from the drawer to the bundle + if (drawerLeft != null) + outState = drawerLeft.saveInstanceState(outState); + //add the values which need to be saved from the accountHeader to the bundle + if (accountHeader != null) + outState = accountHeader.saveInstanceState(outState); + super.onSaveInstanceState(outState); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_activity_main, menu); + menu.findItem(R.id.menu_activity_main_bluetooth).setIcon( + new IconicsDrawable(Utils.getApp()).icon(MaterialDesignIconic.Icon.gmi_bluetooth).color(Color.WHITE).sizeDp(20)); + if (AppChannel.customChannel == AppChannel.CUSTOM_CONTROL_PUBLIC) { + menu.findItem(R.id.menu_activity_main_bound_device_activate).setTitle(R.string.opening_renewal); + } else { + menu.findItem(R.id.menu_activity_main_bound_device_activate).setTitle(R.string.bound_device_activate); + } + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + case R.id.menu_activity_main_bluetooth: + mainActivityUtils.requestBluetoothPermission(); + break; + case R.id.menu_activity_main_bound_device_activate: + showActivateType(); + break; + case R.id.menu_activity_main_settings: + Intent intent4 = new Intent(Utils.getApp(), SettingsActivity.class); + startActivityForResult(intent4, 331); + break; + case R.id.menu_activity_main_more: + openLeftDrawer(); + break; + } + return super.onOptionsItemSelected(item); + } + + /** + * 选择激活方式 + */ + private void showActivateType() { + if (AppChannel.customChannel == AppChannel.CUSTOM_CONTROL_PUBLIC) { + if (LCUser.getCurrentUser() == null) { + Intent intent = new Intent(Utils.getApp(), LoginActivity.class); + intent.putExtra("finishTo", UserInfoActivity.class.getName()); + startActivity(intent); + } else { + startActivity(new Intent(MainActivity.this, UserInfoActivity.class)); + } + } else { + startActivity(new Intent(MainActivity.this, RegisterActivity.class)); + } + } + + @Override + public void onResume() { + super.onResume(); + //如果是从其他Activity返回到MainActivity时,不显示广告,如果是从后台切换出来,检查并显示广告; + //一定放到super.onResume前,否则TopActivity始终是MainActivity,因为App的onActivityResumed在super.onResume内执行 + boolean isShowSplash = ActivityUtils.getTopActivity() instanceof MainActivity && ((App) Utils.getApp()).userAgreementAgree; + if (isShowSplash) { + Log.d("onResume", "onResume"); + showSplash();//查询并显示广告 + } + if (((App) Utils.getApp()).isUserStatusChanged) { + ((App) Utils.getApp()).isUserStatusChanged = false; + if (drawerLeft != null) + drawerLeft.openDrawer(); + if (accountHeader != null) + accountHeader.toggleSelectionList(MainActivity.this); + updateHeaderResult(); + } + //按照设置选项,保持屏幕常亮,放在onResume而不放在onCreate里是因为,用户更改设置后返回主页就要开始常亮了 + boolean isWakeLock = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("key_is_wake_lock", false); + if (isWakeLock) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } else { + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + + SdkUtils.tick(); + EventBus.getDefault().post(new CountDownEvent()); + } + + @Override + public void onPause() { + super.onPause(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + EventBus.getDefault().unregister(this); + + TtsManager.getInstance().stopTts(); + VipManager.getInstance().destroy(); + + SoundPoolUtil.getInstance().onDestroy(); + ((App) Utils.getApp()).isBluetoothReconnect = false; + TotalStation.getInstance().stopAll(); + Device.getInstance().requestDisconnect(); + for (String serviceName : ServiceUtils.getAllRunningServices()) { + ServiceUtils.stopService(serviceName); + } + ActivityUtils.finishAllActivities(); + + GlobalFlowCenter.Companion.getInstance().onMainActivityDestroy(); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(SwitchPageEvent event) { + int type = event.getType(); + try { + int index = 1; + if (type == SwitchPageEvent.TYPE_SWITCH_TO_MEASURE_PAGE_AND_DATA) { + mViewPager.setCurrentItem(index); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(OpenShortUrlEvent event) { + if (event.getShortUrl() != null) { +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", event.getShortUrl()); +// startActivity(intent); + AgentWebActivity.navigation2(MainActivity.this, event.getShortUrl()); + } + } + + public void showTryVipDialog() { + if (TotalStation.getInstance().isSupportMotor() && !VipManager.getInstance().checkReg()) { + LeanCloudConfigLoader.findInBackground("android_control_network_pro_try_switch", instance -> { + if (instance != null && "true".equals(instance.value)) { + if (LCUser.getCurrentUser() != null) { + ServiceDateUtils.getServerDate(new DateUtils.OnServerDateCallBack() { + @Override + public void get(Date serverDate) { + if (VipManager.getInstance().controlLevel == 0) { + new MaterialDialog.Builder(ActivityUtils.getTopActivity()) + .title(R.string.congratulations) + .content("你获得了3天的专业版试用机会,可以驱动马达进行自动观测") + .positiveText("马上试用") + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull @NotNull MaterialDialog dialog, @NonNull @NotNull DialogAction which) { + Date newExpireDate = DateUtils.addDayOfMonth(serverDate, 3, false, true);//多1天是为了显示 + LCUser.getCurrentUser().put("controlLevel", 1); + LCUser.getCurrentUser().put("controlExpireDate", newExpireDate); + LCUser.getCurrentUser().saveInBackground().subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(LCObject avObject) { + VipManager.getInstance().controlSdkRefresh(MainActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() { + @Override + public void onRefreshSuccess() { + new MaterialDialog.Builder(ActivityUtils.getTopActivity()) + .title(R.string.success) + .content("开通成功,当前到期时间为" + DateUtils.toFull(newExpireDate)) + .positiveText(R.string.confirm) + .show(); + } + + @Override + public void onRefreshFailed(int errorCode) { + + } + }); + } + + @Override + public void onError(Throwable e) { + ToastUtils.showShort("开通失败,错误码:" + new LCException(e).getCode()); + } + + @Override + public void onComplete() { + + } + }); + } + }) + .negativeText("取消") + .show(); + } else if (VipManager.getInstance().controlLevel == 1) { + if (!VipManager.getInstance().isControlInExpireDate) + new MaterialDialog.Builder(ActivityUtils.getTopActivity()) + .title(R.string.congratulations) + .content("你获得了7天的专业版试用机会,可以驱动马达自动观测,请联系客服申请开通") + .positiveText("马上申请") + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull @NotNull MaterialDialog dialog, @NonNull @NotNull DialogAction which) { + Intent intent = new Intent(); + intent.setClass(Utils.getApp(), AgentWebActivity.class); + intent.putExtra("short_url", "android_url_business_manager"); + startActivity(intent); + } + }) + .negativeText("取消") + .show(); + } + } + + @Override + public void error(Throwable throwable) { + ToastUtils.showShort(R.string.get_server_date_failed); + } + }); + } else { + new MaterialDialog.Builder(ActivityUtils.getTopActivity()) + .title(R.string.log_in_to_try) + .content("登录后,您将获取3-7天的试用机会,请登录") + .positiveText("登录") + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull @NotNull MaterialDialog dialog, @NonNull @NotNull DialogAction which) { + Intent intent = new Intent(); + intent.setClass(Utils.getApp(), LoginActivity.class); + intent.putExtra("finishTo", UserInfoActivity.class.getName()); + startActivity(intent); + } + }) + .negativeText("取消") + .show(); + } + } + }); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(CountDownEvent event) { + if (cutDownProgressBar != null) { + cutDownProgressBar.setVisibility(View.VISIBLE); + if (!SdkUtils.isRegCodeValidate() && SdkUtils.isVipValidate()) { + int maxProgress = (int) (SdkUtils.availableTimeMax() / 60 / 1000L); + cutDownProgressBar.setMax(maxProgress); + int progress = Math.max((int) (SdkUtils.availableTime() / 60 / 1000L), 0);//可用时间可能小于0 + cutDownProgressBar.setProgress(progress); + if (progress < 60) { + cutDownProgressBar.setPrefix(getString(R.string.remaining_offline_time) + progress + getString(R.string.minute) + " "); + } else { + cutDownProgressBar.setPrefix(getString(R.string.remaining_offline_time) + progress / 60 + getString(R.string.hour) + progress % 60 + getString(R.string.minute) + " "); + } + if (event.isNeedRefresh()) { + VipManager.getInstance().controlSdkRefresh(this, ((App) Utils.getApp()).registerCodeV2, null); + } + if (progress == 240 || progress == 180 || progress == 120 || progress == 60 || (progress > 0 && progress < 60 && progress % 10 == 0)) { + new AlertDialog.Builder(this) + .setTitle(R.string.warning) + .setMessage(getString(R.string.remaining_offline_time) + progress + getString(R.string.minute) + "," + getString(R.string.the_network_reboot_software_can_reset_the_remaining_time_offline)) + .setPositiveButton(R.string.i_know, null) + .show(); + } + if (progress > 240) {//离线时间大于4小时,主题色显示 + cutDownProgressBar.setProgressTextColor(ColorUtil.getColorPrimary(this)); + cutDownProgressBar.setReachedBarColor(ColorUtil.getColorPrimary(this)); + cutDownProgressBar.setUnreachedBarColor(ColorUtil.getColorPrimary(this)); + } else if (progress > 120) {//离线时间2-5小时间显示橙色警告 + cutDownProgressBar.setProgressTextColor(ContextCompat.getColor(this, R.color.md_orange_800)); + cutDownProgressBar.setReachedBarColor(ContextCompat.getColor(this, R.color.md_orange_800)); + cutDownProgressBar.setUnreachedBarColor(ContextCompat.getColor(this, R.color.md_orange_800)); + } else {//离线时间小于2小时红色警告 + cutDownProgressBar.setProgressTextColor(Color.RED); + cutDownProgressBar.setReachedBarColor(Color.RED); + cutDownProgressBar.setUnreachedBarColor(Color.RED); + } + Log.d("cutdownProgressBar", "setProgress" + progress); + } else { + cutDownProgressBar.setVisibility(View.GONE); + } + } + } + + /** + * 教程列表 + */ + public void showTutorialListDialog() { + new MaterialDialog.Builder(this) + .title(R.string.video_tutorial) + .items(new String[]{getString(R.string.bilibili) + , getString(R.string.tencent_video) + , getString(R.string.baidudisk) + , getString(R.string.surveyor_home)}) + .itemsCallback(new MaterialDialog.ListCallback() { + @Override + public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { + switch (which) { + case 0: +// Intent intent1 = new Intent(); +// intent1.setClass(Utils.getApp(), AgentWebActivity.class); +// intent1.putExtra("short_url", "android_url_bilibili_tutorial"); +// startActivity(intent1); + AgentWebActivity.navigation2( + MainActivity.this, "android_url_bilibili_tutorial" + ); + break; + case 1: +// Intent intent2 = new Intent(); +// intent2.setClass(Utils.getApp(), AgentWebActivity.class); +// intent2.putExtra("short_url", "android_url_tencent_video_tutorial"); +// startActivity(intent2); + AgentWebActivity.navigation2( + MainActivity.this, "android_url_tencent_video_tutorial" + ); + break; + case 2: +// Intent intent3 = new Intent(); +// intent3.setClass(Utils.getApp(), AgentWebActivity.class); +// intent3.putExtra("short_url", "android_url_baidu_pan_tutorial"); +// startActivity(intent3); + AgentWebActivity.navigation2( + MainActivity.this, "android_url_baidu_pan_tutorial" + ); + break; + case 3: +// Intent intent4 = new Intent(); +// intent4.setClass(Utils.getApp(), AgentWebActivity.class); +// intent4.putExtra("short_url", "android_url_surveyor_home"); +// startActivity(intent4); + AgentWebActivity.navigation2( + MainActivity.this, "android_url_surveyor_home" + ); + break; + } + } + }).show(); + } + + /** + * 刷新左侧用户信息 + */ + public void updateHeaderResult() { + Log.d("updateHeaderResult", "updateHeaderResult"); + if (drawerLeft == null || accountHeader == null) + return; + for (int i = accountHeader.getProfiles().size() - 1; i >= 0; i--) { + accountHeader.removeProfile(accountHeader.getProfiles().get(i)); + } + + if (LCUser.getCurrentUser() == null || !LCUser.getCurrentUser().isAuthenticated()) { + accountHeader.addProfiles( + new ProfileSettingDrawerItem().withName(getString(R.string.log_in)) + .withIcon(new IconicsDrawable(this).icon(MaterialDesignIconic.Icon.gmi_sign_in).paddingDp(5)) + .withIdentifier(1000).withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { + @Override + public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { + Intent intent = new Intent(Utils.getApp(), LoginActivity.class); + intent.putExtra("finishTo", UserInfoActivity.class.getName()); + startActivity(intent); + return false; + } + })); + } else { + accountHeader.addProfiles(new ProfileSettingDrawerItem().withName(getString(R.string.user_info)).withIcon(new IconicsDrawable(this).icon(MaterialDesignIconic.Icon.gmi_account).paddingDp(5)).withIdentifier(1000).withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { + @Override + public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { + startActivity(new Intent(MainActivity.this, UserInfoActivity.class)); + return false; + } + })); + } + + + updateProfileItem(); + } + + private void updateProfileItem() { + if (LCUser.getCurrentUser() != null) { + String nickname = LCUser.getCurrentUser().getString("nickname"); + LCFile avatarFile = LCUser.getCurrentUser().getLCFile("avatar"); + if (!StringUtils.isEmpty(nickname)) { + ProfileDrawerItem item = new ProfileDrawerItem().withName(nickname).withEmail(LCUser.getCurrentUser().getUsername()).withIdentifier(1003); + if (avatarFile == null) { + item.withIcon(R.drawable.app_logo); + } else { + item.withIcon(avatarFile.getUrl()); + } + accountHeader.addProfiles(item); + } else { + LCObject userProfile = LCUser.getCurrentUser().getLCObject("profile"); + if (userProfile != null) { + userProfile.fetchInBackground().subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(LCObject avObject) { + if (isFinishing()) return; + String nickname = avObject.getString("nickname"); + LCFile avatarFile = avObject.getLCFile("avatar"); + if (!StringUtils.isEmpty(nickname)) { + ProfileDrawerItem item = new ProfileDrawerItem().withName(nickname).withEmail(LCUser.getCurrentUser().getUsername()).withIdentifier(1003); + if (avatarFile == null) { + item.withIcon(R.drawable.app_logo); + } else { + item.withIcon(avatarFile.getUrl()); + } + accountHeader.addProfiles(item); + + //保存到_User,下次不再查Profile + LCUser.getCurrentUser().put("nickname", nickname); + if (avatarFile != null) + LCUser.getCurrentUser().put("avatar", avatarFile); + LCUser.getCurrentUser().saveInBackground().subscribe(); + } + } + + @Override + public void onError(Throwable e) { + } + + @Override + public void onComplete() { + + } + }); + } else { + new LCQuery<>("Profile") + .whereEqualTo("creatorId", LCUser.getCurrentUser().getObjectId()) + .findInBackground() + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(List list) { + if (isFinishing()) return; + if (list != null && !list.isEmpty()) { + String nickname = list.get(0).getString("nickname"); + LCFile avatarFile = list.get(0).getLCFile("avatar"); + if (!StringUtils.isEmpty(nickname)) { + ProfileDrawerItem item = new ProfileDrawerItem().withName(nickname).withEmail(LCUser.getCurrentUser().getUsername()).withIdentifier(1003); + if (avatarFile == null) { + item.withIcon(R.drawable.app_logo); + } else { + item.withIcon(avatarFile.getUrl()); + } + accountHeader.addProfiles(item); + + //保存到_User,下次不再查Profile + LCUser.getCurrentUser().put("nickname", nickname); + if (avatarFile != null) + LCUser.getCurrentUser().put("avatar", avatarFile); + LCUser.getCurrentUser().saveInBackground().subscribe(); + } + } + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } + } + } else { + accountHeader.addProfiles(new ProfileDrawerItem().withEmail(getString(R.string.click_avatar_to_log_in)).withIcon(R.drawable.app_logo).withIdentifier(1003)); + } + } + + /** + * 开启左侧菜单 + */ + public void openLeftDrawer() { + if (drawerLeft != null) + drawerLeft.openDrawer(); + } + + @Override + public void onDeviceConnectLost() { + mainActivityUtils.onDeviceConnectLost(); + } + + @Override + public void onDeviceConnectFailed() { + mainActivityUtils.onDeviceConnectFailed(); + } + + @Override + public void onDeviceConnectSucceed() { + mainActivityUtils.onDeviceConnectSuccess(); + } + + @Override + public void onDeviceConnectNeedOpenBT() { + } + + @Override + public void onDeviceRequestConnect() { + mainActivityUtils.onRequestConnect(); + } + + @Override + public void onDeviceRequestDisconnect() { + + } + + @Override + public void onDeviceRequestSetupChat() { + + } + + @Override + public void onRemindConnectDevice() { + mainActivityUtils.showRemindConnectDeviceDialog(); + } + + private class MyPagerAdapter extends FragmentPagerAdapter { + public MyPagerAdapter(@NonNull FragmentManager fm) { + super(fm); + } + + public MyPagerAdapter(@NonNull FragmentManager fm, int behavior) { + super(fm, behavior); + } + + @NonNull + @Override + public Fragment getItem(int position) { + return mFragments.get(position); + } + + @Override + public int getCount() { + return mFragments.size(); + } + } + + private void restartApplication() { + android.os.Process.killProcess(android.os.Process.myPid()); + } + + private boolean isThemeDark() { + return SettingValueUtil.isThemeDark(); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/MainActivityUtils.java b/app/src/main/java/com/bingce/controlnetwork/activity/MainActivityUtils.java new file mode 100644 index 0000000..31288db --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/MainActivityUtils.java @@ -0,0 +1,439 @@ +package com.bingce.controlnetwork.activity; + +import android.Manifest; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.location.Location; +import android.location.LocationManager; +import android.os.Build; +import android.provider.Settings; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleEventObserver; +import androidx.lifecycle.LifecycleOwner; + +import com.afollestad.materialdialogs.DialogAction; +import com.afollestad.materialdialogs.MaterialDialog; +import com.bingce.AppChannel; +import com.bingce.BaseApp; +import com.bingce.controlnetwork.R; +import com.bingce.device.Device; +import com.bingce.device.enums.ConnectTypeEnum; +import com.bingce.device.enums.DeviceTypeEnum; +import com.bingce.device.service.comm.ble.BleService; +import com.bingce.device.service.comm.emulator.EmulatorService; +import com.bingce.device.service.comm.localgps.LocationService; +import com.bingce.device.service.comm.localgps.NativePositioningService; +import com.bingce.device.service.comm.otg.OTGCommService; +import com.bingce.device.service.comm.socket.SocketCommService; +import com.bingce.device.service.comm.spp.BTService; +import com.bingce.device.ui.ConnectRtkActivity; +import com.bingce.device.ui.ConnectTSActivity; +import com.bingce.device.ui.utils.DeviceUtil; +import com.bingce.device.ui.widget.BCProgressDialog; +import com.bingce.rtk.event.RtkSpeechEvent; +import com.bingce.totalstation.TotalStation; +import com.bingce.totalstation.TsConfig; +import com.bingce.utils.AppCompatActivityProviderUtils; +import com.bingce.utils.IProvider; +import com.bingce.utils.RomUtil; +import com.bingce.utils.SoundPoolUtil; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.utils.Util; +import com.bingce.utils.ValidateUtil; +import com.hjq.permissions.OnPermissionCallback; +import com.hjq.permissions.OnPermissionPageCallback; +import com.hjq.permissions.Permission; +import com.hjq.permissions.XXPermissions; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + +import blankj.utilcode.util.ActivityUtils; +import blankj.utilcode.util.ServiceUtils; +import blankj.utilcode.util.StringUtils; +import blankj.utilcode.util.ToastUtils; +import blankj.utilcode.util.Utils; + +public class MainActivityUtils extends AppCompatActivityProviderUtils { + private BCProgressDialog deviceConnectingProgressDialog; + + public MainActivityUtils(AppCompatActivity activity, IProvider activityIProvider) { + super(activityIProvider); + activity.getLifecycle().addObserver(new LifecycleEventObserver() { + @Override + public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) { + switch (event) { + case ON_CREATE: + EventBus.getDefault().register(MainActivityUtils.this); + SoundPoolUtil.getInstance().initHintSing(activity, SoundPoolUtil.TEST, R.raw.savedone); + break; + case ON_DESTROY: + EventBus.getDefault().unregister(MainActivityUtils.this); + SoundPoolUtil.getInstance().onDestroy(); + break; + } + } + }); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(RtkSpeechEvent event) { + if (!StringUtils.isEmpty(event.getText())) TtsManager.getInstance().speak(event.getText()); + } + + /** + * 连接设备成功后,启动相关服务,因为Ntrip与SN无关,可以在此执行,与SN相关的服务在RtkReceivedSerialNumberEvent事件后执行 + */ + public void onDeviceConnectSuccess() { + if (deviceConnectingProgressDialog != null && deviceConnectingProgressDialog.isShowing()) { + deviceConnectingProgressDialog.dismiss(); + } + + if (!TotalStation.getInstance().isInitDone()) { + TotalStation.getInstance().runnableStart(); + TotalStation.getInstance().init(); + } + + //记录用户联机时手机定位的大概位置 + if (ActivityCompat.checkSelfPermission(/*this*/context(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + LocationManager mLocationManager = ((LocationManager) context().getSystemService(Context.LOCATION_SERVICE)); + if (mLocationManager != null) { + List providers = mLocationManager.getProviders(true); + if (providers.contains(LocationManager.GPS_PROVIDER)) { + Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + if (location != null) { + ((BaseApp) Utils.getApp()).lastPhoneLocation = location.getLatitude() + "," + location.getLongitude(); + Util.putPreference("lastPhoneLocation", ((BaseApp) Utils.getApp()).lastPhoneLocation); + } + } + } + } + } + + + public void onDeviceConnectFailed() { + if (deviceConnectingProgressDialog != null && deviceConnectingProgressDialog.isShowing()) { + deviceConnectingProgressDialog.dismiss(); + ToastUtils.showShort(R.string.device_connect_failed); + } + } + + public void onDeviceConnectLost() { + ToastUtils.showShort(R.string.device_connect_lost); + } + + public void onRequestConnect() { + if (deviceConnectingProgressDialog == null || !deviceConnectingProgressDialog.isShowing()) { + deviceConnectingProgressDialog = new BCProgressDialog.Builder(ActivityUtils.getTopActivity()).title(R.string.connect_device).build(); + deviceConnectingProgressDialog.show(); + } + } + + /** + * 连接蓝牙先请求打开定位权限 + */ + public void requestBluetoothPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && XXPermissions.isGranted(ActivityUtils.getTopActivity(), Permission.BLUETOOTH_CONNECT)) {//S及以后不需要位置权限 + checkConnectLast(); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {//S及以后不需要位置权限,此时只需请求connect权限 + if (XXPermissions.isGranted(ActivityUtils.getTopActivity(), Permission.BLUETOOTH_CONNECT)) { + checkConnectLast(); + } else { + new MaterialDialog.Builder(ActivityUtils.getTopActivity()) + .title(R.string.location_permission) + .content(R.string.bluetooth_need_location_permission) + .canceledOnTouchOutside(false) + .positiveText(R.string.to_allow) + .negativeText(R.string.refuse) + .onPositive((dialog, which) -> { + XXPermissions.with(ActivityUtils.getTopActivity()) + .permission(Permission.BLUETOOTH_CONNECT) + .request(new OnPermissionCallback() { + @Override + public void onGranted(List permissions, boolean all) { + checkConnectLast(); + } + + @Override + public void onDenied(List permissions, boolean never) { + if (never) { + ToastUtils.showLong(R.string.bluetooth_connect_need_permission); + XXPermissions.startPermissionActivity(ActivityUtils.getTopActivity(), permissions, new OnPermissionPageCallback() { + @Override + public void onGranted() { + requestBluetoothPermission(); + } + + @Override + public void onDenied() { + ToastUtils.showLong(R.string.bluetooth_connect_need_permission); + } + }); + } else { + requestBluetoothPermission(); + } + } + }); + }) + .onNegative((dialog, which) -> { + + }).show(); + } + } else {//S以下,需要请求两个权限,位置和Connect权限 + if (XXPermissions.isGranted(ActivityUtils.getTopActivity(), Permission.ACCESS_FINE_LOCATION, Permission.BLUETOOTH_CONNECT)) { + checkConnectLast(); + } else { + new MaterialDialog.Builder(ActivityUtils.getTopActivity()) + .title(R.string.location_permission) + .content(R.string.bluetooth_need_location_permission) + .canceledOnTouchOutside(false) + .positiveText(R.string.to_allow) + .negativeText(R.string.refuse) + .onPositive((dialog, which) -> { + XXPermissions.with(ActivityUtils.getTopActivity()) + .permission(Permission.ACCESS_FINE_LOCATION, Permission.BLUETOOTH_CONNECT) + .request(new OnPermissionCallback() { + @Override + public void onGranted(List permissions, boolean all) { + if (all) { + checkConnectLast(); + } else { + requestBluetoothPermission(); + } + } + + @Override + public void onDenied(List permissions, boolean never) { + if (never) { + ToastUtils.showLong(R.string.bluetooth_connection_requires_positioning_permission_please_turn_it_on_manually); + XXPermissions.startPermissionActivity(ActivityUtils.getTopActivity(), permissions, new OnPermissionPageCallback() { + @Override + public void onGranted() { + requestBluetoothPermission(); + } + + @Override + public void onDenied() { + ToastUtils.showLong(R.string.bluetooth_connect_need_permission); + } + }); + } else { + requestBluetoothPermission(); + } + } + }); + }) + .onNegative((dialog, which) -> { + + }).show(); + } + } + } + + /** + * 检查权限 + */ + public void requestPhonePermission() { + if (!XXPermissions.isGranted(ActivityUtils.getTopActivity(), Permission.READ_PHONE_STATE)) { + long lastReadPhoneStateDeniedTime = Util.getLongPreference("lastReadPhoneStateDeniedTime", 0L); + if (System.currentTimeMillis() - lastReadPhoneStateDeniedTime > 48 * 60 * 60 * 1000L) {//每48小时提示一次 + new MaterialDialog.Builder(ActivityUtils.getTopActivity()) + .title(R.string.mobile_phone_permissions) + .content(R.string.verify_imei_imsi_code_to_prevent_account_theft) + .canceledOnTouchOutside(false) + .positiveText(R.string.to_allow) + .negativeText(R.string.refuse) + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + XXPermissions.with(ActivityUtils.getTopActivity()) + .permission(Permission.READ_PHONE_STATE) + .request(new OnPermissionCallback() { + @Override + public void onGranted(List permissions, boolean all) { + } + + @Override + public void onDenied(List permissions, boolean never) { + if (never) { + ToastUtils.showShort(R.string.manually_enable_the_phone_state_permission_to_bind_hardware_devices); + } + Util.putPreference("lastReadPhoneStateDeniedTime", System.currentTimeMillis()); + } + }); + } + }) + .onNegative(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + Util.putPreference("lastReadPhoneStateDeniedTime", System.currentTimeMillis()); + } + }).show(); + } + } + } + + public void showRemindConnectDeviceDialog() { + new MaterialDialog.Builder(ActivityUtils.getTopActivity()) + .title(R.string.hint) + .content(R.string.no_instrument_connected) + .positiveText(R.string.connect) + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + checkConnectLast(); + } + }) + .negativeText(R.string.cancel) + .show(); + } + + + public void checkConnectLast() { + if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_SPP) { + if (!ServiceUtils.isServiceRunning(BTService.class.getName())) { + ServiceUtils.startService(BTService.class); + } + } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_BLE) { + if (!ServiceUtils.isServiceRunning(BleService.class.getName())) { + ServiceUtils.startService(BleService.class); + } + } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_QXBT) { + //千寻RTK需要GnssServer连接蓝牙 + } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_HOTSPOT) { + if (!ServiceUtils.isServiceRunning(SocketCommService.class.getName())) { + ServiceUtils.startService(SocketCommService.class); + } + } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_OTG) { + if (!ServiceUtils.isServiceRunning(OTGCommService.class.getName())) { + ServiceUtils.startService(OTGCommService.class); + } + } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_TPCOM) { + if (!ServiceUtils.isServiceRunning(SocketCommService.class.getName())) { + ServiceUtils.startService(SocketCommService.class); + } + } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_PHONE_LOCATION) { + if (!ServiceUtils.isServiceRunning(NativePositioningService.class.getName())) { + ServiceUtils.startService(NativePositioningService.class); + } + } else if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_EMULATOR) { + if (!ServiceUtils.isServiceRunning(EmulatorService.class.getName())) { + ServiceUtils.startService(EmulatorService.class); + } + } + if (!Device.getInstance().isDeviceConnected()) { + if (!"".equals(Device.getInstance().deviceBlueName)) { + String instrumentInfo = ActivityUtils.getTopActivity().getString(R.string.instrument_name) + ":" + Device.getInstance().deviceBlueName + "\n" + ActivityUtils.getTopActivity().getString(R.string.instrument_type_name) + ":" + Device.getInstance().deviceBrand; + new MaterialDialog.Builder(ActivityUtils.getTopActivity()) + .title(R.string.quick_connect) + .content(instrumentInfo) + .positiveText(Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS ? R.string.connect_and_setup_station : R.string.connect) + .negativeText(R.string.config) + .neutralText(R.string.switch_instrument) + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_HOTSPOT) { + startHotspotComm(); + } else { + Device.getInstance().requestConnect(); + ToastUtils.showShort(R.string.connecting_please_wait); + } + } + }).onNegative(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + Intent intent; + if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { + intent = new Intent(ActivityUtils.getTopActivity(), ConnectTSActivity.class); + } else { + intent = new Intent(ActivityUtils.getTopActivity(), ConnectRtkActivity.class); + } + intent.putExtra("customChannel", AppChannel.customChannel); + ActivityUtils.getTopActivity().startActivity(intent); + } + }).onNeutral(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + chooseInstrumentType(); + } + }).show(); + } else { + chooseInstrumentType(); + } + } else { + if (Device.getInstance().connectType == ConnectTypeEnum.CONNECT_TYPE_PHONE_LOCATION) { + ToastUtils.showShort(R.string.native_rtk_is_running); + } else { + Intent intent; + if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { + intent = new Intent(ActivityUtils.getTopActivity(), ConnectTSActivity.class); + } else { + intent = new Intent(ActivityUtils.getTopActivity(), ConnectRtkActivity.class); + } + intent.putExtra("customChannel", AppChannel.customChannel); + ActivityUtils.getTopActivity().startActivity(intent); + } + } + } + + private void chooseInstrumentType() { + Intent intent = new Intent(ActivityUtils.getTopActivity(), ConnectTSActivity.class); + intent.putExtra("customChannel", AppChannel.customChannel); + ActivityUtils.getTopActivity().startActivity(intent); + } + + + /** + * 开启wifi通信 + */ + private void startHotspotComm() { + if (!ValidateUtil.isIPAddress(TsConfig.getInstance().getIp())) { + ToastUtils.showShort(R.string.please_input_correct_ip); + return; + } + if (TsConfig.getInstance().getPort() < 1024 || TsConfig.getInstance().getPort() > 65535) { + ToastUtils.showShort(R.string.please_input_correct_port); + return; + } + if (DeviceUtil.isWifiApOpen()) { + ServiceUtils.stopService(EmulatorService.class); + ServiceUtils.stopService(LocationService.class); + ServiceUtils.stopService(NativePositioningService.class); + ServiceUtils.stopService(BTService.class); + ServiceUtils.stopService(BleService.class); + ServiceUtils.startService(SocketCommService.class); + ThreadPoolUtil.execute(new Runnable() { + @Override + public void run() { + Device.getInstance().requestConnect(); + } + }, 200); + } else { + ToastUtils.showShort(R.string.please_open_hotspot_first); + //打开网络共享与热点设置页面 + if (RomUtil.isOppo() || RomUtil.isLenove() || RomUtil.isGionee()) { + //OPPO系统系统特殊,会让在Manifest.xml声明Settings$TetherSettingsActivity,现在让用户自己找热点界面,并开启 + ToastUtils.showShort(R.string.find_tether_setting_and_open); + ActivityUtils.getTopActivity().startActivity(new Intent(Settings.ACTION_SETTINGS)); + } else { + Intent intent = new Intent(); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$TetherSettingsActivity"); + intent.setComponent(comp); + ActivityUtils.getTopActivity().startActivity(intent); + } + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/NotificationActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/NotificationActivity.java new file mode 100644 index 0000000..9e087ee --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/NotificationActivity.java @@ -0,0 +1,250 @@ +package com.bingce.controlnetwork.activity; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.webkit.WebResourceRequest; +import android.webkit.WebView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; + +import com.bingce.data.sync.utils.LeanCloudConfigLoader; +import com.bingce.utils.ClipboardUtils; +import com.bingce.utils.StringUtil; +import com.just.agentweb.AgentWeb; +import com.just.agentweb.DefaultWebClient; +import com.just.agentweb.WebChromeClient; +import com.just.agentweb.WebViewClient; + +import org.polaric.colorful.ColorfulActivity; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.R; + +/** + * Created by cenxiaozhong on 2017/5/26. + *

+ * source code https://github.com/Justson/AgentWeb + */ + +public class NotificationActivity extends ColorfulActivity { + protected AgentWeb mAgentWeb; + private LinearLayout mLinearLayout; + private Toolbar mToolbar; + private TextView mTitleTextView; + + @SuppressLint("SourceLockedOrientationActivity") + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_agentweb_base); + + mLinearLayout = this.findViewById(R.id.container); + mToolbar = this.findViewById(R.id.toolbar); + mToolbar.setTitle(""); + mToolbar.setNavigationIcon(R.mipmap.icon_close_x); + mTitleTextView = this.findViewById(R.id.toolbar_title); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + mToolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + mAgentWeb = AgentWeb.with(this) + .setAgentWebParent(mLinearLayout, new LinearLayout.LayoutParams(-1, -1)) + .useDefaultIndicator() + .setWebChromeClient(mWebChromeClient) + .setWebViewClient(mWebViewClient) + .setMainFrameErrorView(R.layout.agentweb_error_page, -1) + .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK) + .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.ASK)//打开其他应用时,弹窗咨询用户是否前往其他应用 + .interceptUnkownUrl() //拦截找不到相关页面的Scheme + .createAgentWeb() + .ready() + .go(getUrl()); + + mAgentWeb.getWebCreator().getWebView().getSettings().setSupportZoom(true); + mAgentWeb.getWebCreator().getWebView().getSettings().setBuiltInZoomControls(true); + mAgentWeb.getWebCreator().getWebView().getSettings().setDisplayZoomControls(false); + mAgentWeb.getWebCreator().getWebView().getSettings().setUseWideViewPort(true); + + LeanCloudConfigLoader.findInBackground("notificationUrl", instance -> { +// new LCQuery<>("Configuration") +// .whereEqualTo("name", "notificationUrl") +// .limit(1) +// .findInBackground().subscribe(new Observer>() { +// @Override +// public void onSubscribe(Disposable d) { +// +// } +// +// @Override +// public void onNext(List avObjects) { + if (isFinishing()) return; + if (/*avObjects != null && !avObjects.isEmpty() && avObjects.get(0).getString("value") != null*/instance != null && StringUtil.isNotEmpty(instance.value)) { + String url = /*avObjects.get(0).getString("value")*/instance.value; + mAgentWeb.getUrlLoader().loadUrl(url); + } else { + mAgentWeb.getUrlLoader().loadUrl("https://www.bingce.com"); + } +// } +// +// @Override +// public void onError(Throwable e) { +// +// } +// +// @Override +// public void onComplete() { +// +// } + }); + } + + private final WebViewClient mWebViewClient = new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + return super.shouldOverrideUrlLoading(view, request); + } + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + //do you work + Log.i("Info", "AgentWebActivity onPageStarted"); + } + }; + private final WebChromeClient mWebChromeClient = new WebChromeClient() { + @Override + public void onReceivedTitle(WebView view, String title) { + super.onReceivedTitle(view, title); + if (mTitleTextView != null) { + mTitleTextView.setText(title); + } + } + }; + + public String getUrl() { + return null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_activity_agentweb, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + // true表示AgentWeb处理了该事件 + if (!mAgentWeb.back()) { + finish(); + } + break; + case R.id.refresh: + if (mAgentWeb != null) { + mAgentWeb.getUrlLoader().reload(); // 刷新 + } + break; + case R.id.copy_url: + if (mAgentWeb != null) { + ClipboardUtils.copyText(mAgentWeb.getWebCreator().getWebView().getUrl()); + ToastUtils.showShort(R.string.copy_success); + } + break; + case R.id.clean: + toCleanWebCache(); + break; + case R.id.open_with_broswer: + if (mAgentWeb != null) { + openBrowser(mAgentWeb.getWebCreator().getWebView().getUrl()); + } + break; + } + return super.onOptionsItemSelected(item); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (mAgentWeb.handleKeyEvent(keyCode, event)) { + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + protected void onPause() { + mAgentWeb.getWebLifeCycle().onPause(); + super.onPause(); + + } + + @Override + protected void onResume() { + mAgentWeb.getWebLifeCycle().onResume(); + super.onResume(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + Log.i("Info", "onResult:" + requestCode + " onResult:" + resultCode); + super.onActivityResult(requestCode, resultCode, data); + } + + + @Override + protected void onDestroy() { + super.onDestroy(); + //mAgentWeb.destroy(); + mAgentWeb.getWebLifeCycle().onDestroy(); + } + + /** + * 清除 WebView 缓存 + */ + private void toCleanWebCache() { + if (this.mAgentWeb != null) { + //清理所有跟WebView相关的缓存 ,数据库, 历史记录 等。 + this.mAgentWeb.clearWebCache(); + ToastUtils.showShort("已清理缓存"); + //清空所有 AgentWeb 硬盘缓存,包括 WebView 的缓存 , AgentWeb 下载的图片 ,视频 ,apk 等文件。 +// AgentWebConfig.clearDiskCache(this.getContext()); + } + } + + /** + * 打开浏览器 + * + * @param targetUrl 外部浏览器打开的地址 + */ + private void openBrowser(String targetUrl) { + if (TextUtils.isEmpty(targetUrl) || targetUrl.startsWith("file://")) { + ToastUtils.showShort(targetUrl + " 该链接无法使用浏览器打开。"); + return; + } + Intent intent = new Intent(); + intent.setAction("android.intent.action.VIEW"); + Uri mUri = Uri.parse(targetUrl); + intent.setData(mUri); + startActivity(intent); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/SettingsActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/SettingsActivity.java new file mode 100644 index 0000000..cfd75c1 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/SettingsActivity.java @@ -0,0 +1,275 @@ +package com.bingce.controlnetwork.activity; + + +import android.annotation.SuppressLint; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.os.Bundle; +import android.view.MenuItem; +import android.view.WindowManager; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.Fragment; +import androidx.preference.ListPreference; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.SwitchPreferenceCompat; + +import com.bingce.AppChannel; +import com.bingce.controlapphelper.model.Unit; +import com.bingce.controlnetwork.App; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.controller.KeyEventAction; + +import org.polaric.colorful.ColorPickerPreference; +import org.polaric.colorful.Colorful; +import org.polaric.colorful.ColorfulActivity; + +/** + * 设置页面 + */ +public class SettingsActivity extends ColorfulActivity { + private Toolbar mToolbar; + + @SuppressLint("SourceLockedOrientationActivity") + @Override + protected void onCreate(Bundle savedInstanceState) { + App app = App.getApp(); + if (app.isLandscape()) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + } else { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_settings); + mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + if (savedInstanceState == null) { + getSupportFragmentManager().beginTransaction() + .add(R.id.activity_settings_content, createSettingFragment()) + .commit(); + } + } + + private Fragment createSettingFragment() { + return new SettingsFragment(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + } + return super.onOptionsItemSelected(item); + } + + public static class SettingsFragment extends PreferenceFragmentCompat { + private SwitchPreferenceCompat nightModePrefs; + private ColorPickerPreference themePrimaryColor, themeAccentColor; + + private ListPreference ttsSpeakTimes; + private ListPreference length_prefs, angle_prefs, display_unit_prefs; + private ListPreference volume_plus_prefs, volume_minus_prefs; + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferencesFromResource(R.xml.prefs, rootKey); + + nightModePrefs = findPreference("key_is_night_mode"); + themePrimaryColor = findPreference("key_theme_primary_color"); + themeAccentColor = findPreference("key_theme_accent_color"); + + ttsSpeakTimes = findPreference("key_tts_speak_times"); + + length_prefs = findPreference("key_length_accuracy"); + angle_prefs = findPreference("key_angle_accuracy"); + display_unit_prefs = findPreference("key_unit"); + + volume_plus_prefs = findPreference("key_volume_plus_function"); + volume_minus_prefs = findPreference("key_volume_minus_function"); + + //设置概要 + ttsSpeakTimes.setSummary(ttsSpeakTimes.getEntry()); + + length_prefs.setSummary(length_prefs.getEntry()); + angle_prefs.setSummary(angle_prefs.getEntry()); + display_unit_prefs.setSummary(display_unit_prefs.getEntry()); + + volume_plus_prefs.setSummary(volume_plus_prefs.getEntry()); + volume_minus_prefs.setSummary(volume_minus_prefs.getEntry()); + + nightModePrefs.setOnPreferenceChangeListener((preference, newValue) -> { + Colorful.config(App.getApp()).dark((Boolean) newValue).apply(); + new AlertDialog.Builder(getActivity()) + .setMessage(R.string.please_restart_to_apply_new_theme) + .setPositiveButton(R.string.confirm, null) + .setOnDismissListener(dialogInterface -> { + Intent intent = new Intent(); + intent.putExtra("isThemeChanged", true); + getActivity().setResult(RESULT_OK, intent); + getActivity().finish(); + }).show(); + return true; + }); + + + //主色 + themePrimaryColor.setOnPreferenceChangeListener((preference, newValue) -> { + new AlertDialog.Builder(getActivity()) + .setMessage(R.string.please_restart_to_apply_new_theme) + .setPositiveButton(R.string.confirm, null) + .setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialogInterface) { + Intent intent = new Intent(); + intent.putExtra("isThemeChanged", true); + getActivity().setResult(RESULT_OK, intent); + getActivity().finish(); + } + }).show(); + return true; + }); + //配色 + themeAccentColor.setOnPreferenceChangeListener((preference, newValue) -> { + new AlertDialog.Builder(getActivity()) + .setMessage(R.string.please_restart_to_apply_new_theme) + .setPositiveButton(R.string.confirm, null) + .setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialogInterface) { + Intent intent = new Intent(); + intent.putExtra("isThemeChanged", true); + getActivity().setResult(RESULT_OK, intent); + getActivity().finish(); + } + }).show(); + return true; + }); + + ttsSpeakTimes.setOnPreferenceChangeListener((preference, newValue) -> { + switch (String.valueOf(newValue)) { + case "0": + ttsSpeakTimes.setSummary("只播报一次"); + break; + case "1": + ttsSpeakTimes.setSummary("连续播报两次"); + break; + case "2": + ttsSpeakTimes.setSummary("连续播报三次"); + break; + } + return true; + }); + + + length_prefs.setOnPreferenceChangeListener((preference, newValue) -> { + switch (String.valueOf(newValue)) { + case "0": + length_prefs.setSummary("1"); + break; + case "1": + length_prefs.setSummary("0.1"); + break; + case "2": + length_prefs.setSummary("0.01"); + break; + case "3": + length_prefs.setSummary("0.001"); + break; + case "4": + length_prefs.setSummary("0.0001"); + break; + } + return true; + }); + angle_prefs.setOnPreferenceChangeListener((preference, newValue) -> { + switch (String.valueOf(newValue)) { + case "0": + angle_prefs.setSummary("0°00′00″"); + break; + case "1": + angle_prefs.setSummary("0°00′00.0″"); + break; + case "2": + angle_prefs.setSummary("0°00′00.00″"); + break; + } + return true; + }); + + display_unit_prefs.setOnPreferenceChangeListener((preference, newValue) -> { + switch (String.valueOf(newValue)) { + case Unit.UNIT_M://米 + display_unit_prefs.setSummary("m"); + break; + case Unit.UNIT_CM://厘米 + display_unit_prefs.setSummary("cm"); + break; + case Unit.UNIT_MM://毫米 + display_unit_prefs.setSummary("mm"); + break; + case Unit.UNIT_AUTO://自动 + display_unit_prefs.setSummary(R.string.auto); + break; + } + return true; + }); + + volume_plus_prefs.setOnPreferenceChangeListener((preference, newValue) -> { + setKeyEvent(newValue, volume_plus_prefs); + return true; + }); + volume_minus_prefs.setOnPreferenceChangeListener((preference, newValue) -> { + setKeyEvent(newValue, volume_minus_prefs); + return true; + }); + + + if (AppChannel.customChannel != AppChannel.CUSTOM_CONTROL_PUBLIC) { + //主配色隐藏 + themePrimaryColor.setVisible(false); + themeAccentColor.setVisible(false); + } + + } + + + private void setKeyEvent(Object newValue, ListPreference volume_minus_prefs) { + switch (String.valueOf(newValue)) { + case KeyEventAction.NONE: + volume_minus_prefs.setSummary("无"); + break; + case KeyEventAction.CAL: + volume_minus_prefs.setSummary("计算"); + break; + case KeyEventAction.SURVEY: + volume_minus_prefs.setSummary("观测"); + break; + case KeyEventAction.RECORD: + volume_minus_prefs.setSummary("记录"); + break; + case KeyEventAction.LAST: + volume_minus_prefs.setSummary("上一点"); + break; + case KeyEventAction.NEXT: + volume_minus_prefs.setSummary("下一点"); + break; + case KeyEventAction.SURVEY_NO_SEND: + volume_minus_prefs.setSummary("观测后不发送结果"); + break; + case KeyEventAction.SURVEY_AND_RECORD: + volume_minus_prefs.setSummary("观测并记录"); + break; + } + } + + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/SplashActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/SplashActivity.java new file mode 100644 index 0000000..9a777ab --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/SplashActivity.java @@ -0,0 +1,231 @@ +package com.bingce.controlnetwork.activity; + +import static com.king.app.updater.util.AppUtils.getPackageInfo; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import androidx.annotation.Nullable; + +import com.bingce.file.FileOperator; +import com.bingce.path.PathManager; +import com.bingce.utils.NetworkUtil; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.zip.ZipUtil; + +import org.polaric.colorful.ColorfulActivity; + +import java.io.File; +import java.io.FileNotFoundException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +import cn.leancloud.LCFile; +import cn.leancloud.LCObject; +import cn.leancloud.LCQuery; + +import com.bingce.controlnetwork.databinding.ActivitySplashBinding; + +/** + * 欢迎页 + */ +@SuppressLint("CustomSplashScreen") +public class SplashActivity extends ColorfulActivity { + + private static final String CODE_NO_UPLOAD = "0"; + private static final String CODE_UPLOAD_COMPARE_SMALL_WITH_FIRST = "1"; + private static final String CODE_UPLOAD_COMPARE_SMALL_WITHOUT_FIRST = "2"; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +// getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + ActivitySplashBinding binding = ActivitySplashBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + startCopyDbFileToCache(); + } + + private void startCopyDbFileToCache() { + ThreadPoolUtil.execute(() -> { + try { + File copyFolder = PathManager.appDocumentFolder(); + File[] files = copyFolder.listFiles(); + List collectFileList = null; + if (files != null) { + collectFileList = new ArrayList<>(Arrays.asList(files)); + } + + if (collectFileList != null && !collectFileList.isEmpty()) { + + SimpleDateFormat simple = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()); + String fileName = "导线助手数据备份_" + "_" + getVersionName() + "_" + simple.format(new Date()); + File zipTartFile = new File(copyFolder, fileName + ".zip"); + boolean zip = ZipUtil.zip(zipTartFile, collectFileList); + + if (zip) { + //获取上一次备份的文件 + File lastFile = getBeforeTargetFile(targetFolder()); + //备份文件 + File targetFile = new File(targetFolder().getAbsolutePath(), fileName); + boolean isCopySuccess = FileOperator.copyFile(zipTartFile.getAbsolutePath(), targetFile.getAbsolutePath()); + //无论备份成功或者失败都删除压缩后的文件 + zipTartFile.delete(); + if (isCopySuccess) { + //delete多余文件 + deleteRemainCacheFile(lastFile, targetFile); + + if (NetworkUtil.isNetworkAvailable(SplashActivity.this)) { + String code = queryUploadConfig(); + checkUpload(code, lastFile, targetFile); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + goMainActivity(); + } + }); + } + + /** + * 文件个数大于3就删除 + * + * @param lastFile + * @param targetFile + */ + private void deleteRemainCacheFile(File lastFile, File targetFile) { + File file = targetFolder(); + if (file != null) { + File[] files = file.listFiles(); + if (files != null && files.length > 3) { + File deleteFile = null; + for (File fileEach : files) { + String eachName = fileEach.getName(); + if (eachName.equals(getFileName(lastFile)) || eachName.equals(getFileName(targetFile))) { + continue; + } + if (deleteFile != null && deleteFile.lastModified() > fileEach.lastModified()) { + deleteFile = fileEach; + } + if (deleteFile == null) { + deleteFile = fileEach; + } + } + if (deleteFile != null) { + deleteFile.delete(); + } + } + } + } + + private String getFileName(File file) { + if (file != null) { + return file.getName(); + } + return null; + } + + /** + * 导线助手是否自动上传可能错误的数据库 + * 0.不上传 + * 1.比上次小就上传上次备份数据;但是如果是首次备份,也将该备份上传 + * 2.比上次小就上传上次备份数据;如果是首次备份,不会将该备份上传 + */ + private void checkUpload(String code, File lastFile, File targetFile) throws FileNotFoundException { + if (CODE_NO_UPLOAD.equals(code)) { + //不上传 + } else if (CODE_UPLOAD_COMPARE_SMALL_WITH_FIRST.equals(code)) { + if (compareSmall(lastFile, targetFile)) { + uploadFile(lastFile); + } else if (lastFile == null) { + uploadFile(targetFile); + } + } else if (CODE_UPLOAD_COMPARE_SMALL_WITHOUT_FIRST.equals(code) && compareSmall(lastFile, targetFile)) { + uploadFile(lastFile); + } + } + + /** + * 是否比上次小 + * + * @param lastFile + * @param targetFile + * @return + */ + private boolean compareSmall(File lastFile, File targetFile) { + return lastFile != null && targetFile.length() < lastFile.length() / 2; + } + + /** + * 获取上次备份的文件 + * + * @param fileFolder + * @return + */ + private File getBeforeTargetFile(File fileFolder) { + File targetFile = null; + if (fileFolder != null) { + File[] files = fileFolder.listFiles(); + if (files != null) { + for (File eachFile : files) { + if (targetFile == null || targetFile.lastModified() < eachFile.lastModified()) { + targetFile = eachFile; + } + } + } + } + return targetFile; + } + + /** + * 上传leanCloud文件 + */ + private void uploadFile(File zipTartFile) throws FileNotFoundException { + Log.d("hwhw", "数据库备份文件上传LeanCloud"); + LCFile lcFile = LCFile.withAbsoluteLocalPath(zipTartFile.getName(), zipTartFile.getAbsolutePath()); + lcFile.save(); + } + + private void goMainActivity() { + startActivity(new Intent(this, MainActivity.class)); + finish(); + } + + + public File targetFolder() { + File cacheFolder = getCacheDir(); + File targetFolder = new File(cacheFolder, "dbBackUp"); + if (!targetFolder.exists()) { + targetFolder.mkdirs(); + } + return targetFolder; + } + + private String getVersionName() { + try { + return getPackageInfo(this).versionName; + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + private String queryUploadConfig() { + List avObjects = new LCQuery<>("Configuration").whereEqualTo("name", "ControlAppAutoUploadErrorDatabase") + .limit(1).find(); + if (avObjects != null && !avObjects.isEmpty() && avObjects.get(0).getString("value") != null) { + return avObjects.get(0).getString("value"); + } + return CODE_NO_UPLOAD; + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/backup/AbstractBackupExportActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/backup/AbstractBackupExportActivity.java new file mode 100644 index 0000000..a4f5b85 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/backup/AbstractBackupExportActivity.java @@ -0,0 +1,266 @@ +package com.bingce.controlnetwork.activity.backup; + +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; + +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.appcompat.widget.AppCompatTextView; + +import com.afollestad.materialdialogs.MaterialDialog; +import com.bingce.controlapphelper.datasource.database.SurveyorDataBase; +import com.bingce.controlapphelper.util.CheckStorageUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.ActivityExportLayoutBinding; +import com.bingce.file.DownloadFileWriter; +import com.bingce.file.FileOperator; +import com.bingce.path.PathManager; +import com.bingce.utils.AsynchronousHelper; +import com.bingce.utils.FileUtil; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.zip.ZipUtil; +import com.github.ybq.android.spinkit.SpinKitView; + +import org.polaric.colorful.ColorfulActivity; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +import blankj.utilcode.util.StringUtils; +import blankj.utilcode.util.ToastUtils; + +public abstract class AbstractBackupExportActivity extends ColorfulActivity implements AsynchronousHelper.IDelegate { + + public static final String BACKUP_NAME = "导线助手数据"; + public static final String FOLDER_DADA_DATABASES = "dada_databases"; + public static final String FOLDER_DATA_FILE_PROJECT = "data_file_project"; + public static final String FOLDER_ANDROID = "android"; + public static final String FOLDER_SDCARD = "sdcard"; + public static final String BACKUP_TXT = "backup.txt"; + + + private final AsynchronousHelper asynchronousHelper = new AsynchronousHelper(this); + private File zipFile = null; + + protected abstract String tipsString(); + + private ActivityExportLayoutBinding binding; + + @Override + final protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityExportLayoutBinding.inflate(getLayoutInflater()); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + setContentView(binding.getRoot()); + binding.shareButton.setOnClickListener(v -> doCollect()); + binding.progressText.setText(tipsString()); + } + + protected abstract String applicationId(); + + protected abstract String zipFileName(String dateString, String projectName); + + private void doCollect() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //如果是>=Q版本,不需要申请权限 + doExport(); + } else { //如果是低于Q版本,则先申请存储权限 + //检测是否有写权限 + requestStoragePermission(); + } + } + + public void requestStoragePermission() { + CheckStorageUtil.check(this, this::doExport); + } + + private void doExport() { + if (zipFile == null) { + startCollect(); + } else { + FileOperator.shareFile(this, zipFile, /*BuildConfig.APPLICATION_ID*/applicationId()); + } + } + + private void startCollect() { +// + binding.progressText.setText(""); + asynchronousHelper.start(); + binding.shareButton.setEnabled(false); + binding.spinKit.setVisibility(View.VISIBLE); + binding.tvCompleted.setVisibility(View.GONE); + ThreadPoolUtil.execute(() -> { + + File packageFile = getFilesDir().getParentFile(); + + //1 + File database1 = new File(packageFile, "databases"); + File[] files = database1.listFiles(); + List dataDatabasesFiles = getDbListFiles(files); + //2 + File file2 = new File(PathManager.appFolder(), "NOPROJECT"); + File[] files2 = file2.listFiles(); + List dataProjectFiles = getDbListFiles(files2); + //3 + File file3 = PathManager.appDocumentFolder(); + File[] files3 = file3.listFiles(); + List androidFiles = getDbListFiles(files3); + //4 + File file4 = new File(FileUtil.getSDPath(), "导线助手"); + File[] files4 = file4.listFiles(); + List sdFiles = getDbListFiles(files4); + + File fileTargetP = new File(PathManager.appCacheFolder(this), BACKUP_NAME); + FileUtil.deleteDir(fileTargetP); + + File fileTxt = new File(fileTargetP, "backup.txt"); + FileUtil.writeString(FOLDER_ANDROID, fileTxt); + + copyFile(dataDatabasesFiles, new File(fileTargetP, FOLDER_DADA_DATABASES)); + copyFile(dataProjectFiles, new File(fileTargetP, FOLDER_DATA_FILE_PROJECT)); + copyFile(androidFiles, new File(fileTargetP, FOLDER_ANDROID)); + copyFile(sdFiles, new File(fileTargetP, FOLDER_SDCARD)); + + SimpleDateFormat simple = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()); + String fileName = zipFileName(simple.format(new Date()), ""); + File target = new File(fileTargetP, fileName + ".zip"); + List list = new ArrayList<>(); + list.add(fileTargetP); + boolean zip = ZipUtil.zip(target, list); + Log.d("hwhw", "备份是否ok" + zip); + if (zip) { + zipFile = target; + } + asynchronousHelper.completed(); + }); + } + + @Override + public void onBackPressed() { + if (asynchronousHelper.isWorking()) { + ToastUtils.showShort("数据收集中,请稍候。"); + return; + } + super.onBackPressed(); + } + + public static void start(Context context, Class clz) { + start(context, clz, null); + } + + private static final String KEY_PROJECT_NAME = "key_project_name"; + + public static void start(Context context, Class clz, String projectName) { + Intent intent = new Intent(context, clz); + if (!StringUtils.isEmpty(projectName)) { + intent.putExtra(KEY_PROJECT_NAME, projectName); + } + context.startActivity(intent); + } + + @Override + public void onUpdateProgress(String msg) { + String string = binding.progressText.getText().toString(); + binding.progressText.setText(string + "\n" + msg); + binding.scrollView.post(() -> binding.scrollView.fullScroll(View.FOCUS_DOWN)); + } + + @Override + public void onCompleted() { + if (zipFile == null) { + return; + } + if (isDestroyed() || isFinishing()) { + return; + } + Button shareButton = findViewById(R.id.share_button); + if (shareButton != null) { + shareButton.setEnabled(true); + shareButton.setText(R.string.share); + } + SpinKitView spinKitView = findViewById(R.id.spin_kit); + if (spinKitView != null) { + spinKitView.setVisibility(View.INVISIBLE); + } + AppCompatTextView completeTv = findViewById(R.id.tv_completed); + if (completeTv != null) { + completeTv.setText(Tools.getString(R.string.collection_completed)); + completeTv.setVisibility(View.VISIBLE); + } + //将文件存储到download中 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + String tipsString; + if (DownloadFileWriter.writeHigherQ(this, zipFile)) { + tipsString = "数据备份完毕,存储在根目录「Download\\" + zipFile.getName() + "」压缩包中."; + } else { + tipsString = "数据备份完毕,请存放到安全位置以便日后恢复."; + } + //弾框提示 + showDialog(this, applicationId(), tipsString, zipFile); + } else { + File resultFile = DownloadFileWriter.writeLowerQ(zipFile); + String tipsString; + if (resultFile != null) { + tipsString = "数据备份完毕,存储在「" + resultFile.getAbsolutePath() + "」压缩包中."; + } else { + tipsString = "数据备份完毕,请存放到安全位置以便日后恢复."; + } + showDialog(this, applicationId(), tipsString, zipFile); + } + } + + private static void showDialog(Context context, String applicationId, String title, File zipFile) { + //弾框提示 + new MaterialDialog.Builder(context).title(Tools.getString(R.string.notice)) + .content(title) + .positiveText(R.string.send_to) + .negativeText(R.string.cancel) + .cancelable(false) + .onPositive((dialog, which) -> FileOperator.shareFile(context, zipFile, /*BuildConfig.APPLICATION_ID*/applicationId)) + .show(); + } + + + /** + * 筛选出需要的db文件 + * + * @param files + * @return + */ + @WorkerThread + private List getDbListFiles(File[] files) { + List fileList = new ArrayList<>(); + if (files != null) { + for (File file : files) { + if (file.getName().contains(SurveyorDataBase.DB_NAME)) { + fileList.add(file); + } + } + } + return fileList; + } + + @WorkerThread + private void copyFile(List files, File targetFile) { + if (files != null && !files.isEmpty()) { + if (!targetFile.exists()) { + targetFile.mkdirs(); + } + + for (File file : files) { + FileOperator.copyFile(file.getAbsolutePath(), targetFile.getAbsolutePath() + File.separator + file.getName()); + } + } + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/backup/BackupExportActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/backup/BackupExportActivity.java new file mode 100644 index 0000000..7164bca --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/backup/BackupExportActivity.java @@ -0,0 +1,30 @@ +package com.bingce.controlnetwork.activity.backup; + +import blankj.utilcode.util.StringUtils; + +import com.bingce.controlnetwork.BuildConfig; +import com.bingce.controlnetwork.R; + +public class BackupExportActivity extends AbstractBackupExportActivity { + @Override + protected String tipsString() { + return getString(R.string.back_up_data_tips); + } + + @Override + protected String applicationId() { + return BuildConfig.APPLICATION_ID; + } + + @Override + protected String zipFileName(String dateString, String projectName) { + StringBuilder stringBuilder = new StringBuilder(BACKUP_NAME); + if (!StringUtils.isEmpty(projectName)) { + stringBuilder.append("[") + .append(projectName) + .append("]"); + } + stringBuilder.append(dateString); + return stringBuilder.toString(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/BackupImportHelper.java b/app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/BackupImportHelper.java new file mode 100644 index 0000000..dd008db --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/BackupImportHelper.java @@ -0,0 +1,34 @@ +package com.bingce.controlnetwork.activity.backup.launch; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.appcompat.app.AppCompatActivity; + +public class BackupImportHelper { + private ICallback callback; + private final ActivityResultLauncher importLauncher; + + public BackupImportHelper(AppCompatActivity activity) { + importLauncher = activity.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (callback == null) { + return; + } + boolean success = result != null && Activity.RESULT_OK == result.getResultCode(); + callback.onImported(success); + }); + } + + public void doImport(Context context, ICallback callback) { + this.callback = callback; + Intent intent = MigrationFolder2PrivateRoomActivity.intent(context, true); + importLauncher.launch(intent); + } + + public interface ICallback { + void onImported(boolean success); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/MigrationFolder2PrivateRoomActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/MigrationFolder2PrivateRoomActivity.java new file mode 100644 index 0000000..0fe5496 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/MigrationFolder2PrivateRoomActivity.java @@ -0,0 +1,124 @@ +package com.bingce.controlnetwork.activity.backup.launch; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.view.WindowManager; + +import androidx.annotation.Nullable; + +import com.bingce.file.DownloadFilePicker; +import com.bingce.utils.AsynchronousHelper; +import com.bingce.utils.IntentUtil; + +import org.polaric.colorful.ColorfulActivity; + +import com.bingce.controlnetwork.databinding.ActivityMigration2PrivateFolderLayoutBinding; + +public class MigrationFolder2PrivateRoomActivity extends ColorfulActivity implements AsynchronousHelper.IDelegate { + private final DownloadFilePicker downloadFilePicker = new DownloadFilePicker(this); + private final AsynchronousHelper migrationHelper = new AsynchronousHelper(this); + private ActivityMigration2PrivateFolderLayoutBinding binding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + binding = ActivityMigration2PrivateFolderLayoutBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + //从备份文件导入 + binding.backupFromZip.setOnClickListener(v -> { + binding.layout2.setVisibility(View.INVISIBLE); + ZipMigrationUtils.importFromZip(MigrationFolder2PrivateRoomActivity.this, + "导线助手数据+日期", + migrationHelper, + downloadFilePicker, + new ZipMigrationUtils.IMigrationListener() { + @Override + public void onMigrationStart() { + showWorkLayout(); + } + + @Override + public void onMigrationInterrupt() { + back2Layout2(); + } + }); + }); + boolean fromMainActivity = IntentUtil.boolExtra(this, KEY_FROM_MAIN_ACTIVITY); + if (fromMainActivity) { + binding.enterAppDirect.setVisibility(View.GONE); + } else { + binding.enterAppDirect.setOnClickListener(v -> { + binding.backupFromZip.setEnabled(false); + binding.enterAppDirect.setEnabled(false); + enterApp(MigrationFolder2PrivateRoomActivity.this); + }); + } + } + + private void showWorkLayout() { + binding.workLayout.setVisibility(View.VISIBLE); + binding.back.setEnabled(false); + binding.back.setOnClickListener(v -> back2Layout2()); + binding.next.setEnabled(false); + binding.next.setOnClickListener(v -> { + binding.back.setEnabled(false); + binding.next.setEnabled(false); + enterApp(MigrationFolder2PrivateRoomActivity.this); + }); + binding.tvCompleted.setVisibility(View.INVISIBLE); + binding.spinKit.setVisibility(View.VISIBLE); + binding.progressText.setText(""); + } + + private void back2Layout2() { + binding.workLayout.setVisibility(View.INVISIBLE); + binding.layout2.setVisibility(View.VISIBLE); + } + + private static void enterApp(Activity activity) { + boolean fromMainActivity = IntentUtil.boolExtra(activity, KEY_FROM_MAIN_ACTIVITY); + if (fromMainActivity) { + activity.setResult(Activity.RESULT_OK); + activity.finish(); + } + } + + @Override + public void onBackPressed() { + boolean fromMainActivity = IntentUtil.boolExtra(this, KEY_FROM_MAIN_ACTIVITY); + if (fromMainActivity) { + super.onBackPressed(); + } + } + + @Override + public void onUpdateProgress(String msg) { + binding.progressText.setText(binding.progressText.getText() + "\n" + msg); + binding.scrollView.post(() -> binding.scrollView.fullScroll(View.FOCUS_DOWN)); + } + + @Override + public void onCompleted() { + binding.next.setEnabled(true); + binding.back.setEnabled(true); + binding.tvCompleted.setVisibility(View.VISIBLE); + binding.spinKit.setVisibility(View.INVISIBLE); + } + + private static final String KEY_FROM_MAIN_ACTIVITY = "from_main_activity"; + + public static void start(Context context) { + context.startActivity(intent(context, false)); + } + + public static Intent intent(Context context, boolean fromMainActivity) { + Intent intent = new Intent(context, MigrationFolder2PrivateRoomActivity.class); + intent.putExtra(KEY_FROM_MAIN_ACTIVITY, fromMainActivity); + return intent; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/ZipMigrationUtils.java b/app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/ZipMigrationUtils.java new file mode 100644 index 0000000..312ad15 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/ZipMigrationUtils.java @@ -0,0 +1,124 @@ +package com.bingce.controlnetwork.activity.backup.launch; + +import android.content.Context; +import android.text.TextUtils; + +import com.bingce.controlnetwork.activity.backup.AbstractBackupExportActivity; +import com.bingce.file.DownloadFilePicker; +import com.bingce.file.FileOperator; +import com.bingce.path.PathManager; +import com.bingce.utils.AsynchronousHelper; +import com.bingce.utils.FileUtil; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.zip.ZipHelper; + +import java.io.File; + +import blankj.utilcode.util.FileUtils; +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.activity.backup.AbstractBackupExportActivity; + +public class ZipMigrationUtils { + + public static void importFromZip(Context context, String backupName, AsynchronousHelper asynchronousHelper, DownloadFilePicker downloadFilePicker, IMigrationListener listener) { + downloadFilePicker.doPick(duplicate -> { + String errorString = "请选择正确的备份数据,位于根目录Download文件夹内,名称样式为「" + backupName + ".zip」"; + if (duplicate == null || !duplicate.exists()) { + ToastUtils.showShort(errorString); + if (listener != null) { + listener.onMigrationInterrupt(); + } + return; + } + if (!duplicate.getName().endsWith(".zip")) { + ToastUtils.showShort(errorString); + if (listener != null) { + listener.onMigrationInterrupt(); + } + return; + } + asynchronousHelper.start(); + if (listener != null) { + listener.onMigrationStart(); + } + //切换线路执行数据解压 + ThreadPoolUtil.execute(() -> { + //解压缩 + + File unzipFolder = new File(context.getExternalCacheDir(), duplicate.getName().replace(".zip", "")); + File[] prjFolders = unzipBackupFile(duplicate, unzipFolder, errorString); + if (prjFolders == null) { + return; + } + + for (File file : prjFolders) { + File[] folder = file.listFiles(); + String backUpType = null; + for (File fileBackup : folder) { + if (!fileBackup.isDirectory()) { + if (fileBackup.getName().equals(AbstractBackupExportActivity.BACKUP_TXT)) { + FileUtil.ReadFileResult readFileResult = FileUtil.readStringFrom(fileBackup); + if (readFileResult.success) { + backUpType = readFileResult.string; + } + break; + } + } + } + + for (File fileBackup : folder) { + if (fileBackup.isDirectory()) { + String name = fileBackup.getName(); + if (TextUtils.equals(name, backUpType)) { + File[] dbFileList = fileBackup.listFiles(); + for (File dbFile : dbFileList) { + FileOperator.copy(dbFile, PathManager.appDocumentFolder()); + } + } + } + } + } + + + //完成数据导入 + asynchronousHelper.completed(); + }); + }); + } + + private static File[] unzipBackupFile(File duplicate, File unzipFolder, String errorString) { + if (!unzipFolder.exists()) { + if (!unzipFolder.mkdir()) { + ToastUtils.showShort("解压备份文件失败"); + return null; + } + } else { + //先删除,再创建 + try { + FileUtils.delete(unzipFolder); + } catch (Exception e) { + e.printStackTrace(); + ToastUtils.showShort("解压备份文件失败"); + return null; + } + if (!unzipFolder.mkdir()) { + ToastUtils.showShort("解压备份文件失败"); + return null; + } + } + if (!ZipHelper.unZipFile(unzipFolder.getAbsolutePath(), duplicate.getAbsolutePath())) { + ToastUtils.showShort(errorString); + return null; + } + //解析文件内容 + return unzipFolder.listFiles(); + } + + + public interface IMigrationListener { + void onMigrationStart(); + + void onMigrationInterrupt(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentContainer.java b/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentContainer.java new file mode 100644 index 0000000..7a6a33c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentContainer.java @@ -0,0 +1,103 @@ +package com.bingce.controlnetwork.activity.fragmentcontainer; + +import android.os.Bundle; + +import androidx.fragment.app.Fragment; + +import com.bingce.controlnetwork.fragment.PickPointFragment; +import com.bingce.controlnetwork.fragment.PointListFragment; +import com.bingce.controlnetwork.fragment.PrismManageFragment; +import com.bingce.controlnetwork.fragment.ProjectToleranceSettingFragment; +import com.bingce.controlnetwork.fragment.SelectExportHeightTraverseFragment; +import com.bingce.controlnetwork.fragment.SelectExportSurveyorRecordFragment; +import com.bingce.controlnetwork.fragment.SelectExportSurveyorRecordWireFileFragment; +import com.bingce.controlnetwork.fragment.SurveyorSettingsFragment; +import com.bingce.controlnetwork.fragment.ToleranceDetailFragment; +import com.bingce.controlnetwork.fragment.ToleranceManageFragment; +import com.bingce.controlnetwork.fragment.ToleranceSelectFragment; +import com.bingce.controlnetwork.fragment.station.line.attached.LineStationAttachedSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.close.LineStationCloseSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.random.LineStationRandomSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.single.LineStationSingleSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellDoubleGroundSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellDoubleUnderGroundSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellSetupFragment; + +import java.util.HashMap; +import java.util.Map; + +import com.bingce.controlnetwork.fragment.PickPointFragment; +import com.bingce.controlnetwork.fragment.PointListFragment; +import com.bingce.controlnetwork.fragment.PrismManageFragment; +import com.bingce.controlnetwork.fragment.ProjectToleranceSettingFragment; +import com.bingce.controlnetwork.fragment.SelectExportHeightTraverseFragment; +import com.bingce.controlnetwork.fragment.SelectExportSurveyorRecordFragment; +import com.bingce.controlnetwork.fragment.SelectExportSurveyorRecordWireFileFragment; +import com.bingce.controlnetwork.fragment.stationsetting.StationSettingHeightTraverseFragment; +import com.bingce.controlnetwork.fragment.stationsetting.StationSettingsFragment; +import com.bingce.controlnetwork.fragment.SurveyorSettingsFragment; +import com.bingce.controlnetwork.fragment.ToleranceDetailFragment; +import com.bingce.controlnetwork.fragment.ToleranceManageFragment; +import com.bingce.controlnetwork.fragment.ToleranceSelectFragment; +import com.bingce.controlnetwork.fragment.projectdetail.ProjectDetailHeightTraverseFragment; +import com.bingce.controlnetwork.fragment.projectdetail.ProjectDetailTriangleFragment; +import com.bingce.controlnetwork.fragment.station.defaultstation.DefaultStationSetupFragment; +import com.bingce.controlnetwork.fragment.station.heighttraverse.CreateStationForHeightTraverseFragment; +import com.bingce.controlnetwork.fragment.station.line.attached.LineStationAttachedSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.close.LineStationCloseSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.random.LineStationRandomSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.single.LineStationSingleSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellDoubleGroundSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellDoubleUnderGroundSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellSetupFragment; +import com.bingce.controlnetwork.fragment.stationdetail.SingleStationDetailAndEditFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.StationSurveyorFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.MeasureFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.heighttraverse.MeasureHeightTraverseFragment; + +public class FragmentContainer { + private interface IBuilder { + Fragment newInstance(Bundle args); + } + + private static final Map factory = new HashMap<>(); + + static { + factory.put(ProjectDetailHeightTraverseFragment.TAG, ProjectDetailHeightTraverseFragment::newInstance); + factory.put(ProjectDetailTriangleFragment.TAG, ProjectDetailTriangleFragment::newInstance); + factory.put(ProjectToleranceSettingFragment.TAG, ProjectToleranceSettingFragment::newInstance); + factory.put(ToleranceSelectFragment.TAG, ToleranceSelectFragment::newInstance); + factory.put(PointListFragment.TAG, PointListFragment::newInstance); + factory.put(SingleStationDetailAndEditFragment.TAG, SingleStationDetailAndEditFragment::newInstance); + factory.put(DefaultStationSetupFragment.TAG, DefaultStationSetupFragment::newInstance); + factory.put(PickPointFragment.TAG, PickPointFragment::newInstance); + factory.put(StationSurveyorFragment.TAG, StationSurveyorFragment::newInstance); + factory.put(StationSettingsFragment.TAG, StationSettingsFragment::newInstance); + factory.put(ToleranceManageFragment.TAG, ToleranceManageFragment::newInstance); + factory.put(ToleranceDetailFragment.TAG, ToleranceDetailFragment::newInstance); + factory.put(SelectExportSurveyorRecordFragment.TAG, SelectExportSurveyorRecordFragment::newInstance); + factory.put(SelectExportSurveyorRecordWireFileFragment.TAG, SelectExportSurveyorRecordWireFileFragment::newInstance); + factory.put(SurveyorSettingsFragment.TAG, SurveyorSettingsFragment::newInstance); + factory.put(LineStationSingleSetupFragment.TAG, LineStationSingleSetupFragment::newInstance); + factory.put(LineStationAttachedSetupFragment.TAG, LineStationAttachedSetupFragment::newInstance); + factory.put(LineStationCloseSetupFragment.TAG, LineStationCloseSetupFragment::newInstance); + factory.put(LineStationRandomSetupFragment.TAG, LineStationRandomSetupFragment::newInstance); + factory.put(LineStationWellSetupFragment.TAG, LineStationWellSetupFragment::newInstance); + factory.put(LineStationWellDoubleGroundSetupFragment.TAG, LineStationWellDoubleGroundSetupFragment::newInstance); + factory.put(LineStationWellDoubleUnderGroundSetupFragment.TAG, LineStationWellDoubleUnderGroundSetupFragment::newInstance); + factory.put(PrismManageFragment.TAG, PrismManageFragment::newInstance); + factory.put(MeasureFragment.TAG, MeasureFragment::newInstance); + factory.put(CreateStationForHeightTraverseFragment.TAG, CreateStationForHeightTraverseFragment::newInstance); + factory.put(MeasureHeightTraverseFragment.TAG, MeasureHeightTraverseFragment::newInstance); + factory.put(SelectExportHeightTraverseFragment.TAG, SelectExportHeightTraverseFragment::newInstance); + factory.put(StationSettingHeightTraverseFragment.TAG, StationSettingHeightTraverseFragment::newInstance); + } + + public static Fragment getFragment(String tag, Bundle bundle) { + IBuilder builder = factory.get(tag); + if (builder == null) { + return null; + } + return builder.newInstance(bundle); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentContainerActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentContainerActivity.java new file mode 100644 index 0000000..7196267 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentContainerActivity.java @@ -0,0 +1,138 @@ +package com.bingce.controlnetwork.activity.fragmentcontainer; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.MenuItem; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.Fragment; + +import org.polaric.colorful.ColorfulActivity; + +import java.util.List; + +import com.bingce.controlnetwork.R; + +public class FragmentContainerActivity extends ColorfulActivity { + private static final String KEY_TAG = "_TAG_"; + private static final String KEY_TITLE_STRING_ID = "__title_res"; + private static final String KEY_TITLE_STRING = "__title__"; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + //设置view + setContentView(R.layout.activity_fragment_container_layout); + Toolbar mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + //设置fragment + if (savedInstanceState == null) { + Intent intent = getIntent(); + if (intent == null) { + finish(); + return; + } + int title = intent.getIntExtra(KEY_TITLE_STRING_ID, -1); + if (title > 0) { + setTitle(title); + } else { + String string = intent.getStringExtra(KEY_TITLE_STRING); + setTitle(string); + } + String tag = intent.getStringExtra(KEY_TAG); + Bundle bundle = intent.getExtras(); + Fragment fragment = FragmentContainer.getFragment(tag, bundle); + if (fragment == null) { + finish(); + return; + } + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, fragment) + .commitAllowingStateLoss(); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + if (!isCancelBack()) { + finish(); + } + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onBackPressed() { + if (isCancelBack()) { + return; + } + super.onBackPressed(); + } + + private boolean isCancelBack() { + List fragmentList = getSupportFragmentManager() + .getFragments(); + boolean cancelBack = false; + for (Fragment fragment : fragmentList) { + if (fragment instanceof IOnBackFilter) { + if (((IOnBackFilter) fragment).cancelBack()) { + cancelBack = true; + break; + } + } + } + return cancelBack; + } + + public static void start(Context context, String tag, int titleRes, Bundle bundle) { + Intent intent = new Intent(context, FragmentContainerActivity.class); + if (bundle != null) { + intent.putExtras(bundle); + } + intent.putExtra(KEY_TAG, tag); + intent.putExtra(KEY_TITLE_STRING_ID, titleRes); + context.startActivity(intent); + } + + public static void start(Context context, String tag, String title, Bundle bundle) { + Intent intent = new Intent(context, FragmentContainerActivity.class); + if (bundle != null) { + intent.putExtras(bundle); + } + intent.putExtra(KEY_TAG, tag); + intent.putExtra(KEY_TITLE_STRING, title); + context.startActivity(intent); + } + + public static Intent startIntent(Context context, + String tag, + int titleRes, + Bundle bundle) { + Intent intent = new Intent(context, FragmentContainerActivity.class); + if (bundle != null) { + intent.putExtras(bundle); + } + intent.putExtra(KEY_TAG, tag); + intent.putExtra(KEY_TITLE_STRING_ID, titleRes); + return intent; + } + + public static Intent startIntent(Context context, + String tag, + String title, + Bundle bundle) { + Intent intent = new Intent(context, FragmentContainerActivity.class); + if (bundle != null) { + intent.putExtras(bundle); + } + intent.putExtra(KEY_TAG, tag); + intent.putExtra(KEY_TITLE_STRING, title); + return intent; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentItem.java b/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentItem.java new file mode 100644 index 0000000..824ec89 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/FragmentItem.java @@ -0,0 +1,11 @@ +package com.bingce.controlnetwork.activity.fragmentcontainer; + +public class FragmentItem { + public final int titleId; + public final String tag; + + public FragmentItem(int title, String tag) { + titleId = title; + this.tag = tag; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/IOnBackFilter.java b/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/IOnBackFilter.java new file mode 100644 index 0000000..36dca2d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/fragmentcontainer/IOnBackFilter.java @@ -0,0 +1,5 @@ +package com.bingce.controlnetwork.activity.fragmentcontainer; + +public interface IOnBackFilter { + boolean cancelBack(); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/user/EditNicknamePasswordActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/user/EditNicknamePasswordActivity.java new file mode 100644 index 0000000..0e87722 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/user/EditNicknamePasswordActivity.java @@ -0,0 +1,143 @@ +package com.bingce.controlnetwork.activity.user; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.Editable; +import android.text.InputType; +import android.text.TextWatcher; +import android.view.MenuItem; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; + +import org.polaric.colorful.ColorfulActivity; + +import blankj.utilcode.util.StringUtils; +import blankj.utilcode.util.Utils; +import cn.leancloud.LCUser; + +import com.bingce.controlnetwork.App; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.ActivityEditUserNicknamePasswordBinding; + +public class EditNicknamePasswordActivity extends ColorfulActivity { + + private ActivityEditUserNicknamePasswordBinding binding; + private boolean isShowPassword01, isShowPassword02; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityEditUserNicknamePasswordBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + Toolbar mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + //隐藏显示按钮01(输入密码) + binding.llPassword01.setOnClickListener(v -> { + if (isShowPassword01) { + // 明文显示密码 + binding.etPassword01.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL); + binding.ivPassword01.setImageDrawable(getDrawable(R.drawable.icon_password_open_eyes)); + } else { + // 隐藏密码 + binding.etPassword01.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + binding.ivPassword01.setImageDrawable(getDrawable(R.drawable.icon_password_close_eyes)); + } + isShowPassword01 = !isShowPassword01; + }); + + //隐藏显示按钮02(确认密码) + binding.llPassword02.setOnClickListener(v -> { + if (isShowPassword02) { + // 明文显示密码 + binding.etPassword02.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL); + binding.ivPassword02.setImageDrawable(getDrawable(R.drawable.icon_password_open_eyes)); + } else { + // 隐藏密码 + binding.etPassword02.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + binding.ivPassword02.setImageDrawable(getDrawable(R.drawable.icon_password_close_eyes)); + } + isShowPassword02 = !isShowPassword02; + }); + + binding.etPassword01.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + checkPw(); + } + }); + binding.etPassword02.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + checkPw(); + } + }); + + //完成 + binding.tvComplete.setOnClickListener(v -> { + String nickName = binding.etNickName.getText().toString(); + String password = binding.etPassword01.getText().toString(); + if (LCUser.getCurrentUser() != null) { + LCUser.getCurrentUser().setPassword(password); + LCUser.getCurrentUser().put("nickname", nickName); + LCUser.getCurrentUser().saveInBackground().subscribe(); + ((App) Utils.getApp()).isUserStatusChanged = true; + } + finish(); + }); + } + + private void checkPw() { + String nickName = binding.etNickName.getText().toString(); + String pw1 = binding.etPassword01.getText().toString(); + String pw2 = binding.etPassword02.getText().toString(); + boolean isEmptyNickName = StringUtils.isEmpty(nickName); + boolean isEmptyPw01 = StringUtils.isEmpty(pw1); + boolean isEmptyPw02 = StringUtils.isEmpty(pw2); + if (!isEmptyNickName && !isEmptyPw01 && !isEmptyPw02 && pw1.equals(pw2)) { + binding.tvComplete.setEnabled(true); + binding.tvComplete.setBackground(getDrawable(R.drawable.rectangle_radius_8_theme_green_full)); + } else { + binding.tvComplete.setEnabled(false); + binding.tvComplete.setBackground(getDrawable(R.drawable.rectangle_radius_8_gray_full)); + } + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + } + return super.onOptionsItemSelected(item); + } + + public static void start(Context context) { + context.startActivity(new Intent(context, EditNicknamePasswordActivity.class)); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/user/InputEmailActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/user/InputEmailActivity.java new file mode 100644 index 0000000..8c678b9 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/user/InputEmailActivity.java @@ -0,0 +1,107 @@ +package com.bingce.controlnetwork.activity.user; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; + +import com.bingce.utils.IntentUtil; +import com.bingce.utils.ValidateUtil; + +import org.polaric.colorful.ColorfulActivity; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.ActivityInputEmailBinding; + +public class InputEmailActivity extends ColorfulActivity { + public static final String KEY_EMAIL = "email"; + public static final String KEY_TODO = "todo"; + private ActivityInputEmailBinding binding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityInputEmailBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + Toolbar mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + getSupportActionBar().setTitle(R.string.email_verify); + if (getEmail() != null) { + binding.etEmail.setText(getEmail()); + binding.etEmail.setEnabled(false); + if (checkEmail()) { + binding.tvNextPage.setEnabled(true); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_theme_green_full)); + } else { + binding.tvNextPage.setEnabled(false); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_gray_full)); + } + } + + binding.etEmail.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (checkEmail()) { + binding.tvNextPage.setEnabled(true); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_theme_green_full)); + } else { + binding.tvNextPage.setEnabled(false); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_gray_full)); + } + } + }); + + ActivityResultLauncher verifyCodeLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + Intent data = result.getData(); + if (data != null) { + setResult(RESULT_OK, data); + finish(); + } + }); + //下一步 + binding.tvNextPage.setOnClickListener(v -> { + String email = binding.etEmail.getText().toString(); + VerifyEmailCodeActivity.start(this, email, getToDo(), verifyCodeLauncher); + }); + } + + private boolean checkEmail() { + return ValidateUtil.isEmail(binding.etEmail.getText().toString()); + } + + public static void start(Context context, String email, int todo, ActivityResultLauncher launcher) { + Intent intent = new Intent(context, InputEmailActivity.class); + intent.putExtra(KEY_EMAIL, email); + intent.putExtra(KEY_TODO, todo); + launcher.launch(intent); + } + + + private String getEmail() { + return IntentUtil.stringExtra(getIntent(), KEY_EMAIL); + } + + + private int getToDo() { + return IntentUtil.intExtra(getIntent(), KEY_TODO); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/user/InputPhoneNumberActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/user/InputPhoneNumberActivity.java new file mode 100644 index 0000000..a92c5de --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/user/InputPhoneNumberActivity.java @@ -0,0 +1,93 @@ +package com.bingce.controlnetwork.activity.user; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; + +import com.bingce.utils.IntentUtil; + +import org.polaric.colorful.ColorfulActivity; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.ActivityInputPhoneNumberBinding; + +public class InputPhoneNumberActivity extends ColorfulActivity { + public static final String KEY_PHONE = "phone_number"; + public static final String KEY_EMAIL = "email"; + public static final String KEY_UNION_ID = "unionid"; + public static final String KEY_TODO = "todo"; + private ActivityInputPhoneNumberBinding binding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityInputPhoneNumberBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + Toolbar mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + getSupportActionBar().setTitle(R.string.mobile_phone_verify); + + binding.ccp.registerCarrierNumberEditText(binding.etPhoneNumber); + binding.ccp.setPhoneNumberValidityChangeListener(isValidNumber -> { + if (isValidNumber) { + binding.tvNextPage.setEnabled(true); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_theme_green_full)); + } else { + binding.tvNextPage.setEnabled(false); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_gray_full)); + } + }); + if (getPhoneNumber() != null) { + binding.etPhoneNumber.setText(getPhoneNumber().replaceFirst("\\+86", "")); + binding.etPhoneNumber.setEnabled(false); + binding.ccp.setCcpClickable(false); + } + + ActivityResultLauncher verifyCodeLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + Intent data = result.getData(); + if (data != null && data.hasExtra("isMail") && data.hasExtra("phoneNumberOrEmail")) { + setResult(RESULT_OK, data); + finish(); + } + }); + //下一步 + binding.tvNextPage.setOnClickListener(v -> { + String phoneNumber = binding.ccp.getFullNumberWithPlus(); + VerifySMSCodeActivity.start(this, phoneNumber, getEmail(), getUnionId(), getToDo(), verifyCodeLauncher); + }); + } + + public static void start(Context context, String phoneNumber, String email, String unionid, int todo, ActivityResultLauncher launcher) { + Intent intent = new Intent(context, InputPhoneNumberActivity.class); + intent.putExtra(KEY_PHONE, phoneNumber); + intent.putExtra(KEY_EMAIL, email); + intent.putExtra(KEY_UNION_ID, unionid); + intent.putExtra(KEY_TODO, todo); + launcher.launch(intent); + } + + private String getPhoneNumber() { + return IntentUtil.stringExtra(getIntent(), KEY_PHONE); + } + + + private String getEmail() { + return IntentUtil.stringExtra(getIntent(), KEY_EMAIL); + } + + private String getUnionId() { + return IntentUtil.stringExtra(getIntent(), KEY_UNION_ID); + } + + private int getToDo() { + return IntentUtil.intExtra(getIntent(), KEY_TODO); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/user/LoginActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/user/LoginActivity.java new file mode 100644 index 0000000..f771c4b --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/user/LoginActivity.java @@ -0,0 +1,579 @@ +package com.bingce.controlnetwork.activity.user; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; + +import com.bingce.AppChannel; +import com.bingce.BaseApp; +import com.bingce.activity.UserCloudFunction; +import com.bingce.controlnetwork.App; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.ActivityLoginBinding; +import com.bingce.controlnetwork.wxapi.MD5; +import com.bingce.data.sync.utils.LeanCloudUserLoginStateUtils; +import com.bingce.event.WxRespCodeEvent; +import com.bingce.ui.TabEntity; +import com.bingce.utils.ActivityUtils; +import com.bingce.utils.ValidateUtil; +import com.bingce.utils.VipManager; +import com.flyco.tablayout.listener.CustomTabEntity; +import com.flyco.tablayout.listener.OnTabSelectListener; +import com.hbb20.CountryCodePicker; +import com.tencent.mm.opensdk.modelmsg.SendAuth; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.polaric.colorful.ColorfulActivity; + +import java.util.ArrayList; +import java.util.Random; + +import alibaba.fastjson.JSON; +import alibaba.fastjson.JSONObject; +import blankj.utilcode.util.StringUtils; +import blankj.utilcode.util.ToastUtils; +import blankj.utilcode.util.Utils; +import cn.leancloud.LCException; +import cn.leancloud.LCUser; +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; + +public class LoginActivity extends ColorfulActivity { + + private ActivityLoginBinding binding; + private final String[] mTitles = new String[]{Utils.getApp().getString(R.string.phone_number), Utils.getApp().getString(R.string.e_mail)}; + private final ArrayList tabEntityList = new ArrayList<>(); + private boolean isLoginPassword = true, isLoginByEmail = false; + + private ProgressDialog progressDialog; + private String wxRespCode; + private String finishTo; + private ActivityResultLauncher signUpOrLoginLauncher; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityLoginBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + setSupportActionBar(binding.getRoot().findViewById(R.id.toolbar)); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + EventBus.getDefault().register(this); + + finishTo = getIntent().getStringExtra("finishTo"); + + //绑定Tab数据 + for (String mTitle : mTitles) { + tabEntityList.add(new TabEntity(mTitle)); + } + binding.tabLoginMode.setTabData(tabEntityList); + + //切换手机号、邮箱 + binding.tabLoginMode.setOnTabSelectListener(new OnTabSelectListener() { + @Override + public void onTabSelect(int position) { + isLoginByEmail = position != 0; + onSelectTabPhoneEmail(); + } + + @Override + public void onTabReselect(int position) { + + } + }); + + //切换验证码、密码 + binding.tvLoginPasswordCode.setOnClickListener(v -> { + onClickBtnPassword(); + }); + + binding.ccp.registerCarrierNumberEditText(binding.etPhoneNumber); + binding.ccp.setPhoneNumberValidityChangeListener(new CountryCodePicker.PhoneNumberValidityChangeListener() { + @Override + public void onValidityChanged(boolean isValidNumber) { + if (isValidNumber) { + binding.tvNextPage.setEnabled(true); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_theme_green_full)); + } else { + binding.tvNextPage.setEnabled(false); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_gray_full)); + } + } + }); + //下一步 + binding.tvNextPage.setOnClickListener(v -> { + if (checkValid()) { + if (isLoginByEmail) { + String email = binding.etEmail.getText().toString().trim(); + if (!isLoginPassword) {//验证码登录 + VerifyEmailCodeActivity.start(this, email, VerifyEmailCodeActivity.TO_SIGNUP_OR_LOGIN_BY_EMAIL, signUpOrLoginLauncher); + } else { + String password = binding.etPassword.getText().toString(); + loginByEmailPassword(email, password); + } + } else { + String phoneNumber = binding.ccp.getFullNumberWithPlus(); + if (!isLoginPassword) {//验证码登录 + VerifySMSCodeActivity.start(this, phoneNumber, null, null, VerifySMSCodeActivity.TO_SIGNUP_OR_LOGIN_BY_PHONE_NUMBER, signUpOrLoginLauncher); + } else { + String password = binding.etPassword.getText().toString(); + if (phoneNumber.startsWith("+86")) { + phoneNumber = phoneNumber.replaceFirst("\\+86", ""); + } + loginByPhonePassword(phoneNumber, password); + } + } + } + }); + + binding.ivWechatLogin.setOnClickListener(v -> { + wxLogin(); + }); + signUpOrLoginLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == Activity.RESULT_OK) { + Intent data = result.getData(); + if (data != null) { + if (data.hasExtra("sessionToken") && data.hasExtra("newUser")) { + String sessionToken = data.getStringExtra("sessionToken"); + boolean newUser = data.getBooleanExtra("newUser", false); + progressDialog = new ProgressDialog(LoginActivity.this); + progressDialog.setMessage(getString(R.string.logging)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + LCUser.becomeWithSessionTokenInBackground(sessionToken, true).subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(LCUser lcUser) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + loginSuccess(); + if (newUser) { + EditNicknamePasswordActivity.start(LoginActivity.this); + } + } + + @Override + public void onError(Throwable e) { + ToastUtils.showShort(getString(R.string.error_code) + new LCException(e).getCode()); + } + + @Override + public void onComplete() { + + } + }); + } + } + } + }); + + binding.etPassword.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + checkValid(); + } + }); + } + + public static void start(Context context) { + context.startActivity(new Intent(context, LoginActivity.class)); + } + + public void onSelectTabPhoneEmail() { + binding.etPassword.setText(""); + if (!isLoginByEmail) {//手机号登录 + binding.llPhoneNumber.setVisibility(View.VISIBLE); + binding.llEmail.setVisibility(View.GONE); + binding.etPhoneNumber.setText(""); + if (isLoginPassword) { + binding.signUpHint.setText(R.string.if_you_do_not_have_an_account_you_can_use_a_verification_code_to_sign_up_and_log_in); + } else { + binding.signUpHint.setText(R.string.unsigned_up_mobile_phone_number_will_be_automatically_signed_up_and_logged_in); + } + } else {//邮箱登录 + binding.llPhoneNumber.setVisibility(View.GONE); + binding.llEmail.setVisibility(View.VISIBLE); + binding.etEmail.setText(""); + if (isLoginPassword) { + binding.signUpHint.setText(R.string.if_you_do_not_have_an_account_you_can_use_a_verification_code_to_sign_up_and_log_in); + } else { + binding.signUpHint.setText(R.string.unsigned_up_email_will_be_automatically_signed_up_and_logged_in); + } + } + checkValid(); + } + + public void onClickBtnPassword() { + isLoginPassword = !isLoginPassword; + if (!isLoginPassword) {//现在改为验证码登录 + binding.llPassword.setVisibility(View.GONE); + binding.tvNextPage.setText(R.string.next); + binding.tvLoginPasswordCode.setText(R.string.log_in_with_password); + if (!isLoginByEmail) {//手机号登录 + binding.signUpHint.setText(R.string.unsigned_up_mobile_phone_number_will_be_automatically_signed_up_and_logged_in); + } else { + binding.signUpHint.setText(R.string.unsigned_up_email_will_be_automatically_signed_up_and_logged_in); + } + } else {//现在改为密码登录 + binding.llPassword.setVisibility(View.VISIBLE); + binding.tvNextPage.setText(R.string.log_in); + binding.tvLoginPasswordCode.setText(R.string.log_in_using_verify_code); + binding.signUpHint.setText(R.string.if_you_do_not_have_an_account_you_can_use_a_verification_code_to_sign_up_and_log_in); + } + checkValid(); + } + + public boolean checkValid() { + if (!isLoginPassword) {//现在改为验证码登录 + if (isLoginByEmail) { + if (ValidateUtil.isEmail(binding.etEmail.getText().toString().trim())) { + binding.tvNextPage.setEnabled(true); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_theme_green_full)); + } else { + binding.tvNextPage.setEnabled(false); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_gray_full)); + return false; + } + } else { + if (binding.ccp.isValidFullNumber()) { + binding.tvNextPage.setEnabled(true); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_theme_green_full)); + } else { + binding.tvNextPage.setEnabled(false); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_gray_full)); + return false; + } + } + } else {//现在改为密码登录 + if (isLoginByEmail) { + if (ValidateUtil.isEmail(binding.etEmail.getText().toString().trim()) && !StringUtils.isEmpty(binding.etPassword.getText().toString().trim())) { + binding.tvNextPage.setEnabled(true); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_theme_green_full)); + } else { + binding.tvNextPage.setEnabled(false); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_gray_full)); + return false; + } + } else { + if (binding.ccp.isValidFullNumber() && !StringUtils.isEmpty(binding.etPassword.getText().toString().trim())) { + binding.tvNextPage.setEnabled(true); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_theme_green_full)); + } else { + binding.tvNextPage.setEnabled(false); + binding.tvNextPage.setBackground(getDrawable(R.drawable.rectangle_radius_8_gray_full)); + return false; + } + } + } + return true; + } + + public void wxLogin() { + wxRespCode = null; + if (Utils.getApp() instanceof BaseApp) { + if (((BaseApp) Utils.getApp()).getWxApi() != null) { + if (!((BaseApp) Utils.getApp()).getWxApi().isWXAppInstalled()) { + ToastUtils.showShort(R.string.you_do_not_have_the_wechat_app_installed); + } else { + final SendAuth.Req req = new SendAuth.Req(); + //应用授权作用域,如获取用户个人信息则填写 snsapi_userinfo + req.scope = "snsapi_userinfo"; + //用于保持请求和回调的状态,授权请求后原样带回给第三方。 + //该参数可用于防止 csrf 攻击(跨站请求伪造攻击), + //建议第三方带上该参数,可设置为简单的随机数加 session 进行校验 + req.state = getNonceStr(); + if (((BaseApp) Utils.getApp()).getWxApi() != null) + ((BaseApp) Utils.getApp()).getWxApi().sendReq(req); + } + } + } + } + + //生成随机号,防重发 + private String getNonceStr() { + Random random = new Random(); + return MD5.getMessageDigest((System.currentTimeMillis() + String.valueOf(random.nextInt(10000))).getBytes()); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(WxRespCodeEvent event) { + wxRespCode = event.getCode(); + } + + @Override + protected void onResume() { + super.onResume(); + if (wxRespCode != null) { + loginByWxCode(); + wxRespCode = null; + } + } + + private void loginByWxCode() { + if (progressDialog != null) + progressDialog.dismiss(); + progressDialog = new ProgressDialog(LoginActivity.this); + progressDialog.setMessage(getString(R.string.logging)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + UserCloudFunction.loginByWxCode(wxRespCode, AppChannel.customChannel, new UserCloudFunction.OnGetSessionTokenListener() { + @Override + public void onSessionTokenGetSuccess(String sessionToken, boolean newUser) { + LCUser.becomeWithSessionTokenInBackground(sessionToken, true).subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(LCUser lcUser) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + if (newUser) { + EditNicknamePasswordActivity.start(LoginActivity.this); + } + ((App) Utils.getApp()).isUserStatusChanged = true; + setResult(RESULT_OK); + finish(); + } + + @Override + public void onError(Throwable e) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showShort(getString(R.string.error_code) + new LCException(e).getCode()); + } + + @Override + public void onComplete() { + + } + }); + } + + @Override + public void onSessionTokenGetFailed(int code, String msg, String resp) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + if (code == 321 || code == 322) {//321此微信未绑定用户,请使用其他方式登录,322缺少手机号或手机号未验证 + JSONObject jsonObject = JSON.parseObject(resp); + if (jsonObject.containsKey("data")) { + JSONObject data = jsonObject.getJSONObject("data"); + if (data.containsKey("unionid")) { + String unionid = data.getString("unionid"); + InputPhoneNumberActivity.start(LoginActivity.this, null, null, unionid, VerifySMSCodeActivity.TO_SIGNUP_OR_LOGIN_BY_WEIXIN_BIND_PHONE, signUpOrLoginLauncher); + } + } + } else { + ToastUtils.showLong(msg); + } + } + + @Override + public void onSessionTokenGetException(String msg) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(msg); + } + }); + } + + + private void loginSuccess() { + if (progressDialog != null) + progressDialog.dismiss(); + progressDialog = new ProgressDialog(LoginActivity.this); + progressDialog.setMessage(getString(R.string.logging)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + VipManager.getInstance().controlSdkRefresh(LoginActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() { + @Override + public void onRefreshSuccess() { + if (!StringUtils.isEmpty(finishTo)) { + try { + Intent intent = new Intent(LoginActivity.this, Class.forName(finishTo)); + intent.putExtras(getIntent()); + startActivity(intent); + } catch (ClassNotFoundException | NullPointerException ex) { + ex.printStackTrace(); + } + } + + ((App) Utils.getApp()).isUserStatusChanged = true; + LeanCloudUserLoginStateUtils.onLogIn(); + setResult(RESULT_OK); + finish(); + } + + @Override + public void onRefreshFailed(int errorCode) { + ToastUtils.showShort(getString(R.string.error_code) + ":" + errorCode); + } + }); + } + + private void loginByEmailPassword(String email, String password) { + if (progressDialog != null) + progressDialog.dismiss(); + progressDialog = new ProgressDialog(LoginActivity.this); + progressDialog.setMessage(getString(R.string.logging)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + UserCloudFunction.loginByEmailPassword(email, password, AppChannel.customChannel, new UserCloudFunction.OnGetSessionTokenListener() { + @Override + public void onSessionTokenGetSuccess(String sessionToken, boolean newUser) { + LCUser.becomeWithSessionTokenInBackground(sessionToken, true).subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(LCUser lcUser) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + loginSuccess(); + if (newUser) { + EditNicknamePasswordActivity.start(LoginActivity.this); + } + } + + @Override + public void onError(Throwable e) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showShort(getString(R.string.error_code) + new LCException(e).getCode()); + } + + @Override + public void onComplete() { + + } + }); + } + + @Override + public void onSessionTokenGetFailed(int code, String msg, String resp) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + if (code == 303) {//缺少手机号或未验证 + InputPhoneNumberActivity.start(LoginActivity.this, null, email, null, VerifySMSCodeActivity.TO_SIGNUP_OR_LOGIN_BY_EMAIL_BIND_PHONE, signUpOrLoginLauncher); + } else if (code == 304) {//邮箱未验证 + InputEmailActivity.start(LoginActivity.this, email, VerifyEmailCodeActivity.TO_SIGNUP_OR_LOGIN_BY_EMAIL, signUpOrLoginLauncher); + } else { + if (msg != null) + ToastUtils.showLong(msg); + } + } + + @Override + public void onSessionTokenGetException(String msg) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(msg); + } + }); + } + + private void loginByPhonePassword(String phoneNumber, String password) { + if (progressDialog != null) + progressDialog.dismiss(); + progressDialog = new ProgressDialog(LoginActivity.this); + progressDialog.setMessage(getString(R.string.logging)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + UserCloudFunction.loginByPhonePassword(phoneNumber, password, AppChannel.customChannel, new UserCloudFunction.OnGetSessionTokenListener() { + @Override + public void onSessionTokenGetSuccess(String sessionToken, boolean newUser) { + LCUser.becomeWithSessionTokenInBackground(sessionToken, true).subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(LCUser lcUser) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + loginSuccess(); + if (newUser) { + EditNicknamePasswordActivity.start(LoginActivity.this); + } + } + + @Override + public void onError(Throwable e) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showShort(getString(R.string.error_code) + new LCException(e).getCode()); + } + + @Override + public void onComplete() { + + } + }); + } + + @Override + public void onSessionTokenGetFailed(int code, String msg, String resp) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + if (code == 303) {//手机号未验证 + InputPhoneNumberActivity.start(LoginActivity.this, phoneNumber, null, null, VerifySMSCodeActivity.TO_SIGNUP_OR_LOGIN_BY_PHONE_NUMBER, signUpOrLoginLauncher); + } else { + if (msg != null) + ToastUtils.showLong(msg); + } + } + + @Override + public void onSessionTokenGetException(String msg) { + if (!ActivityUtils.isLiving(LoginActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(msg); + } + }); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/user/OpeningRenewalVipActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/user/OpeningRenewalVipActivity.java new file mode 100644 index 0000000..bb5b8fc --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/user/OpeningRenewalVipActivity.java @@ -0,0 +1,534 @@ +package com.bingce.controlnetwork.activity.user; + +import android.content.DialogInterface; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.net.Uri; +import android.os.Bundle; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ImageView; +import android.widget.RadioGroup; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; + +import com.afollestad.materialdialogs.DialogAction; +import com.afollestad.materialdialogs.MaterialDialog; +import com.bingce.controlnetwork.App; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.ActivityOpeningRenewalBinding; +import com.bingce.data.sync.utils.LeanCloudConfigLoader; +import com.bingce.event.PayOverEvent; +import com.bingce.pay.OrderType; +import com.bingce.pay.WxPayV3; +import com.bingce.surveyor.agentweb.AgentWebActivity; +import com.bingce.utils.ActivityUtils; +import com.bingce.utils.DateUtils; +import com.bingce.utils.StringUtil; +import com.bingce.utils.Util; +import com.bingce.utils.VipManager; +import com.bumptech.glide.Glide; +import com.huawei.hms.hmsscankit.ScanUtil; +import com.huawei.hms.hmsscankit.WriterException; +import com.huawei.hms.ml.scan.HmsBuildBitmapOption; +import com.huawei.hms.ml.scan.HmsScan; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.polaric.colorful.ColorfulActivity; + +import java.util.Date; + +import blankj.utilcode.util.AppUtils; +import blankj.utilcode.util.ToastUtils; +import blankj.utilcode.util.Utils; +import cn.leancloud.LCUser; + +public class OpeningRenewalVipActivity extends ColorfulActivity { + private int total_fee = -1; + private ImageView qrImageView; + private int queryCount = 0; + private int oneMonthPrice = -1, threeMonthsPrice = -1, oneYearPrice = -1; + private MaterialDialog payingDialog; + private ActivityOpeningRenewalBinding binding; + private String orderType = OrderType.ORDER_TYPE_SURVEYOR_365; + private boolean hasPayResult = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityOpeningRenewalBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + setSupportActionBar(binding.getRoot().findViewById(R.id.toolbar)); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + EventBus.getDefault().register(this); + + binding.activityOpeningRenewalTvVersion.setText("V" + AppUtils.getAppVersionName()); + + if (VipManager.getInstance().expireDate != null) { + binding.activityOpeningRenewalTvExpirationDate.setText(getString(R.string.current_expiration_date) + ":" + DateUtils.toFull(VipManager.getInstance().expireDate)); + } else { + binding.activityOpeningRenewalTvExpirationDate.setText(getString(R.string.current_expiration_date) + ":无"); + } + + binding.activityOpeningRenewalRadiogroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(RadioGroup group, int checkedId) { + if (oneMonthPrice <= 0 || threeMonthsPrice <= 0 || oneYearPrice <= 0) { + ToastUtils.showShort("请先联网获取套餐价格"); + return; + } + if (checkedId == binding.activityOpeningRenewalRadiobuttonOneMonth.getId()) { + total_fee = oneMonthPrice; + orderType = OrderType.ORDER_TYPE_SURVEYOR_30; + } else if (checkedId == binding.activityOpeningRenewalRadiobuttonThreeMonths.getId()) { + total_fee = threeMonthsPrice; + orderType = OrderType.ORDER_TYPE_SURVEYOR_90; + } else if (checkedId == binding.activityOpeningRenewalRadiobuttonOneYear.getId()) { + total_fee = oneYearPrice; + orderType = OrderType.ORDER_TYPE_SURVEYOR_365; + } + if (total_fee <= 0) { + binding.activityOpeningRenewalTvTotalFee.setText("联网获取价格"); + } else { + binding.activityOpeningRenewalTvTotalFee.setText(Util.formatDouble2String(total_fee / 100.0) + "元"); + } + } + }); + + if (VipManager.getInstance().checkReg()) { + new AlertDialog.Builder(this) + .setTitle(R.string.hint) + .setMessage("此手机已经绑定激活,请确定是否需要购买会员,绑定激活和购买会员可以二选其一") + .setPositiveButton(R.string.i_know, null) + .show(); + } + + LeanCloudConfigLoader.findInBackground("opening_renewal_fee", instance -> { +// new LCQuery<>("Configuration") +// .whereEqualTo("name", "opening_renewal_fee") +// .limit(1) +// .findInBackground().subscribe(new Observer>() { +// @Override +// public void onSubscribe(Disposable d) { +// +// } +// +// @Override +// public void onNext(List avObjects) { + if (!ActivityUtils.isLiving(OpeningRenewalVipActivity.this)) return; + if (/*avObjects != null && !avObjects.isEmpty() && avObjects.get(0).getString("value") != null*/instance != null && StringUtil.isNotEmpty(instance.value)) { + String value = /*avObjects.get(0).getString("value")*/instance.value; + String value2 = /*avObjects.get(0).getString("value2")*/instance.value2; + String[] valueArr = value.split(","); + String[] value2Arr = value2.split(","); + if (valueArr.length == 3 && value2Arr.length == 3) { + try { + oneMonthPrice = Integer.parseInt(valueArr[0]); + threeMonthsPrice = Integer.parseInt(valueArr[1]); + oneYearPrice = Integer.parseInt(valueArr[2]); + binding.activityOpeningRenewalRadiobuttonOneMonth.setText(value2Arr[0] + " " + oneMonthPrice / 100.0 + "元"); + binding.activityOpeningRenewalRadiobuttonThreeMonths.setText(value2Arr[1] + " " + threeMonthsPrice / 100.0 + "元"); + binding.activityOpeningRenewalRadiobuttonOneYear.setText(value2Arr[2] + " " + oneYearPrice / 100.0 + "元"); + if (binding.activityOpeningRenewalRadiobuttonOneMonth.isChecked()) { + total_fee = oneMonthPrice; + } else if (binding.activityOpeningRenewalRadiobuttonThreeMonths.isChecked()) { + total_fee = threeMonthsPrice; + } else if (binding.activityOpeningRenewalRadiobuttonOneYear.isChecked()) { + total_fee = oneYearPrice; + } + if (total_fee <= 0) { + binding.activityOpeningRenewalTvTotalFee.setText("联网获取价格"); + } else { + binding.activityOpeningRenewalTvTotalFee.setText(Util.formatDouble2String(total_fee / 100.0) + "元"); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + } else { + binding.activityOpeningRenewalTvTotalFee.setText("联网获取价格"); + } +// } +// +// @Override +// public void onError(Throwable e) { +// +// } +// +// @Override +// public void onComplete() { +// +// } + }); + LeanCloudConfigLoader.findInBackground("opening_renewal_activity", instance -> { +// new LCQuery<>("Configuration") +// .whereEqualTo("name", "opening_renewal_activity") +// .limit(1) +// .findInBackground().subscribe(new Observer>() { +// @Override +// public void onSubscribe(Disposable d) { +// +// } +// +// @Override +// public void onNext(List avObjects) { + if (!ActivityUtils.isLiving(OpeningRenewalVipActivity.this)) return; + if (/*avObjects != null && !avObjects.isEmpty() && avObjects.get(0).getString("value") != null*/instance != null && StringUtil.isNotEmpty(instance.value)) { + String activity = /*avObjects.get(0).getString("value")*/instance.value; + binding.activityOpeningRenewalTvActivity.setText(activity); + } +// } +// +// @Override +// public void onError(Throwable e) { +// +// } +// +// @Override +// public void onComplete() { +// +// } + }); + + String adsQueryUrl = "android_opening_renewal_vip_img_ads"; + LeanCloudConfigLoader.findInBackground(adsQueryUrl, instance -> { +// new LCQuery<>("Configuration") +// .whereEqualTo("name", adsQueryUrl) +// .limit(1) +// .findInBackground() +// .subscribe(new Observer>() { +// @Override +// public void onSubscribe(Disposable d) { +// +// } +// +// @Override +// public void onNext(List avObjects) { + if (!ActivityUtils.isLiving(OpeningRenewalVipActivity.this)) return; + if (/*avObjects != null && !avObjects.isEmpty()*/instance != null) { + String adsUrl = /*avObjects.get(0).getString("value")*/instance.value; + if (adsUrl != null) { + binding.activityOpeningRenewalImgAds.setVisibility(View.VISIBLE); + Glide.with(OpeningRenewalVipActivity.this).load(adsUrl).into(binding.activityOpeningRenewalImgAds); + + String actionUrl = /*avObjects.get(0).getString("value2")*/instance.value2; + if (actionUrl != null) { + binding.activityOpeningRenewalImgAds.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.setData(Uri.parse(actionUrl)); +// startActivity(intent); + AgentWebActivity.navigation2( + OpeningRenewalVipActivity.this, + Uri.parse(actionUrl)); + } + }); + } + } + } +// } +// +// @Override +// public void onError(Throwable e) { +// +// } +// +// @Override +// public void onComplete() { +// +// } + }); + + binding.activityOpeningRenewalBtnTaobaoLink.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", "taobaoUrl"); +// startActivity(intent); + AgentWebActivity.navigation2( + OpeningRenewalVipActivity.this, + "taobaoUrl"); + } + }); + binding.activityOpeningRenewalBtnContactCustomerService.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", "android_url_contact_author"); +// startActivity(intent); + AgentWebActivity.navigation2( + OpeningRenewalVipActivity.this, + "android_url_contact_author" + ); + } + }); + + binding.activityOpeningRenewalBtnWepay.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (total_fee <= 0) { + ToastUtils.showShort("请联网获取价格"); + return; + } + binding.activityOpeningRenewalRadiobuttonOneYear.setEnabled(false); + binding.activityOpeningRenewalRadiobuttonOneMonth.setEnabled(false); + binding.activityOpeningRenewalRadiobuttonThreeMonths.setEnabled(false); + showPayListDialog(); + } + }); + + binding.activityOpeningRenewalBtnOpeningRenewalVipTutorial.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", "android_url_opening_renewal_tutorial"); +// startActivity(intent); + AgentWebActivity.navigation2( + OpeningRenewalVipActivity.this, + "android_url_opening_renewal_tutorial" + ); + } + }); + } + + public void showPayListDialog() { + if (LCUser.getCurrentUser() == null) { + ToastUtils.showShort("请重新登录"); + return; + } + if (LCUser.getCurrentUser().getMobilePhoneNumber() == null) { + ToastUtils.showShort("账号绑定的手机号为空,请绑定后再试"); + return; + } + int fee = total_fee <= 0 ? 50000 : total_fee; + nativeOrder(fee);//由于云引擎appid是测量员的,所以无法调用app下单,只能二维码下单 +// new MaterialDialog.Builder(this) +// .title(R.string.choose_wechat_pay_type) +// .items(new String[]{getString(R.string.wechat_direct_pay), getString(R.string.wechat_qr_pay)}) +// .itemsCallback(new MaterialDialog.ListCallback() { +// @Override +// public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { +// switch (which) { +// case 0: +// appOrder(fee); +// break; +// case 1: +// nativeOrder(fee); +// break; +// } +// binding.activityOpeningRenewalBtnWepay.setEnabled(false); +// } +// }).show(); + } + + /** + * 二维码下单 + * + * @param fee 金额,单位分 + */ + private void nativeOrder(int fee) { + WxPayV3.getInstance().generateNativeVipOrder(this, + LCUser.getCurrentUser().getSessionToken(), + "导线助手会员", + fee, + orderType, + new WxPayV3.nativeOrderGenerateListener() { + @Override + public void onOrderGenerateSuccess(String code_url) { + showQrCode(code_url); + } + + @Override + public void onOrderGenerateFailed(String errorMsg) { + ToastUtils.showLong(errorMsg); + } + }); + } + + /** + * App跳转微信支付,下单 + * + * @param fee 金额,单位分 + */ + private void appOrder(int fee) { + //查询订单是否支付成功 + payingDialog = new MaterialDialog.Builder(OpeningRenewalVipActivity.this) + .title(R.string.hint) + .content("正在支付……稍后请点击\"支付完成\"") + .positiveText(R.string.pay_over) + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + //查询订单是否支付成功 + queryOrderStatus(); + } + }) + .show(); + + WxPayV3.getInstance().generateAppVipOrder(this, + LCUser.getCurrentUser().getSessionToken(), + "导线助手会员", + fee, + orderType, + new WxPayV3.appOrderGenerateListener() { + @Override + public void onOrderGenerateSuccess() { + hasPayResult = false; + WxPayV3.getInstance().pay(); + } + + @Override + public void onOrderGenerateFailed(String errorMsg) { + ToastUtils.showLong(errorMsg); + } + }); + } + + /** + * 查询订单支付状态 + */ + private void queryOrderStatus() { + binding.activityOpeningRenewalBtnWepay.setEnabled(true); + if (payingDialog != null) + payingDialog.dismiss(); + WxPayV3.getInstance().queryVipOrder(this, new WxPayV3.VipOrderQueryListener() { + @Override + public void onOrderPaySuccess(String orderType, Date paySuccessDate) { + VipManager.getInstance().controlSdkRefresh(OpeningRenewalVipActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() { + @Override + public void onRefreshSuccess() { + binding.activityOpeningRenewalTvExpirationDate.setText(String.format("%s:%s", getString(R.string.current_expiration_date), DateUtils.toFull(VipManager.getInstance().expireDate))); + new AlertDialog.Builder(OpeningRenewalVipActivity.this) + .setTitle(R.string.success) + .setMessage("续费成功,当前到期时间为" + DateUtils.toFull(VipManager.getInstance().expireDate)) + .setPositiveButton(R.string.confirm, null) + .setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + setResult(RESULT_OK); + finish(); + } + }) + .show(); + } + + @Override + public void onRefreshFailed(int errorCode) { + ToastUtils.showShort(getString(R.string.error_code) + ":" + errorCode); + } + }); + } + + @Override + public void onOrderQueryFailed(String errorMsg) { + tryQueryPayResultAgain(getString(R.string.pay_failed), errorMsg); + } + }); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + setResult(RESULT_OK); + finish(); + } + return super.onOptionsItemSelected(item); + } + + @Override + protected void onResume() { + super.onResume(); + if (hasPayResult) { + queryOrderStatus(); + hasPayResult = false; + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(PayOverEvent event) { + hasPayResult = true; + } + + /** + * 查询失败后再次显示查询查询 + */ + private void tryQueryPayResultAgain(String title, String message) { + if (!ActivityUtils.isLiving(this)) { + return; + } + new AlertDialog.Builder(OpeningRenewalVipActivity.this) + .setTitle(title) + .setMessage(message) + .setPositiveButton(R.string.query_again, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (queryCount >= 5) { + ToastUtils.showLong(R.string.query_times_cannot_bigger_than_five); + return; + } + queryCount++; + //查询订单是否支付成功 + queryOrderStatus(); + } + }) + .setNegativeButton(R.string.cancel, null) + .show(); + } + + /** + * 生成二维码 + */ + public void showQrCode(String code_url) { + MaterialDialog dialog = new MaterialDialog.Builder(this) + .title(R.string.wechat_qr_pay) + .customView(R.layout.dialog_register_pay_qr_code, false) + .positiveText(this.getString(R.string.pay_over)) + .dismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialogInterface) { + //查询订单是否支付成功 + queryOrderStatus(); + } + }) + .build(); + + qrImageView = dialog.getCustomView().findViewById(R.id.dialog_register_pay_qr_code_imageview); + try { + HmsBuildBitmapOption options = new HmsBuildBitmapOption.Creator() + .setBitmapMargin(1) + .setBitmapColor(Color.BLACK) + .setBitmapBackgroundColor(Color.WHITE) + .create(); + Bitmap resultImage = ScanUtil.buildBitmap(code_url, HmsScan.QRCODE_SCAN_TYPE, 700, 700, options); + qrImageView.setImageBitmap(resultImage); + } catch (WriterException e) { + ToastUtils.showShort("二维码参数错误!"); + } + if (!ActivityUtils.isLiving(this)) { + return; + } + dialog.show(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + EventBus.getDefault().unregister(this); + if (payingDialog != null) { + payingDialog.dismiss(); + payingDialog = null; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/user/RedeemVipActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/user/RedeemVipActivity.java new file mode 100644 index 0000000..c77c3b9 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/user/RedeemVipActivity.java @@ -0,0 +1,171 @@ +package com.bingce.controlnetwork.activity.user; + +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; + +import androidx.appcompat.app.AlertDialog; + +import com.bingce.AppChannel; +import com.bingce.activity.VipCloudFunction; +import com.bingce.controlapphelper.util.HideKeyUtil; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.ActivityRedeemBinding; +import com.bingce.utils.DateUtils; +import com.bingce.utils.VipManager; + +import org.polaric.colorful.ColorfulActivity; + +import java.util.Date; + +import blankj.utilcode.util.AppUtils; +import blankj.utilcode.util.ToastUtils; +import cn.leancloud.LCObject; +import cn.leancloud.LCUser; + +public class RedeemVipActivity extends ColorfulActivity { + private ProgressDialog progressDialog; + private LCObject cashVoucherLCObject; + private ActivityRedeemBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityRedeemBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + setSupportActionBar(binding.getRoot().findViewById(R.id.toolbar)); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + initMaterialEditTextColor(); + + binding.activityRedeemTvVersion.setText("V" + AppUtils.getAppVersionName()); + + if (LCUser.getCurrentUser() != null) { + if (VipManager.getInstance().expireDate != null) { + binding.activityRedeemTvExpirationDate.setText(getString(R.string.current_expiration_date) + ":" + DateUtils.toFull(VipManager.getInstance().expireDate)); + } else { + binding.activityRedeemTvExpirationDate.setText(getString(R.string.current_expiration_date) + ":无"); + } + } else { + ToastUtils.showShort(R.string.not_log_in); + finish(); + } + + if (VipManager.getInstance().checkReg()) { + new AlertDialog.Builder(this) + .setTitle(R.string.hint) + .setMessage("此手机已经绑定激活,请确定是否需要购买会员,绑定激活和购买会员可以二选其一") + .setPositiveButton(R.string.i_know, null) + .show(); + } + + binding.activityRedeemMetRedeemCode.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) { + binding.activityRedeemBtnRedeem.setEnabled(!"".equals(binding.activityRedeemMetRedeemCode.getText().toString().trim())); + } + }); + + binding.activityRedeemBtnRedeem.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (LCUser.getCurrentUser() == null) { + ToastUtils.showShort(R.string.not_log_in); + return; + } + HideKeyUtil.hideSoftInput(); + if (binding.activityRedeemMetRedeemCode.getText().toString().trim().length() != 24) { + ToastUtils.showShort(R.string.cash_voucher_code_length_must_be_24); + return; + } + + progressDialog = new ProgressDialog(RedeemVipActivity.this); + progressDialog.setMessage(getString(R.string.please_wait)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + + String cashVoucherCode = binding.activityRedeemMetRedeemCode.getText().toString().trim().toLowerCase(); + VipCloudFunction.redeemVip(LCUser.getCurrentUser().getSessionToken(), cashVoucherCode, AppChannel.customChannel, new VipCloudFunction.OnRedeemVipListener() { + @Override + public void onRedeemSuccess(Date newExpireDate) { + if (progressDialog != null) + progressDialog.dismiss(); + + savePayLog(cashVoucherCode, newExpireDate); + + new AlertDialog.Builder(RedeemVipActivity.this) + .setTitle(R.string.success) + .setMessage("续费成功,当前到期时间为" + DateUtils.toFull(newExpireDate)) + .setPositiveButton(R.string.confirm, null) + .setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + setResult(RESULT_OK); + finish(); + } + }) + .show(); + } + + @Override + public void onRedeemFailed(String errorMsg) { + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showShort(errorMsg); + } + }); + } + }); + } + + private void savePayLog(String cashVoucher, Date newExpireDate) { + final LCObject payLog = new LCObject("PayLog"); + payLog.put("payFor", "兑换会员"); + payLog.put("user", LCUser.getCurrentUser()); + payLog.put("currentExpireDate", newExpireDate); + payLog.put("client", "android"); + payLog.put("channel", "cashVoucher"); + payLog.put("total_fee", "0"); + payLog.put("cash_fee", "0"); + payLog.put("versionCode", AppUtils.getAppVersionCode()); + payLog.put("cashVoucher", cashVoucher); + payLog.saveInBackground().subscribe(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + } + return super.onOptionsItemSelected(item); + } + + private void initMaterialEditTextColor() { + if (SettingValueUtil.isThemeDark()) { + binding.activityRedeemMetRedeemCode.setMetTextColor(Color.WHITE); + + binding.activityRedeemMetRedeemCode.setPrimaryColor(Color.LTGRAY); + + binding.activityRedeemMetRedeemCode.setFocusFraction(1.0f); + + binding.activityRedeemMetRedeemCode.setMetHintTextColor(Color.GRAY); + + binding.activityRedeemMetRedeemCode.setUnderlineColor(Color.GRAY); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/user/RegisterActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/user/RegisterActivity.java new file mode 100644 index 0000000..e420b66 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/user/RegisterActivity.java @@ -0,0 +1,500 @@ +package com.bingce.controlnetwork.activity.user; + +import android.Manifest; +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.os.Build; +import android.os.Bundle; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; + +import com.afollestad.materialdialogs.DialogAction; +import com.afollestad.materialdialogs.MaterialDialog; +import com.bingce.AppChannel; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlnetwork.R; +import com.bingce.data.sync.utils.LeanCloudConfigLoader; +import com.bingce.device.enums.SpecialDeviceEnum; +import com.bingce.device.ui.dialog.DialogUtil; +import com.bingce.surveyor.agentweb.AgentWebActivity; +import com.bingce.utils.AppUtil; +import com.bingce.utils.ClipboardUtils; +import com.bingce.utils.PropertiesGet; +import com.bingce.utils.RegisterUtil; +import com.bingce.utils.StringUtil; +import com.bingce.utils.Util; +import com.bingce.utils.VipManager; +import com.hjq.permissions.OnPermissionCallback; +import com.hjq.permissions.Permission; +import com.hjq.permissions.XXPermissions; +import com.huawei.hms.hmsscankit.ScanUtil; +import com.huawei.hms.hmsscankit.WriterException; +import com.huawei.hms.ml.scan.HmsBuildBitmapOption; +import com.huawei.hms.ml.scan.HmsScan; +import com.rengwuxian.materialedittext.MaterialEditText; + +import org.polaric.colorful.ColorfulActivity; + +import java.util.List; +import java.util.Locale; + +import blankj.utilcode.util.AppUtils; +import blankj.utilcode.util.ToastUtils; +import blankj.utilcode.util.Utils; +import cn.leancloud.LCException; +import cn.leancloud.LCObject; +import cn.leancloud.LCQuery; +import cn.leancloud.LCUser; + +import com.bingce.controlnetwork.App; + +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; + +public class RegisterActivity extends ColorfulActivity { + private MaterialEditText met_machine_code, met_activate_code; + private Button mBtnCopy, mBtnActivate, mBtnTaobaoLink, mBtnContactAuthor, mBtnMachineQr, mBtnActivateTutorial; + private TextView mTextViewActivity, mTextViewVersion; + private String mMachineCode = "", mOriginalMachineCode = ""; + private Toolbar mToolbar; + boolean hasAndroidPermission = false; + private ProgressDialog progressDialog; + private ImageView qrImageView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_activate); + mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + initWidget(); + initMaterialEditTextColor(); + + mTextViewVersion.setText("V" + AppUtils.getAppVersionName()); + + if (AppChannel.customChannel != AppChannel.CUSTOM_INTERNATIONAL + && AppChannel.customChannel != AppChannel.CUSTOM_TERSUS_INTERNATIONAL + && AppChannel.customChannel != AppChannel.CUSTOM_PENTAX_INTERNATIONAL + && AppChannel.customChannel != AppChannel.CUSTOM_TUNNEL_AUTO_SCAN) { + if (!AppUtil.isZh()) {//国内发行版本在非简体中文语言下不可用 + DialogUtil.mDismissAlertDialog(this, R.string.hint, R.string.activation_can_only_use_in_simple_chinese, R.string.i_know, null, dialogInterface -> finish()); + } + } + + boolean isSpecial = false; + for (SpecialDeviceEnum device : SpecialDeviceEnum.values()) { + if (device.getModel().equals(PropertiesGet.getModel()) + && device.getDevice().equals(PropertiesGet.getDevice()) + && device.getBoard().equals(PropertiesGet.getBoard()) + && device.getBrand().equals(PropertiesGet.getBrand()) + && device.getCpuAbi().equals(PropertiesGet.getCpuAbi()) + && device.getHardware().equals(PropertiesGet.getHardware()) + && device.getManufacturer().equals(PropertiesGet.getManufacturer())) { + isSpecial = true; + break; + } + } + if (!isSpecial && Build.VERSION.SDK_INT >= 29) { + mBtnTaobaoLink.setVisibility(View.GONE); + new AlertDialog.Builder(this) + .setMessage("由于安卓10及以上系统限制App读取硬件信息,原来绑定手机激活的方式已经不可用,如果您之前绑定手机激活过,很遗憾,现在只能刷机降级到安卓9或安卓8重新输入激活才可以。如果您不想刷机,可以购买会员继续使用") + .setPositiveButton(R.string.user_vip_activate, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (LCUser.getCurrentUser() == null) { + Intent intent = new Intent(Utils.getApp(), LoginActivity.class); + intent.putExtra("finishTo", UserInfoActivity.class.getName()); + startActivity(intent); + } else { + startActivity(new Intent(RegisterActivity.this, UserInfoActivity.class)); + } + } + }) + .setNeutralButton(R.string.opening_vip_tutorial, 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_opening_renewal_tutorial"); +// startActivity(intent); + AgentWebActivity.navigation2(RegisterActivity.this, + "android_url_opening_renewal_tutorial"); + } + }) + .setNegativeButton(R.string.cancel, null) + .setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + if (!hasAndroidPermission) + finish(); + } + }).show(); + } else { + int checkStoragePermission = ContextCompat.checkSelfPermission(Utils.getApp(), Manifest.permission.READ_PHONE_STATE); + if (checkStoragePermission != PackageManager.PERMISSION_GRANTED) { + requestPhoneStatePermission(this); + } else { + if ("SERIALNUMBERunknown".equals(RegisterUtil.getOriginalMachineCode()) || "SERIALNUMBERnull".equals(RegisterUtil.getOriginalMachineCode())) { + new MaterialDialog.Builder(this) + .title(R.string.hint) + .content("此手机机器码未知,请关闭相关限制软件请重启软件") + .positiveText(R.string.i_know) + .dismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + finish(); + } + }).show(); + } + } + } + if (VipManager.getInstance().checkReg()) { + getSupportActionBar().setTitle(R.string.activated); + met_activate_code.setText(((App) Utils.getApp()).registerCodeV2); + mBtnActivate.setEnabled(false); + met_activate_code.setEnabled(false); + mBtnActivate.setText(R.string.activated); + } + + mMachineCode = RegisterUtil.getEncryptMachineCode(); + mOriginalMachineCode = RegisterUtil.getOriginalMachineCode(); + if (mMachineCode != null) { + met_machine_code.setText(mMachineCode); + } else { + met_machine_code.setText(getString(R.string.get_machine_code_fail)); + } + String queryUrl = "activate_activity_for_control_network"; + LeanCloudConfigLoader.findInBackground(queryUrl, instance -> { +// new LCQuery<>("Configuration") +// .whereEqualTo("name", queryUrl) +// .limit(1) +// .findInBackground() +// .subscribe(new Observer>() { +// @Override +// public void onSubscribe(Disposable d) { +// +// } +// +// @Override +// public void onNext(List avObjects) { + if (isFinishing()) return; + if (/*avObjects != null && !avObjects.isEmpty() && avObjects.get(0).getString("value") != null*/instance != null && StringUtil.isNotEmpty(instance.value)) { + String activity = /*avObjects.get(0).getString("value")*/instance.value; + mTextViewActivity.setText(activity); + } +// } +// +// @Override +// public void onError(Throwable e) { +// +// } +// +// @Override +// public void onComplete() { +// +// } + }); + mBtnCopy.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + if (mMachineCode != null) { + ClipboardUtils.copyText(mMachineCode); + ToastUtils.showShort(R.string.has_copy_to_clipboard); + } else { + ToastUtils.showShort(R.string.get_machine_code_fail); + } + } + }); + mBtnActivate.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + if (AppChannel.customChannel != AppChannel.CUSTOM_INTERNATIONAL + && AppChannel.customChannel != AppChannel.CUSTOM_TERSUS_INTERNATIONAL + && AppChannel.customChannel != AppChannel.CUSTOM_PENTAX_INTERNATIONAL + && AppChannel.customChannel != AppChannel.CUSTOM_TUNNEL_AUTO_SCAN) { + if (!AppUtil.isZh()) {//国内发行版本在非简体中文语言下不可用 + DialogUtil.mDismissAlertDialog(RegisterActivity.this, R.string.hint, R.string.activation_can_only_use_in_simple_chinese, R.string.i_know, null, null); + } + } + final String registerCode = met_activate_code.getText().toString().trim().toUpperCase(Locale.CHINA).replaceAll(" |\n|\r", ""); + if (mMachineCode == null) { + ToastUtils.showShort(R.string.machine_code_illegal); + return; + } + if ("".equals(met_activate_code.getText().toString().trim())) { + ToastUtils.showShort(R.string.please_input_register_code); + return; + } + if (registerCode.length() != 16) { + ToastUtils.showShort(R.string.register_code_is_16_characters); + return; + } + progressDialog = new ProgressDialog(RegisterActivity.this); + progressDialog.setMessage(getString(R.string.please_wait)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + + new LCQuery<>("DeviceBlacklist") + .whereEqualTo("machineCode", mOriginalMachineCode) + .limit(1) + .findInBackground().subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(List avObjects) { + if (isFinishing()) return; + if (avObjects == null || avObjects.isEmpty()) { + new LCQuery<>("Device") + .whereEqualTo("machineCode", mOriginalMachineCode) + .limit(1) + .findInBackground() + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(final List devices) { + if (isFinishing()) return; + if (devices != null && !devices.isEmpty() + && devices.get(0).getBoolean("activated") + && !devices.get(0).getBoolean("converted")) { + ((App) Utils.getApp()).registerCodeV2 = registerCode; + Util.putPreference("registerCodeV2", registerCode); + + VipManager.getInstance().controlSdkRefresh(RegisterActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() { + @Override + public void onRefreshSuccess() { + progressDialog.dismiss(); + getSupportActionBar().setTitle(R.string.activated); + mBtnActivate.setEnabled(false); + met_activate_code.setEnabled(false); + ToastUtils.showShort(R.string.activate_success); + } + + @Override + public void onRefreshFailed(int errorCode) { + progressDialog.dismiss(); + ToastUtils.showShort(getString(R.string.error_code) + ":" + errorCode); + } + }); + //激活次数+1 + devices.get(0).increment("activationTimes"); + devices.get(0).saveInBackground().subscribe(); + } else if (devices.get(0).getBoolean("converted")) { + progressDialog.dismiss(); + ToastUtils.showShort("此设备已经兑换过年会员,无法再绑定手机"); + } else if (!devices.get(0).getBoolean("activated")) { + progressDialog.dismiss(); + ToastUtils.showShort("无法激活,请联系开发人员"); + } else { + progressDialog.dismiss(); + ToastUtils.showShort(R.string.cloud_has_not_register_code); + } + } + + @Override + public void onError(Throwable e) { + progressDialog.dismiss(); + ToastUtils.showShort(getString(R.string.error_code) + ":" + new LCException(e).getCode()); + } + + @Override + public void onComplete() { + + } + }); + } else { + progressDialog.dismiss(); + ToastUtils.showShort(R.string.you_are_in_blacklist); + } + } + + @Override + public void onError(Throwable e) { + progressDialog.dismiss(); + ToastUtils.showShort(getString(R.string.activate_need_to_connect_to_the_internet) + "," + getString(R.string.error_code) + ":" + new LCException(e).getCode()); + } + + @Override + public void onComplete() { + + } + }); + } + }); + mBtnTaobaoLink.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", "taobaoUrl"); +// startActivity(intent); + AgentWebActivity.navigation2(RegisterActivity.this, "taobaoUrl"); + } + }); + mBtnContactAuthor.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", "android_url_contact_author"); +// startActivity(intent); + AgentWebActivity.navigation2(RegisterActivity.this, + "android_url_contact_author"); + } + }); + + mBtnMachineQr.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (!mMachineCode.isEmpty()) + showMachineCodeQr(mMachineCode); + } + }); + + mBtnActivateTutorial.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { +// Intent intent = new Intent(); +// intent.setClass(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", "android_url_activate_tutorial"); +// startActivity(intent); + AgentWebActivity.navigation2( + RegisterActivity.this, + "android_url_activate_tutorial"); + } + }); + } + + private void initWidget() { + met_machine_code = findViewById(R.id.activity_activate_met_machine_code); + met_activate_code = findViewById(R.id.activity_activate_met_activate_code); + mBtnCopy = findViewById(R.id.activity_activate_btn_copy); + mBtnActivate = findViewById(R.id.activity_activate_btn_activate); + mBtnTaobaoLink = findViewById(R.id.activity_activate_btn_taobao_link); + mBtnContactAuthor = findViewById(R.id.activity_activate_btn_contact_customer_service); + mBtnMachineQr = findViewById(R.id.activity_activate_btn_machine_code_qr_code); + mBtnActivateTutorial = findViewById(R.id.activity_activate_btn_activate_tutorial); + mTextViewActivity = findViewById(R.id.activity_activate_tv_activity); + mTextViewVersion = findViewById(R.id.activity_activate_tv_version); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + } + return super.onOptionsItemSelected(item); + } + + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 12) { + if (resultCode == Activity.RESULT_OK) { + met_activate_code.setText(((App) Utils.getApp()).registerCodeV2); + getSupportActionBar().setTitle(R.string.activated); + mBtnActivate.setEnabled(false); + met_activate_code.setEnabled(false); + } + } + } + + private void initMaterialEditTextColor() { + if (SettingValueUtil.isThemeDark()) { + met_machine_code.setMetTextColor(Color.WHITE); + met_activate_code.setMetTextColor(Color.WHITE); + + met_machine_code.setPrimaryColor(Color.LTGRAY); + met_activate_code.setPrimaryColor(Color.LTGRAY); + + met_machine_code.setFocusFraction(1.0f); + met_activate_code.setFocusFraction(1.0f); + + met_machine_code.setMetHintTextColor(Color.GRAY); + met_activate_code.setMetHintTextColor(Color.GRAY); + + met_machine_code.setUnderlineColor(Color.GRAY); + met_activate_code.setUnderlineColor(Color.GRAY); + } + } + + /** + * 生成机器码的二维码 + */ + public void showMachineCodeQr(String mMachineCode) { + MaterialDialog dialog = new MaterialDialog.Builder(this) + .title(R.string.machine_code) + .customView(R.layout.dialog_machine_code_qr_code, false) + .positiveText(this.getString(R.string.close)) + .build(); + + qrImageView = dialog.getCustomView().findViewById(R.id.dialog_machine_code_qr_code_imageview); + try { + HmsBuildBitmapOption options = new HmsBuildBitmapOption.Creator() + .setBitmapMargin(1) + .setBitmapColor(Color.BLACK) + .setBitmapBackgroundColor(Color.WHITE) + .create(); + Bitmap resultImage = ScanUtil.buildBitmap(mMachineCode, HmsScan.QRCODE_SCAN_TYPE, 700, 700, options); + qrImageView.setImageBitmap(resultImage); + } catch (WriterException e) { + ToastUtils.showShort("二维码参数错误!"); + } + dialog.show(); + } + + public static void requestPhoneStatePermission(Context context) { + new MaterialDialog.Builder(context) + .title(R.string.mobile_phone_permissions) + .content(R.string.verify_imei_imsi_code_to_prevent_account_theft) + .canceledOnTouchOutside(false) + .positiveText(R.string.to_allow) + .negativeText(R.string.refuse) + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + XXPermissions.with(context) + .permission(Permission.READ_PHONE_STATE) + .request(new OnPermissionCallback() { + @Override + public void onGranted(List permissions, boolean all) { + } + + @Override + public void onDenied(List permissions, boolean never) { + if (never) { + ToastUtils.showShort(R.string.manually_enable_the_phone_state_permission_to_bind_hardware_devices); + } else { + ToastUtils.showShort(R.string.please_open_permission_to_activation); + requestPhoneStatePermission(context); + } + } + }); + } + }) + .show(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/user/UserInfoActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/user/UserInfoActivity.java new file mode 100644 index 0000000..44c42fa --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/user/UserInfoActivity.java @@ -0,0 +1,812 @@ +package com.bingce.controlnetwork.activity.user; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.net.Uri; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.Toolbar; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import com.afollestad.materialdialogs.DialogAction; +import com.afollestad.materialdialogs.MaterialDialog; +import com.afollestad.materialdialogs.internal.MDButton; +import com.bingce.AppChannel; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlnetwork.ui.WechatImagePicker; +import com.bingce.device.ui.dialog.DialogUtil; +import com.bingce.utils.AppUtil; +import com.bingce.utils.DateUtils; +import com.bingce.utils.FileUtil; +import com.bingce.utils.LCDeviceUtil; +import com.bingce.utils.ServiceDateUtils; +import com.bingce.utils.ValidateUtil; +import com.bingce.utils.VipManager; +import com.bumptech.glide.Glide; +import com.leon.lib.settingview.LSettingItem; +import com.qingmei2.rximagepicker.core.RxImagePicker; +import com.qingmei2.rximagepicker.entity.Result; +import com.qingmei2.rximagepicker_extension.MimeType; +import com.qingmei2.rximagepicker_extension_wechat.WechatConfigrationBuilder; +import com.qingmei2.rximagepicker_extension_wechat.ui.WechatImagePickerFragment; +import com.yalantis.ucrop.UCrop; + +import org.jetbrains.annotations.NotNull; +import org.polaric.colorful.ColorfulActivity; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Date; +import java.util.List; + +import blankj.utilcode.util.StringUtils; +import blankj.utilcode.util.ToastUtils; +import blankj.utilcode.util.Utils; +import cn.leancloud.LCFile; +import cn.leancloud.LCObject; +import cn.leancloud.LCQuery; +import cn.leancloud.LCUser; + +import com.bingce.controlnetwork.App; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.DialogEditNicknameBinding; + +import de.hdodenhof.circleimageview.CircleImageView; +import id.zelory.compressor.Compressor; +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; + +public class UserInfoActivity extends ColorfulActivity { + private static final String TAG = "UserInfoActivity"; + private static final int REQUEST_CODE_ASK_CAMERA = 166; + private static final int REQUEST_CODE_UPDATE_USER_INFO = 11; + private Toolbar mToolbar; + private CircleImageView avatarImageView; + private TextView tv_nick_name; + private ImageView tv_nick_name_edit; + private MDButton mPositiveAction; + private LSettingItem item_phone, item_email, item_user_level, item_expiration, item_bound_device, item_control_level, item_control_expiration; + private WechatImagePicker rxImagePicker; + private Button btn_log_out, btn_opening_renewal; + private ProgressDialog progressDialog; + private boolean buy = false; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_user_info); + mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + buy = getIntent().getBooleanExtra("buy", false); + + rxImagePicker = RxImagePicker.create(WechatImagePicker.class); + + avatarImageView = findViewById(R.id.activity_user_info_avatar_image); + tv_nick_name = findViewById(R.id.activity_user_info_nick_name); + tv_nick_name_edit = findViewById(R.id.activity_user_info_nick_name_edit); + item_phone = findViewById(R.id.activity_user_info_item_phone); + item_email = findViewById(R.id.activity_user_info_item_email); + item_user_level = findViewById(R.id.activity_user_info_item_user_level); + item_expiration = findViewById(R.id.activity_user_info_item_expiration_date); + item_bound_device = findViewById(R.id.activity_user_info_item_bound_device); + item_control_level = findViewById(R.id.activity_user_info_item_control_level); + item_control_expiration = findViewById(R.id.activity_user_info_item_control_expiration_date); + btn_opening_renewal = findViewById(R.id.activity_user_info_btn_opening_renewal); + btn_log_out = findViewById(R.id.activity_user_info_btn_log_out); + + if (AppChannel.customChannel != AppChannel.CUSTOM_CONTROL_INTERNATIONAL + && AppChannel.customChannel != AppChannel.CUSTOM_CONTROL_INTERNATIONAL_PRO) { + if (!AppUtil.isZh()) {//国内发行版本在非简体中文语言下不可用 + DialogUtil.mDismissAlertDialog(this, R.string.hint, R.string.activation_can_only_use_in_simple_chinese, R.string.i_know, null, null); + } + } + + updateUserInfo(); + + avatarImageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showProfileAvatarChangeDialog(); + } + }); + tv_nick_name.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showEditNicknameDialog(); + } + }); + tv_nick_name_edit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showEditNicknameDialog(); + } + }); + item_phone.setOnSettingItemClick(new LSettingItem.onSettingItemClick() { + @Override + public void click(boolean isChecked) { + if (!LCUser.getCurrentUser().isMobilePhoneVerified()) { +// Intent intent = new Intent(Utils.getApp(), MobilePhoneVerifyActivity.class); +// startActivity(intent); + } + } + }); + btn_log_out.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + LCUser.logOut(); + ToastUtils.showShort(R.string.log_out); + VipManager.getInstance().controlSdkRefresh(UserInfoActivity.this, ((App) Utils.getApp()).registerCodeV2, null); + ((App) Utils.getApp()).isUserStatusChanged = true;//返回MainActivity时updateHeaderResult + finish(); + } + }); + btn_opening_renewal.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (AppChannel.customChannel != AppChannel.CUSTOM_CONTROL_PUBLIC) { + new AlertDialog.Builder(UserInfoActivity.this) + .setTitle(R.string.hint) + .setMessage("定制版本无法续费,只能以绑定手机形式使用") + .setPositiveButton(R.string.i_know, null) + .show(); + } else if (LCUser.getCurrentUser().getInt("level") == 0 || LCUser.getCurrentUser().getInt("level") == 1) { + startActivityForResult(new Intent(UserInfoActivity.this, OpeningRenewalVipActivity.class), REQUEST_CODE_UPDATE_USER_INFO); + } else { + ToastUtils.showShort("当前会员模式不支持续费,请联系开发者"); + } + } + }); + + item_bound_device.setOnSettingItemClick(new LSettingItem.onSettingItemClick() { + @Override + public void click(boolean isChecked) { + unbind(); + } + }); + + if (buy) { + btn_opening_renewal.performClick(); + } + } + + private void unbind() { + if (LCUser.getCurrentUser() != null) { + progressDialog = new ProgressDialog(UserInfoActivity.this); + progressDialog.setMessage(getString(R.string.please_wait)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + + ServiceDateUtils.getServerDate(new DateUtils.OnServerDateCallBack() { + @Override + public void get(Date serverDate) { + if (isFinishing()) return; + //查询条件为:查询今年开始时间,查询开年来的解绑次数 + Date startOfAYear = DateUtils.addDayOfMonth(serverDate, -365, false, false); + + LCQuery unbindDeviceQuery = new LCQuery<>("UnbindDevice"); + unbindDeviceQuery.whereEqualTo("user", LCUser.getCurrentUser()); + unbindDeviceQuery.limit(15) + .whereGreaterThan("updatedAt", startOfAYear) + .findInBackground().subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(List avObjects) { + progressDialog.dismiss(); + if (avObjects != null) { + int totalTimes = 0; + if (LCUser.getCurrentUser().getInt("level") == 1) { + totalTimes = 5; + } else if (LCUser.getCurrentUser().getInt("level") == 10) { + totalTimes = 10; + } + final int leftTimes = Math.max(totalTimes - avObjects.size(), 0); + new MaterialDialog.Builder(UserInfoActivity.this) + .title(R.string.unbind_device) + .content(getString(R.string.number_of_untying_opportunities_at_your_membership_level) + ":" + totalTimes + "\n" + + getString(R.string.your_remaining_untying_times_remain) + ":" + leftTimes) + .positiveText(R.string.unbind_device) + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + if (leftTimes > 0) { + progressDialog = new ProgressDialog(UserInfoActivity.this); + progressDialog.setMessage(getString(R.string.please_wait)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + + LCObject unbindDevice = new LCObject("UnbindDevice"); + unbindDevice.put("user", LCUser.getCurrentUser()); + if (LCUser.getCurrentUser().get("controlBoundDevice") != null) + unbindDevice.put("oldDevice", LCUser.getCurrentUser().get("controlBoundDevice")); + unbindDevice.put("success", true); + unbindDevice.saveInBackground().subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(LCObject avObject) { + LCUser.getCurrentUser().remove("controlBoundDevice"); + LCUser.getCurrentUser().saveInBackground().subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(LCObject avObject) { + if (VipManager.getInstance().isControlBoundDevice) { + LCUser.logOut(); + VipManager.getInstance().controlSdkRefresh(UserInfoActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() { + @Override + public void onRefreshSuccess() { + progressDialog.dismiss(); + new MaterialDialog.Builder(UserInfoActivity.this) + .title(R.string.unbind_device_success) + .content(R.string.unbind_device_success_next_to_do) + .positiveText(R.string.i_know) + .dismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + ((App) Utils.getApp()).isUserStatusChanged = true;//返回MainActivity时updateHeaderResult + finish(); + } + }) + .show(); + } + + @Override + public void onRefreshFailed(int errorCode) { + progressDialog.dismiss(); + } + }); + } else { + LCDeviceUtil.updateDeviceInfo("controlnetwork", ((App) Utils.getApp()).registerCodeV2, new LCDeviceUtil.OnDeviceUpdateListener() { + @Override + public void onUpdateSuccess() { + VipManager.getInstance().surveyorSdkRefresh(UserInfoActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() { + @Override + public void onRefreshSuccess() { + progressDialog.dismiss(); + item_bound_device.setRightText(VipManager.getInstance().boundName); + ToastUtils.showShort(R.string.unbind_device_success); + } + + @Override + public void onRefreshFailed(int errorCode) { + progressDialog.dismiss(); + ToastUtils.showShort(getString(R.string.error_code) + ":" + errorCode); + } + }); + } + + @Override + public void onUpdateFailed() { + progressDialog.dismiss(); + } + }); + } + } + + @Override + public void onError(Throwable e) { + progressDialog.dismiss(); + } + + @Override + public void onComplete() { + + } + }); + + } + + @Override + public void onError(Throwable e) { + progressDialog.dismiss(); + } + + @Override + public void onComplete() { + + } + }); + } else { + ToastUtils.showLong(R.string.your_remaining_untying_times_remain_is_zero); + } + } + }) + .negativeText(R.string.cancel) + .show(); + } + } + + @Override + public void onError(Throwable e) { + progressDialog.dismiss(); + } + + @Override + public void onComplete() { + + } + }); + } + + @Override + public void error(Throwable throwable) { + progressDialog.dismiss(); + Log.d("error", "unbind_device"); + ToastUtils.showShort(R.string.get_server_date_failed); + } + }); + } else { + ToastUtils.showShort(R.string.you_are_not_vip_no_need_unbind); + } + } + + /** + * 刷新用户信息 + */ + private void updateUserInfo() { + if (LCUser.getCurrentUser() != null) { + if (LCUser.getCurrentUser().getMobilePhoneNumber() != null) + item_phone.setRightText(LCUser.getCurrentUser().getMobilePhoneNumber()); + if (LCUser.getCurrentUser().getEmail() != null) + item_email.setRightText(LCUser.getCurrentUser().getEmail()); + if (VipManager.getInstance().controlBoundName != null) + item_bound_device.setRightText(VipManager.getInstance().controlBoundName); + + fetchNickNameAndAvatar(); + + if (VipManager.getInstance().checkReg()) { + item_user_level.setRightText(getString(R.string.bound_device)); + item_expiration.setVisibility(View.GONE); + } else if (VipManager.getInstance().level > 0) { + item_expiration.setVisibility(View.VISIBLE); + if (VipManager.getInstance().expireDate != null) + item_expiration.setRightText(DateUtils.toFull(VipManager.getInstance().expireDate)); + if (VipManager.getInstance().isInExpireDate) { + switch (VipManager.getInstance().level) { + case 1: + item_user_level.setRightText(getString(R.string.user_level_1)); + break; + case 10: + item_user_level.setRightText(getString(R.string.surveyor_life_vip)); + break; + default: + item_user_level.setRightText(getString(R.string.user_level_unknown)); + } + } else { + item_user_level.setRightText(getString(R.string.vip_expired)); + } + } else { + item_user_level.setRightText(getString(R.string.user_level_0)); + item_expiration.setVisibility(View.GONE); + } + if (VipManager.getInstance().controlLevel > 0) { + item_control_level.setVisibility(View.VISIBLE); + item_control_expiration.setVisibility(View.VISIBLE); + item_control_expiration.setRightText(DateUtils.toFull(VipManager.getInstance().controlExpireDate)); + if (VipManager.getInstance().isControlInExpireDate) { + switch (VipManager.getInstance().controlLevel) { + case 1: + case 2: + item_control_level.setRightText(getString(R.string.user_level_try)); + break; + case 3: + item_control_level.setRightText(getString(R.string.user_level_control_pro)); + break; + } + } else { + item_control_level.setRightText(getString(R.string.vip_expired)); + } + } + + if (!VipManager.getInstance().checkReg() + && ((VipManager.getInstance().level > 0 && VipManager.getInstance().isInExpireDate) + || (VipManager.getInstance().eduLevel > 0 && VipManager.getInstance().isEduInExpireDate) + || (VipManager.getInstance().intlLevel > 0 && VipManager.getInstance().isIntlInExpireDate) + || (VipManager.getInstance().controlLevel > 0 && VipManager.getInstance().isControlInExpireDate)) + && !VipManager.getInstance().isControlBoundDevice) { + new MaterialDialog.Builder(UserInfoActivity.this) + .title(R.string.hint) + .content(R.string.unbind_old_device_first) + .positiveText(R.string.unbind_device) + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + unbind(); + } + }) + .negativeText(R.string.not_now) + .show(); + } + } else { + ToastUtils.showShort(R.string.not_log_in); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_activity_user_info, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + break; + case R.id.menu_activity_user_info_redeem_code: + if (AppChannel.customChannel != AppChannel.CUSTOM_CONTROL_PUBLIC) { + new AlertDialog.Builder(UserInfoActivity.this) + .setTitle(R.string.hint) + .setMessage("定制版本无法续费,只能以绑定手机形式使用") + .setPositiveButton(R.string.i_know, null) + .show(); + } else if (LCUser.getCurrentUser().getInt("level") == 0 || LCUser.getCurrentUser().getInt("level") == 1) { + startActivityForResult(new Intent(UserInfoActivity.this, RedeemVipActivity.class), REQUEST_CODE_UPDATE_USER_INFO); + } else { + ToastUtils.showShort("当前会员模式不支持续费,请联系开发者"); + } + break; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + if (grantResults.length > 0) { + if (requestCode == REQUEST_CODE_ASK_CAMERA) { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + pickByTake(); + } else { + ToastUtils.showShort(getString(R.string.please_granted_camera_permission)); + } + } else { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + } + + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case REQUEST_CODE_UPDATE_USER_INFO: + VipManager.getInstance().controlSdkRefresh(UserInfoActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() { + @Override + public void onRefreshSuccess() { + updateUserInfo(); + } + + @Override + public void onRefreshFailed(int errorCode) { + ToastUtils.showShort(getString(R.string.error_code) + ":" + errorCode); + } + }); + break; + case UCrop.REQUEST_CROP: + final Uri resultUri = UCrop.getOutput(data); + try { + File compressedImage = new Compressor(UserInfoActivity.this) + .setMaxWidth(256) + .setMaxHeight(256) + .setQuality(50) + .setCompressFormat(Bitmap.CompressFormat.JPEG) + .compressToFile(new File(FileUtil.getRealPathFromUri(resultUri))); + + updateProfileAvatar(compressedImage.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + } + break; + case UCrop.RESULT_ERROR: + final Throwable cropError = UCrop.getError(data); + if (cropError != null) + Log.d("cropError", cropError.getMessage()); + break; + } + } + } + + /** + * 编辑昵称 + */ + public void showEditNicknameDialog() { + if (LCUser.getCurrentUser() == null) { + ToastUtils.showShort(R.string.not_log_in); + return; + } + DialogEditNicknameBinding dialogEditNicknameBinding = DialogEditNicknameBinding.inflate(LayoutInflater.from(this)); + MaterialDialog dialog = new MaterialDialog.Builder(this) + .title(R.string.edit_nickname) + .customView(dialogEditNicknameBinding.getRoot(), false) + .onPositive((dialog1, which) -> { + final String nickname = dialogEditNicknameBinding.metDialogEditNickname.getText().toString(); + LCUser.getCurrentUser().put("nickname", nickname); + LCUser.getCurrentUser().saveInBackground().subscribe(); + ToastUtils.showShort(R.string.edit_nickname_success); + tv_nick_name.setText(nickname); + ((App) Utils.getApp()).isUserStatusChanged = true;//返回MainActivity时updateHeaderResult + }) + .positiveText(getString(R.string.save)) + .negativeText(getString(R.string.cancel)) + .dismissListener(dialog12 -> + dialogEditNicknameBinding.metDialogEditNickname.clearFocus()) + .build(); + mPositiveAction = dialog.getActionButton(DialogAction.POSITIVE); + + if (SettingValueUtil.isThemeDark()) { + dialogEditNicknameBinding.metDialogEditNickname.setMetTextColor(Color.WHITE); + dialogEditNicknameBinding.metDialogEditNickname.setPrimaryColor(Color.LTGRAY); + dialogEditNicknameBinding.metDialogEditNickname.setFocusFraction(1.0f); + dialogEditNicknameBinding.metDialogEditNickname.setMetHintTextColor(Color.GRAY); + dialogEditNicknameBinding.metDialogEditNickname.setUnderlineColor(Color.GRAY); + } + + 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 nickname_text = s == null ? "" : s.toString(); + mPositiveAction.setEnabled(ValidateUtil.isNickName(nickname_text)); + } + }; + + dialogEditNicknameBinding.metDialogEditNickname.addTextChangedListener(watcher); + + dialog.show(); + mPositiveAction.setEnabled(false); + } + + /** + * 编辑头像 + */ + private void showProfileAvatarChangeDialog() { + new MaterialDialog.Builder(this) + .title(R.string.change_profile_avatar) + .positiveText(R.string.pick_by_select) + .negativeText(R.string.pick_by_take) + .neutralText(R.string.cancel) + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull @NotNull MaterialDialog dialog, @NonNull @NotNull DialogAction which) { + pickBySelect(); + } + }) + .onNegative(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull @NotNull MaterialDialog dialog, @NonNull @NotNull DialogAction which) { + pickByTake(); + } + }) + .show(); + } + + /** + * 相册选择照片 + */ + @SuppressLint("CheckResult") + public void pickBySelect() { + rxImagePicker.openGallery(this, new WechatConfigrationBuilder(MimeType.INSTANCE.ofImage(), false) + .capture(true) + .maxSelectable(1) + .countable(true) + .spanCount(4) + .countable(false) + .build()) + .subscribe(rxImagePickerConsumerOnNext, rxImagePickerConsumerOnError); + } + + /** + * 拍照片 + */ + @SuppressLint("CheckResult") + public void pickByTake() { + if ((PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(Utils.getApp(), Manifest.permission.CAMERA))) { + ActivityCompat.requestPermissions(UserInfoActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_ASK_CAMERA); + } else { + rxImagePicker.openCamera(this).subscribe(rxImagePickerConsumerOnNext, rxImagePickerConsumerOnError); + } + } + + Consumer rxImagePickerConsumerOnNext = new Consumer() { + @Override + public void accept(Result result) throws Exception { + boolean originalMode = result.getBooleanExtra(WechatImagePickerFragment.EXTRA_ORIGINAL_IMAGE, false); +// String mimeType = result.getStringExtra(WechatImagePickerFragment.EXTRA_OPTIONAL_MIME_TYPE, ""); + Log.d(TAG, "select image original:" + originalMode + " , uri path: " + FileUtil.getRealPathFromUri(result.getUri())); + UCrop.of(result.getUri(), result.getUri()) + .withAspectRatio(1, 1) + .withMaxResultSize(256, 256) + .start(UserInfoActivity.this); + } + }; + + Consumer rxImagePickerConsumerOnError = new Consumer() { + @Override + public void accept(Throwable throwable) { + ToastUtils.showShort("打开图片失败"); + } + }; + + /** + * 更新云端头像 + * + * @param path + */ + private void updateProfileAvatar(String path) { + try { + final LCFile file = LCFile.withAbsoluteLocalPath("avatar.jpg", path); + if (LCUser.getCurrentUser() != null) { + LCUser.getCurrentUser().put("avatar", file); + LCUser.getCurrentUser().saveInBackground().subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(LCObject lcObject) { + Glide.with(UserInfoActivity.this).load(file.getUrl()).into(avatarImageView); + ToastUtils.showShort(R.string.update_avatar_success); + ((App) Utils.getApp()).isUserStatusChanged = true;//返回MainActivity时updateHeaderResult + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } else { + ToastUtils.showShort(R.string.not_log_in); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + private void fetchNickNameAndAvatar() { + if (LCUser.getCurrentUser() != null) { + String nickname = LCUser.getCurrentUser().getString("nickname"); + LCFile avatarFile = LCUser.getCurrentUser().getLCFile("avatar"); + if (!StringUtils.isEmpty(nickname)) { + tv_nick_name.setText(nickname); + if (avatarFile == null) { + avatarImageView.setImageResource(R.mipmap.profile_image); + } else { + Glide.with(UserInfoActivity.this).load(avatarFile.getUrl()).into(avatarImageView); + } + } else { + LCObject userProfile = LCUser.getCurrentUser().getLCObject("profile"); + if (userProfile != null) { + userProfile.fetchInBackground().subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(LCObject avObject) { + if (isFinishing()) return; + String nickname = avObject.getString("nickname"); + LCFile avatarFile = avObject.getLCFile("avatar"); + if (!StringUtils.isEmpty(nickname)) { + tv_nick_name.setText(nickname); + if (avatarFile == null) { + avatarImageView.setImageResource(R.mipmap.profile_image); + } else { + Glide.with(UserInfoActivity.this).load(avatarFile.getUrl()).into(avatarImageView); + } + //保存到_User,下次不再查Profile + LCUser.getCurrentUser().put("nickname", nickname); + if (avatarFile != null) + LCUser.getCurrentUser().put("avatar", avatarFile); + LCUser.getCurrentUser().saveInBackground().subscribe(); + } + } + + @Override + public void onError(Throwable e) { + } + + @Override + public void onComplete() { + + } + }); + } else { + new LCQuery<>("Profile") + .whereEqualTo("creatorId", LCUser.getCurrentUser().getObjectId()) + .findInBackground() + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(List list) { + if (isFinishing()) return; + if (list != null && !list.isEmpty()) { + String nickname = list.get(0).getString("nickname"); + LCFile avatarFile = list.get(0).getLCFile("avatar"); + if (!StringUtils.isEmpty(nickname)) { + tv_nick_name.setText(nickname); + if (avatarFile == null) { + avatarImageView.setImageResource(R.mipmap.profile_image); + } else { + Glide.with(UserInfoActivity.this).load(avatarFile.getUrl()).into(avatarImageView); + } + + //保存到_User,下次不再查Profile + LCUser.getCurrentUser().put("nickname", nickname); + if (avatarFile != null) + LCUser.getCurrentUser().put("avatar", avatarFile); + LCUser.getCurrentUser().saveInBackground().subscribe(); + } + } + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } + } + } else { + tv_nick_name.setText(getString(R.string.please_log_in_again)); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/user/VerifyEmailCodeActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/user/VerifyEmailCodeActivity.java new file mode 100644 index 0000000..cb42cf1 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/user/VerifyEmailCodeActivity.java @@ -0,0 +1,234 @@ +package com.bingce.controlnetwork.activity.user; + +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.TextAppearanceSpan; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; + +import com.bingce.AppChannel; +import com.bingce.activity.UserCloudFunction; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.ActivityVerifyCodeBinding; +import com.bingce.utils.ActivityUtils; +import com.bingce.utils.IntentUtil; +import com.bingce.utils.SendCodeCountDownManager; + +import org.polaric.colorful.ColorfulActivity; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import blankj.utilcode.util.ToastUtils; + +public class VerifyEmailCodeActivity extends ColorfulActivity { + + public static final String KEY_EMAIL = "email"; + public static final String KEY_TODO = "todo"; + private static ActivityResultLauncher mLauncher; + + public static final int TO_VERIFY_EMAIL = 0; + public static final int TO_SIGNUP_OR_LOGIN_BY_EMAIL = 1; + + private ActivityVerifyCodeBinding binding; + private ProgressDialog progressDialog; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityVerifyCodeBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + Toolbar mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + getSupportActionBar().setTitle(R.string.verify); + + binding.tvInputHintTitle.setText(R.string.enter_email_verification_code); + + String trip = String.format(getString(R.string.format_enter_verification_code), getEmail()); + binding.tvInputTrip.setText(matcherChangeText(trip, getEmail()));//+前需要转义 + + SendCodeCountDownManager.getInstance().start(this, 60000, 1000, binding.tvSendAuthCode, new SendCodeCountDownManager.OnCountDownListener() { + @Override + public void onSendValid() { + sendCode(); + } + + @Override + public void onSendInvalid() { + + } + }); + binding.tvSendAuthCode.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + SendCodeCountDownManager.getInstance().start(VerifyEmailCodeActivity.this, 60000, 1000, binding.tvSendAuthCode, new SendCodeCountDownManager.OnCountDownListener() { + @Override + public void onSendValid() { + sendCode(); + } + + @Override + public void onSendInvalid() { + + } + }); + } + }); + + binding.etInputAuthCode.setOnInputListener(code -> { + verifyCode(code); + }); + } + + private void sendCode() { + if (getEmail() == null) { + ToastUtils.showShort(R.string.email_address_illegal); + return; + } + UserCloudFunction.sendEmailCode(getEmail(), new UserCloudFunction.OnSendCodeListener() { + @Override + public void onCodeSendSuccess() { + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showShort(R.string.send_success); + } + + @Override + public void onCodeSendFailed(String errorMsg) { + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(errorMsg); + } + }); + } + + private void verifyCode(String code) { + if (progressDialog != null) + progressDialog.dismiss(); + progressDialog = new ProgressDialog(VerifyEmailCodeActivity.this); + progressDialog.setMessage(getString(R.string.logging)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + switch (getToDo()) { + case TO_VERIFY_EMAIL: + if (getEmail() == null) { + ToastUtils.showShort(R.string.email_address_illegal); + if (progressDialog != null) + progressDialog.dismiss(); + return; + } + UserCloudFunction.verifyEmailCode(getEmail(), code, new UserCloudFunction.OnVerifyCodeListener() { + @Override + public void onCodeVerifySuccess() { + if (!ActivityUtils.isLiving(VerifyEmailCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + + SendCodeCountDownManager.getInstance().resetRemainingTime();//验证成功,重置倒计时,否则跳转到下一个验证页面不会自动发送验证码 + + Intent intent = new Intent(); + intent.putExtra("isMail", true); + intent.putExtra("phoneNumberOrEmail", getEmail()); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onCodeVerifyFailed(String errorMsg) { + if (!ActivityUtils.isLiving(VerifyEmailCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(errorMsg); + } + }); + break; + case TO_SIGNUP_OR_LOGIN_BY_EMAIL: + if (getEmail() == null) { + ToastUtils.showShort(R.string.email_address_illegal); + if (progressDialog != null) + progressDialog.dismiss(); + return; + } + UserCloudFunction.signUpOrLoginByEmail(getEmail(), code, AppChannel.customChannel, + new UserCloudFunction.OnGetSessionTokenListener() { + @Override + public void onSessionTokenGetSuccess(String sessionToken, boolean newUser) { + if (!ActivityUtils.isLiving(VerifyEmailCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + + SendCodeCountDownManager.getInstance().resetRemainingTime();//验证成功,重置倒计时,否则跳转到下一个验证页面不会自动发送验证码 + + Intent intent = new Intent(); + intent.putExtra("sessionToken", sessionToken); + intent.putExtra("newUser", newUser); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onSessionTokenGetFailed(int code, String msg, String resp) { + if (!ActivityUtils.isLiving(VerifyEmailCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + + if (code == 303) {//缺少手机号或未验证 + SendCodeCountDownManager.getInstance().resetRemainingTime(); + InputPhoneNumberActivity.start(VerifyEmailCodeActivity.this, null, getEmail(), null, VerifySMSCodeActivity.TO_SIGNUP_OR_LOGIN_BY_EMAIL_BIND_PHONE, mLauncher); + finish(); + } else { + ToastUtils.showLong(msg); + } + } + + @Override + public void onSessionTokenGetException(String msg) { + if (!ActivityUtils.isLiving(VerifyEmailCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(msg); + } + }); + break; + } + } + + + private String getEmail() { + return IntentUtil.stringExtra(getIntent(), KEY_EMAIL); + } + + private int getToDo() { + return IntentUtil.intExtra(getIntent(), KEY_TODO); + } + + public static void start(Context context, String email, int todo, ActivityResultLauncher launcher) { + Intent intent = new Intent(context, VerifyEmailCodeActivity.class); + intent.putExtra(KEY_EMAIL, email); + intent.putExtra(KEY_TODO, todo); + mLauncher = launcher; + launcher.launch(intent); + } + + private SpannableString matcherChangeText(String str, String keyword) { + SpannableString ss = new SpannableString(str); + Pattern pattern = Pattern.compile(keyword); + Matcher matcher = pattern.matcher(ss); + while (matcher.find()) { + int start = matcher.start(); + int end = matcher.end(); + ss.setSpan(new TextAppearanceSpan(this, R.style.style_color_black), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//new ForegroundColorSpan(color) + } + return ss; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/user/VerifySMSCodeActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/user/VerifySMSCodeActivity.java new file mode 100644 index 0000000..e05ca85 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/user/VerifySMSCodeActivity.java @@ -0,0 +1,329 @@ +package com.bingce.controlnetwork.activity.user; + +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.TextAppearanceSpan; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; + +import com.bingce.AppChannel; +import com.bingce.activity.UserCloudFunction; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.ActivityVerifyCodeBinding; +import com.bingce.utils.ActivityUtils; +import com.bingce.utils.IntentUtil; +import com.bingce.utils.SendCodeCountDownManager; + +import org.polaric.colorful.ColorfulActivity; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import blankj.utilcode.util.ToastUtils; + +public class VerifySMSCodeActivity extends ColorfulActivity { + public static final String KEY_PHONE = "phone_number"; + public static final String KEY_EMAIL = "email"; + public static final String KEY_UNION_ID = "unionid"; + public static final String KEY_TODO = "todo"; + + public static final int TO_VERIFY_PHONE_NUMBER = 0; + public static final int TO_SIGNUP_OR_LOGIN_BY_PHONE_NUMBER = 1; + public static final int TO_SIGNUP_OR_LOGIN_BY_EMAIL_BIND_PHONE = 2; + public static final int TO_SIGNUP_OR_LOGIN_BY_WEIXIN_BIND_PHONE = 3; + private ActivityVerifyCodeBinding binding; + private ProgressDialog progressDialog; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityVerifyCodeBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + Toolbar mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + getSupportActionBar().setTitle(R.string.verify); + + binding.tvInputHintTitle.setText(R.string.enter_sms_verification_code); + + String phoneOrEmail = getPhoneNumber(); + String trip = String.format(getString(R.string.format_enter_verification_code), phoneOrEmail); + binding.tvInputTrip.setText(matcherChangeText(trip, phoneOrEmail.startsWith("+") ? ("\\" + phoneOrEmail) : phoneOrEmail));//+前需要转义 + + SendCodeCountDownManager.getInstance().start(this, 60000, 1000, binding.tvSendAuthCode, new SendCodeCountDownManager.OnCountDownListener() { + @Override + public void onSendValid() { + sendCode(); + } + + @Override + public void onSendInvalid() { + + } + }); + binding.tvSendAuthCode.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + SendCodeCountDownManager.getInstance().start(VerifySMSCodeActivity.this, 60000, 1000, binding.tvSendAuthCode, new SendCodeCountDownManager.OnCountDownListener() { + @Override + public void onSendValid() { + sendCode(); + } + + @Override + public void onSendInvalid() { + + } + }); + } + }); + + binding.etInputAuthCode.setOnInputListener(code -> { + verifyCode(code); + }); + } + + private void sendCode() { + if (getPhoneNumber() == null) { + ToastUtils.showShort(R.string.phone_number_invalid); + return; + } + UserCloudFunction.sendSMSCode(getPhoneNumber(), new UserCloudFunction.OnSendCodeListener() { + @Override + public void onCodeSendSuccess() { + ToastUtils.showShort(R.string.send_success); + } + + @Override + public void onCodeSendFailed(String errorMsg) { + ToastUtils.showLong(errorMsg); + } + }); + } + + private void verifyCode(String code) { + if (progressDialog != null) + progressDialog.dismiss(); + progressDialog = new ProgressDialog(VerifySMSCodeActivity.this); + progressDialog.setMessage(getString(R.string.logging)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + + switch (getTodo()) { + case TO_VERIFY_PHONE_NUMBER: + if (getPhoneNumber() == null) { + ToastUtils.showShort(R.string.phone_number_invalid); + if (progressDialog != null) + progressDialog.dismiss(); + return; + } + UserCloudFunction.verifySMSCode(getPhoneNumber(), code, new UserCloudFunction.OnVerifyCodeListener() { + @Override + public void onCodeVerifySuccess() { + if (progressDialog != null) + progressDialog.dismiss(); + + SendCodeCountDownManager.getInstance().resetRemainingTime();//验证成功,重置倒计时,否则跳转到下一个验证页面不会自动发送验证码 + + Intent intent = new Intent(); + intent.putExtra("isMail", false); + intent.putExtra("phoneNumberOrEmail", getPhoneNumber()); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onCodeVerifyFailed(String errorMsg) { + if (!ActivityUtils.isLiving(VerifySMSCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(errorMsg); + } + }); + break; + case TO_SIGNUP_OR_LOGIN_BY_PHONE_NUMBER: + if (getPhoneNumber() == null) { + ToastUtils.showShort(R.string.phone_number_invalid); + if (progressDialog != null) + progressDialog.dismiss(); + return; + } + UserCloudFunction.signUpOrLoginByMobilePhone(getPhoneNumber(), code, AppChannel.customChannel, + new UserCloudFunction.OnGetSessionTokenListener() { + @Override + public void onSessionTokenGetSuccess(String sessionToken, boolean newUser) { + if (!ActivityUtils.isLiving(VerifySMSCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + + SendCodeCountDownManager.getInstance().resetRemainingTime();//验证成功,重置倒计时,否则跳转到下一个验证页面不会自动发送验证码 + + Intent intent = new Intent(); + intent.putExtra("sessionToken", sessionToken); + intent.putExtra("newUser", newUser); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onSessionTokenGetFailed(int code, String msg, String resp) { + if (!ActivityUtils.isLiving(VerifySMSCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(msg); + } + + @Override + public void onSessionTokenGetException(String msg) { + if (!ActivityUtils.isLiving(VerifySMSCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(msg); + } + }); + break; + case TO_SIGNUP_OR_LOGIN_BY_EMAIL_BIND_PHONE: + if (getEmail() == null) { + ToastUtils.showShort(R.string.email_address_illegal); + if (progressDialog != null) + progressDialog.dismiss(); + return; + } + if (getPhoneNumber() == null) { + ToastUtils.showShort(R.string.phone_number_invalid); + if (progressDialog != null) + progressDialog.dismiss(); + return; + } + UserCloudFunction.loginByEmailBindPhone(getEmail(), getPhoneNumber(), code, AppChannel.customChannel, + new UserCloudFunction.OnGetSessionTokenListener() { + @Override + public void onSessionTokenGetSuccess(String sessionToken, boolean newUser) { + if (!ActivityUtils.isLiving(VerifySMSCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + + SendCodeCountDownManager.getInstance().resetRemainingTime();//验证成功,重置倒计时,否则跳转到下一个验证页面不会自动发送验证码 + + Intent intent = new Intent(); + intent.putExtra("sessionToken", sessionToken); + intent.putExtra("newUser", newUser); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onSessionTokenGetFailed(int code, String msg, String resp) { + if (!ActivityUtils.isLiving(VerifySMSCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(msg); + } + + @Override + public void onSessionTokenGetException(String msg) { + if (!ActivityUtils.isLiving(VerifySMSCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(msg); + } + }); + break; + case TO_SIGNUP_OR_LOGIN_BY_WEIXIN_BIND_PHONE: + if (getUnionId() == null) { + ToastUtils.showShort(R.string.wechat_unionid_invalid); + if (progressDialog != null) + progressDialog.dismiss(); + return; + } + if (getPhoneNumber() == null) { + ToastUtils.showShort(R.string.phone_number_invalid); + if (progressDialog != null) + progressDialog.dismiss(); + return; + } + UserCloudFunction.loginByWxUnionIdBindPhone(getUnionId(), getPhoneNumber(), AppChannel.customChannel, + new UserCloudFunction.OnGetSessionTokenListener() { + @Override + public void onSessionTokenGetSuccess(String sessionToken, boolean newUser) { + if (!ActivityUtils.isLiving(VerifySMSCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + + SendCodeCountDownManager.getInstance().resetRemainingTime();//验证成功,重置倒计时,否则跳转到下一个验证页面不会自动发送验证码 + + Intent intent = new Intent(); + intent.putExtra("sessionToken", sessionToken); + intent.putExtra("newUser", newUser); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onSessionTokenGetFailed(int code, String msg, String resp) { + if (!ActivityUtils.isLiving(VerifySMSCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(msg); + } + + @Override + public void onSessionTokenGetException(String msg) { + if (!ActivityUtils.isLiving(VerifySMSCodeActivity.this)) return; + if (progressDialog != null) + progressDialog.dismiss(); + ToastUtils.showLong(msg); + } + }); + break; + } + + } + + private String getPhoneNumber() { + return IntentUtil.stringExtra(getIntent(), KEY_PHONE); + } + + private String getEmail() { + return IntentUtil.stringExtra(getIntent(), KEY_EMAIL); + } + + private String getUnionId() { + return IntentUtil.stringExtra(getIntent(), KEY_UNION_ID); + } + + + private int getTodo() { + return IntentUtil.intExtra(getIntent(), KEY_TODO); + } + + public static void start(Context context, String phoneNumber, String email, String unionid, int todo, ActivityResultLauncher launcher) { + Intent intent = new Intent(context, VerifySMSCodeActivity.class); + intent.putExtra(KEY_PHONE, phoneNumber); + intent.putExtra(KEY_EMAIL, email); + intent.putExtra(KEY_UNION_ID, unionid); + intent.putExtra(KEY_TODO, todo); + launcher.launch(intent); + } + + private SpannableString matcherChangeText(String str, String keyword) { + SpannableString ss = new SpannableString(str); + Pattern pattern = Pattern.compile(keyword); + Matcher matcher = pattern.matcher(ss); + while (matcher.find()) { + int start = matcher.start(); + int end = matcher.end(); + ss.setSpan(new TextAppearanceSpan(this, R.style.style_color_black), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//new ForegroundColorSpan(color) + } + return ss; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/AbstractPointSelectAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/AbstractPointSelectAdapter.java new file mode 100644 index 0000000..cdd0d1e --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/AbstractPointSelectAdapter.java @@ -0,0 +1,176 @@ +package com.bingce.controlnetwork.adapter; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseExpandableListAdapter; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.ui.vh.GroupParentViewHolder; +import com.bingce.controlnetwork.ui.vh.TextSelectableViewHolder; +import com.bingce.controlnetwork.ui.widget.ViewFactory; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +/* + * 限差详情adapter + * */ +public abstract class AbstractPointSelectAdapter extends BaseExpandableListAdapter { + private final ArrayList selectedId = new ArrayList<>(); + private final ArrayList selectedName = new ArrayList<>(); + private final int maxCount; + private final Context context; + + public AbstractPointSelectAdapter(PickPointResult defaultValue, + int maxCount, + Context context) { + this.maxCount = maxCount; + if (defaultValue != null) { + List ids = defaultValue.getSelectedIds(); + if (ids != null) { + selectedId.addAll(ids); + } + + List names = defaultValue.getSelectedNames(); + if (names != null) { + selectedName.addAll(names); + } + } + this.context = context; + } + + protected Context context() { + return context; + } + + public ArrayList getSelectedId() { + return selectedId; + } + + public ArrayList getSelectedName() { + return selectedName; + } + + public abstract int getGroupCount(); + + public abstract int getChildrenCount(int groupPosition); + + public abstract String getGroup(int groupPosition); + + public abstract PointRecord getChild(int groupPosition, int childPosition); + + @Override + final public long getGroupId(int groupPosition) { + return groupPosition; + } + + @Override + final public long getChildId(int groupPosition, int childPosition) { + return groupPosition * 10000L + childPosition; + } + + @Override + public boolean hasStableIds() { + return true; + } + + protected boolean showGroupArrow() { + return true; + } + + @Override + public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { + GroupParentViewHolder viewHolder = null; + if (convertView == null) { + convertView = ViewFactory.generatorView(parent.getContext(), parent, ViewItemType.groupParent); + viewHolder = new GroupParentViewHolder(convertView); + convertView.setTag(viewHolder); + } else { + viewHolder = (GroupParentViewHolder) convertView.getTag(); + } + if (viewHolder != null) { + String groupName = getGroup(groupPosition); + if (viewHolder.name != null) { + viewHolder.name.setText(groupName); + } + if (viewHolder.expandIcon != null) { + if (showGroupArrow()) { + viewHolder.expandIcon.setImageResource(isExpanded ? R.drawable.ic_arrow_up : R.drawable.ic_arrow_down); + viewHolder.expandIcon.setVisibility(View.VISIBLE); + } else { + viewHolder.expandIcon.setVisibility(View.GONE); + } + } + } + return convertView; + } + + @Override + public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { + PointRecord record = getChild(groupPosition, childPosition); + RecyclerView.ViewHolder viewHolder = null; + if (convertView == null) { + viewHolder = ViewFactory.generatorViewHolder(parent.getContext(), parent, ViewItemType.textSelectable); + if (viewHolder == null) { + return null; + } + convertView = viewHolder.itemView; + convertView.setTag(viewHolder); + } else { + viewHolder = (RecyclerView.ViewHolder) convertView.getTag(); + } + //更新item内容 + if (viewHolder instanceof TextSelectableViewHolder) { + TextSelectableViewHolder titleWithSubtitleViewHolder = (TextSelectableViewHolder) viewHolder; + titleWithSubtitleViewHolder.name.setText(record.getName()); + if (selectedId.contains(record.getId())) { + titleWithSubtitleViewHolder.status.setVisibility(View.VISIBLE); + } else { + titleWithSubtitleViewHolder.status.setVisibility(View.GONE); + } + } + convertView.setOnClickListener(v -> { + if (!selectedId.contains(record.getId())) { +// if (singlePick) { +// selectedId.clear(); +// selectedName.clear(); +// } +// selectedId.add(record.getId()); +// selectedName.add(record.getName()); + if (maxCount == 1) { + selectedId.clear(); + selectedName.clear(); + selectedId.add(record.getId()); + selectedName.add(record.getName()); + } else if (maxCount < 0) { + selectedId.add(record.getId()); + selectedName.add(record.getName()); + } else if (selectedId.size() >= maxCount) { + ToastUtils.showShort(Tools.getString(R.string.max_select_hint, maxCount)); + } else { + selectedId.add(record.getId()); + selectedName.add(record.getName()); + } + } else { + selectedId.remove(record.getId()); + selectedName.remove(record.getName()); + } + notifyDataSetChanged(); + }); + return convertView; + } + + @Override + public boolean isChildSelectable(int groupPosition, int childPosition) { + return true; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/BaseAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/BaseAdapter.java new file mode 100644 index 0000000..5c2f52c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/BaseAdapter.java @@ -0,0 +1,57 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.ViewGroup; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.IUniversalListItem; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public abstract class BaseAdapter extends RecyclerView.Adapter { + private final List mValues; + + public BaseAdapter(List items) { + mValues = items; + } + + public void updateData(List list) { + mValues.clear(); + if (list != null && !list.isEmpty()) { + mValues.addAll(list); + } + notifyDataSetChanged(); + } + + protected abstract VH createVH(@NotNull ViewGroup parent, int viewType); + + @Override + public @NotNull + VH onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { + VH viewHolder = createVH(parent, viewType); + assert viewHolder != null; + return viewHolder; + } + + protected T getItem(int position) { + return mValues.get(position); + } + + protected boolean clickEnable(int position) { + return true; + } + + @Override + public int getItemCount() { + if (mValues == null) { + return 0; + } + return mValues.size(); + } + + public interface IOnItemClick> { + void onItemClick(T item); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/BaseIndexPrefixTextWithContextMenuAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/BaseIndexPrefixTextWithContextMenuAdapter.java new file mode 100644 index 0000000..82078e9 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/BaseIndexPrefixTextWithContextMenuAdapter.java @@ -0,0 +1,61 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.ContextMenu; +import android.view.MenuItem; +import android.view.View; +import android.widget.TextView; + +import com.bingce.controlapphelper.model.IUniversalListItem; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import com.bingce.controlnetwork.adapter.contextmenu.IAdapterContextMenu; +import com.bingce.controlnetwork.ui.vh.IndexTextViewHolder; +import com.bingce.controlnetwork.ui.vh.IndexTextWithPrefixViewHolder; + +public abstract class BaseIndexPrefixTextWithContextMenuAdapter> + extends IndexWithTextAndPrefixAdapter + implements View.OnCreateContextMenuListener { + private int currentLongPressIndex = -1; + private final IAdapterContextMenu adapterContextMenu; + + public BaseIndexPrefixTextWithContextMenuAdapter(List items, + IOnItemClick callback, + IAdapterContextMenu adapterContextMenu) { + super(items, callback); + this.adapterContextMenu = adapterContextMenu; + } + + @Override + final public void onBindViewHolder(@NotNull IndexTextViewHolder holder, int position) { + super.onBindViewHolder(holder, position); + holder.itemView.setOnLongClickListener(v -> { + currentLongPressIndex = position; + return false; + }); + holder.itemView.setOnCreateContextMenuListener(this); + if (holder instanceof IndexTextWithPrefixViewHolder) { + onSetPrefix(((IndexTextWithPrefixViewHolder) holder).prefix, getItem(position)); + } + } + + @Override + final public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + if (adapterContextMenu == null) { + return; + } + menu.clear(); + for (int index = 0; index < adapterContextMenu.menuItemSize(); index++) { + menu.add(0, index, 0, adapterContextMenu.menuItemName(index)); + MenuItem menuItem = menu.getItem(index); + if (menuItem != null) { + menuItem.setOnMenuItemClickListener(item -> + adapterContextMenu.onMenuItemClick(getItem(currentLongPressIndex), item)); + } + } + } + + protected abstract void onSetPrefix(TextView prefixTextView, T item); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/BaseIndexTextWithContextMenuAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/BaseIndexTextWithContextMenuAdapter.java new file mode 100644 index 0000000..738f542 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/BaseIndexTextWithContextMenuAdapter.java @@ -0,0 +1,54 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.ContextMenu; +import android.view.MenuItem; +import android.view.View; + +import com.bingce.controlapphelper.model.IUniversalListItem; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import com.bingce.controlnetwork.adapter.contextmenu.IAdapterContextMenu; +import com.bingce.controlnetwork.ui.vh.IndexTextViewHolder; + +public class BaseIndexTextWithContextMenuAdapter> + extends IndexWithTextAdapter + implements View.OnCreateContextMenuListener { + private int currentLongPressIndex = -1; + private final IAdapterContextMenu adapterContextMenu; + + public BaseIndexTextWithContextMenuAdapter(List items, + IOnItemClick callback, + IAdapterContextMenu adapterContextMenu) { + super(items, callback); + this.adapterContextMenu = adapterContextMenu; + } + + @Override + final public void onBindViewHolder(@NotNull IndexTextViewHolder holder, int position) { + super.onBindViewHolder(holder, position); + holder.itemView.setOnLongClickListener(v -> { + currentLongPressIndex = position; + return false; + }); + holder.itemView.setOnCreateContextMenuListener(this); + } + + @Override + final public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + if (adapterContextMenu == null) { + return; + } + menu.clear(); + for (int index = 0; index < adapterContextMenu.menuItemSize(); index++) { + menu.add(0, index, 0, adapterContextMenu.menuItemName(index)); + MenuItem menuItem = menu.getItem(index); + if (menuItem != null) { + menuItem.setOnMenuItemClickListener(item -> + adapterContextMenu.onMenuItemClick(getItem(currentLongPressIndex), item)); + } + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/BaseSelectableIndexTextWithContextMenuAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/BaseSelectableIndexTextWithContextMenuAdapter.java new file mode 100644 index 0000000..cabe047 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/BaseSelectableIndexTextWithContextMenuAdapter.java @@ -0,0 +1,55 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.ContextMenu; +import android.view.MenuItem; +import android.view.View; + +import com.bingce.controlapphelper.model.IUniversalListItem; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import com.bingce.controlnetwork.adapter.contextmenu.IAdapterContextMenu; +import com.bingce.controlnetwork.ui.vh.IndexTextViewHolder; + +public class BaseSelectableIndexTextWithContextMenuAdapter> + extends SelectableIndexWithTextAdapter + implements View.OnCreateContextMenuListener { + private int currentLongPressIndex = -1; + private final IAdapterContextMenu adapterContextMenu; + + public BaseSelectableIndexTextWithContextMenuAdapter(String selectedId, + List items, + IOnItemClick callback, + IAdapterContextMenu adapterContextMenu) { + super(selectedId, items, callback); + this.adapterContextMenu = adapterContextMenu; + } + + @Override + final public void onBindViewHolder(@NotNull IndexTextViewHolder holder, int position) { + super.onBindViewHolder(holder, position); + holder.itemView.setOnLongClickListener(v -> { + currentLongPressIndex = position; + return false; + }); + holder.itemView.setOnCreateContextMenuListener(this); + } + + @Override + final public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + if (adapterContextMenu == null) { + return; + } + menu.clear(); + for (int index = 0; index < adapterContextMenu.menuItemSize(); index++) { + menu.add(0, index, 0, adapterContextMenu.menuItemName(index)); + MenuItem menuItem = menu.getItem(index); + if (menuItem != null) { + menuItem.setOnMenuItemClickListener(item -> + adapterContextMenu.onMenuItemClick(getItem(currentLongPressIndex), item)); + } + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/BaseTitleAndSubtitleWithContextMenuAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/BaseTitleAndSubtitleWithContextMenuAdapter.java new file mode 100644 index 0000000..caa98be --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/BaseTitleAndSubtitleWithContextMenuAdapter.java @@ -0,0 +1,51 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.ContextMenu; +import android.view.MenuItem; +import android.view.View; + +import com.bingce.controlapphelper.model.IUniversalListItemWithTitleAndSubtitle; +import com.bingce.controlnetwork.adapter.contextmenu.IAdapterContextMenu; +import com.bingce.controlnetwork.ui.vh.TitleWithSubtitleViewHolder; + +import java.util.List; + +public class BaseTitleAndSubtitleWithContextMenuAdapter> + extends TitleWithSubtitleAdapter + implements View.OnCreateContextMenuListener { + private int currentLongPressIndex = -1; + private final IAdapterContextMenu adapterContextMenu; + + public BaseTitleAndSubtitleWithContextMenuAdapter(List items, + IOnItemClick callback, + IAdapterContextMenu adapterContextMenu) { + super(items, callback); + this.adapterContextMenu = adapterContextMenu; + } + + @Override + final public void onBindViewHolder(TitleWithSubtitleViewHolder holder, int position) { + super.onBindViewHolder(holder, position); + holder.itemView.setOnLongClickListener(v -> { + currentLongPressIndex = position; + return false; + }); + holder.itemView.setOnCreateContextMenuListener(this); + } + + @Override + final public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + if (adapterContextMenu == null) { + return; + } + menu.clear(); + for (int index = 0; index < adapterContextMenu.menuItemSize(); index++) { + menu.add(0, index, 0, adapterContextMenu.menuItemName(index)); + MenuItem menuItem = menu.getItem(index); + if (menuItem != null) { + menuItem.setOnMenuItemClickListener(item -> + adapterContextMenu.onMenuItemClick(getItem(currentLongPressIndex), item)); + } + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/GlobalControlPointSelectAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/GlobalControlPointSelectAdapter.java new file mode 100644 index 0000000..804e4e7 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/GlobalControlPointSelectAdapter.java @@ -0,0 +1,49 @@ +package com.bingce.controlnetwork.adapter; + +import android.content.Context; + +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlnetwork.R; + +import java.util.List; + +/* + * 限差详情adapter + * */ +public class GlobalControlPointSelectAdapter extends AbstractPointSelectAdapter { + private final List pointRecordList; + + public GlobalControlPointSelectAdapter(List pointRecords, + PickPointResult defaultValue, + int maxCount,//boolean singlePick, + Context context) { + super(defaultValue, maxCount, context); + this.pointRecordList = pointRecords; + } + + @Override + public int getGroupCount() { + return 1; + } + + @Override + public int getChildrenCount(int groupPosition) { + return pointRecordList.size(); + } + + @Override + public String getGroup(int groupPosition) { + return context().getString(R.string.global_control_point); + } + + @Override + public PointRecord getChild(int groupPosition, int childPosition) { + return pointRecordList.get(childPosition); + } + + @Override + protected boolean showGroupArrow() { + return false; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/IOnContextItemSelectedCallback.java b/app/src/main/java/com/bingce/controlnetwork/adapter/IOnContextItemSelectedCallback.java new file mode 100644 index 0000000..ebec77c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/IOnContextItemSelectedCallback.java @@ -0,0 +1,9 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.MenuItem; + +import androidx.annotation.NonNull; + +public interface IOnContextItemSelectedCallback { + void onContextItemSelected(@NonNull MenuItem item); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/IUpdateListAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/IUpdateListAdapter.java new file mode 100644 index 0000000..f408f72 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/IUpdateListAdapter.java @@ -0,0 +1,9 @@ +package com.bingce.controlnetwork.adapter; + +import com.bingce.controlapphelper.model.IUniversalListItem; + +import java.util.List; + +public interface IUpdateListAdapter> { + void updateData(List list); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/IndexWithTextAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/IndexWithTextAdapter.java new file mode 100644 index 0000000..25c4c2b --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/IndexWithTextAdapter.java @@ -0,0 +1,88 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.IUniversalListItem; +import com.bingce.controlapphelper.model.ViewItemType; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import com.bingce.controlnetwork.ui.vh.IndexTextViewHolder; +import com.bingce.controlnetwork.ui.widget.ViewFactory; + +public class IndexWithTextAdapter> extends BaseAdapter { + private IOnItemClick callback; + private boolean showIndex = true; + + public IndexWithTextAdapter(List items, IOnItemClick callback) { + super(items); + this.callback = callback; + } + + public IndexWithTextAdapter(List items) { + super(items); + this.callback = null; + } + + public void setCallback(IOnItemClick callback) { + this.callback = callback; + } + + protected ViewItemType itemType() { + return ViewItemType.indexWithName; + } + + @Override + final protected IndexTextViewHolder createVH(@NotNull ViewGroup parent, int viewType) { + RecyclerView.ViewHolder viewHolder = ViewFactory.generatorViewHolder(parent.getContext(), parent, itemType()); + if (viewHolder instanceof IndexTextViewHolder) { + return (IndexTextViewHolder) viewHolder; + } + return null; + } + + protected void hideIndex() { + showIndex = false; + notifyDataSetChanged(); + } + + protected void showIndex() { + showIndex = true; + notifyDataSetChanged(); + } + + protected boolean clickEnable(int position) { + return true; + } + + @Override + public void onBindViewHolder(final @NotNull IndexTextViewHolder holder, int position) { + T item = getItem(position); + if (showIndex) { + holder.index.setVisibility(View.VISIBLE); + holder.index.setText(String.valueOf(position + 1)); + } else { + holder.index.setVisibility(View.GONE); + } + onSetName(holder.name, item); + holder.itemView.setOnClickListener(v -> { + if (callback != null && clickEnable(position)) { + callback.onItemClick(item); + } + }); + } + + protected void onSetName(TextView nameTextView, T item) { + nameTextView.setText(item.getName()); + } + + public interface IOnItemClick> { + void onItemClick(T item); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/IndexWithTextAndPrefixAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/IndexWithTextAndPrefixAdapter.java new file mode 100644 index 0000000..953da51 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/IndexWithTextAndPrefixAdapter.java @@ -0,0 +1,20 @@ +package com.bingce.controlnetwork.adapter; + +import com.bingce.controlapphelper.model.IUniversalListItem; +import com.bingce.controlapphelper.model.ViewItemType; + +import java.util.List; + +public class IndexWithTextAndPrefixAdapter> extends IndexWithTextAdapter { + public IndexWithTextAndPrefixAdapter(List items, IOnItemClick callback) { + super(items, callback); + } + + public IndexWithTextAndPrefixAdapter(List items) { + super(items); + } + + protected ViewItemType itemType() { + return ViewItemType.indexWithNameAndPrefix; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/MeasureAngleDistanceAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/MeasureAngleDistanceAdapter.java new file mode 100644 index 0000000..fd11fbb --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/MeasureAngleDistanceAdapter.java @@ -0,0 +1,122 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.IAdapter; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.IDistanceTypeChangeListener; +import com.bingce.controlapphelper.surveyor.data.IMeasureCache; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; + +import com.bingce.controlnetwork.ui.vh.SurveyorDataAloneDistanceViewHolder; +import com.bingce.controlnetwork.ui.vh.SurveyorDataViewHolder; +import com.bingce.controlnetwork.ui.widget.ViewFactory; + +/** + * 测量记录adapter + * 井定向-距离 + */ +public class MeasureAngleDistanceAdapter extends RecyclerView.Adapter + implements IAdapter, IDistanceTypeChangeListener { + + public static final String TYPE_ANGLE = "TYPE_ANGLE"; + public static final String TYPE_DISTANCE = "TYPE_DISTANCE"; + + private final IMeasureCache cachedData; + private final ISurveyorData surveyorData; + private final ICycleRecorder cycleRecorder; + private boolean showSlopDistance = true; + private final String stationId; + private final String type;//区分水平还是距离 + + + public MeasureAngleDistanceAdapter( + String stationId, + IMeasureCache cachedData, + ICycleRecorder cycleRecorder, + ISurveyorData surveyorData, + String type) { + this.stationId = stationId; + this.cachedData = cachedData; + this.surveyorData = surveyorData; + this.cycleRecorder = cycleRecorder; + this.type = type; + //注册数据监听 + cachedData.register(this); + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + RecyclerView.ViewHolder vh = null; + switch (type) { + case TYPE_ANGLE: + vh = ViewFactory.generatorViewHolder(parent.getContext(), parent, ViewItemType.surveyorStationPointItem); + break; + case TYPE_DISTANCE: + vh = ViewFactory.generatorViewHolder(parent.getContext(), parent, ViewItemType.aloneDistanceMeasure); + break; + } + assert vh != null; + return vh; + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (holder instanceof SurveyorDataAloneDistanceViewHolder) { + SurveyorDataAloneDistanceViewHolder holderDistance = (SurveyorDataAloneDistanceViewHolder) holder; + holderDistance.setup(position, + stationId, + showSlopDistance, + (CachedDataAloneDistance) cachedData, + cycleRecorder, + surveyorData); + } else if (holder instanceof SurveyorDataViewHolder) { + SurveyorDataViewHolder holderHorizontalAngle = (SurveyorDataViewHolder) holder; + holderHorizontalAngle.setup(position, + stationId, + showSlopDistance, + (ICachedData) cachedData, + cycleRecorder, + surveyorData); + } + + holder.itemView.setOnClickListener(v -> { + if (iItemClickListener != null) { + iItemClickListener.click(position); + } + }); + } + + @Override + public int getItemCount() { + return cachedData.pointCount(); + } + + @Override + public void onDataChange() { + notifyDataSetChanged(); + } + + @Override + public void onShowSlopDistance(boolean value) { + this.showSlopDistance = value; + } + + + private IItemClickListener iItemClickListener; + + public void setOnItemClickListener(IItemClickListener iItemClickListener) { + this.iItemClickListener = iItemClickListener; + } + + public interface IItemClickListener { + void click(int position); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/MeasureHeightTraverseAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/MeasureHeightTraverseAdapter.java new file mode 100644 index 0000000..7b9d85a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/MeasureHeightTraverseAdapter.java @@ -0,0 +1,98 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.IAdapter; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.IDistanceTypeChangeListener; +import com.bingce.controlapphelper.surveyor.data.IMeasureCache; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; + +import java.util.Objects; + +import com.bingce.controlnetwork.ui.vh.SurveyorDataViewHolderHeightTraverse; +import com.bingce.controlnetwork.ui.widget.ViewFactory; + +/** + * 高程导线数据适配器 + */ +public class MeasureHeightTraverseAdapter extends RecyclerView.Adapter + implements IAdapter, IDistanceTypeChangeListener { + + private final IMeasureCache cachedData; + private final ISurveyorData surveyorData; + private final ICycleRecorder cycleRecorder; + private boolean showSlopDistance = true; + private final String stationId; + private final int typeBackOrFront;//区分后视还是前视 + + + public MeasureHeightTraverseAdapter( + String stationId, + IMeasureCache cachedData, + ICycleRecorder cycleRecorder, + ISurveyorData surveyorData, + int typeBackOrFront) { + this.stationId = stationId; + this.cachedData = cachedData; + this.surveyorData = surveyorData; + this.cycleRecorder = cycleRecorder; + this.typeBackOrFront = typeBackOrFront; + //注册数据监听 + cachedData.register(this); + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return Objects.requireNonNull(ViewFactory.generatorViewHolder(parent.getContext(), parent, ViewItemType.heightTraverseSurveyor)); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + SurveyorDataViewHolderHeightTraverse viewHolder = (SurveyorDataViewHolderHeightTraverse) holder; + viewHolder.setup(position, + stationId, + showSlopDistance, + (ICachedData) cachedData, + cycleRecorder, + surveyorData); + + holder.itemView.setOnClickListener(v -> { + if (iItemClickListener != null) { + iItemClickListener.click(position); + } + }); + } + + @Override + public int getItemCount() { + return cachedData.pointCount(); + } + + @Override + public void onDataChange() { + notifyDataSetChanged(); + } + + @Override + public void onShowSlopDistance(boolean value) { + this.showSlopDistance = value; + } + + + private IItemClickListener iItemClickListener; + + public void setOnItemClickListener(IItemClickListener iItemClickListener) { + this.iItemClickListener = iItemClickListener; + } + + public interface IItemClickListener { + void click(int position); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/MultipleSelectableIndexWithTextAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/MultipleSelectableIndexWithTextAdapter.java new file mode 100644 index 0000000..ae6dc00 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/MultipleSelectableIndexWithTextAdapter.java @@ -0,0 +1,71 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.View; +import android.widget.ImageView; + +import com.bingce.controlapphelper.model.IUniversalListItem; +import com.bingce.controlapphelper.model.ViewItemType; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.ui.vh.IndexTextSelectableViewHolder; +import com.bingce.controlnetwork.ui.vh.IndexTextViewHolder; + +public class MultipleSelectableIndexWithTextAdapter> extends IndexWithTextAdapter { + private final List selectedIds = new ArrayList<>(); + + public MultipleSelectableIndexWithTextAdapter(List selectedIds, + List items, + IOnItemClick callback) { + super(items); + setCallback(item -> { + onItemClicked(item.getId()); + if (callback == null) { + return; + } + callback.onItemClick(item); + }); + this.selectedIds.addAll(selectedIds); + } + + protected void onItemClicked(String id) { + if (selectedIds.contains(id)) { + selectedIds.remove(id); + } else { + selectedIds.add(id); + } + notifyDataSetChanged(); + } + + @Override + protected ViewItemType itemType() { + return ViewItemType.indexWithNameSelectable; + } + + @Override + public void onBindViewHolder(@NotNull IndexTextViewHolder holder, int position) { + super.onBindViewHolder(holder, position); + //设置状态 + T t = getItem(position); + if (t == null) { + return; + } + if (holder instanceof IndexTextSelectableViewHolder) { + ImageView iv = ((IndexTextSelectableViewHolder) holder).status; + if (iv != null) { + if (selectedIds.contains(t.getId())) { + iv.setVisibility(View.VISIBLE); + } else { + iv.setVisibility(View.GONE); + } + } + } + } + + public List selectedIds() { + return selectedIds; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/PointRecordAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/PointRecordAdapter.java new file mode 100644 index 0000000..2bf3fc1 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/PointRecordAdapter.java @@ -0,0 +1,75 @@ +package com.bingce.controlnetwork.adapter; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.adapter.contextmenu.ContextMenuDeleteEdit; +import com.bingce.controlnetwork.fragment.PointFragment; +import com.bingce.controlnetwork.ui.widget.dialog.LoadingUtil; + +public class PointRecordAdapter extends BaseIndexTextWithContextMenuAdapter { + public PointRecordAdapter(List items, + @NonNull FragmentActivity activity) { + super(items, + item -> editRecord(activity, item), + new ContextMenuDeleteEdit() { + @Override + protected void delete(PointRecord item) { + deletePoint(activity, item); + } + + @Override + protected void edit(PointRecord item) { + editRecord(activity, item); + } + + /** + * 删除点 + * 项目里这个点只要有数据就不能删除 + * + * @param item + */ + private void deletePoint(Context context, PointRecord item) { + LoadingUtil.show(context, null); + + ThreadPoolUtil.execute(() -> { + String msg = PointUtil.getUsedMsg(item.getId()); + if (msg != null) { + ToastUtils.showShort(msg); + dismissLoading(); + return; + } + SurveyorDatabaseFactory + .instance + .getPointDataSource() + .delete(item); + + dismissLoading(); + }); + } + + private void dismissLoading() { + ThreadPoolUtil.executeInMain(LoadingUtil::dismiss); + } + + }); + } + + + private static void editRecord(FragmentActivity activity, PointRecord record) { + PointFragment.edit(activity.getSupportFragmentManager(), + record.projectId, + record.getName(), record.getId(), record.getPointType(), record.getX(), record.getY(), record.getZ()); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/PointSelectAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/PointSelectAdapter.java new file mode 100644 index 0000000..7980d1f --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/PointSelectAdapter.java @@ -0,0 +1,60 @@ +package com.bingce.controlnetwork.adapter; + +import android.content.Context; + +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.model.KnownAndUnknownPoints; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlnetwork.R; + +import java.util.List; + +public class PointSelectAdapter extends AbstractPointSelectAdapter { + private final KnownAndUnknownPoints data; + private final List globalPoints; + + public PointSelectAdapter(KnownAndUnknownPoints points, + List globalPoints, + PickPointResult defaultValue, + int maxCount, + Context context) { + super(defaultValue, maxCount, context); + this.data = points; + this.globalPoints = globalPoints; + } + + @Override + public int getGroupCount() { + return data.groupCount() + 1; + } + + @Override + public int getChildrenCount(int groupPosition) { + if (groupPosition >= data.groupCount()) { + if (globalPoints == null) { + return 0; + } + return globalPoints.size(); + } + return data.childrenCount(groupPosition); + } + + @Override + public String getGroup(int groupPosition) { + if (groupPosition >= data.groupCount()) { + return context().getString(R.string.global_control_point); + } + return data.groupName(groupPosition, context()); + } + + @Override + public PointRecord getChild(int groupPosition, int childPosition) { + if (groupPosition >= data.groupCount()) { + if (globalPoints == null) { + return null; + } + return globalPoints.get(childPosition); + } + return data.child(groupPosition, childPosition); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/PrismMagegeAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/PrismMagegeAdapter.java new file mode 100644 index 0000000..a9a079e --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/PrismMagegeAdapter.java @@ -0,0 +1,106 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.ContextMenu; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import com.bingce.controlapphelper.datasource.database.prism.PrismConstants; +import com.bingce.controlapphelper.datasource.database.prism.PrismRecord; +import com.bingce.controlapphelper.util.Tools; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.contextmenu.IAdapterContextMenu; +import com.bingce.controlnetwork.ui.vh.PrismManageViewHolder; + +public class PrismMagegeAdapter extends BaseAdapter + implements View.OnCreateContextMenuListener { + private IOnItemClick callback; + + private int currentLongPressIndex = -1; + + private final IAdapterContextMenu adapterContextMenu; + + public PrismMagegeAdapter(List items, IOnItemClick callback, IAdapterContextMenu adapterContextMenu) { + super(items); + this.callback = callback; + this.adapterContextMenu = adapterContextMenu; + } + + public void setCallback(IOnItemClick callback) { + this.callback = callback; + } + + @Override + final protected PrismManageViewHolder createVH(@NotNull ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_prism_manager, parent, false); + PrismManageViewHolder prismManageViewHolder = new PrismManageViewHolder(itemView); + return prismManageViewHolder; + } + + protected boolean clickEnable(int position) { + return true; + } + + @Override + public void onBindViewHolder(final @NotNull PrismManageViewHolder holder, int position) { + //长按出菜单 + holder.itemView.setOnLongClickListener(v -> { + currentLongPressIndex = position; + return false; + }); + holder.itemView.setOnCreateContextMenuListener(this); + + PrismRecord item = getItem(position); + + if (item.prismType == PrismConstants.TYPE_PRISM_ROUND) { + //名称 + holder.tvName.setText(Tools.getString(R.string.circular_prism)); + //类型 + holder.tvType.setText(Tools.getString(R.string.prism)); + } else if (item.prismType == PrismConstants.TYPE_PRISM_MINI) { + holder.tvName.setText(Tools.getString(R.string.small_prism)); + holder.tvType.setText(Tools.getString(R.string.prism)); + } else if (item.prismType == PrismConstants.TYPE_TAPE) { + holder.tvName.setText(Tools.getString(R.string.reflective_sheet)); + holder.tvType.setText(Tools.getString(R.string.reflective_sheet)); + } + //绝对常数 + holder.tvConstant.setText(item.prismTypeConstant); + + holder.itemView.setOnClickListener(v -> { + if (callback != null && clickEnable(position)) { + callback.onItemClick(item); + } + }); + } + + public interface IOnItemClick { + void onItemClick(T item); + } + + @Override + final public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + if (adapterContextMenu == null) { + return; + } + PrismRecord currentItem = getItem(currentLongPressIndex); + if (currentItem.modify == PrismRecord.MODIFY_DEFAULT) { + return; + } + menu.clear(); + for (int index = 0; index < adapterContextMenu.menuItemSize(); index++) { + menu.add(0, index, 0, adapterContextMenu.menuItemName(index)); + MenuItem menuItem = menu.getItem(index); + if (menuItem != null) { + menuItem.setOnMenuItemClickListener(menuItemBack -> + adapterContextMenu.onMenuItemClick(currentItem, menuItemBack)); + } + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/ProjectListAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/ProjectListAdapter.java new file mode 100644 index 0000000..33c0f1c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/ProjectListAdapter.java @@ -0,0 +1,28 @@ +package com.bingce.controlnetwork.adapter; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.util.IUIRunner; + +import java.util.ArrayList; + +import com.bingce.controlnetwork.adapter.contextmenu.ProjectAdapterContextMenu; + +public class ProjectListAdapter extends BaseIndexTextWithContextMenuAdapter + implements IUpdateListAdapter { + + public ProjectListAdapter(IOnItemClick callback, + @NonNull Context context, + @NonNull IUIRunner iuiRunner, + @NonNull LifecycleOwner lifecycleOwner, + @NonNull FragmentManager fragmentManager) { + super(new ArrayList<>(), + callback, + new ProjectAdapterContextMenu(context, iuiRunner, lifecycleOwner, fragmentManager)); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/ReSurveyorCycleAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/ReSurveyorCycleAdapter.java new file mode 100644 index 0000000..180f5fe --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/ReSurveyorCycleAdapter.java @@ -0,0 +1,56 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; + +import com.bingce.controlapphelper.model.UniversalListItem; +import com.bingce.controlapphelper.model.ViewItemType; + +import java.util.List; + +import com.bingce.controlnetwork.ui.vh.IndexTextSelectableViewHolder; +import com.bingce.controlnetwork.ui.widget.ViewFactory; + +public class ReSurveyorCycleAdapter extends BaseAdapter, IndexTextSelectableViewHolder> { + + private final List> dataList; + private final ICallBack callBack; + + private int selectPosition = -1; + + public ReSurveyorCycleAdapter(List> dataList, ICallBack callBack) { + super(dataList); + this.dataList = dataList; + this.callBack = callBack; + } + + @Override + protected IndexTextSelectableViewHolder createVH(@NonNull ViewGroup parent, int viewType) { + return (IndexTextSelectableViewHolder) ViewFactory.generatorViewHolder(parent.getContext(), parent, ViewItemType.indexWithNameSelectable); + } + + @Override + public void onBindViewHolder(@NonNull IndexTextSelectableViewHolder holder, int position) { + holder.index.setVisibility(View.GONE); + holder.name.setText(dataList.get(position).getName()); + + if (position == selectPosition) { + holder.status.setVisibility(View.VISIBLE); + } else { + holder.status.setVisibility(View.GONE); + } + + holder.itemView.setOnClickListener(v -> { + selectPosition = holder.getAbsoluteAdapterPosition(); + notifyItemRangeChanged(0, dataList.size()); + callBack.back(selectPosition); + }); + } + + public interface ICallBack { + void back(int cycleIndex); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/ResurveyorPointsAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/ResurveyorPointsAdapter.java new file mode 100644 index 0000000..c22efe4 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/ResurveyorPointsAdapter.java @@ -0,0 +1,61 @@ +package com.bingce.controlnetwork.adapter; + +import android.content.Context; + +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.model.UniversalListItem; +import com.bingce.controlapphelper.model.ViewItemType; + +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.TipsFragment; + +public class ResurveyorPointsAdapter extends MultipleSelectableIndexWithTextAdapter { + private final FragmentManager fragmentManager; + private final LifecycleOwner lifecycleOwner; + private final Context context; + + public ResurveyorPointsAdapter(List selectedIds, + List items, + Context context, + FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner) { + super(selectedIds, items, null); + this.fragmentManager = fragmentManager; + this.lifecycleOwner = lifecycleOwner; + this.context = context; + } + + @Override + protected void onItemClicked(String id) { + //判断上限数据 + if (!selectedIds().contains(id)) { + if (selectedIds().size() + 1 > getItemCount() / 3) { + TipsFragment.tipsOnly(fragmentManager, lifecycleOwner, context, + context.getString(R.string.tips_resurveyor_count_exceed_1_3)); + return; + } + } + if (getItem(0) != null && getItem(0).getId().equals(id)) { + ToastUtils.showShort(R.string.tips_resurveyor_must_select_0_point); + return; + } + super.onItemClicked(id); + } + + public static class Item extends UniversalListItem { + public Item(String name, String id) { + super(name, id, null); + } + + @Override + public ViewItemType getType() { + return null; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/SelectableIndexWithTextAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/SelectableIndexWithTextAdapter.java new file mode 100644 index 0000000..7f920f9 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/SelectableIndexWithTextAdapter.java @@ -0,0 +1,99 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.View; +import android.widget.ImageView; + +import com.bingce.controlapphelper.model.IUniversalListItem; +import com.bingce.controlapphelper.model.ViewItemType; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.ui.vh.IndexTextSelectableViewHolder; +import com.bingce.controlnetwork.ui.vh.IndexTextViewHolder; + +public class SelectableIndexWithTextAdapter> extends IndexWithTextAdapter { + private String selectedId; + private final List enableList = new ArrayList<>(); + + public SelectableIndexWithTextAdapter(String selectedId, List items, List enableIndex, IOnItemClick callback) { + super(items); + setCallback(item -> { + updateCurrentSelectedId(item.getId()); + if (callback == null) { + return; + } + callback.onItemClick(item); + }); + if (enableIndex != null) { + enableList.addAll(enableIndex); + } + this.selectedId = selectedId; + } + + public SelectableIndexWithTextAdapter(String selectedId, List items, IOnItemClick callback) { + this(selectedId, items, null, callback); + } + + protected void updateCurrentSelectedId(String id) { + selectedId = id; + notifyDataSetChanged(); + } + + // @Override +// protected RecyclerView.ViewHolder createVH(@NotNull ViewGroup parent, int viewType) { +// return ViewFactory.generatorViewHolder(parent.getContext(), parent, ViewFactory.ItemType.indexWithNameSelectable); +// } + @Override + protected ViewItemType itemType() { + return ViewItemType.indexWithNameSelectable; + } + + @Override + protected boolean clickEnable(int position) { + if (enableList.isEmpty() || enableList.contains(String.valueOf(position))) { + return super.clickEnable(position); + } + return false; + } + + @Override + public void onBindViewHolder(@NotNull IndexTextViewHolder holder, int position) { + super.onBindViewHolder(holder, position); + //设置状态 + T t = getItem(position); + if (t == null) { + return; + } + if (holder instanceof IndexTextSelectableViewHolder) { + ImageView iv = ((IndexTextSelectableViewHolder) holder).status; + if (iv != null) { + if (t.getId().equals(selectedId)) { + iv.setVisibility(View.VISIBLE); + } else { + iv.setVisibility(View.GONE); + } + } + + if (!enableList.isEmpty()) { + if (enableList.contains(String.valueOf(position))) { + ((IndexTextSelectableViewHolder) holder).mask.setVisibility(View.GONE); + ((IndexTextSelectableViewHolder) holder).item.setAlpha(1f); + } else { + ((IndexTextSelectableViewHolder) holder).mask.setVisibility(View.VISIBLE); + ((IndexTextSelectableViewHolder) holder).item.setAlpha(.5f); + } + } + } + } + + protected String currentSelectedItemId() { + return selectedId; + } + + protected boolean isItemSelected(int index) { + return currentSelectedItemId().equals(getItem(index).getId()); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/SpinnerAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/SpinnerAdapter.java new file mode 100644 index 0000000..c3a5219 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/SpinnerAdapter.java @@ -0,0 +1,83 @@ +package com.bingce.controlnetwork.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.R; + +public class SpinnerAdapter extends BaseAdapter { + + private final Context context; + + private final List lists; + + + public SpinnerAdapter(Context context, List list) { + this.context = context; + this.lists = new ArrayList<>(); + lists.addAll(list); + } + + @Override + public int getCount() { + return lists.size(); + } + + @Override + public String getItem(int position) { + return lists.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + convertView = getConvertView(convertView, parent); + ViewHodler viewHodler = (ViewHodler) convertView.getTag(); + viewHodler.textView.setText(getItem(position)); + return convertView; + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + convertView = getConvertView(convertView, parent); + ViewHodler viewHodler = (ViewHodler) convertView.getTag(); + viewHodler.imageView.setVisibility(position == 0 ? View.VISIBLE : View.GONE); + viewHodler.textView.setText(getItem(position)); + return convertView; + } + + + private View getConvertView(View convertView, ViewGroup parent) { + if (convertView == null) { + ViewHodler viewHodler = new ViewHodler(); + convertView = LayoutInflater.from(context).inflate(R.layout.item_spinner_content, parent, false); + viewHodler.textView = convertView.findViewById(R.id.tv); + viewHodler.imageView = convertView.findViewById(R.id.ivArrow); + convertView.setTag(viewHodler); + } + return convertView; + } + + private class ViewHodler { + public TextView textView; + public ImageView imageView; + } + + public void setLists(List lists) { + this.lists.clear(); + this.lists.addAll(lists); + notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorPeriodAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorPeriodAdapter.java new file mode 100644 index 0000000..a581d91 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorPeriodAdapter.java @@ -0,0 +1,32 @@ +package com.bingce.controlnetwork.adapter; + +import android.os.Bundle; + +import androidx.fragment.app.DialogFragment; + +import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord; + +import java.util.ArrayList; + +import com.bingce.controlnetwork.adapter.contextmenu.SurveyorPeriodAdapterContextMenu; +import com.bingce.controlnetwork.fragment.BottomSheetSurveyorPeriodFragment; + +public class SurveyorPeriodAdapter extends BaseSelectableIndexTextWithContextMenuAdapter { + public SurveyorPeriodAdapter(String selectedId, DialogFragment fragment) { + super(selectedId, + new ArrayList<>(), + item -> { + Bundle args = new Bundle(); + args.putString(BottomSheetSurveyorPeriodFragment.KEY_RESULT_ID, item.getValue()); + args.putString(BottomSheetSurveyorPeriodFragment.KEY_RESULT_NAME, item.getName()); + fragment.getParentFragmentManager().setFragmentResult(BottomSheetSurveyorPeriodFragment.KEY_REQUEST_TIME, args); + fragment.dismiss(); + }, + new SurveyorPeriodAdapterContextMenu(fragment.getContext(), selectedId, + fragment.getViewLifecycleOwner(), fragment.getChildFragmentManager())); + } + + public void changeCurrentSelect(String id) { + updateCurrentSelectedId(id); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorStationListAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorStationListAdapter.java new file mode 100644 index 0000000..bc368b3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorStationListAdapter.java @@ -0,0 +1,440 @@ +package com.bingce.controlnetwork.adapter; + +import android.content.Context; +import android.text.TextUtils; +import android.widget.TextView; + +import androidx.annotation.MainThread; +import androidx.annotation.NonNull; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LiveData; + +import com.bingce.controlapphelper.datasource.database.ProjectType; +import com.bingce.controlapphelper.datasource.database.SurveyorDataBase; +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.route.RouteRecord; +import com.bingce.controlapphelper.datasource.database.surveyorrecord.ISurveyorRecordDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.util.IUIRunner; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.util.SurveyorStationUtil; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.contextmenu.ContextMenuEdit; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; +import com.bingce.controlnetwork.fragment.stationdetail.SingleStationDetailAndEditFragment; + +import com.bingce.controlapphelper.util.StationUtil; +import com.bingce.controlnetwork.util.SurveyorStationUtil; + +public class SurveyorStationListAdapter extends BaseIndexPrefixTextWithContextMenuAdapter { + private final LifecycleOwner lifecycleOwner; + + public SurveyorStationListAdapter(List items, + @NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + @NonNull IUIRunner iuiRunner, + Context context, + IOnItemClick itemClick, + boolean editAble) { + super(items, itemClick, + contextMenu(fragmentManager, lifecycleOwner, iuiRunner, context, editAble)); + this.lifecycleOwner = lifecycleOwner; + } + + @Override + protected void onSetName(TextView nameTextView, SurveyorStationRecord item) { + String pointId = item.getItems().get(0).getPointId(); + nameTextView.setText(cachedId2Name.get(pointId)); + + if (item.getItems() == null || item.getItems().isEmpty()) { + return; + } + //停止原livedata订阅 + Object tag = nameTextView.getTag(); + LiveData pointRecordLiveData; + if (tag instanceof LiveData) { + pointRecordLiveData = (LiveData) tag; + pointRecordLiveData.removeObservers(lifecycleOwner); + } + //创建新订阅 + pointRecordLiveData = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findById(pointId); + nameTextView.setTag(pointRecordLiveData); + + //监听 + pointRecordLiveData.observe(lifecycleOwner, pointRecord -> { + if (pointRecord == null) { + return; + } + nameTextView.setText(pointRecord.getName()); + cachedId2Name.put(pointRecord.id, pointRecord.getName()); + }); + } + + @Override + protected void onSetPrefix(TextView prefixTextView, SurveyorStationRecord item) { + String lineId = item.getLineId(); + if (cachedId2LineName.containsKey(lineId)) { + prefixTextView.setText(cachedId2LineName.get(lineId)); + } else if (!TextUtils.isEmpty(item.routeId)) { + prefixTextView.setText(""); + } else { + prefixTextView.setText(StationUtil.mulCycleAngleStationPrefix()); + } + + if (lineId == null || lineId.isEmpty()) { + return; + } + //停止原livedata订阅 + Object tag = prefixTextView.getTag(); + LiveData lineRecordLiveData; + if (tag instanceof LiveData) { + lineRecordLiveData = (LiveData) tag; + lineRecordLiveData.removeObservers(lifecycleOwner); + } + //创建新订阅 + lineRecordLiveData = SurveyorDatabaseFactory + .instance + .getLineRecordDatabase() + .liveData(lineId); + prefixTextView.setTag(lineRecordLiveData); + + //监听 + lineRecordLiveData.observe(lifecycleOwner, lineRecord -> { + if (lineRecord == null) { + return; + } + prefixTextView.setText(lineRecord.name + "-"); + cachedId2LineName.put(lineRecord.id, lineRecord.name); + cachedId2LineType.put(lineRecord.id, lineRecord.type); + }); + } + + private static final Map cachedId2Name = new HashMap<>(); + private static final Map cachedId2LineName = new HashMap<>(); + private static final Map cachedId2LineType = new HashMap<>(); + + private static ContextMenuEdit contextMenu( + @NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + @NonNull IUIRunner iuiRunner, + Context context, + boolean editAble) { + if (!editAble) { + return null; + } + return new ContextMenuEdit() { + @Override + protected void edit(SurveyorStationRecord item) { + if (item.isHaveRoute()) { + //目前有路线的就是高程导线测站 + dealEditHeightTraverse(item, fragmentManager, lifecycleOwner, context, iuiRunner); + } else if (item.isLineWell(cachedId2LineType.get(item.getLineId()))) { + dealEditWell(item, fragmentManager, lifecycleOwner, context, iuiRunner); + } else { + dealEditTriangle(item, fragmentManager, lifecycleOwner, context, iuiRunner); + } + } + }; + } + + /** + * 高程导线 测站 + * + * @param item + * @param fragmentManager + * @param lifecycleOwner + * @param context + * @param iuiRunner + */ + private static void dealEditHeightTraverse(SurveyorStationRecord item, FragmentManager fragmentManager, LifecycleOwner lifecycleOwner, Context context, IUIRunner iuiRunner) { + TipsWith2OptionFragment.tips(fragmentManager, lifecycleOwner, + context.getString(R.string.button_edit_station), + context.getString(R.string.button_delete_station), + context.getString(R.string.tips_select_default_station_operator), + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + ThreadPoolUtil.execute(() -> { + String stationName = StationUtil.getStationName(item); + String lineType = StationUtil.getLineTypeFromStation(item); + SingleStationDetailAndEditFragment.start(context, item.getId(), stationName, item.getProjectId()); + }); + } + + @Override + public void onCancel() { + try2DeleteStation(item, context, fragmentManager, lifecycleOwner, iuiRunner); + } + }); + } + + /** + * 三角 测站 + * + * @param item + * @param fragmentManager + * @param lifecycleOwner + * @param context + * @param iuiRunner + */ + private static void dealEditTriangle(SurveyorStationRecord item, FragmentManager fragmentManager, LifecycleOwner lifecycleOwner, Context context, IUIRunner iuiRunner) { + //检测是否属于导线测量 + if (item.isLineStation()) { + String lineId = item.getLineId(); + TipsWith2OptionFragment.tips(fragmentManager, lifecycleOwner, + context.getString(R.string.button_edit_line), + context.getString(R.string.button_delete_line), + context.getString(R.string.tips_forbid_delete_station_because_batch), + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + try2EditLine(lineId, context, fragmentManager, lifecycleOwner, iuiRunner); + } + + @Override + public void onCancel() { + try2DeleteLine(lineId, context, fragmentManager, lifecycleOwner, iuiRunner); + } + }); + } else { + TipsWith2OptionFragment.tips(fragmentManager, lifecycleOwner, + context.getString(R.string.button_edit_station), + context.getString(R.string.button_delete_station), + context.getString(R.string.tips_select_default_station_operator), + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + ThreadPoolUtil.execute(() -> { + String stationName = StationUtil.getStationName(item); + String lineType = StationUtil.getLineTypeFromStation(item); + SingleStationDetailAndEditFragment.start(context, item.getId(), stationName, item.getProjectId()); + }); + } + + @Override + public void onCancel() { + try2DeleteStation(item, context, fragmentManager, lifecycleOwner, iuiRunner); + } + }); + } + } + + /** + * 联系测量 测站 + * + * @param item + * @param fragmentManager + * @param lifecycleOwner + * @param context + * @param iuiRunner + */ + private static void dealEditWell(SurveyorStationRecord item, FragmentManager fragmentManager, LifecycleOwner lifecycleOwner, Context context, IUIRunner iuiRunner) { + TipsWith2OptionFragment.tips(fragmentManager, lifecycleOwner, + context.getString(R.string.button_edit_station), + context.getString(R.string.button_delete_station), + context.getString(R.string.tips_select_default_station_operator_well), + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + SurveyorStationUtil.editLine(context, item.getLineId()); + } + + @Override + public void onCancel() { + try2DeleteLine(item.getLineId(), context, fragmentManager, lifecycleOwner, iuiRunner); + } + }); + } + + @WorkerThread + private static boolean isStationHasData(String stationId) { + ISurveyorRecordDataSource surveyorRecordDataSource = + SurveyorDatabaseFactory.instance.getSurveyorRecordDataSource(); + return surveyorRecordDataSource.recordCount(stationId) > 0; + } + + @WorkerThread + private static boolean isLineHasData(String lineId) { + boolean lineHasData = Tools.isLineHasData(lineId); +// ISurveyorStationDataSource stationDataSource = +// SurveyorDatabaseFactory.instance.getSurveyorStation(); +// List stationRecordList = stationDataSource.getDataListByLine(lineId); +// if (stationRecordList == null || stationRecordList.isEmpty()) { +// return false; +// } +// ISurveyorRecordDataSource surveyorRecordDataSource = +// SurveyorDatabaseFactory.instance.getSurveyorRecordDataSource(); +// boolean hasData = false; +// for (SurveyorStationRecord stationRecord : stationRecordList) { +// if (stationRecord == null) { +// continue; +// } +// if (surveyorRecordDataSource.recordCount(stationRecord.getId()) <= 0) { +// continue; +// } +// hasData = true; +// break; +// } + return lineHasData; + } + + private static void try2DeleteLine(String lineId, Context context, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner, + @NonNull IUIRunner iuiRunner) { + ThreadPoolUtil.execute(() -> { + if (isLineHasData(lineId)) { + iuiRunner.runOnUI(() -> TipsFragment.cancelAbleTips(fragmentManager, lifecycleOwner, context, + context.getString(R.string.tips_is_sure_to_delete_line_with_record), + 4, + () -> SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .deleteByLineId(lineId))); + } else { + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .deleteByLineId(lineId); + } + }); + } + + private static void try2EditLine(String lineId, Context context, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner, + @NonNull IUIRunner iuiRunner) { + ThreadPoolUtil.execute(() -> { + if (isLineHasData(lineId)) { + iuiRunner.runOnUI(() -> TipsFragment.cancelAbleTips(fragmentManager, lifecycleOwner, context, + context.getString(R.string.tips_is_sure_to_edit_line_with_record), + 4, + () -> SurveyorStationUtil.editLine(context, lineId))); + } else { + SurveyorStationUtil.editLine(context, lineId); + } + }); + } + + private static void try2DeleteStation(SurveyorStationRecord stationRecord, Context context, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner, + @NonNull IUIRunner iuiRunner) { + ThreadPoolUtil.execute(() -> { + boolean canDelete = checkDeleteStation(stationRecord); + if (!canDelete) { + return; + } + if (isStationHasData(stationRecord.getId())) { + iuiRunner.runOnUI(() -> TipsFragment.cancelAbleTips(fragmentManager, lifecycleOwner, context, + context.getString(R.string.tips_is_sure_to_delete_station_with_record), + 4, + () -> deleteStationDatabase(stationRecord))); + } else { + deleteStationDatabase(stationRecord); + } + }); + } + + /** + * 检查是否可以删除测站 + */ + @WorkerThread + private static boolean checkDeleteStation(SurveyorStationRecord stationRecord) { + ProjectRecord projectRecord = SurveyorDatabaseFactory.instance.getProjectDataSource().getRecord(stationRecord.getProjectId()); + if (!ProjectType.HEIGHT_TRAVERSE.getFlag().equals(projectRecord.getProjectType())) { + return true; + } + SurveyorStationRecord stationRecordLatest = SurveyorDatabaseFactory.instance.getSurveyorStation().getByProjectRouteLatest(stationRecord.getProjectId(), stationRecord.routeId); + if (stationRecordLatest != null) { + if (stationRecord.getId().equals(stationRecordLatest.getId())) { + return true; + } + if (stationRecordLatest.relationStationId != null) { + List relationList = SurveyorDatabaseFactory.instance.getSurveyorStation().getListByRelationStationId(stationRecordLatest.relationStationId); + for (SurveyorStationRecord record : relationList) { + if (stationRecord.getId().equals(record.getId())) { + return true; + } + } + } + } + ToastUtils.showShort(R.string.center_station_not_allowed_delete); + return false; + } + + @MainThread + private static void deleteStationDatabase(SurveyorStationRecord stationRecord) { + ThreadPoolUtil.execute(() -> { + ProjectRecord projectRecord = SurveyorDatabaseFactory.instance.getProjectDataSource().getRecord(stationRecord.getProjectId()); + if (!ProjectType.HEIGHT_TRAVERSE.getFlag().equals(projectRecord.getProjectType())) { + //非高程导线只删除测站 + SurveyorDatabaseFactory.instance.getSurveyorStation().deleteById(stationRecord.getId()); + return; + } + //高程导线删除测站和未使用的自动生成的点 + deleteStationDatabaseHeightTraverse(stationRecord); + }); + } + + @WorkerThread + private static void deleteStationDatabaseHeightTraverse(SurveyorStationRecord stationRecord) { + SurveyorDataBase.getInstance().runInTransaction(() -> { + // + RouteRecord routeRecord = SurveyorDatabaseFactory.instance.getRouteDataSource().getByIdSync(stationRecord.routeId); + if (routeRecord != null) { + PointRecord startPointRecord = SurveyorDatabaseFactory.instance.getPointDataSource().findByIdSync(routeRecord.getStartPointId()); + PointRecord endPointRecord = SurveyorDatabaseFactory.instance.getPointDataSource().findByIdSync(routeRecord.getEndPointId()); + if (startPointRecord != null) { + delelePointHeightTraverse(startPointRecord.getId()); + } + if (endPointRecord != null) { + delelePointHeightTraverse(endPointRecord.getId()); + } + } + + if (stationRecord.relationStationId != null) { + List stationList = SurveyorDatabaseFactory.instance.getSurveyorStation().getListByRelationStationId(stationRecord.relationStationId); + for (SurveyorStationRecord item : stationList) { + deleleStationRecordAndPointHeightTraverse(item); + } + } else { + deleleStationRecordAndPointHeightTraverse(stationRecord); + } + }); + } + + @WorkerThread + private static void deleleStationRecordAndPointHeightTraverse(SurveyorStationRecord stationRecord) { + if (stationRecord != null && stationRecord.items != null) { + for (SurveyorPoint surveyorPoint : stationRecord.items) { + delelePointHeightTraverse(surveyorPoint.getOriginalPointId()); + } + } + SurveyorDatabaseFactory.instance.getSurveyorStation().delete(stationRecord); + } + + @WorkerThread + private static void delelePointHeightTraverse(String pointId) { + if (PointUtil.isCanDeleteHeightTraverseAutoCreatePoint(pointId)) { + SurveyorDatabaseFactory.instance.getPointDataSource().deleteById(pointId); + } + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorStationRecordsAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorStationRecordsAdapter.java new file mode 100644 index 0000000..61ff774 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/SurveyorStationRecordsAdapter.java @@ -0,0 +1,77 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.IAdapter; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.IDistanceTypeChangeListener; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; + +import org.jetbrains.annotations.NotNull; + +import com.bingce.controlnetwork.ui.vh.SurveyorDataViewHolder; +import com.bingce.controlnetwork.ui.widget.ViewFactory; + +/* + * 测量记录adapter + * */ +public class SurveyorStationRecordsAdapter extends RecyclerView.Adapter + implements IAdapter, IDistanceTypeChangeListener { + private final ICachedData cachedData; + private final ISurveyorData surveyorData; + private final ICycleRecorder cycleRecorder; + private boolean showSlopDistance = true; + private final String stationId; + + public SurveyorStationRecordsAdapter( + String stationId, + ICachedData cachedData, + ICycleRecorder cycleRecorder, + ISurveyorData surveyorData) { + this.stationId = stationId; + this.cachedData = cachedData; + this.surveyorData = surveyorData; + this.cycleRecorder = cycleRecorder; + //注册数据监听 + cachedData.register(this); + } + + @NonNull + @NotNull + @Override + public SurveyorDataViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) { + RecyclerView.ViewHolder vh = ViewFactory.generatorViewHolder(parent.getContext(), parent, ViewItemType.surveyorStationPointItem); + assert vh != null; + return (SurveyorDataViewHolder) vh; + } + + @Override + public void onBindViewHolder(@NonNull @NotNull SurveyorDataViewHolder holder, int position) { + holder.setup(position, + stationId, + showSlopDistance, + cachedData, + cycleRecorder, + surveyorData); + } + + @Override + public int getItemCount() { + return cachedData.pointCount(); + } + + @Override + public void onDataChange() { + notifyItemRangeChanged(0, getItemCount()); + } + + @Override + public void onShowSlopDistance(boolean value) { + this.showSlopDistance = value; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/TitleWithSubtitleAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/TitleWithSubtitleAdapter.java new file mode 100644 index 0000000..caac1da --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/TitleWithSubtitleAdapter.java @@ -0,0 +1,76 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.ViewGroup; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.IUniversalListItemWithTitleAndSubtitle; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlnetwork.ui.vh.TitleWithSubtitleViewHolder; +import com.bingce.controlnetwork.ui.widget.ViewFactory; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class TitleWithSubtitleAdapter> + extends RecyclerView.Adapter { + + private final List mValues; + private final TitleWithSubtitleAdapter.IOnItemClick callback; + + public TitleWithSubtitleAdapter(List items, TitleWithSubtitleAdapter.IOnItemClick callback) { + mValues = items; + this.callback = callback; + } + + public void updateData(List list) { + if (mValues != null) { + mValues.clear(); + } + if (list != null) { + mValues.addAll(list); + } + notifyDataSetChanged(); + } + + protected RecyclerView.ViewHolder createVH(@NotNull ViewGroup parent, int viewType) { + return ViewFactory.generatorViewHolder(parent.getContext(), parent, ViewItemType.titleWithSubtitle); + } + + @Override + public @NotNull + TitleWithSubtitleViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { + RecyclerView.ViewHolder viewHolder = createVH(parent, viewType); + assert viewHolder != null; + return (TitleWithSubtitleViewHolder) viewHolder; + } + + protected T getItem(int position) { + return mValues.get(position); + } + + @Override + public void onBindViewHolder(final TitleWithSubtitleViewHolder holder, int position) { + T item = getItem(position); + holder.title.setText(item.getTitle()); + holder.subTitle.setText(item.getSubtitle()); + holder.itemView.setOnClickListener(v -> { + if (callback != null) { + callback.onItemClick(item); + } + }); + } + + @Override + public int getItemCount() { + if (mValues == null) { + return 0; + } + return mValues.size(); + } + + public interface IOnItemClick> { + void onItemClick(T item); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/ToleranceDetailAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/ToleranceDetailAdapter.java new file mode 100644 index 0000000..b25cac5 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/ToleranceDetailAdapter.java @@ -0,0 +1,135 @@ +package com.bingce.controlnetwork.adapter; + +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseExpandableListAdapter; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.ProjectTolerance; +import com.bingce.controlapphelper.model.UniversalListItem; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.ui.vh.GroupParentViewHolder; +import com.bingce.controlnetwork.ui.vh.KeyBoolViewHolder; +import com.bingce.controlnetwork.ui.vh.KeyValueViewHolder; +import com.bingce.controlnetwork.ui.widget.ViewFactory; + +import java.util.Arrays; +import java.util.List; + +/* + * 限差详情adapter + * */ +public class ToleranceDetailAdapter extends BaseExpandableListAdapter { + private ProjectTolerance data; + private static final List childTypes = + Arrays.asList( + ViewItemType.nameWithBool, + ViewItemType.nameWithText); + + public ToleranceDetailAdapter(ProjectTolerance limit) { + data = limit; + } + + public void updateData(ProjectTolerance limit) { + this.data = limit; + notifyDataSetChanged(); + } + + @Override + public int getGroupCount() { + return data.groupCount(); + } + + @Override + public int getChildrenCount(int groupPosition) { + return data.childrenCount(groupPosition); + } + + @Override + public String getGroup(int groupPosition) { + return data.groupName(groupPosition); + } + + @Override + public UniversalListItem getChild(int groupPosition, int childPosition) { + return data.child(groupPosition, childPosition); + } + + @Override + public long getGroupId(int groupPosition) { + return groupPosition; + } + + @Override + public long getChildId(int groupPosition, int childPosition) { + return groupPosition * 10L + childPosition; + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { + GroupParentViewHolder viewHolder = null; + if (convertView == null) { + convertView = ViewFactory.generatorView(parent.getContext(), parent, ViewItemType.groupParent); + viewHolder = new GroupParentViewHolder(convertView); + convertView.setTag(viewHolder); + } else { + viewHolder = (GroupParentViewHolder) convertView.getTag(); + } + if (viewHolder != null) { + String groupName = getGroup(groupPosition); + if (viewHolder.name != null) { + viewHolder.name.setText(groupName); + } + if (viewHolder.expandIcon != null) { + viewHolder.expandIcon.setImageResource(isExpanded ? R.drawable.ic_arrow_up : R.drawable.ic_arrow_down); + } + } + return convertView; + } + + @Override + public int getChildTypeCount() { + return childTypes.size(); + } + + @Override + public int getChildType(int groupPosition, int childPosition) { + return childTypes.indexOf(getChild(groupPosition, childPosition).getType()); + } + + @Override + public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { + UniversalListItem item = getChild(groupPosition, childPosition); + RecyclerView.ViewHolder viewHolder = null; + if (convertView == null) { + viewHolder = ViewFactory.generatorViewHolder(parent.getContext(), parent, item.getType()); + convertView = viewHolder.itemView; + convertView.setTag(viewHolder); + } else { + viewHolder = (RecyclerView.ViewHolder) convertView.getTag(); + } + if (viewHolder instanceof KeyValueViewHolder) { + KeyValueViewHolder kvHolder = (KeyValueViewHolder) viewHolder; + kvHolder.key.setText(item.getName()); + kvHolder.value.setText(item.getValue().toString()); + } else if (viewHolder instanceof KeyBoolViewHolder) { + KeyBoolViewHolder kvHolder = (KeyBoolViewHolder) viewHolder; + kvHolder.key.setText(item.getName()); + kvHolder.checkBox.setChecked((Boolean) item.getValue()); + } + return convertView; + } + + @Override + public boolean isChildSelectable(int groupPosition, int childPosition) { + return true; + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuDelete.java b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuDelete.java new file mode 100644 index 0000000..9a8331d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuDelete.java @@ -0,0 +1,28 @@ +package com.bingce.controlnetwork.adapter.contextmenu; + +import android.view.MenuItem; + +import com.bingce.controlnetwork.R; + +public abstract class ContextMenuDelete implements IAdapterContextMenu { + @Override + public int menuItemSize() { + return 1; + } + + @Override + public int menuItemName(int index) { + return R.string.menu_delete; + } + + @Override + final public boolean onMenuItemClick(T item, MenuItem menuItem) { + if (menuItem.getItemId() == 0) { + delete(item); + return true; + } + return false; + } + + protected abstract void delete(T item); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuDeleteEdit.java b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuDeleteEdit.java new file mode 100644 index 0000000..74d807f --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuDeleteEdit.java @@ -0,0 +1,37 @@ +package com.bingce.controlnetwork.adapter.contextmenu; + +import android.view.MenuItem; + +import com.bingce.controlnetwork.R; + +public abstract class ContextMenuDeleteEdit implements IAdapterContextMenu { + @Override + final public int menuItemSize() { + return 2; + } + + @Override + final public int menuItemName(int index) { + if (index == 0) { + return R.string.menu_delete; + } + return R.string.menu_edit; + } + + @Override + final public boolean onMenuItemClick(T item, MenuItem menuItem) { + if (menuItem.getItemId() == 0) { + delete(item); + return true; + } + if (menuItem.getItemId() == 1) { + edit(item); + return true; + } + return false; + } + + protected abstract void delete(T item); + + protected abstract void edit(T item); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuEdit.java b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuEdit.java new file mode 100644 index 0000000..dab433c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ContextMenuEdit.java @@ -0,0 +1,28 @@ +package com.bingce.controlnetwork.adapter.contextmenu; + +import android.view.MenuItem; + +import com.bingce.controlnetwork.R; + +public abstract class ContextMenuEdit implements IAdapterContextMenu { + @Override + public int menuItemSize() { + return 1; + } + + @Override + public int menuItemName(int index) { + return R.string.menu_edit; + } + + @Override + final public boolean onMenuItemClick(T item, MenuItem menuItem) { + if (menuItem.getItemId() == 0) { + edit(item); + return true; + } + return false; + } + + protected abstract void edit(T item); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/IAdapterContextMenu.java b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/IAdapterContextMenu.java new file mode 100644 index 0000000..4754b32 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/IAdapterContextMenu.java @@ -0,0 +1,14 @@ +package com.bingce.controlnetwork.adapter.contextmenu; + +import android.view.MenuItem; + +import androidx.annotation.StringRes; + +public interface IAdapterContextMenu { + int menuItemSize(); + + @StringRes + int menuItemName(int index); + + boolean onMenuItemClick(T item, MenuItem menuItem); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ProjectAdapterContextMenu.java b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ProjectAdapterContextMenu.java new file mode 100644 index 0000000..bcb5494 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/ProjectAdapterContextMenu.java @@ -0,0 +1,49 @@ +package com.bingce.controlnetwork.adapter.contextmenu; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.ProjectHelper; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.util.IUIRunner; + +import com.bingce.controlnetwork.fragment.projectedit.AbstractProjectEditFragment; + +public class ProjectAdapterContextMenu extends ContextMenuDeleteEdit { + private @NonNull + final FragmentManager fragmentManager; + private @NonNull + final Context context; + private final @NonNull + IUIRunner iuiRunner; + private final @NonNull + LifecycleOwner lifecycleOwner; + + private final ProjectHelper projectHelper; + + public ProjectAdapterContextMenu( + @NonNull Context context, + @NonNull IUIRunner iuiRunner, + @NonNull LifecycleOwner lifecycleOwner, + @NonNull FragmentManager fragmentManager) { + this.fragmentManager = fragmentManager; + this.context = context; + this.iuiRunner = iuiRunner; + this.lifecycleOwner = lifecycleOwner; + projectHelper = new ProjectHelper(lifecycleOwner.getLifecycle()); + } + + @Override + protected void delete(ProjectRecord item) { + projectHelper.deleteProject(fragmentManager, lifecycleOwner, context, item); + } + + @Override + protected void edit(ProjectRecord item) { + AbstractProjectEditFragment.editProject(fragmentManager, context, item.getId(), item.getProjectTypeFault(), + item.getToleranceId(), item.getProjectName()); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/SurveyorPeriodAdapterContextMenu.java b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/SurveyorPeriodAdapterContextMenu.java new file mode 100644 index 0000000..441b054 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/contextmenu/SurveyorPeriodAdapterContextMenu.java @@ -0,0 +1,84 @@ +package com.bingce.controlnetwork.adapter.contextmenu; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.ConfigRecord; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.fragment.StringInputFragment; +import com.bingce.utils.ThreadPoolUtil; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.StringInputFragment; + +public class SurveyorPeriodAdapterContextMenu extends ContextMenuDeleteEdit { + private @NonNull + final LifecycleOwner lifecycleOwner; + private @NonNull + final FragmentManager fragmentManager; + private final String selectedId; + private final Context context; + + public SurveyorPeriodAdapterContextMenu(Context context, String selectedId, + @NonNull LifecycleOwner lifecycleOwner, + @NonNull FragmentManager fragmentManager) { + this.context = context; + this.selectedId = selectedId; + this.lifecycleOwner = lifecycleOwner; + this.fragmentManager = fragmentManager; + } + + @Override + protected void delete(SurveyorPeriodRecord item) { + String id = item.getId(); + if (selectedId.equals(id)) { + ToastUtils.showShort(Tools.getString(R.string.current_period_selected_not_delete)); + } else { + SurveyorDatabaseFactory + .instance + .getSurveyorPeriod() + .deleteById(id); + //检测是否需要修改默认测期 + ThreadPoolUtil.execute(new Runnable() { + @Override + public void run() { + IConfigDataSource configDataSource = + SurveyorDatabaseFactory + .instance.getConfigDataSource(); + ConfigRecord configRecord = configDataSource.getByKeySync(ConfigConstants.KEY_DEFAULT_PERIOD_ID); + if (configRecord != null && id.equals(configRecord.getConfigValue())) { + configDataSource.set(ConfigConstants.KEY_DEFAULT_PERIOD_ID, selectedId); + } + } + }); + } + } + + @Override + protected void edit(SurveyorPeriodRecord item) { + StringInputFragment + .input( + fragmentManager, + Tools.getString(R.string.modify_period_name), + item.getName(), + lifecycleOwner, + string -> { + if (string != null && !string.isEmpty()) { + item.setName(string); + SurveyorDatabaseFactory + .instance + .getSurveyorPeriod() + .saveRecord(item); + } + }); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/BaseStationDetailAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/BaseStationDetailAdapter.java new file mode 100644 index 0000000..bd0419e --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/BaseStationDetailAdapter.java @@ -0,0 +1,227 @@ +package com.bingce.controlnetwork.adapter.stationdetail; + +import android.text.TextUtils; +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlnetwork.ui.vh.DraggableTextViewHolder; +import com.bingce.controlnetwork.ui.vh.StationGroupItemViewHolder; +import com.bingce.controlnetwork.ui.widget.recyclerview.AbstractDraggableRecycleViewAdapter; + +import java.util.ArrayList; +import java.util.List; + +public abstract class BaseStationDetailAdapter extends AbstractDraggableRecycleViewAdapter { + private final boolean adjustable; + private final IOnSelectPointDelegate selectPointCallback; + + protected BaseStationDetailAdapter(IOnSelectPointDelegate selectPointCallback, + List items, + boolean adjustable) { + super(items); + this.adjustable = adjustable; + this.selectPointCallback = selectPointCallback; + } + + public void setStationPoint(String id, String name) { + StationDetailItem item = getItem(1); + if (item != null) { + if (StationDetailItem.ITEM_TYPE_STATION_ITEM.equals(item.getType())) { + setItem(1, new StationDetailItem( + name, StationDetailItem.ITEM_TYPE_STATION_ITEM, id)); + notifyItemChanged(1); + } else { + StationDetailItem newInstance = new StationDetailItem( + name, StationDetailItem.ITEM_TYPE_STATION_ITEM, id); + insert(1, newInstance); + notifyItemInserted(1); + } + } + } + + public void setSurveyorPoint(List ids, List names) { + List items = new ArrayList<>(); + for (int index = 0; index < ids.size(); index++) { + StationDetailItem item = new StationDetailItem( + names.get(index), StationDetailItem.ITEM_TYPE_POINT_ITEM, ids.get(index)); + items.add(item); + } + if (items == null || items.isEmpty()) { + return; + } + for (int i = getItemCount() - 1; i >= 0; i--) { + StationDetailItem item = getItem(i); + if (TextUtils.equals(item.getType(), StationDetailItem.ITEM_TYPE_POINT_ITEM)) { + remove(item); + } + } + insertAll(items); + notifyDataSetChanged(); + } + + private StationDetailItem getStationItem() { + StationDetailItem o = getItem(1); + if (o != null && StationDetailItem.ITEM_TYPE_STATION_ITEM.equals(o.getType())) { + return o; + } + return null; + } + + @Override + protected void bindItem(StationDetailItem item, RecyclerView.ViewHolder viewHolder) { + if (viewHolder instanceof DraggableTextViewHolder) { + DraggableTextViewHolder draggableTextViewHolder = (DraggableTextViewHolder) viewHolder; + DraggableTextViewHolder.update(draggableTextViewHolder, item, adjustable); + } else if (viewHolder instanceof StationGroupItemViewHolder) { + StationGroupItemViewHolder surveyorStationSetupGroupParentViewHolder = ((StationGroupItemViewHolder) viewHolder); + StationGroupItemViewHolder.update( + surveyorStationSetupGroupParentViewHolder, + item, + adjustable, + (itemType, surveyorStationSetupGroupParentViewHolder1) -> { + if (StationDetailItem.ITEM_TYPE_STATION_GROUP.equals(item.getType())) { + View.OnClickListener listener = v -> { + if (selectPointCallback != null) { + //收集信息 + PickPointResult pickPointResult = new PickPointResult(); + StationDetailItem stationItem = getStationItem(); + if (stationItem != null) { + pickPointResult.getSelectedIds().add(stationItem.getOriginalPointId()); + pickPointResult.getSelectedNames().add(stationItem.getName()); + } + ArrayList filters = new ArrayList<>(); + for (int index = 2; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj == null) { + continue; + } + if (StationDetailItem.ITEM_TYPE_POINT_ITEM.equals(obj.getType())) { + filters.add(obj.getOriginalPointId()); + } + } + selectPointCallback.onSelectStationPoint(pickPointResult, filters); + } + }; + surveyorStationSetupGroupParentViewHolder1.pick.setOnClickListener(listener); + surveyorStationSetupGroupParentViewHolder1.switchView.setOnClickListener(listener); + StationDetailItem stationItem = getStationItem(); + if (stationItem != null) { + surveyorStationSetupGroupParentViewHolder1.pick.setVisibility(View.INVISIBLE); + surveyorStationSetupGroupParentViewHolder1.switchView.setVisibility(View.VISIBLE); + } else { + surveyorStationSetupGroupParentViewHolder1.pick.setVisibility(View.VISIBLE); + surveyorStationSetupGroupParentViewHolder1.switchView.setVisibility(View.INVISIBLE); + } + } else if (StationDetailItem.ITEM_TYPE_POINT_GROUP.equals(item.getType())) { + surveyorStationSetupGroupParentViewHolder1.pick.setOnClickListener(v -> { + if (selectPointCallback != null) { + //收集信息 + PickPointResult pickPointResult = new PickPointResult(); + for (int index = 2; index < getItemCount(); index++) { + StationDetailItem o = getItem(index); + if (o == null) { + continue; + } + if (StationDetailItem.ITEM_TYPE_POINT_ITEM.equals(o.getType())) { + pickPointResult.getSelectedIds().add(o.getOriginalPointId()); + pickPointResult.getSelectedNames().add(o.getName()); + } + } + String filterId = ""; + StationDetailItem filter = getStationItem(); + if (filter != null) { + filterId = filter.getOriginalPointId(); + } + ArrayList filters = new ArrayList<>(); + if (!filterId.isEmpty()) { + filters.add(filterId); + } + selectPointCallback.onSelectSurveyorPoint(pickPointResult, filters); + } + }); + } + }); + } + } + + @Override + public int getItemViewType(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return -1; + } + if (StationDetailItem.ITEM_TYPE_POINT_GROUP.equals(item.getType()) || + StationDetailItem.ITEM_TYPE_STATION_GROUP.equals(item.getType())) { + return ViewItemType.surveyorStationCreateStationGroupItem.ordinal(); + } + return super.getItemViewType(position); + } + + @Override + public boolean isItemSwipeAble(int position) { + StationDetailItem item = getItem(position); + if (!adjustable || item == null) { + return false; + } + return !StationDetailItem.ITEM_TYPE_STATION_GROUP.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_POINT_GROUP.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_STATION_ITEM.equals(item.getType()); + } + + @Override + public boolean isItemDragAble(int position) { + StationDetailItem item = getItem(position); + if (!adjustable || item == null) { + return false; + } + return !StationDetailItem.ITEM_TYPE_STATION_ITEM.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_STATION_GROUP.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_POINT_GROUP.equals(item.getType()); + } + + public List collectData() { + List stationItems = new ArrayList<>(); + for (int index = 0; index < getItemCount(); index++) { + StationDetailItem item = getItem(index); + if (item == null) { + continue; + } + if (StationDetailItem.ITEM_TYPE_STATION_ITEM.equals(item.getType())) { + SurveyorPoint stationItem = new SurveyorPoint(); + stationItem.setOriginalPointId(item.getOriginalPointId()); + stationItem.setType(SurveyorPoint.TYPE_STATION); + stationItems.add(stationItem); + } else if (StationDetailItem.ITEM_TYPE_POINT_ITEM.equals(item.getType())) { + SurveyorPoint stationItem = new SurveyorPoint(); + stationItem.setOriginalPointId(item.getOriginalPointId()); + stationItem.setType(SurveyorPoint.TYPE_POINT); + stationItems.add(stationItem); + } + } + return stationItems; + } + + public int surveyorPointSize() { + int size = getItemCount(); + int count = 0; + for (int index = 0; index < size; index++) { + StationDetailItem item = getItem(index); + if (item == null || !StationDetailItem.ITEM_TYPE_POINT_ITEM.equals(item.getType())) { + continue; + } + count++; + } + return count; + } + + public interface IOnSelectPointDelegate { + void onSelectStationPoint(PickPointResult pickPointResult, ArrayList filters); + + void onSelectSurveyorPoint(PickPointResult pickPointResult, ArrayList filters); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/EditableStationDetailAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/EditableStationDetailAdapter.java new file mode 100644 index 0000000..746dff6 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/EditableStationDetailAdapter.java @@ -0,0 +1,11 @@ +package com.bingce.controlnetwork.adapter.stationdetail; + +import com.bingce.controlapphelper.model.StationDetailItem; + +import java.util.List; + +public class EditableStationDetailAdapter extends BaseStationDetailAdapter { + public EditableStationDetailAdapter(IOnSelectPointDelegate selectPointCallback, List items) { + super(selectPointCallback, items, true); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/NoEditableStationDetailAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/NoEditableStationDetailAdapter.java new file mode 100644 index 0000000..b79df48 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/NoEditableStationDetailAdapter.java @@ -0,0 +1,11 @@ +package com.bingce.controlnetwork.adapter.stationdetail; + +import com.bingce.controlapphelper.model.StationDetailItem; + +import java.util.List; + +public class NoEditableStationDetailAdapter extends BaseStationDetailAdapter { + public NoEditableStationDetailAdapter(List items) { + super(null, items, false); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineKnownUnknownKnownAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineKnownUnknownKnownAdapter.java new file mode 100644 index 0000000..bdea324 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineKnownUnknownKnownAdapter.java @@ -0,0 +1,354 @@ +package com.bingce.controlnetwork.adapter.stationdetail; + +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlnetwork.ui.vh.DraggableTextViewHolder; +import com.bingce.controlnetwork.ui.vh.StationGroupItemViewHolder; +import com.bingce.controlnetwork.ui.widget.recyclerview.AbstractDraggableRecycleViewAdapter; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * (复合、无定向)导线创建 known1-unknown-known2格式 + */ +public class StationCreateLineKnownUnknownKnownAdapter extends AbstractDraggableRecycleViewAdapter { + private final IOnSelectPointDelegate selectPointCallback; + + public StationCreateLineKnownUnknownKnownAdapter(IOnSelectPointDelegate selectPointCallback, + List items) { + super(items); + this.selectPointCallback = selectPointCallback; + } + + public void setKnownPoints1(List ids, List names) { + if (ids == null || names == null || ids.size() != names.size()) { + return; + } + //先移除之前known point + List knownItems = knownItems1(); + for (StationDetailItem item : knownItems) { + remove(item); + } + //添加新的known point + for (int index = 0; index < ids.size(); index++) { + insert( + 1 + index, + new StationDetailItem( + names.get(index), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_ITEM1, + ids.get(index))); + } + //通知变化 + if (knownItems.size() == ids.size()) { + notifyItemRangeChanged(1, ids.size()); + } else { + notifyItemRangeChanged(1, getItemCount() - 1); + } + } + + public void setUnknownPoints(List ids, List names) { + if (ids == null || names == null || ids.size() != names.size()) { + return; + } + //先移除之前unknown point + List unknowns = unknownItems(); + for (StationDetailItem item : unknowns) { + remove(item); + } + //搜索unknown-group索引 + int targetIndex = -1; + for (int index = 0; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj != null && StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP.equals(obj.getType())) { + targetIndex = index; + break; + } + } + if (targetIndex >= 0) { + //添加新的unknown point + for (int index = 0; index < ids.size(); index++) { + insert( + targetIndex + 1 + index, + new StationDetailItem( + names.get(index), + StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_ITEM, + ids.get(index))); + } + } + //通知变化 + if (unknowns.size() == ids.size()) { + notifyItemRangeChanged(targetIndex + 1, ids.size()); + } else { + notifyItemRangeChanged(targetIndex + 1, getItemCount() - 1); + } + } + + public void setKnownPoints2(List ids, List names) { + if (ids == null || names == null || ids.size() != names.size()) { + return; + } + //搜索known-group2索引 + int targetIndex = -1; + for (int index = 0; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj != null && StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP2.equals(obj.getType())) { + targetIndex = index; + break; + } + } + List items = new ArrayList<>(); + for (int index = 0; index < ids.size(); index++) { + StationDetailItem item = new StationDetailItem( + names.get(index), StationDetailItem.ITEM_TYPE_KNOWN_POINT_ITEM2, ids.get(index)); + items.add(item); + } + if (targetIndex > 0) { + replace(targetIndex + 1, items); + notifyItemRangeChanged(targetIndex + 1, items.size()); + } + } + + public List knownItems1() { + List items = new ArrayList<>(); + for (int index = 1; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj == null || !StationDetailItem.ITEM_TYPE_KNOWN_POINT_ITEM1.equals(obj.getType())) { + break; + } + items.add(obj); + } + return items; + } + + public List unknownItems() { + List items = new ArrayList<>(); + for (int index = 1; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj == null || !StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_ITEM.equals(obj.getType())) { + continue; + } + items.add(obj); + } + return items; + } + + public List knownItems2() { + List items = new ArrayList<>(); + int targetIndex = -1; + for (int index = getItemCount() - 1; index >= 0; index--) { + StationDetailItem obj = getItem(index); + if (obj != null && StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP2.equals(obj.getType())) { + targetIndex = index; + break; + } + } + if (targetIndex < 0) { + return items; + } + for (int index = targetIndex + 1; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj == null || !StationDetailItem.ITEM_TYPE_KNOWN_POINT_ITEM2.equals(obj.getType())) { + break; + } + items.add(obj); + } + return items; + } + + @Override + protected void bindItem(StationDetailItem item, RecyclerView.ViewHolder viewHolder) { + if (viewHolder instanceof DraggableTextViewHolder) { + DraggableTextViewHolder draggableTextViewHolder = (DraggableTextViewHolder) viewHolder; + DraggableTextViewHolder.update(draggableTextViewHolder, item, true); + } else if (viewHolder instanceof StationGroupItemViewHolder) { + StationGroupItemViewHolder surveyorStationSetupGroupParentViewHolder = ((StationGroupItemViewHolder) viewHolder); + StationGroupItemViewHolder.update( + surveyorStationSetupGroupParentViewHolder, + item, + true, + (itemType, surveyorStationSetupGroupParentViewHolder1) -> { + if (StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP1.equals(item.getType())) { + View.OnClickListener listener = v -> { + if (selectPointCallback != null) { + //收集信息 + PickPointResult pickPointResult = new PickPointResult(); + for (StationDetailItem obj : knownItems1()) { + pickPointResult.getSelectedIds().add(obj.getOriginalPointId()); + pickPointResult.getSelectedNames().add(obj.getName()); + } + ArrayList filters = new ArrayList<>(); + for (StationDetailItem obj : unknownItems()) { + if (obj == null) { + continue; + } + filters.add(obj.getOriginalPointId()); + } + for (StationDetailItem obj : knownItems2()) { + if (obj == null) { + continue; + } + filters.add(obj.getOriginalPointId()); + } + selectPointCallback.onSelectKnownPoint1(pickPointResult, filters); + } + }; + surveyorStationSetupGroupParentViewHolder1.pick.setOnClickListener(listener); + surveyorStationSetupGroupParentViewHolder1.switchView.setOnClickListener(listener); + + List knownItems = knownItems1(); + if (knownItems.isEmpty()) { + surveyorStationSetupGroupParentViewHolder1.pick.setVisibility(View.VISIBLE); + surveyorStationSetupGroupParentViewHolder1.switchView.setVisibility(View.INVISIBLE); + } else { + surveyorStationSetupGroupParentViewHolder1.pick.setVisibility(View.INVISIBLE); + surveyorStationSetupGroupParentViewHolder1.switchView.setVisibility(View.VISIBLE); + } + } else if (StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP.equals(item.getType())) { + surveyorStationSetupGroupParentViewHolder1.pick.setOnClickListener(v -> { + if (selectPointCallback != null) { + //收集信息 + PickPointResult pickPointResult = new PickPointResult(); + for (int index = 2; index < getItemCount(); index++) { + StationDetailItem o = getItem(index); + if (o == null) { + continue; + } + if (StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_ITEM.equals(o.getType())) { + pickPointResult.getSelectedIds().add(o.getOriginalPointId()); + pickPointResult.getSelectedNames().add(o.getName()); + } + } + ArrayList filters = new ArrayList<>(); + for (StationDetailItem obj : knownItems1()) { + if (obj == null) { + continue; + } + filters.add(obj.getOriginalPointId()); + } + for (StationDetailItem obj : knownItems2()) { + if (obj == null) { + continue; + } + filters.add(obj.getOriginalPointId()); + } + selectPointCallback.onSelectUnknownPoint(pickPointResult, filters); + } + }); + } else if (StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP2.equals(item.getType())) { + View.OnClickListener listener = v -> { + if (selectPointCallback != null) { + //收集信息 + PickPointResult pickPointResult = new PickPointResult(); + for (StationDetailItem obj : knownItems2()) { + pickPointResult.getSelectedIds().add(obj.getOriginalPointId()); + pickPointResult.getSelectedNames().add(obj.getName()); + } + ArrayList filters = new ArrayList<>(); + for (StationDetailItem obj : knownItems1()) { + if (obj == null) { + continue; + } + filters.add(obj.getOriginalPointId()); + } + for (StationDetailItem obj : unknownItems()) { + if (obj == null) { + continue; + } + filters.add(obj.getOriginalPointId()); + } + selectPointCallback.onSelectKnownPoint2(pickPointResult, filters); + } + }; + surveyorStationSetupGroupParentViewHolder1.pick.setOnClickListener(listener); + surveyorStationSetupGroupParentViewHolder1.switchView.setOnClickListener(listener); + + List knownItems = knownItems2(); + if (knownItems.isEmpty()) { + surveyorStationSetupGroupParentViewHolder1.pick.setVisibility(View.VISIBLE); + surveyorStationSetupGroupParentViewHolder1.switchView.setVisibility(View.INVISIBLE); + } else { + surveyorStationSetupGroupParentViewHolder1.pick.setVisibility(View.INVISIBLE); + surveyorStationSetupGroupParentViewHolder1.switchView.setVisibility(View.VISIBLE); + } + } + }); + } + } + + private static final int ITEM_TYPE_KNOWN_POINT1 = 11; + private static final int ITEM_TYPE_UNKNOWN_POINT = ITEM_TYPE_KNOWN_POINT1 + 1; + private static final int ITEM_TYPE_KNOWN_POINT2 = ITEM_TYPE_UNKNOWN_POINT + 1; + + @Override + public int getItemViewType(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return -1; + } + if (StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP1.equals(item.getType()) || + StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP.equals(item.getType()) || + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP2.equals(item.getType())) { + return ViewItemType.surveyorStationCreateStationGroupItem.ordinal(); + } + if (StationDetailItem.ITEM_TYPE_KNOWN_POINT_ITEM1.equals(item.getType())) { + return ITEM_TYPE_KNOWN_POINT1; + } + if (StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_ITEM.equals(item.getType())) { + return ITEM_TYPE_UNKNOWN_POINT; + } + if (StationDetailItem.ITEM_TYPE_KNOWN_POINT_ITEM2.equals(item.getType())) { + return ITEM_TYPE_KNOWN_POINT2; + } + return super.getItemViewType(position); + } + + @NonNull + @NotNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) { + if (ITEM_TYPE_KNOWN_POINT1 == viewType || ITEM_TYPE_UNKNOWN_POINT == viewType || ITEM_TYPE_KNOWN_POINT2 == viewType) { + return super.onCreateViewHolder(parent, ViewItemType.draggableItem.ordinal()); + } + return super.onCreateViewHolder(parent, viewType); + } + + @Override + public boolean isItemSwipeAble(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return false; + } + return !StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP1.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP2.equals(item.getType()); + } + + @Override + public boolean isItemDragAble(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return false; + } + return !StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP1.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP2.equals(item.getType()); + } + + public interface IOnSelectPointDelegate { + void onSelectKnownPoint1(PickPointResult pickPointResult, ArrayList filters); + + void onSelectUnknownPoint(PickPointResult pickPointResult, ArrayList filters); + + void onSelectKnownPoint2(PickPointResult pickPointResult, ArrayList filters); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineSingleAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineSingleAdapter.java new file mode 100644 index 0000000..3d057a8 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineSingleAdapter.java @@ -0,0 +1,238 @@ +package com.bingce.controlnetwork.adapter.stationdetail; + +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlnetwork.ui.vh.DraggableTextViewHolder; +import com.bingce.controlnetwork.ui.vh.StationGroupItemViewHolder; +import com.bingce.controlnetwork.ui.widget.recyclerview.AbstractDraggableRecycleViewAdapter; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * 支导线创建 + */ +public class StationCreateLineSingleAdapter extends AbstractDraggableRecycleViewAdapter { + private final IOnSelectPointDelegate selectPointCallback; + + public StationCreateLineSingleAdapter(IOnSelectPointDelegate selectPointCallback, + List items) { + super(items); + this.selectPointCallback = selectPointCallback; + } + + public void setKnownPoints(List ids, List names) { + if (ids == null || names == null || ids.size() != names.size()) { + return; + } + //先移除之前known point + List knownItems = knownItems(); + for (StationDetailItem item : knownItems) { + remove(item); + } + //添加新的known point + for (int index = 0; index < ids.size(); index++) { + insert( + 1 + index, + new StationDetailItem( + names.get(index), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_ITEM, + ids.get(index))); + } + //通知变化 + if (knownItems.size() == ids.size()) { + notifyItemRangeChanged(1, ids.size()); + } else { + notifyItemRangeChanged(1, getItemCount() - 1); + } + } + + public void setUnknownPoints(List ids, List names) { + List items = new ArrayList<>(); + for (int index = 0; index < ids.size(); index++) { + StationDetailItem item = new StationDetailItem( + names.get(index), StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_ITEM, ids.get(index)); + items.add(item); + } + + int index = -1; + for (int i = 0; i < getItemCount(); i++) { + StationDetailItem item = getItem(i); + if (item == null || !StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP.equals(item.getType())) { + continue; + } + index = i; + break; + } + if (index > 0) { + replace(index + 1, items); + notifyItemRangeChanged(index + 1, items.size()); + } + } + + public List knownItems() { + List items = new ArrayList<>(); + for (int index = 1; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj == null || !StationDetailItem.ITEM_TYPE_KNOWN_POINT_ITEM.equals(obj.getType())) { + break; + } + items.add(obj); + } + return items; + } + + public List unknownItems() { + List items = new ArrayList<>(); + for (int index = 1; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj == null || !StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_ITEM.equals(obj.getType())) { + continue; + } + items.add(obj); + } + return items; + } + + @Override + protected void bindItem(StationDetailItem item, RecyclerView.ViewHolder viewHolder) { + if (viewHolder instanceof DraggableTextViewHolder) { + DraggableTextViewHolder draggableTextViewHolder = (DraggableTextViewHolder) viewHolder; + DraggableTextViewHolder.update(draggableTextViewHolder, item, true); + } else if (viewHolder instanceof StationGroupItemViewHolder) { + StationGroupItemViewHolder surveyorStationSetupGroupParentViewHolder = ((StationGroupItemViewHolder) viewHolder); + StationGroupItemViewHolder.update( + surveyorStationSetupGroupParentViewHolder, + item, + true, + (itemType, surveyorStationSetupGroupParentViewHolder1) -> { + if (StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP.equals(item.getType())) { + View.OnClickListener listener = v -> { + if (selectPointCallback != null) { + //收集信息 + PickPointResult pickPointResult = new PickPointResult(); + for (StationDetailItem obj : knownItems()) { + pickPointResult.getSelectedIds().add(obj.getOriginalPointId()); + pickPointResult.getSelectedNames().add(obj.getName()); + } + ArrayList filters = new ArrayList<>(); + for (int index = 2; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj == null) { + continue; + } + if (StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_ITEM.equals(obj.getType())) { + filters.add(obj.getOriginalPointId()); + } + } + selectPointCallback.onSelectKnownPoint(pickPointResult, filters); + } + }; + surveyorStationSetupGroupParentViewHolder1.pick.setOnClickListener(listener); + surveyorStationSetupGroupParentViewHolder1.switchView.setOnClickListener(listener); + + List knownItems = knownItems(); + if (knownItems.isEmpty()) { + surveyorStationSetupGroupParentViewHolder1.pick.setVisibility(View.VISIBLE); + surveyorStationSetupGroupParentViewHolder1.switchView.setVisibility(View.INVISIBLE); + } else { + surveyorStationSetupGroupParentViewHolder1.pick.setVisibility(View.INVISIBLE); + surveyorStationSetupGroupParentViewHolder1.switchView.setVisibility(View.VISIBLE); + } + } else if (StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP.equals(item.getType())) { + surveyorStationSetupGroupParentViewHolder1.pick.setOnClickListener(v -> { + if (selectPointCallback != null) { + //收集信息 + PickPointResult pickPointResult = new PickPointResult(); + for (int index = 2; index < getItemCount(); index++) { + StationDetailItem o = getItem(index); + if (o == null) { + continue; + } + if (StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_ITEM.equals(o.getType())) { + pickPointResult.getSelectedIds().add(o.getOriginalPointId()); + pickPointResult.getSelectedNames().add(o.getName()); + } + } + ArrayList filters = new ArrayList<>(); + for (StationDetailItem obj : knownItems()) { + if (obj == null) { + continue; + } + filters.add(obj.getOriginalPointId()); + } + selectPointCallback.onSelectUnknownPoint(pickPointResult, filters); + } + }); + } + }); + } + } + + private static final int ITEM_TYPE_KNOWN_POINT = 11; + private static final int ITEM_TYPE_UNKNOWN_POINT = ITEM_TYPE_KNOWN_POINT + 1; + + @Override + public int getItemViewType(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return -1; + } + if (StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP.equals(item.getType()) || + StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP.equals(item.getType())) { + return ViewItemType.surveyorStationCreateStationGroupItem.ordinal(); + } + if (StationDetailItem.ITEM_TYPE_KNOWN_POINT_ITEM.equals(item.getType())) { + return ITEM_TYPE_KNOWN_POINT; + } + if (StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_ITEM.equals(item.getType())) { + return ITEM_TYPE_UNKNOWN_POINT; + } + return super.getItemViewType(position); + } + + @NonNull + @NotNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) { + if (ITEM_TYPE_KNOWN_POINT == viewType || ITEM_TYPE_UNKNOWN_POINT == viewType) { + return super.onCreateViewHolder(parent, ViewItemType.draggableItem.ordinal()); + } + return super.onCreateViewHolder(parent, viewType); + } + + @Override + public boolean isItemSwipeAble(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return false; + } + return !StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP.equals(item.getType()); + } + + @Override + public boolean isItemDragAble(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return false; + } + return !StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP.equals(item.getType()); + } + + public interface IOnSelectPointDelegate { + void onSelectKnownPoint(PickPointResult pickPointResult, ArrayList filters); + + void onSelectUnknownPoint(PickPointResult pickPointResult, ArrayList filters); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellAdapter.java new file mode 100644 index 0000000..a6cbffa --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellAdapter.java @@ -0,0 +1,301 @@ +package com.bingce.controlnetwork.adapter.stationdetail; + +import android.text.TextUtils; +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlnetwork.ui.vh.ItemWellViewHolder; +import com.bingce.controlnetwork.ui.vh.StationGroupItemViewHolder; +import com.bingce.controlnetwork.ui.widget.recyclerview.AbstractDraggableRecycleViewAdapter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 一井定向-创建站选点的适配器 + */ +public class StationCreateLineWellAdapter extends AbstractDraggableRecycleViewAdapter { + private final IOnSelectPointDelegate selectPointCallback; + + private final Map groupPositionMap = new HashMap<>(); + private final Map lastSelectMap = new HashMap<>(); + + public StationCreateLineWellAdapter(IOnSelectPointDelegate selectPointCallback, + List items) { + super(items); + for (int i = 0; i < items.size(); i++) { + groupPositionMap.put(items.get(i).getType(), i); + } + this.selectPointCallback = selectPointCallback; + } + + /** + * 设置地面连接方向点数据 + */ + public void setGroundLinkPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK, + StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK + StationDetailItem._DATA); + } + + private void setPointsData(PickPointResult pickPointResult, String groupType, String dataType) { + if (pickPointResult == null || pickPointResult.getSelectedIds() == null + || pickPointResult.getSelectedNames() == null + || pickPointResult.getSelectedIds().size() != pickPointResult.getSelectedNames().size()) { + return; + } + //记录选择的 + lastSelectMap.put(groupType, pickPointResult); + + List pointsOld = getPointsFromType(dataType); + removeAll(pointsOld); + + List newList = new ArrayList<>(); + for (int index = 0; index < pickPointResult.getSelectedIds().size(); index++) { + newList.add(new StationDetailItem( + pickPointResult.getSelectedNames().get(index), + dataType, + pickPointResult.getSelectedIds().get(index))); + } + + int insertPosition = groupPositionMap.get(groupType); + insertForWell(insertPosition + 1, newList); + + updateGroupPositionMap(); + + notifyItemRangeChanged(0, getItemCount()); + + } + + /** + * 更新group的基准位置 + */ + private void updateGroupPositionMap() { + for (int i = 0; i < getItemCount(); i++) { + String type = getItem(i).getType(); + if (type.equals(StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK) + || type.equals(StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE) + || type.equals(StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE) + || type.equals(StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE) + || type.equals(StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK)) { + groupPositionMap.put(type, i); + } + } + } + + /** + * 设置地面近井点数据 + */ + public void setGroundSidePoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE, + StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE + StationDetailItem._DATA); + } + + /** + * 设置钢丝点数据 + */ + public void setSteelWirePoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE, + StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE + StationDetailItem._DATA); + } + + /** + * 设置地下近井点数据 + */ + public void setUndergroudSidePoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE, + StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE + StationDetailItem._DATA); + } + + /** + * 设置地下连接方向点数据 + */ + public void setUndergroudLinkPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK, + StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK + StationDetailItem._DATA); + } + + + public List getPointsFromType(String dataType) { + List items = new ArrayList<>(); + for (int index = 1; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj == null || !dataType.equals(obj.getType())) { + continue; + } + + if (dataType.contains(StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE)) { + obj.setWellSteel(true); + } + + items.add(obj); + } + return items; + } + + @Override + protected void bindItem(StationDetailItem item, RecyclerView.ViewHolder viewHolder) { + if (viewHolder instanceof ItemWellViewHolder) { + ItemWellViewHolder itemWellViewHolder = (ItemWellViewHolder) viewHolder; + ItemWellViewHolder.update(itemWellViewHolder, item, true, (itemType, itemWellViewHolderBack) -> { +// itemWellViewHolder.switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { +// @Override +// public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { +// item.setWellSteel(isChecked); +// if (selectPointCallback != null) { +// selectPointCallback.onSelectOnlyMeasureHorAngle(isChecked); +// } +// } +// }); + }); + } else if (viewHolder instanceof StationGroupItemViewHolder) { + StationGroupItemViewHolder stationGroupItemViewHolder = ((StationGroupItemViewHolder) viewHolder); + + StationGroupItemViewHolder.update( + stationGroupItemViewHolder, + item, + true, + (itemType, stationGroupItemViewHolderBack) -> { + stationGroupItemViewHolder.pick.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + backToData(itemType, stationGroupItemViewHolderBack); + } + }); + }); + } + } + + @Override + public int getItemViewType(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return -1; + } + if (StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK.equals(item.getType()) || + StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE.equals(item.getType()) || + StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE.equals(item.getType()) || + StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE.equals(item.getType()) || + StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK.equals(item.getType())) { + return ViewItemType.surveyorStationCreateStationGroupItem.ordinal(); + } else { + return ViewItemType.wellItem.ordinal(); + } + } + + @Override + public boolean isItemSwipeAble(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return false; + } + return !StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE.equals(item.getType()) + && !StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE.equals(item.getType()) + && !StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK.equals(item.getType()); + } + + @Override + public boolean isItemDragAble(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return false; + } + return !StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE.equals(item.getType()) && + !StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE.equals(item.getType()) + && !StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE.equals(item.getType()) + && !StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK.equals(item.getType()); + } + + + public void removeItemForLastSelect(int adapterPosition) { + StationDetailItem item = getItem(adapterPosition); + assert item != null; + String groupType = item.getType().replaceAll(StationDetailItem._DATA, ""); + PickPointResult pickPointResult = lastSelectMap.get(groupType); + if (pickPointResult != null && !pickPointResult.getSelectedIds().isEmpty()) { + int index = pickPointResult.getSelectedIds().indexOf(item.getOriginalPointId()); + pickPointResult.getSelectedIds().remove(index); + pickPointResult.getSelectedNames().remove(index); + } else { + lastSelectMap.remove(groupType); + } + updateGroupPositionMap(); +// 原先只有这一句 lastSelectMap.put(item.getType().replaceAll(StationDetailItem._DATA, ""), null); + } + + public interface IOnSelectPointDelegate { + void onSelectGroundLink(PickPointResult pickPointResult, List filters); + + void onSelectGroundSide(PickPointResult pickPointResult, List filters); + + void onSelectSteelWire(PickPointResult pickPointResult, List filters); + + void onSelectUndergroundSide(PickPointResult pickPointResult, List filters); + + void onSelectUndergroundLink(PickPointResult pickPointResult, List filters); + +// void onSelectOnlyMeasureHorAngle(boolean measureHorAngle); + } + + /** + * 返回数据给上一级 + * + * @param itemType + * @param holder + */ + private void backToData(String itemType, StationGroupItemViewHolder holder) { + if (selectPointCallback == null) { + return; + } + + PickPointResult pickPointResult = lastSelectMap.get(itemType); + + List filterIds = getFilterIds(pickPointResult); + + switch (itemType) { + case StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK: + selectPointCallback.onSelectGroundLink(pickPointResult, filterIds); + break; + case StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE: + selectPointCallback.onSelectGroundSide(pickPointResult, filterIds); + break; + case StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE: + selectPointCallback.onSelectSteelWire(pickPointResult, filterIds); + break; + case StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE: + selectPointCallback.onSelectUndergroundSide(pickPointResult, filterIds); + break; + case StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK: + selectPointCallback.onSelectUndergroundLink(pickPointResult, filterIds); + break; + } + } + + private List getFilterIds(PickPointResult pickPointResult) { + List filterIds = new ArrayList<>(); + for (int i = 0; i < getItemCount(); i++) { + StationDetailItem item = getItem(i); + String pointId = item.getOriginalPointId(); + + if (!TextUtils.isEmpty(pointId)) { + if (pickPointResult == null) { + filterIds.add(pointId); + } else { + if (!pickPointResult.getSelectedIds().contains(pointId)) { + filterIds.add(pointId); + } + } + } + } + return filterIds; + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellDoubleGroundAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellDoubleGroundAdapter.java new file mode 100644 index 0000000..9cfea74 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellDoubleGroundAdapter.java @@ -0,0 +1,296 @@ +package com.bingce.controlnetwork.adapter.stationdetail; + +import android.text.TextUtils; +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlnetwork.ui.vh.ItemWellViewHolder; +import com.bingce.controlnetwork.ui.vh.StationGroupItemViewHolder; +import com.bingce.controlnetwork.ui.widget.recyclerview.AbstractDraggableRecycleViewAdapter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 二井定向-地上-创建站选点的适配器 + */ +public class StationCreateLineWellDoubleGroundAdapter extends AbstractDraggableRecycleViewAdapter { + private final IOnSelectPointDelegate selectPointCallback; + + private final Map groupPositionMap = new HashMap<>(); + private final Map lastSelectMap = new HashMap<>(); + + public StationCreateLineWellDoubleGroundAdapter(IOnSelectPointDelegate selectPointCallback, + List items) { + super(items); + for (int i = 0; i < items.size(); i++) { + groupPositionMap.put(items.get(i).getType(), i); + } + this.selectPointCallback = selectPointCallback; + } + + private void setPointsData(PickPointResult pickPointResult, String groupType, String dataType) { + if (pickPointResult == null || pickPointResult.getSelectedIds() == null + || pickPointResult.getSelectedNames() == null + || pickPointResult.getSelectedIds().size() != pickPointResult.getSelectedNames().size()) { + return; + } + //记录选择的 + lastSelectMap.put(groupType, pickPointResult); + + List pointsOld = getPointsFromType(dataType); + removeAll(pointsOld); + + List newList = new ArrayList<>(); + for (int index = 0; index < pickPointResult.getSelectedIds().size(); index++) { + newList.add(new StationDetailItem( + pickPointResult.getSelectedNames().get(index), + dataType, + pickPointResult.getSelectedIds().get(index))); + } + + int insertPosition = groupPositionMap.get(groupType); + insertForWell(insertPosition + 1, newList); + + updateGroupPositionMap(); + + notifyItemRangeChanged(0, getItemCount()); + + } + + /** + * 更新group的基准位置 + */ + private void updateGroupPositionMap() { + for (int i = 0; i < getItemCount(); i++) { + String type = getItem(i).getType(); + if (type.equals(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT) + || type.equals(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE) + || type.equals(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT) + || type.equals(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A) + || type.equals(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B)) { + groupPositionMap.put(type, i); + } + } + } + + /** + * 设置地面连接点 左 + */ + public void setGroundLinkLeftPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT, + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT + StationDetailItem._DATA); + } + + /** + * 设置地面连接点 右 + */ + public void setGroundLinkRightPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT, + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT + StationDetailItem._DATA); + } + + /** + * 设置地面连接点 中 + */ + public void setGroundLinkMiddlePoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE, + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE + StationDetailItem._DATA); + } + + /** + * 设置地面近井点 A + */ + public void setGroundSideAPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A, + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A + StationDetailItem._DATA); + } + + + /** + * 设置地面近井点 B + */ + public void setGroundSideBPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B, + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B + StationDetailItem._DATA); + } + + + public List getPointsFromType(String dataType) { + List items = new ArrayList<>(); + for (int index = 1; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj == null || !dataType.equals(obj.getType())) { + continue; + } + items.add(obj); + } + return items; + } + + @Override + protected void bindItem(StationDetailItem item, RecyclerView.ViewHolder viewHolder) { + if (viewHolder instanceof ItemWellViewHolder) { + ItemWellViewHolder itemWellViewHolder = (ItemWellViewHolder) viewHolder; + ItemWellViewHolder.update(itemWellViewHolder, item, true, (itemType, itemWellViewHolderBack) -> { +// itemWellViewHolder.switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { +// @Override +// public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { +// item.setWellSteel(isChecked); +// if (selectPointCallback!=null) { +// selectPointCallback.onSelectOnlyMeasureHorAngle(isChecked); +// } +// } +// }); + }); + } else if (viewHolder instanceof StationGroupItemViewHolder) { + StationGroupItemViewHolder stationGroupItemViewHolder = ((StationGroupItemViewHolder) viewHolder); + + StationGroupItemViewHolder.update( + stationGroupItemViewHolder, + item, + true, + (itemType, stationGroupItemViewHolderBack) -> { + stationGroupItemViewHolder.pick.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + backToData(itemType, stationGroupItemViewHolderBack); + } + }); + }); + } + } + + @Override + public int getItemViewType(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return -1; + } + if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT.equals(item.getType()) || + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE.equals(item.getType()) || + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT.equals(item.getType()) || + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A.equals(item.getType()) || + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B.equals(item.getType())) { + return ViewItemType.surveyorStationCreateStationGroupItem.ordinal(); + } else { + return ViewItemType.wellItem.ordinal(); + } + } + + @Override + public boolean isItemSwipeAble(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return false; + } + return !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT.equals(item.getType()) && + !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE.equals(item.getType()) && + !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT.equals(item.getType()) + && !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A.equals(item.getType()) + && !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B.equals(item.getType()); + } + + @Override + public boolean isItemDragAble(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return false; + } + return !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT.equals(item.getType()) && + !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE.equals(item.getType()) && + !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT.equals(item.getType()) + && !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A.equals(item.getType()) + && !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B.equals(item.getType()); + } + + public void removeItemForLastSelect(int adapterPosition) { + StationDetailItem item = getItem(adapterPosition); + assert item != null; + String groupType = item.getType().replaceAll(StationDetailItem._DATA, ""); + PickPointResult pickPointResult = lastSelectMap.get(groupType); + if (pickPointResult != null && !pickPointResult.getSelectedIds().isEmpty()) { + int index = pickPointResult.getSelectedIds().indexOf(item.getOriginalPointId()); + pickPointResult.getSelectedIds().remove(index); + pickPointResult.getSelectedNames().remove(index); + } else { + lastSelectMap.remove(groupType); + } + updateGroupPositionMap(); + } + + public interface IOnSelectPointDelegate { + void onSelectGroundLinkLeft(PickPointResult pickPointResult, List filters); + + void onSelectGroundLinkRight(PickPointResult pickPointResult, List filters); + + void onSelectGroundLinkMiddle(PickPointResult pickPointResult, List filters); + + void onSelectGroundSideA(PickPointResult pickPointResult, List filters); + + void onSelectGroundSideB(PickPointResult pickPointResult, List filters); + + void onSelectOnlyMeasureHorAngle(boolean measureHorAngle); + + } + + /** + * 返回数据给上一级 + * + * @param itemType + * @param holder + */ + private void backToData(String itemType, StationGroupItemViewHolder holder) { + if (selectPointCallback == null) { + return; + } + + PickPointResult pickPointResult = lastSelectMap.get(itemType); + + List filterIds = getFilterIds(pickPointResult); + + switch (itemType) { + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT: + selectPointCallback.onSelectGroundLinkLeft(pickPointResult, filterIds); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE: + selectPointCallback.onSelectGroundLinkMiddle(pickPointResult, filterIds); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT: + selectPointCallback.onSelectGroundLinkRight(pickPointResult, filterIds); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A: + selectPointCallback.onSelectGroundSideA(pickPointResult, filterIds); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B: + selectPointCallback.onSelectGroundSideB(pickPointResult, filterIds); + break; + } + } + + private List getFilterIds(PickPointResult pickPointResult) { + List filterIds = new ArrayList<>(); + for (int i = 0; i < getItemCount(); i++) { + StationDetailItem item = getItem(i); + String pointId = item.getOriginalPointId(); + + if (!TextUtils.isEmpty(pointId)) { + if (pickPointResult == null) { + filterIds.add(pointId); + } else { + if (!pickPointResult.getSelectedIds().contains(pointId)) { + filterIds.add(pointId); + } + } + } + } + return filterIds; + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellDoubleUnderGroundAdapter.java b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellDoubleUnderGroundAdapter.java new file mode 100644 index 0000000..68a8174 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/adapter/stationdetail/StationCreateLineWellDoubleUnderGroundAdapter.java @@ -0,0 +1,331 @@ +package com.bingce.controlnetwork.adapter.stationdetail; + +import android.os.Handler; +import android.text.TextUtils; +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlnetwork.ui.vh.ItemWellViewHolder; +import com.bingce.controlnetwork.ui.vh.StationGroupItemViewHolder; +import com.bingce.controlnetwork.ui.widget.recyclerview.AbstractDraggableRecycleViewAdapter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 二井定向-地下-创建站选点的适配器 + */ +public class StationCreateLineWellDoubleUnderGroundAdapter extends AbstractDraggableRecycleViewAdapter { + private final IOnSelectPointDelegate selectPointCallback; + + private final Map groupPositionMap = new HashMap<>(); + private final Map lastSelectMap = new HashMap<>(); + + public StationCreateLineWellDoubleUnderGroundAdapter(IOnSelectPointDelegate selectPointCallback, + List items) { + super(items); + for (int i = 0; i < items.size(); i++) { + groupPositionMap.put(items.get(i).getType(), i); + } + this.selectPointCallback = selectPointCallback; + } + + private void setPointsData(PickPointResult pickPointResult, String groupType, String dataType) { + if (pickPointResult == null || pickPointResult.getSelectedIds() == null + || pickPointResult.getSelectedNames() == null + || pickPointResult.getSelectedIds().size() != pickPointResult.getSelectedNames().size()) { + return; + } + //记录选择的 + lastSelectMap.put(groupType, pickPointResult); + + List pointsOld = getPointsFromType(dataType); + removeAll(pointsOld); + + List newList = new ArrayList<>(); + for (int index = 0; index < pickPointResult.getSelectedIds().size(); index++) { + newList.add(new StationDetailItem( + pickPointResult.getSelectedNames().get(index), + dataType, + pickPointResult.getSelectedIds().get(index))); + } + + int insertPosition = groupPositionMap.get(groupType); + insertForWell(insertPosition + 1, newList); + updateGroupPositionMap(); + notifyItemRangeChanged(0, getItemCount()); + } + + /** + * 更新group的基准位置 + */ + private void updateGroupPositionMap() { + for (int i = 0; i < getItemCount(); i++) { + String type = getItem(i).getType(); + if (type.equals(StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A) + || type.equals(StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B) + || type.equals(StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK) + || type.equals(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT) + || type.equals(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT) + || type.equals(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A) + || type.equals(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B)) { + groupPositionMap.put(type, i); + } + } + } + + /** + * 设置地面连接点 左 + */ + public void setGroundLinkLeftPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT, + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT + StationDetailItem._DATA); + } + + /** + * 设置地面连接点 右 + */ + public void setGroundLinkRightPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT, + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT + StationDetailItem._DATA); + } + + /** + * 设置地面近井点 A + */ + public void setGroundSideAPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A, + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A + StationDetailItem._DATA); + } + + + /** + * 设置地面近井点 B + */ + public void setGroundSideBPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B, + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B + StationDetailItem._DATA); + } + + /** + * 设置钢丝A + */ + public void setSteelAPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A, + StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A + StationDetailItem._DATA); + } + + /** + * 设置钢丝B + */ + public void setSteelBPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B, + StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B + StationDetailItem._DATA); + } + + /** + * 设置地下连接方向 + */ + public void setUnderGroundLinkPoints(PickPointResult pickPointResult) { + setPointsData(pickPointResult, StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK, + StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK + StationDetailItem._DATA); + } + + + public List getPointsFromType(String dataType) { + List items = new ArrayList<>(); + for (int index = 1; index < getItemCount(); index++) { + StationDetailItem obj = getItem(index); + if (obj == null || !dataType.equals(obj.getType())) { + continue; + } + + if (dataType.contains(StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE)) { + //注意是contains + obj.setWellSteel(true); + } + + items.add(obj); + } + return items; + } + + @Override + protected void bindItem(StationDetailItem item, RecyclerView.ViewHolder viewHolder) { + if (viewHolder instanceof ItemWellViewHolder) { + ItemWellViewHolder itemWellViewHolder = (ItemWellViewHolder) viewHolder; + ItemWellViewHolder.update(itemWellViewHolder, item, true, (itemType, itemWellViewHolderBack) -> { +// itemWellViewHolder.switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { +// @Override +// public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { +// item.setWellSteel(isChecked); +// if (selectPointCallback != null) { +// selectPointCallback.onSelectOnlyMeasureHorAngle(isChecked); +// } +// } +// }); + }); + } else if (viewHolder instanceof StationGroupItemViewHolder) { + StationGroupItemViewHolder stationGroupItemViewHolder = ((StationGroupItemViewHolder) viewHolder); + + StationGroupItemViewHolder.update( + stationGroupItemViewHolder, + item, + true, + (itemType, stationGroupItemViewHolderBack) -> { + stationGroupItemViewHolder.pick.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + backToData(itemType, stationGroupItemViewHolderBack); + } + }); + }); + } + } + + @Override + public int getItemViewType(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return -1; + } + if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT.equals(item.getType()) || + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT.equals(item.getType()) || + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A.equals(item.getType()) || + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B.equals(item.getType()) || + StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A.equals(item.getType()) || + StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B.equals(item.getType()) || + StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK.equals(item.getType()) + ) { + return ViewItemType.surveyorStationCreateStationGroupItem.ordinal(); + } else { + return ViewItemType.wellItem.ordinal(); + } + } + + @Override + public boolean isItemSwipeAble(int position) { + return isItemSwipeAbleOrItemDragAble(position); + } + + @Override + public boolean isItemDragAble(int position) { + return isItemSwipeAbleOrItemDragAble(position); + } + + private boolean isItemSwipeAbleOrItemDragAble(int position) { + StationDetailItem item = getItem(position); + if (item == null) { + return false; + } + return !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT.equals(item.getType()) + && !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT.equals(item.getType()) + && !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A.equals(item.getType()) + && !StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B.equals(item.getType()) + && !StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A.equals(item.getType()) + && !StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B.equals(item.getType()) + && !StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK.equals(item.getType()); + } + + public void removeItemForLastSelect(int adapterPosition) { + StationDetailItem item = getItem(adapterPosition); + assert item != null; + String groupType = item.getType().replaceAll(StationDetailItem._DATA, ""); + PickPointResult pickPointResult = lastSelectMap.get(groupType); + if (pickPointResult != null && !pickPointResult.getSelectedIds().isEmpty()) { + int index = pickPointResult.getSelectedIds().indexOf(item.getOriginalPointId()); + pickPointResult.getSelectedIds().remove(index); + pickPointResult.getSelectedNames().remove(index); + } else { + lastSelectMap.remove(groupType); + } + //延迟更新groupType的位置 + new Handler().postDelayed(() -> updateGroupPositionMap(), 300); + } + + public interface IOnSelectPointDelegate { + void onSelectGroundLinkLeft(PickPointResult pickPointResult, List filters); + + void onSelectGroundLinkRight(PickPointResult pickPointResult, List filters); + + void onSelectGroundSideA(PickPointResult pickPointResult, List filters); + + void onSelectGroundSideB(PickPointResult pickPointResult, List filters); + + void onSelectSteelA(PickPointResult pickPointResult, List filters); + + void onSelectSteelB(PickPointResult pickPointResult, List filters); + + void onSelectUnderGroundLink(PickPointResult pickPointResult, List filters); + + void onSelectOnlyMeasureHorAngle(boolean measureHorAngle); + + } + + /** + * 返回数据给上一级 + * + * @param itemType + * @param holder + */ + private void backToData(String itemType, StationGroupItemViewHolder holder) { + if (selectPointCallback == null) { + return; + } + + PickPointResult pickPointResult = lastSelectMap.get(itemType); + + List filterIds = getFilterIds(pickPointResult); + + switch (itemType) { + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT: + selectPointCallback.onSelectGroundLinkLeft(pickPointResult, filterIds); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT: + selectPointCallback.onSelectGroundLinkRight(pickPointResult, filterIds); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A: + selectPointCallback.onSelectGroundSideA(pickPointResult, filterIds); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B: + selectPointCallback.onSelectGroundSideB(pickPointResult, filterIds); + break; + + case StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A: + selectPointCallback.onSelectSteelA(pickPointResult, filterIds); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B: + selectPointCallback.onSelectSteelB(pickPointResult, filterIds); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK: + selectPointCallback.onSelectUnderGroundLink(pickPointResult, filterIds); + break; + } + } + + private List getFilterIds(PickPointResult pickPointResult) { + List filterIds = new ArrayList<>(); + for (int i = 0; i < getItemCount(); i++) { + StationDetailItem item = getItem(i); + String pointId = item.getOriginalPointId(); + + if (!TextUtils.isEmpty(pointId)) { + if (pickPointResult == null) { + filterIds.add(pointId); + } else { + if (!pickPointResult.getSelectedIds().contains(pointId)) { + filterIds.add(pointId); + } + } + } + } + return filterIds; + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/controller/Expression.java b/app/src/main/java/com/bingce/controlnetwork/controller/Expression.java new file mode 100644 index 0000000..d67d350 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/controller/Expression.java @@ -0,0 +1,1008 @@ +/* + * Copyright 2012 Udo Klimaschewski + * + * http://UdoJava.com/ + * http://about.me/udo.klimaschewski + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +package com.bingce.controlnetwork.controller; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Stack; + +/** + *

EvalEx - Java Expression Evaluator

+ *

+ *

Introduction

+ * EvalEx is a handy expression evaluator for Java, that allows to evaluate simple mathematical and boolean expressions. + *
+ * Key Features: + *
    + *
  • Uses BigDecimal for calculation and result
  • + *
  • Single class implementation, very compact
  • + *
  • No dependencies to external libraries
  • + *
  • Precision and rounding mode can be set
  • + *
  • Supports variables
  • + *
  • Standard boolean and mathematical operators
  • + *
  • Standard basic mathematical and boolean functions
  • + *
  • Custom functions and operators can be added at runtime
  • + *
+ *
+ *

Examples

+ *
+ *  BigDecimal result = null;
+ *
+ *  Expression expression = new Expression("1+1/3");
+ *  result = expression.eval():
+ *  expression.setPrecision(2);
+ *  result = expression.eval():
+ *
+ *  result = new Expression("(3.4 + -4.1)/2").eval();
+ *
+ *  result = new Expression("SQRT(a^2 + b^2").with("a","2.4").and("b","9.253").eval();
+ *
+ *  BigDecimal a = new BigDecimal("2.4");
+ *  BigDecimal b = new BigDecimal("9.235");
+ *  result = new Expression("SQRT(a^2 + b^2").with("a",a).and("b",b).eval();
+ *
+ *  result = new Expression("2.4/PI").setPrecision(128).setRoundingMode(RoundingMode.UP).eval();
+ *
+ *  result = new Expression("random() > 0.5").eval();
+ *
+ *  result = new Expression("not(x<7 || sqrt(max(x,9)) <= 3))").with("x","22.9").eval();
+ * 
+ *
+ *

Supported Operators

+ * + * + * + * + * + * + * + * + * + *
Mathematical Operators
OperatorDescription
+Additive operator
-Subtraction operator
*Multiplication operator
/Division operator
%Remainder operator (Modulo)
^Power operator
+ *
+ * + * + * + * + * + * + * + * + * + * + * + * + * + *
Boolean Operators*
OperatorDescription
=Equals
==Equals
!=Not equals
<>Not equals
<Less than
<=Less than or equal to
>Greater than
>=Greater than or equal to
&&Boolean and
||Boolean or
+ * *Boolean operators result always in a BigDecimal value of 1 or 0 (zero). Any non-zero value is treated as a _true_ value. Boolean _not_ is implemented by a function. + *
+ *

Supported Functions

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Function*Description
NOT(expression)Boolean negation, 1 (means true) if the expression is not zero
RANDOM()Produces a random number between 0 and 1
MIN(e1,e2)Returns the smaller of both expressions
MAX(e1,e2)Returns the bigger of both expressions
ABS(expression)Returns the absolute (non-negative) value of the expression
ROUND(expression,precision)Rounds a value to a certain number of digits, uses the current rounding mode
LOG(expression)Returns the natural logarithm (base e) of an expression
SQRT(expression)Returns the square root of an expression
SIN(expression)Returns the trigonometric sine of an angle (in degrees)
COS(expression)Returns the trigonometric cosine of an angle (in degrees)
TAN(expression)Returns the trigonometric tangens of an angle (in degrees)
SINH(expression)Returns the hyperbolic sine of a value
COSH(expression)Returns the hyperbolic cosine of a value
TANH(expression)Returns the hyperbolic tangens of a value
RAD(expression)Converts an angle measured in degrees to an approximately equivalent angle measured in radians
DEG(expression)Converts an angle measured in radians to an approximately equivalent angle measured in degrees
+ * *Functions names are case insensitive. + *
+ *

Supported Constants

+ * + * + * + *
ConstantDescription
PIThe value of PI, exact to 100 digits
+ *

+ *

Add Custom Operators

+ *

+ * Custom operators can be added easily, simply create an instance of `Expression.Operator` and add it to the expression. + * Parameters are the operator string, its precedence and if it is left associative. The operators `eval()` method will be called with the BigDecimal values of the operands. + * All existing operators can also be overridden. + *
+ * For example, add an operator `x >> n`, that moves the decimal point of _x_ _n_ digits to the right: + *

+ *

+ * Expression e = new Expression("2.1234 >> 2");
+ *
+ * e.addOperator(e.new Operator(">>", 30, true) {
+ *     {@literal @}Override
+ *     public BigDecimal eval(BigDecimal v1, BigDecimal v2) {
+ *         return v1.movePointRight(v2.toBigInteger().intValue());
+ *     }
+ * });
+ *
+ * e.eval(); // returns 212.34
+ * 
+ *
+ *

Add Custom Functions

+ *

+ * Adding custom functions is as easy as adding custom operators. Create an instance of `Expression.Function`and add it to the expression. + * Parameters are the function name and the count of required parameters. The functions `eval()` method will be called with a list of the BigDecimal parameters. + * All existing functions can also be overridden. + *
+ * For example, add a function `average(a,b,c)`, that will calculate the average value of a, b and c: + *
+ *

+ * Expression e = new Expression("2 * average(12,4,8)");
+ *
+ * e.addFunction(e.new Function("average", 3) {
+ *     {@literal @}Override
+ *     public BigDecimal eval(List parameters) {
+ *         BigDecimal sum = parameters.get(0).add(parameters.get(1)).add(parameters.get(2));
+ *         return sum.divide(new BigDecimal(3));
+ *     }
+ * });
+ *
+ * e.eval(); // returns 16
+ * 
+ * The software is licensed under the MIT Open Source license (see LICENSE file). + *
+ *
    + *
  • The *power of* operator (^) implementation was copied from [Stack Overflow](http://stackoverflow.com/questions/3579779/how-to-do-a-fractional-power-on-bigdecimal-in-java) Thanks to Gene Marin
  • + *
  • The SQRT() function implementation was taken from the book [The Java Programmers Guide To numerical Computing](http://www.amazon.de/Java-Number-Cruncher-Programmers-Numerical/dp/0130460419) (Ronald Mak, 2002)
  • + *
+ * + * @author Udo Klimaschewski (http://about.me/udo.klimaschewski) + */ +public class Expression { + + /** + * Definition of PI as a constant, can be used in expressions as variable. + */ + public static final BigDecimal PI = new BigDecimal( + "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"); + + /** + * The {@link MathContext} to use for calculations. + */ + private MathContext mc = MathContext.DECIMAL32; + + /** + * The original infix expression. + */ + private String expression = null; + + /** + * The cached RPN (Reverse Polish Notation) of the expression. + */ + private List rpn = null; + + /** + * All defined operators with name and implementation. + */ + private final Map operators = new HashMap(); + + /** + * All defined functions with name and implementation. + */ + private final Map functions = new HashMap(); + + /** + * All defined variables with name and value. + */ + private final Map variables = new HashMap(); + + /** + * What character to use for decimal separators. + */ + private final char decimalSeparator = '.'; + + /** + * What character to use for minus sign (negative values). + */ + private final char minusSign = '-'; + + /** + * The expression evaluators exception class. + */ + public class ExpressionException extends RuntimeException { + private static final long serialVersionUID = 1118142866870779047L; + + public ExpressionException(String message) { + super(message); + } + } + + /** + * Abstract definition of a supported expression function. A function is + * defined by a name, the number of parameters and the actual processing + * implementation. + */ + public abstract class Function { + /** + * Name of this function. + */ + private final String name; + /** + * Number of parameters expected for this function. + */ + private final int numParams; + + /** + * Creates a new function with given name and parameter count. + * + * @param name The name of the function. + * @param numParams The number of parameters for this function. + */ + public Function(String name, int numParams) { + this.name = name.toUpperCase(); + this.numParams = numParams; + } + + public String getName() { + return name; + } + + public int getNumParams() { + return numParams; + } + + /** + * Implementation for this function. + * + * @param parameters Parameters will be passed by the expression evaluator as a + * {@link List} of {@link BigDecimal} values. + * @return The function must return a new {@link BigDecimal} value as a + * computing result. + */ + public abstract BigDecimal eval(List parameters); + } + + /** + * Abstract definition of a supported operator. An operator is defined by + * its name (pattern), precedence and if it is left- or right associative. + */ + public abstract class Operator { + /** + * This operators name (pattern). + */ + private final String oper; + /** + * Operators precedence. + */ + private final int precedence; + /** + * Operator is left associative. + */ + private final boolean leftAssoc; + + /** + * Creates a new operator. + * + * @param oper The operator name (pattern). + * @param precedence The operators precedence. + * @param leftAssoc true if the operator is left associative, + * else false. + */ + public Operator(String oper, int precedence, boolean leftAssoc) { + this.oper = oper; + this.precedence = precedence; + this.leftAssoc = leftAssoc; + } + + public String getOper() { + return oper; + } + + public int getPrecedence() { + return precedence; + } + + public boolean isLeftAssoc() { + return leftAssoc; + } + + /** + * Implementation for this operator. + * + * @param v1 Operand 1. + * @param v2 Operand 2. + * @return The result of the operation. + */ + public abstract BigDecimal eval(BigDecimal v1, BigDecimal v2); + } + + /** + * Expression tokenizer that allows to iterate over a {@link String} + * expression token by token. Blank characters will be skipped. + */ + private class Tokenizer implements Iterator { + + /** + * Actual position in expression string. + */ + private int pos = 0; + /** + * The original input expression. + */ + private final String input; + /** + * The previous token or null if none. + */ + private String previousToken; + + /** + * Creates a new tokenizer for an expression. + * + * @param input The expression string. + */ + public Tokenizer(String input) { + this.input = input; + } + + @Override + public boolean hasNext() { + return (pos < input.length()); + } + + /** + * Peek at the next character, without advancing the iterator. + * + * @return The next character or character 0, if at end of string. + */ + private char peekNextChar() { + if (pos < (input.length() - 1)) { + return input.charAt(pos + 1); + } else { + return 0; + } + } + + @Override + public String next() { + StringBuilder token = new StringBuilder(); + if (pos >= input.length()) { + return previousToken = null; + } + char ch = input.charAt(pos); + while (Character.isWhitespace(ch) && pos < input.length()) { + ch = input.charAt(++pos); + } + if (Character.isDigit(ch)) { + while ((Character.isDigit(ch) || ch == decimalSeparator) + && (pos < input.length())) { + token.append(input.charAt(pos++)); + ch = pos == input.length() ? 0 : input.charAt(pos); + } + } else if (ch == minusSign + && Character.isDigit(peekNextChar()) + && ("(".equals(previousToken) || ",".equals(previousToken) + || previousToken == null || operators + .containsKey(previousToken))) { + token.append(minusSign); + pos++; + token.append(next()); + } else if (Character.isLetter(ch)) { + while ((Character.isLetter(ch) || Character.isDigit(ch) || (ch == '_')) && (pos < input.length())) { + token.append(input.charAt(pos++)); + ch = pos == input.length() ? 0 : input.charAt(pos); + } + } else if (ch == '(' || ch == ')' || ch == ',') { + token.append(ch); + pos++; + } else { + while (!Character.isLetter(ch) && !Character.isDigit(ch) + && !Character.isWhitespace(ch) && ch != '(' + && ch != ')' && ch != ',' && (pos < input.length())) { + token.append(input.charAt(pos)); + pos++; + ch = pos == input.length() ? 0 : input.charAt(pos); + if (ch == minusSign) { + break; + } + } + if (!operators.containsKey(token.toString())) { + throw new ExpressionException("Unknown operator '" + token + + "' at position " + (pos - token.length() + 1)); + } + } + return previousToken = token.toString(); + } + + @Override + public void remove() { + throw new ExpressionException("remove() not supported"); + } + + } + + /** + * Creates a new expression instance from an expression string. + * + * @param expression The expression. E.g. "2.4*sin(3)/(2-4)" or + * "sin(y)>0 & max(z, 3)>3" + */ + public Expression(String expression) { + this.expression = expression; + addOperator(new Operator("+", 20, true) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.add(v2, mc); + } + }); + addOperator(new Operator("-", 20, true) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.subtract(v2, mc); + } + }); + addOperator(new Operator("*", 30, true) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.multiply(v2, mc); + } + }); + /*addOperator(new Operator("/", 30, true) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.divide(v2, mc); + } + });*/ + addOperator(new Operator("%", 30, true) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.remainder(v2, mc); + } + }); + addOperator(new Operator("^", 40, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + /*- + * Thanks to Gene Marin: + * http://stackoverflow.com/questions/3579779/how-to-do-a-fractional-power-on-bigdecimal-in-java + */ + int signOf2 = v2.signum(); + double dn1 = v1.doubleValue(); + v2 = v2.multiply(new BigDecimal(signOf2)); // n2 is now positive + BigDecimal remainderOf2 = v2.remainder(BigDecimal.ONE); + BigDecimal n2IntPart = v2.subtract(remainderOf2); + BigDecimal intPow = v1.pow(n2IntPart.intValueExact(), mc); + BigDecimal doublePow = BigDecimal.valueOf(Math.pow(dn1, + remainderOf2.doubleValue())); + + BigDecimal result = intPow.multiply(doublePow, mc); + if (signOf2 == -1) { + result = BigDecimal.ONE.divide(result, mc.getPrecision(), + RoundingMode.HALF_UP); + } + return result; + } + }); + addOperator(new Operator("&&", 4, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + boolean b1 = !v1.equals(BigDecimal.ZERO); + boolean b2 = !v2.equals(BigDecimal.ZERO); + return b1 && b2 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addOperator(new Operator("||", 2, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + boolean b1 = !v1.equals(BigDecimal.ZERO); + boolean b2 = !v2.equals(BigDecimal.ZERO); + return b1 || b2 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addOperator(new Operator(">", 10, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) == 1 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addOperator(new Operator(">=", 10, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) >= 0 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addOperator(new Operator("<", 10, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) == -1 ? BigDecimal.ONE + : BigDecimal.ZERO; + } + }); + + addOperator(new Operator("<=", 10, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) <= 0 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addOperator(new Operator("=", 7, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) == 0 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + addOperator(new Operator("==", 7, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return operators.get("=").eval(v1, v2); + } + }); + + addOperator(new Operator("!=", 7, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) != 0 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + addOperator(new Operator("<>", 7, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return operators.get("!=").eval(v1, v2); + } + }); + + addFunction(new Function("NOT", 1) { + @Override + public BigDecimal eval(List parameters) { + boolean zero = parameters.get(0).compareTo(BigDecimal.ZERO) == 0; + return zero ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addFunction(new Function("RANDOM", 0) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.random(); + return new BigDecimal(d, mc); + } + }); + /*addFunction(new Function("SIN", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.sin(Math.toRadians(parameters.get(0) + .doubleValue())); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("COS", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.cos(Math.toRadians(parameters.get(0) + .doubleValue())); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("TAN", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.tan(Math.toRadians(parameters.get(0) + .doubleValue())); + return new BigDecimal(d, mc); + } + });*/ + addFunction(new Function("SINH", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.sinh(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("COSH", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.cosh(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("TANH", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.tanh(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("RAD", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.toRadians(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("DEG", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.toDegrees(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("MAX", 2) { + @Override + public BigDecimal eval(List parameters) { + BigDecimal v1 = parameters.get(0); + BigDecimal v2 = parameters.get(1); + return v1.compareTo(v2) > 0 ? v1 : v2; + } + }); + addFunction(new Function("MIN", 2) { + @Override + public BigDecimal eval(List parameters) { + BigDecimal v1 = parameters.get(0); + BigDecimal v2 = parameters.get(1); + return v1.compareTo(v2) < 0 ? v1 : v2; + } + }); + addFunction(new Function("ABS", 1) { + @Override + public BigDecimal eval(List parameters) { + return parameters.get(0).abs(mc); + } + }); + addFunction(new Function("LOG", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.log(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("ROUND", 2) { + @Override + public BigDecimal eval(List parameters) { + BigDecimal toRound = parameters.get(1); + int precision = parameters.get(0).intValue(); + return toRound.setScale(precision, mc.getRoundingMode()); + } + }); + /*addFunction(new Function("SQRT", 1) { + @Override + public BigDecimal eval(List parameters) { + /* + * From The Java Programmers Guide To numerical Computing + * (Ronald Mak, 2003) + */ + /*BigDecimal x = parameters.get(0); + if (x.compareTo(BigDecimal.ZERO) == 0) { + return new BigDecimal(0); + } + if (x.signum() < 0) { + throw new ExpressionException( + "Argument to SQRT() function must not be negative"); + } + BigInteger n = x.movePointRight(mc.getPrecision() << 1) + .toBigInteger(); + + int bits = (n.bitLength() + 1) >> 1; + BigInteger ix = n.shiftRight(bits); + BigInteger ixPrev; + + do { + ixPrev = ix; + ix = ix.add(n.divide(ix)).shiftRight(1); + // Give other threads a chance to work; + Thread.yield(); + } while (ix.compareTo(ixPrev) != 0); + + return new BigDecimal(ix, mc.getPrecision()); + } + });*/ + + variables.put("PI", PI); + + } + + /** + * Is the string a number? + * + * @param st The string. + * @return true, if the input string is a number. + */ + private boolean isNumber(String st) { + if (st.charAt(0) == minusSign && st.length() == 1) + return false; + for (char ch : st.toCharArray()) { + if (!Character.isDigit(ch) && ch != minusSign + && ch != decimalSeparator) + return false; + } + return true; + } + + /** + * Implementation of the Shunting Yard algorithm to transform an + * infix expression to a RPN expression. + * + * @param expression The input expression in infx. + * @return A RPN representation of the expression, with each token as a list + * member. + */ + private List shuntingYard(String expression) { + List outputQueue = new ArrayList(); + Stack stack = new Stack(); + + Tokenizer tokenizer = new Tokenizer(expression); + + String lastFunction = null; + while (tokenizer.hasNext()) { + String token = tokenizer.next(); + if (isNumber(token)) { + outputQueue.add(token); + } else if (variables.containsKey(token)) { + outputQueue.add(variables.get(token).toPlainString()); + } else if (functions.containsKey(token.toUpperCase())) { + stack.push(token); + lastFunction = token; + } else if (Character.isLetter(token.charAt(0))) { + stack.push(token); + } else if (",".equals(token)) { + while (!stack.isEmpty() && !"(".equals(stack.peek())) { + outputQueue.add(stack.pop()); + } + if (stack.isEmpty()) { + throw new ExpressionException("Parse error for function '" + + lastFunction + "'"); + } + } else if (operators.containsKey(token)) { + Operator o1 = operators.get(token); + String token2 = stack.isEmpty() ? null : stack.peek(); + while (operators.containsKey(token2) + && ((o1.isLeftAssoc() && o1.getPrecedence() <= operators + .get(token2).getPrecedence()) || (o1 + .getPrecedence() < operators.get(token2) + .getPrecedence()))) { + outputQueue.add(stack.pop()); + token2 = stack.isEmpty() ? null : stack.peek(); + } + stack.push(token); + } else if ("(".equals(token)) { + stack.push(token); + } else if (")".equals(token)) { + while (!stack.isEmpty() && !"(".equals(stack.peek())) { + outputQueue.add(stack.pop()); + } + if (stack.isEmpty()) { + throw new RuntimeException("Mismatched parentheses"); + } + stack.pop(); + if (!stack.isEmpty() + && functions.containsKey(stack.peek().toUpperCase())) { + outputQueue.add(stack.pop()); + } + } + } + while (!stack.isEmpty()) { + String element = stack.pop(); + if ("(".equals(element) || ")".equals(element)) { + throw new RuntimeException("Mismatched parentheses"); + } + if (!operators.containsKey(element)) { + throw new RuntimeException("Unknown operator or function: " + + element); + } + outputQueue.add(element); + } + return outputQueue; + } + + /** + * Evaluates the expression. + * + * @return The result of the expression. + */ + public BigDecimal eval() { + + Stack stack = new Stack(); + + for (String token : getRPN()) { + if (operators.containsKey(token)) { + BigDecimal v1 = stack.pop(); + BigDecimal v2 = stack.pop(); + stack.push(operators.get(token).eval(v2, v1)); + } else if (functions.containsKey(token.toUpperCase())) { + Function f = functions.get(token.toUpperCase()); + ArrayList p = new ArrayList( + f.getNumParams()); + for (int i = 0; i < f.numParams; i++) { + p.add(stack.pop()); + } + BigDecimal fResult = f.eval(p); + stack.push(fResult); + } else { + stack.push(new BigDecimal(token, mc)); + } + } + return stack.pop().stripTrailingZeros(); + } + + /** + * Sets the precision for expression evaluation. + * + * @param precision The new precision. + * @return The expression, allows to chain methods. + */ + public Expression setPrecision(int precision) { + this.mc = new MathContext(precision); + return this; + } + + /** + * Sets the rounding mode for expression evaluation. + * + * @param roundingMode The new rounding mode. + * @return The expression, allows to chain methods. + */ + public Expression setRoundingMode(RoundingMode roundingMode) { + this.mc = new MathContext(mc.getPrecision(), roundingMode); + return this; + } + + /** + * Adds an operator to the list of supported operators. + * + * @param operator The operator to add. + * @return The previous operator with that name, or null if + * there was none. + */ + public Operator addOperator(Operator operator) { + return operators.put(operator.getOper(), operator); + } + + /** + * Adds a function to the list of supported functions + * + * @param function The function to add. + * @return The previous operator with that name, or null if + * there was none. + */ + public Function addFunction(Function function) { + return functions.put(function.getName(), function); + } + + /** + * Sets a variable value. + * + * @param variable The variable name. + * @param value The variable value. + * @return The expression, allows to chain methods. + */ + public Expression setVariable(String variable, BigDecimal value) { + variables.put(variable, value); + return this; + } + + /** + * Sets a variable value. + * + * @param variable The variable to set. + * @param value The variable value. + * @return The expression, allows to chain methods. + */ + public Expression setVariable(String variable, String value) { + variables.put(variable, new BigDecimal(value)); + return this; + } + + /** + * Sets a variable value. + * + * @param variable The variable to set. + * @param value The variable value. + * @return The expression, allows to chain methods. + */ + public Expression with(String variable, BigDecimal value) { + return setVariable(variable, value); + } + + /** + * Sets a variable value. + * + * @param variable The variable to set. + * @param value The variable value. + * @return The expression, allows to chain methods. + */ + public Expression and(String variable, String value) { + return setVariable(variable, value); + } + + /** + * Sets a variable value. + * + * @param variable The variable to set. + * @param value The variable value. + * @return The expression, allows to chain methods. + */ + public Expression and(String variable, BigDecimal value) { + return setVariable(variable, value); + } + + /** + * Sets a variable value. + * + * @param variable The variable to set. + * @param value The variable value. + * @return The expression, allows to chain methods. + */ + public Expression with(String variable, String value) { + return setVariable(variable, value); + } + + /** + * Get an iterator for this expression, allows iterating over an expression + * token by token. + * + * @return A new iterator instance for this expression. + */ + public Iterator getExpressionTokenizer() { + return new Tokenizer(this.expression); + } + + /** + * Cached access to the RPN notation of this expression, ensures only one + * calculation of the RPN per expression instance. If no cached instance + * exists, a new one will be created and put to the cache. + * + * @return The cached RPN instance. + */ + private List getRPN() { + if (rpn == null) { + rpn = shuntingYard(this.expression); + } + return rpn; + } + + /** + * Get a string representation of the RPN (Reverse Polish Notation) for this + * expression. + * + * @return A string with the RPN representation for this expression. + */ + public String toRPN() { + String result = ""; + for (String st : getRPN()) { + result = "".equals(result) ? result : result + " "; + result += st; + //System.out.println("Watch out this is only possible with api 9+"); + } + return result; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/controller/KeyEventAction.java b/app/src/main/java/com/bingce/controlnetwork/controller/KeyEventAction.java new file mode 100644 index 0000000..c36e96b --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/controller/KeyEventAction.java @@ -0,0 +1,12 @@ +package com.bingce.controlnetwork.controller; + +public class KeyEventAction { + public final static String NONE = "0"; + public final static String CAL = "1"; + public final static String SURVEY = "2"; + public final static String RECORD = "3"; + public final static String LAST = "4"; + public final static String NEXT = "5"; + public final static String SURVEY_NO_SEND = "6"; + public final static String SURVEY_AND_RECORD = "7"; +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractFullScreenDialogFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractFullScreenDialogFragment.java new file mode 100644 index 0000000..dd9c790 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractFullScreenDialogFragment.java @@ -0,0 +1,125 @@ +package com.bingce.controlnetwork.fragment; + +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatDialogFragment; + +import com.bingce.utils.SoftKeyUtils; + +import com.bingce.controlnetwork.R; + +public abstract class AbstractFullScreenDialogFragment extends AppCompatDialogFragment { + + private View viewSpace; + private View confirm; + + @Nullable + @Override + final public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); + View contentView = inflater.inflate(R.layout.fragment_fullscreen_dialog_layout, container, false); + FrameLayout contentContainer = contentView.findViewById(R.id.content_container); + contentView.setOnClickListener(v -> { + if (quitWhenTouchBg()) { + doDismiss(); + } else { + hideSoft(); + } + }); + + if (getArguments() != null) { + TextView title = contentView.findViewById(R.id.title); + if (title != null) { + String string = getArguments().getString(KEY_TITLE_NAME); + if (string == null || string.isEmpty()) { + title.setVisibility(View.GONE); + } else { + title.setText(string); + } + } + TextView subTitle = contentView.findViewById(R.id.sub_title); + if (subTitle != null) { + String string = getArguments().getString(KEY_SUB_TITLE_NAME); + if (string == null || string.isEmpty()) { + subTitle.setVisibility(View.GONE); + } else { + subTitle.setText(string); + } + } + } + + View cancel = contentView.findViewById(R.id.cancel_button); + if (cancel != null) { + cancel.setOnClickListener(v -> onCancel()); + } + viewSpace = contentView.findViewById(R.id.viewSpace); + confirm = contentView.findViewById(R.id.confirm_button); + if (confirm != null) { + confirm.setOnClickListener(v -> { + hideSoft(); + onConfirm(); + }); + } + + contentContainer.addView(createContentView(inflater, contentContainer, savedInstanceState)); + return contentView; + } + + protected void onCancel() { + doDismiss(); + } + + protected void onConfirm() { + dismiss(); + } + + protected abstract View createContentView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState); + + private void doDismiss() { + hideSoft(); + dismiss(); + } + + private void hideSoft() { + SoftKeyUtils.hideSoftKey(); + } + + protected boolean quitWhenTouchBg() { + return true; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(0x33000000)); + getDialog().getWindow().setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT); + } + + protected AbstractFullScreenDialogFragment() { + } + + private static final String KEY_SUB_TITLE_NAME = "__ATTRIBUTE__NAME__"; + private static final String KEY_TITLE_NAME = "__GROUP__NAME__"; + + protected static void setArgs(Bundle args, String title, String subTitle) { + args.putString(KEY_SUB_TITLE_NAME, subTitle); + args.putString(KEY_TITLE_NAME, title); + } + + protected void setHideConfirm() { + viewSpace.setVisibility(View.GONE); + confirm.setVisibility(View.GONE); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractHierarchicalListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractHierarchicalListFragment.java new file mode 100644 index 0000000..64e8bb2 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractHierarchicalListFragment.java @@ -0,0 +1,213 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.IUniversalListItem; + +import org.jetbrains.annotations.NotNull; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.IndexWithTextAdapter; +import com.bingce.controlnetwork.adapter.IndexWithTextAdapter; + +public abstract class AbstractHierarchicalListFragment extends Fragment { + private View layout1; + private View layout2; + private View back1; + private View back2; + private TextView title1; + private TextView title2; + private RecyclerView recyclerView1; + private RecyclerView recyclerView2; + private boolean is1Layout = true;//通知当前显示的是layout1还是layout2 + private int currentListIndex = 0;//当前显示的list在所有集合中的index + private final IndexWithTextAdapter.IOnItemClick callback = item -> onItemClicked(currentListIndex, item); + + @Nullable + @org.jetbrains.annotations.Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + View root = inflater.inflate(R.layout.fragment_hierarchical_list_layout, container, false); + + layout1 = root.findViewById(R.id.layout1); + if (layout1 != null) { + recyclerView1 = layout1.findViewById(R.id.list1); + } + back1 = root.findViewById(R.id.back1); + if (back1 != null) { + back1.setOnClickListener(v -> onBackClicked(currentListIndex)); + } + title1 = root.findViewById(R.id.title1); + + layout2 = root.findViewById(R.id.layout2); + if (layout2 != null) { + recyclerView2 = layout2.findViewById(R.id.list2); + } + back2 = root.findViewById(R.id.back2); + if (back2 != null) { + back2.setOnClickListener(v -> onBackClicked(currentListIndex)); + } + title2 = root.findViewById(R.id.title2); + + //初始化 + if (layout2 != null) { + layout2.setVisibility(View.GONE); + } + //加载list1 + setupList(0, title1, recyclerView1, callback); + return root; + } + + //执行back + final protected void back2(int listIndex) { + currentListIndex = listIndex; + is1Layout = !is1Layout; + + updateButtonVisibility(); + + doSwitch(layout1, layout2, title1, title2, recyclerView1, recyclerView2, this, + callback, + is1Layout, listIndex, false); + } + + //执行forward + final protected void forward2(int listIndex) { + currentListIndex = listIndex; + is1Layout = !is1Layout; + + updateButtonVisibility(); + + doSwitch(layout1, layout2, title1, title2, recyclerView1, recyclerView2, this, + callback, + is1Layout, listIndex, true); + } + + private void updateButtonVisibility() { + if (is1Layout && back1 != null) { + back1.setVisibility(!isFirstIndex(currentListIndex) ? View.VISIBLE : View.GONE); + } else if (!is1Layout && back2 != null) { + back2.setVisibility(!isFirstIndex(currentListIndex) ? View.VISIBLE : View.GONE); + } + } + + protected boolean isFirstIndex(int index) { + return index == 0; + } + + protected int preIndexOf(int index) { + return index - 1; + } + + final boolean doBack() { + if (currentListIndex > 0) { + back2(preIndexOf(currentListIndex)); + return true; + } + return false; + } + + private static void doSwitch(View layout1, View layout2, TextView title1, TextView title2, + RecyclerView recyclerView1, + RecyclerView recyclerView2, + AbstractHierarchicalListFragment fragment, + final IndexWithTextAdapter.IOnItemClick callback, + boolean targetLayoutIsLayout1, + int listIndex, + boolean moveForward) { + //先更新界面,再执行动画 + View currentLayout = layout1; + View targetLayout = layout1; + TextView targetTitle = title1; + RecyclerView targetRecycleView = recyclerView1; + + if (targetLayoutIsLayout1) { + currentLayout = layout2; + } else { + targetLayout = layout2; + targetTitle = title2; + targetRecycleView = recyclerView2; + } + + //先设置数据 + fragment.setupList(listIndex, targetTitle, targetRecycleView, callback); + + //执行动画 + Animation outAnimation = AnimationUtils.loadAnimation(fragment.getContext(), + moveForward ? R.anim.slide_out_left : R.anim.slide_out_right); + outAnimation.setFillAfter(true); + View finalCurrentLayout = currentLayout; + outAnimation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + finalCurrentLayout.clearAnimation(); + finalCurrentLayout.setVisibility(View.GONE); + } + + @Override + public void onAnimationRepeat(Animation animation) { + + } + }); + + Animation inAnimation = AnimationUtils.loadAnimation(fragment.getContext(), + moveForward ? R.anim.slide_in_right : R.anim.slide_in_left); + inAnimation.setFillAfter(true); + targetLayout.setVisibility(View.VISIBLE); + + currentLayout.startAnimation(outAnimation); + targetLayout.startAnimation(inAnimation); + } + + //通知child,通知list的item被点击,下一步执行 forward或结束加载 + protected abstract void onItemClicked(int currentListIndex, Item item); + + //通知child,准备back,用于加载数据 + protected abstract void onBackClicked(int currentListIndex); + + //通知child,加载相应list的数据 + protected abstract void setupList(int listIndex, TextView title, RecyclerView recyclerView, + final IndexWithTextAdapter.IOnItemClick callback); + + protected static class Item implements IUniversalListItem { + private final String name; + private final String id; + + Item(String name, String id) { + this.name = name; + this.id = id; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getId() { + return id; + } + + @Override + public String getValue() { + return id; + } + } + + protected AbstractHierarchicalListFragment() { + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractProjectToleranceFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractProjectToleranceFragment.java new file mode 100644 index 0000000..d5baa5d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractProjectToleranceFragment.java @@ -0,0 +1,180 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.Fragment; + +import com.bingce.controlapphelper.datasource.database.ProjectType; +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.ToleranceTemplate; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.IToleranceDetailDataSource; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.group.ToleranceGroupConstants; +import com.bingce.controlapphelper.datasource.database.tolerance.group.ToleranceGroupRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.level.ToleranceLevelRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.util.ToleranceUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.ui.ViewUtil; +import com.bingce.controlnetwork.ui.widget.TextItemWithMore; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.List; + +/* + * 项目限差详情,包含'LimitDetailFragment'+选择模板 + * */ +public abstract class AbstractProjectToleranceFragment extends BaseFragment { + private String currentToleranceDetailRecordId; + + protected String projectType; + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + if (getArguments() != null) { + projectType = getArguments().getString(BundleConstants.KEY_PROJECT_TYPE); + } + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_project_limit_detail_layout, container, false); + //设置限差模板选择事件 + registerSelectTemplateCallback(view, () -> ThreadPoolUtil.execute(this::onSelectToleranceTemplateClick)); + //设置详情 + onCreateView(view); + return view; + } + + /** + * 获取新建项目时的默认限差 + * + * @param projectType + */ + protected ToleranceDetailRecord getFirstDefaultTolerance(String projectType) { + return ProjectType.getTarget(projectType, (projectTypeBack) -> { + List list = null; + if (projectTypeBack == ProjectType.TRIANGLE) { + list = ToleranceTemplate.detailListOfGroup(ToleranceGroupConstants.VALUE_MUL_CYCLE_ANGLE); + } else if (projectTypeBack == ProjectType.CONNECTION) { + list = ToleranceTemplate.detailListOfGroup(ToleranceTemplate.CITY_GROUP_ID); + } else if (projectTypeBack == ProjectType.HEIGHT_TRAVERSE) { + list = ToleranceTemplate.detailListOfGroup(ToleranceGroupConstants.VALUE_HEIGHT_TRAVERSE); + } + if (list != null && !list.isEmpty()) { + return list.get(0); + } + return null; + }); + } + + protected abstract void onCreateView(View view); + + protected void setCurrentToleranceName(View view, ToleranceDetailRecord toleranceRecord) { + View tv = view.findViewById(R.id.setting_index); + ThreadPoolUtil.execute(new Runnable() { + @Override + public void run() { + if (toleranceRecord == null) { + return; + } + ToleranceGroupRecord groupRecord = ToleranceTemplate.groupOf(toleranceRecord.groupId); + ToleranceLevelRecord levelRecord = ToleranceTemplate.levelOf(toleranceRecord.levelId); + String name = ToleranceUtil.completedToleranceName(groupRecord, levelRecord, toleranceRecord); + runOnUI(() -> { + if (tv instanceof TextItemWithMore) { + ((TextItemWithMore) tv).setDescribeText(name); + } + }); + } + }); + } + + protected void registerSelectTemplateCallback(View view, Runnable runnable) { + ViewUtil.setOnClick(view.findViewById(R.id.setting_index), v -> runnable.run()); + } + + /** + * 限差模板的点击后逻辑 + */ + @WorkerThread + protected void onSelectToleranceTemplateClick() { + IToleranceDetailDataSource toleranceDetailDataSource = + SurveyorDatabaseFactory.instance.getToleranceDetailDataSource(); + //缓存+数据库中获取 + ToleranceDetailRecord toleranceDetailRecord = toleranceDetailDataSource.getRecordSync(currentToleranceDetailRecordId); + if (toleranceDetailRecord == null) { + return; + } + + ThreadPoolUtil.executeInMain(() -> + SelectToleranceBottomSheetFragment.select( + getChildFragmentManager(), + getViewLifecycleOwner(), + projectType, + toleranceDetailRecord.getGroupId(), + toleranceDetailRecord.getLevelId(), + toleranceDetailRecord.getId(), + toleranceId -> ThreadPoolUtil.execute(() -> { + //根据toleranceId查找缓存数据 + ToleranceDetailRecord instance = + SurveyorDatabaseFactory.instance.getToleranceDetailDataSource().getRecordSync(toleranceId); + //更新页面数据 + updateToleranceDetail(getView(), instance); +// //新增 + if (instance != null) { + //这里增加存入数据库 已备杀死app后能获取到限差数据 + SurveyorDatabaseFactory.instance.getToleranceDetailDataSource().record(instance); + } + + }) + )); + } + + protected void onCurrentToleranceChanged(String toleranceId) { + currentToleranceDetailRecordId = toleranceId; + } + + @WorkerThread + protected void updateToleranceDetail(View view, ToleranceDetailRecord tolerance) { + if (tolerance == null) { + return; + } + onCurrentToleranceChanged(tolerance.getId()); + runOnUI(() -> { + //设置限差名称 + setCurrentToleranceName(view, tolerance); + //设置限差详情 + Fragment detailFragment = + getParentFragmentManager().findFragmentByTag(AbstractProjectToleranceFragment.class.getName()); + if (detailFragment == null) { + Bundle args = new Bundle(); + if (getArguments() != null) { + args.putString(BundleConstants.KEY_TOLERANCE_ID, tolerance.getId()); + } + getParentFragmentManager() + .beginTransaction() + .replace(R.id.fragment_container, ToleranceDetailFragment.newInstance(args), AbstractProjectToleranceFragment.class.getName()) + .commit(); + } else { + if (detailFragment instanceof ToleranceDetailFragment) { + ((ToleranceDetailFragment) detailFragment).changeTolerance(tolerance.getId()); + } + } + }); + } + + protected String currentTolerance() { + return currentToleranceDetailRecordId; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractRecyclerViewFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractRecyclerViewFragment.java new file mode 100644 index 0000000..b749465 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/AbstractRecyclerViewFragment.java @@ -0,0 +1,33 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; + +public abstract class AbstractRecyclerViewFragment extends Fragment { + protected abstract void refreshRecyclerView(RecyclerView recyclerView); + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_single_list_layout, container, false); + + // Set the adapter + if (view instanceof RecyclerView) { + RecyclerView recyclerView = (RecyclerView) view; + refreshRecyclerView(recyclerView); + } + + setHasOptionsMenu(true); + + return view; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/BaseBottomSheetDialogFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/BaseBottomSheetDialogFragment.java new file mode 100644 index 0000000..8dc5454 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/BaseBottomSheetDialogFragment.java @@ -0,0 +1,12 @@ +package com.bingce.controlnetwork.fragment; + +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +public class BaseBottomSheetDialogFragment extends BottomSheetDialogFragment { + final protected void runOnUI(Runnable runnable) { + if (getActivity() == null) { + return; + } + getActivity().runOnUiThread(runnable); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/BottomSheetSelectListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/BottomSheetSelectListFragment.java new file mode 100644 index 0000000..4eed9fa --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/BottomSheetSelectListFragment.java @@ -0,0 +1,141 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.UniversalListItem; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlnetwork.adapter.SelectableIndexWithTextAdapter; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.SelectableIndexWithTextAdapter; + +/** + * 弹框,用于选择限差模板 + */ +public class BottomSheetSelectListFragment extends BottomSheetDialogFragment { + public static final String TAG = BottomSheetSelectListFragment.class.getName(); + + private BottomSheetSelectListFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_bottom_popup_list_select_layout, + container, false); + // Set the adapter + Context context = view.getContext(); + RecyclerView recyclerView = view.findViewById(R.id.list); + recyclerView.setLayoutManager(new LinearLayoutManager(context)); + + String targetId = null; + List items = new ArrayList<>(); + List indexes = null; + if (getArguments() != null) { + List strings = getArguments().getStringArrayList(KEY_ITEMS); + indexes = getArguments().getStringArrayList(KEY_ENABLE_INDEX); + int defaultIndex = getArguments().getInt(KEY_DEFAULT_ID, -1); + if (strings != null) { + for (int index = 0; index < strings.size(); index++) { + String string = strings.get(index); + Item item = new Item(); + item.setId(String.valueOf(index)); + item.setName(string); + items.add(item); + } + if (defaultIndex < 0 || defaultIndex >= strings.size()) { + if (!items.isEmpty()) { + targetId = items.get(0).getId(); + } + } else { + targetId = items.get(defaultIndex).getId(); + } + } + } + + SelectableIndexWithTextAdapter adapter = + new SelectableIndexWithTextAdapter<>( + targetId, + items, + indexes, + item -> { + Bundle args = new Bundle(); + String id = item.getId(); + int index = Integer.parseInt(id); + args.putInt(KEY_INDEX, index); + args.putString(KEY_STRING, item.getName()); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_SELECT, args); + dismiss(); + }); + recyclerView.setAdapter(adapter); + return view; + } + + private static final String KEY_ITEMS = "__ITEMS__"; + private static final String KEY_INDEX = "__INDEX__"; + private static final String KEY_ENABLE_INDEX = "__ENABLE_INDEX__"; + private static final String KEY_DEFAULT_ID = "__defaultId__"; + private static final String KEY_STRING = "__STRING__"; + private static final String KEY_REQUEST_SELECT = "__SELECT__"; + + public static void showSelect(FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + int defaultIndex, + ArrayList items, + ArrayList enableIndexes, + IOnSelectCallback callback) { + if (callback == null) { + return; + } + Bundle args = new Bundle(); + args.putStringArrayList(KEY_ITEMS, items); + if (enableIndexes != null && !enableIndexes.isEmpty()) { + args.putStringArrayList(KEY_ENABLE_INDEX, enableIndexes); + } + args.putInt(KEY_DEFAULT_ID, defaultIndex); + BottomSheetSelectListFragment fragment = new BottomSheetSelectListFragment(); + fragment.setArguments(args); + fragmentManager + .setFragmentResultListener(KEY_REQUEST_SELECT, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_SELECT.equals(requestKey)) { + callback.onSelected(result.getInt(KEY_INDEX), result.getString(KEY_STRING)); + } + }); + fragment.show(fragmentManager, TAG); + } + +// public static void showSelect(FragmentManager fragmentManager, +// @NonNull LifecycleOwner lifecycleOwner, +// int defaultIndex, +// ArrayList items, +// IOnSelectCallback callback) { +// showSelect(fragmentManager, lifecycleOwner, defaultIndex, items, null, callback); +// } + + public interface IOnSelectCallback { + void onSelected(int index, String string); + } + + private static class Item extends UniversalListItem { + @Override + public ViewItemType getType() { + return null; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/BottomSheetSurveyorPeriodFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/BottomSheetSurveyorPeriodFragment.java new file mode 100644 index 0000000..decb95f --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/BottomSheetSurveyorPeriodFragment.java @@ -0,0 +1,320 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigOperate; +import com.bingce.controlapphelper.datasource.database.line.ILineRecordDataSource; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.surveyorcycle.ISurveyorPeriodDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.util.IUIRunner; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.SurveyorPeriodAdapter; +import com.bingce.controlnetwork.ui.ViewUtil; +import com.bingce.controlnetwork.util.DefaultNameUtil; +import com.bingce.utils.ThreadPoolUtil; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + + +/** + * 弹框,用于选择测期 + */ +public class BottomSheetSurveyorPeriodFragment extends BottomSheetDialogFragment implements IUIRunner { + private static final String KEY_TIME_ID = "__TIME_ID"; + public static final String KEY_REQUEST_TIME = "KEY_REQUEST_TIME_ID"; + public static final String KEY_RESULT_NAME = "KEY_RESULT_NAME"; + public static final String KEY_RESULT_ID = "___result__id"; + private SurveyorPeriodAdapter adapter = null; + + private BottomSheetSurveyorPeriodFragment() { + } + + public static void pick(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String projectId, String currentCycleId, ICallback callback) { + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_TIME, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_TIME.equals(requestKey)) { + callback.onSelect(result.getString(KEY_RESULT_ID), result.getString(KEY_RESULT_NAME)); + } + }); + BottomSheetDialogFragment fragment = new BottomSheetSurveyorPeriodFragment(); + Bundle args = new Bundle(); + args.putString(KEY_TIME_ID, currentCycleId); + args.putString(BundleConstants.KEY_PROJECT_ID, projectId); + fragment.setArguments(args); + fragment.show(fragmentManager, "time_index"); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_surveryor_station_number_list, container, false); + RecyclerView recyclerView = view.findViewById(R.id.list); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + String projectId = ""; + String currentCycleId = ""; + if (getArguments() != null) { + projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + currentCycleId = getArguments().getString(KEY_TIME_ID); + } + + adapter = new SurveyorPeriodAdapter(currentCycleId, this); + recyclerView.setAdapter(adapter); + + Helper helper = new Helper(adapter, recyclerView, + view.findViewById(R.id.loading), view.findViewById(R.id.empty_tips), getViewLifecycleOwner()); + + helper.refresh(projectId); + + String finalProjectId = projectId; + ViewUtil.setOnClick( + view.findViewById(R.id.new_item), + v -> createNewCycle(getContext(), getParentFragmentManager(), getChildFragmentManager(), getViewLifecycleOwner(), + adapter, this, finalProjectId)); + return view; + } + + private static void createNewCycle(@Nullable Context context, FragmentManager parentManager, FragmentManager manager, LifecycleOwner lifecycleOwner, + SurveyorPeriodAdapter adapter, IUIRunner runner, String finalProjectId) { + if (context == null) { + return; + } + StringInputFragment.input(manager, + context.getString(R.string.tips_input_new_cycle_name), + DefaultNameUtil.getDefaultPeriodName(), + lifecycleOwner, + string -> { + if (string == null || string.isEmpty()) { + ToastUtils.showShort(R.string.tips_cycle_name_cannt_empty); + } else { + SurveyorPeriodRecord record = + new SurveyorPeriodRecord(finalProjectId, string); + SurveyorDatabaseFactory.instance + .getSurveyorPeriod() + .saveRecord(record); + if (adapter != null) { + adapter.changeCurrentSelect(record.id); + } + //自动切换到新测回 + Bundle args = new Bundle(); + args.putString(BottomSheetSurveyorPeriodFragment.KEY_RESULT_ID, record.getId()); + args.putString(BottomSheetSurveyorPeriodFragment.KEY_RESULT_NAME, record.getName()); + parentManager.setFragmentResult(BottomSheetSurveyorPeriodFragment.KEY_REQUEST_TIME, args); + //询问是否从其他已有测期复制测站列表 + tryCopyStationFromOther(context, manager, lifecycleOwner, record, runner, finalProjectId); + //更新默认测回和测期 + ConfigOperate.changeDefaultProjectAndCycle(finalProjectId, record.id); + + } + }); + } + + private static void tryCopyStationFromOther( + @Nullable Context context, FragmentManager manager, LifecycleOwner lifecycleOwner, + SurveyorPeriodRecord record, IUIRunner runner, String finalProjectId) { + //检测其他测期是否有测站 + ThreadPoolUtil.execute(() -> { + ISurveyorPeriodDataSource surveyorCycleDataSource = + SurveyorDatabaseFactory.instance + .getSurveyorPeriod(); + List cycleRecords = surveyorCycleDataSource.getDataListSyncByProjectId(finalProjectId); + if (cycleRecords == null || cycleRecords.isEmpty()) { + return; + } + List cycleRecordWithStation = new ArrayList<>(); + ISurveyorStationDataSource stationDataSource = + SurveyorDatabaseFactory.instance.getSurveyorStation(); + for (SurveyorPeriodRecord cycleRecord : cycleRecords) { + if (cycleRecord == null) { + continue; + } + + List stationRecordList = stationDataSource.getDataList(finalProjectId, cycleRecord.getId()); + if (stationRecordList == null || stationRecordList.isEmpty()) { + continue; + } + + cycleRecordWithStation.add(cycleRecord); + } + + if (cycleRecordWithStation.isEmpty()) { + return; + } + + ArrayList cycleNameList = new ArrayList<>(); + List cycleIdList = new ArrayList<>(); + for (SurveyorPeriodRecord cycleRecord : cycleRecordWithStation) { + if (cycleRecord == null) { + continue; + } + cycleNameList.add(cycleRecord.getName()); + cycleIdList.add(cycleRecord.getId()); + } + //当前其他测期已有测站,则提示是否拷贝 + runner.runOnUI(() -> { + if (context == null) { + return; + } + TipsWith2OptionFragment.tips(manager, + lifecycleOwner, + context.getString(R.string.confirm_button_copy_station_list), + context.getString(R.string.cancel_button_create_empty_cycle), + context.getString(R.string.tips_should_copy_station_list_from_other_cycle), + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + copyStationListFromOther(context, manager, lifecycleOwner, cycleNameList, cycleIdList, record); + } + }); + }); + }); + } + + private static void copyStationListFromOther( + Context context, FragmentManager manager, LifecycleOwner lifecycleOwner, + ArrayList cycleNameList, List surveyorPeriodIdList, + SurveyorPeriodRecord surveyorPeriodRecord) { + if (surveyorPeriodRecord == null) { + return; + } + ListDialogFragment.showList( + manager, context.getString(R.string.tips_select_cycle_to_copy), + cycleNameList, lifecycleOwner, (index, value) -> { + String surveyorPeriodId = surveyorPeriodIdList.get(index); + String surveyorPeriodRecordId = surveyorPeriodRecord.getId(); + String projectId = surveyorPeriodRecord.getProjectId(); + ISurveyorStationDataSource stationDataSource = + SurveyorDatabaseFactory.instance.getSurveyorStation(); + ILineRecordDataSource lineRecordDataSource = + SurveyorDatabaseFactory.instance.getLineRecordDatabase(); + ThreadPoolUtil.execute(() -> { + List stationRecordList = + stationDataSource.getDataList(projectId, surveyorPeriodId); + if (stationRecordList == null || stationRecordList.isEmpty()) { + return; + } + String lastLineId = "";//当前遍历到的要拷贝的导线id + String newLineId = "";//新建的导线id + List newStations = new ArrayList<>(); + List newLines = new ArrayList<>(); + long date = (new Date()).getTime(); + for (SurveyorStationRecord surveyorStationRecord : stationRecordList) { + if (surveyorStationRecord == null) { + continue; + } + if (surveyorStationRecord.isMulAngleStation()) { + lastLineId = LineRecord.TYPE_MUL_ANGLE; + newLineId = LineRecord.TYPE_MUL_ANGLE; + } else if (surveyorStationRecord.isLineStation()) { + //拷贝导线 + if (!lastLineId.equals(surveyorStationRecord.getLineId())) { + lastLineId = surveyorStationRecord.getLineId(); + //执行创建导线以及相应测站的逻辑 + LineRecord lineRecord = lineRecordDataSource.findById(lastLineId); + if (lineRecord == null) { + continue; + } + LineRecord newLine = LineRecord.copy(lineRecord, surveyorPeriodRecordId, date++); + newLines.add(newLine); + newLineId = newLine.id; + } + } + //拷贝测站 + newStations.add( + SurveyorStationRecord.copy( + surveyorStationRecord, surveyorPeriodRecordId, newLineId, date++)); + } + //存储测站 + stationDataSource.save(newStations); + //存储导线 + lineRecordDataSource.save(newLines); + }); + }); + } + + public void runOnUI(Runnable runnable) { + if (getActivity() == null) { + return; + } + getActivity().runOnUiThread(runnable); + } + + public interface ICallback { + void onSelect(String id, String name); + } + + public static class Helper { + private final SurveyorPeriodAdapter adapter; + private final View loadingView; + private final View emptyView; + private final RecyclerView recyclerView; + private final LifecycleOwner lifecycleOwner; + + Helper(SurveyorPeriodAdapter adapter, + RecyclerView recyclerView, + View loadingView, + View emptyView, + LifecycleOwner lifecycleOwner) { + this.loadingView = loadingView; + this.emptyView = emptyView; + this.adapter = adapter; + this.recyclerView = recyclerView; + this.lifecycleOwner = lifecycleOwner; + } + + private void update(List projectRecords) { + adapter.updateData(projectRecords); + } + + public void refresh(String projectId) { + ISurveyorPeriodDataSource surveyorCycleDataSource = + SurveyorDatabaseFactory.instance.getSurveyorPeriod(); + surveyorCycleDataSource.getLiveDataListByProjectId(projectId) + .observe(lifecycleOwner, + records -> { + //隐藏loading + if (loadingView != null) { + loadingView.setVisibility(View.GONE); + } + if (records == null || records.isEmpty()) { + if (emptyView != null) { + emptyView.setVisibility(View.VISIBLE); + } + recyclerView.setVisibility(View.GONE); + } else { + //刷新adapter + if (emptyView != null) { + emptyView.setVisibility(View.GONE); + } + recyclerView.setVisibility(View.VISIBLE); + update(records); + } + }); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentStationSurveyorDataListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentStationSurveyorDataListFragment.java new file mode 100644 index 0000000..dcfb5d0 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentStationSurveyorDataListFragment.java @@ -0,0 +1,355 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.surveyor.data.CachedData; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.IDistanceTypeChangeListener; +import com.bingce.controlapphelper.surveyor.data.SurveyorData; +import com.bingce.controlapphelper.surveyor.state.ISurveyState; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParamAuto; +import com.bingce.controlapphelper.util.DigitalUtil; +import com.bingce.controlapphelper.util.IUIRunner; +import com.bingce.controlnetwork.adapter.SurveyorStationRecordsAdapter; +import com.bingce.controlnetwork.surveyor.state.angledistance.StateManager; +import com.bingce.totalstation.TotalStation; +import com.bingce.utils.ThreadPoolUtil; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.SurveyorStationRecordsAdapter; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.surveyor.state.IScrollDelegate; +import com.bingce.controlnetwork.surveyor.state.angledistance.StateManager; + +/** + * 测站某个测期的测量数据列表 + */ +public class ComponentStationSurveyorDataListFragment extends BaseFragment + implements IDistanceTypeChangeListener, ISurveyState { + private SurveyorStationRecordsAdapter adapter = null; + private StateManager stateManager; + private RecyclerView recyclerView; + private IDistanceTypeChangeListener cachedDataListener = null; + private IDistanceTypeChangeListener surveyedDataListener = null; + private ISurveyState surveyState; + + private ComponentStationSurveyorDataListFragment() { + super(); + } + + private String stationId() { + if (getArguments() == null) { + return null; + } + return getArguments().getString(KEY_STATION_ID); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate( + R.layout.fragment_project_surveyor_station_point_list_layout, + container, + false); + String stationId = stationId(); + recyclerView = view.findViewById(R.id.recycler_view); + if (stationId != null) { + //收集信息 + collectData(stationId, + getContext(), + getChildFragmentManager(), + getViewLifecycleOwner(), + this::runOnUI, + index -> { + if (index >= 0 && adapter != null && index < adapter.getItemCount()) { + recyclerView.scrollToPosition(index); + } + }, + new ICollectCacheCallback() { + @Override + public void onFailure() { + } + + @Override + public void onSuccess( + boolean showSlopDistance, + ICachedData cachedData, + SurveyorData surveyorData, + StateManager stateManager) { + onCollectStationData(showSlopDistance, cachedData, surveyorData, stateManager); + surveyState = stateManager; + } + }); + } + + return view; + } + + @WorkerThread + private void onCollectStationData( + boolean showSlopDistance, + ICachedData cachedData, + SurveyorData surveyorData, + StateManager stateManager) { + this.stateManager = stateManager; + cachedDataListener = cachedData; + surveyedDataListener = surveyorData; + + //测量数据收集完毕后,就可以更新UI了 + runOnUI(() -> { + //刷新UI + if (adapter == null) { + adapter = new SurveyorStationRecordsAdapter(stationId(), cachedData, surveyorData, surveyorData); + adapter.onShowSlopDistance(showSlopDistance); + if (recyclerView != null) { + recyclerView.setAdapter(adapter); + //滚动到当前目标点 + int currentItemIndex = surveyorData.currentIndex(); + if (currentItemIndex >= 0 && currentItemIndex < adapter.getItemCount()) { + recyclerView.scrollToPosition(currentItemIndex); + } + } + } + + //监听测站数据 + //监听「平距」「斜距」切换,更新UI显示 + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getLiveDataRecord(stationId()) + .observe(getViewLifecycleOwner(), + surveyorStationRecord -> onShowSlopDistance(surveyorStationRecord.isShowSlopDistance())); + }); + } + + /** + * 收集测站信息 + */ + private static void collectData( + String stationId, + Context context, + FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + IUIRunner runner, + IScrollDelegate scrollDelegate, + ICollectCacheCallback callback) { + if (callback == null) { + return; + } + boolean isSupportAutoMode = TotalStation.getInstance().isSupportMotor(); + ThreadPoolUtil.execute(() -> { + //读取当前测站的当前测回--很重要 + SurveyorScheduleRecord scheduleRecord = + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .findScheduleSync(SurveyorScheduleConstants.getCurrentCycleKey(stationId, null)); + int defaultCycle = scheduleRecord == null ? 0 : + DigitalUtil.valueOfIntString(scheduleRecord.getStatue(), 0); + //加载测站信息 + SurveyorStationRecord surveyorStationRecord = + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getRecordSync(stationId); + //加载对应项目 + ProjectRecord projectRecord = SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getRecord(surveyorStationRecord.getProjectId()); + if (projectRecord == null) { + callback.onFailure(); + return; + } + //加载对应限差 + ToleranceDetailRecord toleranceRecord = SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource() + .getRecordSync(projectRecord.getToleranceId()); + if (toleranceRecord == null) { + callback.onFailure(); + return; + } + //创建缓存数据 + CachedData cachedData = + CachedData.newInstance(surveyorStationRecord.isAutoClose(), + surveyorStationRecord.isLeftAndRightSurveyor(), + stationId, toleranceRecord); + if (cachedData == null) { + callback.onFailure(); + return; + } + //是否显示斜距? + cachedData.onShowSlopDistance(surveyorStationRecord.isShowSlopDistance()); + if (cachedData.pointCount() <= 0) { + callback.onFailure(); + return; + } + //创建stateManager实例 + SurveyorData surveyorDataSource = new SurveyorData(toleranceRecord.getSurveyorCount()); + surveyorDataSource.onShowSlopDistance(surveyorStationRecord.isShowSlopDistance()); + RequestSurveyorParamAuto requestSurveyorParamAuto = new RequestSurveyorParamAuto(stationId, cachedData); + + StateManager stateManager = StateManager.newInstance( + isSupportAutoMode, + requestSurveyorParamAuto, + surveyorStationRecord, + context, + fragmentManager, + lifecycleOwner, + toleranceRecord, + surveyorDataSource, + surveyorDataSource, + cachedData, + scrollDelegate, + runner); + //fragment创建后立即计算当前cycle的测量状态 + runner.runOnUI(() -> stateManager.calScheduleWhenEnterSurveyFragment(defaultCycle)); + callback.onSuccess(surveyorStationRecord.isShowSlopDistance(), cachedData, surveyorDataSource, stateManager); + }); + } + + @Override + public void onResume() { + super.onResume(); + if (stateManager != null) { + stateManager.resume(); + } + } + + @Override + public void onPause() { + super.onPause(); + if (stateManager != null) { + stateManager.quite(); + } + } + + private interface ICollectCacheCallback { + void onFailure(); + + void onSuccess(boolean showSlopDistance, ICachedData cachedData, SurveyorData surveyorData, StateManager stateManager); + } + + public void doSurveyor() { + if (stateManager == null) { + return; + } + stateManager.doSurveyor(); + } + + public void autoSurvey() { + if (stateManager == null) { + return; + } + stateManager.doAutoSurveyor(); + } + + public void switchCycle(int cycleIndex) { + if (stateManager == null) { + return; + } + stateManager.switch2Cycle(cycleIndex); + } + + public void deleteCurrentStationSurveyorData() { + if (stateManager == null) { + return; + } + stateManager.deleteCurrentStationSurveyorData(); + } + + public void deleteByStationAndPeriod(int cycleIndex) { + if (stateManager == null) { + return; + } + stateManager.deleteCurrentStationSurveyorData(cycleIndex); + } + + /** + * 测站检测 + */ + public void stationCheck() { + if (stateManager == null) { + return; + } + stateManager.stationCheck(); + } + + /** + * 测站平差 + */ + public void stationAdjust() { + if (stateManager == null) { + return; + } + stateManager.stationAdjust(StationDataAdjustDialogFragment.TYPE_ANGLE_DISTANCE); + } + + public void goBack() { + if (stateManager == null) { + return; + } + stateManager.moveBack(); + } + + @Override + public void onShowSlopDistance(boolean value) { + if (cachedDataListener != null) { + cachedDataListener.onShowSlopDistance(value); + } + if (surveyedDataListener != null) { + surveyedDataListener.onShowSlopDistance(value); + } + if (adapter != null) { + adapter.onShowSlopDistance(value); + adapter.notifyItemRangeChanged(0, adapter.getItemCount()); + } + } + + @Override + public boolean isSurveying() { + if (surveyState != null) { + return surveyState.isSurveying(); + } + return false; + } + + @Override + public boolean isAutoSurveying() { + if (surveyState != null) { + return surveyState.isAutoSurveying(); + } + return false; + } + + private static final String KEY_STATION_ID = "__station_id"; + public static final String TAG = ComponentStationSurveyorDataListFragment.class.getName(); + + public static ComponentStationSurveyorDataListFragment newInstance(String stationId) { + ComponentStationSurveyorDataListFragment fragment = new ComponentStationSurveyorDataListFragment(); + Bundle bundle = new Bundle(); + bundle.putString(KEY_STATION_ID, stationId); + fragment.setArguments(bundle); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSurveyorStationListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSurveyorStationListFragment.java new file mode 100644 index 0000000..44be965 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSurveyorStationListFragment.java @@ -0,0 +1,138 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.LiveData; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.util.StationUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.SurveyorStationListAdapter; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.fragment.stationdetail.SingleStationDetailAndEditFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.MeasureFragment; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.List; + +/** + * 测站列表(项目和测量共用) + */ +public class ComponentSurveyorStationListFragment extends BaseFragment { + public static final String TAG = "cn.liuyanbing.surveyor.fragment.dummy__SurveyorStationListFragment___"; + private SurveyorStationListAdapter adapter; + private RecyclerView recyclerView; + + private LiveData> stationLiveData; + + /** + * 去测量或者详情页面 + */ + private void goStationMeasureOrDetail(SurveyorStationRecord item, boolean detailOrSurveyorFinal) { + String stationId = item.getId(); + ThreadPoolUtil.execute(() -> { + SurveyorStationRecord stationRecord = SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getRecordSync(stationId); + if (stationRecord == null || stationRecord.getItems() == null || stationRecord.getItems().isEmpty()) { + return; + } + + String lineTypeFromStation = StationUtil.getLineTypeFromStation(stationRecord); + + //站的名称 导线+点名 + String stationName = StationUtil.getStationName(stationRecord); + + if (detailOrSurveyorFinal) { + SingleStationDetailAndEditFragment.start(getContext(), stationId, stationName, item.getProjectId()); + } else { + //StationSurveyorFragment原始测量页 + MeasureFragment.start(getContext(), stationId, stationName); + } + }); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_list_layout, container, false); + if (view instanceof RecyclerView) { + recyclerView = (RecyclerView) view; + if (getArguments() != null) { + update(getArguments().getString(BundleConstants.KEY_PROJECT_ID), + getArguments().getString(KEY_TIME_INDEX)); + } + } + return view; + } + + /** + * 根据项目id和测期id获取测站记录 + * + * @param projectId + * @param periodId + */ + public void update(String projectId, String periodId) { + if (stationLiveData != null) { + stationLiveData.removeObservers(this); + } + + stationLiveData = SurveyorDatabaseFactory + .instance + .getSurveyorStation().getLiveDataList(projectId, periodId); + + stationLiveData.observe(getViewLifecycleOwner(), this::updateUi); + } + + private void updateUi(List dataList) { + runOnUI(() -> { + if (adapter == null) { + boolean detailOrSurveyor = false; + if (getArguments() != null) { + detailOrSurveyor = getArguments().getBoolean(KEY_DETAIL_OR_SURVEYOR, false); + } + boolean detailOrSurveyorFinal = detailOrSurveyor; + adapter = new SurveyorStationListAdapter(dataList, + getChildFragmentManager(), + getViewLifecycleOwner(), + runnable -> { + if (getActivity() != null) { + getActivity().runOnUiThread(runnable); + } + }, + getContext(), + item -> goStationMeasureOrDetail(item, detailOrSurveyorFinal), + detailOrSurveyor); + recyclerView.setAdapter(adapter); + } else { + adapter.updateData(dataList); + } + }); + } + + private static final String KEY_TIME_INDEX = "___time_index__"; + private static final String KEY_DETAIL_OR_SURVEYOR = "___editable___";//标识点击item进入测量界面还是测站详情 + + public static ComponentSurveyorStationListFragment newInstance(String projectId, String surveyorPeriodId, boolean isDetail) { + ComponentSurveyorStationListFragment fragment = new ComponentSurveyorStationListFragment(); + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(KEY_TIME_INDEX, surveyorPeriodId); + bundle.putBoolean(KEY_DETAIL_OR_SURVEYOR, isDetail); + fragment.setArguments(bundle); + return fragment; + } + + public static ComponentSurveyorStationListFragment newInstance(String projectId, String surveyorPeriodId) { + return newInstance(projectId, surveyorPeriodId, true); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSwitchStationListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSwitchStationListFragment.java new file mode 100644 index 0000000..ab5652e --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSwitchStationListFragment.java @@ -0,0 +1,153 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.adapter.IndexWithTextAdapter; +import com.bingce.controlnetwork.adapter.SelectableIndexWithTextAdapter; +import com.bingce.utils.ThreadPoolUtil; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.IndexWithTextAdapter; +import com.bingce.controlnetwork.adapter.SelectableIndexWithTextAdapter; + +/** + * 选择项目和测期的组件 + */ +public class ComponentSwitchStationListFragment extends AbstractHierarchicalListFragment { + private static final int INDEX_PROJECT_LIST = 0; + private static final int INDEX_CYCLE_LIST = 1; + private String projectId = ""; + private String projectName = ""; + private SelectableIndexWithTextAdapter projectAdapter; + private SelectableIndexWithTextAdapter periodAdapter; + + @Override + protected void onItemClicked(int currentListIndex, Item item) { + if (INDEX_PROJECT_LIST == currentListIndex) { + projectId = item.getId(); + projectName = item.getName(); + forward2(INDEX_CYCLE_LIST); + } else { + SelectProjectAndSurveyorCycleFragment.SelectedResult result = + new SelectProjectAndSurveyorCycleFragment.SelectedResult(projectId, projectName, item.getId(), item.getName()); + EventBus.getDefault().post(result); + } + } + + @Override + protected void onBackClicked(int currentListIndex) { + if (INDEX_CYCLE_LIST == currentListIndex) { + back2(INDEX_PROJECT_LIST); + } else { + //结束 + ToastUtils.showShort(R.string.cannot_go_back); + } + } + + @Override + protected void setupList(int listIndex, TextView title, RecyclerView recyclerView, + final IndexWithTextAdapter.IOnItemClick callback) { + if (INDEX_PROJECT_LIST == listIndex) { + //加载 + if (title != null) { + title.setText(Tools.getString(R.string.please_select_an_project)); + } + ThreadPoolUtil.execute(() -> { + List projectRecords = SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getDataList(); + String selectedProject = ""; + if (getArguments() != null) { + selectedProject = getArguments().getString(KEY_PROJECT_ID); + } + List items = new ArrayList<>(); + int targetIndex = 0; + for (int index = 0; index < projectRecords.size(); index++) { + ProjectRecord projectRecord = projectRecords.get(index); + Item item = new Item(projectRecord.getName(), projectRecord.getId()); + items.add(item); + if (selectedProject.equals(item.getId())) { + targetIndex = index; + } + } + int finalTargetIndex = targetIndex; + String finalSelectedProject = selectedProject; + ThreadPoolUtil.executeInMain(() -> { + if (projectAdapter == null) { + projectAdapter = new SelectableIndexWithTextAdapter<>(finalSelectedProject, items, callback); + recyclerView.setAdapter(projectAdapter); + } else { + projectAdapter.updateData(items); + } + recyclerView.scrollToPosition(finalTargetIndex); + }); + }); + } else if (INDEX_CYCLE_LIST == listIndex) { + //加载 + if (title != null) { + title.setText(Tools.getString(R.string.please_select_an_period)); + } + ThreadPoolUtil.execute(() -> { + List periodRecords = SurveyorDatabaseFactory.instance + .getSurveyorPeriod().getDataListSyncByProjectId(projectId); + List items = new ArrayList<>(); + String selectedPeriodId = ""; + if (getArguments() != null) { + selectedPeriodId = getArguments().getString(KEY_CYCLE_ID); + } + int targetIndex = 0; + for (int index = 0; index < periodRecords.size(); index++) { + SurveyorPeriodRecord surveyorPeriodRecord = periodRecords.get(index); + Item item = new Item(surveyorPeriodRecord.getName(), surveyorPeriodRecord.getId()); + items.add(item); + if (selectedPeriodId.equals(item.getId())) { + targetIndex = index; + } + } + int finalTargetIndex = targetIndex; + if (periodAdapter == null) { + periodAdapter = new SelectableIndexWithTextAdapter<>(selectedPeriodId, items, callback); + ThreadPoolUtil.executeInMain(() -> { + recyclerView.setAdapter(periodAdapter); + recyclerView.scrollToPosition(finalTargetIndex); + }); + } else { + ThreadPoolUtil.executeInMain(() -> { + periodAdapter.updateData(items); + recyclerView.scrollToPosition(finalTargetIndex); + }); + } + }); + } + } + + private ComponentSwitchStationListFragment() { + } + + private static final String KEY_PROJECT_ID = "___project_id"; + private static final String KEY_CYCLE_ID = "__cycle_id"; + + public static ComponentSwitchStationListFragment newInstance(String projectId, String cycleId) { + ComponentSwitchStationListFragment fragment = new ComponentSwitchStationListFragment(); + Bundle args = new Bundle(); + args.putString(KEY_PROJECT_ID, projectId); + args.putString(KEY_CYCLE_ID, cycleId); + fragment.setArguments(args); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSwitchToleranceFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSwitchToleranceFragment.java new file mode 100644 index 0000000..9deb14e --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ComponentSwitchToleranceFragment.java @@ -0,0 +1,248 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.ToleranceTemplate; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.IToleranceDetailDataSource; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.group.ToleranceGroupConstants; +import com.bingce.controlapphelper.datasource.database.tolerance.group.ToleranceGroupRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.level.ToleranceLevelRecord; +import com.bingce.controlnetwork.adapter.IndexWithTextAdapter; +import com.bingce.controlnetwork.adapter.SelectableIndexWithTextAdapter; +import com.bingce.utils.ThreadPoolUtil; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.IndexWithTextAdapter; +import com.bingce.controlnetwork.adapter.SelectableIndexWithTextAdapter; + + +/** + * 选择限差模板的内容 + */ +public class ComponentSwitchToleranceFragment extends AbstractHierarchicalListFragment { + private static final int INDEX_GROUP = 0; + private static final int INDEX_LEVEL = 1; + private static final int INDEX_TOLERANCE = 2; + private String projectType = ""; + private String groupId = ""; + private String levelId = ""; + private String toleranceId = ""; + private SelectableIndexWithTextAdapter adapterGroup = null; + private SelectableIndexWithTextAdapter adapterLevel = null; + private SelectableIndexWithTextAdapter adapterDetail = null; + + @Override + protected void onItemClicked(int currentListIndex, Item item) { + if (INDEX_GROUP == currentListIndex) { + groupId = item.getId(); + //检测目标group是否有level,如果没有直接进入detail + List levelRecordList = ToleranceTemplate.levelListOf(projectType, groupId); + if (levelRecordList.isEmpty()) { + levelId = ""; + forward2(INDEX_TOLERANCE); + } else { + forward2(INDEX_LEVEL); + } + } else if (INDEX_LEVEL == currentListIndex) { + levelId = item.getId(); + forward2(INDEX_TOLERANCE); + } else { + SelectedToleranceEvent result = new SelectedToleranceEvent(item.getId()); + EventBus.getDefault().post(result); + } + } + + @Override + protected int preIndexOf(int index) { + if (INDEX_TOLERANCE == index) { + if (levelId == null || levelId.isEmpty()) { + return INDEX_GROUP; + } else { + return INDEX_LEVEL; + } + } + return super.preIndexOf(index); + } + + @Override + protected void onBackClicked(int currentListIndex) { + if (INDEX_TOLERANCE == currentListIndex) { + if (levelId == null || levelId.isEmpty()) { + back2(INDEX_GROUP); + } else { + back2(INDEX_LEVEL); + } + } else if (INDEX_LEVEL == currentListIndex) { + back2(INDEX_GROUP); + } else { + ToastUtils.showShort(R.string.cannot_go_back); + } + } + + @Override + protected void setupList(int listIndex, TextView title, RecyclerView recyclerView, + final IndexWithTextAdapter.IOnItemClick callback) { + if (INDEX_GROUP == listIndex) { + if (title != null) { + title.setText(R.string.tips_please_select_tolerance_group); + } +// List toleranceGroupRecords = ToleranceTemplate.allGroups(); + List toleranceGroupRecords = ToleranceTemplate.getGroupFromType(projectType); + List items = new ArrayList<>(); + int targetIndex = 0; + Item customGroup = null; + int index = -1; + for (ToleranceGroupRecord toleranceGroupRecord : toleranceGroupRecords) { + Item item = new Item(toleranceGroupRecord.getName(), toleranceGroupRecord.getId()); + if (toleranceGroupRecord.isDeleted()) { + continue; + } + if (ToleranceGroupConstants.VALUE_CUSTOM_GROUP.equals(toleranceGroupRecord.getId())) { + customGroup = item; + continue; + } + index++; + items.add(item); + if (groupId.equals(item.getId())) { + targetIndex = index; + } + } + //添加自定义分组 + if (customGroup != null) { + items.add(customGroup); + if (groupId.equals(customGroup.getId())) { + targetIndex = items.size() - 1; + } + } + if (adapterGroup == null) { + adapterGroup = new SelectableIndexWithTextAdapter<>(groupId, items, callback); + } else { + adapterGroup.updateData(items); + } + recyclerView.setAdapter(adapterGroup); + recyclerView.scrollToPosition(targetIndex); + } else if (INDEX_LEVEL == listIndex) { + if (title != null) { + title.setText(R.string.tips_please_select_tolerance_level); + } + List toleranceLevelRecords = ToleranceTemplate.levelListOf(projectType, groupId); + List items = new ArrayList<>(); + int targetIndex = 0; + for (int index = 0; index < toleranceLevelRecords.size(); index++) { + ToleranceLevelRecord toleranceLevelRecord = toleranceLevelRecords.get(index); + Item item = new Item(toleranceLevelRecord.getName(), toleranceLevelRecord.getId()); + items.add(item); + if (levelId != null && levelId.equals(item.getId())) { + targetIndex = index; + } + } + if (adapterLevel == null) { + adapterLevel = new SelectableIndexWithTextAdapter<>(levelId, items, callback); + } else { + adapterLevel.updateData(items); + } + recyclerView.setAdapter(adapterLevel); + recyclerView.scrollToPosition(targetIndex); + } else if (INDEX_TOLERANCE == listIndex) { + ThreadPoolUtil.execute(() -> { + IToleranceDetailDataSource toleranceDetailDataSource = + SurveyorDatabaseFactory.instance.getToleranceDetailDataSource(); + List toleranceDetailRecords; + int titleRes = R.string.tips_please_select_instrument_precision; + if (levelId == null || levelId.isEmpty()) {//自定义模板 + toleranceDetailRecords = toleranceDetailDataSource.getDataListByGroup(groupId); + //选择模板 + titleRes = R.string.tips_please_select_custom_tolerance; + } else { + toleranceDetailRecords = ToleranceTemplate.detailListOfLevel(projectType, levelId); + } + int finalTitleRes = titleRes; + runOnUI(() -> { + if (title != null) { + title.setText(finalTitleRes); + } + }); + List items = new ArrayList<>(); + int targetIndex = 0; + for (int index = 0; index < toleranceDetailRecords.size(); index++) { + ToleranceDetailRecord toleranceDetailRecord = toleranceDetailRecords.get(index); + Item item = new Item(toleranceDetailRecord.getName(), toleranceDetailRecord.getId()); + items.add(item); + if (toleranceId.equals(item.getId())) { + targetIndex = index; + } + } + int finalTargetIndex = targetIndex; + runOnUI(() -> { + if (adapterDetail == null) { + adapterDetail = new SelectableIndexWithTextAdapter<>(toleranceId, items, callback); + } else { + adapterDetail.updateData(items); + } + recyclerView.setAdapter(adapterDetail); + recyclerView.scrollToPosition(finalTargetIndex); + }); + }); + } + } + + private void runOnUI(Runnable runnable) { + if (getActivity() == null) { + return; + } + getActivity().runOnUiThread(runnable); + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + if (getArguments() != null) { + projectType = getArguments().getString(KEY_PROJECT_TYPE); + groupId = getArguments().getString(KEY_GROUP); + levelId = getArguments().getString(KEY_LEVEL); + toleranceId = getArguments().getString(KEY_TOLERANCE); + } + } + + private ComponentSwitchToleranceFragment() { + } + + private static final String KEY_PROJECT_TYPE = "___PROJECT_TYPE___"; + private static final String KEY_GROUP = "___GROUP___"; + private static final String KEY_LEVEL = "___LEVEL___"; + private static final String KEY_TOLERANCE = "___PRECISION__"; + + public static ComponentSwitchToleranceFragment newInstance(String projectType, + String groupId, String levelId, String toleranceId) { + ComponentSwitchToleranceFragment fragment = new ComponentSwitchToleranceFragment(); + Bundle args = new Bundle(); + args.putString(KEY_PROJECT_TYPE, projectType); + args.putString(KEY_GROUP, groupId); + args.putString(KEY_LEVEL, levelId); + args.putString(KEY_TOLERANCE, toleranceId); + fragment.setArguments(args); + return fragment; + } + + public static class SelectedToleranceEvent { + public final String toleranceId; + + public SelectedToleranceEvent(String toleranceId) { + this.toleranceId = toleranceId; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ConfigFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ConfigFragment.java new file mode 100644 index 0000000..4466902 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ConfigFragment.java @@ -0,0 +1,93 @@ +package com.bingce.controlnetwork.fragment; + +import android.graphics.Color; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.wedcel.dragexpandgrid.model.DargChildInfo; +import com.wedcel.dragexpandgrid.model.DragIconInfo; +import com.wedcel.dragexpandgrid.view.CustomAboveView; +import com.wedcel.dragexpandgrid.view.CustomGroup; + +import java.util.ArrayList; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.ui.widget.NoScrollView; +import com.bingce.controlnetwork.util.config.ConfigsSetConfigs; + +/** + * 主页面-管理 + */ +public class ConfigFragment extends Fragment { + private CustomGroup mCustomGroup; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_config, container, false); + mCustomGroup = rootView.findViewById(R.id.fragment_config_custom_group); + NoScrollView mScrollView = rootView.findViewById(R.id.fragment_config_custom_group_scrollview); + + if (SettingValueUtil.isThemeDark()) { + mScrollView.setBackgroundColor(Color.DKGRAY); + mCustomGroup.setNameTextColor(Color.WHITE); + } + return rootView; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mCustomGroup.setHasMoreIcon(false); + + ArrayList iconInfoList = new ArrayList<>(); + ConfigsSetConfigs.getInstance().foreach(item -> iconInfoList.add( + new DragIconInfo( + item.getId(), + getString(item.getTitle()), + item.getIcon(), + item.getCategory(), + false, + new ArrayList<>()))); + mCustomGroup.initIconInfo(iconInfoList); + + mCustomGroup.setCustomViewClickListener(new CustomAboveView.CustomAboveViewClickListener() { + @Override + public void onSingleClicked(DragIconInfo iconInfo) { + if (iconInfo == null) { + return; + } + ConfigsSetConfigs.getInstance().onItemClick(iconInfo.getId(), ConfigFragment.this); + } + + @Override + public void onChildClicked(DargChildInfo childInfo) { + } + }); +// mCustomGroup.setEditModelListener(new CustomGroup.InfoEditModelListener() { +// @Override +// public void onModelChanged(boolean isEditModel) { +// if (getActivity() instanceof MainActivity) { +//// ((MainActivity) getActivity()).getViewPager().setNoScroll(isEditModel); +// } +// mScrollView.setNoScroll(isEditModel); +// } +// }); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + } + + public CustomGroup getCustomGroup() { + return mCustomGroup; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/EmptyFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/EmptyFragment.java new file mode 100644 index 0000000..9ee70d0 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/EmptyFragment.java @@ -0,0 +1,10 @@ +package com.bingce.controlnetwork.fragment; + +import com.bingce.controlnetwork.fragment.base.BaseFragment; + +/** + * Empty + */ +public class EmptyFragment extends BaseFragment { + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/FullLoadingFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/FullLoadingFragment.java new file mode 100644 index 0000000..6d6b02a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/FullLoadingFragment.java @@ -0,0 +1,83 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; + +import org.jetbrains.annotations.NotNull; + +import com.bingce.controlnetwork.R; + +public final class FullLoadingFragment extends AppCompatDialogFragment { + @Nullable + @org.jetbrains.annotations.Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_full_loading_layout, container, false); + if (getArguments() != null) { + String msg = getArguments().getString(KEY_MSG); + if (msg != null && !msg.isEmpty()) { + TextView tips = rootView.findViewById(R.id.tips); + if (tips != null) { + tips.setText(msg); + } + } + } + return rootView; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (getDialog() != null) { + final Window window = getDialog().getWindow(); + + window.setWindowAnimations(R.style.animate_full_dialog); + window.setBackgroundDrawable(null); + + WindowManager.LayoutParams params = window.getAttributes(); + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + params.height = ViewGroup.LayoutParams.MATCH_PARENT; + window.setAttributes(params); + } + } + + @Override + public void onResume() { + super.onResume(); + if (getDialog() == null) { + return; + } + getDialog().setOnKeyListener((dialog, keyCode, event) -> { + // pass on to be processed as normal + return keyCode == android.view.KeyEvent.KEYCODE_BACK; // pretend we've processed it + }); + } + + private static final String KEY_MSG = "__KEY_MSG__"; + + public static DialogFragment showLoading(FragmentManager fragmentManager) { + return showLoading(fragmentManager, null); + } + + public static DialogFragment showLoading(FragmentManager fragmentManager, String msg) { + DialogFragment fragment = new FullLoadingFragment(); + if (msg != null && !msg.isEmpty()) { + Bundle args = new Bundle(); + args.putString(KEY_MSG, msg); + fragment.setArguments(args); + } + fragment.show(fragmentManager, FullLoadingFragment.class.getName()); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ListDialogFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ListDialogFragment.java new file mode 100644 index 0000000..cab9e36 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ListDialogFragment.java @@ -0,0 +1,173 @@ +package com.bingce.controlnetwork.fragment; + +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.recyclerview.widget.RecyclerView; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.R; + +public class ListDialogFragment extends DialogFragment { + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (getDialog() == null) { + return; + } + Window window = getDialog().getWindow(); + window.setBackgroundDrawable(new ColorDrawable(0x00000000)); + window.setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT); + } + + @Nullable + @org.jetbrains.annotations.Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_station_select_point_datasource_layout, container, false); + RecyclerView recyclerView = rootView.findViewById(R.id.list); + if (recyclerView != null && getArguments() != null) { + List list = getArguments().getStringArrayList(KEY_LIST); + _Adapter adapter = new _Adapter(list, (index, value) -> { + Bundle args = new Bundle(); + args.putInt(KEY_INDEX, index); + args.putString(KEY_RESULT, value); + getParentFragmentManager().setFragmentResult(TAG, args); + dismiss(); + }); + recyclerView.setAdapter(adapter); + } + TextView title = rootView.findViewById(R.id.title); + if (title != null && getArguments() != null) { + String string = getArguments().getString(KEY_TITLE); + if (string != null && string.isEmpty()) { + title.setText(string); + } + } + return rootView; + } + + private static class _VH extends RecyclerView.ViewHolder { + final TextView textView; + + public _VH(@NonNull @NotNull View itemView) { + super(itemView); + if (itemView instanceof TextView) { + textView = (TextView) itemView; + } else { + textView = null; + } + } + } + + private static class _Adapter extends RecyclerView.Adapter<_VH> { + private final List list; + private final IResultCallback resultCallback; + + _Adapter(List list, IResultCallback resultCallback) { + this.list = list; + this.resultCallback = resultCallback; + } + + @NonNull + @NotNull + @Override + public _VH onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) { + View rootView = LayoutInflater.from(parent.getContext()) + .inflate(android.R.layout.simple_list_item_1, parent, false); + return new _VH(rootView); + } + + @Override + public void onBindViewHolder(@NonNull @NotNull ListDialogFragment._VH holder, int position) { + String value = list.get(position); + if (holder.textView != null) { + holder.textView.setText(value); + holder.textView.setOnClickListener(v -> { + if (resultCallback != null) { + resultCallback.onResult(position, value); + } + }); + } + } + + @Override + public int getItemCount() { + return list == null ? 0 : list.size(); + } + } + + public interface IResultCallback { + void onResult(int index, String value); + } + + private static final String TAG = ListDialogFragment.class.getName(); + private static final String KEY_INDEX = "key_index"; + private static final String KEY_RESULT = "key value"; + private static final String KEY_LIST = "key list"; + private static final String KEY_TITLE = "KEY TITLE"; + + public static void showList(FragmentManager fragmentManager, + ArrayList list, + @NonNull LifecycleOwner lifecycleOwner, + IResultCallback callback) { +// DialogFragment fragment = new ListDialogFragment(); +// +// Bundle args = new Bundle(); +// args.putStringArrayList(KEY_LIST, list); +// fragment.setArguments(args); +// +// fragmentManager +// .setFragmentResultListener( +// TAG, +// lifecycleOwner, +// (requestKey, result) -> { +// if (TAG.equals(requestKey)) { +// callback.onResult(result.getInt(KEY_INDEX, -1), result.getString(KEY_RESULT)); +// } +// }); +// fragment.show(fragmentManager, TAG); + showList(fragmentManager, null, list, lifecycleOwner, callback); + } + + public static void showList(FragmentManager fragmentManager, + String title, + ArrayList list, + @NonNull LifecycleOwner lifecycleOwner, + IResultCallback callback) { + DialogFragment fragment = new ListDialogFragment(); + + Bundle args = new Bundle(); + args.putStringArrayList(KEY_LIST, list); + args.putString(KEY_TITLE, title); + fragment.setArguments(args); + + fragmentManager + .setFragmentResultListener( + TAG, + lifecycleOwner, + (requestKey, result) -> { + if (TAG.equals(requestKey)) { + callback.onResult(result.getInt(KEY_INDEX, -1), result.getString(KEY_RESULT)); + } + }); + fragment.show(fragmentManager, TAG); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/MainSurveyFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/MainSurveyFragment.kt new file mode 100644 index 0000000..ddbd980 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/MainSurveyFragment.kt @@ -0,0 +1,310 @@ +package com.bingce.controlnetwork.fragment + +import android.os.Bundle +import android.text.TextUtils +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.bingce.controlapphelper.datasource.database.ProjectType +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord +import com.bingce.controlapphelper.datasource.database.route.RouteRecord +import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord +import com.bingce.controlapphelper.util.Tools +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.databinding.FragmentProjectSurveyorStationListLayoutBinding +import com.bingce.controlnetwork.fragment.base.BaseFragment +import com.bingce.controlnetwork.fragment.bottompage.BottomBean +import com.bingce.controlnetwork.fragment.bottompage.BottomPageFragment +import com.bingce.controlnetwork.fragment.bottompage.IData +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +/** + * 测量首页 + */ +class MainSurveyFragment : BaseFragment() { + + private val mBinding get() = _binding!! + + private var _binding: FragmentProjectSurveyorStationListLayoutBinding? = null + + private val scope = MainScope() + + //筛选项目的项目类型 + private var selectProjectTypeTag: String? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = + FragmentProjectSurveyorStationListLayoutBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + scope.cancel() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + SurveyorDatabaseFactory.instance + .configDataSource + .getLiveDataByKey(ConfigConstants.KEY_DEFAULT_PROJECT_ID) + .observe(viewLifecycleOwner) { configRecord -> + refreshUi(configRecord?.configValue) + } + + initListener() + } + + private fun initListener() { + mBinding.title.setOnClickListener { + BottomPageFragment.showBottom( + childFragmentManager, viewLifecycleOwner, + selectData, + object : BottomPageFragment.CallBack { + override fun back(selectData: List) { + scope.launch { + val title = getFilterTitle( + selectData[0].name, + selectData[1].name + ) + if (isHeightTraverse()) { + switchContent( + title, + SurveyorRouteStationFragment.newInstance( + selectData[0].id, + selectData[1].id + ) + ) + } else { + switchContent( + title, + ComponentSurveyorStationListFragment.newInstance( + selectData[0].id, + selectData[1].id, + false + ) + ) + } + } + } + }) + } + } + + private val selectData = object : IData { + override suspend fun getData(bottomBean: BottomBean?): List { + val dataList: MutableList = ArrayList() + + if (bottomBean == null) { + //一级数据 + val projectRecords = SurveyorDatabaseFactory.instance + .projectDataSource + .dataList + for (projectRecord in projectRecords) { + dataList.add( + BottomBean( + projectRecord.getId(), projectRecord.getProjectName(), + 0 + ) + ) + } + } else { + if (bottomBean.pageIndex == 0) { + //二级数据 + val projectRecord = + SurveyorDatabaseFactory.instance.projectDataSource.getRecord(bottomBean.id) + selectProjectTypeTag = projectRecord.getProjectType() + if (isHeightTraverse()) { + val routeList = SurveyorDatabaseFactory.instance.getRouteDataSource() + .getByProjectId(bottomBean.id) + for (routeRecord in routeList) { + dataList.add( + BottomBean( + routeRecord.getId(), routeRecord.name, + 1, tag = selectProjectTypeTag + ) + ) + } + } else { + val periodRecords = SurveyorDatabaseFactory.instance + .surveyorPeriod.getDataListSyncByProjectId(bottomBean.id) + for (periodItem in periodRecords) { + dataList.add( + BottomBean( + periodItem.getId(), periodItem.getName(), + 1, tag = selectProjectTypeTag + ) + ) + } + } + } + } + + return dataList + } + + override fun getTitle(pageIndex: Int): String { + return if (pageIndex == 0) { + Tools.getString(R.string.please_select_an_project) + } else if (selectProjectTypeTag != null && pageIndex == 1) { + if (isHeightTraverse()) { + Tools.getString(R.string.please_select_an_route) + } else { + Tools.getString(R.string.please_select_an_period) + } + } else { + "" + } + } + } + + /** + * 刷新页面 + */ + private fun refreshUi(projectId: String?) { + scope.launch { + val projectRecord = getProjectRecord(projectId) + if (projectRecord == null) { + switchContent(null, null) + return@launch + } + + if (projectRecord.getProjectType() == ProjectType.HEIGHT_TRAVERSE.flag) { + loadHeightTraverseData(projectRecord) + } else { + loadNotHeightTraverseData(projectRecord) + } + } + } + + /** + * 加载三角导线和联系测量数据 + */ + private suspend fun loadNotHeightTraverseData(projectRecord: ProjectRecord) { + val cycleRecord = getPeriodRecord(projectRecord.getId()) + + val fragment = + if (cycleRecord == null) + EmptyFragment() + else ComponentSurveyorStationListFragment.newInstance( + projectRecord.getId(), + cycleRecord.getId(), + false + ) + + switchContent( + getFilterTitle(projectRecord.getProjectName(), cycleRecord?.getName()), + fragment + ) + } + + /** + * 加载高程导线数据 + */ + private suspend fun loadHeightTraverseData(projectRecord: ProjectRecord) { + val routeRecord = getRouteRecord(projectRecord.getId()) + + val fragment = + if (routeRecord == null) + EmptyFragment() + else SurveyorRouteStationFragment.newInstance( + projectRecord.getId(), + routeRecord.getId() + ) + + switchContent( + getFilterTitle(projectRecord.getProjectName(), routeRecord?.routeName), + fragment + ) + } + + private fun getFilterTitle(projectName: String, secondName: String?): String { + val suffix = if (secondName == null) "" else " > $secondName" + return projectName + suffix + } + + private suspend fun switchContent(title: String?, fragment: Fragment?) { + withContext(Dispatchers.Main) { + setFilterTitle(title) + val targetFragment = fragment ?: EmptyFragment() + childFragmentManager + .beginTransaction() + .replace(R.id.fragment_container, targetFragment, null) + .commit() + } + } + + private fun setFilterTitle(title: String?) { + if (TextUtils.isEmpty(title)) { + mBinding.title.visibility = View.INVISIBLE + } else { + mBinding.title.visibility = View.VISIBLE + mBinding.titleView.text = title + } + } + + private suspend fun getProjectRecord(projectId: String?): ProjectRecord? { + return withContext(Dispatchers.IO) { + val projectRecord = + SurveyorDatabaseFactory.instance.projectDataSource.getRecord(projectId) + if (projectRecord != null) { + return@withContext projectRecord + } + SurveyorDatabaseFactory.instance.projectDataSource.defaultRecordSync + } + } + + private suspend fun getPeriodRecord( + projectId: String, + ): SurveyorPeriodRecord? { + return withContext(Dispatchers.IO) { + val defaultPeriodId = SurveyorDatabaseFactory.instance + .configDataSource.getByKeySync(ConfigConstants.KEY_DEFAULT_PERIOD_ID)?.configValue + val periodRecord = + SurveyorDatabaseFactory.instance.surveyorPeriod.getByIdAndProjectId( + defaultPeriodId, + projectId + ) + if (periodRecord != null) { + return@withContext periodRecord + } + SurveyorDatabaseFactory.instance.surveyorPeriod.getDefaultSync(projectId) + } + } + + private suspend fun getRouteRecord( + projectId: String, + ): RouteRecord? { + return withContext(Dispatchers.IO) { + val defaultRouteId = SurveyorDatabaseFactory.instance + .configDataSource.getByKeySync(ConfigConstants.KEY_DEFAULT_ROUTE_ID)?.configValue + val routeRecord = + SurveyorDatabaseFactory.instance.getRouteDataSource() + .getByIdAndProjectId(defaultRouteId, projectId) + if (routeRecord != null) { + return@withContext routeRecord + } + SurveyorDatabaseFactory.instance.getRouteDataSource() + .getDefault(projectId) + } + } + + private fun isHeightTraverse(): Boolean { + return selectProjectTypeTag == ProjectType.HEIGHT_TRAVERSE.flag + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/PickPointFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/PickPointFragment.java new file mode 100644 index 0000000..494c36e --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/PickPointFragment.java @@ -0,0 +1,177 @@ +package com.bingce.controlnetwork.fragment; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ExpandableListView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.IPointDataSource; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.KnownAndUnknownPoints; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.adapter.AbstractPointSelectAdapter; +import com.bingce.controlnetwork.adapter.PointSelectAdapter; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.utils.ThreadPoolUtil; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class PickPointFragment extends BaseFragment { + public static final String TAG = PickPointFragment.class.getName(); + AbstractPointSelectAdapter adapter; + + @Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + //读取数据类型 + int maxCount = -1; + if (getArguments() != null) { + maxCount = getArguments().getInt(KEY_MAX_COUNT, -1); + } + View view = inflater.inflate(R.layout.fragment_pick_point_bottom_sheet_layout, container, false); + if (view instanceof ExpandableListView) { + ExpandableListView expandableListView = (ExpandableListView) view; + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + List filterId = getArguments().getStringArrayList(KEY_FILTER); + PickPointResult pickPointResult = getArguments().getParcelable(BundleConstants.KEY_RESULT); + + int finalMaxCount1 = maxCount; + ThreadPoolUtil.execute(() -> { + IPointDataSource pointDataSource = + SurveyorDatabaseFactory.instance.getPointDataSource(); + List globalControlPoints = pointDataSource + .getListByProjectId(PointRecord.GLOBAL_CONTROL_POINT_PROJECT_ID, PointRecord.TYPE_GLOBAL_POINT); + + KnownAndUnknownPoints knownAndUnknownPoints = + KnownAndUnknownPoints.loadData(false, filterId, projectId); + + List filterName = new ArrayList<>(); + if (filterId != null) { + for (String id : filterId) { + PointRecord record = pointDataSource.findByIdSync(id); + if (record == null) { + continue; + } + filterName.add(record.getName()); + } + } + + //过滤全局控制点 + List others = new ArrayList<>(); + for (PointRecord pointRecord : globalControlPoints) { + if ((filterId != null && filterId.contains(pointRecord.getId())) || + filterName.contains(pointRecord.getName()) || + knownAndUnknownPoints.containsKnownPoint(pointRecord)) { + continue; + } + others.add(pointRecord); + } + adapter = new PointSelectAdapter(knownAndUnknownPoints, others, + pickPointResult, + finalMaxCount1, getContext()); + runOnUI(() -> { + expandableListView.setAdapter(adapter); + int groupCount = adapter.getGroupCount(); + for (int index = 0; index < groupCount; index++) { + expandableListView.expandGroup(index); + } + }); + }); + } + setHasOptionsMenu(true); + return view; + } + + @Override + public void onCreateOptionsMenu(@NonNull @NotNull Menu menu, @NonNull @NotNull MenuInflater inflater) { + inflater.inflate(R.menu.menu_confirm, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(@NonNull @NotNull MenuItem item) { + if (item.getItemId() == R.id.menu_confirm) { + Intent intent = new Intent(); + PickPointResult pickPointResult = new PickPointResult(); + pickPointResult.setSelectedIds(adapter.getSelectedId()); + pickPointResult.setSelectedNames(adapter.getSelectedName()); + intent.putExtra(BundleConstants.KEY_RESULT, pickPointResult); + if (getArguments() != null) { + intent.putExtra(KEY_TYPE, getArguments().getString(KEY_TYPE)); + } + Activity activity = getActivity(); + if (activity != null) { + activity.setResult(Activity.RESULT_OK, intent); + activity.finish(); + } + } + return super.onOptionsItemSelected(item); + } + + public static final String KEY_TYPE = "__TYPE"; + private static final String KEY_FILTER = "__filter__id"; + private static final String KEY_MAX_COUNT = "__key__max_count"; + private static final String KEY_POINT_TYPE = "__point_type"; + + public static PickPointFragment newInstance(Bundle args) { + PickPointFragment pickPointFragment = new PickPointFragment(); + pickPointFragment.setArguments(args); + return pickPointFragment; + } + + public static ActivityResultLauncher createActivityLauncher(Fragment fragment, IOnSelectCallback selectCallback) { + return fragment.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result != null && Activity.RESULT_OK == result.getResultCode()) { + Intent intent = result.getData(); + if (intent != null) { + PickPointResult pickPointResult = intent.getParcelableExtra(BundleConstants.KEY_RESULT); + String type = intent.getStringExtra(KEY_TYPE); + selectCallback.onSelect(type, pickPointResult); + } + } + }); + } + + public static void pickPoint(Context context, + String type, + int maxCount, + String title, + List filterPointId, String projectId, + PickPointResult result, ActivityResultLauncher launcher) { + if (launcher == null) { + return; + } + Bundle args = new Bundle(); + + args.putString(BundleConstants.KEY_PROJECT_ID, projectId); + args.putString(KEY_TYPE, type); + args.putInt(KEY_MAX_COUNT, maxCount); + args.putStringArrayList(KEY_FILTER, (ArrayList) filterPointId); + args.putParcelable(BundleConstants.KEY_RESULT, result); + launcher.launch(FragmentContainerActivity.startIntent(context, TAG, title, args)); + } + + public interface IOnSelectCallback { + void onSelect(String type, PickPointResult result); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/PointFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/PointFragment.java new file mode 100644 index 0000000..2b3fa73 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/PointFragment.java @@ -0,0 +1,362 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.FragmentPointLayoutBinding; +import com.bingce.utils.SoftKeyUtils; +import com.bingce.utils.ThreadPoolUtil; +import com.rengwuxian.materialedittext.MaterialEditText; + +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; + +import blankj.utilcode.util.ToastUtils; + +/** + * 新建或编辑点 + */ +public class PointFragment extends DialogFragment { + + private FragmentPointLayoutBinding mBinding; + + private PointFragment() { + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStyle(STYLE_NORMAL, R.style.Dialog_FullScreen); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + mBinding = null; + } + + @Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + mBinding = FragmentPointLayoutBinding.inflate(inflater, container, false); + return mBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initListener(); + initData(); + } + + private void initListener() { + + mBinding.getRoot().setOnClickListener(v -> dismissPointFragment()); + + mBinding.cancel.setOnClickListener(v -> dismissPointFragment()); + + mBinding.next.setOnClickListener(v -> checkSave(isCanSave -> { + if (!isCanSave) return; + saveCurrnetPoint(); + startNextPointPre(); + })); + + mBinding.confirm.setOnClickListener(v -> checkSave(isCanSave -> { + if (!isCanSave) return; + saveCurrnetPoint(); + dismissPointFragment(); + })); + + } + + private void startNextPointPre() { + runOnUI(() -> { + //编号+1 + String indexString = string(mBinding.number); + int index = 1; + try { + index = Integer.parseInt(indexString) + 1; + } catch (Exception ignored) { + ignored.printStackTrace(); + } + mBinding.number.setText(String.format(Locale.getDefault(), "%03d", index)); + clearXYZ(mBinding.pointX, mBinding.pointY, mBinding.pointZ); + }); + } + + @WorkerThread + private void saveCurrnetPoint() { + String pointName = pointName(mBinding.prefix, mBinding.number, mBinding.suffix); + + double x = doubleValue(mBinding.pointX); + double y = doubleValue(mBinding.pointY); + double z = doubleValue(mBinding.pointZ); + + if (isEdit()) { + String pointId = getPointId(); + PointRecord pointRecord = SurveyorDatabaseFactory.instance.getPointDataSource().findByIdSync(pointId); + pointRecord.name = pointName; + pointRecord.x = x; + pointRecord.y = y; + pointRecord.z = z; + pointRecord.code = ""; + pointRecord.remarks = ""; + SurveyorDatabaseFactory.instance.getPointDataSource().update(pointRecord); + } else { + PointRecord pointRecord = PointRecord.point( + getProjectId(), getPointType(), pointName, "", x, y, z, "", -1); + SurveyorDatabaseFactory + .instance + .getPointDataSource() + .saveSync(pointRecord); + } + } + + /** + * 初始化编辑数据 + */ + private void initData() { + boolean isEdit = isEdit(); + + mBinding.title.setText(isEdit ? R.string.edit_point : R.string.new_point); + + if (isEdit) { + mBinding.number.setVisibility(View.GONE); + mBinding.suffix.setVisibility(View.GONE); + mBinding.next.setVisibility(View.GONE); + + setString(mBinding.prefix, getArguments(), KEY_POINT_NAME); + String label = getString(R.string.point_name); + mBinding.prefix.setFloatingLabelText(label); + mBinding.prefix.setHint(label); + + setDouble(mBinding.pointX, getArguments(), KEY_POINT_X); + setDouble(mBinding.pointY, getArguments(), KEY_POINT_Y); + setDouble(mBinding.pointZ, getArguments(), KEY_POINT_Z); + } + } + + private void runOnUI(Runnable runnable) { + if (getActivity() != null) { + getActivity().runOnUiThread(runnable); + } + } + + private void clearXYZ(MaterialEditText x, MaterialEditText y, MaterialEditText z) { + if (x != null) { + x.setText(null); + } + if (y != null) { + y.setText(null); + } + if (z != null) { + z.setText(null); + } + } + + private String string(MaterialEditText editText) { + if (editText == null || editText.getText() == null) { + return ""; + } + return editText.getText().toString(); + } + + private double doubleValue(MaterialEditText editText) { + String string = string(editText); + if (string.isEmpty()) { + return 0; + } + return Double.parseDouble(string); + } + + private void setString(MaterialEditText editText, Bundle args, String key) { + if (editText == null || args == null) { + return; + } + editText.setText(args.getString(key)); + } + + private void setDouble(MaterialEditText editText, Bundle args, String key) { + if (editText == null || args == null) { + return; + } + editText.setText(String.valueOf(args.getDouble(key))); + } + + private String pointName(final MaterialEditText prefix, + final MaterialEditText numberCome, + final MaterialEditText suffix) { + String number = string(numberCome); + if (number.isEmpty()) { + return string(prefix) + string(suffix); + } + long value = 0; + try { + value = Long.parseLong(number); + } catch (NumberFormatException ignored) { + + } + String result = String.format(Locale.getDefault(), "%s%03d%s", string(prefix), value, string(suffix)); + return result.replace(",", ""); + } + + private boolean checkXYValidate(MaterialEditText x, MaterialEditText y) { + return x != null && y != null && + x.getText() != null && y.getText() != null && + !x.getText().toString().isEmpty() && !y.getText().toString().isEmpty(); + } + + private static final String KEY_PROJECT_ID = "___project__id"; + private static final String KEY_POINT_TYPE = "___point_type__"; + private static final String KEY_POINT_NAME = "___point_name__"; + private static final String KEY_POINT_ID = "___point_id"; + private static final String KEY_POINT_X = "___point_x"; + private static final String KEY_POINT_Y = "___point_y"; + private static final String KEY_POINT_Z = "__point_z"; + + private static final String KEY_TYPE = "_TYPE_"; + private static final String VALUE_NEW = "___new___"; + private static final String VALUE_EDIT = "___edit___"; + + + public static void start(FragmentManager fragmentManager, + String projectId, + String pointType) { + Bundle args = new Bundle(); + args.putString(KEY_PROJECT_ID, projectId); + args.putString(KEY_POINT_TYPE, pointType); + show(fragmentManager, args); + } + + + public static void edit(FragmentManager fragmentManager, + String projectId, + String pointName, + String pointId, + String pointType, + double x, + double y, + double z) { + Bundle args = new Bundle(); + args.putString(KEY_PROJECT_ID, projectId); + args.putString(KEY_POINT_NAME, pointName); + args.putString(KEY_POINT_ID, pointId); + args.putString(KEY_POINT_TYPE, pointType); + + args.putDouble(KEY_POINT_X, x); + args.putDouble(KEY_POINT_Y, y); + args.putDouble(KEY_POINT_Z, z); + args.putString(KEY_TYPE, VALUE_EDIT); + + show(fragmentManager, args); + } + + + private static void show(FragmentManager fragmentManager, + Bundle args) { + PointFragment fragment = new PointFragment(); + if (args != null) { + fragment.setArguments(args); + } + fragment.show(fragmentManager, PointFragment.class.getName()); + } + + public interface ICallback { + void onGet(String pointName, double x, double y, double z); + } + + private void showPointSameNameDialogHint() { + ThreadPoolUtil.executeInMain(() -> { + //点名重复,提示 + TipsFragment.tipsOnly( + getChildFragmentManager(), + getViewLifecycleOwner(), + requireContext(), + Tools.getString(R.string.same_project_ponit_point_cannot_repeate)); + }); + } + + private boolean isEdit() { + if (getArguments() != null) { + return VALUE_EDIT.equals(getArguments().getString(KEY_TYPE, VALUE_NEW)); + } + return false; + } + + private String getProjectId() { + if (getArguments() != null) { + return getArguments().getString(KEY_PROJECT_ID); + } + return null; + } + + private String getPointId() { + if (getArguments() != null) { + return getArguments().getString(KEY_POINT_ID); + } + return null; + } + + private String getPointType() { + if (getArguments() != null) { + return getArguments().getString(KEY_POINT_TYPE); + } + return null; + } + + private boolean isKnownPoint(String pointType) { + return PointRecord.TYPE_KNOWN_POINT.equals(pointType) || PointRecord.TYPE_GLOBAL_POINT.equals(pointType); + } + + private void checkSave(ICallBackSave callBackSave) { + String pointName = pointName(mBinding.prefix, mBinding.number, mBinding.suffix);//string(prefix) + string(number) + string(suffix); + if (pointName.isEmpty()) { + ToastUtils.showShort(R.string.point_name_cannot_be_empty); + callBackSave.result(false); + return; + } + + if (isKnownPoint(getPointType()) && !checkXYValidate(mBinding.pointX, mBinding.pointY)) { + ToastUtils.showShort(R.string.error_tips_known_point_x_y_cannt_be_empty); + callBackSave.result(false); + return; + } + + ThreadPoolUtil.execute(() -> { + boolean sameName = PointUtil.isSameName(getProjectId(), pointName, getPointId()); + if (sameName) { + showPointSameNameDialogHint(); + callBackSave.result(false); + return; + } + callBackSave.result(true); + }); + } + + private void dismissPointFragment() { + runOnUI(() -> { + SoftKeyUtils.hideSoftKey(); + dismiss(); + }); + } + + private interface ICallBackSave { + void result(boolean isCanSave); + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/PointListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/PointListFragment.java new file mode 100644 index 0000000..8e81de2 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/PointListFragment.java @@ -0,0 +1,174 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlapphelper.util.importpoint.ImportPointsUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.adapter.PointRecordAdapter; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.Collections; +import java.util.List; + +/** + * 点列表 + */ +public class PointListFragment extends AbstractRecyclerViewFragment { + public static final String TAG = PointListFragment.class.getName(); + private PointRecordAdapter adapter; + @NonNull + private final ImportPointsUtil importPointsUtil; + + public PointListFragment() { + importPointsUtil = new ImportPointsUtil(this); + } + + @Override + protected void refreshRecyclerView(RecyclerView recyclerView) { + if (getArguments() == null) { + return; + } + String pointType = getArguments().getString(KEY_TYPE, PointRecord.TYPE_GLOBAL_POINT); + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + SurveyorDatabaseFactory + .instance + .getPointDataSource() + .getLiveDataListByProject(projectId, pointType) + .observe(getViewLifecycleOwner(), pointRecords -> updateData(pointRecords, recyclerView)); + } + + private void updateData(List pointRecords, RecyclerView recyclerView) { + //排序 + Collections.sort(pointRecords, (o1, o2) -> { + if (o1.getCreateDate().before(o2.getCreateDate())) { + return -1; + } else if (o1.getCreateDate().after(o2.getCreateDate())) { + return 1; + } + if (o1.getOrderIndex() < o2.getOrderIndex()) { + return -1; + } else if (o1.getOrderIndex() > o2.getOrderIndex()) { + return 1; + } + return 0; + }); + if (adapter == null) { + if (getActivity() == null) { + return; + } + adapter = new PointRecordAdapter(pointRecords, getActivity()); + recyclerView.setAdapter(adapter); + } else { + adapter.updateData(pointRecords); + } + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + inflater.inflate(R.menu.menu_import_and_clear, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + int id = item.getItemId(); + if (getArguments() != null) { + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + String pointType = getArguments().getString(KEY_TYPE, PointRecord.TYPE_GLOBAL_POINT); + if (id == R.id.menu_item_import) { + //导入 + importPointsUtil.showImportDialog(projectId, pointType); + } else if (id == R.id.menu_item_clear) { + //清空 + TipsFragment.cancelAbleTips(getChildFragmentManager(), + getViewLifecycleOwner(), + getContext(), + getClearPointHint(pointType), + 4, + () -> clearPoints(projectId, pointType)); + } else if (R.id.menu_item_add == id) { + //新建点 + PointFragment.start(getChildFragmentManager(), + projectId, + pointType); + } + } + return super.onOptionsItemSelected(item); + } + + private String getClearPointHint(String pointType) { + //getString(R.string.tips_ready_2_clear_all_known_point), + String s = ""; + if (PointRecord.TYPE_KNOWN_POINT.equals(pointType)) { + s = Tools.getString(R.string.clear_point_list_hint, Tools.getString(R.string.control_point)); + } else if (PointRecord.TYPE_UNKNOWN_POINT.equals(pointType)) { + s = Tools.getString(R.string.clear_point_list_hint, Tools.getString(R.string.unknown_point)); + } else if (PointRecord.TYPE_GLOBAL_POINT.equals(pointType)) { + s = Tools.getString(R.string.clear_point_list_hint, Tools.getString(R.string.global_control_point)); + } + return s; + } + + private void clearPoints(String projectId, String pointType) { + ThreadPoolUtil.execute(() -> PointUtil.clearPointRecord(projectId, pointType)); + } + + private final static String KEY_TYPE = "___KEY___"; + + /** + * 去未知点列表 + * + * @param projectId + * @param context + */ + public static void go2UnknownPointList(String projectId, Context context) { + Bundle bundle = new Bundle(); + bundle.putString(KEY_TYPE, PointRecord.TYPE_UNKNOWN_POINT); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + FragmentContainerActivity.start(context, TAG, R.string.project_unknown_points, bundle); + } + + /** + * 去已知点列表 + * + * @param projectId + * @param context + */ + public static void go2KnownPointList(String projectId, Context context) { + Bundle bundle = new Bundle(); + bundle.putString(KEY_TYPE, PointRecord.TYPE_KNOWN_POINT); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + FragmentContainerActivity.start(context, TAG, R.string.project_known_points, bundle); + } + + /** + * 去全局控制点 + * + * @param context + */ + public static void go2GlobalPointList(Context context) { + Bundle bundle = new Bundle(); + bundle.putString(KEY_TYPE, PointRecord.TYPE_GLOBAL_POINT); + bundle.putString(BundleConstants.KEY_PROJECT_ID, PointRecord.GLOBAL_CONTROL_POINT_PROJECT_ID); + FragmentContainerActivity.start(context, TAG, R.string.global_control_point, bundle); + } + + public static PointListFragment newInstance(Bundle bundle) { + PointListFragment fragment = new PointListFragment(); + fragment.setArguments(bundle); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/PrismManageFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/PrismManageFragment.java new file mode 100644 index 0000000..d398962 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/PrismManageFragment.java @@ -0,0 +1,159 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.prism.IPrismManagerDataSource; +import com.bingce.controlapphelper.datasource.database.prism.PrismConstants; +import com.bingce.controlapphelper.datasource.database.prism.PrismRecord; +import com.bingce.controlnetwork.adapter.PrismMagegeAdapter; +import com.bingce.utils.ThreadPoolUtil; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.adapter.PrismMagegeAdapter; +import com.bingce.controlnetwork.adapter.contextmenu.ContextMenuDeleteEdit; +import com.bingce.controlnetwork.fragment.base.BaseFragment; + +/** + * 棱镜管理 + */ +public class PrismManageFragment extends BaseFragment { + + public static final String TAG = PrismManageFragment.class.getName(); + private PrismMagegeAdapter adapter = null; + private RecyclerView recyclerView; + + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + + } + + @Nullable + @org.jetbrains.annotations.Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_prism_manager, container, false); + recyclerView = rootView.findViewById(R.id.list); + View createButton = rootView.findViewById(R.id.create_new); + if (createButton != null) { + createButton.setOnClickListener(this::createCustom); + } + return rootView; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initData(); + } + + private void initData() { + IPrismManagerDataSource prismManagerDataSource = SurveyorDatabaseFactory.instance.getPrismManagerDataSource(); + prismManagerDataSource.getAllRecordLiveData().observe(getViewLifecycleOwner(), prismRecords -> { + if (prismRecords == null) return; + if (adapter == null) { + adapter = new _Adapter( + prismRecords, + item -> { + + }); + recyclerView.setAdapter(adapter); + } else { + adapter.updateData(prismRecords); + } + + + }); + + + } + + /** + * 创建自定义 + * + * @param view + */ + private void createCustom(View view) { + PrismManagerCreateCustomFragment.create(getChildFragmentManager(), getViewLifecycleOwner(), (nameBefore, name, typeLarge, constant) -> { + //选择完的结果 + ThreadPoolUtil.execute(() -> { + PrismRecord record = PrismRecord.createRecord(name, PrismConstants.TYPE_USER, constant, PrismRecord.MODIFY_ALLOW, typeLarge); + SurveyorDatabaseFactory.instance.getPrismManagerDataSource().saveRecord(record); + }); + }); + } + + private void editCustom(PrismRecord item) { + PrismManagerCreateCustomFragment.edit(getChildFragmentManager(), + getViewLifecycleOwner(), + item.prismTypeName, item.prismTypeLarge, item.prismTypeConstant, + (nameBefore, name, typeLarge, constant) -> ThreadPoolUtil.execute(() -> { + IPrismManagerDataSource prismManagerDataSource = SurveyorDatabaseFactory.instance.getPrismManagerDataSource(); + PrismRecord record = prismManagerDataSource.getPrismTypeNameSync(nameBefore); + if (record != null) { + record.prismTypeName = name; + record.prismType = PrismConstants.TYPE_USER; + record.prismTypeConstant = constant; + record.prismTypeLarge = typeLarge; + prismManagerDataSource.update(record); + } + })); + } + + private class _Adapter extends PrismMagegeAdapter { + public _Adapter( + List records, + IOnItemClick callback) { + super(records == null ? new ArrayList<>() : records, + callback, + new ContextMenuDeleteEdit() { + @Override + protected void delete(PrismRecord item) { + ThreadPoolUtil.execute(() -> { + IPrismManagerDataSource prismManagerDataSource = SurveyorDatabaseFactory.instance.getPrismManagerDataSource(); + prismManagerDataSource.delete(item); + }); + } + + @Override + protected void edit(PrismRecord item) { + editCustom(item); + } + }); + } + + + } + + /** + * 启动方法 + * + * @param context + */ + public static void start(Context context) { + Bundle bundle = new Bundle(); + FragmentContainerActivity.start(context, TAG, R.string.prism_manager, bundle); + } + + public static PrismManageFragment newInstance(Bundle bundle) { + PrismManageFragment fragment = new PrismManageFragment(); + fragment.setArguments(bundle); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/PrismManagerCreateCustomFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/PrismManagerCreateCustomFragment.java new file mode 100644 index 0000000..52db430 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/PrismManagerCreateCustomFragment.java @@ -0,0 +1,277 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.prism.IPrismManagerDataSource; +import com.bingce.controlapphelper.datasource.database.prism.PrismConstants; +import com.bingce.controlapphelper.datasource.database.prism.PrismRecord; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.utils.SoftKeyUtils; +import com.bingce.utils.ThreadPoolUtil; +import com.rengwuxian.materialedittext.MaterialEditText; + +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +/** + * 新建自定义棱镜类型 + */ +public class PrismManagerCreateCustomFragment extends DialogFragment { + + private final String[] spinnerData = {PrismConstants.TYPE_PRISM_LARGE, PrismConstants.TYPE_TAPE_LARGE}; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStyle(STYLE_NORMAL, R.style.Dialog_FullScreen); + } + + @Nullable + @org.jetbrains.annotations.Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + View contentView = inflater.inflate(R.layout.fragment_prism_manager_create_custom, container, false); + if (contentView != null) { + contentView.setOnClickListener(v -> { + SoftKeyUtils.hideSoftKey(); + dismiss(); + }); + String type = VALUE_NEW; + String prismTypeName = ""; + String prismTypeType = ""; + String prismTypeConstant = ""; + if (getArguments() != null) { + type = getArguments().getString(KEY_TYPE, VALUE_NEW); + prismTypeName = getArguments().getString(KEY_PRISM_TYPE_NAME); + prismTypeType = getArguments().getString(KEY_PRISM_TYPE_LARGE); + prismTypeConstant = getArguments().getString(KEY_PRISM_TYPE_CONSTANT); + } + //设置标题 + TextView title = contentView.findViewById(R.id.title); + if (title != null) { + if (VALUE_NEW.equals(type)) { + title.setText(Tools.getString(R.string.text_create_new_surveyor_station)); + } else if (VALUE_EDIT.equals(type)) { + title.setText(Tools.getString(R.string.menu_edit)); + } + } + + MaterialEditText etName = contentView.findViewById(R.id.etName); + Spinner spinner = contentView.findViewById(R.id.spinner); + MaterialEditText etContant = contentView.findViewById(R.id.etContant); + + List spinnerDataList = Arrays.asList(spinnerData); + spinner.setAdapter(new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, spinnerDataList)); + + //编辑的时候重新赋值 + if (VALUE_EDIT.equals(type)) { + //设置值 + etName.setText(prismTypeName); + if (!TextUtils.isEmpty(prismTypeName)) { + etName.setSelection(prismTypeName.length()); + } + etContant.setText(prismTypeConstant); + spinner.setSelection(spinnerDataList.indexOf(prismTypeType)); + } + + IPrismManagerDataSource prismManagerDataSource = SurveyorDatabaseFactory.instance.getPrismManagerDataSource(); + + Button confirm = contentView.findViewById(R.id.confirm); + if (confirm != null) { + String finalPrismTypeNameBefore = prismTypeName; + String finalType = type; + confirm.setOnClickListener(v -> { + String name = string(etName); + if (name.isEmpty()) { + ToastUtils.showShort(R.string.name_is_required); + return; + } + String constant = string(etContant); + if (constant.isEmpty()) { + ToastUtils.showShort(R.string.absolute_constants_cannot_be_empty); + return; + } + double constantD = Double.parseDouble(constant); + if (constantD > 0) { + ToastUtils.showShort(R.string.absolute_constants_must_be_negative); + return; + } + + String selectedItem = (String) spinner.getSelectedItem(); + + //检测名称是否重复 + ThreadPoolUtil.execute(() -> { + PrismRecord prismRecord = prismManagerDataSource.getPrismTypeNameSync(name); + + if (VALUE_NEW.equals(finalType)) { + if (prismRecord != null) { + //点名重复,提示 + TipsFragment.tipsOnly( + getChildFragmentManager(), + getViewLifecycleOwner(), + getContext(), + Tools.getString(R.string.custom_name_cannot_be_repeated)); + return; + } + } + + //1.新建没有重名 + //2.编辑 + runOnUI(() -> { + onCallback(finalPrismTypeNameBefore, name, selectedItem, constant, getParentFragmentManager()); + SoftKeyUtils.hideSoftKey(); + dismiss(); + }); + + + }); + }); + } + Button cancel = contentView.findViewById(R.id.cancel); + if (cancel != null) { + cancel.setOnClickListener(v -> { + SoftKeyUtils.hideSoftKey(); + dismiss(); + }); + } + + } + return contentView; + } + + private void runOnUI(Runnable runnable) { + if (getActivity() != null) { + getActivity().runOnUiThread(runnable); + } + } + + private PrismManagerCreateCustomFragment() { + } + + private static void onCallback( + final String nameBefore, + final String name, + final String type, + final String constant, + final FragmentManager fragmentManager) { + Bundle args = new Bundle(); + + args.putString(KEY_PRISM_TYPE_NAME_BEFORE, nameBefore); + args.putString(KEY_PRISM_TYPE_NAME, name); + args.putString(KEY_PRISM_TYPE_LARGE, type); + args.putString(KEY_PRISM_TYPE_CONSTANT, constant); + + fragmentManager.setFragmentResult(KEY_REQUEST_INPUT, args); + } + + private static String string(MaterialEditText editText) { + if (editText == null || editText.getText() == null) { + return ""; + } + return editText.getText().toString().trim(); + } + + private static double doubleValue(MaterialEditText editText) { + String string = string(editText); + if (string.isEmpty()) { + return 0; + } + return Double.parseDouble(string); + } + + private static void setString(MaterialEditText editText, Bundle args, String key) { + if (editText == null || args == null) { + return; + } + editText.setText(args.getString(key)); + } + + + private static final String KEY_PRISM_TYPE_NAME = "KEY_PRISM_TYPE_NAME"; + private static final String KEY_PRISM_TYPE_NAME_BEFORE = "KEY_PRISM_TYPE_NAME_BEFORE"; + private static final String KEY_PRISM_TYPE_LARGE = "KEY_PRISM_TYPE_LARGE"; + private static final String KEY_PRISM_TYPE_CONSTANT = "KEY_PRISM_TYPE_CONSTANT"; + + private static final String KEY_TYPE = "KEY_TYPE"; + private static final String VALUE_NEW = "___new___"; + private static final String VALUE_EDIT = "___edit___"; + + private static final String KEY_REQUEST_INPUT = "___request__code___"; + + public static void create(FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + @Nullable ICallback callback) { + Bundle args = new Bundle(); + show(fragmentManager, lifecycleOwner, args, callback); + } + + + public static void edit(FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + String prismTypeName, + String prismTypeLarge, + String prismTypeConstant, + @Nullable ICallback callback) { + Bundle args = new Bundle(); + args.putString(KEY_PRISM_TYPE_NAME, prismTypeName); + args.putString(KEY_PRISM_TYPE_LARGE, prismTypeLarge); + args.putString(KEY_PRISM_TYPE_CONSTANT, prismTypeConstant); + args.putString(KEY_TYPE, VALUE_EDIT); + + show(fragmentManager, lifecycleOwner, args, callback); + } + + + private static void show(FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + @Nullable Bundle args, + @Nullable ICallback callback) { + PrismManagerCreateCustomFragment fragment = new PrismManagerCreateCustomFragment(); + if (args != null) { + fragment.setArguments(args); + } + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_INPUT, + lifecycleOwner, + (key, result) -> { + if (KEY_REQUEST_INPUT.equals(key)) { + if (callback == null) { + return; + } + callback.onGet( + result.getString(KEY_PRISM_TYPE_NAME_BEFORE, ""), + result.getString(KEY_PRISM_TYPE_NAME, ""), + result.getString(KEY_PRISM_TYPE_LARGE, ""), + result.getString(KEY_PRISM_TYPE_CONSTANT, "") + ); + } + }); + fragment.show(fragmentManager, PrismManagerCreateCustomFragment.class.getName()); + } + + public interface ICallback { + void onGet(String nameBefore, String name, String typeLarge, String constant); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ProjectListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ProjectListFragment.java new file mode 100644 index 0000000..3eef7cb --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ProjectListFragment.java @@ -0,0 +1,230 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.event.DatabaseReadyEvent; +import com.bingce.controlnetwork.adapter.ProjectListAdapter; +import com.bingce.controlnetwork.guide.GuideSequence; +import com.bingce.controlnetwork.guide.ITapTargetProvider; +import com.bingce.surveyor.agentweb.AgentWebActivity; +import com.bingce.utils.ThreadPoolUtil; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.ProjectListAdapter; +import com.bingce.controlnetwork.fragment.projectdetail.ProjectDetailFragment; +import com.bingce.controlnetwork.fragment.projectedit.AbstractProjectEditFragment; +import com.bingce.controlnetwork.guide.GuideSequence; +import com.bingce.controlnetwork.guide.ITapTargetProvider; + +import jp.wasabeef.recyclerview.animators.FadeInLeftAnimator; + +/** + * 主页面-项目 + */ +public class ProjectListFragment extends Fragment { + private ProjectListAdapter projectListAdapter; + private final GuideSequence createProjectGuide; + private final GuideSequence modifyProjectGuide; + private final IConfigDataSource configDataSource = + SurveyorDatabaseFactory.instance.getConfigDataSource(); + + private static final int GUIDE_INDEX_PROJECT_NEW = 0; + private static final int GUIDE_INDEX_PROJECT_MODIFY = 0; + + public ProjectListFragment() { + createProjectGuide = new GuideSequence(GUIDE_INDEX_PROJECT_NEW + 1, new GuideSequence.IDelegate() { + @Override + public void show(int index, ITapTargetProvider provider) { + if (index == GUIDE_INDEX_PROJECT_NEW) { + if (getView() != null && getActivity() != null) { + provider.show4View( + getActivity(), + getView().findViewById(R.id.create_new), + getString(R.string.guide_create_new_project), null); + } + } + } + + @Override + public void dismiss(int index) { + ConfigConstants.markGuideCompleted(ConfigConstants.KEY_GUIDE_NEW_PROJECT, configDataSource); + } + }); + modifyProjectGuide = new GuideSequence(GUIDE_INDEX_PROJECT_MODIFY + 1, new GuideSequence.IDelegate() { + @Override + public void show(int index, ITapTargetProvider provider) { + if (index == GUIDE_INDEX_PROJECT_MODIFY) { + if (getView() != null && getActivity() != null) { + provider.show4View( + getActivity(), + getView().findViewById(R.id.tap_placeholder), + getString(R.string.guide_edit_project), + getString(R.string.tips_project_list_edit_describe)); + } + } + } + + @Override + public void dismiss(int index) { + ConfigConstants.markGuideCompleted(ConfigConstants.KEY_GUIDE_MODIFY_PROJECT, configDataSource); + } + }); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_project_list, container, false); + initCreateNewProject(view); + return view; + } + + /** + * 新建项目 + * + * @param view onCreateView的view + */ + private void initCreateNewProject(View view) { + View createNew = view.findViewById(R.id.create_new); + if (createNew != null) { + createNew.setOnClickListener(v -> { + //选择项目类型 + SelectProjectTypeFragment + .start( + getChildFragmentManager(), + getViewLifecycleOwner(), + projectType -> { + //新建项目的弹框 + AbstractProjectEditFragment.createProject(getChildFragmentManager(), requireContext(), projectType); + }); + }); + } + } + + @Override + public void onStart() { + super.onStart(); + refreshData(); + } + + @Override + public void onStop() { + super.onStop(); + if (EventBus.getDefault().isRegistered(this)) { + EventBus.getDefault().unregister(this); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(DatabaseReadyEvent event) { + refreshData(); + } + + private void refreshData() { + View view = getView(); + if (view == null) { + return; + } + //显示引导 + ThreadPoolUtil.execute(() -> { + int index = -1; + if (!ConfigConstants.isGuideCompleted(ConfigConstants.KEY_GUIDE_NEW_PROJECT, configDataSource)) { + index = 0; + } + int finalIndex = index; + ThreadPoolUtil.executeInMain(() -> createProjectGuide.start(finalIndex)); + }); + + RecyclerView recyclerView = view.findViewById(R.id.recycler_view_project_list); + if (recyclerView.getAdapter() != null) { + return; + } + if (projectListAdapter == null) { + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + recyclerView.setItemAnimator(new FadeInLeftAnimator()); + if (getContext() != null) { + projectListAdapter = new ProjectListAdapter( + this::goProjectDetail, + getContext(), + runnable -> { + if (getActivity() != null) { + getActivity().runOnUiThread(runnable); + } + }, + getViewLifecycleOwner(), + getChildFragmentManager()); + recyclerView.setAdapter(projectListAdapter); + } + } + SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getLiveDataList() + .observe(getViewLifecycleOwner(), projectRecords -> { + + projectListAdapter.updateData(projectRecords); + + //显示引导 + if (projectRecords == null || projectRecords.isEmpty()) { + return; + } + ThreadPoolUtil.execute(() -> { + int index = -1; + if (!ConfigConstants.isGuideCompleted(ConfigConstants.KEY_GUIDE_MODIFY_PROJECT, configDataSource)) { + index = 0; + } + int finalIndex = index; + ThreadPoolUtil.executeInMain(() -> modifyProjectGuide.start(finalIndex)); + }); + }); + } + + + /** + * 进入项目详情 + */ + private void goProjectDetail(ProjectRecord item) { + ProjectDetailFragment.start(requireContext(), + item.projectType, + item.getId(), + item.getName()); + } + + @Override + public void onCreateOptionsMenu(@NotNull Menu menu, @NotNull MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.menu_activity_project_list, menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.menu_activity_project_list_help) { +// Intent intent = new Intent(Utils.getApp(), AgentWebActivity.class); +// intent.putExtra("short_url", "android_url_activity_project_list_help"); +// startActivity(intent); + AgentWebActivity.navigation2(getContext(), "android_url_activity_project_list_help"); + } + return super.onOptionsItemSelected(item); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ProjectToleranceSettingFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ProjectToleranceSettingFragment.java new file mode 100644 index 0000000..6365e70 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ProjectToleranceSettingFragment.java @@ -0,0 +1,107 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.project.IProjectDataSource; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.IToleranceDetailDataSource; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.util.SurveyorRecordUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.utils.ThreadPoolUtil; + +import blankj.utilcode.util.ToastUtils; + +/* + * 项目限差详情,包含'LimitDetailFragment'+选择模板 + * */ +public class ProjectToleranceSettingFragment extends AbstractProjectToleranceFragment { + public static final int title = R.string.project_limite_detail; + public static final String TAG = ProjectToleranceSettingFragment.class.getName(); + + @Override + protected void onCurrentToleranceChanged(String toleranceId) { + super.onCurrentToleranceChanged(toleranceId); + if (getArguments() == null) { + return; + } + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + ThreadPoolUtil.execute(() -> { + IProjectDataSource projectDataSource = + SurveyorDatabaseFactory.instance.getProjectDataSource(); + ProjectRecord projectRecord = projectDataSource.getRecord(projectId); + projectRecord.setToleranceId(toleranceId); + projectDataSource.saveRecordSync(projectRecord); + }); + } + + @Override + protected void onCreateView(View view) { + //读取当前项目配置的限差方案,并设置限差界面 + if (getArguments() == null) { + return; + } + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + ThreadPoolUtil.execute(() -> { + IProjectDataSource projectDataSource = SurveyorDatabaseFactory + .instance + .getProjectDataSource(); + ProjectRecord projectRecord = projectDataSource.getRecord(projectId); + if (projectRecord == null) { + return; + } + String projectToleranceId = projectRecord.getToleranceId(); + //读取'限差方案'名称 + IToleranceDetailDataSource toleranceDataSource = SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource(); + ToleranceDetailRecord instance = toleranceDataSource.getRecordSync(projectToleranceId); + //设置限差详情 + if (instance == null) { + //修改项目限差配置 + toleranceDataSource.getDefaultRecord(defaultRecord -> { + projectRecord.setToleranceId(defaultRecord.getId()); + projectDataSource.saveRecordSync(projectRecord); + updateToleranceDetail(view, defaultRecord); + }); + } else { + updateToleranceDetail(view, instance); + } + }); + } + + @Override + protected void onSelectToleranceTemplateClick() { + //读取当前项目配置的限差方案,并设置限差界面 + if (getArguments() == null) { + return; + } + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + //判断当前project是否存在已经测量的station + ThreadPoolUtil.execute(() -> { + if (SurveyorRecordUtil.isProjectSurveyor(projectId)) { + ToastUtils.showShort(R.string.tips_tolerance_cannt_modify); + } else { + ProjectToleranceSettingFragment.super.onSelectToleranceTemplateClick(); + } + }); + } + + public static void start(Context context, String projectId, String projectType) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_PROJECT_TYPE, projectType); + FragmentContainerActivity.start(context, TAG, title, bundle); + } + + public static ProjectToleranceSettingFragment newInstance(Bundle bundle) { + ProjectToleranceSettingFragment fragment = new ProjectToleranceSettingFragment(); + fragment.setArguments(bundle); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportHeightTraverseFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportHeightTraverseFragment.kt new file mode 100644 index 0000000..985714f --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportHeightTraverseFragment.kt @@ -0,0 +1,276 @@ +package com.bingce.controlnetwork.fragment + +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.MainThread +import androidx.fragment.app.DialogFragment +import blankj.utilcode.util.ToastUtils +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.surveyor.method.ExportUtils +import com.bingce.controlapphelper.util.CheckExportUtil +import com.bingce.controlapphelper.util.CheckStorageUtil +import com.bingce.controlapphelper.util.StationUtil.getStationName +import com.bingce.controlapphelper.util.StationUtil.getStationPointName +import com.bingce.controlapphelper.util.StationUtil.isStationCanExportForHeightTraverse +import com.bingce.controlapphelper.util.Tools +import com.bingce.controlnetwork.BuildConfig +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity +import com.bingce.controlnetwork.databinding.FragmentSelectExportSurveyorLayoutBinding +import com.bingce.controlnetwork.fragment.base.BaseFragment +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode +import com.bingce.controlnetwork.ui.widget.treeview.TreeView +import com.bingce.controlnetwork.ui.widget.treeview.custom.MyNodeViewFactory +import com.bingce.file.FileOperator +import com.bingce.utils.ThreadPoolUtil +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File + + +class SelectExportHeightTraverseFragment : BaseFragment() { + + private var _binding: FragmentSelectExportSurveyorLayoutBinding? = null + val mBinding get() = _binding!! + + private lateinit var checkExportUtil: CheckExportUtil + + private val mainScope = MainScope() + + val root: TreeNode = TreeNode.root() + + private val treeView: TreeView by lazy { + TreeView(root, requireContext(), MyNodeViewFactory()) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentSelectExportSurveyorLayoutBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + checkExportUtil = CheckExportUtil.getInstance().init() + mBinding.export.isEnabled = true + + mBinding.export.setOnClickListener { + if (checkExportUtil.isCanExport) { + requestStoragePermission() + } + } + + initData() + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + mainScope.cancel() + } + + private fun initData() { + + mainScope.launch { + withContext(Dispatchers.IO) { + buildNodeTree() + } + treeView.setup(mBinding.list) + mBinding.list.visibility = View.VISIBLE + mBinding.loading.visibility = View.GONE + } + + } + + private suspend fun buildNodeTree() { + val projectDataSource = SurveyorDatabaseFactory.instance.projectDataSource + val projectRecordList = projectDataSource.dataList + + for (projectRecord in projectRecordList) { + //遍历项目 + //一级数据 + val projectNode = + TreeNode(TreeNode.Value(projectRecord.projectName, projectRecord.id), 0) + + val routeList = SurveyorDatabaseFactory.instance.getRouteDataSource() + .getByProjectId(projectRecord.getId()) + + var projectHasData = false + + for (routeRecord in routeList) { + //遍历路线 + //二级数据 + val periodNode = + TreeNode(TreeNode.Value(routeRecord.name, routeRecord.id), 1) + + val stationList = + SurveyorDatabaseFactory.instance.surveyorStation.getByProjectRoute( + projectRecord.getId(), + routeRecord.getId() + ) + + var routeHasData = false + + for (stationRecord in stationList) { + //遍历测站 + if (stationRecord == null) { + continue + } + + val exportItem = ExportUtils.ExportItem( + projectRecord.getProjectName(), projectRecord.getId(), + projectRecord.projectType, + routeRecord.getId(), routeRecord.name, + stationRecord.getId(), + getStationName(stationRecord), + getStationPointName(stationRecord) + ) + + //三级数据 + val stationNode = TreeNode( + TreeNode.Value(exportItem, stationRecord.getId()), + 2 + ) + //添加三级数据 + periodNode.addChild(stationNode) + + val stationCanExport = isStationCanExportForHeightTraverse(stationRecord) + stationNode.isEnable = stationCanExport + if (stationCanExport) { + projectHasData = true + routeHasData = true + } + } + + //添加二级数据 + periodNode.isEnable = routeHasData + projectNode.addChild(periodNode) + + } + + projectNode.isEnable = projectHasData + //添加一级数据 + root.addChild(projectNode) + } + + } + + companion object { + @JvmField + val TAG: String = SelectExportHeightTraverseFragment::class.java.name + + @JvmStatic + fun newInstance(args: Bundle?): SelectExportHeightTraverseFragment { + val fragment = SelectExportHeightTraverseFragment() + fragment.arguments = args + return fragment + } + + @JvmStatic + fun start(context: Context) { + FragmentContainerActivity.start( + context, + TAG, + R.string.export_height_traverse, + null + ) + } + + } + + + private fun requestStoragePermission() { + CheckStorageUtil.check(context) { exportHasPermission() } + } + + private fun exportHasPermission() { + val dialogFragment: DialogFragment = FullLoadingFragment.showLoading(childFragmentManager) + doExport(root, requireContext(), object : ICallback { + override fun onFailureInMainThread(msg: String?) { + dialogFragment.dismiss() + ToastUtils.showShort(R.string.tips_please_select_exported_data) + } + + override fun onSuccessInMainThread(zip: File) { + if (dialogFragment.isVisible) { + dialogFragment.dismiss() + } + TipsWith2OptionFragment.tipsCannotCancel( + childFragmentManager, viewLifecycleOwner, + getString(R.string.share), + getString(R.string.cancel), + getString(R.string.export_successful), + object : TipsWith2OptionFragment.SimpleCallback() { + override fun onConfirm() { + FileOperator.shareFile(context, zip, BuildConfig.APPLICATION_ID) + } + }) + } + }) + } + + private interface ICallback { + fun onFailureInMainThread(msg: String?) + fun onSuccessInMainThread(zip: File) + } + + @MainThread + private fun doExport( + root: TreeNode, + context: Context, + callback: ICallback + ) { + ThreadPoolUtil.execute { + + //层遍历node树,找到所有被选中的station + val exportItem: MutableList = + ArrayList() + val nodeList: MutableList = + ArrayList() + nodeList.add(root) + while (!nodeList.isEmpty()) { + val first = nodeList.removeAt(0) + if (first.isEnable && first.isSelected && first.value + .value is ExportUtils.ExportItem + ) { + exportItem.add(first.value.value as ExportUtils.ExportItem) + } + nodeList.addAll(first.children) + } + if (exportItem.isEmpty()) { + if (callback != null) { + ThreadPoolUtil.executeInMain { + callback.onFailureInMainThread( + context.getString( + R.string.error_tips_please_select_exported_station + ) + ) + } + } + return@execute + } + + //执行导出 + val zip = ExportUtils.doExport(context, exportItem) + //提示导出成功 + ThreadPoolUtil.executeInMain { + if (zip == null) { + callback.onFailureInMainThread(Tools.getString(R.string.export_failure)) + } else { + callback.onSuccessInMainThread(zip) + } + } + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportSurveyorRecordFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportSurveyorRecordFragment.java new file mode 100644 index 0000000..d1ad290 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportSurveyorRecordFragment.java @@ -0,0 +1,299 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.MainThread; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.DialogFragment; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.project.IProjectDataSource; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorcycle.ISurveyorPeriodDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.surveyor.method.ExportUtils; +import com.bingce.controlapphelper.util.CheckStorageUtil; +import com.bingce.controlapphelper.util.StationUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.ui.widget.treeview.custom.MyNodeViewFactory; +import com.bingce.data.sync.utils.LeanCloudConfigLoader; +import com.bingce.file.FileOperator; +import com.bingce.utils.DateUtils; +import com.bingce.utils.ServiceDateUtils; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.utils.VipManager; + +import java.io.File; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +import blankj.utilcode.util.ToastUtils; +import cn.leancloud.LCUser; + +import com.bingce.controlnetwork.BuildConfig; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; +import com.bingce.controlnetwork.ui.widget.treeview.TreeView; +import com.bingce.controlnetwork.ui.widget.treeview.custom.MyNodeViewFactory; + +/** + * 观测数据导出(基于选择的站的点数据导出) + */ +public class SelectExportSurveyorRecordFragment extends BaseFragment { + public static final String TAG = SelectExportSurveyorRecordFragment.class.getName(); + private TreeNode root; + private TreeView treeView; + private boolean isOpen = false; + private Date currentDate, expireDate; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + root = TreeNode.root(); + if (getContext() != null) { + treeView = new TreeView(root, getContext(), new MyNodeViewFactory()); + } + View rootView = inflater.inflate(R.layout.fragment_select_export_surveyor_layout, container, false); + View exportBtn = rootView.findViewById(R.id.export); + if (VipManager.getInstance().checkVipReg()) { + exportBtn.setEnabled(true); + } + exportBtn.setOnClickListener(v -> { + if (VipManager.getInstance().checkVipReg()) { + requestStoragePermission(); + } else if (LCUser.getCurrentUser() == null) { + ToastUtils.showLong(R.string.please_log_in_first); + } else { + if (currentDate != null && expireDate != null) { + if (isOpen) { + if (expireDate.after(currentDate)) { + requestStoragePermission(); + } else { + ToastUtils.showShort(R.string.free_licence_end_please_purchase_membership); + } + } else { + ToastUtils.showShort(R.string.unauthorized_please_purchase_membership); + } + } + } + }); + + ThreadPoolUtil.execute(() -> { + buildNodeTree(root); + ThreadPoolUtil.executeInMain(() -> { + RecyclerView list = rootView.findViewById(R.id.list); + treeView.setup(list); + list.setVisibility(View.VISIBLE); + View loading = rootView.findViewById(R.id.loading); + loading.setVisibility(View.GONE); + }); + }); + ServiceDateUtils.getServerDate(new DateUtils.OnServerDateCallBack() { + @Override + public void get(Date serverDate) { + currentDate = serverDate; + LeanCloudConfigLoader.findInBackground("controlNetwork_free_duration", instance -> { +// new LCQuery<>("Configuration") +// .whereEqualTo("name", "controlNetwork_free_duration") +// .limit(1) +// .findInBackground().subscribe(new Observer>() { +// @Override +// public void onSubscribe(Disposable d) { +// +// } +// +// @Override +// public void onNext(List lcObjects) { + if (/*!lcObjects.isEmpty()*/instance != null) { + isOpen = "1".equals(/*lcObjects.get(0).getString("value")*/instance.value); + String value2 = /*lcObjects.get(0).getString("value2")*/instance.value2; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.US); + try { + expireDate = sdf.parse(value2); + exportBtn.setEnabled(true); + } catch (ParseException e) { + e.printStackTrace(); + } + } +// } +// +// @Override +// public void onError(Throwable e) { +// } +// +// @Override +// public void onComplete() { +// +// } + }); + } + + @Override + public void error(Throwable throwable) { + ToastUtils.showShort(R.string.please_online_and_try); + } + }); + return rootView; + } + + @MainThread + private static void doExport(TreeNode root, + Context context, + ICallback callback) { + ThreadPoolUtil.execute(() -> { + //层遍历node树,找到所有被选中的station + List exportItem = new ArrayList<>(); + List nodeList = new ArrayList<>(); + nodeList.add(root); + while (!nodeList.isEmpty()) { + TreeNode first = nodeList.remove(0); + if (first.isEnable() && first.isSelected() && first.getValue().getValue() instanceof ExportUtils.ExportItem) { + exportItem.add((ExportUtils.ExportItem) first.getValue().getValue()); + } + nodeList.addAll(first.getChildren()); + } + if (exportItem.isEmpty()) { + if (callback != null) { + ThreadPoolUtil.executeInMain(() -> callback.onFailureInMainThread(context.getString(R.string.error_tips_please_select_exported_station))); + } + return; + } + + //执行导出 + File zip = ExportUtils.doExport(context, exportItem); + //提示导出成功 + if (callback != null) { + ThreadPoolUtil.executeInMain(() -> { + if (zip == null) { + callback.onFailureInMainThread(Tools.getString(R.string.export_failure)); + } else { + callback.onSuccessInMainThread(zip); + } + }); + } + }); + } + + private interface ICallback { + void onFailureInMainThread(String msg); + + void onSuccessInMainThread(File zip); + } + + /** + * 根据 + *

+ * (项目->测期->测站) + *

+ * 三级结构,构建node树 + *

+ * 检测每个测站数据是否正常记录,如果没有则将其设置为不可选中状态 + * + * @param root node树的根节点 + */ + @WorkerThread + private static void buildNodeTree(TreeNode root) { + IProjectDataSource projectDataSource = SurveyorDatabaseFactory.instance.getProjectDataSource(); + List projectRecordList = projectDataSource.getDataList(); + for (ProjectRecord projectRecord : projectRecordList) {//遍历项目 + TreeNode projectNode = + new TreeNode(new TreeNode.Value(projectRecord.projectName, projectRecord.id), 0); + ISurveyorPeriodDataSource surveyorPeriodDataSource = SurveyorDatabaseFactory.instance.getSurveyorPeriod(); + List surveyorPeriodRecordList = surveyorPeriodDataSource.getDataListSyncByProjectId(projectRecord.getId()); + + boolean projectHasData = false; + for (SurveyorPeriodRecord periodRecord : surveyorPeriodRecordList) {//遍历测期 + TreeNode periodNode = new TreeNode(new TreeNode.Value(periodRecord.getName(), periodRecord.id), 1); + ISurveyorStationDataSource surveyorStationDataSource = SurveyorDatabaseFactory.instance.getSurveyorStation(); + List stationRecordList = surveyorStationDataSource.getDataList(projectRecord.getId(), periodRecord.getId()); + + boolean periodHasData = false; + for (SurveyorStationRecord stationRecord : stationRecordList) {//遍历测站 + if (stationRecord == null) { + continue; + } + ExportUtils.ExportItem exportItem = + new ExportUtils.ExportItem(projectRecord.getProjectName(), projectRecord.getId(), + projectRecord.projectType, + periodRecord.getId(), periodRecord.getName(), + stationRecord.getId(), + StationUtil.getStationName(stationRecord), + StationUtil.getStationPointName(stationRecord)); + TreeNode stationNode = new TreeNode(new TreeNode.Value(exportItem, stationRecord.getId()), + 2); + periodNode.addChild(stationNode); + + boolean stationCanExport = StationUtil.isStationCanExport(stationRecord); + stationNode.setEnable(stationCanExport); + if (stationCanExport) { + projectHasData = true; + periodHasData = true; + } + } + + periodNode.setEnable(periodHasData); + projectNode.addChild(periodNode); + } + + projectNode.setEnable(projectHasData); + root.addChild(projectNode); + } + } + + public static SelectExportSurveyorRecordFragment newInstance(Bundle args) { + SelectExportSurveyorRecordFragment fragment = new SelectExportSurveyorRecordFragment(); + fragment.setArguments(args); + return fragment; + } + + public static void start(Context context) { + FragmentContainerActivity.start(context, TAG, R.string.export, null); + } + + public void requestStoragePermission() { + CheckStorageUtil.check(getContext(), this::exportHasPermission); + } + + private void exportHasPermission() { + DialogFragment dialogFragment = FullLoadingFragment.showLoading(getChildFragmentManager()); + doExport(root, getContext(), new ICallback() { + @Override + public void onFailureInMainThread(String msg) { + dialogFragment.dismiss(); + ToastUtils.showShort(R.string.tips_please_select_exported_data); + } + + @Override + public void onSuccessInMainThread(File zip) { + if (dialogFragment.isVisible()) { + dialogFragment.dismiss(); + } + TipsWith2OptionFragment.tipsCannotCancel(getChildFragmentManager(), getViewLifecycleOwner(), + getString(R.string.share), + getString(R.string.cancel), + getString(R.string.export_successful), + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + FileOperator.shareFile(getContext(), zip, BuildConfig.APPLICATION_ID); + } + }); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportSurveyorRecordWireFileFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportSurveyorRecordWireFileFragment.java new file mode 100644 index 0000000..e6f7a11 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportSurveyorRecordWireFileFragment.java @@ -0,0 +1,363 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.os.Environment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.MainThread; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.DialogFragment; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.project.IProjectDataSource; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.schedule.ISurveyorScheduleDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorcycle.ISurveyorPeriodDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.surveyor.method.ExportUtils; +import com.bingce.controlapphelper.util.CheckStorageUtil; +import com.bingce.controlapphelper.util.StationUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.ui.widget.treeview.custom.MyNodeViewFactory; +import com.bingce.data.sync.utils.LeanCloudConfigLoader; +import com.bingce.file.FileOperator; +import com.bingce.utils.DateUtils; +import com.bingce.utils.ServiceDateUtils; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.utils.VipManager; +import com.bingce.zip.ZipUtil; + +import java.io.File; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import blankj.utilcode.util.FileUtils; +import blankj.utilcode.util.ToastUtils; +import cn.leancloud.LCUser; + +import com.bingce.controlnetwork.BuildConfig; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; +import com.bingce.controlnetwork.ui.widget.treeview.TreeView; +import com.bingce.controlnetwork.ui.widget.treeview.custom.MyNodeViewFactory; + +/** + * 导线文件导出(基于选择的导线数据导出) + */ +public class SelectExportSurveyorRecordWireFileFragment extends BaseFragment { + public static final String TAG = SelectExportSurveyorRecordWireFileFragment.class.getName(); + private TreeNode root; + private TreeView treeView; + private boolean isOpen = false; + private Date currentDate, expireDate; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + root = TreeNode.root(); + if (getContext() != null) { + treeView = new TreeView(root, getContext(), new MyNodeViewFactory()); + } + View rootView = inflater.inflate(R.layout.fragment_select_export_surveyor_layout, container, false); + View exportBtn = rootView.findViewById(R.id.export); + if (VipManager.getInstance().checkVipReg()) { + exportBtn.setEnabled(true); + } + exportBtn.setOnClickListener(v -> { + if (VipManager.getInstance().checkVipReg()) { + requestStoragePermission(); + } else if (LCUser.getCurrentUser() == null) { + ToastUtils.showLong(R.string.please_log_in_first); + } else { + if (currentDate != null && expireDate != null) { + if (isOpen) { + if (expireDate.after(currentDate)) { + requestStoragePermission(); + } else { + ToastUtils.showShort(R.string.free_licence_end_please_purchase_membership); + } + } else { + ToastUtils.showShort(R.string.unauthorized_please_purchase_membership); + } + } + } + }); + + ThreadPoolUtil.execute(() -> { + buildNodeTree(root); + ThreadPoolUtil.executeInMain(() -> { + RecyclerView list = rootView.findViewById(R.id.list); + treeView.setup(list); + list.setVisibility(View.VISIBLE); + View loading = rootView.findViewById(R.id.loading); + loading.setVisibility(View.GONE); + }); + }); + ServiceDateUtils.getServerDate(new DateUtils.OnServerDateCallBack() { + @Override + public void get(Date serverDate) { + currentDate = serverDate; + LeanCloudConfigLoader.findInBackground("controlNetwork_free_duration", instance -> { +// new LCQuery<>("Configuration") +// .whereEqualTo("name", "controlNetwork_free_duration") +// .limit(1) +// .findInBackground().subscribe(new Observer>() { +// @Override +// public void onSubscribe(Disposable d) { +// +// } +// +// @Override +// public void onNext(List lcObjects) { + if (/*!lcObjects.isEmpty()*/instance != null) { + isOpen = "1".equals(/*lcObjects.get(0).getString("value")*/instance.value); + String value2 = /*lcObjects.get(0).getString("value2")*/instance.value2; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.US); + try { + expireDate = sdf.parse(value2); + exportBtn.setEnabled(true); + } catch (ParseException e) { + e.printStackTrace(); + } + } +// } +// +// @Override +// public void onError(Throwable e) { +// } +// +// @Override +// public void onComplete() { +// +// } + }); + } + + @Override + public void error(Throwable throwable) { + ToastUtils.showShort(R.string.please_online_and_try); + } + }); + return rootView; + } + + @MainThread + private static void doExport(TreeNode root, + Context context, + ICallback callback) { + ThreadPoolUtil.execute(() -> { + //层遍历node树,找到所有被选中的station + List exportItem = new ArrayList<>(); + List nodeList = new ArrayList<>(); + nodeList.add(root); + while (!nodeList.isEmpty()) { + TreeNode first = nodeList.remove(0); + if (first.isEnable() && first.isSelected() && first.getValue().getValue() instanceof ExportUtils.ExportItem) { + exportItem.add((ExportUtils.ExportItem) first.getValue().getValue()); + } + nodeList.addAll(first.getChildren()); + } + if (exportItem.isEmpty()) { + if (callback != null) { + ThreadPoolUtil.executeInMain(() -> callback.onFailureInMainThread(context.getString(R.string.error_tips_please_select_exported_station))); + } + return; + } + + //获取测站测期的完整数据列表 +// List exportCompleteLoopList = getExportProjectPeridList(root); + + //执行导出 + String exportFolder = "导线助手导出文件" + File.separator + "导线文件导出"; + List files = ExportUtils.doExportWire(context, exportItem, exportFolder); + + //将文件存储到一个zip中 + String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath(); +// File appSharedFolder = PathManager.appDocumentFolder(); + Date date = new Date(); + SimpleDateFormat format = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", Locale.getDefault()); + String dateString = format.format(date); + File zip = new File(absolutePath, exportFolder + File.separator + dateString + ".zip"); + if (!ZipUtil.zip(zip, files)) { + zip = null; + } + //存储成功,删除zip文件 + for (File file : files) { + if (file == null) { + continue; + } + FileUtils.delete(file); + } + + //提示导出成功 + if (callback != null) { + File finalZip = zip; + ThreadPoolUtil.executeInMain(() -> { + if (finalZip == null) { + callback.onFailureInMainThread(Tools.getString(R.string.export_failure)); + } else { + callback.onSuccessInMainThread(finalZip); + } + }); + } + }); + } + + private interface ICallback { + void onFailureInMainThread(String msg); + + void onSuccessInMainThread(File zip); + } + + /** + * 根据 + *

+ * (项目->测期->测站) + *

+ * 三级结构,构建node树 + *

+ * 检测每个测站数据是否正常记录,如果没有则将其设置为不可选中状态 + * + * @param root node树的根节点 + */ + @WorkerThread + private static void buildNodeTree(TreeNode root) { + IProjectDataSource projectDataSource = SurveyorDatabaseFactory.instance.getProjectDataSource(); + List projectRecordList = projectDataSource.getDataList(); + //遍历项目 + for (ProjectRecord projectRecord : projectRecordList) { + //创建项目节点 + TreeNode projectNode = + new TreeNode(new TreeNode.Value(projectRecord.projectName, projectRecord.id), 0); + ISurveyorPeriodDataSource surveyorPeriodDataSource = SurveyorDatabaseFactory.instance.getSurveyorPeriod(); + List surveyorPeriodRecordList = surveyorPeriodDataSource.getDataListSyncByProjectId(projectRecord.getId()); + boolean projectHasData = false; + //遍历测期 + for (SurveyorPeriodRecord periodRecord : surveyorPeriodRecordList) { + //创建测期节点 + TreeNode periodNode = new TreeNode(new TreeNode.Value(periodRecord.getName(), periodRecord.id), 1); + ISurveyorStationDataSource surveyorStationDataSource = SurveyorDatabaseFactory.instance.getSurveyorStation(); + List stationRecordList = surveyorStationDataSource.getDataList(projectRecord.getId(), periodRecord.getId()); + ISurveyorScheduleDataSource surveyorScheduleDataSource = SurveyorDatabaseFactory.instance.getScheduleDataSource(); + + boolean periodHasData = false; + //遍历测站 + if (stationRecordList == null || stationRecordList.isEmpty()) { + continue; + } + + //初始化导线数据map + Map lineMap = new HashMap<>(); + for (SurveyorStationRecord stationRecord : stationRecordList) { + if (stationRecord == null) { + continue; + } + String lineId = stationRecord.getLineId(); + LineRecord lineRecord = SurveyorDatabaseFactory.instance.getLineRecordDatabase().findById(lineId); + if (lineRecord == null) { + continue; + } + if (LineRecord.TYPE_MUL_ANGLE.equals(StationUtil.getLineTypeFromStation(stationRecord))) { + //排除多测回测角 + continue; + } + if (lineMap.containsKey(lineId)) { + LineRecord lineRecordAlready = lineMap.get(lineId); + if (lineRecordAlready != null && lineRecordAlready.isCanSelected) { + lineRecordAlready.isCanSelected = StationUtil.isStationCanExport(stationRecord); + } + } else { + lineRecord.isCanSelected = StationUtil.isStationCanExport(stationRecord); + lineMap.put(lineId, lineRecord); + } + } + + //添加第三节点 导线 + for (LineRecord lineRecord : lineMap.values()) { + ExportUtils.ExportItem exportItem = + new ExportUtils.ExportItem(projectRecord.getProjectName(), projectRecord.getId(), + projectRecord.projectType, + periodRecord.getId(), periodRecord.getName(), + lineRecord.id, + lineRecord.name, + ""); + TreeNode lineNode = new TreeNode(new TreeNode.Value(exportItem, lineRecord.id), + 2); + + lineNode.setEnable(lineRecord.isCanSelected); + periodNode.addChild(lineNode); + + if (lineRecord.isCanSelected) { + projectHasData = true; + periodHasData = true; + } + } + + periodNode.setEnable(periodHasData); + projectNode.addChild(periodNode); + } + + projectNode.setEnable(projectHasData); + root.addChild(projectNode); + } + } + + public static SelectExportSurveyorRecordWireFileFragment newInstance(Bundle args) { + SelectExportSurveyorRecordWireFileFragment fragment = new SelectExportSurveyorRecordWireFileFragment(); + fragment.setArguments(args); + return fragment; + } + + public static void start(Context context) { + FragmentContainerActivity.start(context, TAG, R.string.export_wire_file, null); + } + + public void requestStoragePermission() { + CheckStorageUtil.check(getContext(), this::exportHasPermission); + } + + private void exportHasPermission() { + DialogFragment dialogFragment = FullLoadingFragment.showLoading(getChildFragmentManager()); + doExport(root, getContext(), new SelectExportSurveyorRecordWireFileFragment.ICallback() { + @Override + public void onFailureInMainThread(String msg) { + dialogFragment.dismiss(); + ToastUtils.showShort(R.string.tips_please_select_exported_data); + } + + @Override + public void onSuccessInMainThread(File zip) { + if (dialogFragment.isVisible()) { + dialogFragment.dismiss(); + } + TipsWith2OptionFragment.tipsCannotCancel(getChildFragmentManager(), getViewLifecycleOwner(), + getString(R.string.share), + getString(R.string.cancel), + getString(R.string.export_successful), + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + FileOperator.shareFile(getContext(), zip, BuildConfig.APPLICATION_ID); + } + }); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectMeasureDataExportTypeFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectMeasureDataExportTypeFragment.java new file mode 100644 index 0000000..365e374 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectMeasureDataExportTypeFragment.java @@ -0,0 +1,209 @@ +package com.bingce.controlnetwork.fragment; + +import android.app.Dialog; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.ItemSelectMeasureDataExportTypeBinding; +import com.bingce.data.database.deformationmonitor.util.GsonUtils; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +/** + * 选择观测数据导出的文件类型 + */ +public class SelectMeasureDataExportTypeFragment extends BottomSheetDialogFragment { + + private static final String KEY_REQUEST_SELECT = "__SELECT__"; + private static final String KEY_TYPE = "__SELECT_TYPE__"; + private static final String TYPE_CONTROL = "TYPE_CONTROL"; + private static final String TYPE_KE_SHA = "TYPE_KE_SHA"; + private static final String TYPE_NAN_FANG = "TYPE_NAN_FANG"; + private static final String TYPE_QI_FEI = "TYPE_QI_FEI"; + private static final String TYPE_PING_CHA_ZHI_XING = "TYPE_PING_CHA_ZHI_XING"; + + private final List dataList = new ArrayList<>(); + private RecyclerView recyclerView; + private View btnCancel; + private View btnConfirm; + + @Override + public void onStart() { + super.onStart(); +// Dialog dialog = getDialog(); +// if (dialog != null) { +// Window window = dialog.getWindow(); +// if (window != null) { +// window.setLayout( +// WindowManager.LayoutParams.MATCH_PARENT, +// WindowManager.LayoutParams.WRAP_CONTENT); +// } +// } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_select_measure_data_export_type, container, false); + } + + + public static void start(FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + IOnSelectCallback callback) { + SelectMeasureDataExportTypeFragment fragment = new SelectMeasureDataExportTypeFragment(); + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_SELECT, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_SELECT.equals(requestKey)) { + callback.onSurveyorCycleSelected(result.getString(KEY_TYPE)); + } + }); + fragment.show(fragmentManager, null); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + recyclerView = view.findViewById(R.id.recyclerView); + btnCancel = view.findViewById(R.id.btnCancel); + btnConfirm = view.findViewById(R.id.btnConfirm); + initView(); + initData(); + initListener(); + } + + private void initListener() { + btnCancel.setOnClickListener((v) -> { + dismissAllowingStateLoss(); + }); + btnConfirm.setOnClickListener((v) -> { + startConfirm(); + }); + } + + private void startConfirm() { + List exportList = new ArrayList<>(); + for (Bean bean : dataList) { + if (bean.isSelect) { + exportList.add(bean); + } + } + if (exportList.isEmpty()) { + ToastUtils.showShort("请选择导出格式"); + return; + } + backData(exportList); + } + + private void initView() { + + } + + private void initData() { + dataList.add(new Bean("导线助手格式", TYPE_CONTROL)); + dataList.add(new Bean("科傻格式", TYPE_KE_SHA)); + dataList.add(new Bean("南方平差易格式", TYPE_NAN_FANG)); + dataList.add(new Bean("启飞格式", TYPE_QI_FEI)); + dataList.add(new Bean("平差之星格式", TYPE_PING_CHA_ZHI_XING)); + recyclerView.setAdapter(new Adapter()); + } + + + private void backData(List selectList) { + Bundle args = new Bundle(); + args.putString(KEY_TYPE, GsonUtils.toJson(selectList)); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_SELECT, args); + dismiss(); + } + + + public interface IOnSelectCallback { + void onSurveyorCycleSelected(String beanList); + } + + class Adapter extends RecyclerView.Adapter { + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(ItemSelectMeasureDataExportTypeBinding.inflate(getLayoutInflater(), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + + Bean bean = dataList.get(position); + + holder.mBinding.tv.setText(bean.getName()); + holder.mBinding.cb.setChecked(bean.isSelect); + + holder.itemView.setOnClickListener(v -> { + bean.isSelect = !bean.isSelect; + notifyItemChanged(holder.getBindingAdapterPosition()); + }); + + } + + @Override + public int getItemCount() { + return dataList.size(); + } + } + + class ViewHolder extends RecyclerView.ViewHolder { + @NonNull + private final ItemSelectMeasureDataExportTypeBinding mBinding; + + public ViewHolder(ItemSelectMeasureDataExportTypeBinding binding) { + super(binding.getRoot()); + this.mBinding = binding; + } + } + + public static class Bean { + private final String name; + private final String type; + private boolean isSelect; + + public Bean(String name, String type) { + this.name = name; + this.type = type; + } + + public String getName() { + return name; + } + + public String getType() { + return type; + } + + public boolean isSelect() { + return isSelect; + } + + public void setSelect(boolean select) { + isSelect = select; + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectProjectAndSurveyorCycleFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectProjectAndSurveyorCycleFragment.java new file mode 100644 index 0000000..f2ace7d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectProjectAndSurveyorCycleFragment.java @@ -0,0 +1,163 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlnetwork.R; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; + +/** + * 弹框,先选项目,再选测期 + */ +public class SelectProjectAndSurveyorCycleFragment extends DialogFragment { + public static final String TAG = SelectProjectAndSurveyorCycleFragment.class.getName(); + private ComponentSwitchStationListFragment componentSwitchStationListFragment; + + private SelectProjectAndSurveyorCycleFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater + .inflate(R.layout.fragment_single_framelayout_layout, + container, + false); + String currentProjectId = ""; + String cycleId = ""; + if (getArguments() != null) { + currentProjectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + cycleId = getArguments().getString(BundleConstants.KEY_PERIOD_ID); + } + + componentSwitchStationListFragment = + ComponentSwitchStationListFragment.newInstance(currentProjectId, cycleId); + + getChildFragmentManager() + .beginTransaction() + .replace(R.id.container, componentSwitchStationListFragment) + .commit(); + + view.setOnClickListener(v -> dismiss()); + return view; + } + + @Override + public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + if (getDialog() != null) { + final Window window = getDialog().getWindow(); + + window.setWindowAnimations(R.style.animate_dialog); + window.setBackgroundDrawable(null); + + WindowManager.LayoutParams params = window.getAttributes(); + params.gravity = Gravity.BOTTOM; + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + window.setAttributes(params); + } + } + + @Override + public void onStart() { + super.onStart(); + EventBus.getDefault().register(this); + getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() { + @Override + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if ((keyCode == android.view.KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP)) { + if (!componentSwitchStationListFragment.doBack()) { + dismiss(); + } + return true; + } + return false; + } + }); + } + + @Override + public void onStop() { + super.onStop(); + EventBus.getDefault().unregister(this); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(SelectedResult event) { + Bundle args = new Bundle(); + args.putString(BundleConstants.KEY_PROJECT_ID, event.projectId); + args.putString(BundleConstants.KEY_PROJECT_NAME, event.projectName); + args.putString(BundleConstants.KEY_PERIOD_ID, event.cycleId); + args.putString(BundleConstants.KEY_PERIOD_NAME, event.cycleName); + getParentFragmentManager() + .setFragmentResult(KEY_REQUEST_SELECT, args); + dismiss(); + } + + private static final String KEY_REQUEST_SELECT = "__SELECT__"; + + public static void select(FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String defaultProjectId, + String defaultToleranceId, + IOnSelectCallback callback) { + Bundle args = new Bundle(); + args.putString(BundleConstants.KEY_PROJECT_ID, defaultProjectId); + args.putString(BundleConstants.KEY_PERIOD_ID, defaultToleranceId); + SelectProjectAndSurveyorCycleFragment fragment = new SelectProjectAndSurveyorCycleFragment(); + fragment.setArguments(args); + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_SELECT, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_SELECT.equals(requestKey)) { + callback.onSurveyorCycleSelected( + result.getString(BundleConstants.KEY_PROJECT_ID), + result.getString(BundleConstants.KEY_PROJECT_NAME), + result.getString(BundleConstants.KEY_PERIOD_ID), + result.getString(BundleConstants.KEY_PERIOD_NAME)); + } + }); + fragment.show(fragmentManager, TAG); + } + + public interface IOnSelectCallback { + void onSurveyorCycleSelected(String projectId, String projectName, String cycleId, String cycleName); + } + + public static class SelectedResult { + public final String projectId; + public final String projectName; + public final String cycleId; + public final String cycleName; + + public SelectedResult(String projectId, String projectName, + String cycleId, String cycleName) { + this.projectId = projectId; + this.projectName = projectName; + this.cycleId = cycleId; + this.cycleName = cycleName; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectProjectTypeFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectProjectTypeFragment.java new file mode 100644 index 0000000..94406dd --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectProjectTypeFragment.java @@ -0,0 +1,111 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.ProjectType; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.R; + +/** + * 选择项目类型 + */ +public class SelectProjectTypeFragment extends BottomSheetDialogFragment { + public static final String TAG = SelectProjectAndSurveyorCycleFragment.class.getName(); + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater + .inflate( + R.layout.fragment_select_project_type, + container, + false); + View.OnClickListener onClickListener = v -> { + if (v == null) { + dismiss(); + return; + } + int id = v.getId(); + String type = null; + if (id == R.id.btnTriangleWire) { + type = ProjectType.TRIANGLE.getFlag(); + } else if (id == R.id.btnConnectionSurvey) { + type = ProjectType.CONNECTION.getFlag(); + } else if (id == R.id.btnHeightTraverse) { + type = ProjectType.HEIGHT_TRAVERSE.getFlag(); + } + + if (type == null) { + ToastUtils.showShort("该导线正在开发中,请稍后..."); + return; + } + + + Bundle args = new Bundle(); + args.putString(KEY_TYPE, type); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_SELECT, args); + dismiss(); + }; + + setOnClickListener(view, R.id.btnTriangleWire, onClickListener); + setOnClickListener(view, R.id.btnConnectionSurvey, onClickListener); + setOnClickListener(view, R.id.btnHeightTraverse, onClickListener); + setOnClickListener(view, R.id.cancel, v -> dismiss()); + + return view; + } + + private static void setOnClickListener(View root, int id, View.OnClickListener onClickListener) { + View view = root.findViewById(id); + if (view != null) { + view.setOnClickListener(onClickListener); + } + } + + private static final String KEY_REQUEST_SELECT = "__SELECT__"; + private static final String KEY_TYPE = "__SELECT_TYPE__"; + + + public static void start(FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + IOnSelectCallback callback) { + SelectProjectTypeFragment fragment = new SelectProjectTypeFragment(); + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_SELECT, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_SELECT.equals(requestKey)) { + callback.onSurveyorCycleSelected(result.getString(KEY_TYPE)); + } + }); + fragment.show(fragmentManager, TAG); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (getDialog() == null) { + return; + } + getDialog().getWindow().setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT); + } + + public interface IOnSelectCallback { + void onSurveyorCycleSelected(String type); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectReSurveyorCycleFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectReSurveyorCycleFragment.java new file mode 100644 index 0000000..34653b5 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectReSurveyorCycleFragment.java @@ -0,0 +1,139 @@ +package com.bingce.controlnetwork.fragment; + +import android.app.Dialog; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.model.UniversalListItem; +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.ReSurveyorCycleAdapter; +import com.bingce.controlnetwork.databinding.FragmentResurveryorLayoutCycleBinding; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.adapter.ReSurveyorCycleAdapter; + +/** + * 高程导线 + * 选择要重测的测回 + */ +public class SelectReSurveyorCycleFragment extends BaseBottomSheetDialogFragment { + private FragmentResurveryorLayoutCycleBinding mBinding; + + private int resultCycleIndex = -1; + + @Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + mBinding = FragmentResurveryorLayoutCycleBinding.inflate(inflater, container, false); + + List> items = new ArrayList<>(); + + if (getArguments() != null) { + int cycleCount = getArguments().getInt(KEY_CYCLE_COUNT, 0); + for (int i = 0; i < cycleCount; i++) { + UniversalListItem item = new UniversalListItem() { + @Override + public ViewItemType getType() { + return ViewItemType.indexWithName; + } + }; + item.setName(Tools.getString(R.string.test_n_cycle, (i + 1))); + items.add(item); + } + } + + ReSurveyorCycleAdapter adapter = new ReSurveyorCycleAdapter(items, cycleIndex -> { + resultCycleIndex = cycleIndex; + }); + mBinding.list.setAdapter(adapter); + + mBinding.confirm.setOnClickListener(v -> { + if (resultCycleIndex == -1) { + ToastUtils.showShort(R.string.please_select_retest_cycle); + return; + } + Bundle args = new Bundle(); + args.putInt(KEY_RESULT_CYCLE, resultCycleIndex); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_TIME, args); + dismiss(); + }); + + return mBinding.getRoot(); + } + + + @Override + public void onDestroyView() { + super.onDestroyView(); + mBinding = null; + } + + public static final String KEY_REQUEST_TIME = "KEY_REQUEST_TIME_ID"; + + + private static final String KEY_CYCLE_COUNT = "__cycle_count__ "; + private static final String KEY_RESULT_CYCLE = "__result_cycle__ "; + + private SelectReSurveyorCycleFragment() { + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + Dialog dialog = getDialog(); + if (dialog == null) { + return; + } + dialog.setOnDismissListener(dialogInterface -> { + Bundle args = new Bundle(); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_TIME, args); + dismiss(); + }); + } + + public static void start(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + int cycleCount, + ISelectedCallback callback) { + if (callback == null) { + return; + } + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_TIME, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_TIME.equals(requestKey)) { + int targetCycleIndex = result.getInt(KEY_RESULT_CYCLE, -1); + callback.onSelected(targetCycleIndex); + } + }); + BottomSheetDialogFragment fragment = new SelectReSurveyorCycleFragment(); + Bundle args = new Bundle(); + args.putInt(KEY_CYCLE_COUNT, cycleCount); + fragment.setArguments(args); + fragment.show(fragmentManager, SelectReSurveyorCycleFragment.class.getName()); + } + + public interface ISelectedCallback { + void onSelected(int cycleIndex); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectReSurveyorPointFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectReSurveyorPointFragment.java new file mode 100644 index 0000000..ccc6f80 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectReSurveyorPointFragment.java @@ -0,0 +1,176 @@ +package com.bingce.controlnetwork.fragment; + +import android.app.Dialog; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlnetwork.adapter.ResurveyorPointsAdapter; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.ResurveyorPointsAdapter; + +/** + * 选择要补测的方向 + */ +public class SelectReSurveyorPointFragment extends BaseBottomSheetDialogFragment { + private int cycleIndex = -1; + + @Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_resurveryor_layout, container, false); + + RecyclerView recyclerView = rootView.findViewById(R.id.list); + if (recyclerView != null && getArguments() != null) { + int cycleCount = getArguments().getInt(KEY_CYCLE_COUNT); + boolean showLeftOrRight = getArguments().getBoolean(KEY_SHOW_LEFT_RIGHT, false); + if (cycleCount > 0) { + cycleIndex = 0; + View layoutCycle = rootView.findViewById(R.id.layout_cycle); + if (layoutCycle != null) { + layoutCycle.setVisibility(View.VISIBLE); + TextView cycleText = rootView.findViewById(R.id.cycle_text); + layoutCycle.setOnClickListener(v -> { + ArrayList cycleList = SurveyorCycleUtil.cycleStrings(cycleCount, showLeftOrRight); + runOnUI(() -> BottomSheetSelectListFragment.showSelect( + getChildFragmentManager(), + getViewLifecycleOwner(), + cycleIndex, + cycleList, + null,//不再限制测期 + (index, string) -> { + cycleIndex = index; + if (cycleText != null) { + cycleText.setText(string); + } + })); + }); + } + } + + //默认添加0方向 + List allPointIds = getArguments().getStringArrayList(KEY_ALL_POINT_IDS); + List allPointNames = getArguments().getStringArrayList(KEY_ALL_POINT_NAMES); + + List items = new ArrayList<>(); + for (int index = 0; index < allPointIds.size(); index++) { + ResurveyorPointsAdapter.Item item = + new ResurveyorPointsAdapter.Item(allPointNames.get(index), allPointIds.get(index)); + items.add(item); + } + ResurveyorPointsAdapter adapter = new ResurveyorPointsAdapter( + Collections.singletonList(allPointIds.get(0)), + items, + getContext(), + getChildFragmentManager(), + getViewLifecycleOwner()); + recyclerView.setAdapter(adapter); + + Button confirm = rootView.findViewById(R.id.confirm); + if (confirm != null) { + confirm.setOnClickListener(v -> { + Bundle args = new Bundle(); + List ids = adapter.selectedIds(); + ArrayList results = new ArrayList<>(ids); + args.putStringArrayList(KEY_SELECTED_POINT_IDS, results); + args.putInt(KEY_CYCLE_INDEX, cycleIndex); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_TIME, args); + dismiss(); + }); + } + } + + return rootView; + } + + public static final String KEY_REQUEST_TIME = "KEY_REQUEST_TIME_ID"; + private static final String KEY_ALL_POINT_IDS = "__all_point_ids "; + private static final String KEY_ALL_POINT_NAMES = "__all_point_names "; + private static final String KEY_SELECTED_POINT_IDS = "__selected_point_ids "; + + private static final String KEY_CYCLE_COUNT = "__cycle_count__ "; + private static final String KEY_SHOW_LEFT_RIGHT = "__show_left_or_right__"; + private static final String KEY_CYCLE_INDEX = "__cycle_INDEX__ "; + + private SelectReSurveyorPointFragment() { + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + Dialog dialog = getDialog(); + if (dialog == null) { + return; + } + dialog.setOnDismissListener(dialogInterface -> { + Bundle args = new Bundle(); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_TIME, args); + dismiss(); + }); + } + + public static void pick(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + boolean showLeftOrRight, + ArrayList allPointIds, + ArrayList allPointNames, + ISelectedCallback callback) { + pick(fragmentManager, lifecycleOwner, -1, showLeftOrRight, + allPointIds, allPointNames, callback); + } + + public static void pick(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + int cycleCount, + boolean showLeftOrRight, + ArrayList allPointIds, + ArrayList allPointNames, + ISelectedCallback callback) { + if (callback == null) { + return; + } + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_TIME, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_TIME.equals(requestKey)) { + List selectedIds = result.getStringArrayList(KEY_SELECTED_POINT_IDS); + int targetCycleIndex = result.getInt(KEY_CYCLE_INDEX, -1); + callback.onSelected(targetCycleIndex, selectedIds); + } + }); + BottomSheetDialogFragment fragment = new SelectReSurveyorPointFragment(); + Bundle args = new Bundle(); + args.putStringArrayList(KEY_ALL_POINT_IDS, allPointIds); + args.putStringArrayList(KEY_ALL_POINT_NAMES, allPointNames); + args.putBoolean(KEY_SHOW_LEFT_RIGHT, showLeftOrRight); + args.putInt(KEY_CYCLE_COUNT, cycleCount); + fragment.setArguments(args); + fragment.show(fragmentManager, SelectReSurveyorPointFragment.class.getName()); + } + + public interface ISelectedCallback { + void onSelected(int cycleIndex, List pointIds); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectSurveyorStationTypeFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectSurveyorStationTypeFragment.java new file mode 100644 index 0000000..0fa0925 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectSurveyorStationTypeFragment.java @@ -0,0 +1,176 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.ProjectType; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import com.bingce.controlnetwork.R; + +/** + * 选择站的类型(闭合导线,直导线等) + */ +public class SelectSurveyorStationTypeFragment extends BottomSheetDialogFragment { + public static final String TAG = SelectProjectAndSurveyorCycleFragment.class.getName(); + //上个页面传过来的 + private String projectType; + + private final int[] needHideIdsTriangle = { + R.id.wire_well_double, R.id.wire_well + }; + private final int[] needHideIdsConnection = { + R.id.default_type, R.id.wire_zhi, R.id.wire_fuhe, R.id.wire_close, + R.id.wire_random + }; + private final int[] needHideIdsHeightTraverse = { + R.id.default_type, R.id.wire_zhi, R.id.wire_fuhe, R.id.wire_close, + R.id.wire_random, R.id.wire_well_double, R.id.wire_well + }; + + private SelectSurveyorStationTypeFragment() { + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + if (getArguments() != null) { + projectType = getArguments().getString(KEY_PROJECT_TYPE); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater + .inflate( + R.layout.fragment_bottom_popup_surveyor_station_type_select_layout, + container, + false); + initListener(view); + initShowOrHideView(view); + return view; + } + + private void initShowOrHideView(View view) { + ProjectType.getTarget(projectType, (projectTypeBack) -> { + if (projectTypeBack == ProjectType.TRIANGLE) { + hideViews(view, needHideIdsTriangle); + } else if (projectTypeBack == ProjectType.CONNECTION) { + hideViews(view, needHideIdsConnection); + } else if (projectTypeBack == ProjectType.HEIGHT_TRAVERSE) { + hideViews(view, needHideIdsHeightTraverse); + } + return null; + }); + } + + private void hideViews(View view, int[] ids) { + for (int i = 0; i < ids.length; i++) { + View currentView = view.findViewById(ids[i]); + currentView.setVisibility(View.GONE); + } + } + + private void initListener(View view) { + View.OnClickListener onClickListener = v -> { + if (v == null) { + dismiss(); + return; + } + int id = v.getId(); + String type = TYPE_DEFAULT; + if (id == R.id.wire_zhi) { + type = TYPE_LINE_SINGLE; + } else if (id == R.id.wire_fuhe) { + type = TYPE_LINE_ATTACH; + } else if (id == R.id.wire_close) { + type = TYPE_LINE_CLOSE; + } else if (id == R.id.wire_random) { + type = TYPE_LINE_RANDOM; + } else if (id == R.id.wire_well) { + type = TYPE_WELL_WIRE; + } else if (id == R.id.wire_well_double) { + type = TYPE_WELL_WIRE_DOUBLE; + } + Bundle args = new Bundle(); + args.putString(KEY_RESULT_TYPE, type); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_SELECT, args); + dismiss(); + }; + + setOnClickListener(view, R.id.default_type, onClickListener); + setOnClickListener(view, R.id.wire_zhi, onClickListener); + setOnClickListener(view, R.id.wire_fuhe, onClickListener); + setOnClickListener(view, R.id.wire_close, onClickListener); + setOnClickListener(view, R.id.wire_random, onClickListener); + setOnClickListener(view, R.id.wire_well, onClickListener); + setOnClickListener(view, R.id.wire_well_double, onClickListener); + setOnClickListener(view, R.id.cancel, v -> dismiss()); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (getDialog() == null) { + return; + } + getDialog().getWindow().setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT); + } + + private static void setOnClickListener(View root, int id, View.OnClickListener onClickListener) { + View view = root.findViewById(id); + if (view != null) { + view.setOnClickListener(onClickListener); + } + } + + private static final String KEY_PROJECT_TYPE = "__KEY_PROJECT_TYPE__"; + + private static final String KEY_REQUEST_SELECT = "__SELECT__"; + private static final String KEY_RESULT_TYPE = "__KEY_RESULT_TYPE__"; + + public static final String TYPE_DEFAULT = "__default__";//多测回测角 + public static final String TYPE_LINE_SINGLE = "__line_single";//支导线 + public static final String TYPE_LINE_ATTACH = "__line_attach";//附合导线 + public static final String TYPE_LINE_CLOSE = "__line_close";//闭合导线 + public static final String TYPE_LINE_RANDOM = "__line_random";//无定向导线 + public static final String TYPE_WELL_WIRE = "__well_wire";//井定向 + public static final String TYPE_WELL_WIRE_DOUBLE = "__well_wire_double";//二井定向 + + public static void select(FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String projectType, + IOnSelectCallback callback) { + SelectSurveyorStationTypeFragment fragment = new SelectSurveyorStationTypeFragment(); + Bundle bundle = new Bundle(); + bundle.putString(KEY_PROJECT_TYPE, projectType); + fragment.setArguments(bundle); + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_SELECT, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_SELECT.equals(requestKey)) { + callback.onSurveyorCycleSelected(result.getString(KEY_RESULT_TYPE)); + } + }); + fragment.show(fragmentManager, TAG); + } + + + public interface IOnSelectCallback { + void onSurveyorCycleSelected(String type); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectSurveyorStationTypeWellSubFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectSurveyorStationTypeWellSubFragment.java new file mode 100644 index 0000000..f9524bc --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectSurveyorStationTypeWellSubFragment.java @@ -0,0 +1,103 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import com.bingce.controlnetwork.R; + +/** + * 选择二井定向-地上还是地下 + */ +public class SelectSurveyorStationTypeWellSubFragment extends BottomSheetDialogFragment { + public static final String TAG = SelectProjectAndSurveyorCycleFragment.class.getName(); + + private SelectSurveyorStationTypeWellSubFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater + .inflate( + R.layout.fragment_bottom_popup_surveyor_station_type_select_layout_well_sub, + container, + false); + View.OnClickListener onClickListener = v -> { + if (v == null) { + dismiss(); + return; + } + int id = v.getId(); + String type = TYPE_GROUND; + if (id == R.id.wire_ground) { + type = TYPE_GROUND; + } else if (id == R.id.wire_underground) { + type = TYPE_UNDERGROUND; + } + Bundle args = new Bundle(); + args.putString(KEY_TYPE, type); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_SELECT, args); + dismiss(); + }; + + setOnClickListener(view, R.id.wire_ground, onClickListener); + setOnClickListener(view, R.id.wire_underground, onClickListener); + setOnClickListener(view, R.id.cancel, v -> dismiss()); + + return view; + } + + private static void setOnClickListener(View root, int id, View.OnClickListener onClickListener) { + View view = root.findViewById(id); + if (view != null) { + view.setOnClickListener(onClickListener); + } + } + + private static final String KEY_REQUEST_SELECT = "__SELECT__"; + private static final String KEY_TYPE = "__SELECT_TYPE__"; + + public static final String TYPE_GROUND = "type_ground";//二井定向地上 + public static final String TYPE_UNDERGROUND = "type_underground";//二井定向地下 + + public static void select(FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + IOnSelectCallback callback) { + SelectSurveyorStationTypeWellSubFragment fragment = new SelectSurveyorStationTypeWellSubFragment(); + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_SELECT, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_SELECT.equals(requestKey)) { + callback.onSurveyorCycleSelected(result.getString(KEY_TYPE)); + } + }); + fragment.show(fragmentManager, TAG); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (getDialog() == null) { + return; + } + getDialog().getWindow().setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT); + } + + public interface IOnSelectCallback { + void onSurveyorCycleSelected(String type); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectToleranceBottomSheetFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectToleranceBottomSheetFragment.java new file mode 100644 index 0000000..5af4a8b --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectToleranceBottomSheetFragment.java @@ -0,0 +1,156 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; + +import com.bingce.controlnetwork.R; + +/** + * 限差选择框(限差设置-限差模板点击后的操作) + */ +public class SelectToleranceBottomSheetFragment extends DialogFragment { + public static final String TAG = SelectToleranceBottomSheetFragment.class.getName(); + private ComponentSwitchToleranceFragment componentSwitchToleranceFragment; + + private SelectToleranceBottomSheetFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater + .inflate(R.layout.fragment_tolerance_select_framelayout_layout, + container, + false); + String projectType = ""; + String groupId = ""; + String levelId = ""; + String toleranceId = ""; + if (getArguments() != null) { + projectType = getArguments().getString(KEY_PROJECT_TYPE); + groupId = getArguments().getString(KEY_GROUP_ID); + levelId = getArguments().getString(KEY_LEVEL_ID); + toleranceId = getArguments().getString(KEY_TOLERANCE_ID); + } + + componentSwitchToleranceFragment = + ComponentSwitchToleranceFragment.newInstance(projectType, groupId, levelId, toleranceId); + + getChildFragmentManager() + .beginTransaction() + .replace(R.id.container, componentSwitchToleranceFragment) + .commit(); + + View toleranceManager = view.findViewById(R.id.btn_tolerance_manager); + if (toleranceManager != null) { + String finalProjectType = projectType; + toleranceManager.setOnClickListener(v -> ToleranceManageFragment.start(getContext(), finalProjectType)); + } + + view.setOnClickListener(v -> dismiss()); + return view; + } + + @Override + public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + if (getDialog() != null) { + final Window window = getDialog().getWindow(); + + window.setWindowAnimations(R.style.animate_dialog); + window.setBackgroundDrawable(null); + + WindowManager.LayoutParams params = window.getAttributes(); + params.gravity = Gravity.BOTTOM; + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + window.setAttributes(params); + } + } + + @Override + public void onStart() { + super.onStart(); + EventBus.getDefault().register(this); + getDialog().setOnKeyListener((dialog, keyCode, event) -> { + if ((keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP)) { + if (!componentSwitchToleranceFragment.doBack()) { + dismiss(); + } + return true; + } + return false; + }); + } + + @Override + public void onStop() { + super.onStop(); + EventBus.getDefault().unregister(this); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(ComponentSwitchToleranceFragment.SelectedToleranceEvent event) { + Bundle args = new Bundle(); + args.putString(KEY_TOLERANCE_ID, event.toleranceId); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_SELECT, args); + dismiss(); + } + + private static final String KEY_REQUEST_SELECT = "__SELECT__"; + private static final String KEY_PROJECT_TYPE = "___project__type"; + private static final String KEY_GROUP_ID = "___group__id"; + private static final String KEY_LEVEL_ID = "____level__id"; + private static final String KEY_TOLERANCE_ID = "____tolerance__id"; + + public static void select(FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String projectType, + String defaultGroupId, + String defaultLevelId, + String defaultToleranceId, + IOnSelectCallback callback) { + Bundle args = new Bundle(); + args.putString(KEY_PROJECT_TYPE, projectType); + args.putString(KEY_GROUP_ID, defaultGroupId); + args.putString(KEY_LEVEL_ID, defaultLevelId); + args.putString(KEY_TOLERANCE_ID, defaultToleranceId); + + SelectToleranceBottomSheetFragment fragment = new SelectToleranceBottomSheetFragment(); + fragment.setArguments(args); + + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_SELECT, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_SELECT.equals(requestKey)) { + callback.onToleranceSelected( + result.getString(KEY_TOLERANCE_ID)); + } + }); + fragment.show(fragmentManager, TAG); + } + + public interface IOnSelectCallback { + void onToleranceSelected(String toleranceId); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SelectToleranceTemplateBottomSheetFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectToleranceTemplateBottomSheetFragment.java new file mode 100644 index 0000000..ad345da --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SelectToleranceTemplateBottomSheetFragment.java @@ -0,0 +1,144 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; + +import com.bingce.controlnetwork.R; + +/** + * 选择限差参考模板(自定义限差管理点击+后的操作) + */ +public class SelectToleranceTemplateBottomSheetFragment extends DialogFragment { + public static final String TAG = SelectToleranceTemplateBottomSheetFragment.class.getName(); + private ComponentSwitchToleranceFragment componentSwitchToleranceFragment; + + private String projectType; + + private SelectToleranceTemplateBottomSheetFragment() { + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + if (getArguments() != null) { + projectType = getArguments().getString(KEY_PROJECT_TYPE, ""); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater + .inflate(R.layout.fragment_tolerance_template_select_layout, + container, + false); + + componentSwitchToleranceFragment = + ComponentSwitchToleranceFragment.newInstance(projectType, "", "", ""); + + getChildFragmentManager() + .beginTransaction() + .replace(R.id.container, componentSwitchToleranceFragment) + .commit(); + + view.setOnClickListener(v -> dismiss()); + return view; + } + + @Override + public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + if (getDialog() != null) { + final Window window = getDialog().getWindow(); + + window.setWindowAnimations(R.style.animate_dialog); + window.setBackgroundDrawable(null); + + WindowManager.LayoutParams params = window.getAttributes(); + params.gravity = Gravity.BOTTOM; + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + window.setAttributes(params); + } + } + + @Override + public void onStart() { + super.onStart(); + EventBus.getDefault().register(this); + getDialog().setOnKeyListener((dialog, keyCode, event) -> { + if ((keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP)) { + if (!componentSwitchToleranceFragment.doBack()) { + dismiss(); + } + return true; + } + return false; + }); + } + + @Override + public void onStop() { + super.onStop(); + EventBus.getDefault().unregister(this); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(ComponentSwitchToleranceFragment.SelectedToleranceEvent event) { + Bundle args = new Bundle(); + args.putString(KEY_TOLERANCE_ID, event.toleranceId); + getParentFragmentManager().setFragmentResult(KEY_REQUEST_SELECT, args); + dismiss(); + } + + private static final String KEY_REQUEST_SELECT = "__SELECT__"; + private static final String KEY_TOLERANCE_ID = "___key__tolerance__id"; + private static final String KEY_PROJECT_TYPE = "KEY_PROJECT_TYPE"; + + public static void select(FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String projectType, + IOnSelectCallback callback) { + SelectToleranceTemplateBottomSheetFragment fragment = + new SelectToleranceTemplateBottomSheetFragment(); + + Bundle bundle = new Bundle(); + bundle.putString(KEY_PROJECT_TYPE, projectType); + fragment.setArguments(bundle); + + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_SELECT, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_SELECT.equals(requestKey)) { + callback.onToleranceSelected( + result.getString(KEY_TOLERANCE_ID)); + } + }); + fragment.show(fragmentManager, TAG); + } + + public interface IOnSelectCallback { + void onToleranceSelected(String toleranceId); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ServiceFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ServiceFragment.java new file mode 100644 index 0000000..1ce6514 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ServiceFragment.java @@ -0,0 +1,108 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.View; +import android.webkit.JavascriptInterface; + +import androidx.annotation.Nullable; + +import com.bingce.data.sync.utils.LeanCloudConfigLoader; +import com.bingce.surveyor.agentweb.AgentWebFragment; +import com.bingce.surveyor.agentweb.FragmentKeyDown; +import com.bingce.surveyor.agentweb.sonic.SonicImpl; +import com.bingce.surveyor.constant.ServicePageUrl; +import com.bingce.utils.StringUtil; +import com.just.agentweb.MiddlewareWebClientBase; + + +/** + * 主页面-服务 + */ +public class ServiceFragment extends AgentWebFragment implements FragmentKeyDown { + public static final String TAG = "ServiceFragment"; + public final String offlineUrl = "file:///android_asset/service_default.html"; + private SonicImpl mSonicImpl; + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + // 1. 首先创建SonicImpl + mSonicImpl = new SonicImpl(offlineUrl, this.getContext()); + // 2. 调用 onCreateSession + mSonicImpl.onCreateSession(); + //3. 创建AgentWeb ,注意创建AgentWeb的时候应该使用加入SonicWebViewClient中间件 + super.onViewCreated(view, savedInstanceState); // 创建 AgentWeb 注意的 go("") 传入的 mUrl 应该null 或者"" + //4. 注入 JavaScriptInterface + if (mAgentWeb != null) { + //注入对象 + mAgentWeb.getJsInterfaceHolder().addJavaObject("android", this); + } + //5. 最后绑定AgentWeb + mSonicImpl.bindAgentWeb(mAgentWeb); + + refresh(); + } + + //在步骤3的时候应该传入给AgentWeb + @Override + public MiddlewareWebClientBase getMiddlewareWebClient() { + return mSonicImpl.createSonicClientMiddleWare(); + } + + //getUrl 应该为null + @Override + public String getUrl() { + return null; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + //销毁SonicSession + if (mSonicImpl != null) { + mSonicImpl.destrory(); + } + } + + @JavascriptInterface + public void refresh() { + String queryUrl = "android_url_service_for_control"; + LeanCloudConfigLoader.findInBackground(queryUrl, instance -> { +// new LCQuery<>("Configuration") +// .whereEqualTo("name", queryUrl) +// .limit(1) +// .findInBackground().subscribe(new Observer>() { +// @Override +// public void onSubscribe(Disposable d) { +// +// } +// +// @Override +// public void onNext(List avObjects) { + if (/*avObjects != null && !avObjects.isEmpty() && avObjects.get(0).getString("value") != null*/instance != null && StringUtil.isNotEmpty(instance.value)) { +// ((App) Utils.getApp()).servicePageUrl = /*avObjects.get(0).getString("value")*/instance.value; + ServicePageUrl.url = instance.value; + mAgentWeb.getUrlLoader().loadUrl(ServicePageUrl.url); + } +// } +// +// @Override +// public void onError(Throwable e) { +// +// } +// +// @Override +// public void onComplete() { +// +// } + }); + } + + @Override + public void onResume() { + super.onResume(); +// Activity activity = getActivity(); +// if (activity instanceof MainActivity) { +// ((MainActivity) activity).setCurrentTab(2); +// } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/StationDataAdjustDialogFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/StationDataAdjustDialogFragment.java new file mode 100644 index 0000000..24fced5 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/StationDataAdjustDialogFragment.java @@ -0,0 +1,183 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.ViewItemType; +import com.bingce.controlapphelper.surveyor.method.RadianMethod; +import com.bingce.controlapphelper.surveyor.method.SurveyorAdjustMethod; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlnetwork.adapter.BaseAdapter; +import com.bingce.utils.Util; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.ui.vh.StationAdjustItemViewHolder; +import com.bingce.controlnetwork.ui.widget.ViewFactory; + +public class StationDataAdjustDialogFragment extends DialogFragment { + public static final String KEY_SHOW_TYPE = "__key_show_type"; + private static final String KEY_LIST = "__key_list"; + private static final String KEY_IS_SHOW_SLOP_DISTANCE = "__key_show_slop"; + + //key_type对应的常量 + public static final String TYPE_ANGLE_DISTANCE = "TYPE_ANGLE_DISTANCE";//水平角,垂直角,距离 + public static final String TYPE_ANGLE_VER_AND_DISTANCE = "TYPE_ANGLE_VER_AND_DISTANCE";//垂直角,距离 + public static final String TYPE_ALONE_DISTANCE = "TYPE_ALONE_DISTANCE";//距离 + + + private String showType; + + private StationDataAdjustDialogFragment() { + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + Bundle arguments = getArguments(); + if (arguments != null) { + showType = arguments.getString(KEY_SHOW_TYPE); + } + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (getDialog() == null) { + return; + } + Window window = getDialog().getWindow(); + window.setBackgroundDrawable(new ColorDrawable(0x00000000)); + window.setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT); + } + + @Nullable + @org.jetbrains.annotations.Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_station_data_adjust_dialog_layout, container, false); + if (getArguments() != null) { + ArrayList items = getArguments().getParcelableArrayList(KEY_LIST); + boolean isShowSlop = getArguments().getBoolean(KEY_IS_SHOW_SLOP_DISTANCE, true); + RecyclerView recyclerView = rootView.findViewById(R.id.list); + TextView distanceTitle = rootView.findViewById(R.id.distance_angle_title); + if (recyclerView != null) { + _Adapter adapter = new _Adapter(items); + recyclerView.setAdapter(adapter); + if (distanceTitle != null) { + distanceTitle.setText(isShowSlop ? R.string.distance_slope : R.string.distance_horizontal); + } + } + + initShowView(rootView.findViewById(R.id.hor_angle_title), + rootView.findViewById(R.id.ver_angle_title), + rootView.findViewById(R.id.distance_angle_title)); + + } + return rootView; + } + + + private void initShowView(View horView, View verView, View disView) { + if (showType == null) return; + switch (showType) { + case TYPE_ALONE_DISTANCE: + horView.setVisibility(View.GONE); + verView.setVisibility(View.GONE); + disView.setVisibility(View.VISIBLE); + break; + case TYPE_ANGLE_VER_AND_DISTANCE: + horView.setVisibility(View.GONE); + verView.setVisibility(View.VISIBLE); + disView.setVisibility(View.VISIBLE); + break; + case TYPE_ANGLE_DISTANCE: + default: + horView.setVisibility(View.VISIBLE); + verView.setVisibility(View.VISIBLE); + disView.setVisibility(View.VISIBLE); + break; + } + } + + + private class _Adapter extends BaseAdapter { + + public _Adapter(List items) { + super(items); + } + + @Override + protected StationAdjustItemViewHolder createVH(@NotNull ViewGroup parent, int viewType) { + RecyclerView.ViewHolder viewHolder = ViewFactory.generatorViewHolder(parent.getContext(), parent, ViewItemType.stationAdjust); + if (viewHolder instanceof StationAdjustItemViewHolder) { + return (StationAdjustItemViewHolder) viewHolder; + } + return null; + } + + @Override + public void onBindViewHolder(@NonNull @NotNull StationAdjustItemViewHolder holder, int position) { + SurveyorAdjustMethod.Item item = getItem(position); + + initShowView(holder.horAngle, holder.verAngle, holder.distance); + + setText(holder.pointName, item.getPointName()); + setText(holder.horAngle, formatAngle(item.getHorAngle())); + setText(holder.verAngle, formatAngle(item.getVerAngle())); + setText(holder.distance, formatDistance(item.getDistance())); + } + + + private void setText(TextView textView, String string) { + if (textView != null) { + textView.setText(string); + } + } + + private String formatAngle(double angle) { + if (angle < 0) { + return ""; + } + return RadianMethod.dmsStringOf(angle); + } + + private String formatDistance(double distance) { + if (distance < 0) { + return ""; + } + return Util.formatDouble2String(distance, SettingValueUtil.getLengthDecimalPoint()); + } + } + + public static void showDialog(String type, ArrayList finalItemList, + Boolean isShowSlopDistance, + FragmentManager fragmentManager) { + StationDataAdjustDialogFragment dialogFragment = new StationDataAdjustDialogFragment(); + Bundle args = new Bundle(); + args.putString(KEY_SHOW_TYPE, type); + args.putParcelableArrayList(KEY_LIST, finalItemList); + args.putBoolean(KEY_IS_SHOW_SLOP_DISTANCE, isShowSlopDistance); + dialogFragment.setArguments(args); + dialogFragment.show(fragmentManager, StationDataAdjustDialogFragment.class.getName()); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/StringInputFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/StringInputFragment.java new file mode 100644 index 0000000..620fa02 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/StringInputFragment.java @@ -0,0 +1,88 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.rengwuxian.materialedittext.MaterialEditText; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.R; + +public class StringInputFragment extends AbstractFullScreenDialogFragment { + @Override + protected View createContentView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.content_string_input_layout, container, false); + MaterialEditText editText = view.findViewById(R.id.editor); + if (editText != null && getArguments() != null) { + editText.setText(getArguments().getString(KEY_DEFAULT_STRING)); + } + return view; + } + + @Override + protected void onConfirm() { + Bundle args = new Bundle(); + if (getView() != null) { + MaterialEditText editText = getView().findViewById(R.id.editor); + if (editText.getText() != null) { + String string = editText.getText().toString(); + if (string.isEmpty()) { + ToastUtils.showShort(R.string.string_no_empty); + return; + } + args.putString(KEY_STRING_RESULT, string); + } + } + getParentFragmentManager() + .setFragmentResult(KEY_REQUEST_INPUT, args); + super.onConfirm(); + } + + private static final String TAG = StringInputFragment.class.getName(); + private static final String KEY_REQUEST_INPUT = StringInputFragment.class.getName() + "_REQUEST"; + private static final String KEY_STRING_RESULT = StringInputFragment.class.getName() + "_result"; + private static final String KEY_DEFAULT_STRING = StringInputFragment.class.getName() + "__DEFAULT_STRING"; + + public static void input(FragmentManager fragmentManager, + String title, + @NonNull LifecycleOwner lifecycleOwner, + IInputCallback callback) { + input(fragmentManager, title, null, lifecycleOwner, callback); + } + + public static void input(FragmentManager fragmentManager, + String title, + String defaultString, + @NonNull LifecycleOwner lifecycleOwner, + IInputCallback callback) { + Bundle args = new Bundle(); + StringInputFragment fragment = new StringInputFragment(); + fragment.setArguments(args); + if (defaultString != null) { + args.putString(KEY_DEFAULT_STRING, defaultString); + } + setArgs(args, title, null); + fragmentManager + .setFragmentResultListener( + KEY_REQUEST_INPUT, + lifecycleOwner, + (requestKey, result) -> { + if (KEY_REQUEST_INPUT.equals(requestKey)) { + callback.onGetInput(result.getString(KEY_STRING_RESULT)); + } + }); + fragment.show(fragmentManager, TAG); + } + + public interface IInputCallback { + void onGetInput(String string); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorRouteStationFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorRouteStationFragment.java new file mode 100644 index 0000000..b80faba --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorRouteStationFragment.java @@ -0,0 +1,200 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.LiveData; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.route.RouteRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.util.ScheduleUtil; +import com.bingce.controlapphelper.util.StationUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.SurveyorStationListAdapter; +import com.bingce.controlnetwork.databinding.FragmentSurveyorRouteStationBinding; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.fragment.station.heighttraverse.CreateStationForHeightTraverseFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.heighttraverse.MeasureHeightTraverseFragment; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +/** + * 高程导线 测量页-项目路线下的测站列表和新增测站 + */ +public class SurveyorRouteStationFragment extends BaseFragment { + public static final String TAG = SurveyorRouteStationFragment.class.getName(); + private SurveyorStationListAdapter adapter; + private FragmentSurveyorRouteStationBinding mBinding; + + private static final String KEY_DETAIL_OR_SURVEYOR = "___editable___";//标识点击item进入测量界面还是测站详情 + + public static SurveyorRouteStationFragment newInstance(String projectId, String routeId) { + return newInstance(projectId, routeId, true); + } + + public static SurveyorRouteStationFragment newInstance(String projectId, String routeId, boolean detailOrSurveyor) { + SurveyorRouteStationFragment fragment = new SurveyorRouteStationFragment(); + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_ROUTE_ID, routeId); + bundle.putBoolean(KEY_DETAIL_OR_SURVEYOR, detailOrSurveyor); + fragment.setArguments(bundle); + return fragment; + } + + /** + * 去测量或者详情页面 + */ + private void goStationMeasureOrDetail(SurveyorStationRecord item) { + String stationId = item.getId(); + ThreadPoolUtil.execute(() -> { + SurveyorStationRecord stationRecord = SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getRecordSync(stationId); + if (stationRecord == null || stationRecord.getItems() == null || stationRecord.getItems().isEmpty()) { + return; + } + + //站的名称 导线+点名 + String stationName = StationUtil.getStationName(stationRecord); + + MeasureHeightTraverseFragment.start(requireContext(), stationId, stationName); + }); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + mBinding = FragmentSurveyorRouteStationBinding.inflate(inflater, container, false); + return mBinding.getRoot(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + mBinding = null; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initView(); + initListener(); + initData(); + } + + private void initView() { + mBinding.btnCreateStation.setVisibility(getRouteId() == null ? View.GONE : View.VISIBLE); + } + + private void initListener() { + mBinding.btnCreateStation.setOnClickListener(v -> checkCreateStation(checkSuccess -> { + if (!checkSuccess) return; + CreateStationForHeightTraverseFragment.start(requireContext(), getProjectId(), getRouteId()); + })); + } + + private void checkCreateStation(ICallBackCheckStation callBackCheckStation) { + ThreadPoolUtil.execute(() -> { + String projectId = getProjectId(); + String routeId = getRouteId(); + if (projectId == null || routeId == null) { + ToastUtils.showShort(R.string.parameter_exception); + callBackCheckStation.result(false); + return; + } + RouteRecord routeRecord = SurveyorDatabaseFactory.instance.getRouteDataSource().getByIdSync(routeId); + if (routeRecord == null) { + ToastUtils.showShort(R.string.route_record_exception); + callBackCheckStation.result(false); + return; + } + + //判断上一个测站是否通过检测 + SurveyorStationRecord stationLatest = SurveyorDatabaseFactory.instance.getSurveyorStation().getByProjectRouteLatest(projectId, routeId); + if (stationLatest != null && stationLatest.items != null && stationLatest.items.size() > 0) { + String stationNameNotFinish = ScheduleUtil.INSTANCE.getStationNameNotFinishForHeightTraverse(stationLatest); + if (!TextUtils.isEmpty(stationNameNotFinish)) { + ToastUtils.showShort(Tools.getString(R.string.station_failed_test, stationNameNotFinish)); + callBackCheckStation.result(false); + return; + } + } + + SurveyorStationRecord stationRecord = SurveyorDatabaseFactory.instance.getSurveyorStation().getByProjectRouteLatest(projectId, routeId); + if (stationRecord != null && stationRecord.items != null) { + for (SurveyorPoint surveyorPoint : stationRecord.items) { + if (surveyorPoint.getOriginalPointId().equals(routeRecord.getEndPointId())) { + ToastUtils.showShort(R.string.route_begin_end_been_created); + callBackCheckStation.result(false); + return; + } + } + } + + callBackCheckStation.result(true); + }); + } + + private void initData() { + if (getArguments() != null) { + update(getProjectId(), getRouteId()); + } + } + + private String getProjectId() { + if (getArguments() != null) { + return getArguments().getString(BundleConstants.KEY_PROJECT_ID); + } + return null; + } + + private String getRouteId() { + if (getArguments() != null) { + return getArguments().getString(BundleConstants.KEY_ROUTE_ID); + } + return null; + } + + /** + * 根据项目id和路线id获取测站记录 + */ + public void update(String projectId, String routeId) { + LiveData> liveData = SurveyorDatabaseFactory.instance.getSurveyorStation().getByProjectRouteLiveData(projectId, routeId); + liveData.observe(getViewLifecycleOwner(), this::updateUi); + } + + private void updateUi(List stationList) { + if (adapter == null) { + adapter = new SurveyorStationListAdapter(stationList, + getChildFragmentManager(), + getViewLifecycleOwner(), + this::runOnUI, + getContext(), + this::goStationMeasureOrDetail, + true); + mBinding.recyclerView.setAdapter(adapter); + } else { + adapter.updateData(stationList); + } + } + + private interface ICallBackCheckStation { + void result(boolean checkSuccess); + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorSettingsFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorSettingsFragment.java new file mode 100644 index 0000000..15ddfd9 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorSettingsFragment.java @@ -0,0 +1,98 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.SwitchPreferenceCompat; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.utils.ThreadPoolUtil; + +import org.jetbrains.annotations.NotNull; + +public class SurveyorSettingsFragment extends Fragment { + public static final String TAG = SurveyorSettingsFragment.class.getName(); + + @Nullable + @org.jetbrains.annotations.Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_fragment_container_layout, container, false); + _SettingsFragment fragment = new _SettingsFragment(); + fragment.setArguments(getArguments()); + getChildFragmentManager() + .beginTransaction() + .add(R.id.container, fragment) + .commit(); + return rootView; + } + + public static class _SettingsFragment extends PreferenceFragmentCompat { + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + addPreferencesFromResource(R.xml.surveyor_settings_prefs); + + SwitchPreferenceCompat distanceType = findPreference("surveyor_settings_key_distance_type"); + if (getArguments() != null) { + String stationId = getArguments().getString(BundleConstants.KEY_SURVEYOR_STATION_ID); + ThreadPoolUtil.execute(() -> { + ISurveyorStationDataSource stationDataSource = + SurveyorDatabaseFactory.instance.getSurveyorStation(); + SurveyorStationRecord stationRecord = stationDataSource.getRecordSync(stationId); + if (stationRecord == null) { + return; + } + runOnUI(() -> { + if (distanceType != null) { + distanceType.setChecked(stationRecord.isShowSlopDistance()); + distanceType.setOnPreferenceChangeListener((preference, newValue) -> { + if (newValue instanceof Boolean) { +// Log.d("___distance_type", newValue.toString()); + stationRecord.setShowSlopDistance((boolean) newValue); + stationDataSource.save(stationRecord); + } + return true; + }); + } + }); + }); + } + } + + private void runOnUI(Runnable action) { + if (getActivity() != null) { + getActivity().runOnUiThread(action); + } + } + } + +// public static void show(FragmentManager fragmentManager) { +// DialogFragment dialogFragment = new SurveyorSettingDialogFragment(); +// dialogFragment.show(fragmentManager, SurveyorSettingDialogFragment.class.getName()); +// } + + public static void start(Context context, String surveyorStationId, String surveyorStationName) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_SURVEYOR_STATION_ID, surveyorStationId); + bundle.putString(BundleConstants.KEY_SURVEYOR_STATION_NAME, surveyorStationName); + FragmentContainerActivity.start(context, TAG, surveyorStationName, bundle); + } + + public static SurveyorSettingsFragment newInstance(Bundle bundle) { + SurveyorSettingsFragment fragment = new SurveyorSettingsFragment(); + fragment.setArguments(bundle); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorStationListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorStationListFragment.java new file mode 100644 index 0000000..62db4af --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/SurveyorStationListFragment.java @@ -0,0 +1,352 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.ConfigRecord; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.project.IProjectDataSource; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord; +import com.bingce.controlnetwork.guide.GuideSequence; +import com.bingce.controlnetwork.guide.ITapTargetProvider; +import com.bingce.utils.IOnSingleGetCallback; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.List; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.guide.GuideSequence; +import com.bingce.controlnetwork.guide.ITapTargetProvider; + +/** + * 主页面-测量 + */ +public class SurveyorStationListFragment extends BaseFragment { + private final ComponentSurveyorStationListFragment fragment = ComponentSurveyorStationListFragment.newInstance("", "", false); + + private String projectId; + private String periodId; + private final GuideSequence guideSequence; + private final IConfigDataSource configDataSource = + SurveyorDatabaseFactory.instance.getConfigDataSource(); + private static final int GUIDE_INDEX_SWITCH_STATION = 0;//切换测站列表 + + public SurveyorStationListFragment() { + super(); + guideSequence = new GuideSequence(GUIDE_INDEX_SWITCH_STATION + 1, new GuideSequence.IDelegate() { + @Override + public void show(int index, ITapTargetProvider provider) { + if (GUIDE_INDEX_SWITCH_STATION == index) { + provider.show4View( + getActivity(), + findViewById(R.id.select), + getString(R.string.guide_switch_station_list), + getString(R.string.guide_switch_station_list_describe) + ); + } + } + + @Override + public void dismiss(int index) { + if (GUIDE_INDEX_SWITCH_STATION == index) { + ConfigConstants.markGuideCompleted(ConfigConstants.KEY_GUIDE_SWITCH_STATION_LIST, configDataSource); + } + } + }); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_project_surveyor_station_list_layout, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + + SurveyorDatabaseFactory + .instance + .getConfigDataSource() + .getLiveDataByKey(ConfigConstants.KEY_DEFAULT_PROJECT_ID) + .observe(getViewLifecycleOwner(), onProjectIdCallback::onGet); + } + + @Override + public void onResume() { + super.onResume(); + refreshUI(); + } + + private final IOnSingleGetCallback onSurveyorCycleRecordCallback = new IOnSingleGetCallback() { + @Override + public void onGet(SurveyorPeriodRecord instance) { + if (instance == null) { + update(projectId, ""); + return; + } + periodId = instance.getId(); + + update(projectId, periodId); + } + }; + + private final IOnSingleGetCallback onProjectRecordCallback = new IOnSingleGetCallback() { + @Override + public void onGet(ProjectRecord instance) { + if (instance == null) { + update("", ""); + return; + } + projectId = instance.id; + SurveyorDatabaseFactory + .instance + .getSurveyorPeriod() + .getDefault(projectId, onSurveyorCycleRecordCallback); + } + }; + + /** + * 第一次获取到的测其id + */ + private final IOnSingleGetCallback onSurveyorCycleCallback = new IOnSingleGetCallback() { + @Override + public void onGet(ConfigRecord instance) { + if (instance == null) { + SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getDefaultRecord(onProjectRecordCallback); + return; + } + periodId = instance.getConfigValue(); + + update(projectId, periodId); + } + }; + + /** + * 第一次获取到的默认项目id + */ + private final IOnSingleGetCallback onProjectIdCallback = new IOnSingleGetCallback() { + @Override + public void onGet(ConfigRecord instance) { + if (instance == null) { + SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getDefaultRecord(onProjectRecordCallback); + return; + } + projectId = instance.getConfigValue(); + //project是否被删除 + if (projectId == null || projectId.isEmpty()) { + update("", ""); + return; + } + + SurveyorDatabaseFactory + .instance + .getConfigDataSource() + .getByKey(ConfigConstants.KEY_DEFAULT_PERIOD_ID, onSurveyorCycleCallback); + } + }; + + private void refreshUI() { + ThreadPoolUtil.execute(() -> { + //检测当前项目列表是否为空 + IProjectDataSource projectDataSource = + SurveyorDatabaseFactory.instance.getProjectDataSource(); + if (projectDataSource.recordCount() > 0 && !ConfigConstants.isGuideCompleted(ConfigConstants.KEY_GUIDE_SWITCH_STATION_LIST, configDataSource)) { + //当项目记录数大于0并且没有提示过的时候 进行引导提示 + runOnUI(() -> guideSequence.start(GUIDE_INDEX_SWITCH_STATION)); + } + }); + } + + private void updateText(String projectName, String cycleName) { + View view = getView(); + if (view == null) { + return; + } + runOnUI(() -> { + View titleLayout = view.findViewById(R.id.title); + if (titleLayout != null && + projectName != null && !projectName.isEmpty() && + cycleName != null && !cycleName.isEmpty()) { + //当项目和测期都不为空的时候设置 + titleLayout.setVisibility(View.VISIBLE); + + TextView title = view.findViewById(R.id.titleView); + if (title != null && getContext() != null) { + String string = projectName + " > " + cycleName; + title.setText(string); + } + + titleLayout.setOnClickListener(onSwitchClickListener); + } else if (titleLayout != null) { + titleLayout.setVisibility(View.INVISIBLE); + } + }); + } + + private final View.OnClickListener onSwitchClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + //去选择项目和测期 +// SelectProjectAndSurveyorCycleFragment.select( +// getChildFragmentManager(), +// getViewLifecycleOwner(), +// projectId, +// cycleIndex, +// (pId, pName, cycleId, cycleName) -> { +// //刷新数据 +// projectId = pId; +// cycleIndex = cycleId; +// //保存默认值 +// IConfigDataSource configDataSource = +// SurveyorDatabaseFactory +// .instance +// .getConfigDataSource(); +// //数据存储 +// configDataSource.set(ConfigConstants.KEY_DEFAULT_PROJECT_ID, projectId); +// configDataSource.set(ConfigConstants.KEY_DEFAULT_CYCLE_ID, cycleIndex); +// +// updateText(pName, cycleName); +// fragment.update(pId, cycleId); +// }); + +// BottomPageFragment.showBottom(getChildFragmentManager(), getViewLifecycleOwner(), +// selectData, +// selectData -> { +// +// }); + } + }; + +// private IData selectData = new IData() { +// +// @Nullable +// @Override +// public Object getData(@Nullable BottomBean bottomBean, @NonNull Continuation> $completion) { +// return null; +// } +// +// @Override +// public String getTitle(int pageIndex) { +// if (pageIndex == 0) { +// return "请选择项目"; +// } else if (pageIndex == 1) { +// return "请选择测期"; +// } +// return ""; +// } + +// @Nullable +// @Override +// public List getData(@Nullable BottomBean bottomBean) { +// List dataList = new ArrayList<>(); +// if (bottomBean == null) { +// List projectRecords = SurveyorDatabaseFactory +// .instance +// .getProjectDataSource() +// .getDataList(); +// +// for (ProjectRecord projectRecord : projectRecords) { +// dataList.add(new BottomBean(projectRecord.getId(), projectRecord.getProjectName(), +// 0, false, null)); +// } +// +// } else { +// if (bottomBean.getPageIndex() == 0) { +// +// List periodRecords = SurveyorDatabaseFactory.instance +// .getSurveyorPeriod().getDataListSyncByProjectId(bottomBean.getId()); +// +// for (SurveyorPeriodRecord projectRecord : periodRecords) { +// dataList.add(new BottomBean(projectRecord.getId(), projectRecord.getName(), +// 1, false, null)); +// } +// +// } +// } +// +// return dataList; +// } + +// }; + + /** + * @param projectId + * @param periodId + */ + private void update(final String projectId, final String periodId) { + if (fragment == null) { + return; + } + View view = getView(); + if (view == null) { + return; + } + ThreadPoolUtil.execute(() -> { + String projectName = ""; + String cycleName = ""; + ProjectRecord projectRecord = + SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getRecord(projectId); + if (projectRecord != null) { + projectName = projectRecord.getProjectName(); + } + SurveyorPeriodRecord periodRecord = + SurveyorDatabaseFactory + .instance + .getSurveyorPeriod() + .getRecord(periodId); + if (periodRecord == null) { + //获取第一个测期 + List records = SurveyorDatabaseFactory + .instance + .getSurveyorPeriod() + .getDataListSyncByProjectId(projectId); + if (!records.isEmpty()) { + periodRecord = records.get(0); + } + } + if (periodRecord != null) { + cycleName = periodRecord.getName(); + this.periodId = periodRecord.getId(); + } + updateText(projectName, cycleName); + + this.projectId = projectId; + + fragment.update(this.projectId, this.periodId); + }); + } + + public static SurveyorStationListFragment newInstance() { + return new SurveyorStationListFragment(); + } + + private void switchContentFragment() { + getChildFragmentManager() + .beginTransaction() + .replace(R.id.fragment_container, fragment, "___station_list") + .commit(); + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/TipsFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/TipsFragment.java new file mode 100644 index 0000000..c27b0a3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/TipsFragment.java @@ -0,0 +1,177 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlnetwork.R; + +public class TipsFragment extends AppCompatDialogFragment { + private final Handler mainHandler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(@NonNull Message msg) { + View contentView = getView(); + if (contentView == null) { + return; + } + Button confirm = contentView.findViewById(R.id.confirm_button); + int countDown = (Integer) msg.obj - 1; + if (countDown <= 0) { + confirm.setEnabled(true); + confirm.setText(R.string.confirm); + } else { + confirm.setEnabled(false); + confirm.setText(String.valueOf(countDown)); + Message message = Message.obtain(); + message.obj = countDown; + mainHandler.sendMessageDelayed(message, 1000); + } + } + }; + + private TipsFragment() { + super(); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View contentView = inflater.inflate(R.layout.fragment_tips_layout, container, false); + Button confirm = contentView.findViewById(R.id.confirm_button); + if (getArguments() != null) { + TextView tvTitle = contentView.findViewById(R.id.title); + if (tvTitle != null) { + tvTitle.setText(getArguments().getString(KEY_TITLE)); + } + TextView tvTips = contentView.findViewById(R.id.content); + if (tvTips != null) { + tvTips.setText(getArguments().getString(KEY_CONTENT)); + } + int countDown = getArguments().getInt(KEY_COUNT_DOWN, -1); + if (countDown > 0) { + confirm.setEnabled(false); + confirm.setText(String.valueOf(countDown)); + Message message = Message.obtain(); + message.obj = countDown; + mainHandler.sendMessageDelayed(message, 1000); + } + } + + if (confirm != null) { + confirm.setOnClickListener(v -> { + //这里主动dismiss不会收到回调 + Bundle args = new Bundle(); + args.putBoolean(KEY_QUIT_CANCEL, false); + getParentFragmentManager().setFragmentResult(getTag(), args); + dismiss(); + }); + } + return contentView; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (getDialog() == null) { + return; + } + if (getArguments() != null) { + boolean cancelAble = getArguments().getBoolean(KEY_CANCEL_ABLE, true); + if (!cancelAble) { + getDialog().setCancelable(false); + } + } + getDialog().getWindow().setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT); + } + + private static final String KEY_TITLE = "__TITLE"; + private static final String KEY_CONTENT = "___CONTENT"; + private static final String KEY_COUNT_DOWN = "__COUNT_DOWN"; + private static final String KEY_CANCEL_ABLE = "__cancel__able"; + private static final String KEY_QUIT_CANCEL = "__key_quit_cancel__"; + + public static void noCancelAbleTips(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + Context context, + String content, + int countdown, + IConfirmCallback callback) { + baseTips(fragmentManager, lifecycleOwner, context.getString(R.string.notice), content, countdown, false, false, callback); + } + + public static void cancelAbleTips(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + Context context, + String content, + int countdown, + IConfirmCallback callback) { + baseTips(fragmentManager, lifecycleOwner, context.getString(R.string.notice), content, countdown, true, true, callback); + } + + public static void tipsOnly(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + Context context, + String content) { + baseTips(fragmentManager, lifecycleOwner, context.getString(R.string.notice), content, + -1, true, false, null); + } + + private static void baseTips( + @NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String title, + String content, + int countdown, + boolean cancelAble, + boolean filterCancel, + IConfirmCallback callback) { + Bundle args = new Bundle(); + TipsFragment fragment = new TipsFragment(); + fragment.setArguments(args); + args.putString(KEY_TITLE, title); + args.putString(KEY_CONTENT, content); + args.putInt(KEY_COUNT_DOWN, countdown); + args.putBoolean(KEY_CANCEL_ABLE, cancelAble); + + String tag = String.valueOf(System.currentTimeMillis()); + + fragmentManager + .setFragmentResultListener( + tag, + lifecycleOwner, + (requestKey, result) -> { + if (callback != null) { + if (tag.equals(requestKey)) { + boolean isCancel = result.getBoolean(KEY_QUIT_CANCEL, true); + if (!isCancel || !filterCancel) { + callback.onConfirm(); + } + } + } + }); + + fragment.show(fragmentManager, tag); + + + } + + public interface IConfirmCallback { + void onConfirm(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/TipsWith2OptionFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/TipsWith2OptionFragment.java new file mode 100644 index 0000000..c0ed8e4 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/TipsWith2OptionFragment.java @@ -0,0 +1,452 @@ +package com.bingce.controlnetwork.fragment; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.FragmentTipsWith2OptionLayoutBinding; + +public class TipsWith2OptionFragment extends AppCompatDialogFragment { + + private static TipsWith2OptionFragment currentFragmet;//为了全局消失使用 + + private static final int COUNT_DOWN_TIME = 5;//如果有倒计时,默认是5秒 + + //key 返回的是确实还是取消... + private static final String KEY_CALL_BACK_CODE = "KEY_CALL_BACK_CODE"; + private static final int CALL_BACK_CODE_CONFIRM = 1; + private static final int CALL_BACK_CODE_CANCEL = 2; + private static final int CALL_BACK_CODE_OPTION = 3; + private static final int CALL_BACK_CODE_IGNORE = 4; + + private static final String KEY_TITLE = "__TITLE"; + private static final String KEY_CONTENT = "___CONTENT"; + private static final String KEY_CONFIRM_BUTTON = "_confirm_button"; + private static final String KEY_CANCEL_BUTTON = "_cancel_button"; + private static final String KEY_OPTION_BUTTON = "_option_button"; + private static final String KEY_CANCELABLE = "__cancelable"; + private static final String KEY_AUTO_DISMISS = "__auto_dismiss";//点击按钮后是否可以自动关闭 + private static final String KEY_COUNT_DOWN = "__COUNT_DOWN"; + + private int callBackCode; + + + private final Handler mainHandler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(@NonNull Message msg) { + View contentView = getView(); + if (contentView == null) { + return; + } + Button confirm = contentView.findViewById(R.id.confirm_button); + int countDown = (Integer) msg.obj - 1; + if (countDown <= 0) { + confirm.setEnabled(true); + confirm.setText(R.string.confirm); + confirm.setTextColor(Color.BLACK); + } else { + confirm.setEnabled(false); + confirm.setText(String.valueOf(countDown)); + Message message = Message.obtain(); + message.obj = countDown; + mainHandler.sendMessageDelayed(message, 1000); + } + } + }; + private FragmentTipsWith2OptionLayoutBinding mBinding; + + public static void hardTips(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String content, + IOperatorCallback callback) { + Bundle build = new Argument().content(content).cancelable(false).build(); + init(fragmentManager, lifecycleOwner, callback, build); + } + + + public static void tips(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + Argument argument, + IOperatorCallback callback) { + Bundle build = argument.build(); + init(fragmentManager, lifecycleOwner, callback, build); + } + + public static void dismissNowMe() { + if (currentFragmet != null && currentFragmet.getLifecycle().getCurrentState() == Lifecycle.State.RESUMED) { + currentFragmet.dismissAllowingStateLoss(); + currentFragmet = null; + } + } + + public static void tips(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String confirmButton, + String cancelButton, + String optionButton, + String content, + IOperatorCallback callback) { + Bundle build = new Argument().confirmText(confirmButton).cancelText(cancelButton).optionText(optionButton).content(content).build(); + init(fragmentManager, lifecycleOwner, callback, build); + } + + public static void tips(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String confirmButton, + String cancelButton, + String content, + IOperatorCallback callback) { + Bundle build = new Argument().confirmText(confirmButton).cancelText(cancelButton) + .content(content).build(); + init(fragmentManager, lifecycleOwner, callback, build); + } + + public static void tipsCountDownTime(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String confirmButton, + String cancelButton, + String optionButton, + String content, + IOperatorCallback callback) { + Bundle build = new Argument().confirmText(confirmButton).cancelText(cancelButton).optionText(optionButton) + .content(content).countDownTime(COUNT_DOWN_TIME).build(); + init(fragmentManager, lifecycleOwner, callback, build); + } + + + public static void tipsCannotCancel(@NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + String confirmButton, + String cancelButton, + String content, + IOperatorCallback callback) { + Bundle build = new Argument().confirmText(confirmButton).cancelText(cancelButton) + .content(content).cancelable(false).build(); + init(fragmentManager, lifecycleOwner, callback, build); + } + + @Override + public void onStart() { + super.onStart(); + Dialog dialog = getDialog(); + if (dialog != null) { + dialog.setCancelable(isCancelableOwn()); + + Window window = dialog.getWindow(); + if (window != null) { + window.setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT); + } + } + } + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + currentFragmet = this; + + mBinding = FragmentTipsWith2OptionLayoutBinding.inflate(inflater, container, false); + initData(); + initClickListener(); + initCountDownTime(); + + return mBinding.getRoot(); + } + + + @Override + public void onDestroyView() { + super.onDestroyView(); + mBinding = null; + currentFragmet = null; + } + + + private void initData() { + mBinding.title.setText(getTitle()); + mBinding.content.setText(getContent()); + mBinding.cancelButton.setText(getCancelText()); + String optionText = getOptionText(); + if (TextUtils.isEmpty(optionText)) { + mBinding.optionButton.setVisibility(View.GONE); + } else { + mBinding.optionButton.setVisibility(View.VISIBLE); + mBinding.optionButton.setText(optionText); + } + mBinding.confirmButton.setText(getConfirmText()); + } + + private void initCountDownTime() { + int countDownTime = getCountDownTime(); + if (countDownTime > 0) { + mBinding.confirmButton.setEnabled(false); + mBinding.confirmButton.setText(String.valueOf(countDownTime)); + mBinding.confirmButton.setTextColor(Color.RED); + Message message = Message.obtain(); + message.obj = countDownTime; + mainHandler.sendMessageDelayed(message, 1000); + } + } + + private void initClickListener() { + mBinding.confirmButton.setOnClickListener(view -> { + callBackCode = CALL_BACK_CODE_CONFIRM; + setResultForBtnClick(); + }); + mBinding.cancelButton.setOnClickListener(view -> { + callBackCode = CALL_BACK_CODE_CANCEL; + setResultForBtnClick(); + }); + mBinding.optionButton.setOnClickListener(view -> { + callBackCode = CALL_BACK_CODE_OPTION; + setResultForBtnClick(); + }); + } + + @Override + public void onDismiss(@NonNull DialogInterface dialog) { + setResultForIgnore(); + super.onDismiss(dialog); + } + + private void setResultForIgnore() { + if (isCallBackCodeConfirm() || isCallBackCodeCancel() + || isCallBackCodeOption()) { + return; + } + callBackCode = CALL_BACK_CODE_IGNORE; + setResult(); + } + + private void setResultForBtnClick() { + setResult(); + + if (isAutoDismiss() || !isCallBackCodeConfirm()) { + dismissAllowingStateLoss(); + } + } + + private boolean isCallBackCodeCancel() { + return callBackCode == CALL_BACK_CODE_CANCEL; + } + + private boolean isCallBackCodeConfirm() { + return callBackCode == CALL_BACK_CODE_CONFIRM; + } + + private boolean isCallBackCodeOption() { + return callBackCode == CALL_BACK_CODE_OPTION; + } + + private void setResult() { + Bundle bundle = new Bundle(); + bundle.putInt(KEY_CALL_BACK_CODE, callBackCode); + getParentFragmentManager().setFragmentResult(getTag(), bundle); + } + + private static void init(FragmentManager fragmentManager, LifecycleOwner lifecycleOwner, + IOperatorCallback callback, Bundle bundle) { + TipsWith2OptionFragment fragment = new TipsWith2OptionFragment(); + fragment.setArguments(bundle); + fragment.setCancelable(true); + + String tag = String.valueOf(System.currentTimeMillis()); + + fragmentManager + .setFragmentResultListener( + tag, + lifecycleOwner, + (requestKey, result) -> { + if (callback != null) { + if (fragment.getTag().equals(requestKey)) { + int type = result.getInt(KEY_CALL_BACK_CODE, -1); + if (CALL_BACK_CODE_CONFIRM == type) { + callback.onConfirm(); + } else if (CALL_BACK_CODE_OPTION == type) { + callback.onOption(); + } else if (CALL_BACK_CODE_CANCEL == type) { + callback.onCancel(); + } else if (CALL_BACK_CODE_IGNORE == type) { + callback.onIgnore(); + } + } + } + }); + fragment.show(fragmentManager, tag); + } + + public boolean isAutoDismiss() { + assert getArguments() != null; + return getArguments().getBoolean(KEY_AUTO_DISMISS, true); + } + + public boolean isCancelableOwn() { + assert getArguments() != null; + return getArguments().getBoolean(KEY_CANCELABLE, true); + } + + public String getTitle() { + assert getArguments() != null; + return getArguments().getString(KEY_TITLE, Tools.getString(R.string.notice)); + } + + public String getConfirmText() { + assert getArguments() != null; + return getArguments().getString(KEY_CONFIRM_BUTTON, Tools.getString(R.string.confirm)); + } + + public String getCancelText() { + assert getArguments() != null; + return getArguments().getString(KEY_CANCEL_BUTTON, Tools.getString(R.string.cancel)); + } + + public String getOptionText() { + assert getArguments() != null; + return getArguments().getString(KEY_OPTION_BUTTON, ""); + } + + public String getContent() { + assert getArguments() != null; + return getArguments().getString(KEY_CONTENT, ""); + } + + public int getCountDownTime() { + assert getArguments() != null; + return getArguments().getInt(KEY_COUNT_DOWN, 0); + } + + public static class Argument { + private Boolean cancelable;//是否可以取消 + private Boolean autoDismiss; + private String title; + private String confirmText; + private String cancelText; + private String optionText; + private String content; + private Integer countDownTime; + + public Argument() { + } + + public Argument autoDismiss(boolean autoDismiss) { + this.autoDismiss = autoDismiss; + return this; + } + + public Argument cancelable(boolean cancelable) { + this.cancelable = cancelable; + return this; + } + + public Argument title(String title) { + this.title = title; + return this; + } + + public Argument confirmText(String confirmText) { + this.confirmText = confirmText; + return this; + } + + public Argument cancelText(String cancelText) { + this.cancelText = cancelText; + return this; + } + + public Argument optionText(String optionText) { + this.optionText = optionText; + return this; + } + + public Argument content(String content) { + this.content = content; + return this; + } + + public Argument countDownTime(int countDownTime) { + this.countDownTime = countDownTime; + return this; + } + + public Bundle build() { + Bundle bundle = new Bundle(); + putValue(bundle, KEY_TITLE, title); + putValue(bundle, KEY_CONTENT, content); + putValue(bundle, KEY_CONFIRM_BUTTON, confirmText); + putValue(bundle, KEY_CANCEL_BUTTON, cancelText); + putValue(bundle, KEY_OPTION_BUTTON, optionText); + putValue(bundle, KEY_CANCELABLE, cancelable); + putValue(bundle, KEY_AUTO_DISMISS, autoDismiss); + putValue(bundle, KEY_COUNT_DOWN, countDownTime); + return bundle; + } + + private void putValue(Bundle bundle, String key, Object value) { + if (value != null) { + if (value instanceof Boolean) { + bundle.putBoolean(key, (Boolean) value); + } else if (value instanceof String) { + bundle.putString(key, (String) value); + } else if (value instanceof Integer) { + bundle.putInt(key, (Integer) value); + } + } + } + + } + + public interface IOperatorCallback { + void onConfirm(); + + void onOption(); + + void onCancel(); + + void onIgnore(); + } + + public static class SimpleCallback implements IOperatorCallback { + + @Override + public void onConfirm() { + + } + + @Override + public void onOption() { + + } + + @Override + public void onCancel() { + + } + + @Override + public void onIgnore() { + + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceAttributeEditFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceAttributeEditFragment.java new file mode 100644 index 0000000..d8600d2 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceAttributeEditFragment.java @@ -0,0 +1,195 @@ +package com.bingce.controlnetwork.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.SwitchCompat; +import androidx.fragment.app.FragmentManager; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.ProjectTolerance; +import com.bingce.controlapphelper.model.ToleranceAttributesType; +import com.bingce.controlnetwork.R; +import com.bingce.utils.ThreadPoolUtil; +import com.rengwuxian.materialedittext.MaterialEditText; + +public class ToleranceAttributeEditFragment extends AbstractFullScreenDialogFragment { + + @Override + protected View createContentView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View contentView = inflater.inflate(R.layout.content_tolerance_attribute_editor_layout, container, false); + if (getArguments() != null) { + ThreadPoolUtil.execute(() -> { + String toleranceId = getArguments().getString(BundleConstants.KEY_TOLERANCE_ID); + ToleranceDetailRecord record = SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource() + .getRecordSync(toleranceId); + if (record == null) { + return; + } + ProjectTolerance projectTolerance = new ProjectTolerance(record); + + setData(contentView, projectTolerance); + + }); + } + return contentView; + } + + private void setData(View contentView, ProjectTolerance projectTolerance) { + ThreadPoolUtil.executeInMain(() -> { + int attributeIndex = getArguments().getInt(KEY_ATTRIBUTE_INDEX, -1); + if (attributeIndex < 0) { + return; + } + ToleranceAttributesType type = ToleranceAttributesType.values()[attributeIndex]; + MaterialEditText editor = contentView.findViewById(R.id.editor); + SwitchCompat switchCompat = contentView.findViewById(R.id.switch_control); + View integerView = contentView.findViewById(R.id.integerValue); + + if (projectTolerance.isBoolValue(type)) { + if (editor != null) { + editor.setVisibility(View.GONE); + } + if (integerView != null) { + integerView.setVisibility(View.GONE); + } + if (switchCompat != null) { + switchCompat.setVisibility(View.VISIBLE); + switchCompat.setChecked(projectTolerance.getBoolAttribute(type)); + } + } else if (projectTolerance.isDoubleValue(type)) { + if (editor != null) { + editor.setVisibility(View.VISIBLE); + String value = String.valueOf(projectTolerance.getDoubleAttribute(type)); + editor.setText(value); + editor.setHint(value); + } + if (switchCompat != null) { + switchCompat.setVisibility(View.GONE); + } + if (integerView != null) { + integerView.setVisibility(View.GONE); + } + } else if (projectTolerance.isIntegerValue(type)) { + if (editor != null) { + editor.setVisibility(View.GONE); + } + if (switchCompat != null) { + switchCompat.setVisibility(View.GONE); + } + if (integerView != null) { + integerView.setVisibility(View.VISIBLE); + String value = String.valueOf(projectTolerance.getIntegerAttribute(type)); + TextView countView = integerView.findViewById(R.id.count); + countView.setText(value); + View left = integerView.findViewById(R.id.left); + View right = integerView.findViewById(R.id.right); + if (left != null) { + if (Integer.parseInt(value) <= 1) { + left.setEnabled(false); + } + left.setOnClickListener(v -> { + int count = Integer.parseInt(countView.getText().toString()); + countView.setText(String.valueOf(count - 1)); + if (count - 1 <= 1) {//禁止减小 + left.setEnabled(false); + } + //减小后增大变为可用 + if (right != null) { + right.setEnabled(true); + } + }); + } + if (right != null) { + right.setOnClickListener(v -> { + int count = Integer.parseInt(countView.getText().toString()); + countView.setText(String.valueOf(count + 1)); + //增大后减小变为可用 + if (left != null) { + left.setEnabled(true); + } + if (type == ToleranceAttributesType.singleSurveyor && count + 1 >= 2) { + right.setEnabled(false); + } + }); + } + } + } + }); + } + + + @Override + protected void onConfirm() { + ThreadPoolUtil.execute(() -> { + if (getArguments() == null || getView() == null) { + return; + } + String toleranceId = getArguments().getString(BundleConstants.KEY_TOLERANCE_ID); + ToleranceDetailRecord record = SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource() + .getRecordSync(toleranceId); + if (record == null) { + return; + } + ProjectTolerance projectTolerance = new ProjectTolerance(record); + int attributeIndex = getArguments().getInt(KEY_ATTRIBUTE_INDEX, -1); + if (attributeIndex < 0) { + return; + } + MaterialEditText editor = getView().findViewById(R.id.editor); + SwitchCompat switchCompat = getView().findViewById(R.id.switch_control); + TextView count = getView().findViewById(R.id.count); + ToleranceAttributesType type = ToleranceAttributesType.values()[attributeIndex]; + if (projectTolerance.isBoolValue(type)) { + projectTolerance.setBoolAttribute(type, switchCompat.isChecked()); + } else if (projectTolerance.isDoubleValue(type)) { + String string = editor.getText().toString(); + if (string.isEmpty()) { + dismiss(); + return; + } + projectTolerance.setDoubleAttribute(type, Double.parseDouble(string)); + } else if (projectTolerance.isIntegerValue(type)) { + String string = count.getText().toString(); + if (string.isEmpty()) { + dismiss(); + return; + } + projectTolerance.setIntegerAttribute(type, Integer.parseInt(string)); + } + //存储数据 + projectTolerance.updateToleranceRecord(this::dismiss); + }); + } + + private ToleranceAttributeEditFragment() { + super(); + } + + private static final String KEY_ATTRIBUTE_INDEX = "__attribute_index___"; + + public static void editAndSave(String toleranceId, + ToleranceAttributesType attributesType, + String groupTitle, + String title, + FragmentManager fragmentManager) { + ToleranceAttributeEditFragment fragment = new ToleranceAttributeEditFragment(); + Bundle args = new Bundle(); + args.putInt(KEY_ATTRIBUTE_INDEX, attributesType.ordinal()); + args.putString(BundleConstants.KEY_TOLERANCE_ID, toleranceId); + setArgs(args, groupTitle, title); + fragment.setArguments(args); + fragment.show(fragmentManager, ToleranceAttributeEditFragment.class.getName()); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceDetailFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceDetailFragment.java new file mode 100644 index 0000000..ee54fc5 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceDetailFragment.java @@ -0,0 +1,163 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ExpandableListView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.ProjectTolerance; +import com.bingce.controlapphelper.util.SurveyorRecordUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.adapter.ToleranceDetailAdapter; +import com.bingce.utils.ThreadPoolUtil; + +/** + * 限差详情页 + */ +public class ToleranceDetailFragment extends Fragment { + public static final String TAG = ToleranceDetailFragment.class.getName(); + private String toleranceId; + private ToleranceDetailAdapter adapter; + + private ToleranceDetailFragment() { + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + if (getArguments() != null) { + toleranceId = getArguments().getString(BundleConstants.KEY_TOLERANCE_ID); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_limit_detail_list, container, false); + if (view instanceof ExpandableListView) { + changeTolerance(toleranceId, view); + } + return view; + } + + public void changeTolerance(String id) { + changeTolerance(id, getView()); + } + + private void changeTolerance(String id, View view) { + toleranceId = id; + ExpandableListView expandableListView = (ExpandableListView) view; + SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource() + .getLiveDataRecord(id) + .observe(getViewLifecycleOwner(), + toleranceRecord -> + updateTolerance(expandableListView, new ProjectTolerance(toleranceRecord))); + } + + /** + * 填充数据 + * + * @param expandableListView + * @param projectTolerance + */ + private void updateTolerance(ExpandableListView expandableListView, ProjectTolerance projectTolerance) { + if (!toleranceId.equals(projectTolerance.id())) { + return; + } + boolean editableForWholeTolerance = projectTolerance.isWritable(); + //填充adapter + if (adapter == null) { + adapter = new ToleranceDetailAdapter(projectTolerance); + expandableListView.setAdapter(adapter); + //全部展开 + int groupCount = expandableListView.getCount(); + for (int index = 0; index < groupCount; index++) { + expandableListView.expandGroup(index); + } + } else { + adapter.updateData(projectTolerance); + } + //设置点击事件 + expandableListView.setOnChildClickListener((parent, v, groupPosition, childPosition, viewId) -> { + checkToleranceClick(projectTolerance, groupPosition, childPosition, success -> { + if (success) { + ToleranceAttributeEditFragment + .editAndSave(toleranceId, + projectTolerance.attributesType(groupPosition, childPosition), + projectTolerance.attributesName(groupPosition, childPosition), + projectTolerance.groupName(groupPosition), + getChildFragmentManager()); + } + }); + return true; + }); + } + + private void checkToleranceClick(ProjectTolerance projectTolerance, int groupPosition, int childPosition, ICheckEditTolerance checkEditTolerance) { + ThreadPoolUtil.execute(() -> { + //该限差是否有项目测量数据 + boolean hasSurveyedWithToleraeId = SurveyorRecordUtil.isToleranceSurveyor(toleranceId); + + //单个点击限差是否可以编辑 + boolean editToleranceSingle = projectTolerance.isEditTolerance(groupPosition, childPosition); + + boolean isCanEditTolerance = false;//是否可以编辑限差 + if (projectTolerance.isWritable() && editToleranceSingle && !hasSurveyedWithToleraeId) { + isCanEditTolerance = true; + } else { + if (!editToleranceSingle) { + tipsError(getString(R.string.tips_tolerance_template_cannt_delete_short)); + } else if (!projectTolerance.isWritable()) { + tipsError(getString(R.string.tips_tolerance_template_cannt_delete)); + } else { + //这里统一提示有数据不能修改 + tipsError(getString(R.string.tips_tolerance_cannt_modify_because_has_surveyed)); + } + } + + checkEditTolerance.result(isCanEditTolerance); + }); + } + + private void tipsError(String errorMsg) { + runOnUi(() -> TipsFragment.tipsOnly(getChildFragmentManager(), + getViewLifecycleOwner(), + requireContext(), + errorMsg)); + } + + public static ToleranceDetailFragment newInstance(Bundle args) { + ToleranceDetailFragment fragment = new ToleranceDetailFragment(); + fragment.setArguments(args); + return fragment; + } + + public static void start(Context context, String toleranceId) { + Bundle args = new Bundle(); + args.putString(BundleConstants.KEY_TOLERANCE_ID, toleranceId); + FragmentContainerActivity.start(context, TAG, Tools.getString(R.string.menu_item_project_tolerance_setting), args); + } + + private interface ICheckEditTolerance { + void result(boolean success); + } + + private void runOnUi(Runnable runnable) { + FragmentActivity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(runnable); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceManageFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceManageFragment.java new file mode 100644 index 0000000..44425ed --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceManageFragment.java @@ -0,0 +1,203 @@ +package com.bingce.controlnetwork.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.ToleranceTemplate; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.IToleranceDetailDataSource; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.group.ToleranceGroupRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.level.ToleranceLevelRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.surveyor.method.ToleranceMethodKt; +import com.bingce.controlapphelper.util.ToleranceUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.adapter.BaseIndexTextWithContextMenuAdapter; +import com.bingce.controlnetwork.adapter.IUpdateListAdapter; +import com.bingce.controlnetwork.adapter.contextmenu.ContextMenuDeleteEdit; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.utils.ThreadPoolUtil; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +/** + * 自定义限差管理 + */ +public class ToleranceManageFragment extends BaseFragment { + public static final String TAG = ToleranceManageFragment.class.getName(); + private BaseIndexTextWithContextMenuAdapter adapter = null; + + private String projectType; + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + if (getArguments() != null) { + projectType = getArguments().getString(BundleConstants.KEY_PROJECT_TYPE); + } + } + + @Nullable + @org.jetbrains.annotations.Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_tolerance_manager_layout, container, false); + + RecyclerView recyclerView = rootView.findViewById(R.id.list); + IToleranceDetailDataSource toleranceDetailDataSource = + SurveyorDatabaseFactory.instance.getToleranceDetailDataSource(); + toleranceDetailDataSource + .getCustomLiveDataListByGroup() + .observe(getViewLifecycleOwner(), + toleranceDetailRecords -> { + if (adapter == null) { + adapter = new _Adapter( + getChildFragmentManager(), + getViewLifecycleOwner(), + getContext(), + toleranceDetailRecords, + item -> ToleranceDetailFragment.start(getContext(), item.getId())); + recyclerView.setAdapter(adapter); + } else { + adapter.updateData(toleranceDetailRecords); + } + }); + + View createButton = rootView.findViewById(R.id.create_new); + if (createButton != null) { + createButton.setOnClickListener(this::showSelectedToleranceDlg); + } + return rootView; + } + + + private void showSelectedToleranceDlg(View view) { + SelectToleranceTemplateBottomSheetFragment.select( + getChildFragmentManager(), + getViewLifecycleOwner(), + projectType, + toleranceId -> onSelectedTolerance( + getChildFragmentManager(), + getViewLifecycleOwner(), + getContext(), + toleranceId)); + } + + private static void onSelectedTolerance(FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + Context context, + String toleranceId) { + //查询 限差 名称 + IToleranceDetailDataSource toleranceDetailDataSource = + SurveyorDatabaseFactory.instance.getToleranceDetailDataSource(); + ThreadPoolUtil.execute(() -> { + //先检测预置模板 + ToleranceDetailRecord toleranceDetailRecord = ToleranceTemplate.detailOf(toleranceId); + if (toleranceDetailRecord == null) { + toleranceDetailRecord = toleranceDetailDataSource.getRecordSync(toleranceId); + } + if (toleranceDetailRecord == null) { + return; + } + //查询限差完整名称 + ToleranceGroupRecord toleranceGroupRecord = ToleranceTemplate.groupOf(toleranceDetailRecord.groupId); + ToleranceLevelRecord toleranceLevelRecord = ToleranceTemplate.levelOf(toleranceDetailRecord.levelId); + if (toleranceGroupRecord == null) { + ToastUtils.showShort(R.string.error_tips_tolerance_template_read_failure); + return; + } + ToleranceDetailRecord finalToleranceDetailRecord = toleranceDetailRecord; + ThreadPoolUtil.executeInMain(() -> StringInputFragment + .input( + fragmentManager, + context.getString(R.string.tips_please_input_new_tolerance_name), + ToleranceUtil.completedToleranceName(toleranceGroupRecord, toleranceLevelRecord, finalToleranceDetailRecord), + lifecycleOwner, + string -> { + if (string == null || string.isEmpty()) { + ToastUtils.showShort(R.string.string_no_empty); + return; + } + gotoEditNewTolerance(context, finalToleranceDetailRecord, string); + } + )); + }); + } + + private static void gotoEditNewTolerance(Context context, ToleranceDetailRecord template, String name) { + ToleranceDetailRecord newInstance = new ToleranceDetailRecord(template); + newInstance.singleSurveyor = template.singleSurveyor; + newInstance.setName(name); + SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource() + .saveWithCallback(newInstance, () -> ToleranceDetailFragment.start(context, newInstance.getId())); + } + + private static class _Adapter extends BaseIndexTextWithContextMenuAdapter + implements IUpdateListAdapter { + public _Adapter( + FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + Context context, + List records, + IOnItemClick callback) { + super(records == null ? new ArrayList<>() : records, callback, new ContextMenuDeleteEdit() { + @Override + protected void delete(ToleranceDetailRecord item) { + //检测是否有project使用了当前限差方案 + ThreadPoolUtil.execute(() -> { + long count = SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .recordCountWithTolerance(item.getId()); + if (count <= 0) { + IToleranceDetailDataSource toleranceDetailDataSource = + SurveyorDatabaseFactory.instance.getToleranceDetailDataSource(); + toleranceDetailDataSource.delete(item); + } else { + ThreadPoolUtil.executeInMain(() -> Toast + .makeText(context, R.string.tips_tolerance_cannt_delete_because_of_used, Toast.LENGTH_SHORT) + .show()); + } + }); + } + + @Override + protected void edit(ToleranceDetailRecord item) { + ToleranceMethodKt.changeToleranceName( + fragmentManager, lifecycleOwner, item); + } + }); + } + } + + public static void start(Context context, String projectType) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_TYPE, projectType); + FragmentContainerActivity.start(context, TAG, R.string.name_custom_telorance_manager, bundle); + } + + public static ToleranceManageFragment newInstance(Bundle bundle) { + ToleranceManageFragment fragment = new ToleranceManageFragment(); + fragment.setArguments(bundle); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceSelectFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceSelectFragment.java new file mode 100644 index 0000000..92505d5 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/ToleranceSelectFragment.java @@ -0,0 +1,112 @@ +package com.bingce.controlnetwork.fragment; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.utils.ThreadPoolUtil; + +public class ToleranceSelectFragment extends AbstractProjectToleranceFragment { + public static final String TAG = ToleranceSelectFragment.class.getName(); + + private ToleranceSelectFragment() { + super(); + } + + @Override + protected void onCreateView(View view) { + String toleranceId = null; + if (getArguments() != null) { + toleranceId = getArguments().getString(BundleConstants.KEY_TOLERANCE_ID); + if (toleranceId != null && !toleranceId.isEmpty()) { + String finalToleranceId = toleranceId; + ThreadPoolUtil.execute(() -> { + ToleranceDetailRecord instance = + SurveyorDatabaseFactory.instance + .getToleranceDetailDataSource().getRecordSync(finalToleranceId); + updateToleranceDetail(view, instance); + }); + } + } + //当前没有限差的时候 + if (toleranceId == null || toleranceId.isEmpty()) { + if (getArguments() != null) { + ToleranceDetailRecord firstDefaultTolerance = getFirstDefaultTolerance(projectType); + updateToleranceDetail(view, firstDefaultTolerance); + } + } + + setHasOptionsMenu(true); + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + inflater.inflate(R.menu.tolerance_select_menu, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (item.getItemId() == R.id.confirm_button) { + Intent intent = new Intent(); + intent.putExtra(BundleConstants.KEY_TOLERANCE_ID, currentTolerance()); + Activity activity = getActivity(); + if (activity != null) { + activity.setResult(Activity.RESULT_OK, intent); + activity.finish(); + } + } + return super.onOptionsItemSelected(item); + } + + public static void start(Context context, String toleranceId, String projectType, + ActivityResultLauncher launcher) { + if (launcher == null) { + return; + } + Bundle args = new Bundle(); + args.putString(BundleConstants.KEY_TOLERANCE_ID, toleranceId); + args.putString(BundleConstants.KEY_PROJECT_TYPE, projectType); + launcher.launch(FragmentContainerActivity.startIntent(context, TAG, R.string.select_tolerance, args)); + } + + public static ActivityResultLauncher createActivityLauncher(Fragment fragment, ISelectCallback selectCallback) { + return fragment.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result != null && Activity.RESULT_OK == result.getResultCode()) { + Intent intent = result.getData(); + if (intent != null) { + String id = intent.getStringExtra(BundleConstants.KEY_TOLERANCE_ID); + selectCallback.onSelectTolerance(id); + return; + } + } + selectCallback.onSelectTolerance(null); + }); + } + + public static ToleranceSelectFragment newInstance(Bundle bundle) { + ToleranceSelectFragment fragment = new ToleranceSelectFragment(); + fragment.setArguments(bundle); + return fragment; + } + + public interface ISelectCallback { + void onSelectTolerance(String id); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/base/BaseFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/base/BaseFragment.java new file mode 100644 index 0000000..56f75a9 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/base/BaseFragment.java @@ -0,0 +1,30 @@ +package com.bingce.controlnetwork.fragment.base; + +import android.view.View; + +import androidx.annotation.IdRes; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; + +public class BaseFragment extends Fragment { + final protected void runOnUI(Runnable runnable) { + if (getActivity() == null) { + return; + } + getActivity().runOnUiThread(runnable); + } + + final protected T findViewById(@IdRes int id) { + if (getActivity() == null) { + return null; + } + return getActivity().findViewById(id); + } + + final protected void setCreatedData(Runnable runnable) { + if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.CREATED)) { + runnable.run(); + } + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/base/BaseLazyFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/base/BaseLazyFragment.java new file mode 100644 index 0000000..ee4d84d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/base/BaseLazyFragment.java @@ -0,0 +1,87 @@ +package com.bingce.controlnetwork.fragment.base; + +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.IdRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; + +public abstract class BaseLazyFragment extends Fragment { + + /** + * 是否执行懒加载 + */ + private boolean isLoaded = false; + + /** + * 当前Fragment是否对用户可见 + */ + private boolean isVisibleToUser = false; + + /** + * view是否已经创建 + */ + private boolean onViewCreated = false; + + final protected void runOnUI(Runnable runnable) { + if (getActivity() == null) { + return; + } + getActivity().runOnUiThread(runnable); + } + + final protected T findViewById(@IdRes int id) { + if (getActivity() == null) { + return null; + } + return getActivity().findViewById(id); + } + + final protected void setCreatedData(Runnable runnable) { + if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.CREATED)) { + runnable.run(); + } + } + + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + this.isVisibleToUser = isVisibleToUser; + judgeLoadData(); + } + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + isVisibleToUser = !hidden; + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + onViewCreated = true; + judgeLoadData(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + isLoaded = false; + isVisibleToUser = false; + onViewCreated = false; + } + + private void judgeLoadData() { + if (!isLoaded && isVisibleToUser && onViewCreated) { + loadData(); + isLoaded = true; + } + } + + protected abstract void loadData(); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomBean.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomBean.kt new file mode 100644 index 0000000..e2ff1ce --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomBean.kt @@ -0,0 +1,15 @@ +package com.bingce.controlnetwork.fragment.bottompage + +import android.os.Parcelable +import androidx.annotation.Keep +import kotlinx.android.parcel.Parcelize + +@Keep +@Parcelize +data class BottomBean( + val id: String, + val name: String, + val pageIndex: Int, + val isSelect: Boolean = false, + val tag: String? = null +) : Parcelable diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageAdapter.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageAdapter.kt new file mode 100644 index 0000000..badb59d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageAdapter.kt @@ -0,0 +1,42 @@ +package com.bingce.controlnetwork.fragment.bottompage + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.bingce.controlapphelper.util.FastClickUtil +import com.bingce.controlnetwork.adapter.BaseAdapter +import com.bingce.controlnetwork.databinding.ListItemIndexTextSelectableLayoutBinding + +class BottomPageAdapter(val context: Context, private val dataList: List, callBack: CallBack) : + BaseAdapter(dataList) { + + private val callBack: CallBack + + init { + this.callBack = callBack + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val bean = dataList[position] + holder.mBinding.index.text = (position + 1).toString() + holder.mBinding.text.text = bean.name + holder.mBinding.status.visibility = if (bean.isSelect) View.VISIBLE else View.GONE + + holder.mBinding.root.setOnClickListener { + FastClickUtil.click { + callBack.back(bean) + } + } + } + + override fun createVH(parent: ViewGroup, viewType: Int): ViewHolder { + val binding = ListItemIndexTextSelectableLayoutBinding.inflate(LayoutInflater.from(context), parent, false) + return ViewHolder(binding) + } + + interface CallBack { + fun back(bottomBean: BottomBean) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageContentFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageContentFragment.kt new file mode 100644 index 0000000..aa40fea --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageContentFragment.kt @@ -0,0 +1,99 @@ +package com.bingce.controlnetwork.fragment.bottompage + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import com.bingce.controlnetwork.databinding.FragmentBottomPageContentBinding +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class BottomPageContentFragment(private val dataList: List) : Fragment() { + private var _binding: FragmentBottomPageContentBinding? = null + val mBinding get() = _binding!! + + private val viewModel: BottomSwitchVm by viewModels({ requireParentFragment() }) + + private val mainScope = MainScope() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentBottomPageContentBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun onDestroyView() { + super.onDestroyView() + mainScope.cancel() + _binding = null + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initView() + } + + override fun onHiddenChanged(hidden: Boolean) { + super.onHiddenChanged(hidden) + if (!hidden) { + refreshTitleVisiable() + } + } + + private fun initView() { + mBinding.back.setOnClickListener { + viewModel.selectList.removeLast() + getBottomPageFragment()?.removeFragment() + } + + val adapter = + BottomPageAdapter(requireContext(), dataList, object : BottomPageAdapter.CallBack { + override fun back(bottomBean: BottomBean) { + itemClick(bottomBean) + } + }) + mBinding.recyclerView.adapter = adapter + + mBinding.title.text = getBottomPageFragment()?.getTitle(this) + refreshTitleVisiable() + } + + private fun itemClick(bottomBean: BottomBean) { + mainScope.launch { + val dataNext = withContext(Dispatchers.IO) { + getBottomPageFragment()?.getDataNext(bottomBean) + } + viewModel.selectList.add(bottomBean) + if (dataNext.isNullOrEmpty()) { + getBottomPageFragment()?.setResultData() + } else { + getBottomPageFragment()?.addFragment(dataNext, true) + } + } + } + + private fun getBottomPageFragment(): BottomPageFragment? { + return parentFragment as? BottomPageFragment + } + + private fun refreshTitleVisiable() { + parentFragmentManager.fragments.let { + if (it.size <= 1) { + mBinding.back.visibility = View.GONE + } else { + mBinding.back.visibility = View.VISIBLE + } + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageFragment.kt new file mode 100644 index 0000000..d102353 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomPageFragment.kt @@ -0,0 +1,157 @@ +package com.bingce.controlnetwork.fragment.bottompage + +import android.os.Bundle +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction +import androidx.fragment.app.setFragmentResult +import androidx.fragment.app.viewModels +import androidx.lifecycle.LifecycleOwner +import blankj.utilcode.util.ToastUtils +import com.bingce.controlapphelper.model.BundleConstants +import com.bingce.controlapphelper.util.GsonUtil +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.databinding.FragmentSingleFramelayoutLayoutBinding +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class BottomPageFragment(val data: IData) : DialogFragment() { + + private val mainScope = MainScope() + + private var _binding: FragmentSingleFramelayoutLayoutBinding? = null + val mBinding get() = _binding!! + + private val viewModel: BottomSwitchVm by viewModels() + + companion object { + @JvmStatic + fun showBottom( + fragmentManager: FragmentManager, + lifecycleOwner: LifecycleOwner, + data: IData, + callBack: CallBack + ) { + val bottomPageFragment = BottomPageFragment(data) + val tag = System.currentTimeMillis().toString() + + fragmentManager.setFragmentResultListener( + tag, + lifecycleOwner + ) { requestKey: String, bundle: Bundle -> + bottomPageFragment.dismiss() + if (requestKey == tag) { + bundle.getString(BundleConstants.KEY_SELECT_LIST)?.let { it -> + GsonUtil.toAny>(it)?.let juadge@{ + if (it.size < 2) { + ToastUtils.showShort(R.string.no_data) + return@juadge + } + callBack.back(it) + } + } + } + } + bottomPageFragment.show(fragmentManager, tag) + } + } + + + override fun onStart() { + super.onStart() + dialog?.window?.run { + setWindowAnimations(R.style.animate_dialog) + setBackgroundDrawable(null) + val params = attributes + params.gravity = Gravity.BOTTOM + params.width = ViewGroup.LayoutParams.MATCH_PARENT + params.height = ViewGroup.LayoutParams.WRAP_CONTENT + attributes = params + } + + } + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentSingleFramelayoutLayoutBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun onDestroyView() { + super.onDestroyView() + mainScope.cancel() + _binding = null + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + mainScope.launch { + val firstPageData = withContext(Dispatchers.IO) { + data.getData(null) + } + firstPageData?.let { + addFragment(it, false) + } + } + } + + fun addFragment(dataNext: List, isNeedAnim: Boolean) { + addOrDeleteFragment(isNeedAnim) { + val contentFragment = BottomPageContentFragment(dataNext) + add(R.id.container, contentFragment) + } + } + + fun removeFragment() { + childFragmentManager.fragments.last()?.let { + addOrDeleteFragment { + remove(it) + } + } + } + + fun setResultData() { + val toJson = GsonUtil.toJson(viewModel.selectList) + val bundle = Bundle() + bundle.putString(BundleConstants.KEY_SELECT_LIST, toJson) + setFragmentResult(tag!!, bundle) + } + + suspend fun getDataNext(currentData: BottomBean): List? { + return data.getData(currentData) + } + + fun getTitle(bottomPageContentFragment: BottomPageContentFragment): String { + return data.getTitle(childFragmentManager.fragments.indexOf(bottomPageContentFragment)) + } + + private fun addOrDeleteFragment( + isNeedAnim: Boolean = true, + block: FragmentTransaction.() -> Unit + ) { + val transaction = childFragmentManager + .beginTransaction() + if (isNeedAnim) { + transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_right) + } + block(transaction) + transaction.commit() + } + + interface CallBack { + fun back(selectData: List) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomSwitchVm.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomSwitchVm.kt new file mode 100644 index 0000000..35c7013 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/BottomSwitchVm.kt @@ -0,0 +1,8 @@ +package com.bingce.controlnetwork.fragment.bottompage + +import androidx.lifecycle.ViewModel + +class BottomSwitchVm : ViewModel() { + // val dataList = mutableListOf() + val selectList = mutableListOf() +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/IData.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/IData.kt new file mode 100644 index 0000000..4eeafa1 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/IData.kt @@ -0,0 +1,7 @@ +package com.bingce.controlnetwork.fragment.bottompage + +interface IData { + suspend fun getData(bottomBean: BottomBean?): List? + + fun getTitle(pageIndex: Int): String +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/ViewHolder.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/ViewHolder.kt new file mode 100644 index 0000000..1e1c155 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/bottompage/ViewHolder.kt @@ -0,0 +1,6 @@ +package com.bingce.controlnetwork.fragment.bottompage + +import androidx.recyclerview.widget.RecyclerView +import com.bingce.controlnetwork.databinding.ListItemIndexTextSelectableLayoutBinding + +class ViewHolder(val mBinding: ListItemIndexTextSelectableLayoutBinding) : RecyclerView.ViewHolder(mBinding.root) \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/CreateOrEditRouteDialog.java b/app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/CreateOrEditRouteDialog.java new file mode 100644 index 0000000..41c2bb9 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/CreateOrEditRouteDialog.java @@ -0,0 +1,447 @@ +package com.bingce.controlnetwork.fragment.heighttraverse; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.IdRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.route.RouteRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.util.CheckLocationUtil; +import com.bingce.controlapphelper.util.GetLocationUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.DialogCreateRouteBinding; +import com.bingce.controlnetwork.fragment.PickPointFragment; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.utils.ThreadPoolUtil; +import com.rengwuxian.materialedittext.MaterialEditText; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +public class CreateOrEditRouteDialog extends DialogFragment { + private PickPointResult pickPointResultStart; + private PickPointResult pickPointResultEnd; + + //选择起点还是终点的标志 + private static final String SELECT_START_TAG = "SELECT_START_TAG"; + private static final String SELECT_END_TAG = "SELECT_END_TAG"; + + private static final String KEY_PROJECT_ID = "KEY_PROJECT_ID"; + private static final String KEY_ROUTE_ID = "KEY_ROUTE_ID"; + + private static final String KEY_ROUTE_NAME = "KEY_ROUTE_NAME"; + private static final String KEY_START_POINT_ID = "KEY_START_POINT_ID"; + private static final String KEY_END_POINT_ID = "KEY_END_POINT_ID"; + + private DialogCreateRouteBinding mBinding; + private GetLocationUtil getLocationUtil; + + public static void start(String projectId, String routeId, FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + CallBack callback) { + Bundle args = new Bundle(); + args.putString(KEY_PROJECT_ID, projectId); + args.putString(KEY_ROUTE_ID, routeId); + showFragment(args, fragmentManager, lifecycleOwner, callback); + } + + + private static void showFragment(Bundle args, FragmentManager fragmentManager, LifecycleOwner lifecycleOwner, CallBack callback) { + String tag = String.valueOf(System.currentTimeMillis()); + CreateOrEditRouteDialog fragment = new CreateOrEditRouteDialog(); + fragment.setArguments(args); + fragmentManager + .setFragmentResultListener( + tag, + lifecycleOwner, + (requestKey, resultBundle) -> { + if (tag.equals(requestKey)) { + callback.result( + resultBundle.getString(KEY_ROUTE_NAME), + resultBundle.getString(KEY_START_POINT_ID), + resultBundle.getString(KEY_END_POINT_ID) + ); + } + }); + fragment.show(fragmentManager, tag); + } + + private final ActivityResultLauncher defaultStationLauncher = PickPointFragment.createActivityLauncher(this, (type, pickPointResult) -> { + if (SELECT_START_TAG.equals(type)) { + pickPointResultStart = pickPointResult; + } else if (SELECT_END_TAG.equals(type)) { + pickPointResultEnd = pickPointResult; + } + if (pickPointResult == null || isListEmpty(pickPointResult.getSelectedIds()) || isListEmpty(pickPointResult.getSelectedNames()) + || pickPointResult.getSelectedNames().size() != pickPointResult.getSelectedIds().size()) { + ToastUtils.showShort(R.string.abnormal_point_selection); + return; + } + setEtData(type); + }); + + private void setEtData(String type) { + if (SELECT_START_TAG.equals(type)) { + setEtDataSingle(mBinding.ilStart.etPoint, mBinding.ilStart.etHeight, + mBinding.ilStart.etB, mBinding.ilStart.etL, pickPointResultStart.getSelectedIds().get(0)); + } else if (SELECT_END_TAG.equals(type)) { + setEtDataSingle(mBinding.ilEnd.etPoint, mBinding.ilEnd.etHeight, + mBinding.ilEnd.etB, mBinding.ilEnd.etL, + pickPointResultEnd.getSelectedIds().get(0)); + } + } + + private void setEtDataSingle(MaterialEditText etPointName, MaterialEditText etPointHeight, + MaterialEditText etB, MaterialEditText etL, + String pointId) { + ThreadPoolUtil.execute(() -> { + PointRecord pointRecord = SurveyorDatabaseFactory.instance.getPointDataSource().findByIdSync(pointId); + ThreadPoolUtil.executeInMain(() -> { + etPointName.setText(pointRecord.getName()); + etPointHeight.setText(doubleToString(pointRecord.getZ())); + + if (pointRecord.getLatitude() != 0 && pointRecord.getLongitude() != 0) { + etB.setText(doubleToString(pointRecord.getLatitude())); + etL.setText(doubleToString(pointRecord.getLongitude())); + } else { + etB.setText(""); + etL.setText(""); + } + }); + }); + } + + private boolean isListEmpty(List list) { + return list == null || list.isEmpty(); + } + + private MaterialEditText getEtPoint(@IdRes int id) { + View view = getView(); + assert view != null; + return view.findViewById(id); + } + + @Override + public void onStart() { + super.onStart(); +// getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(0x33000000)); + getDialog().getWindow().setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getLocationUtil = new GetLocationUtil(); + getLifecycle().addObserver(getLocationUtil); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + mBinding = DialogCreateRouteBinding.inflate(inflater, container, false); + initView(); + initListener(); + initData(); + return mBinding.getRoot(); + } + + private void initView() { + mBinding.ilStart.llCoord.setVisibility(View.VISIBLE); + mBinding.ilEnd.llCoord.setVisibility(View.VISIBLE); + } + + + @Override + public void onDestroyView() { + super.onDestroyView(); + mBinding = null; + } + + private void initData() { + String routeId = getRouteId(); + if (routeId != null) { + ThreadPoolUtil.execute(() -> { + RouteRecord routeRecord = SurveyorDatabaseFactory.instance.getRouteDataSource().getByIdSync(routeId); + if (routeRecord != null) { + PointRecord startPointRecord = SurveyorDatabaseFactory.instance.getPointDataSource().findByIdSync(routeRecord.getStartPointId()); + PointRecord endPointRecord = SurveyorDatabaseFactory.instance.getPointDataSource().findByIdSync(routeRecord.getEndPointId()); + setPickPointResultForEdit(SELECT_START_TAG, startPointRecord.getId(), startPointRecord.getName()); + setPickPointResultForEdit(SELECT_END_TAG, endPointRecord.getId(), endPointRecord.getName()); + + ThreadPoolUtil.executeInMain(() -> { + setEtData(SELECT_START_TAG); + setEtData(SELECT_END_TAG); + }); + } + }); + } + } + + private void setPickPointResultForEdit(String type, String id, String name) { + if (type.equals(SELECT_START_TAG)) { + pickPointResultStart = getPickPointResultFromIdName(id, name); + } else { + pickPointResultEnd = getPickPointResultFromIdName(id, name); + } + } + + private PickPointResult getPickPointResultFromIdName(String id, String name) { + List ids = new ArrayList<>(); + List names = new ArrayList<>(); + ids.add(id); + names.add(name); + PickPointResult pickPointResult = new PickPointResult(); + pickPointResult.setSelectedIds(ids); + pickPointResult.setSelectedNames(names); + return pickPointResult; + } + + private void initListener() { + mBinding.tvSelectStartPoint.setOnClickListener(v -> selectPoint(SELECT_START_TAG)); + mBinding.tvSelectEndPoint.setOnClickListener(v -> selectPoint(SELECT_END_TAG)); + + mBinding.btnCancel.setOnClickListener((v) -> dismissAllowingStateLoss()); + + mBinding.btnConfirm.setOnClickListener((v) -> { + checkConfirm(); + }); + + mBinding.ivGetLocationStartPoint.setOnClickListener(v -> { + getLocation(result -> { + setLocation(mBinding.ilStart.etB, mBinding.ilStart.etL, result); + }); + }); + mBinding.ivGetLocationEndPoint.setOnClickListener(v -> { + getLocation(result -> { + setLocation(mBinding.ilEnd.etB, mBinding.ilEnd.etL, result); + }); + }); + } + + private void getLocation(GetLocationUtil.IResultListener resultListener) { + CheckLocationUtil.check(requireContext(), () -> { + getLocationUtil.getResult(resultListener); + }); + } + + private void setLocation(MaterialEditText etB, MaterialEditText etL, GetLocationUtil.Result result) { + if (result != null) { + etB.setText(result.getLatitude()); + etL.setText(result.getLongitude()); + } + } + + private void checkConfirm() { + ThreadPoolUtil.execute(() -> { + + String startPointName = mBinding.ilStart.etPoint.getText().toString().trim(); + if (TextUtils.isEmpty(startPointName)) { + ToastUtils.showShort(R.string.please_enter_or_select_a_starting_point); + return; + } + + String endPointName = mBinding.ilEnd.etPoint.getText().toString().trim(); + if (TextUtils.isEmpty(endPointName)) { + ToastUtils.showShort(R.string.please_enter_or_select_a_destination); + return; + } + + //取消起点终点重复的限制 +// if (startPointName.equals(endPointName)) { +// ToastUtils.showShort(R.string.duplicate_start_and_end_names); +// return; +// } + + boolean canEdit = checkCanEdit(); + if (!canEdit) { + ToastUtils.showShort(R.string.route_has_data_not_edit_hint); + return; + } + + String startHeight = mBinding.ilStart.etHeight.getText().toString().trim(); + String startB = mBinding.ilStart.etB.getText().toString().trim(); + String startL = mBinding.ilStart.etL.getText().toString().trim(); + String endHeight = mBinding.ilEnd.etHeight.getText().toString().trim(); + String endB = mBinding.ilEnd.etB.getText().toString().trim(); + String endL = mBinding.ilEnd.etL.getText().toString().trim(); + + PointRecord startPoint; + PointRecord endPoint; + + String projectId = getProjectId(); + startPoint = SurveyorDatabaseFactory.instance.getPointDataSource().findByNameSync(startPointName, projectId); + endPoint = SurveyorDatabaseFactory.instance.getPointDataSource().findByNameSync(endPointName, projectId); + + if (startPoint == null) { + startPoint = createPoint(startPointName, startHeight, startB, startL); + } else { + editPoint(startPoint, startPointName, startHeight, startB, startL); + } + + if (endPoint == null) { + endPoint = createPoint(endPointName, endHeight, endB, endL); + } else { + editPoint(endPoint, endPointName, endHeight, endB, endL); + } + + //存数据库 + SurveyorDatabaseFactory.instance.getPointDataSource().saveSync(startPoint); + SurveyorDatabaseFactory.instance.getPointDataSource().saveSync(endPoint); + + setResultToPage(startPoint.getId(), endPoint.getId(), + startPoint.getName() + "-" + endPoint.getName()); + }); + } + + @WorkerThread + private boolean checkCanEdit() { + //路线有数据时候不能编辑 + String routeId = getRouteId(); + if (routeId == null) { + return true; + } + RouteRecord routeRecord = SurveyorDatabaseFactory.instance.getRouteDataSource().getByIdSync(getRouteId()); + if (routeRecord != null) { + List stationList = SurveyorDatabaseFactory.instance.getSurveyorStation().getByProjectRoute(getProjectId(), getRouteId()); + if (stationList != null && !stationList.isEmpty()) { + for (SurveyorStationRecord stationRecord : stationList) { + long recordCount = SurveyorDatabaseFactory.instance.getSurveyorRecordDataSource().recordCount(stationRecord.getId()); + if (recordCount > 0) { + return false; + } + } + } + } + return true; + } + + @WorkerThread + private PointRecord createPoint(String pointName, String height, String b, String l) { + return createPointRecord(pointName, height, b, l); + } + + @WorkerThread + private void editPoint(PointRecord pointRecord, String pointNameEdit, String height, String b, String l) { + pointRecord.setName(pointNameEdit); + pointRecord.setZ(stringToDouble(height)); + pointRecord.setLatitude(stringToDouble(b)); + pointRecord.setLongitude(stringToDouble(l)); + } + + private void setResultToPage(String startPointId, String endPointId, String routeName) { + if (getActivity() != null) { + getActivity().runOnUiThread(() -> { + Bundle resultBundle = new Bundle(); + resultBundle.putString(KEY_START_POINT_ID, startPointId); + resultBundle.putString(KEY_END_POINT_ID, endPointId); + resultBundle.putString(KEY_ROUTE_NAME, routeName); + getParentFragmentManager() + .setFragmentResult(getTag(), resultBundle); + dismissAllowingStateLoss(); + }); + } + } + + private PointRecord createPointRecord(String pointText, String height, String b, String l) { + String pointType; + if (isKnownPoint(height)) { + pointType = PointRecord.TYPE_KNOWN_POINT; + } else { + pointType = PointRecord.TYPE_UNKNOWN_POINT; + } + double h = stringToDouble(height); + PointRecord point = PointRecord.point(getProjectId(), pointType, pointText, "", 0, 0, h, "", -1); + point.setLatitude(stringToDouble(b)); + point.setLongitude(stringToDouble(l)); + return point; + } + + private boolean isKnownPoint(String height) { + double heightD = stringToDouble(height); + return heightD != 0; + } + + private double stringToDouble(String value) { + if (TextUtils.isEmpty(value)) { + return 0; + } + return Double.parseDouble(value); + } + + private String doubleToString(double value) { + return String.valueOf(value); + } + + private void tipsOnly(String msg) { + if (getActivity() != null) { + getActivity().runOnUiThread(() -> TipsFragment.tipsOnly( + getChildFragmentManager(), + getViewLifecycleOwner(), + requireContext(), + msg)); + } + } + + private void selectPoint(String type) { + String title = null; + PickPointResult pickPointResultSelected = null; + List filderIds = null; + if (SELECT_START_TAG.equals(type)) { + pickPointResultSelected = pickPointResultStart; +// filderIds = pickPointResultEnd != null ? pickPointResultEnd.getSelectedIds() : null; + title = Tools.getString(R.string.choose_starting_point); + } else if (SELECT_END_TAG.equals(type)) { + pickPointResultSelected = pickPointResultEnd; +// filderIds = pickPointResultStart != null ? pickPointResultStart.getSelectedIds() : null; + title = Tools.getString(R.string.select_end_point); + } + PickPointFragment.pickPoint( + getContext(), + type, + 1, + title, + filderIds,//filderIds取消起点和终点的限制 + getProjectId(), pickPointResultSelected, defaultStationLauncher); + } + + public interface CallBack { + void result(String routeName, String startPointId, String endPointId); + } + + private String getProjectId() { + if (getArguments() != null) { + return getArguments().getString(KEY_PROJECT_ID); + } + return null; + } + + private String getRouteId() { + if (getArguments() != null) { + return getArguments().getString(KEY_ROUTE_ID); + } + return null; + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/adapter/RouteListAdapter.java b/app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/adapter/RouteListAdapter.java new file mode 100644 index 0000000..9e883ba --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/adapter/RouteListAdapter.java @@ -0,0 +1,18 @@ +package com.bingce.controlnetwork.fragment.heighttraverse.adapter; + +import java.util.List; + +import com.bingce.controlnetwork.adapter.BaseIndexTextWithContextMenuAdapter; +import com.bingce.controlnetwork.adapter.contextmenu.ContextMenuDelete; +import com.bingce.controlapphelper.datasource.database.route.RouteRecord; +import com.bingce.controlnetwork.adapter.BaseIndexTextWithContextMenuAdapter; +import com.bingce.controlnetwork.adapter.contextmenu.ContextMenuDelete; + +public class RouteListAdapter extends BaseIndexTextWithContextMenuAdapter { + + public RouteListAdapter(List dataList, IOnItemClick callback + , ContextMenuDelete contextMenuDeleteEdit) { + super(dataList, callback, contextMenuDeleteEdit); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/viewmodel/HeightCreateOrEditVm.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/viewmodel/HeightCreateOrEditVm.kt new file mode 100644 index 0000000..d0fc265 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/heighttraverse/viewmodel/HeightCreateOrEditVm.kt @@ -0,0 +1,62 @@ +package com.bingce.controlnetwork.fragment.heighttraverse.viewmodel + +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.bingce.controlnetwork.fragment.heighttraverse.CreateOrEditRouteDialog +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants +import com.bingce.controlapphelper.datasource.database.route.RouteRecord +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class HeightCreateOrEditVm : ViewModel() { + + fun showCreateOrEditDialog( + projectId: String, + routeId: String?, + childFragmentManager: FragmentManager, + viewLifecycleOwner: LifecycleOwner + ) { + CreateOrEditRouteDialog.start( + projectId, routeId, childFragmentManager, viewLifecycleOwner + ) { routeName, startPointId, endPointId -> + saveOrUpdateRecord(projectId, routeName, routeId, startPointId, endPointId) + } + } + + /** + * 存路线的同时存默认项目 + */ + private fun saveOrUpdateRecord( + projectId: String, + routeName: String, + routeId: String?, + startPointId: String, + endPointId: String + ) { + viewModelScope.launch(Dispatchers.IO) { + if (routeId != null) { + val routeRecord = + SurveyorDatabaseFactory.instance.getRouteDataSource().getById(routeId) + routeRecord?.let { + it.routeName = routeName + it.startPointId = startPointId + it.endPointId = endPointId + SurveyorDatabaseFactory.instance.getRouteDataSource().update(it) + } + } else { + val routeRecord = + RouteRecord.createRouteRecord(projectId, routeName, startPointId, endPointId) + SurveyorDatabaseFactory.instance.getRouteDataSource().saveRecord(routeRecord) + //存默认的项目id + SurveyorDatabaseFactory.instance.configDataSource.setSync( + ConfigConstants.KEY_DEFAULT_PROJECT_ID, + projectId + ) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailFragment.kt new file mode 100644 index 0000000..a91e84d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailFragment.kt @@ -0,0 +1,300 @@ +package com.bingce.controlnetwork.fragment.projectdetail + + +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import androidx.annotation.WorkerThread +import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope +import blankj.utilcode.util.ToastUtils +import com.bingce.controlapphelper.datasource.database.ProjectType +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants +import com.bingce.controlapphelper.event.SwitchPageEvent +import com.bingce.controlapphelper.model.BundleConstants +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity +import com.bingce.controlnetwork.databinding.FragmentProjectDetailListLayoutBinding +import com.bingce.controlnetwork.fragment.PointListFragment +import com.bingce.controlnetwork.fragment.ProjectToleranceSettingFragment +import com.bingce.controlnetwork.fragment.base.BaseFragment +import com.bingce.controlnetwork.guide.GuideSequence +import com.bingce.controlnetwork.guide.ITapTargetProvider +import com.bingce.utils.ThreadPoolUtil +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import org.greenrobot.eventbus.EventBus + + +abstract class ProjectDetailFragment : BaseFragment() { + val KEY_GUIDE_INDEX_SURVEYOR_TOLERANCE = 0 + val KEY_GUIDE_INDEX_KNOWN_POINTS = 1 + val KEY_GUIDE_INDEX_UN_KNOWN_POINTS = 2 + val KEY_GUIDE_INDEX_SURVEYOR_CYCLE = 3 + val KEY_GUIDE_INDEX_CREATE_STATION = 4 + + companion object { + @JvmStatic + fun start(context: Context, projectType: String?, projectId: String, projectName: String?) { + val bundle = Bundle() + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId) + bundle.putString(BundleConstants.KEY_PROJECT_TYPE, projectType) + val tag = if (projectType == ProjectType.HEIGHT_TRAVERSE.flag) { + ProjectDetailHeightTraverseFragment.TAG + } else { + ProjectDetailTriangleFragment.TAG + } + FragmentContainerActivity.start(context, tag, projectName, bundle) + } + } + + private var _binding: FragmentProjectDetailListLayoutBinding? = null + val mBinding get() = _binding!! + + private val configDataSource = SurveyorDatabaseFactory.instance.configDataSource + + protected val projectId: String by lazy { + requireArguments().getString(BundleConstants.KEY_PROJECT_ID)!! + } + protected val projectType: String? by lazy { + requireArguments().getString(BundleConstants.KEY_PROJECT_TYPE) + } + + private val editGuides: GuideSequence by lazy { + GuideSequence(KEY_GUIDE_INDEX_CREATE_STATION + 1, object : GuideSequence.IDelegate { + override fun show(index: Int, provider: ITapTargetProvider) { + val fragmentActivity = activity + if (fragmentActivity == null || fragmentActivity.isDestroyed || fragmentActivity.isFinishing) { + return + } + val guideMsgAndDesc = getGuideMsgAndDesc(index) + + if (KEY_GUIDE_INDEX_SURVEYOR_TOLERANCE == index) { + if (fragmentActivity is FragmentContainerActivity) { + provider.show4ToolbarMenu( + fragmentActivity, + fragmentActivity.findViewById(R.id.toolbar), + R.id.project_parameter_setting, + guideMsgAndDesc[0], + guideMsgAndDesc[1] + ) + } + } else if (KEY_GUIDE_INDEX_KNOWN_POINTS == index) { + provider.show4View( + fragmentActivity, + fragmentActivity.findViewById(R.id.known_point_list), + guideMsgAndDesc[0], + guideMsgAndDesc[1] + ) + } else if (KEY_GUIDE_INDEX_UN_KNOWN_POINTS == index) { + provider.show4View( + fragmentActivity, + fragmentActivity.findViewById(R.id.unknown_point_list), + guideMsgAndDesc[0], + guideMsgAndDesc[1] + ) + } else if (KEY_GUIDE_INDEX_SURVEYOR_CYCLE == index) { + provider.show4View( + fragmentActivity, + fragmentActivity.findViewById(R.id.cycle_layout), + guideMsgAndDesc[0], + guideMsgAndDesc[1] + ) + } else if (KEY_GUIDE_INDEX_CREATE_STATION == index) { + provider.show4View( + fragmentActivity, + fragmentActivity.findViewById(R.id.create_station_btn), + guideMsgAndDesc[0], + guideMsgAndDesc[1] + ) + } + } + + override fun dismiss(index: Int) { + if (KEY_GUIDE_INDEX_SURVEYOR_TOLERANCE == index) { + ConfigConstants.markGuideCompleted( + ConfigConstants.KEY_GUIDE_PROJECT_TOLERANCE, + configDataSource + ) + } else if (KEY_GUIDE_INDEX_KNOWN_POINTS == index) { + ConfigConstants.markGuideCompleted( + ConfigConstants.KEY_GUIDE_PROJECT_KNOWN_POINT, + configDataSource + ) + } else if (KEY_GUIDE_INDEX_UN_KNOWN_POINTS == index) { + ConfigConstants.markGuideCompleted( + ConfigConstants.KEY_GUIDE_PROJECT_UNKNOWN_POINT, + configDataSource + ) + } else if (KEY_GUIDE_INDEX_SURVEYOR_CYCLE == index) { + ConfigConstants.markGuideCompleted( + ConfigConstants.KEY_GUIDE_PROJECT_SURVEYOR_CYCLE, + configDataSource + ) + } else if (KEY_GUIDE_INDEX_CREATE_STATION == index) { + ConfigConstants.markGuideCompleted( + ConfigConstants.KEY_GUIDE_PROJECT_CRAETE_STATION, + configDataSource + ) + } + } + }) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentProjectDetailListLayoutBinding.inflate(inflater, container, false) + initView() + setHasOptionsMenu(true) + return mBinding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + protected abstract fun getContentFragment(): Fragment + + @WorkerThread + protected abstract fun saveDefaultProjectAndSoOn(): String? + + protected abstract fun clickCreateStation() + + protected abstract fun getGuideMsgAndDesc(position: Int): Array + + private fun initView() { + childFragmentManager + .beginTransaction() + .replace(R.id.fragment_container, getContentFragment(), "__station_list") + .commit() + //已知点 + initKnownPoint() + //未知点 + initUnKnownPoint() + //去测量页面 + initGoMeasurePage() + //新建测站 + initCreateStation() + } + + private fun initCreateStation() = + mBinding.createStationBtn.setOnClickListener { v -> clickCreateStation() } + + private fun initGoMeasurePage() { + mBinding.ivGoMeasurePage.setOnClickListener { view -> + lifecycleScope.launch(Dispatchers.IO) { + val msg = saveDefaultProjectAndSoOn() + if (!msg.isNullOrEmpty()) { + ToastUtils.showShort(msg) + return@launch + } + EventBus.getDefault().post( + SwitchPageEvent( + SwitchPageEvent.TYPE_SWITCH_TO_MEASURE_PAGE_AND_DATA, + null + ) + ) + val activity = activity + activity?.finish() + } + } + } + + private fun initUnKnownPoint() { + mBinding.unknownPointList.setOnClickListener { view -> + PointListFragment.go2UnknownPointList( + projectId, + context + ) + } + } + + private fun initKnownPoint() { + mBinding.knownPointList.setOnClickListener { view -> + PointListFragment.go2KnownPointList( + projectId, + context + ) + } + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.project_detail_fragment_menu, menu) + super.onCreateOptionsMenu(menu, inflater) + ThreadPoolUtil.execute { + if (!ConfigConstants.isGuideCompleted( + ConfigConstants.KEY_GUIDE_PROJECT_TOLERANCE, + configDataSource + ) + ) { + ThreadPoolUtil.executeInMain { + editGuides.start( + KEY_GUIDE_INDEX_SURVEYOR_TOLERANCE + ) + } + } else if (!ConfigConstants.isGuideCompleted( + ConfigConstants.KEY_GUIDE_PROJECT_KNOWN_POINT, + configDataSource + ) + ) { + ThreadPoolUtil.executeInMain { + editGuides.start( + KEY_GUIDE_INDEX_KNOWN_POINTS + ) + } + } else if (!ConfigConstants.isGuideCompleted( + ConfigConstants.KEY_GUIDE_PROJECT_UNKNOWN_POINT, + configDataSource + ) + ) { + ThreadPoolUtil.executeInMain { + editGuides.start( + KEY_GUIDE_INDEX_UN_KNOWN_POINTS + ) + } + } else if (!ConfigConstants.isGuideCompleted( + ConfigConstants.KEY_GUIDE_PROJECT_SURVEYOR_CYCLE, + configDataSource + ) + ) { + ThreadPoolUtil.executeInMain { + editGuides.start( + KEY_GUIDE_INDEX_SURVEYOR_CYCLE + ) + } + } else if (!ConfigConstants.isGuideCompleted( + ConfigConstants.KEY_GUIDE_PROJECT_CRAETE_STATION, + configDataSource + ) + ) { + ThreadPoolUtil.executeInMain { + editGuides.start( + KEY_GUIDE_INDEX_CREATE_STATION + ) + } + } + } + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (item.itemId == R.id.project_parameter_setting) { + //设置参数点击事件 + ProjectToleranceSettingFragment.start(context, projectId, projectType) + return true + } + return super.onOptionsItemSelected(item) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailHeightTraverseFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailHeightTraverseFragment.kt new file mode 100644 index 0000000..4e189b3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailHeightTraverseFragment.kt @@ -0,0 +1,103 @@ +package com.bingce.controlnetwork.fragment.projectdetail + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import com.bingce.controlnetwork.fragment.heighttraverse.viewmodel.HeightCreateOrEditVm +import com.bingce.controlnetwork.fragment.projectdetail.content.RouteFragment +import com.bingce.controlapphelper.datasource.database.SurveyorDataBase +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants +import com.bingce.controlapphelper.util.Tools +import com.bingce.controlnetwork.R + +class ProjectDetailHeightTraverseFragment : ProjectDetailFragment() { + + private lateinit var routeFragment: RouteFragment + + private val heightCreateOrEditVm: HeightCreateOrEditVm by viewModels() + + companion object { + @JvmField + val TAG = ProjectDetailHeightTraverseFragment::class.simpleName + + @JvmStatic + fun newInstance(bundle: Bundle): ProjectDetailHeightTraverseFragment { + val fragment = ProjectDetailHeightTraverseFragment() + fragment.arguments = bundle + return fragment + } + } + + override fun getContentFragment(): Fragment { + routeFragment = RouteFragment.newInstance(projectId) + return routeFragment + } + + override fun saveDefaultProjectAndSoOn(): String? { + val routeId = + routeFragment.getSurveyorRouteId() ?: return Tools.getString(R.string.no_route_yet) + SurveyorDataBase.getInstance().runInTransaction { + SurveyorDatabaseFactory.instance.configDataSource.setSync( + ConfigConstants.KEY_DEFAULT_PROJECT_ID, + projectId + ) + + SurveyorDatabaseFactory.instance.configDataSource.setSync( + ConfigConstants.KEY_DEFAULT_ROUTE_ID, + routeId + ) + } + return null + } + + override fun clickCreateStation() { + heightCreateOrEditVm.showCreateOrEditDialog( + projectId, + routeId = null, + childFragmentManager, + viewLifecycleOwner + ) + } + + override fun getGuideMsgAndDesc(position: Int): Array { + val array = arrayOfNulls(2) + when (position) { + KEY_GUIDE_INDEX_SURVEYOR_TOLERANCE -> { + array[0] = getString(R.string.guide_modify_project_tolerance) + array[1] = getString(R.string.project_tolerance_apply_all_station) + } + + KEY_GUIDE_INDEX_KNOWN_POINTS -> { + array[0] = getString(R.string.guide_edit_known_point) + array[1] = null + } + + KEY_GUIDE_INDEX_UN_KNOWN_POINTS -> { + array[0] = getString(R.string.guide_edit_unknown_point) + array[1] = null + } + + KEY_GUIDE_INDEX_SURVEYOR_CYCLE -> { + array[0] = getString(R.string.route_list) + array[1] = null + } + + KEY_GUIDE_INDEX_CREATE_STATION -> { + array[0] = getString(R.string.create_new_route) + array[1] = null + } + } + return array + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + mBinding.tvCycleTitle.text = getString(R.string.route) + mBinding.createStationBtn.text = getString(R.string.create_new_route) + mBinding.ivCycleArrow.visibility = View.GONE + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailTriangleFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailTriangleFragment.kt new file mode 100644 index 0000000..c5a42a5 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/ProjectDetailTriangleFragment.kt @@ -0,0 +1,223 @@ +package com.bingce.controlnetwork.fragment.projectdetail + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.Fragment +import com.bingce.controlnetwork.fragment.BottomSheetSurveyorPeriodFragment +import com.bingce.controlnetwork.fragment.ComponentSurveyorStationListFragment +import com.bingce.controlnetwork.fragment.SelectSurveyorStationTypeFragment +import com.bingce.controlnetwork.fragment.SelectSurveyorStationTypeWellSubFragment +import com.bingce.controlnetwork.fragment.station.defaultstation.DefaultStationSetupFragment +import com.bingce.controlnetwork.fragment.station.line.attached.LineStationAttachedSetupFragment +import com.bingce.controlnetwork.fragment.station.line.close.LineStationCloseSetupFragment +import com.bingce.controlnetwork.fragment.station.line.random.LineStationRandomSetupFragment +import com.bingce.controlnetwork.fragment.station.line.single.LineStationSingleSetupFragment +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellDoubleGroundSetupFragment +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellDoubleUnderGroundSetupFragment +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellSetupFragment +import com.bingce.controlapphelper.datasource.database.SurveyorDataBase +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants +import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord +import com.bingce.controlnetwork.R + +class ProjectDetailTriangleFragment : ProjectDetailFragment() { + + private var currentPeriodId: String = "" + + private lateinit var contentFragment: ComponentSurveyorStationListFragment + + + companion object { + @JvmField + val TAG = ProjectDetailTriangleFragment::class.simpleName + + @JvmStatic + fun newInstance(bundle: Bundle): ProjectDetailTriangleFragment { + val fragment = ProjectDetailTriangleFragment() + fragment.arguments = bundle + return fragment + } + + } + + + override fun getContentFragment(): Fragment { + contentFragment = ComponentSurveyorStationListFragment.newInstance("", "") + return contentFragment + } + + override fun saveDefaultProjectAndSoOn(): String? { + SurveyorDataBase.getInstance().runInTransaction { + SurveyorDatabaseFactory.instance.configDataSource.setSync( + ConfigConstants.KEY_DEFAULT_PROJECT_ID, + projectId + ) + SurveyorDatabaseFactory.instance.configDataSource.setSync( + ConfigConstants.KEY_DEFAULT_PERIOD_ID, + currentPeriodId + ) + } + return null + } + + override fun clickCreateStation() { + SelectSurveyorStationTypeFragment + .select( + childFragmentManager, + viewLifecycleOwner, + projectType + ) { type: String -> + if (SelectSurveyorStationTypeFragment.TYPE_DEFAULT == type) { + DefaultStationSetupFragment.start(context, projectId, currentPeriodId) + } else if (SelectSurveyorStationTypeFragment.TYPE_LINE_SINGLE == type) { + //支导线 + LineStationSingleSetupFragment.startCreate( + context, + projectId, + currentPeriodId + ) + } else if (SelectSurveyorStationTypeFragment.TYPE_LINE_ATTACH == type) { + //附合导线 + LineStationAttachedSetupFragment.startCreate( + context, + projectId, + currentPeriodId + ) + } else if (SelectSurveyorStationTypeFragment.TYPE_LINE_CLOSE == type) { + LineStationCloseSetupFragment.startCreateCloseLine( + context, + projectId, + currentPeriodId + ) + } else if (SelectSurveyorStationTypeFragment.TYPE_LINE_RANDOM == type) { + LineStationRandomSetupFragment.startCreate( + context, + projectId, + currentPeriodId + ) + } else if (SelectSurveyorStationTypeFragment.TYPE_WELL_WIRE == type) { + //一井定向 + LineStationWellSetupFragment.startCreate( + context, + projectId, + currentPeriodId + ) + } else if (SelectSurveyorStationTypeFragment.TYPE_WELL_WIRE_DOUBLE == type) { + //二井定向 + selectWellDoubleType() + } + } + } + + override fun getGuideMsgAndDesc(position: Int): Array { + val array = arrayOfNulls(2) + when (position) { + KEY_GUIDE_INDEX_SURVEYOR_TOLERANCE -> { + array[0] = getString(R.string.guide_modify_project_tolerance) + array[1] = getString(R.string.guide_modify_project_tolerance_describe) + } + + KEY_GUIDE_INDEX_KNOWN_POINTS -> { + array[0] = getString(R.string.guide_edit_known_point) + array[1] = null + } + + KEY_GUIDE_INDEX_UN_KNOWN_POINTS -> { + array[0] = getString(R.string.guide_edit_unknown_point) + array[1] = null + } + + KEY_GUIDE_INDEX_SURVEYOR_CYCLE -> { + array[0] = getString(R.string.guide_switch_surveyor_cycle) + array[1] = null + } + + KEY_GUIDE_INDEX_CREATE_STATION -> { + array[0] = getString(R.string.guide_create_new_station) + array[1] = null + } + } + return array + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initListener() + initData() + } + + private fun initListener() { + initSwithCycle() + } + + private fun initSwithCycle() { + mBinding.cycleLayout.setOnClickListener { + //切换测期 + BottomSheetSurveyorPeriodFragment.pick( + childFragmentManager, + viewLifecycleOwner, + projectId, + currentPeriodId + ) { id: String, name: String -> + setCreatedData { + currentPeriodId = id + mBinding.orderText.text = name + updateStationList(projectId, currentPeriodId) + } + } + } + } + + private fun initData() { + //获取默认测期,刷新页面 + SurveyorDatabaseFactory.instance + .surveyorPeriod + .getDefault( + projectId + ) { instance: SurveyorPeriodRecord -> + setCreatedData { + currentPeriodId = instance.value + runOnUI { + //设置测期名称 + mBinding.orderText.text = instance.name + //设置测站列表 + updateStationList(projectId, instance.id) + } + } + } + } + + private fun updateStationList(projectId: String, periodId: String) { + if (::contentFragment.isInitialized) { + contentFragment.update(projectId, periodId) + } + } + + /** + * 选择二井定向地上还是地下的弹框 + */ + private fun selectWellDoubleType() { + SelectSurveyorStationTypeWellSubFragment + .select( + childFragmentManager, + viewLifecycleOwner + ) { type: String -> + if (SelectSurveyorStationTypeWellSubFragment.TYPE_GROUND == type) { + LineStationWellDoubleGroundSetupFragment.startCreate( + context, + projectId, + currentPeriodId + ) + } else if (SelectSurveyorStationTypeWellSubFragment.TYPE_UNDERGROUND == type) { + LineStationWellDoubleUnderGroundSetupFragment.startCreate( + context, + projectId, + currentPeriodId + ) + } + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/content/RouteFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/content/RouteFragment.kt new file mode 100644 index 0000000..5fcd3db --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/projectdetail/content/RouteFragment.kt @@ -0,0 +1,185 @@ +package com.bingce.controlnetwork.fragment.projectdetail.content + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import androidx.room.withTransaction +import com.bingce.controlnetwork.adapter.contextmenu.ContextMenuDelete +import com.bingce.controlnetwork.fragment.TipsFragment +import com.bingce.controlnetwork.fragment.base.BaseFragment +import com.bingce.controlnetwork.fragment.heighttraverse.adapter.RouteListAdapter +import com.bingce.controlnetwork.fragment.heighttraverse.viewmodel.HeightCreateOrEditVm +import com.bingce.controlapphelper.datasource.database.SurveyorDataBase +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.route.RouteRecord +import com.bingce.controlapphelper.model.BundleConstants +import com.bingce.controlapphelper.util.PointUtil +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.databinding.FragmentListLayoutBinding +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class RouteFragment : BaseFragment() { + + private val heightCreateOrEditVm: HeightCreateOrEditVm by viewModels() + + private var _binding: FragmentListLayoutBinding? = null + val mBinding get() = _binding!! + + private val dataList = mutableListOf() + + val adapter: RouteListAdapter by lazy { + RouteListAdapter(dataList, + { + //路线item点击 + doLookAndEditRoute(it) + }, + object : ContextMenuDelete() { + override fun delete(item: RouteRecord) { + doDelete(item) + } + }) + } + + private fun doLookAndEditRoute(item: RouteRecord) { + heightCreateOrEditVm.showCreateOrEditDialog( + getProjectId()!!, + routeId = item.getId(), + childFragmentManager, + viewLifecycleOwner + ) + } + + private fun doDelete(item: RouteRecord) { + lifecycleScope.launch(Dispatchers.IO) { + + val stationList = SurveyorDatabaseFactory.instance.surveyorStation.getByProjectRoute( + item.projectId, + item.getId() + ) + + var hasData = false + for (stationItem in stationList) { + val recordCount = + SurveyorDatabaseFactory.instance.surveyorRecordDataSource.recordCount( + stationItem.getId() + ) + if (recordCount > 0) { + hasData = true + break + } + } + + if (hasData) { + withContext(Dispatchers.Main) { + TipsFragment.cancelAbleTips( + childFragmentManager, viewLifecycleOwner, context, + getString(R.string.tips_is_sure_to_delete_route_with_record), + 4 + ) { + deleteDatabase(item) + } + } + } else { + deleteDatabase(item) + } + } + } + + private fun deleteDatabase(routeRecord: RouteRecord) { + lifecycleScope.launch(Dispatchers.IO) { + SurveyorDataBase.getInstance().withTransaction { + val stationList = + SurveyorDatabaseFactory.instance.surveyorStation.getByProjectRoute( + routeRecord.projectId, + routeRecord.getId() + ) + + //删除路线 + SurveyorDatabaseFactory.instance.getRouteDataSource().delete(routeRecord) + //删除测站 + SurveyorDatabaseFactory.instance.surveyorStation.deleteByRouteId(routeRecord.getId()) + + if (PointUtil.isCanDeleteHeightTraverseAutoCreatePoint(routeRecord.startPointId)) { + SurveyorDatabaseFactory.instance.pointDataSource.deleteById(routeRecord.startPointId) + } + + if (PointUtil.isCanDeleteHeightTraverseAutoCreatePoint(routeRecord.endPointId)) { + SurveyorDatabaseFactory.instance.pointDataSource.deleteById(routeRecord.endPointId) + } + + for (stationItem in stationList) { + if (stationItem.items != null) { + for (surveyorPoint in stationItem.items) { + if (PointUtil.isCanDeleteHeightTraverseAutoCreatePoint(surveyorPoint.originalPointId)) { + //删除点 + SurveyorDatabaseFactory.instance.pointDataSource.deleteById( + surveyorPoint.originalPointId + ) + } + + } + } + } + + } + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentListLayoutBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + mBinding.list.adapter = adapter + + getProjectId()?.let { it -> + SurveyorDatabaseFactory.instance.getRouteDataSource().getListLiveData(it) + .observe(viewLifecycleOwner) { + adapter.updateData(it) + } + } + } + + + fun getProjectId() = arguments?.getString(BundleConstants.KEY_PROJECT_ID) + + + companion object { + fun newInstance(projectId: String): RouteFragment { + val bundle = Bundle() + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId) + val routeFragment = RouteFragment() + routeFragment.arguments = bundle + return routeFragment + } + } + + /** + * 获取即将要测量的路线id + */ + fun getSurveyorRouteId(): String? { + if (dataList.isNotEmpty()) { + return dataList.last().getId() + } + return null + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/AbstractProjectEditFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/AbstractProjectEditFragment.kt new file mode 100644 index 0000000..8a9b344 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/AbstractProjectEditFragment.kt @@ -0,0 +1,300 @@ +package com.bingce.controlnetwork.fragment.projectedit + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.text.TextUtils +import android.view.View +import androidx.activity.result.ActivityResultLauncher +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.room.withTransaction +import blankj.utilcode.util.ToastUtils +import com.bingce.controlnetwork.fragment.AbstractFullScreenDialogFragment +import com.bingce.controlnetwork.fragment.ToleranceSelectFragment +import com.bingce.controlnetwork.ui.widget.dialog.LoadingUtilKt +import com.bingce.controlnetwork.util.DefaultNameUtil +import com.bingce.controlapphelper.datasource.database.ProjectType +import com.bingce.controlapphelper.datasource.database.SurveyorDataBase +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.ToleranceTemplate +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord +import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord +import com.bingce.controlnetwork.R +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +abstract class AbstractProjectEditFragment : AbstractFullScreenDialogFragment() { + companion object { + + const val KEY_PROJECT_ID = "___project__id" + const val KEY_PROJECT_TYPE = "___project__type" + const val KEY_PROJECT_NAME = "___project___name___" + const val KEY_TOLERANCE_ID = "___tolerance_id" + + const val GUIDE_INDEX_PROJECT_NAME = 0 + const val GUIDE_INDEX_PROJECT_TOLERANCE = 1 + + @JvmStatic + fun editProject( + fragmentManager: FragmentManager, + context: Context, + projectId: String, projectType: String?, toleranceId: String?, projectName: String? + ) { + newInstance( + context, projectId, projectType, + toleranceId, projectName + ).show(fragmentManager, "_edit_project_fragment") + } + + @JvmStatic + fun createProject( + fragmentManager: FragmentManager, + context: Context, + projectType: String? + ) { + newInstance(context, null, projectType, null, null) + .show(fragmentManager, "__create_project_fragment__") + } + + private fun newInstance( + context: Context, projectId: String?, projectType: String?, + toleranceId: String?, projectName: String? + ): DialogFragment { + val fragment = + if (projectType == ProjectType.HEIGHT_TRAVERSE.flag) ProjectEditHeightTraverseFragment() + else ProjectEditTriangleFragment() + + val args = Bundle() + if (projectId.isNullOrEmpty()) { + setArgs(args, context.getString(R.string.title_create_new_project), null) + args.putString(KEY_PROJECT_TYPE, projectType) + } else { + setArgs(args, context.getString(R.string.title_edit_project), null) + args.putString(KEY_PROJECT_ID, projectId) + args.putString(KEY_PROJECT_TYPE, projectType) + args.putString(KEY_TOLERANCE_ID, toleranceId) + args.putString(KEY_PROJECT_NAME, projectName) + } + fragment.arguments = args + return fragment + } + + } + + + protected val scope = MainScope() + + private lateinit var selectedToleranceId: String + + private lateinit var selectToleranceLauncher: ActivityResultLauncher + + + protected fun initSelectToleranceLauncher(fragment: Fragment) { + selectToleranceLauncher = ToleranceSelectFragment.createActivityLauncher( + fragment + ) { + updateToleranceData(it) + } + } + + + fun getProjectId() = arguments?.getString(KEY_PROJECT_ID) + fun getProjectType() = arguments?.getString(KEY_PROJECT_TYPE) + fun getProjectName() = arguments?.getString(KEY_PROJECT_NAME) + fun getToleranceId() = arguments?.getString(KEY_TOLERANCE_ID) + + override fun onDestroyView() { + super.onDestroyView() + scope.cancel() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initView() + initData() + } + + protected open fun initView() { + getToleranceBtn().setOnClickListener { + selectTolerance() + } + } + + protected abstract fun getCurrentProjectName(): String + abstract fun getShowSlopSwitch(): Boolean + abstract fun setToleranceName(name: String) + abstract fun setProjectName(name: String) + abstract fun setShowSlopSwitch(isChecked: Boolean) + abstract fun getToleranceBtn(): View + + //存其他的数据,如果是高程导线存自己的配置信息,没有自己的数据就空实现即可 + abstract suspend fun saveOtherRecord(projectId: String) + + + private fun updateToleranceData(toleranceId: String?) { + toleranceId?.let { + scope.launch { + val toleranceDetailRecord = withContext(Dispatchers.IO) { + SurveyorDatabaseFactory.instance + .toleranceDetailDataSource + .getRecordSync(toleranceId) + } + toleranceDetailRecord?.let { + val groupRecord = ToleranceTemplate.groupOf(it.groupId) + val levelRecord = ToleranceTemplate.levelOf(it.levelId) + + val lineName = if (levelRecord?.name == null) "" else "-${levelRecord.name}" + + setToleranceName("${groupRecord?.name ?: ""}${lineName}-${it.name}") + + selectedToleranceId = toleranceId + } + } + } + } + + protected open fun initData() { + updateToleranceData(getToleranceId()) + //设置项目名称 + setProjectName(getProjectName() ?: DefaultNameUtil.getDefaultProjectName()) + updateShowSlopData(getProjectId()) + } + + private fun updateShowSlopData(projectId: String?) { + if (projectId == null) { + val checked = when (getProjectType()) { + ProjectType.TRIANGLE.flag -> true + ProjectType.CONNECTION.flag -> false + else -> true + } + setShowSlopSwitch(checked) + } else { + scope.launch { + val projectRecord = withContext(Dispatchers.IO) { + SurveyorDatabaseFactory.instance + .projectDataSource + .getRecord(projectId) + } + projectRecord?.let { + setShowSlopSwitch(it.isShowSlopDistance) + } + } + } + } + + private fun selectTolerance() { + //选择限差 + ToleranceSelectFragment.start( + context, + getToleranceId(), + getProjectType(), + selectToleranceLauncher + ) + } + + private fun checkBase(): Boolean { + val projectName = getCurrentProjectName() + if (TextUtils.isEmpty(projectName)) { + ToastUtils.showShort(R.string.tips_need_select_input_project_name) + return false + } + + if (!::selectedToleranceId.isInitialized || TextUtils.isEmpty(selectedToleranceId)) { + ToastUtils.showShort(R.string.tips_need_select_project_tolerance) + return false + } + return true + } + + override fun onConfirm() { + if (!checkBase()) return + saveRecord() + } + + private fun saveRecord() { + scope.launch { + LoadingUtilKt.show(requireContext(), null) + + //开始事务 + SurveyorDataBase.getInstance().withTransaction { + if (isEdit()) { + savaRecordEdit(getCurrentProjectName(), getShowSlopSwitch()) + } else { + val projectRecord = ProjectRecord(getCurrentProjectName()) + projectRecord.projectType = getProjectType() + projectRecord.setToleranceId(selectedToleranceId) + projectRecord.isShowSlopDistance = getShowSlopSwitch() + savaRecordNew(projectRecord) + } + } + + LoadingUtilKt.dismiss() + + super.onConfirm() + } + } + + private suspend fun savaRecordNew(projectRecord: ProjectRecord) { + //存储 + SurveyorDatabaseFactory.instance + .projectDataSource + .saveRecordSync(projectRecord) + + if (ProjectType.HEIGHT_TRAVERSE.flag != projectRecord.getProjectType()) { + //非高程导线 + //创建默认测期 + val surveyorPeriodRecord = + SurveyorPeriodRecord(projectRecord.getId(), DefaultNameUtil.getDefaultPeriodName()) + SurveyorDatabaseFactory.instance + .surveyorPeriod + .saveRecordSync(surveyorPeriodRecord) + + //创建新项目的时候存默认的测期 + SurveyorDatabaseFactory.instance.configDataSource.setSync( + ConfigConstants.KEY_DEFAULT_PERIOD_ID, + surveyorPeriodRecord.getId() + ) + } else { + //创建高程导线时候清空默认路线 + SurveyorDatabaseFactory.instance.configDataSource.setSync( + ConfigConstants.KEY_DEFAULT_ROUTE_ID, + null + ) + } + + //创建新项目的时候存默认的项目,无论是否是高程导线 + SurveyorDatabaseFactory.instance.configDataSource.setSync( + ConfigConstants.KEY_DEFAULT_PROJECT_ID, + projectRecord.getId() + ) + + saveOtherRecord(projectRecord.getId()) + } + + private suspend fun savaRecordEdit(currentProjectName: String, showSlopSwitch: Boolean) { + val projectRecord = SurveyorDatabaseFactory.instance + .projectDataSource + .getRecord(getProjectId()) + + projectRecord.setProjectName(currentProjectName) + projectRecord.setToleranceId(selectedToleranceId) + projectRecord.isShowSlopDistance = showSlopSwitch + + //存储 + SurveyorDatabaseFactory.instance + .projectDataSource + .saveRecordSync(projectRecord) + + saveOtherRecord(getProjectId()!!) + } + + protected fun isEdit() = getProjectId() != null + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/ProjectEditHeightTraverseFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/ProjectEditHeightTraverseFragment.kt new file mode 100644 index 0000000..65e7ad3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/ProjectEditHeightTraverseFragment.kt @@ -0,0 +1,239 @@ +package com.bingce.controlnetwork.fragment.projectedit + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ArrayAdapter +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.heighttraverse.config.model.EveryWay +import com.bingce.controlapphelper.datasource.database.heighttraverse.config.model.HeighTraverseConfigRecord +import com.bingce.controlapphelper.datasource.database.heighttraverse.config.model.SeparateWay +import com.bingce.controlapphelper.datasource.database.heighttraverse.config.model.StationLayout +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.databinding.FragmentProjectEditHeightTraverseBinding +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +/** + * 高程导线新建编辑 + */ +class ProjectEditHeightTraverseFragment : AbstractProjectEditFragment() { + + private val stationLayoutList = listOf( + "隔点设站,设站一次", + "隔点设站,设站两次", + "每点设站,单向观测", + "每点设站,对向观测", + ) + + companion object { +// const val POSITION_SEPARATION = 0//隔点设站的index + + const val POSITION_SEPARATE_SET_UP_ONCE = 0 + const val POSITION_SEPARATE_SET_UP_TWICE = 1 + const val POSITION_EVERY_SINGLE_MEASURE = 2 + const val POSITION_EVERY_OPPOSITE_MEASURE = 3 + } + + init { + initSelectToleranceLauncher(this) + } + + private var _binding: FragmentProjectEditHeightTraverseBinding? = null + private val mBinding get() = _binding!! + + override fun createContentView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentProjectEditHeightTraverseBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun initView() { + super.initView() + + mBinding.spinner.setAdapter( + ArrayAdapter( + requireContext(), + R.layout.item_spinner_text, + stationLayoutList + ) + ) +// mBinding.dtlStationMode.observeIndexChange { fromIndex, toIndex, reselect, fromUser -> +// if (toIndex == POSITION_SEPARATION) { +// //隔点设站 +// mBinding.everyMeasureModeParent.visibility = View.GONE +// mBinding.separationMeasureModeParent.visibility = View.VISIBLE +// } else { +// //每点设站 +// mBinding.everyMeasureModeParent.visibility = View.VISIBLE +// mBinding.separationMeasureModeParent.visibility = View.GONE +// } +// } + } + + override fun initData() { + super.initData() + getProjectId()?.let { + scope.launch { + setEditClickEnable(it) + setStationLayoutData(it) + } + } + } + + /** + *设置布局方式数据 + */ + private suspend fun setStationLayoutData(projectId: String) { + val record = withContext(Dispatchers.IO) { + getRecord(projectId) + } + record?.let { + val stationLayoutSpinnerPos = if (it.stationLayout == StationLayout.SEPARATE) { + if (it.separateWay == SeparateWay.SET_UP_ONCE) { + POSITION_SEPARATE_SET_UP_ONCE + } else { + POSITION_SEPARATE_SET_UP_TWICE + } + } else { + if (it.everyWay == EveryWay.SINGLE_MEASURE) { + POSITION_EVERY_SINGLE_MEASURE + } else { + POSITION_EVERY_OPPOSITE_MEASURE + } + } + mBinding.spinner.setSelection(stationLayoutSpinnerPos) +// mBinding.dtlStationMode.onPageSelected(it.stationLayout.ordinal) +// it.separateWay?.ordinal?.let { +// mBinding.dtlSeparationMeasureMode.onPageSelected(it) +// } +// it.everyWay?.ordinal?.let { +// mBinding.dtlEveryMeasureMode.onPageSelected(it) +// } + } + } + + /** + * 当项目中新建测站了就不能编辑了布置方式了 + */ + private suspend fun setEditClickEnable(projectId: String) { + withContext(Dispatchers.IO) { + val countByProjectId = + SurveyorDatabaseFactory.instance.surveyorStation.getCountByProjectId(projectId) + + if (countByProjectId != 0) { +// mBinding.dtlStationMode.itemEnableSelector = false +// mBinding.dtlSeparationMeasureMode.itemEnableSelector = false +// mBinding.dtlEveryMeasureMode.itemEnableSelector = false + mBinding.spinner.isEnabled = false + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + + override fun getCurrentProjectName(): String { + return mBinding.il.editor.text.toString().trim() + } + + override fun setToleranceName(name: String) { + mBinding.il.selectTolerance.text = name + } + + override fun setProjectName(name: String) { + mBinding.il.editor.setText(name) + } + + override fun setShowSlopSwitch(isChecked: Boolean) { + mBinding.il.showSlopSwitch.isChecked = isChecked + } + + override fun getToleranceBtn(): View { + return mBinding.il.selectTolerance + } + + override suspend fun saveOtherRecord(projectId: String) { + var record = getRecord(projectId) + if (record == null) { + record = HeighTraverseConfigRecord.newInstance( + projectId, getStationLayout(), + getSeparateWay(), + getEveryWay() + ) + } else { + record.stationLayout = getStationLayout() + record.separateWay = getSeparateWay() + record.everyWay = getEveryWay() + } + SurveyorDatabaseFactory.instance.getHeightTraverseConfigDataSource().saveRecord(record) + } + + private suspend fun getRecord(projectId: String): HeighTraverseConfigRecord? { + val heightTraverseConfigDataSource = + SurveyorDatabaseFactory.instance.getHeightTraverseConfigDataSource() + return heightTraverseConfigDataSource.getRecordByProjectId(projectId) + } + +// private fun getStationLayout() = when (mBinding.dtlStationMode.currentItemIndex) { +// POSITION_SEPARATION -> { +// StationLayout.SEPARATE +// } +// +// else -> StationLayout.EVERY +// } +// +// private fun getSeparateWay() = getSeparateOrEveryWay(mBinding.dtlSeparationMeasureMode) { +// SeparateWay.values()[it] +// } +// +// private fun getEveryWay() = getSeparateOrEveryWay(mBinding.dtlEveryMeasureMode) { +// EveryWay.values()[it] +// } + + private fun getStationLayout() = when (mBinding.spinner.selectedItemPosition) { + POSITION_SEPARATE_SET_UP_ONCE, POSITION_SEPARATE_SET_UP_TWICE -> { + StationLayout.SEPARATE + } + + else -> StationLayout.EVERY + } + + private fun getSeparateWay() = when (mBinding.spinner.selectedItemPosition) { + POSITION_SEPARATE_SET_UP_ONCE -> { + SeparateWay.SET_UP_ONCE + } + + POSITION_SEPARATE_SET_UP_TWICE -> { + SeparateWay.SET_UP_TWICE + } + + else -> null + } + + private fun getEveryWay() = when (mBinding.spinner.selectedItemPosition) { + POSITION_EVERY_SINGLE_MEASURE -> { + EveryWay.SINGLE_MEASURE + } + + POSITION_EVERY_OPPOSITE_MEASURE -> { + EveryWay.OPPOSITE_MEASURE + } + + else -> null + } + + + override fun getShowSlopSwitch(): Boolean { + return mBinding.il.showSlopSwitch.isChecked + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/ProjectEditTriangleFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/ProjectEditTriangleFragment.kt new file mode 100644 index 0000000..eb84192 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/projectedit/ProjectEditTriangleFragment.kt @@ -0,0 +1,127 @@ +package com.bingce.controlnetwork.fragment.projectedit + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.bingce.controlnetwork.guide.GuideSequence +import com.bingce.controlnetwork.guide.ITapTargetProvider +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.databinding.FragmentProjectEditTriangleBinding +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +/** + * 三角测量和联系测量共用 + */ +class ProjectEditTriangleFragment : AbstractProjectEditFragment() { + + init { + initSelectToleranceLauncher(this) + } + + private var _binding: FragmentProjectEditTriangleBinding? = null + + private val mBinding get() = _binding!! + + + val configDataSource: IConfigDataSource = SurveyorDatabaseFactory.instance.configDataSource + + private val createProjectGuide = GuideSequence(GUIDE_INDEX_PROJECT_TOLERANCE + 1, + object : GuideSequence.IDelegate { + override fun show(index: Int, provider: ITapTargetProvider) { + if (index == GUIDE_INDEX_PROJECT_NAME) { + provider.show4View( + dialog, + view?.findViewById(R.id.editor), + getString(R.string.guide_input_project_name), getString(R.string.guide_project_name_can_same) + ) + } else if (index == GUIDE_INDEX_PROJECT_TOLERANCE) { + provider.show4View( + dialog, + view?.findViewById(R.id.select_tolerance), + getString(R.string.guide_select_tolerance_of_project), null + ) + } + } + + override fun dismiss(index: Int) { + if (GUIDE_INDEX_PROJECT_NAME == index) { + ConfigConstants.markGuideCompleted( + ConfigConstants.KEY_GUIDE_INPUT_PROJECT_NAME, configDataSource + ) + } else if (GUIDE_INDEX_PROJECT_TOLERANCE == index) { + ConfigConstants.markGuideCompleted( + ConfigConstants.KEY_GUIDE_SELECT_TOLERANCE, configDataSource + ) + } + } + }) + + + override fun createContentView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + _binding = FragmentProjectEditTriangleBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun quitWhenTouchBg(): Boolean { + return true + } + + override fun onResume() { + super.onResume() + dealTyroGuide() + } + + private fun dealTyroGuide() { + scope.launch { + val index = withContext(Dispatchers.IO) { + if (!ConfigConstants.isGuideCompleted(ConfigConstants.KEY_GUIDE_INPUT_PROJECT_NAME, configDataSource)) { + 0 + } else if (!ConfigConstants.isGuideCompleted(ConfigConstants.KEY_GUIDE_SELECT_TOLERANCE, configDataSource)) { + 1 + } else -1 + } + createProjectGuide.start(index) + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun getCurrentProjectName(): String { + return mBinding.il.editor.text.toString().trim() + } + + override fun setToleranceName(name: String) { + mBinding.il.selectTolerance.text = name + } + + override fun setProjectName(name: String) { + mBinding.il.editor.setText(name) + } + + override fun setShowSlopSwitch(isChecked: Boolean) { + mBinding.il.showSlopSwitch.isChecked = isChecked + } + + override fun getToleranceBtn(): View { + return mBinding.il.selectTolerance + } + + override suspend fun saveOtherRecord(projectId: String) { + //暂无使用 + } + + override fun getShowSlopSwitch(): Boolean { + return mBinding.il.showSlopSwitch.isChecked + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/AbstractStationFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/AbstractStationFragment.java new file mode 100644 index 0000000..afd5ea2 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/AbstractStationFragment.java @@ -0,0 +1,108 @@ +package com.bingce.controlnetwork.fragment.station; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.SwitchCompat; +import androidx.fragment.app.Fragment; + +import com.bingce.controlapphelper.util.Tools; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; +import com.bingce.controlnetwork.activity.fragmentcontainer.IOnBackFilter; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; +import com.bingce.controlnetwork.fragment.base.BaseFragment; + +public abstract class AbstractStationFragment extends BaseFragment implements IOnBackFilter { + + /** + * 错误提示-已经存在重复测期测站 + * + * @param duplicateStationName + */ + protected void tipsError(String duplicateStationName) { + runOnUI(() -> { + if (getContext() == null) { + return; + } + TipsFragment.tipsOnly( + getChildFragmentManager(), + getViewLifecycleOwner(), + getContext(), + duplicateStationError(duplicateStationName)); + }); + } + + protected String duplicateStationError(String duplicateStationName) { + return Tools.getString(R.string.already_exist_station_period, duplicateStationName); + } + + protected abstract int layoutRes(); + + @Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(layoutRes(), container, false); + } + + protected static boolean warningDataLosing(@NonNull Fragment fragment) { + TipsWith2OptionFragment + .tips( + fragment.getChildFragmentManager(), + fragment.getViewLifecycleOwner(), + fragment.getString(R.string.exit), + fragment.getString(R.string.cancel), + fragment.getString(R.string.tips_station_data_will_lose), + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + if (fragment.getActivity() != null) { + fragment.getActivity().finish(); + } + } + } + ); + return true; + } + + protected static boolean switchIsChecked(View view, int id) { + if (view == null) { + return false; + } + SwitchCompat switchCompat = view.findViewById(id); + if (switchCompat != null) { + return switchCompat.isChecked(); + } + return false; + } + + protected boolean needLeftRightSurveyor() { + return switchIsChecked(getView(), R.id.left_right_switch); + } + + + protected void updateLeftRightMark(View view, boolean need) { + if (view == null) { + return; + } + SwitchCompat switchCompat = view.findViewById(R.id.left_right_switch); + if (switchCompat != null) { + switchCompat.setChecked(need); + } + } + + protected static boolean isListEmpty(List stationItems) { + return stationItems != null && !stationItems.isEmpty(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/AbstractSingleStationPointListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/AbstractSingleStationPointListFragment.java new file mode 100644 index 0000000..7a381a0 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/AbstractSingleStationPointListFragment.java @@ -0,0 +1,201 @@ +package com.bingce.controlnetwork.fragment.station.defaultstation; + +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.stationdetail.BaseStationDetailAdapter; +import com.bingce.controlnetwork.adapter.stationdetail.EditableStationDetailAdapter; +import com.bingce.controlnetwork.adapter.stationdetail.NoEditableStationDetailAdapter; +import com.bingce.controlnetwork.fragment.PickPointFragment; +import com.bingce.controlnetwork.fragment.station.AbstractStationFragment; +import com.bingce.controlnetwork.ui.widget.recyclerview.SwipeDraggableRecyclerViewUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import blankj.utilcode.util.ToastUtils; + +public abstract class AbstractSingleStationPointListFragment extends AbstractStationFragment + implements BaseStationDetailAdapter.IOnSelectPointDelegate, + SwipeDraggableRecyclerViewUtil.IStationPointOperatorListener { + private static final String TYPE_SURVEYOR_STATION = "___station_points"; + private static final String TYPE_SURVEYOR_POINT = "___surveyor_points"; + private BaseStationDetailAdapter defaultStationDetailAdapter; + private final ActivityResultLauncher defaultStationLauncher = PickPointFragment.createActivityLauncher(this, (type, pickPointResult) -> { + if (pickPointResult.getSelectedIds().isEmpty() || pickPointResult.getSelectedNames().isEmpty()) { + return; + } + if (TYPE_SURVEYOR_STATION.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().get(0) == null || + pickPointResult.getSelectedNames().get(0) == null) { + showStationPointError(); + return; + } + defaultStationDetailAdapter.setStationPoint( + pickPointResult.getSelectedIds().get(0), + pickPointResult.getSelectedNames().get(0)); + } else if (TYPE_SURVEYOR_POINT.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() != pickPointResult.getSelectedNames().size() || + pickPointResult.getSelectedIds().size() < 2) { + showPointCountError(); + return; + } + defaultStationDetailAdapter.setSurveyorPoint( + pickPointResult.getSelectedIds(), + pickPointResult.getSelectedNames()); + } + onItemChanged(); + }); + + protected abstract void prepareAdapterData(IDataCallback callback); + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + if (view == null) { + return null; + } + RecyclerView recyclerView = view.findViewById(R.id.recycler_view); + if (recyclerView != null) { + prepareAdapterData((editAble, items) -> { + if (getContext() == null) { + return; + } + if (editAble) { + defaultStationDetailAdapter = new EditableStationDetailAdapter( + AbstractSingleStationPointListFragment.this, + items); + } else { + defaultStationDetailAdapter = new NoEditableStationDetailAdapter(items); + } + runOnUI(() -> { + recyclerView.setAdapter(defaultStationDetailAdapter); + SwipeDraggableRecyclerViewUtil.setup(defaultStationDetailAdapter, + recyclerView, + getChildFragmentManager(), + getViewLifecycleOwner(), + this, + getContext()); + }); + }); + } + setHasOptionsMenu(true); + return view; + } + + protected final List collectDataItems() { + if (defaultStationDetailAdapter == null) { + return null; + } + return defaultStationDetailAdapter.collectData(); + } + + /** + * 将数据库存储的测站点列表和显示的顺序保持一致 + * + * @param surveyorStationRecord + */ + protected final void sortStationPoint(SurveyorStationRecord surveyorStationRecord) { + List currentItems = collectDataItems(); + if (currentItems == null) { + return; + } + //对现有数据进行排序 + Map map = new HashMap<>(); + for (SurveyorPoint item : surveyorStationRecord.getItems()) { + map.put(item.getPointId(), item); + } + for (int index = 0; index < currentItems.size(); index++) { + SurveyorPoint item = currentItems.get(index); + if (item == null) { + continue; + } + SurveyorPoint find = map.get(item.getPointId()); + if (find == null) { + continue; + } + currentItems.set(index, find); + } + surveyorStationRecord.setItems(currentItems); + } + + @Override + public void onSelectStationPoint(PickPointResult pickPointResult, ArrayList filters) { + if (getArguments() == null || getContext() == null) { + return; + } + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + PickPointFragment.pickPoint( + getContext(), + TYPE_SURVEYOR_STATION, + 1, + getContext().getString(R.string.select_station_point), + filters, + projectId, pickPointResult, defaultStationLauncher); + } + + @Override + public void onSelectSurveyorPoint(PickPointResult pickPointResult, ArrayList filters) { + if (getArguments() == null || getContext() == null) { + return; + } + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + PickPointFragment.pickPoint( + getContext(), + TYPE_SURVEYOR_POINT, + -1, + getContext().getString(R.string.select_surveyor_point), + filters, + projectId, pickPointResult, defaultStationLauncher); + } + + @Override + public void onItemRemoved(int adapterPosition) { + onItemChanged(); + } + + @Override + public void onItemDragCompleted() { + onItemChanged(); + } + + /** + * 测站数据发生了变化--测点被删除、测点被修改、测站被修改、测点被拖拽 + */ + protected abstract void onItemChanged(); + + protected int surveyorPointSize() { + return defaultStationDetailAdapter.surveyorPointSize(); + } + + private void showPointCountError() { + ToastUtils.showShort(R.string.tips_surveyor_point_must_more_than_2); + } + + private void showStationPointError() { + ToastUtils.showShort(R.string.tips_please_select_station_point); + } + + public interface IDataCallback { + void onGetAdapterData(boolean editAble, List items); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/ComponentSingleStationPointListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/ComponentSingleStationPointListFragment.java new file mode 100644 index 0000000..d24f8a9 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/ComponentSingleStationPointListFragment.java @@ -0,0 +1,180 @@ +package com.bingce.controlnetwork.fragment.station.defaultstation; + +import android.os.Bundle; + +import androidx.annotation.WorkerThread; +import androidx.lifecycle.ViewModelProvider; + +import com.bingce.controlapphelper.datasource.database.ProjectType; +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.IPointDataSource; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.stationdetail.StationDetailViewModel; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.ArrayList; +import java.util.List; + +public class ComponentSingleStationPointListFragment extends AbstractSingleStationPointListFragment { + + @Override + protected int layoutRes() { + return R.layout.fragment_surveyor_station_point_list_layout; + } + + @Override + protected void prepareAdapterData(IDataCallback callback) { + if (getArguments() == null) { + return; + } + String stationId = getArguments().getString(KEY_STATION_ID); + IPointDataSource pointDataSource = SurveyorDatabaseFactory + .instance + .getPointDataSource(); + ThreadPoolUtil.execute(() -> { + if (getContext() == null) { + return; + } + //1.读取测站数据 + SurveyorStationRecord surveyorStationRecord = + SurveyorDatabaseFactory.instance.getSurveyorStation().getRecordSync(stationId); + List items = surveyorStationRecord.getItems(); + //2.提取测站点和测点 + List pointIdsWithoutStation = new ArrayList<>(); + List pointNamesWithoutStation = new ArrayList<>(); + String stationPointId = null; + String stationPointName = null; + for (SurveyorPoint item : items) { + if (item == null) { + continue; + } + if (SurveyorPoint.TYPE_STATION.equals(item.getType())) { + stationPointId = item.getPointId(); + PointRecord pointRecord = pointDataSource.findByIdSync(stationPointId); + if (pointRecord != null) { + stationPointName = pointRecord.getName(); + } + } else if (SurveyorPoint.TYPE_POINT.equals(item.getType())) { + pointIdsWithoutStation.add(item.getPointId()); + PointRecord pointRecord = pointDataSource.findByIdSync(item.getPointId()); + if (pointRecord != null) { + pointNamesWithoutStation.add(pointRecord.getName()); + } + } + } + //3.为adapter创建数据源 + List itemList = new ArrayList<>(); + //添加测站title item + itemList.add( + new StationDetailItem( + getContext().getString(R.string.select_station_point), + StationDetailItem.ITEM_TYPE_STATION_GROUP, + null)); + if (stationPointId != null && stationPointName != null) { + //添加测站点 + StationDetailItem item = + new StationDetailItem( + stationPointName, + StationDetailItem.ITEM_TYPE_STATION_ITEM, + stationPointId); + itemList.add(item); + } + //添加测点title item + itemList.add( + new StationDetailItem( + getContext().getString(R.string.select_surveyor_point), + StationDetailItem.ITEM_TYPE_POINT_GROUP, + null)); + for (int index = 0; index < pointIdsWithoutStation.size(); index++) { + String id = pointIdsWithoutStation.get(index); + String name = pointNamesWithoutStation.get(index); + if (id == null || name == null) { + continue; + } + //添加测点 + StationDetailItem item = + new StationDetailItem( + name, + StationDetailItem.ITEM_TYPE_POINT_ITEM, + id); + itemList.add(item); + } + //4.回调 + callback.onGetAdapterData(isCanEditSurveyorPoint(surveyorStationRecord), itemList); + + runOnUI(() -> updateLeftRightMark(getView(), surveyorStationRecord.leftAndRightSurveyor)); + }); + } + + @Override + protected void onItemChanged() { + if (getArguments() == null) { + return; + } + String stationId = getArguments().getString(KEY_STATION_ID); + ThreadPoolUtil.execute(() -> { + if (getContext() == null) { + return; + } + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory.instance.getSurveyorStation(); + //1.读取测站数据 + SurveyorStationRecord currentRecord = stationDataSource.getRecordSync(stationId); + if (currentRecord == null) { + return; + } + //2.排序测站列表 + sortStationPoint(currentRecord); + //3.存储测站record + stationDataSource.saveSync(currentRecord); + //4.更新测点数量 + runOnUI(() -> { + if (getActivity() == null) { + return; + } + StationDetailViewModel viewModel = new ViewModelProvider(requireActivity()) + .get(StationDetailViewModel.class); + viewModel.setPointSurveyorCount(surveyorPointSize()); + }); + }); + } + + @Override + public boolean cancelBack() { + return false; + } + + private static final String KEY_STATION_ID = "__station_id"; + public static final String TAG = ComponentSingleStationPointListFragment.class.getName(); + + public static ComponentSingleStationPointListFragment newInstance(String stationId, String projectId) { + ComponentSingleStationPointListFragment fragment = new ComponentSingleStationPointListFragment(); + Bundle bundle = new Bundle(); + bundle.putString(KEY_STATION_ID, stationId); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + fragment.setArguments(bundle); + return fragment; + } + + @WorkerThread + private boolean isCanEditSurveyorPoint(SurveyorStationRecord stationRecord) { + ProjectRecord projectRecord = SurveyorDatabaseFactory.instance.getProjectDataSource().getRecord(stationRecord.getProjectId()); + if (projectRecord.getProjectType() == null || projectRecord.getProjectType().equals(ProjectType.TRIANGLE.getFlag())) { + if (!stationRecord.isLineStation()) { + long surveyorRecordCount = + SurveyorDatabaseFactory + .instance + .getSurveyorRecordDataSource() + .recordCount(stationRecord.getId()); + return surveyorRecordCount <= 0; + } + } + return false; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/DefaultStationSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/DefaultStationSetupFragment.java new file mode 100644 index 0000000..0f05fce --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/defaultstation/DefaultStationSetupFragment.java @@ -0,0 +1,224 @@ +package com.bingce.controlnetwork.fragment.station.defaultstation; + +import android.content.Context; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.SwitchCompat; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.IPointDataSource; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.Arrays; +import java.util.List; + +public class DefaultStationSetupFragment extends AbstractSingleStationPointListFragment { + public static final String TAG = DefaultStationSetupFragment.class.getName(); + private MenuItem confirmItem; + + @Override + protected int layoutRes() { + return R.layout.fragment_default_surveyor_station_setup_layout; + } + + @Override + protected void prepareAdapterData(IDataCallback callback) { + if (callback == null || getContext() == null) { + return; + } + List itemList = Arrays.asList( + new StationDetailItem( + getContext().getString(R.string.select_station_point), + StationDetailItem.ITEM_TYPE_STATION_GROUP, + null), + new StationDetailItem( + getContext().getString(R.string.select_surveyor_point), + StationDetailItem.ITEM_TYPE_POINT_GROUP, + null)); + callback.onGetAdapterData(true, itemList); + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + inflater.inflate(R.menu.menu_confirm, menu); + confirmItem = menu.findItem(R.id.menu_confirm); + if (confirmItem != null) { + confirmItem.setEnabled(false); + } + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (R.id.menu_confirm == item.getItemId()) { + //收集信息,并创建站点记录 + List stationItems = collectDataItems(); + if (stationItems == null || getArguments() == null) { + return super.onOptionsItemSelected(item); + } + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + String periodId = getArguments().getString(BundleConstants.KEY_PERIOD_ID); + ThreadPoolUtil.execute(() -> { + //找到站的点id + String stationPointId = ""; + for (SurveyorPoint stationItem : stationItems) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + stationPointId = stationItem.getPointId(); + break; + } + } + String name = checkValidate(stationPointId, projectId, periodId); + if (name != null && !name.isEmpty()) { + tipsError(name); + return; + } + //先对stationItems点作处理 + //处理方式就是,如果这里面有点是global_control,将其拷贝到project known_point中 + //并使用拷贝的pointId替换stationItems里面的id + PointUtil.globalToProjectControlPoint(stationItems, projectId); + + IPointDataSource pointDataSource = + SurveyorDatabaseFactory.instance.getPointDataSource(); + PointRecord pointRecord = pointDataSource.findByIdSync(stationPointId); + if (pointRecord == null) { + return; + } + ProjectRecord projectRecord = SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getRecord(projectId); + boolean showSlopDistance = true; + if (projectRecord != null) { + showSlopDistance = projectRecord.isShowSlopDistance(); + } + SurveyorStationRecord stationRecord = SurveyorStationRecord.mulAngle(projectId, periodId); + stationRecord.setItems(stationItems); + if (stationItems.size() > 4) { + stationRecord.setAutoClose(true); + } + //检测左右角 + stationRecord.setLeftAndRightSurveyor(needLeftRightSurveyor()); + + stationRecord.setShowSlopDistance(showSlopDistance); + + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .saveSync(stationRecord); + + + runOnUI(() -> { + if (getActivity() != null) { + getActivity().finish(); + } + }); + }); + } + return super.onOptionsItemSelected(item); + } + + protected static String checkValidate(String stationPointId, String projectId, String periodId) { + //检测该测期下是否有同名测站 + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory + .instance + .getSurveyorStation(); + List stationRecordList = + stationDataSource.getDataList(projectId, periodId); + if (stationRecordList != null) {//遍历当前已有测站,检测是否有同名测站 + for (SurveyorStationRecord record : stationRecordList) { + List items = record.getItems(); + if (items != null) {//检测测站名是否相同 + for (SurveyorPoint stationItem : items) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + if (stationItem.getPointId().equals(stationPointId)) { + PointRecord pointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationItem.getOriginalPointId()); + if (pointRecord != null) { + return pointRecord.getName(); + } + return ""; + } + break; + } + } + } + } + } + return null; + } + + protected boolean isCurrentDataValidate() { + List stationItems = collectDataItems(); + if (stationItems == null || stationItems.size() < 3) { + return false; + } else { + //检测是否有station item + for (SurveyorPoint item : stationItems) { + if (item == null) { + continue; + } + if (SurveyorPoint.TYPE_STATION.equals(item.getType())) { + return true; + } + } + } + return false; + } + + @Override + protected void onItemChanged() { + if (confirmItem != null) {//设置menuItem enable + confirmItem.setEnabled(isCurrentDataValidate()); + } + //检测左右角是否 + SwitchCompat leftAndRightSwitch = findViewById(R.id.left_right_switch); + if (leftAndRightSwitch != null) { + if (surveyorPointSize() == 2) { + leftAndRightSwitch.setEnabled(true); + } else { + leftAndRightSwitch.setEnabled(false); + leftAndRightSwitch.setChecked(false); + } + } + } + + @Override + public boolean cancelBack() { + List items = collectDataItems(); + if (isListEmpty(items)) { + return warningDataLosing(this); + } + return false; + } + + public static final int title = R.string.new_surveyor_station; + + public static void start(Context context, String projectId, String period) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_PERIOD_ID, period); + FragmentContainerActivity.start(context, TAG, title, bundle); + } + + public static DefaultStationSetupFragment newInstance(Bundle bundle) { + DefaultStationSetupFragment fragment = new DefaultStationSetupFragment(); + fragment.setArguments(bundle); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/AbstructSetupStationHeightTraverseFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/AbstructSetupStationHeightTraverseFragment.kt new file mode 100644 index 0000000..33ace4c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/AbstructSetupStationHeightTraverseFragment.kt @@ -0,0 +1,181 @@ +package com.bingce.controlnetwork.fragment.station.heighttraverse + +import android.os.Bundle +import android.view.View +import androidx.annotation.WorkerThread +import androidx.fragment.app.Fragment +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.point.PointRecord +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord +import com.bingce.controlapphelper.util.RegExUtil +import com.bingce.controlapphelper.util.Tools +import com.bingce.controlnetwork.R +import com.bingce.utils.DateUtils +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import java.util.Date + +abstract class AbstructSetupStationHeightTraverseFragment : Fragment() { + + val prefixStation: String = Tools.getString(R.string.transfer) + val prefixJianXie: String = Tools.getString(R.string.break_point) + val prefixTransfer: String = Tools.getString(R.string.turn_point) + + private val mainScope = MainScope() + + abstract fun doConfirm() + abstract fun isCheckedJianXiePoint(): Boolean + abstract fun isCheckedEndPoint(): Boolean + abstract fun getFrontPointHeight(): String + + abstract suspend fun getBackPoint(): PointRecord + abstract suspend fun getFrontPoint(): PointRecord + abstract suspend fun getStationPoint(): PointRecord? + abstract fun initView() + abstract fun initListener() + abstract fun initData() + + fun launch(block: suspend CoroutineScope.() -> Unit) { + mainScope.launch(Dispatchers.IO) { + block.invoke(this) + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initView() + initListener() + initData() + } + + override fun onDestroyView() { + super.onDestroyView() + mainScope.cancel() + } + + fun getProjectId(): String { + val createStationForHeightTraverseFragment = + parentFragment as CreateStationForHeightTraverseFragment + return createStationForHeightTraverseFragment.getProjectId() + } + + fun getRouteId(): String { + val createStationForHeightTraverseFragment = + parentFragment as CreateStationForHeightTraverseFragment + return createStationForHeightTraverseFragment.getRouteId() + } + + fun createStationRecordNoSurveyorPoints( + projectId: String, + projectType: String, + relationStationId: String? + ): SurveyorStationRecord { + val stationRecord = SurveyorStationRecord() + stationRecord.id = DateUtils.genRandomTimeId() + stationRecord.projectId = projectId + stationRecord.projectType = projectType + stationRecord.showSlopDistance = true + stationRecord.createDate = Date() + stationRecord.routeId = getRouteId() + stationRecord.items = mutableListOf() + stationRecord.relationStationId = relationStationId + return stationRecord + } + + protected fun finish() { + requireActivity().finish() + } + + @WorkerThread + protected fun savePoint( + pointName: String, + pointTypeHeightTraverse: String?, + projectId: String, + height: String? + ): String { +// var pointRecord = +// SurveyorDatabaseFactory.instance.pointDataSource.findByNameSync( +// pointName, +// projectId +// ) +// if (pointRecord == null) { +// pointRecord = PointRecord.point( +// getProjectId(), +// PointRecord.TYPE_UNKNOWN_POINT, +// pointName, +// "", +// 0.0, +// 0.0, +// stringToDouble(height), +// "", +// -1 +// ) +// pointRecord.pointTypeHeightTraverse = pointTypeHeightTraverse +// SurveyorDatabaseFactory.instance.pointDataSource.saveSync(pointRecord) +// } else { +// pointRecord.setZ(stringToDouble(height)) +// SurveyorDatabaseFactory.instance.pointDataSource.update(pointRecord) +// } + + val pointRecord = PointRecord.point( + projectId, + PointRecord.TYPE_UNKNOWN_POINT, + pointName, + "", + 0.0, + 0.0, + stringToDouble(height), + "", + -1 + ) + pointRecord.pointTypeHeightTraverse = pointTypeHeightTraverse + SurveyorDatabaseFactory.instance.pointDataSource.saveSync(pointRecord) + + return pointRecord.getId() + } + + @WorkerThread + protected fun saveFrontPoint(projectId: String, frontName: String): String { + var frontPointTypeHeightTraverse: String? = null + if (isCheckedJianXiePoint()) { + frontPointTypeHeightTraverse = + PointRecord.TYPE_HEIGHT_TRAVERSE_INTERVAL + } else if (isCheckedEndPoint()) { + //终点 + } else { + frontPointTypeHeightTraverse = + PointRecord.TYPE_HEIGHT_TRAVERSE_TRANSFER + } + + val frontHeight = getFrontPointHeight() + + return savePoint(frontName, frontPointTypeHeightTraverse, projectId, frontHeight) + } + + fun doubleToString(value: Double) = value.toString() + fun stringToDouble(value: String?): Double { + if (value.isNullOrEmpty()) { + return 0.0 + } + return value.toDouble() + } + + @WorkerThread + protected fun getNewIndexFromTwoPointId(pointId1: String, pointId2: String): PointRecord { + val point1 = + SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(pointId1) + val point2 = + SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(pointId2) + val index1 = RegExUtil.getIndexFromName(point1.getName()) + val index2 = RegExUtil.getIndexFromName(point2.getName()) + if (index1 >= index2) { + return point1 + } + return point2 + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/CreateStationForHeightTraverseFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/CreateStationForHeightTraverseFragment.kt new file mode 100644 index 0000000..bf62a2c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/CreateStationForHeightTraverseFragment.kt @@ -0,0 +1,176 @@ +package com.bingce.controlnetwork.fragment.station.heighttraverse + +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.heighttraverse.config.model.EveryWay +import com.bingce.controlapphelper.datasource.database.heighttraverse.config.model.SeparateWay +import com.bingce.controlapphelper.datasource.database.heighttraverse.config.model.StationLayout +import com.bingce.controlapphelper.model.BundleConstants +import com.bingce.controlapphelper.util.Tools +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity +import com.bingce.controlnetwork.databinding.FragmentCreateStationForHeightTraverseBinding +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch + +/** + * 高程导线 新建测站 + */ +class CreateStationForHeightTraverseFragment : Fragment() { + + private lateinit var confirmItem: MenuItem + + private var _binding: FragmentCreateStationForHeightTraverseBinding? = null + val mBinding get() = _binding!! + private val mainScope = MainScope() + + private var currentFragment: AbstructSetupStationHeightTraverseFragment? = null + + + companion object { + @JvmField + val TAG: String = CreateStationForHeightTraverseFragment::class.java.name + + @JvmStatic + fun newInstance(args: Bundle?): Fragment { + val fragment: Fragment = CreateStationForHeightTraverseFragment() + fragment.arguments = args + return fragment + } + + @JvmStatic + fun start(context: Context, projectId: String?, routeId: String?) { + val bundle = Bundle() + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId) + bundle.putString(BundleConstants.KEY_ROUTE_ID, routeId) + FragmentContainerActivity.start( + context, + TAG, + R.string.new_surveyor_station,//新建测站 + bundle + ) + } + + } + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + setHasOptionsMenu(true) + _binding = + FragmentCreateStationForHeightTraverseBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.menu_confirm, menu) + confirmItem = menu.findItem(R.id.menu_confirm) + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (R.id.menu_confirm == item.itemId) { + currentFragment?.doConfirm() + } + return super.onOptionsItemSelected(item) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + init() + } + + private fun init() { + mainScope.launch { + val configRecord = + SurveyorDatabaseFactory.instance.getHeightTraverseConfigDataSource() + .getRecordByProjectId(getProjectId()) + configRecord?.let { + + val stringBuilder = StringBuilder() + stringBuilder.append(Tools.getString(R.string.note_current_station_is)) + + if (it.stationLayout == StationLayout.SEPARATE) { + + if (it.separateWay == SeparateWay.SET_UP_ONCE) { + stringBuilder.append(Tools.getString(R.string.set_up_station_is_seperate_once)) + + replaceFragment( + SeparatSetupStationFragment.newInstance( + SeparatSetupStationFragment.TYPE_ONCE + ) + ) + } else if (it.separateWay == SeparateWay.SET_UP_TWICE) { + stringBuilder.append(Tools.getString(R.string.set_up_station_is_seperate_twice)) + + replaceFragment( + SeparatSetupStationFragment.newInstance( + SeparatSetupStationFragment.TYPE_TWICE + ) + ) + } + } else if (it.stationLayout == StationLayout.EVERY) { + + if (it.everyWay == EveryWay.SINGLE_MEASURE) { + stringBuilder.append(Tools.getString(R.string.set_up_station_is_each_one_way)) + + replaceFragment( + EverySetUpStationFragment.newInstance( + EverySetUpStationFragment.TYPE_ONE_WAY + ) + ) + } else if (it.everyWay == EveryWay.OPPOSITE_MEASURE) { + stringBuilder.append(Tools.getString(R.string.set_up_station_is_each_opposite)) + + replaceFragment( + EverySetUpStationFragment.newInstance( + EverySetUpStationFragment.TYPE_TWO_WAY + ) + ) + } + } + + setTvHint(stringBuilder.toString()) + } + } + + + } + + private fun setTvHint(text: String) { + mBinding.tvHint.text = text + } + + fun getProjectId(): String { + return requireArguments().getString(BundleConstants.KEY_PROJECT_ID)!! + } + + fun getRouteId(): String { + return requireArguments().getString(BundleConstants.KEY_ROUTE_ID)!! + } + + private fun replaceFragment(fragment: AbstructSetupStationHeightTraverseFragment) { + currentFragment = fragment + + val beginTransaction = childFragmentManager.beginTransaction() + beginTransaction.replace(R.id.fl_container, fragment) + beginTransaction.commit() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/EverySetUpStationFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/EverySetUpStationFragment.kt new file mode 100644 index 0000000..994d027 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/EverySetUpStationFragment.kt @@ -0,0 +1,313 @@ +package com.bingce.controlnetwork.fragment.station.heighttraverse + +import android.os.Bundle +import android.text.TextUtils +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.WorkerThread +import androidx.room.withTransaction +import blankj.utilcode.util.ToastUtils +import com.bingce.controlapphelper.datasource.database.SurveyorDataBase +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.heighttraverse.config.model.EveryWay +import com.bingce.controlapphelper.datasource.database.point.PointRecord +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint +import com.bingce.controlapphelper.util.RegExUtil +import com.bingce.controlapphelper.util.Tools +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.databinding.FragmentHeightTraverseEverySetupStationBinding +import com.bingce.utils.DateUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +/** + * 每点设站 创建测站 + */ +class EverySetUpStationFragment : AbstructSetupStationHeightTraverseFragment() { + + private val mBinding get() = _binding!! + + private var _binding: FragmentHeightTraverseEverySetupStationBinding? = null + + private lateinit var backPoint: PointRecord + private var isFirstStation = false + + companion object { + private const val KEY_TYPE = "KEY_TYPE" + const val TYPE_ONE_WAY = 1 + const val TYPE_TWO_WAY = 2 + + @JvmStatic + fun newInstance(type: Int): EverySetUpStationFragment { + val fragment = EverySetUpStationFragment() + val bundle = Bundle() + bundle.putInt(KEY_TYPE, type) + fragment.arguments = bundle + return fragment + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = + FragmentHeightTraverseEverySetupStationBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun initView() { + mBinding.ilBackTitle.tvTitle.text = Tools.getString(R.string.back_station) + mBinding.ilFrontTitle.tvTitle.text = Tools.getString(R.string.front_station) + //说明信息 + mBinding.ilDesc.tvDesc.text = getString(R.string.staton_setup_every_height_traverse_hint) + //前视打开设置间歇点和终点 + mBinding.ilFrontTitle.llCb.visibility = View.VISIBLE + //设置不可点击 + mBinding.ilBack.etPoint.isFocusable = false + mBinding.ilBack.etHeight.isFocusable = false + mBinding.ilFront.etPoint.isFocusable = false + } + + override fun initListener() { + var isClickCheckBox = false + mBinding.ilFrontTitle.cbJianXie.setOnCheckedChangeListener { buttonView, isChecked -> + if (isClickCheckBox) return@setOnCheckedChangeListener + isClickCheckBox = true + mBinding.ilFrontTitle.cbEnd.isChecked = false + refreshFrontUi() + isClickCheckBox = false + } + mBinding.ilFrontTitle.cbEnd.setOnCheckedChangeListener { buttonView, isChecked -> + if (isClickCheckBox) return@setOnCheckedChangeListener + isClickCheckBox = true + mBinding.ilFrontTitle.cbJianXie.isChecked = false + refreshFrontUi() + isClickCheckBox = false + } + } + + override fun initData() { + launch { + backPoint = getBackPoint() + val frontPoint = getFrontPoint() + withContext(Dispatchers.Main) { + setUi(backPoint, frontPoint) + } + } + } + + private fun setUi(back: PointRecord, front: PointRecord) { + setUiBack(back) + setUiFront(front) + } + + private fun setUiBack(pointRecord: PointRecord) { + mBinding.ilBack.etPoint.setText(pointRecord.getName()) + mBinding.ilBack.etHeight.setText(doubleToString(pointRecord.getZ())) + } + + private fun setUiFront(pointRecord: PointRecord) { + mBinding.ilFront.etPoint.setText(pointRecord.getName()) + mBinding.ilFront.etHeight.setText(doubleToString(pointRecord.getZ())) + } + + + private fun refreshFrontUi() { + launch { + val frontPoint = getFrontPoint() + withContext(Dispatchers.Main) { + setUiFront(frontPoint) + } + } + } + + override suspend fun getBackPoint(): PointRecord { + val projectId = getProjectId() + val routeId = getRouteId() + + val stationLatest = + SurveyorDatabaseFactory.instance.surveyorStation.getByProjectRouteLatest( + projectId, + routeId + ) + + if (stationLatest?.items != null && stationLatest.items.size >= 2) { + val pointRecord: PointRecord = + if (!TextUtils.isEmpty(stationLatest.relationStationId)) { + //对向观测 + getNewIndexFromTwoPointId( + stationLatest.items[0].originalPointId, + stationLatest.items[1].originalPointId + ) + } else { + val pointId = stationLatest.items[1].originalPointId + SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(pointId) + } + isFirstStation = false + return pointRecord + } + + isFirstStation = true + val routeRecord = SurveyorDatabaseFactory.instance.getRouteDataSource().getById(routeId) + return SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(routeRecord?.startPointId) + } + + override suspend fun getFrontPoint(): PointRecord { + var frontIndexNew = 1 + if (!isFirstStation) { + val index = RegExUtil.getIndexFromName(backPoint.getName()) + if (index != -1) { + frontIndexNew = index + 1 + } + } + +// val projectId = getProjectId() + val routeId = getRouteId() + + val routeRecord = SurveyorDatabaseFactory.instance.getRouteDataSource().getById(routeId) + + if (mBinding.ilFrontTitle.cbEnd.isChecked) { + return SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(routeRecord?.endPointId) + } else if (mBinding.ilFrontTitle.cbJianXie.isChecked) { +// val intervalPoint = +// SurveyorDatabaseFactory.instance.pointDataSource.findByPointTypeForHeightTraverseLatest( +// projectId, PointRecord.TYPE_HEIGHT_TRAVERSE_INTERVAL +// ) +// val intervalRecord = PointRecord() +// if (intervalPoint == null) { +// intervalRecord.name = "$prefixJianXie${1}" +// } else { +// val index = RegExUtil.getIndexFromName(intervalPoint.getName()) +// intervalRecord.name = "$prefixJianXie${index + 1}" +// } +// return intervalRecord + val intervalRecord = PointRecord() + intervalRecord.name = "$prefixJianXie${frontIndexNew}" + return intervalRecord + } else { +// val transferPoint = +// SurveyorDatabaseFactory.instance.pointDataSource.findByPointTypeForHeightTraverseLatest( +// projectId, PointRecord.TYPE_HEIGHT_TRAVERSE_TRANSFER +// ) +// val transferRecord = PointRecord() +// if (transferPoint == null) { +// transferRecord.name = "$prefixTransfer${1}" +// } else { +// val index = RegExUtil.getIndexFromName(transferPoint.getName()) +// transferRecord.name = "$prefixTransfer${index + 1}" +// } +// return transferRecord + + val transferRecord = PointRecord() + transferRecord.name = "$prefixTransfer${frontIndexNew}" + return transferRecord + } + } + + override suspend fun getStationPoint(): PointRecord? { + return null + } + + + override fun doConfirm() { + val backName = mBinding.ilBack.etPoint.text.toString().trim() + val frontName = mBinding.ilFront.etPoint.text.toString().trim() + + if (TextUtils.isEmpty(backName)) { + ToastUtils.showShort("backName is empty") + return + } + if (TextUtils.isEmpty(frontName)) { + ToastUtils.showShort("frontName is empty") + return + } + + launch { + val projectId = getProjectId() + val projectRecord = + SurveyorDatabaseFactory.instance.projectDataSource.getRecord(projectId) + + val heightTraverseConfig = + SurveyorDatabaseFactory.instance.getHeightTraverseConfigDataSource() + .getRecordByProjectId(projectId) + + val isTwiceSetup = heightTraverseConfig?.everyWay == EveryWay.OPPOSITE_MEASURE + + SurveyorDataBase.getInstance().withTransaction { + val frontSetupId = saveFrontPoint(projectId, frontName) + + val relationStationId = if (isTwiceSetup) DateUtils.genRandomTimeId() else null + + saveStationRecord( + projectId, + projectRecord.getProjectType(), + backPoint.getId(), + frontSetupId, + relationStationId + ) + + if (isTwiceSetup) { + saveStationRecord( + projectId, + projectRecord.getProjectType(), + frontSetupId, + backPoint.getId(), + relationStationId + ) + } + withContext(Dispatchers.Main) { + finish() + } + } + + } + + } + + override fun isCheckedJianXiePoint(): Boolean { + return mBinding.ilFrontTitle.cbJianXie.isChecked + } + + override fun isCheckedEndPoint(): Boolean { + return mBinding.ilFrontTitle.cbEnd.isChecked + } + + override fun getFrontPointHeight(): String { + return mBinding.ilFront.etHeight.text.toString().trim() + } + + @WorkerThread + private fun saveStationRecord( + projectId: String, + projectType: String, + stationPointId: String, + surveyorPointId: String, + relationStationId: String? + ) { + val stationRecord = + createStationRecordNoSurveyorPoints(projectId, projectType, relationStationId) + stationRecord.items.add( + SurveyorPoint.newInstance( + stationPointId, + SurveyorPoint.TYPE_STATION + ) + ) + stationRecord.items.add( + SurveyorPoint.newInstance( + surveyorPointId, + SurveyorPoint.TYPE_POINT + ) + ) + SurveyorDatabaseFactory.instance.surveyorStation.saveSync(stationRecord) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/SeparatSetupStationFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/SeparatSetupStationFragment.kt new file mode 100644 index 0000000..26c0596 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/heighttraverse/SeparatSetupStationFragment.kt @@ -0,0 +1,428 @@ +package com.bingce.controlnetwork.fragment.station.heighttraverse + +import android.os.Bundle +import android.text.TextUtils +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.WorkerThread +import androidx.room.withTransaction +import blankj.utilcode.util.ToastUtils +import com.bingce.controlapphelper.datasource.database.SurveyorDataBase +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.heighttraverse.config.model.SeparateWay +import com.bingce.controlapphelper.datasource.database.point.PointRecord +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint +import com.bingce.controlapphelper.util.RegExUtil +import com.bingce.controlapphelper.util.Tools +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.databinding.FragmentHeightTraverseSeperateSetupStationBinding +import com.bingce.utils.DateUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +/** + * 隔点设站 创建测站 + */ +class SeparatSetupStationFragment : AbstructSetupStationHeightTraverseFragment() { + private val mBinding get() = _binding!! + private var _binding: FragmentHeightTraverseSeperateSetupStationBinding? = null + + private lateinit var backPoint: PointRecord + private var isFirstStation = false + + companion object { + private const val KEY_TYPE = "KEY_TYPE" + const val TYPE_ONCE = 1 + const val TYPE_TWICE = 2 + + @JvmStatic + fun newInstance(type: Int): SeparatSetupStationFragment { + val separatSetupStationFragment = SeparatSetupStationFragment() + val bundle = Bundle() + bundle.putInt(KEY_TYPE, type) + separatSetupStationFragment.arguments = bundle + return separatSetupStationFragment + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = + FragmentHeightTraverseSeperateSetupStationBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun initView() { + mBinding.ilBackTitle.tvTitle.text = Tools.getString(R.string.rearview) + mBinding.ilStationTitle.tvTitle.text = Tools.getString(R.string.measure_station) + mBinding.ilFrontTitle.tvTitle.text = Tools.getString(R.string.forward_view) + //说明信息 + mBinding.ilDesc.tvDesc.text = getString(R.string.staton_setup_separate_height_traverse_hint) + //前视打开设置间歇点和终点 + mBinding.ilFrontTitle.llCb.visibility = View.VISIBLE + //设置不可点击 + mBinding.ilBack.etPoint.isFocusable = false + mBinding.ilBack.etHeight.isFocusable = false + mBinding.ilStation.etPoint.isFocusable = false + mBinding.ilFront.etPoint.isFocusable = false + } + + override fun initListener() { + var isClickCheckBox = false + mBinding.ilFrontTitle.cbJianXie.setOnCheckedChangeListener { buttonView, isChecked -> + if (isClickCheckBox) return@setOnCheckedChangeListener + isClickCheckBox = true + mBinding.ilFrontTitle.cbEnd.isChecked = false + refreshFrontUi() + isClickCheckBox = false + } + mBinding.ilFrontTitle.cbEnd.setOnCheckedChangeListener { buttonView, isChecked -> + if (isClickCheckBox) return@setOnCheckedChangeListener + isClickCheckBox = true + mBinding.ilFrontTitle.cbJianXie.isChecked = false + refreshFrontUi() + isClickCheckBox = false + } + } + + override fun initData() { + launch { + backPoint = getBackPoint() + val frontPoint = getFrontPoint() + val stationPoint = getStationPoint() + + withContext(Dispatchers.Main) { + setUi(backPoint, stationPoint, frontPoint) + } + } + } + + private fun setUi(back: PointRecord, station: PointRecord, front: PointRecord) { + setUiBack(back) + setUiStation(station) + setUiFront(front) + } + + private fun setUiFront(pointRecord: PointRecord) { + mBinding.ilFront.etPoint.setText(pointRecord.getName()) + mBinding.ilFront.etHeight.setText(doubleToString(pointRecord.getZ())) + } + + private fun setUiBack(pointRecord: PointRecord) { + mBinding.ilBack.etPoint.setText(pointRecord.getName()) + mBinding.ilBack.etHeight.setText(doubleToString(pointRecord.getZ())) + } + + private fun setUiStation(pointRecord: PointRecord) { + mBinding.ilStation.etPoint.setText(pointRecord.getName()) + mBinding.ilStation.etHeight.setText(doubleToString(pointRecord.getZ())) + } + + + private fun refreshFrontUi() { + launch { + val frontPoint = getFrontPoint() + withContext(Dispatchers.Main) { + setUiFront(frontPoint) + } + } + } + + override fun doConfirm() { + + val backName = mBinding.ilBack.etPoint.text.toString().trim() + val stationName = mBinding.ilStation.etPoint.text.toString().trim() + val frontName = mBinding.ilFront.etPoint.text.toString().trim() + + if (TextUtils.isEmpty(backName)) { + ToastUtils.showShort("backName is empty") + return + } + if (TextUtils.isEmpty(stationName)) { + ToastUtils.showShort("stationName is empty") + return + } + if (TextUtils.isEmpty(frontName)) { + ToastUtils.showShort("frontName is empty") + return + } + + launch { + val projectId = getProjectId() + val projectRecord = + SurveyorDatabaseFactory.instance.projectDataSource.getRecord(projectId) + + val configRecord = + SurveyorDatabaseFactory.instance.getHeightTraverseConfigDataSource() + .getRecordByProjectId(getProjectId()) + + val isTwiceSetup = configRecord?.separateWay == SeparateWay.SET_UP_TWICE + + SurveyorDataBase.getInstance().withTransaction { + + val stationSetupIdList = + saveStationPoint(projectId, stationName, isTwiceSetup) + + val frontSetupId = saveFrontPoint(projectId, frontName) + + val relationStationId = if (isTwiceSetup) DateUtils.genRandomTimeId() else null + + for (stationPointId in stationSetupIdList) { + val stationRecord = + createStationRecordNoSurveyorPoints( + projectId, + projectRecord.getProjectType(), + relationStationId + ) + + stationRecord.items.add( + SurveyorPoint.newInstance( + stationPointId, + SurveyorPoint.TYPE_STATION + ) + ) + stationRecord.items.add( + SurveyorPoint.newInstance( + backPoint.getId(), + SurveyorPoint.TYPE_POINT + ) + ) + stationRecord.items.add( + SurveyorPoint.newInstance( + frontSetupId, + SurveyorPoint.TYPE_POINT + ) + ) + SurveyorDatabaseFactory.instance.surveyorStation.saveSync(stationRecord) + } + + withContext(Dispatchers.Main) { + finish() + } + } + + } + } + + override fun isCheckedJianXiePoint(): Boolean { + return mBinding.ilFrontTitle.cbJianXie.isChecked + } + + override fun isCheckedEndPoint(): Boolean { + return mBinding.ilFrontTitle.cbEnd.isChecked + } + + override fun getFrontPointHeight(): String { + return mBinding.ilFront.etHeight.text.toString().trim() + } + + override suspend fun getBackPoint(): PointRecord { + val projectId = getProjectId() + val routeId = getRouteId() + +// val stationLatest = +// SurveyorDatabaseFactory.instance.surveyorStation.getByProjectRouteLatest( +// projectId, +// routeId +// ) +// +// if (stationLatest?.items != null && stationLatest.items.size >= 3) { +// val surveyorPoint = stationLatest.items[2] +// return SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(surveyorPoint.originalPointId) +// } + + val stationList = + SurveyorDatabaseFactory.instance.surveyorStation.getByProjectRouteLastTwo( + projectId, + routeId + ) + val newestPointRecord = getNewestPointRecord(stationList, 2) + if (newestPointRecord != null) { + isFirstStation = false + return newestPointRecord + } + + isFirstStation = true + val routeRecord = SurveyorDatabaseFactory.instance.getRouteDataSource().getById(routeId) + return SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(routeRecord?.startPointId) + } + + override suspend fun getFrontPoint(): PointRecord { +// val projectId = getProjectId() + val routeId = getRouteId() + + var frontIndexNew = 1 + if (!isFirstStation) { + val index = RegExUtil.getIndexFromName(backPoint.getName()) + if (index != -1) { + frontIndexNew = index + 1 + } + } + + val routeRecord = SurveyorDatabaseFactory.instance.getRouteDataSource().getById(routeId) + + if (mBinding.ilFrontTitle.cbEnd.isChecked) { + return SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(routeRecord?.endPointId) + } else if (mBinding.ilFrontTitle.cbJianXie.isChecked) { +// val intervalPoint = +// SurveyorDatabaseFactory.instance.pointDataSource.findByPointTypeForHeightTraverseLatest( +// projectId, PointRecord.TYPE_HEIGHT_TRAVERSE_INTERVAL +// ) +// +// val intervalRecord = PointRecord() +// if (intervalPoint == null) { +// intervalRecord.name = "$prefixJianXie${1}" +// } else { +// val index = RegExUtil.getIndexFromName(intervalPoint.getName()) +// intervalRecord.name = "$prefixJianXie${index + 1}" +// } +// return intervalRecord + val intervalRecord = PointRecord() + intervalRecord.name = "$prefixJianXie${frontIndexNew}" + return intervalRecord + } else { +// val transferPoint = +// SurveyorDatabaseFactory.instance.pointDataSource.findByPointTypeForHeightTraverseLatest( +// projectId, PointRecord.TYPE_HEIGHT_TRAVERSE_TRANSFER +// ) +// +// val transferRecord = PointRecord() +// if (transferPoint == null) { +// transferRecord.name = "$prefixTransfer${1}" +// } else { +// val index = RegExUtil.getIndexFromName(transferPoint.getName()) +// transferRecord.name = "$prefixTransfer${index + 1}" +// } +// return transferRecord + val transferRecord = PointRecord() + transferRecord.name = "$prefixTransfer$frontIndexNew" + return transferRecord + } + } + + override suspend fun getStationPoint(): PointRecord { + val projectId = getProjectId() + val routeId = getRouteId() + val stationList = + SurveyorDatabaseFactory.instance.surveyorStation.getByProjectRouteLastTwo( + projectId, + routeId + ) + + var index = 1 + val newestPointRecord = getNewestPointRecord(stationList, 0) + if (newestPointRecord != null) { + val indexFromName = RegExUtil.getIndexFromName(newestPointRecord.name) + if (indexFromName != -1) { + index = indexFromName + 1 + } + } + val stationRecord = PointRecord() + stationRecord.name = "$prefixStation${index}" + return stationRecord +// val stationPoint = +// SurveyorDatabaseFactory.instance.pointDataSource.findByPointTypeForHeightTraverseLatest( +// projectId, PointRecord.TYPE_HEIGHT_TRAVERSE_STATION_TRANSFER +// ) +// val stationRecord = PointRecord() +// if (stationPoint == null) { +// stationRecord.name = "$prefixStation${1}" +// } else { +// val index = RegExUtil.getIndexFromName(stationPoint.getName()) +// stationRecord.name = "$prefixStation${index+1}" +// } +// return stationRecord + } + + + /** + * 存储测站点并返回测站id + * + * return 新建测站的ids + */ + @WorkerThread + private fun saveStationPoint( + projectId: String, + stationNameShow: String, + isTwiceSetup: Boolean + ): List { + + val stationHeight = mBinding.ilStation.etHeight.text.toString().trim() + + val index = RegExUtil.getIndexFromName(stationNameShow) + val stationIdList = mutableListOf() + + val pointTypeHeightTraverse = PointRecord.TYPE_HEIGHT_TRAVERSE_STATION_TRANSFER + + if (isTwiceSetup) { + stationIdList.add( + savePoint( + "$prefixStation${index}${Tools.getString(R.string._left)}", + pointTypeHeightTraverse, + projectId, + stationHeight + ) + ) + stationIdList.add( + savePoint( + "$prefixStation${index}${Tools.getString(R.string._right)}", + pointTypeHeightTraverse, + projectId, + stationHeight + ) + ) + } else { + stationIdList.add( + savePoint( + "$prefixStation${index}", + pointTypeHeightTraverse, + projectId, + stationHeight + ) + ) + } + + return stationIdList + } + + /** + * type 0 站点,1 后视 2 前视 + */ + @WorkerThread + private fun getNewestPointRecord( + stationList: List, + type: Int + ): PointRecord? { + var pointRecord: PointRecord? = null + for (item in stationList) { + if (item.items != null && item.items.size >= 3) { + val surveyorPoint = item.items[type] + val everyPointRecord = + SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(surveyorPoint.originalPointId) + val indexFromName = RegExUtil.getIndexFromName(everyPointRecord?.name ?: "") + if (indexFromName != -1) { + if (pointRecord == null) pointRecord = everyPointRecord + if (pointRecord != null) { + val indexLast = RegExUtil.getIndexFromName(pointRecord.name) + if (indexFromName > indexLast) { + pointRecord = everyPointRecord + } + } + } + } + } + return pointRecord + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationKnownUnknownKnownSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationKnownUnknownKnownSetupFragment.java new file mode 100644 index 0000000..2826426 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationKnownUnknownKnownSetupFragment.java @@ -0,0 +1,247 @@ +package com.bingce.controlnetwork.fragment.station.line; + +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.stationdetail.StationCreateLineKnownUnknownKnownAdapter; +import com.bingce.controlnetwork.fragment.PickPointFragment; +import com.bingce.controlnetwork.ui.widget.recyclerview.SwipeDraggableRecyclerViewUtil; +import com.bingce.utils.IOnListGetCallback; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +public abstract class AbstractLineStationKnownUnknownKnownSetupFragment extends AbstractLineStationSetupFragment + implements StationCreateLineKnownUnknownKnownAdapter.IOnSelectPointDelegate, + SwipeDraggableRecyclerViewUtil.IStationPointOperatorListener { + private static final String TYPE_KNOWN_POINT1 = "___known_points1"; + private static final String TYPE_UNKNOWN_POINT = "___unknown_points"; + private static final String TYPE_KNOWN_POINT2 = "___known_points2"; + private StationCreateLineKnownUnknownKnownAdapter stationCreateLineAttachAdapter; + private final ActivityResultLauncher activityResultLauncher = PickPointFragment.createActivityLauncher(this, (type, pickPointResult) -> { + if (pickPointResult.getSelectedIds().isEmpty() || pickPointResult.getSelectedNames().isEmpty()) { + return; + } + if (TYPE_KNOWN_POINT1.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() != pickPointResult.getSelectedIds().size() || + pickPointResult.getSelectedIds().size() != knownItemMinCount()) { + showKnownPointError(); + return; + } + stationCreateLineAttachAdapter.setKnownPoints1( + pickPointResult.getSelectedIds(), + pickPointResult.getSelectedNames()); + } else if (TYPE_UNKNOWN_POINT.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() != pickPointResult.getSelectedIds().size() || + pickPointResult.getSelectedIds().isEmpty()) { + showUnknownPointError(); + return; + } + stationCreateLineAttachAdapter.setUnknownPoints( + pickPointResult.getSelectedIds(), + pickPointResult.getSelectedNames()); + } else if (TYPE_KNOWN_POINT2.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() != pickPointResult.getSelectedIds().size() || + pickPointResult.getSelectedIds().size() != knownItemMinCount()) { + showKnownPointError(); + return; + } + stationCreateLineAttachAdapter.setKnownPoints2( + pickPointResult.getSelectedIds(), + pickPointResult.getSelectedNames()); + } + onItemChanged(); + }); + private MenuItem confirmItem; + + protected abstract int selectKnownPointTitle(); + + protected abstract int knownItemMinCount(); + + protected abstract void defaultItems(IOnListGetCallback callback); + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + if (view == null) { + return null; + } + RecyclerView recyclerView = view.findViewById(R.id.recycler_view); + if (recyclerView != null) { + defaultItems(instance -> runOnUI(() -> { + stationCreateLineAttachAdapter = new StationCreateLineKnownUnknownKnownAdapter( + AbstractLineStationKnownUnknownKnownSetupFragment.this, instance); + recyclerView.setAdapter(stationCreateLineAttachAdapter); + SwipeDraggableRecyclerViewUtil.setup(stationCreateLineAttachAdapter, + recyclerView, + getChildFragmentManager(), + getViewLifecycleOwner(), + AbstractLineStationKnownUnknownKnownSetupFragment.this, + getContext()); + })); + } + setHasOptionsMenu(true); + return view; + } + + @Override + public void onSelectKnownPoint1(PickPointResult pickPointResult, ArrayList filters) { + if (getArguments() == null || getContext() == null) { + return; + } + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + PickPointFragment.pickPoint( + getContext(), + TYPE_KNOWN_POINT1, + knownItemMinCount(), + getString(R.string.title_pick_known_point), + filters, + projectId, pickPointResult, activityResultLauncher); + } + + @Override + public void onSelectUnknownPoint(PickPointResult pickPointResult, ArrayList filters) { + if (getArguments() == null || getContext() == null) { + return; + } + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + PickPointFragment.pickPoint( + getContext(), + TYPE_UNKNOWN_POINT, + -1, + getString(R.string.title_pick_unknown_point), + filters, + projectId, pickPointResult, activityResultLauncher); + } + + @Override + public void onSelectKnownPoint2(PickPointResult pickPointResult, ArrayList filters) { + if (getArguments() == null || getContext() == null) { + return; + } + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + PickPointFragment.pickPoint( + getContext(), + TYPE_KNOWN_POINT2, + knownItemMinCount(), + getString(R.string.title_pick_known_point), + filters, + projectId, pickPointResult, activityResultLauncher); + } + + @Override + public void onItemRemoved(int adapterPosition) { + onItemChanged(); + } + + @Override + public void onItemDragCompleted() { + onItemChanged(); + } + + /** + * 测站数据发生了变化--测点被删除、测点被修改、测站被修改、测点被拖拽 + */ + protected void onItemChanged() { + //检测数据是否合法 + List knownItems1 = stationCreateLineAttachAdapter.knownItems1(); + List unknownItems = stationCreateLineAttachAdapter.unknownItems(); + List knownItems2 = stationCreateLineAttachAdapter.knownItems2(); + if (confirmItem != null) { + confirmItem.setEnabled(!(knownItems1.size() < knownItemMinCount() || + unknownItems.isEmpty() || + knownItems2.size() < knownItemMinCount())); + } + } + + private void showUnknownPointError() { + ToastUtils.showShort(R.string.tips_unknown_point_must_not_empty); + } + + protected abstract int knownPointCountError(); + + private void showKnownPointError() { + ToastUtils.showShort(knownPointCountError()); + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + inflater.inflate(R.menu.menu_confirm, menu); + confirmItem = menu.findItem(R.id.menu_confirm); + if (confirmItem != null) { + confirmItem.setEnabled(false); + } + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(@NonNull @NotNull MenuItem item) { + if (R.id.menu_confirm == item.getItemId()) { + if (getArguments() == null) { + return super.onOptionsItemSelected(item); + } + requestLineName(string -> { + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + String periodId = getArguments().getString(BundleConstants.KEY_PERIOD_ID); + if (getCurrentBatch() != null) { + projectId = getCurrentBatch().projectId; + periodId = getCurrentBatch().cycleId; + } + //1.收集所有点信息 + List knownItems1 = stationCreateLineAttachAdapter.knownItems1(); + List unknownItems = stationCreateLineAttachAdapter.unknownItems(); + List knownItems2 = stationCreateLineAttachAdapter.knownItems2(); + //2.建站 + setup(projectId, periodId, string, knownItems1, unknownItems, knownItems2, () -> { + if (getActivity() != null) { + getActivity().finish(); + } + }); + }); + } + return super.onOptionsItemSelected(item); + } + + @Override + public boolean cancelBack() { + List knownItems1 = stationCreateLineAttachAdapter.knownItems1(); + List unknownItems = stationCreateLineAttachAdapter.unknownItems(); + List knownItems2 = stationCreateLineAttachAdapter.knownItems2(); + if (isListEmpty(knownItems1) || + isListEmpty(unknownItems) || + isListEmpty(knownItems2)) { + return warningDataLosing(this); + } + return false; + } + + protected abstract void setup(String projectId, String periodId, + String lineName, + List knownItems1, + List unknownItems, + List knownItems2, + Runnable callback); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationKnownUnknownSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationKnownUnknownSetupFragment.java new file mode 100644 index 0000000..2543acb --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationKnownUnknownSetupFragment.java @@ -0,0 +1,249 @@ +package com.bingce.controlnetwork.fragment.station.line; + +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.stationdetail.StationCreateLineSingleAdapter; +import com.bingce.controlnetwork.fragment.PickPointFragment; +import com.bingce.controlnetwork.ui.widget.recyclerview.SwipeDraggableRecyclerViewUtil; +import com.bingce.utils.IOnListGetCallback; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +public abstract class AbstractLineStationKnownUnknownSetupFragment extends AbstractLineStationSetupFragment + implements StationCreateLineSingleAdapter.IOnSelectPointDelegate, + SwipeDraggableRecyclerViewUtil.IStationPointOperatorListener { + private static final String TYPE_KNOWN_POINT = "___known_points"; + private static final String TYPE_UNKNOWN_POINT = "___unknown_points"; + private StationCreateLineSingleAdapter stationCreateLineSingleAdapter; + private final ActivityResultLauncher activityResultLauncher = PickPointFragment.createActivityLauncher(this, (type, pickPointResult) -> { + if (pickPointResult.getSelectedIds().isEmpty() || pickPointResult.getSelectedNames().isEmpty()) { + return; + } + if (TYPE_KNOWN_POINT.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() != pickPointResult.getSelectedIds().size() || + pickPointResult.getSelectedIds().size() < knownItemMinCount()) { + showKnownPointError(); + return; + } + stationCreateLineSingleAdapter.setKnownPoints( + pickPointResult.getSelectedIds(), + pickPointResult.getSelectedNames()); + } else if (TYPE_UNKNOWN_POINT.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() != pickPointResult.getSelectedIds().size() || + pickPointResult.getSelectedIds().size() < unknownItemMinCount()) { + showUnknownPointError(); + return; + } + stationCreateLineSingleAdapter.setUnknownPoints( + pickPointResult.getSelectedIds(), + pickPointResult.getSelectedNames()); + } + onItemChanged(); + }); + private MenuItem confirmItem; + + protected abstract int knownItemMinCount(); + + protected abstract int knownGroupTitle(); + + protected abstract int knownPointCountError(); + + protected abstract int unknownItemMinCount(); + + protected abstract int unknownGroupTitle(); + + protected abstract int unknownPointCountError(); + + protected abstract void defaultItems(IOnListGetCallback callback); + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + if (view == null) { + return null; + } + RecyclerView recyclerView = view.findViewById(R.id.recycler_view); + if (recyclerView != null) { + defaultItems(instance -> runOnUI(() -> { + stationCreateLineSingleAdapter = new StationCreateLineSingleAdapter( + AbstractLineStationKnownUnknownSetupFragment.this, instance); + recyclerView.setAdapter(stationCreateLineSingleAdapter); + SwipeDraggableRecyclerViewUtil.setup(stationCreateLineSingleAdapter, + recyclerView, + getChildFragmentManager(), + getViewLifecycleOwner(), + AbstractLineStationKnownUnknownSetupFragment.this, + getContext()); + })); + } + setHasOptionsMenu(true); + return view; + } + + @Override + public void onSelectKnownPoint(PickPointResult pickPointResult, ArrayList filters) { + if (getArguments() == null || getContext() == null) { + return; + } + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + PickPointFragment.pickPoint( + getContext(), + TYPE_KNOWN_POINT, + knownItemMinCount(), + getString(R.string.title_pick_known_point), + filters, + projectId, pickPointResult, activityResultLauncher); + } + + @Override + public void onSelectUnknownPoint(PickPointResult pickPointResult, ArrayList filters) { + if (getArguments() == null || getContext() == null) { + return; + } + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + PickPointFragment.pickPoint( + getContext(), + TYPE_UNKNOWN_POINT, + -1, + getString(R.string.title_pick_unknown_point), + filters, + projectId, pickPointResult, activityResultLauncher); + } + + @Override + public void onItemRemoved(int adapterPosition) { + onItemChanged(); + } + + @Override + public void onItemDragCompleted() { + onItemChanged(); + } + + /** + * 测站数据发生了变化--测点被删除、测点被修改、测站被修改、测点被拖拽 + */ + protected void onItemChanged() { + //检测数据是否合法 + List knownItems = knownItems(); + List unknownItems = unknownItems(); + if (confirmItem != null) { + confirmItem.setEnabled(!(knownItems.size() < knownItemMinCount() || unknownItems.isEmpty())); + } + } + + private void showUnknownPointError() { + ToastUtils.showShort(unknownPointCountError()); + } + + private void showKnownPointError() { + ToastUtils.showShort(knownPointCountError()); + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + inflater.inflate(R.menu.menu_confirm, menu); + confirmItem = menu.findItem(R.id.menu_confirm); + if (confirmItem != null) { + confirmItem.setEnabled(false); + } + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(@NonNull @NotNull MenuItem item) { + if (R.id.menu_confirm == item.getItemId()) { + if (getArguments() == null) { + return super.onOptionsItemSelected(item); + } + //1.收集所有点信息 + List knownItems = knownItems(); + List unknownItems = unknownItems(); + //2.循环创建测站 + if (knownItems.size() != knownItemMinCount()) { + //当已知点不满足最少点的个数时提示 + showKnownPointError(); + return super.onOptionsItemSelected(item); + } + if (unknownItems.size() < unknownItemMinCount()) { + //当未知点不满足最少点的个数时提示 + showUnknownPointError(); + return super.onOptionsItemSelected(item); + } + //设置导线的名称(弹框设置名称) + requestLineName(lineName -> { + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + String periodId = getArguments().getString(BundleConstants.KEY_PERIOD_ID); + if (getCurrentBatch() != null) { + projectId = getCurrentBatch().projectId; + periodId = getCurrentBatch().cycleId; + } + setup(projectId, periodId, lineName, knownItems, unknownItems, () -> { + if (getActivity() != null) { + getActivity().finish(); + } + }); + }); + } + return super.onOptionsItemSelected(item); + } + + @Override + public boolean cancelBack() { + List knownItems = knownItems(); + List unknownItems = unknownItems(); + if (isListEmpty(knownItems) || + isListEmpty(unknownItems)) { + return warningDataLosing(this); + } + return false; + } + + /** + * 设置导线 + * + * @param projectId + * @param periodId + * @param lineName + * @param knownItems + * @param unknownItems + * @param runnable + */ + protected abstract void setup(String projectId, String periodId, + String lineName, + List knownItems, + List unknownItems, + Runnable runnable); + + protected List knownItems() { + return stationCreateLineSingleAdapter.knownItems(); + } + + protected List unknownItems() { + return stationCreateLineSingleAdapter.unknownItems(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationSetupFragment.java new file mode 100644 index 0000000..f5e63a0 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationSetupFragment.java @@ -0,0 +1,114 @@ +package com.bingce.controlnetwork.fragment.station.line; + +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.SwitchCompat; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.StringInputFragment; +import com.bingce.controlnetwork.fragment.station.AbstractStationFragment; +import com.bingce.controlnetwork.util.SurveyorStationUtil; +import com.bingce.utils.IOnListGetCallback; +import com.bingce.utils.ThreadPoolUtil; + +import org.jetbrains.annotations.NotNull; + +public abstract class AbstractLineStationSetupFragment extends AbstractStationFragment { + private LineRecord currentBatch; + private ProjectRecord projectRecord; + + @Override + protected int layoutRes() { + return R.layout.fragment_line_surveyor_station_setup_layout; + } + + @Override + protected String duplicateStationError(String duplicateStationName) { + return Tools.getString(R.string.station_already_exist_same_name, duplicateStationName); + } + + @Override + public void onViewCreated(@NonNull @NotNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + //显示左右角开关 +// SwitchCompat switchCompat = view.findViewById(R.id.left_right_switch); +// if (switchCompat != null) { +// switchCompat.setEnabled(true); +// } + setLeftRightEnable(initLeftRightMeasure()); + //读取projectRecord + ThreadPoolUtil.execute(() -> { + if (getArguments() == null) { + return; + } + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + projectRecord = + SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getRecord(projectId); + }); + } + + private void setLeftRightEnable(boolean isEnable) { + //显示左右角开关 + View view = getView(); + if (view != null) { + SwitchCompat switchCompat = view.findViewById(R.id.left_right_switch); + if (switchCompat != null) { + switchCompat.setEnabled(isEnable); + } + } + } + + + protected String projectId() { + return projectRecord == null ? null : projectRecord.getId(); + } + + protected ProjectRecord currentProject() { + return projectRecord; + } + + protected void loadBatchRecord(String batchId, IOnListGetCallback callback) { + SurveyorStationUtil.getBatchItemList(batchId, lineRecord -> { + if (lineRecord == null) { + return; + } + callback.onGet(lineRecord.items); + currentBatch = lineRecord; + }); + } + + private String lineName() { + if (currentBatch != null) { + return currentBatch.name; + } + return defaultLineName(); + } + + protected LineRecord getCurrentBatch() { + return currentBatch; + } + + protected abstract boolean initLeftRightMeasure(); + + protected abstract String defaultLineName(); + + final protected void requestLineName(StringInputFragment.IInputCallback callback) { + StringInputFragment.input(getChildFragmentManager(), + getString(R.string.tips_please_input_line_name), + lineName(), + getViewLifecycleOwner(), + callback); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellDoubleGroundSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellDoubleGroundSetupFragment.java new file mode 100644 index 0000000..9c6f0dd --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellDoubleGroundSetupFragment.java @@ -0,0 +1,333 @@ +package com.bingce.controlnetwork.fragment.station.line; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.stationdetail.StationCreateLineWellDoubleGroundAdapter; +import com.bingce.controlnetwork.fragment.PickPointFragment; +import com.bingce.controlnetwork.ui.widget.recyclerview.SwipeDraggableRecyclerViewUtil; +import com.bingce.controlnetwork.util.SurveyorStationUtil; +import com.bingce.utils.IOnListGetCallback; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +/** + * 二井定向地上父类 + */ +public abstract class AbstractLineStationWellDoubleGroundSetupFragment extends AbstractLineStationSetupFragment + implements StationCreateLineWellDoubleGroundAdapter.IOnSelectPointDelegate, + SwipeDraggableRecyclerViewUtil.IStationPointOperatorListener { + + public static final String LINE_NAME = Tools.getString(R.string.erjing_directional_above_ground); + + private MenuItem confirmItem; + //选择到的点 + private List groundLinkLeftDataList; + private List groundLinkMiddleDataList; + private List groundLinkRightDataList; + private List groundSideADataList; + private List groundSideBDataList; + + private StationCreateLineWellDoubleGroundAdapter mAdapter; + + private final Handler handler = new Handler(Looper.getMainLooper()); + + private final ActivityResultLauncher activityResultLauncher = PickPointFragment.createActivityLauncher(this, (type, pickPointResult) -> { + if (pickPointResult.getSelectedIds().isEmpty() || pickPointResult.getSelectedNames().isEmpty()) { + return; + } + if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < groundLinkLeftMinCount()) { + showErrorMsg(Tools.getString(R.string.well_a_ground_connection_hint)); + return; + } + mAdapter.setGroundLinkLeftPoints(pickPointResult); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < groundSideAMinCount()) { + showErrorMsg(Tools.getString(R.string.well_a_surface_near_well_hint)); + return; + } + mAdapter.setGroundSideAPoints(pickPointResult); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < groundSideBMinCount()) { + showErrorMsg(Tools.getString(R.string.well_b_surface_near_well_hint)); + return; + } + mAdapter.setGroundSideBPoints(pickPointResult); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT.equals(type)) { + if (pickPointResult.getSelectedIds().size() < groundLinkRightMinCount()) { + showErrorMsg(Tools.getString(R.string.well_b_ground_connection_hint)); + return; + } + mAdapter.setGroundLinkRightPoints(pickPointResult); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE.equals(type)) { + mAdapter.setGroundLinkMiddlePoints(pickPointResult); + } + onItemChanged(); + }); + + protected abstract int groundLinkLeftMinCount(); + + protected abstract int groundSideAMinCount(); + + protected abstract int groundLinkMiddleMinCount(); + + protected abstract int groundSideBMinCount(); + + protected abstract int groundLinkRightMinCount(); + + protected abstract void defaultItems(IOnListGetCallback callback); + + protected List getAdapterDataList() { + List items = null; + if (mAdapter != null) { + items = mAdapter.getItems(); + } + return items; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + if (view == null) { + return null; + } + RecyclerView recyclerView = view.findViewById(R.id.recycler_view); + if (recyclerView != null) { + defaultItems(stationDetailItemList -> runOnUI(() -> { + mAdapter = new StationCreateLineWellDoubleGroundAdapter( + AbstractLineStationWellDoubleGroundSetupFragment.this, stationDetailItemList); + + recyclerView.setAdapter(mAdapter); + SwipeDraggableRecyclerViewUtil.setup(mAdapter, + recyclerView, + getChildFragmentManager(), + getViewLifecycleOwner(), + AbstractLineStationWellDoubleGroundSetupFragment.this, + getContext()); + + refreshFiveDataList(); + + })); + } + setHasOptionsMenu(true); + return view; + } + + @Override + public void onViewCreated(@NonNull @NotNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); +// initAutoCloseView(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (handler != null) + handler.removeCallbacksAndMessages(null); + } + + protected void goSelectPoint(String type, int maxCount, String title, List filters, PickPointResult pickPointResult) { + if (getArguments() == null || getContext() == null) { + return; + } + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + PickPointFragment.pickPoint( + getContext(), + type, + maxCount, + title, + filters, + projectId, pickPointResult, activityResultLauncher); + } + + @Override + public void onSelectGroundLinkLeft(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT, + groundLinkLeftMinCount() + 1, Tools.getString(R.string.well_a_ground_connection_direction_point), + filters, pickPointResult); + } + + @Override + public void onSelectGroundLinkRight(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT, + groundLinkRightMinCount() + 1, Tools.getString(R.string.well_b_ground_connection_direction_point), + filters, pickPointResult); + } + + @Override + public void onSelectGroundLinkMiddle(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE, + Integer.MAX_VALUE, Tools.getString(R.string.ground_connection_point), filters, pickPointResult); + } + + @Override + public void onSelectGroundSideA(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A, + 1, Tools.getString(R.string.well_a_surface_near_well_point), filters, pickPointResult); + } + + @Override + public void onSelectGroundSideB(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B, + 1, Tools.getString(R.string.well_b_surface_near_well_point), filters, pickPointResult); + } + + @Override + public void onSelectOnlyMeasureHorAngle(boolean measureHorAngle) { + LineRecord currentBatch = getCurrentBatch(); + SurveyorStationUtil.updateLineRecord(currentBatch); + SurveyorStationUtil.updateStationPointsMeasureHorAag(currentBatch); + } + + @Override + public void onItemRemoved(int adapterPosition) { + mAdapter.removeItemForLastSelect(adapterPosition); + onItemChanged(); + } + + @Override + public void onItemDragCompleted() { + onItemChanged(); + } + + /** + * 测站数据发生了变化--测点被删除、测点被修改、测站被修改、测点被拖拽 + */ + private void onItemChanged() { + handler.postDelayed(() -> { + refreshFiveDataList(); + //检测数据是否合法 + if (confirmItem != null) { + confirmItem.setEnabled(!(groundLinkLeftDataList.size() < groundLinkLeftMinCount() || + groundLinkMiddleDataList.size() < groundLinkMiddleMinCount() || + groundLinkRightDataList.size() < groundLinkRightMinCount() || + groundSideADataList.size() < groundSideAMinCount() || + groundSideBDataList.size() < groundSideBMinCount() + )); + } + }, 80); + } + + private void refreshFiveDataList() { + groundLinkLeftDataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT + StationDetailItem._DATA); + groundLinkMiddleDataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE + StationDetailItem._DATA); + groundLinkRightDataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT + StationDetailItem._DATA); + groundSideADataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A + StationDetailItem._DATA); + groundSideBDataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B + StationDetailItem._DATA); + } + + protected void showErrorMsgForWell(String type) { + switch (type) { + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT: + showErrorMsg(Tools.getString(R.string.well_a_ground_connection_hint)); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE: + //中间点是可选 + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT: + showErrorMsg(Tools.getString(R.string.well_b_ground_connection_hint)); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A: + showErrorMsg(Tools.getString(R.string.well_a_surface_near_well_hint)); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B: + showErrorMsg(Tools.getString(R.string.well_b_surface_near_well_hint)); + break; + default: + break; + } + } + + private void showErrorMsg(String msg) { + ToastUtils.showShort(msg); + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + inflater.inflate(R.menu.menu_confirm, menu); + confirmItem = menu.findItem(R.id.menu_confirm); + if (confirmItem != null) { + confirmItem.setEnabled(false); + } + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(@NonNull @NotNull MenuItem item) { + // TODO: 2022/6/15 + if (R.id.menu_confirm == item.getItemId()) { + if (getArguments() == null) { + return super.onOptionsItemSelected(item); + } +// //设置导线的弹框 +// requestLineName(string -> { +// //建站 +// }); + + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + String periodId = getArguments().getString(BundleConstants.KEY_PERIOD_ID); + if (getCurrentBatch() != null) { + projectId = getCurrentBatch().projectId; + periodId = getCurrentBatch().cycleId; + } + setup(projectId, periodId, LINE_NAME, groundLinkLeftDataList, groundLinkMiddleDataList, groundLinkRightDataList, groundSideBDataList, groundSideADataList, () -> { + if (getActivity() != null) { + getActivity().finish(); + } + }); + } + return super.onOptionsItemSelected(item); + } + + @Override + public boolean cancelBack() { + // TODO: 2022/6/15 +// List knownItems1 = mAdapter.getGroundLinkPoints(); +// List unknownItems = mAdapter.unknownItems(); +// List knownItems2 = mAdapter.knownItems2(); +// if (isListEmpty(knownItems1) || +// isListEmpty(unknownItems) || +// isListEmpty(knownItems2)) { +// return warningDataLosing(this); +// } + return false; + } + + protected abstract void setup(String projectId, String periodId, + String lineName, + List groundLinkLeftDataList, + List groundLinkMiddleDataList, + List groundLinkRightDataList, + List groundSideBDataList, + List groundSideADataList, + Runnable callback); + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellDoubleUnderGroundSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellDoubleUnderGroundSetupFragment.java new file mode 100644 index 0000000..cf33e4c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellDoubleUnderGroundSetupFragment.java @@ -0,0 +1,422 @@ +package com.bingce.controlnetwork.fragment.station.line; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.RegExUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.stationdetail.StationCreateLineWellDoubleUnderGroundAdapter; +import com.bingce.controlnetwork.fragment.PickPointFragment; +import com.bingce.controlnetwork.ui.widget.recyclerview.SwipeDraggableRecyclerViewUtil; +import com.bingce.controlnetwork.util.SurveyorStationUtil; +import com.bingce.utils.IOnListGetCallback; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +/** + * 一井定向的父类 + */ +public abstract class AbstractLineStationWellDoubleUnderGroundSetupFragment extends AbstractLineStationSetupFragment + implements StationCreateLineWellDoubleUnderGroundAdapter.IOnSelectPointDelegate, + SwipeDraggableRecyclerViewUtil.IStationPointOperatorListener { + + public static final String LINE_NAME = Tools.getString(R.string.second_well_directional_underground); + + private final Handler handler = new Handler(Looper.getMainLooper()); + + private MenuItem confirmItem; + //选择到的点 + private List groundLinkLeftDataList; + private List groundSideADataList; + private List steelADataList; + private List underGroundLinkDataList; + private List steeBDataList; + private List groundSideBDataList; + private List groundLinkRightDataList; + + private StationCreateLineWellDoubleUnderGroundAdapter mAdapter; + + private final ActivityResultLauncher activityResultLauncher = PickPointFragment.createActivityLauncher(this, (type, pickPointResult) -> { + if (pickPointResult.getSelectedIds().isEmpty() || pickPointResult.getSelectedNames().isEmpty()) { + return; + } + if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < groundLinkLeftMinCount()) { + showErrorMsg(Tools.getString(R.string.well_a_ground_connection_hint)); + return; + } + mAdapter.setGroundLinkLeftPoints(pickPointResult); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < groundSideAMinCount()) { + showErrorMsg(Tools.getString(R.string.well_a_surface_near_well_hint)); + return; + } + mAdapter.setGroundSideAPoints(pickPointResult); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < groundSideBMinCount()) { + showErrorMsg(Tools.getString(R.string.well_b_surface_near_well_hint)); + return; + } + mAdapter.setGroundSideBPoints(pickPointResult); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT.equals(type)) { + if (pickPointResult.getSelectedIds().size() < groundLinkRightMinCount()) { + showErrorMsg(Tools.getString(R.string.well_b_ground_connection_hint)); + return; + } + mAdapter.setGroundLinkRightPoints(pickPointResult); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < groundSideAMinCount()) { + showErrorMsg(Tools.getString(R.string.please_select_well_a_wire)); + return; + } + mAdapter.setSteelAPoints(pickPointResult); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < groundSideBMinCount()) { + showErrorMsg(Tools.getString(R.string.please_select_well_b_wire)); + return; + } + mAdapter.setSteelBPoints(pickPointResult); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < underGroundLinkMinCount()) { + showErrorMsg(Tools.getString(R.string.underground_connection_point_min_hint)); + return; + } + mAdapter.setUnderGroundLinkPoints(pickPointResult); + } + onItemChanged(); + }); + + protected abstract int groundLinkLeftMinCount(); + + protected abstract int groundSideAMinCount(); + + protected abstract int steelAMinCount(); + + protected abstract int underGroundLinkMinCount(); + + protected abstract int steelBMinCount(); + + protected abstract int groundSideBMinCount(); + + protected abstract int groundLinkRightMinCount(); + + protected abstract void defaultItems(IOnListGetCallback callback); + + protected List getAdapterDataList() { + List items = null; + if (mAdapter != null) { + items = mAdapter.getItems(); + } + return items; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + if (view == null) { + return null; + } + RecyclerView recyclerView = view.findViewById(R.id.recycler_view); + if (recyclerView != null) { + defaultItems(stationDetailItemList -> runOnUI(() -> { + mAdapter = new StationCreateLineWellDoubleUnderGroundAdapter( + AbstractLineStationWellDoubleUnderGroundSetupFragment.this, stationDetailItemList); + + recyclerView.setAdapter(mAdapter); + SwipeDraggableRecyclerViewUtil.setup(mAdapter, + recyclerView, + getChildFragmentManager(), + getViewLifecycleOwner(), + AbstractLineStationWellDoubleUnderGroundSetupFragment.this, + getContext()); + + refreshFiveDataList(); + + })); + } + setHasOptionsMenu(true); + return view; + } + + @Override + public void onViewCreated(@NonNull @NotNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); +// initAutoCloseView(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (handler != null) + handler.removeCallbacksAndMessages(null); + } + + protected void goSelectPoint(String type, int maxCount, String title, List filters, PickPointResult pickPointResult) { + if (getArguments() == null || getContext() == null) { + return; + } + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + PickPointFragment.pickPoint( + getContext(), + type, + maxCount, + title, + filters, + projectId, pickPointResult, activityResultLauncher); + } + + @Override + public void onSelectGroundLinkLeft(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT, + groundLinkLeftMinCount() + 1, Tools.getString(R.string.well_a_surface_connection_point), + filters, pickPointResult); + } + + @Override + public void onSelectGroundLinkRight(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT, + groundLinkRightMinCount() + 1, Tools.getString(R.string.well_b_surface_connection_point), + filters, pickPointResult); + } + + @Override + public void onSelectGroundSideA(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A, + 1, Tools.getString(R.string.well_a_surface_near_well_point), filters, pickPointResult); + } + + @Override + public void onSelectGroundSideB(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B, + 1, Tools.getString(R.string.well_b_surface_near_well_point), filters, pickPointResult); + } + + @Override + public void onSelectSteelA(PickPointResult pickPointResult, List filters) { +// goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A, +// steelAMinCount() + 1, "A井钢丝", filters, pickPointResult); + addSteelOnCurrentPage(StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A, steelAMinCount() + 1); + } + + @Override + public void onSelectSteelB(PickPointResult pickPointResult, List filters) { +// goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B, +// steelBMinCount() + 1, "B井钢丝", filters, pickPointResult); + addSteelOnCurrentPage(StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B, steelBMinCount() + 1); + } + + @Override + public void onSelectUnderGroundLink(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK, + Integer.MAX_VALUE, Tools.getString(R.string.underground_connection_point), filters, pickPointResult); + } + + @Override + public void onSelectOnlyMeasureHorAngle(boolean measureHorAngle) { + LineRecord currentBatch = getCurrentBatch(); + SurveyorStationUtil.updateLineRecord(currentBatch); + SurveyorStationUtil.updateStationPointsMeasureHorAag(currentBatch); + } + + + private void addSteelOnCurrentPage(String groupType, int steelMaxCount) { + List pointsFromType = mAdapter.getPointsFromType(groupType + StationDetailItem._DATA); + PickPointResult lastSteelPickPoint = PickPointResult.create(); + int newName = 1; + if (pointsFromType != null && !pointsFromType.isEmpty()) { + PickPointResult.initPicPointResultData(lastSteelPickPoint, pointsFromType); + //获取新的钢丝的索引 + StationDetailItem stationDetailItem = pointsFromType.get(pointsFromType.size() - 1); + String num = RegExUtil.findNum(stationDetailItem.getName()); + assert num != null; + newName = Integer.parseInt(num) + 1; + } + if (lastSteelPickPoint.getSelectedIds().size() >= steelMaxCount) { + ToastUtils.showShort(R.string.steel_max_hint, steelMaxCount); + return; + } + if (StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A.equals(groupType)) { + PickPointResult.createPointResultNewData(lastSteelPickPoint, Tools.getString(R.string.wire_a) + newName); + mAdapter.setSteelAPoints(lastSteelPickPoint); + } else if (StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B.equals(groupType)) { + PickPointResult.createPointResultNewData(lastSteelPickPoint, Tools.getString(R.string.wire_b) + newName); + mAdapter.setSteelBPoints(lastSteelPickPoint); + } + onItemChanged(); + } + + + @Override + public void onItemRemoved(int adapterPosition) { + mAdapter.removeItemForLastSelect(adapterPosition); + onItemChanged(); + } + + @Override + public void onItemDragCompleted() { + onItemChanged(); + } + + /** + * 测站数据发生了变化--测点被删除、测点被修改、测站被修改、测点被拖拽 + */ + private void onItemChanged() { + handler.postDelayed(() -> { + refreshFiveDataList(); + //检测数据是否合法 + if (confirmItem != null) { + confirmItem.setEnabled(!(groundLinkLeftDataList.size() < groundLinkLeftMinCount() || + groundSideADataList.size() < groundSideAMinCount() || + steelADataList.size() < steelAMinCount() || + underGroundLinkDataList.size() < underGroundLinkMinCount() || + steeBDataList.size() < steelBMinCount() || + groundSideBDataList.size() < groundSideBMinCount() || + groundLinkRightDataList.size() < groundLinkRightMinCount() + )); + } + }, 80); + } + + private void refreshFiveDataList() { + String _data = StationDetailItem._DATA; + groundLinkLeftDataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT + _data); + groundSideADataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A + _data); + steelADataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A + _data); + underGroundLinkDataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK + _data); + steeBDataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B + _data); + groundSideBDataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B + _data); + groundLinkRightDataList = mAdapter.getPointsFromType(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT + _data); + } + + protected void showErrorMsgForWell(String type) { + switch (type) { + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT: + showErrorMsg(Tools.getString(R.string.well_a_ground_connection_hint)); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT: + showErrorMsg(Tools.getString(R.string.well_b_ground_connection_hint)); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A: + showErrorMsg(Tools.getString(R.string.well_a_surface_near_well_hint)); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B: + showErrorMsg(Tools.getString(R.string.well_b_surface_near_well_hint)); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A: + showErrorMsg(Tools.getString(R.string.please_select_well_a_wire)); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B: + showErrorMsg(Tools.getString(R.string.please_select_well_b_wire)); + break; + case StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK: + showErrorMsg(Tools.getString(R.string.please_select_an_underground_connection_point)); + break; + default: + break; + } + } + + private void showErrorMsg(String msg) { + ToastUtils.showShort(msg); + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + inflater.inflate(R.menu.menu_confirm, menu); + confirmItem = menu.findItem(R.id.menu_confirm); + if (confirmItem != null) { + confirmItem.setEnabled(false); + } + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(@NonNull @NotNull MenuItem item) { + // TODO: 2022/6/15 + if (R.id.menu_confirm == item.getItemId()) { + if (getArguments() == null) { + return super.onOptionsItemSelected(item); + } +// //设置导线的弹框 +// requestLineName(string -> { +// //建站 +// }); + + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + String periodId = getArguments().getString(BundleConstants.KEY_PERIOD_ID); + if (getCurrentBatch() != null) { + projectId = getCurrentBatch().projectId; + periodId = getCurrentBatch().cycleId; + } + + setup(projectId, periodId, LINE_NAME, + groundLinkLeftDataList, + groundSideADataList, + steelADataList, + underGroundLinkDataList, + steeBDataList, + groundSideBDataList, + groundLinkRightDataList, () -> { + if (getActivity() != null) { + getActivity().finish(); + } + }); + } + return super.onOptionsItemSelected(item); + } + + @Override + public boolean cancelBack() { + // TODO: 2022/6/15 +// List knownItems1 = mAdapter.getGroundLinkPoints(); +// List unknownItems = mAdapter.unknownItems(); +// List knownItems2 = mAdapter.knownItems2(); +// if (isListEmpty(knownItems1) || +// isListEmpty(unknownItems) || +// isListEmpty(knownItems2)) { +// return warningDataLosing(this); +// } + return false; + } + + protected abstract void setup(String projectId, String periodId, + String lineName, + List groundLinkLeftDataList, + List groundSideADataList, + List steelADataList, + List underGroundLinkDataList, + List steeBDataList, + List groundSideBDataList, + List groundLinkRightDataList, + Runnable callback); + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellSetupFragment.java new file mode 100644 index 0000000..4d98d41 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/AbstractLineStationWellSetupFragment.java @@ -0,0 +1,421 @@ +package com.bingce.controlnetwork.fragment.station.line; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationConstants; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.PickPointResult; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.RegExUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.stationdetail.StationCreateLineWellAdapter; +import com.bingce.controlnetwork.fragment.PickPointFragment; +import com.bingce.controlnetwork.ui.widget.recyclerview.SwipeDraggableRecyclerViewUtil; +import com.bingce.utils.IOnListGetCallback; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +/** + * 一井定向的父类 + */ +public abstract class AbstractLineStationWellSetupFragment extends AbstractLineStationSetupFragment + implements StationCreateLineWellAdapter.IOnSelectPointDelegate, + SwipeDraggableRecyclerViewUtil.IStationPointOperatorListener { + + public static final String LINE_NAME = Tools.getString(R.string.one_well_orientation); + + private MenuItem confirmItem; + //选择到的点 + private List groundLinkDataList; + private List groundSideDataList; + private List steelWireDataList; + private List ungroundSideDataList; + private List ungroundLinkDataList; + + private StationCreateLineWellAdapter mAdapter; + + + private final Handler handler = new Handler(); + + private final ActivityResultLauncher activityResultLauncher = PickPointFragment.createActivityLauncher(this, (type, pickPointResult) -> { + if (pickPointResult.getSelectedIds().isEmpty() || pickPointResult.getSelectedNames().isEmpty()) { + return; + } + if (StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < groundLinkMinCount()) { + showErrorMsg(Tools.getString(R.string.underground_connection_min_hint)); + return; + } + mAdapter.setGroundLinkPoints(pickPointResult); + } else if (StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < groundSideMinCount()) { + showErrorMsg(Tools.getString(R.string.please_select_the_surface_near_well_point)); + return; + } + mAdapter.setGroundSidePoints(pickPointResult); + } else if (StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE.equals(type)) { + //检测数据是否正常 + if (pickPointResult.getSelectedIds().size() < steelWireMinCount()) { + showErrorMsg(Tools.getString(R.string.wire_at_least_two_points)); + return; + } + mAdapter.setSteelWirePoints(pickPointResult); + } else if (StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE.equals(type)) { + if (pickPointResult.getSelectedIds().size() < undergroundSideMinCount()) { + showErrorMsg(Tools.getString(R.string.please_select_the_underground_near_well_point)); + return; + } + mAdapter.setUndergroudSidePoints(pickPointResult); + } else if (StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK.equals(type)) { + if (pickPointResult.getSelectedIds().size() < undergroundLinkMinCount()) { + showErrorMsg(Tools.getString(R.string.underground_connection_direction_min_hint)); + return; + } + mAdapter.setUndergroudLinkPoints(pickPointResult); + } + onItemChanged(); + }); + + protected abstract int groundLinkMinCount(); + + protected abstract int groundSideMinCount(); + + protected abstract int steelWireMinCount(); + + protected abstract int undergroundSideMinCount(); + + protected abstract int undergroundLinkMinCount(); + + protected abstract void defaultItems(IOnListGetCallback callback); + + protected List getAdapterDataList() { + List items = null; + if (mAdapter != null) { + items = mAdapter.getItems(); + } + return items; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + if (view == null) { + return null; + } + RecyclerView recyclerView = view.findViewById(R.id.recycler_view); + if (recyclerView != null) { + defaultItems(stationDetailItemList -> runOnUI(() -> { + mAdapter = new StationCreateLineWellAdapter( + AbstractLineStationWellSetupFragment.this, stationDetailItemList); + + recyclerView.setAdapter(mAdapter); + SwipeDraggableRecyclerViewUtil.setup(mAdapter, + recyclerView, + getChildFragmentManager(), + getViewLifecycleOwner(), + AbstractLineStationWellSetupFragment.this, + getContext()); + + refreshFiveDataList(); +// refreshAutoCloseView(); + + })); + } + setHasOptionsMenu(true); + return view; + } + + @Override + public void onViewCreated(@NonNull @NotNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); +// initAutoCloseView(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (handler != null) + handler.removeCallbacksAndMessages(null); + } + + + @Override + public void onSelectGroundLink(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK, + groundLinkMinCount() + 1, Tools.getString(R.string.select_the_ground_connection_direction_point), filters, pickPointResult); + } + + protected void goSelectPoint(String type, int maxCount, String title, List filters, PickPointResult pickPointResult) { + if (getArguments() == null || getContext() == null) { + return; + } + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + PickPointFragment.pickPoint( + getContext(), + type, + maxCount, + title, + filters, + projectId, pickPointResult, activityResultLauncher); + } + + + @Override + public void onSelectGroundSide(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE, + 1, Tools.getString(R.string.select_surface_near_well_point), filters, pickPointResult); + } + + @Override + public void onSelectSteelWire(PickPointResult pickPointResult, List filters) { +// goSelectPoint(StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE, +// steelWireMinCount() + 1, "选择钢丝点", filters, pickPointResult); + PickPointResult lastSteelPickPoint = PickPointResult.create(); + int newName = 1; + List pointsFromType = mAdapter.getPointsFromType(StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE + StationDetailItem._DATA); + if (pointsFromType != null && !pointsFromType.isEmpty()) { + PickPointResult.initPicPointResultData(lastSteelPickPoint, pointsFromType); + //获取新的钢丝的索引 + StationDetailItem stationDetailItem = pointsFromType.get(pointsFromType.size() - 1); + String num = RegExUtil.findNum(stationDetailItem.getName()); + assert num != null; + newName = Integer.parseInt(num) + 1; + } + + if (lastSteelPickPoint.getSelectedIds().size() >= steelWireMinCount() + 1) { + ToastUtils.showShort(R.string.steel_max_hint, (steelWireMinCount() + 1)); + return; + } + + PickPointResult.createPointResultNewData(lastSteelPickPoint, Tools.getString(R.string.wire) + newName); + mAdapter.setSteelWirePoints(lastSteelPickPoint); + + onItemChanged(); + } + + @Override + public void onSelectUndergroundLink(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK, + undergroundLinkMinCount() + 1, Tools.getString(R.string.select_underground_connection_direction_point), filters, pickPointResult); + } + + @Override + public void onSelectUndergroundSide(PickPointResult pickPointResult, List filters) { + goSelectPoint(StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE, + 1, Tools.getString(R.string.select_underground_near_well_point), filters, pickPointResult); + } + +// @Override +// public void onSelectOnlyMeasureHorAngle(boolean measureHorAngle) { +// LineRecord currentBatch = getCurrentBatch(); +// SurveyorStationUtil.updateLineRecord(currentBatch); +// SurveyorStationUtil.updateStationPointsMeasureHorAag(currentBatch); +// } + + @Override + public void onItemRemoved(int adapterPosition) { + mAdapter.removeItemForLastSelect(adapterPosition); + onItemChanged(); + } + + @Override + public void onItemDragCompleted() { + onItemChanged(); + } + + /** + * 测站数据发生了变化--测点被删除、测点被修改、测站被修改、测点被拖拽 + */ + private void onItemChanged() { + handler.postDelayed(() -> { + refreshFiveDataList(); + //检测数据是否合法 + if (confirmItem != null) { + confirmItem.setEnabled(!(groundLinkDataList.size() < groundLinkMinCount() || + groundSideDataList.size() < groundSideMinCount() || + steelWireDataList.size() < steelWireMinCount() || + ungroundSideDataList.size() < undergroundSideMinCount() || + ungroundLinkDataList.size() < undergroundLinkMinCount() + )); + } +// refreshAutoCloseView(); + }, 80); + } + + private void refreshFiveDataList() { + String _data = StationDetailItem._DATA; + groundLinkDataList = mAdapter.getPointsFromType(StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK + _data); + groundSideDataList = mAdapter.getPointsFromType(StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE + _data); + steelWireDataList = mAdapter.getPointsFromType(StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE + _data); + ungroundSideDataList = mAdapter.getPointsFromType(StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE + _data); + ungroundLinkDataList = mAdapter.getPointsFromType(StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK + _data); + } + +// private void refreshAutoCloseView() { +// if (isCanSetAutoCloseCheck()) { +// setAutoCloseCheckEnable(true, true); +// } else { +// setAutoCloseCheckEnable(false, false); +// } +// } + + private boolean isCanSetAutoCloseCheck() { + if (groundLinkDataList == null || steelWireDataList == null || ungroundLinkDataList == null) { + return false; + } + int groundLinkSize = groundLinkDataList.size(); + int steelWireSize = steelWireDataList.size(); + int ungroundLinkSize = ungroundLinkDataList.size(); + return groundLinkSize + steelWireSize >= SurveyorStationConstants.AUTO_CLOSE_NUM_INCLUDE_STATION + || ungroundLinkSize + steelWireSize >= SurveyorStationConstants.AUTO_CLOSE_NUM_INCLUDE_STATION; + } + + + protected void showErrorMsgForWell(String type) { + switch (type) { + case StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK: + showErrorMsg(Tools.getString(R.string.underground_connection_min_hint)); + break; + case StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE: + showErrorMsg(Tools.getString(R.string.please_select_the_surface_near_well_point)); + break; + case StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE: + showErrorMsg(Tools.getString(R.string.wire_at_least_two_points)); + break; + case StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE: + showErrorMsg(Tools.getString(R.string.please_select_the_underground_near_well_point)); + break; + case StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK: + showErrorMsg(Tools.getString(R.string.underground_connection_direction_min_hint)); + break; + default: + break; + } + } + + private void showErrorMsg(String msg) { + ToastUtils.showShort(msg); + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + inflater.inflate(R.menu.menu_confirm, menu); + confirmItem = menu.findItem(R.id.menu_confirm); + if (confirmItem != null) { + confirmItem.setEnabled(false); + } + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(@NonNull @NotNull MenuItem item) { + // TODO: 2022/6/15 + if (R.id.menu_confirm == item.getItemId()) { + if (getArguments() == null) { + return super.onOptionsItemSelected(item); + } +// //设置导线的弹框 +// requestLineName(string -> { +// //建站 +// }); + + String projectId = projectId();//getArguments().getString(BundleConstants.KEY_PROJECT_ID); + String periodId = getArguments().getString(BundleConstants.KEY_PERIOD_ID); + if (getCurrentBatch() != null) { + projectId = getCurrentBatch().projectId; + periodId = getCurrentBatch().cycleId; + } + setup(projectId, periodId, LINE_NAME, groundLinkDataList, groundSideDataList, steelWireDataList, ungroundLinkDataList, ungroundSideDataList, () -> { + if (getActivity() != null) { + getActivity().finish(); + } + }); + } + return super.onOptionsItemSelected(item); + } + + @Override + public boolean cancelBack() { + // TODO: 2022/6/15 +// List knownItems1 = mAdapter.getGroundLinkPoints(); +// List unknownItems = mAdapter.unknownItems(); +// List knownItems2 = mAdapter.knownItems2(); +// if (isListEmpty(knownItems1) || +// isListEmpty(unknownItems) || +// isListEmpty(knownItems2)) { +// return warningDataLosing(this); +// } + return false; + } + + protected abstract void setup(String projectId, String cycleId, + String lineName, + List groundLinkDataList, + List groundSideDataList, + List steelWireDataList, + List ungroundLinkDataList, + List ungroundSideDataList, + Runnable callback); + + +// private SwitchCompat getAutoCloseView() { +// if (getView() != null) { +// return getView().findViewById(R.id.auto_close_switch); +// } +// return null; +// } +// +// private void setAutoCloseCheckEnable(boolean isCheck, boolean isEnable) { +// SwitchCompat autoCloseView = getAutoCloseView(); +// if (autoCloseView != null) { +// autoCloseView.setChecked(isCheck); +// autoCloseView.setEnabled(isEnable); +// } +// } +// +// /** +// * 默认是自动闭合的 +// * +// * @return +// */ +// protected boolean isAutoClose() { +// SwitchCompat autoCloseView = getAutoCloseView(); +// if (autoCloseView != null) { +// return autoCloseView.isChecked(); +// } +// return true; +// } +// +// private void initAutoCloseView() { +// SwitchCompat autoCloseView = getAutoCloseView(); +// if (autoCloseView != null) { +// autoCloseView.setOnCheckedChangeListener((buttonView, isChecked) -> { +// if (isCanSetAutoCloseCheck()) { +// setAutoCloseCheckEnable(isChecked, true); +// } +// }); +// } +// } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/attached/LineStationAttachedSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/attached/LineStationAttachedSetupFragment.java new file mode 100644 index 0000000..53521bb --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/attached/LineStationAttachedSetupFragment.java @@ -0,0 +1,280 @@ +package com.bingce.controlnetwork.fragment.station.line.attached; + +import android.content.Context; +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.ILineRecordDataSource; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.station.line.AbstractLineStationKnownUnknownKnownSetupFragment; +import com.bingce.utils.IOnListGetCallback; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +/** + * 新建附合导线 + */ +public class LineStationAttachedSetupFragment extends AbstractLineStationKnownUnknownKnownSetupFragment { + + @Override + protected int knownItemMinCount() { + return 2; + } + + @Override + protected void defaultItems(IOnListGetCallback callback) { + if (callback == null || getArguments() == null) { + return; + } + String batchId = getArguments().getString(BundleConstants.KEY_LINE_ID); + if (batchId == null || batchId.isEmpty()) { + callback.onGet(Arrays.asList( + new StationDetailItem( + getString(selectKnownPointTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP1, + null), + new StationDetailItem( + getString(R.string.select_1_unknown_point), + StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP, + null), + new StationDetailItem( + getString(selectKnownPointTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP2, + null))); + } else { + loadBatchRecord(batchId, callback); + } + } + + @Override + protected int selectKnownPointTitle() { + return R.string.select_2_known_point; + } + + @Override + protected int knownPointCountError() { + return R.string.tips_known_point_must_more_than_2; + } + + @Override + protected boolean initLeftRightMeasure() { + return true; + } + + @Override + protected String defaultLineName() { + return getString(R.string.wire_fuhe); + } + + @Override + protected void setup(String projectId, String periodId, + String lineName, + List knownItems1, + List unknownItems, + List knownItems2, + Runnable runnable) { + //判断数据是否准确 + if (knownItems1.size() != knownItemMinCount()) { + ToastUtils.showShort(knownPointCountError()); + return; + } + if (unknownItems.isEmpty()) { + ToastUtils.showShort(R.string.tips_unknown_point_must_not_empty); + return; + } + if (knownItems2.size() != knownItemMinCount()) { + ToastUtils.showShort(knownPointCountError()); + return; + } + //切换线程 + ThreadPoolUtil.execute(() -> { + + ILineRecordDataSource stationBatchDataSource = SurveyorDatabaseFactory + .instance.getLineRecordDatabase(); + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory + .instance.getSurveyorStation(); + + String lineId = ""; + if (getArguments() != null) { + lineId = getArguments().getString(BundleConstants.KEY_LINE_ID); + } + if (lineId != null && !lineId.isEmpty()) { + //0.删除原有导线和相关测站 + stationBatchDataSource.deleteSync(lineId); + stationDataSource.deleteByLineIdSync(lineId); + } + + String error = checkValidate(projectId, periodId, + unknownItems, knownItems1, knownItems2); + if (error != null && !error.isEmpty()) { + tipsError(error); + return; + } + //0.处理全局控制点 + PointUtil.globalToProjectControlPoint(knownItems1, projectId); + PointUtil.globalToProjectControlPoint(unknownItems, projectId); + PointUtil.globalToProjectControlPoint(knownItems2, projectId); + + + //1.创建并存储batch + List records = new ArrayList<>(); + records.add(new StationDetailItem( + getString(selectKnownPointTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP1, + null)); + records.addAll(knownItems1); + records.add(new StationDetailItem( + getString(R.string.select_1_unknown_point), + StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP, + null)); + records.addAll(unknownItems); + records.add(new StationDetailItem( + getString(selectKnownPointTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP2, + null)); + records.addAll(knownItems2); + LineRecord batchRecord = LineRecord.attach(lineName, projectId, periodId, records); + stationBatchDataSource.save(batchRecord); + + ProjectRecord projectRecord = currentProject(); + boolean showSlopDistance = true; + if (projectRecord != null) { + showSlopDistance = projectRecord.showSlopDistance; + } + + //2.创建测站列表 + StationDetailItem item1 = knownItems1.get(0); + StationDetailItem item2 = knownItems1.get(1); + long dateValue = (new Date()).getTime(); + List stationRecordList = new ArrayList<>(); + boolean needLeftRightSurveyor = needLeftRightSurveyor(); + for (int index = 0; index < unknownItems.size(); index++) { + StationDetailItem item3 = unknownItems.get(index); + + SurveyorStationRecord record = + SurveyorStationRecord.lineStation(dateValue++, + projectId, periodId, batchRecord.id, item1, item2, item3); + record.setLeftAndRightSurveyor(needLeftRightSurveyor); + record.setShowSlopDistance(showSlopDistance); + stationRecordList.add(record); + + item1 = item2; + item2 = item3; + } + //添加konwn point2 + for (int index = 0; index < knownItems2.size(); index++) { + StationDetailItem item3 = knownItems2.get(index); + + SurveyorStationRecord record = + SurveyorStationRecord.lineStation(dateValue++, + projectId, periodId, batchRecord.id, item1, item2, item3); + record.setLeftAndRightSurveyor(needLeftRightSurveyor); + record.setShowSlopDistance(showSlopDistance); + stationRecordList.add(record); + + item1 = item2; + item2 = item3; + } + + //3.存储新建的测站列表 + stationDataSource.save(stationRecordList); + + if (runnable != null) { + runnable.run(); + } + }); + } + + private static String checkValidate(String projectId, String cycleId, + List unknownItems, + List knownItems1, + List knownItems2) { + //检测该测期下是否有同名测站 + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory + .instance + .getSurveyorStation(); + List currentStationList = + stationDataSource.getDataList(projectId, cycleId); + + //收集要创建的测站站点id + List expectedStationIds = new ArrayList<>(); + StationDetailItem tmp = knownItems1.get(1); + for (int index = 0; index < unknownItems.size(); index++) { + StationDetailItem item3 = unknownItems.get(index); + expectedStationIds.add(tmp.getOriginalPointId()); + tmp = item3; + } + //添加konwn point2 + for (int index = 0; index < knownItems2.size(); index++) { + StationDetailItem item3 = knownItems2.get(index); + expectedStationIds.add(tmp.getOriginalPointId()); + tmp = item3; + } + + if (currentStationList != null) {//遍历当前已有测站,检测是否有同名测站 + for (SurveyorStationRecord record : currentStationList) { + List items = record.getItems(); + if (items != null) {//检测测站名是否相同 + for (SurveyorPoint stationItem : items) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + for (String stationDetailItemId : expectedStationIds) {//遍历即将创建的测站列表,对比是否有相同的 + if (stationItem.getPointId().equals(stationDetailItemId)) { + PointRecord pointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationItem.getOriginalPointId()); + if (pointRecord != null) { + return pointRecord.getName(); + } + return ""; + } + } + break; + } + } + } + } + } + return null; + } + + public static final int titleCreate = R.string.title_create_attach_line_station; + public static final int titleEdit = R.string.title_edit_attach_line_station; + public static final String TAG = LineStationAttachedSetupFragment.class.getName(); + + public static void startCreate(Context context, String projectId, String periodId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_PERIOD_ID, periodId); + FragmentContainerActivity.start(context, TAG, titleCreate, bundle); + } + + public static void startEdit(Context context, String projectId, String batchId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_LINE_ID, batchId); + FragmentContainerActivity.start(context, TAG, titleEdit, bundle); + } + + public static LineStationAttachedSetupFragment newInstance(Bundle bundle) { + LineStationAttachedSetupFragment fragment = new LineStationAttachedSetupFragment(); + fragment.setArguments(bundle); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/close/LineStationCloseSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/close/LineStationCloseSetupFragment.java new file mode 100644 index 0000000..7c70d50 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/close/LineStationCloseSetupFragment.java @@ -0,0 +1,329 @@ +package com.bingce.controlnetwork.fragment.station.line.close; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.SwitchCompat; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.ILineRecordDataSource; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.station.line.single.LineStationSingleSetupFragment; +import com.bingce.utils.ThreadPoolUtil; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 新建闭合导线 + */ +public class LineStationCloseSetupFragment extends LineStationSingleSetupFragment { + + @Override + protected int layoutRes() { + return R.layout.fragment_close_line_surveyor_station_setup_layout; + } + + @Override + public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + SwitchCompat setOnce = view.findViewById(R.id.start_point_setup_once); + if (setOnce == null) { + return; + } + setOnce.setVisibility(View.VISIBLE); + setOnce.setChecked(true); + } + + @Override + protected int unknownItemMinCount() { + return 2; + } + + @Override + protected int unknownGroupTitle() { + return R.string.select_2_unknown_point; + } + + @Override + protected int unknownPointCountError() { + return R.string.tips_unknown_point_must_more_than_2; + } + + @Override + protected String defaultLineName() { + return getString(R.string.wire_bihe); + } + + @Override + protected void setup(String projectId, String periodId, + String lineName, + List knownItems, + List unknownItems, + Runnable runnable) { + ILineRecordDataSource stationBatchDataSource = SurveyorDatabaseFactory + .instance.getLineRecordDatabase(); + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory + .instance.getSurveyorStation(); + + ThreadPoolUtil.execute(() -> { + + String lineId = ""; + if (getArguments() != null) { + lineId = getArguments().getString(BundleConstants.KEY_LINE_ID); + } + if (lineId != null && !lineId.isEmpty()) { + //0.删除原有导线和相关测站 + stationBatchDataSource.deleteSync(lineId); + stationDataSource.deleteByLineIdSync(lineId); + } + + //验证重复测站 + String name = checkValidate(projectId, periodId, + startPointSetupOnce(), knownItems, unknownItems); + if (name != null && !name.isEmpty()) { + tipsError(name); + return; + } + //0.处理全局控制点 + PointUtil.globalToProjectControlPoint(knownItems, projectId); + PointUtil.globalToProjectControlPoint(unknownItems, projectId); + + //1.创建并存储batch + List records = new ArrayList<>(); + records.add(new StationDetailItem( + getString(knownGroupTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP, + null)); + records.addAll(knownItems); + records.add(new StationDetailItem( + getString(unknownGroupTitle()), + StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP, + null)); + records.addAll(unknownItems); + LineRecord lineRecord = LineRecord.close(lineName, projectId, periodId, records); + stationBatchDataSource.save(lineRecord); + + ProjectRecord projectRecord = currentProject(); + boolean showSlopDistance = true; + if (projectRecord != null) { + showSlopDistance = projectRecord.showSlopDistance; + } + //2.创建测站列表 + if (startPointSetupOnce()) { + List stationRecordList = setup2( + projectId, periodId, lineRecord.id, showSlopDistance, needLeftRightSurveyor(), knownItems, unknownItems); + //3.存储 + stationDataSource.save(stationRecordList); + } else { + List stationRecordList = setup1( + projectId, periodId, lineRecord.id, showSlopDistance, needLeftRightSurveyor(), knownItems, unknownItems); + //3.存储 + stationDataSource.save(stationRecordList); + } + + if (runnable != null) { + runnable.run(); + } + }); + } + + protected static String checkValidate(String projectId, String cycleId, + boolean startPointSetupOnce, + List unknownItems, + List knownItems) { + ISurveyorStationDataSource stationDataSource = + SurveyorDatabaseFactory.instance.getSurveyorStation(); + //检测该测期下是否有同名测站 + List currentStationList = + stationDataSource.getDataList(projectId, cycleId); + //收集要创建的测站站点id + List expectedStationIds = new ArrayList<>(); + if (startPointSetupOnce) { + StationDetailItem tmp2 = knownItems.get(1); + StationDetailItem tmp3 = unknownItems.get(0); + //起算点有3个测点 + expectedStationIds.add(tmp2.getOriginalPointId()); + tmp2 = tmp3; + for (int index = 1; index < unknownItems.size(); index++) { + tmp3 = unknownItems.get(index); + expectedStationIds.add(tmp2.getOriginalPointId()); + tmp2 = tmp3; + } + //创建最后一个闭合站 + expectedStationIds.add(tmp2.getOriginalPointId()); + } else { + StationDetailItem tmp = knownItems.get(1); + for (int index = 0; index < unknownItems.size(); index++) { + StationDetailItem item3 = unknownItems.get(index); + expectedStationIds.add(tmp.getOriginalPointId()); + tmp = item3; + } + //--闭合导线添加最后一个闭环 + StationDetailItem item3 = knownItems.get(1); + expectedStationIds.add(tmp.getOriginalPointId()); + //--最后以known2做站点再加一站 + tmp = item3; + expectedStationIds.add(tmp.getOriginalPointId()); + } + if (currentStationList != null) {//遍历当前已有测站,检测是否有同名测站 + for (SurveyorStationRecord record : currentStationList) { + List items = record.getItems(); + if (items != null) {//检测测站名是否相同 + for (SurveyorPoint stationItem : items) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + for (String stationDetailItemId : expectedStationIds) {//遍历即将创建的测站列表,对比是否有相同的 + if (stationItem.getPointId().equals(stationDetailItemId)) { + PointRecord pointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationItem.getOriginalPointId()); + if (pointRecord != null) { + return pointRecord.getName(); + } + return ""; + } + } + break; + } + } + } + } + } + return null; + } + + protected boolean startPointSetupOnce() { + return switchIsChecked(getView(), R.id.start_point_setup_once); + } + + private static final int titleCreate = R.string.title_create_close_line_station; + private static final int titleEdit = R.string.title_edit_close_line_station; + public static final String TAG = LineStationCloseSetupFragment.class.getName(); + + public static void startCreateCloseLine(Context context, String projectId, String periodId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_PERIOD_ID, periodId); + FragmentContainerActivity.start(context, TAG, titleCreate, bundle); + } + + public static void startEdit(Context context, String projectId, String batchId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_LINE_ID, batchId); + FragmentContainerActivity.start(context, TAG, titleEdit, bundle); + } + + public static LineStationCloseSetupFragment newInstance(Bundle bundle) { + LineStationCloseSetupFragment fragment = new LineStationCloseSetupFragment(); + fragment.setArguments(bundle); + return fragment; + } + + private static List setup1(String projectId, String cycleId, String lineId, + boolean showSlopDistance, boolean needLeftRightSurveyor, + List knownItems, List unknownItems) { + StationDetailItem item1 = knownItems.get(0); + StationDetailItem item2 = knownItems.get(1); + long dateValue = (new Date()).getTime(); + List stationRecordList = new ArrayList<>(); + for (int index = 0; index < unknownItems.size(); index++) { + StationDetailItem item3 = unknownItems.get(index); + + SurveyorStationRecord record = + SurveyorStationRecord.lineStation(dateValue++, + projectId, cycleId, lineId, item1, item2, item3); + record.setLeftAndRightSurveyor(needLeftRightSurveyor); + record.setShowSlopDistance(showSlopDistance); + stationRecordList.add(record); + + item1 = item2; + item2 = item3; + } + //--闭合导线添加最后一个闭环 + StationDetailItem item3 = knownItems.get(1); + SurveyorStationRecord record1 = + SurveyorStationRecord.lineStation(dateValue++, + projectId, cycleId, lineId, item1, item2, item3); + record1.setLeftAndRightSurveyor(needLeftRightSurveyor); + record1.setShowSlopDistance(showSlopDistance); + stationRecordList.add(record1); + + //--最后以known2做站点再加一站 + item1 = item2; + item2 = item3; + item3 = knownItems.get(0); + SurveyorStationRecord record2 = + SurveyorStationRecord.lineStation(dateValue++, + projectId, cycleId, lineId, item1, item2, item3); + record2.setLeftAndRightSurveyor(needLeftRightSurveyor); + record2.setShowSlopDistance(showSlopDistance); + stationRecordList.add(record2); + + return stationRecordList; + } + + private static List setup2(String projectId, String cycleId, String lineId, + boolean showSlopDistance, boolean needLeftRightSurveyor, + List knownItems, List unknownItems) { + long dateValue = (new Date()).getTime(); + List stationRecordList = new ArrayList<>(); + + StationDetailItem item1 = knownItems.get(0); + StationDetailItem item2 = knownItems.get(1); + StationDetailItem item3 = unknownItems.get(0); + StationDetailItem item4 = unknownItems.get(unknownItems.size() - 1); + //起算点有3个测点 + SurveyorStationRecord startStation = + SurveyorStationRecord.closeLineStartPointStation(dateValue++, + projectId, cycleId, lineId, item1, item2, item3, item4); + startStation.setLeftAndRightSurveyor(false); + startStation.setShowSlopDistance(showSlopDistance); + stationRecordList.add(startStation); + + item1 = item2; + item2 = item3; + + for (int index = 1; index < unknownItems.size(); index++) { + item3 = unknownItems.get(index); + + SurveyorStationRecord record = + SurveyorStationRecord.lineStation(dateValue++, + projectId, cycleId, lineId, item1, item2, item3); + record.setLeftAndRightSurveyor(needLeftRightSurveyor); + record.setShowSlopDistance(showSlopDistance); + stationRecordList.add(record); + + item1 = item2; + item2 = item3; + } + + //创建最后一个闭合站 + item3 = knownItems.get(1); + SurveyorStationRecord record = + SurveyorStationRecord.lineStation(dateValue++, + projectId, cycleId, lineId, item1, item2, item3); + record.setLeftAndRightSurveyor(needLeftRightSurveyor); + record.setShowSlopDistance(showSlopDistance); + stationRecordList.add(record); + + return stationRecordList; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/random/LineStationRandomSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/random/LineStationRandomSetupFragment.java new file mode 100644 index 0000000..0d10ef1 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/random/LineStationRandomSetupFragment.java @@ -0,0 +1,272 @@ +package com.bingce.controlnetwork.fragment.station.line.random; + +import android.content.Context; +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.ILineRecordDataSource; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.station.line.AbstractLineStationKnownUnknownKnownSetupFragment; +import com.bingce.utils.IOnListGetCallback; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +/** + * 新建无定向导线 + */ +public class LineStationRandomSetupFragment extends AbstractLineStationKnownUnknownKnownSetupFragment { + + @Override + protected int knownItemMinCount() { + return 1; + } + + @Override + protected void defaultItems(IOnListGetCallback callback) { + if (callback == null || getArguments() == null) { + return; + } + String batchId = getArguments().getString(BundleConstants.KEY_LINE_ID); + if (batchId == null || batchId.isEmpty()) { + callback.onGet(Arrays.asList( + new StationDetailItem( + getString(selectKnownPointTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP1, + null), + new StationDetailItem( + getString(R.string.select_1_unknown_point), + StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP, + null), + new StationDetailItem( + getString(selectKnownPointTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP2, + null))); + } else { + loadBatchRecord(batchId, callback); + } + } + + @Override + protected int selectKnownPointTitle() { + return R.string.select_1_known_point; + } + + @Override + protected int knownPointCountError() { + return R.string.tips_known_point_must_more_than_1; + } + + @Override + protected boolean initLeftRightMeasure() { + return true; + } + + @Override + protected String defaultLineName() { + return getString(R.string.wire_wudingxxiang); + } + + @Override + protected void setup(String projectId, String periodId, + String lineName, + List knownItems1, + List unknownItems, + List knownItems2, + Runnable runnable) { + //检测条件是否合法 + if (knownItems1.size() != knownItemMinCount()) { + ToastUtils.showShort(knownPointCountError()); + return; + } + if (unknownItems.isEmpty()) { + ToastUtils.showShort(R.string.tips_unknown_point_must_not_empty); + return; + } + if (knownItems2.size() != knownItemMinCount()) { + ToastUtils.showShort(knownPointCountError()); + return; + } + ThreadPoolUtil.execute(() -> { + + ILineRecordDataSource stationBatchDataSource = SurveyorDatabaseFactory + .instance.getLineRecordDatabase(); + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory + .instance.getSurveyorStation(); + + String lineId = ""; + if (getArguments() != null) { + lineId = getArguments().getString(BundleConstants.KEY_LINE_ID); + } + if (lineId != null && !lineId.isEmpty()) { + //0.删除原有导线和相关测站 + stationBatchDataSource.deleteSync(lineId); + stationDataSource.deleteByLineIdSync(lineId); + } + + String error = checkValidate(projectId, periodId, unknownItems, knownItems2); + if (error != null && !error.isEmpty()) { + tipsError(error); + return; + } + //0.处理全局控制点 + PointUtil.globalToProjectControlPoint(knownItems1, projectId); + PointUtil.globalToProjectControlPoint(unknownItems, projectId); + PointUtil.globalToProjectControlPoint(knownItems2, projectId); + + //1.创建并存储batch + List records = new ArrayList<>(); + records.add(new StationDetailItem( + getString(selectKnownPointTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP1, + null)); + records.addAll(knownItems1); + records.add(new StationDetailItem( + getString(R.string.select_1_unknown_point), + StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP, + null)); + records.addAll(unknownItems); + records.add(new StationDetailItem( + getString(selectKnownPointTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP2, + null)); + records.addAll(knownItems2); + LineRecord batchRecord = LineRecord.random(lineName, projectId, periodId, records); + stationBatchDataSource.save(batchRecord); + + ProjectRecord projectRecord = currentProject(); + boolean showSlopDistance = true; + if (projectRecord != null) { + showSlopDistance = projectRecord.showSlopDistance; + } + //2.创建测站列表 + StationDetailItem item1 = knownItems1.get(0); + StationDetailItem item2 = unknownItems.get(0); + long dateValue = (new Date()).getTime(); + List stationRecordList = new ArrayList<>(); + boolean needLeftRightSurveyor = needLeftRightSurveyor(); + for (int index = 1; index < unknownItems.size(); index++) { + StationDetailItem item3 = unknownItems.get(index); + + SurveyorStationRecord record = + SurveyorStationRecord.lineStation(dateValue++, + projectId, periodId, batchRecord.id, item1, item2, item3); + record.setLeftAndRightSurveyor(needLeftRightSurveyor); + record.setShowSlopDistance(showSlopDistance); + stationRecordList.add(record); + + item1 = item2; + item2 = item3; + } + //添加konwn point2 + for (int index = 0; index < knownItems2.size(); index++) { + StationDetailItem item3 = knownItems2.get(index); + + SurveyorStationRecord record = + SurveyorStationRecord.lineStation(dateValue++, + projectId, periodId, batchRecord.id, item1, item2, item3); + record.setLeftAndRightSurveyor(needLeftRightSurveyor); + record.setShowSlopDistance(showSlopDistance); + stationRecordList.add(record); + + item1 = item2; + item2 = item3; + } + + stationDataSource.save(stationRecordList); + + if (runnable != null) { + runnable.run(); + } + }); + } + + private static String checkValidate(String projectId, String cycleId, + List unknownItems, + List knownItems2) { + //检测该测期下是否有同名测站 + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory + .instance.getSurveyorStation(); + List currentStationList = + stationDataSource.getDataList(projectId, cycleId); + //收集要创建的测站站点id + List expectedStationIds = new ArrayList<>(); + + StationDetailItem tmp = unknownItems.get(0); + for (int index = 1; index < unknownItems.size(); index++) { + StationDetailItem item3 = unknownItems.get(index); + expectedStationIds.add(tmp.getOriginalPointId()); + tmp = item3; + } + //添加konwn point2 + for (int index = 0; index < knownItems2.size(); index++) { + StationDetailItem item3 = knownItems2.get(index); + expectedStationIds.add(tmp.getOriginalPointId()); + tmp = item3; + } + if (currentStationList != null) {//遍历当前已有测站,检测是否有同名测站 + for (SurveyorStationRecord record : currentStationList) { + List items = record.getItems(); + if (items != null) {//检测测站名是否相同 + for (SurveyorPoint stationItem : items) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + for (String stationDetailItemId : expectedStationIds) {//遍历即将创建的测站列表,对比是否有相同的 + if (stationItem.getPointId().equals(stationDetailItemId)) { + PointRecord pointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationItem.getOriginalPointId()); + if (pointRecord != null) { + return pointRecord.getName(); + } + return ""; + } + } + break; + } + } + } + } + } + return null; + } + + public static final int titleCreate = R.string.title_create_random_line_station; + public static final int titleEdit = R.string.title_edit_random_line_station; + public static final String TAG = LineStationRandomSetupFragment.class.getName(); + + public static void startCreate(Context context, String projectId, String periodId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_PERIOD_ID, periodId); + FragmentContainerActivity.start(context, TAG, titleCreate, bundle); + } + + public static void startEdit(Context context, String projectId, String batchId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_LINE_ID, batchId); + FragmentContainerActivity.start(context, TAG, titleEdit, bundle); + } + + public static LineStationRandomSetupFragment newInstance(Bundle bundle) { + LineStationRandomSetupFragment fragment = new LineStationRandomSetupFragment(); + fragment.setArguments(bundle); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/single/LineStationSingleSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/single/LineStationSingleSetupFragment.java new file mode 100644 index 0000000..9d55c3f --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/single/LineStationSingleSetupFragment.java @@ -0,0 +1,240 @@ +package com.bingce.controlnetwork.fragment.station.line.single; + +import android.content.Context; +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.ILineRecordDataSource; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.station.line.AbstractLineStationKnownUnknownSetupFragment; +import com.bingce.utils.IOnListGetCallback; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * 新建支导线 + */ +public class LineStationSingleSetupFragment extends AbstractLineStationKnownUnknownSetupFragment { + + @Override + protected int knownItemMinCount() { + return 2; + } + + @Override + protected int knownGroupTitle() { + return R.string.select_2_known_point; + } + + @Override + protected int knownPointCountError() { + return R.string.tips_known_point_must_more_than_2; + } + + @Override + protected int unknownItemMinCount() { + return 1; + } + + @Override + protected int unknownGroupTitle() { + return R.string.select_1_unknown_point; + } + + @Override + protected int unknownPointCountError() { + return R.string.tips_unknown_point_must_not_empty; + } + + @Override + protected boolean initLeftRightMeasure() { + return true; + } + + @Override + protected String defaultLineName() { + return getString(R.string.wire_zhi); + } + + @Override + protected void defaultItems(IOnListGetCallback callback) { + if (callback == null || getArguments() == null) { + return; + } + String batchId = getArguments().getString(BundleConstants.KEY_LINE_ID); + if (batchId == null || batchId.isEmpty()) { + callback.onGet(Arrays.asList( + new StationDetailItem( + getString(knownGroupTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP, + null), + new StationDetailItem( + getString(unknownGroupTitle()), + StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP, + null))); + } else { + loadBatchRecord(batchId, callback); + } + } + + @Override + protected void setup(String projectId, String periodId, + String lineName, + List knownItems, + List unknownItems, + Runnable runnable) { + ILineRecordDataSource stationBatchDataSource = SurveyorDatabaseFactory + .instance.getLineRecordDatabase(); + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory + .instance.getSurveyorStation(); + + ThreadPoolUtil.execute(() -> { + String lineId = ""; + if (getArguments() != null) { + lineId = getArguments().getString(BundleConstants.KEY_LINE_ID); + } + if (lineId != null && !lineId.isEmpty()) { + //0.删除原有导线和相关测站 + stationBatchDataSource.deleteSync(lineId); + stationDataSource.deleteByLineIdSync(lineId); + } + + String error = checkValidate(projectId, periodId, knownItems, unknownItems); + if (error != null && !error.isEmpty()) { + tipsError(error); + return; + } + //0.处理全局控制点 + PointUtil.globalToProjectControlPoint(knownItems, projectId); + PointUtil.globalToProjectControlPoint(unknownItems, projectId); + + //1.创建并存储batch + List records = new ArrayList<>(); + records.add(new StationDetailItem( + getString(knownGroupTitle()), + StationDetailItem.ITEM_TYPE_KNOWN_POINT_GROUP, + null)); + records.addAll(knownItems); + records.add(new StationDetailItem( + getString(unknownGroupTitle()), + StationDetailItem.ITEM_TYPE_UN_KNOWN_POINT_GROUP, + null)); + records.addAll(unknownItems); + LineRecord batchRecord = LineRecord.single(lineName, projectId, periodId, records); + stationBatchDataSource.save(batchRecord); + + ProjectRecord projectRecord = currentProject(); + boolean showSlopDistance = true; + if (projectRecord != null) { + showSlopDistance = projectRecord.showSlopDistance; + } + //2.创建测站列表 + StationDetailItem item1 = knownItems.get(0); + StationDetailItem item2 = knownItems.get(1); + long dateValue = (new Date()).getTime(); + List stationRecordList = new ArrayList<>(); + boolean needLeftRightSurveyor = needLeftRightSurveyor(); + for (int index = 0; index < unknownItems.size(); index++) { + StationDetailItem item3 = unknownItems.get(index); + SurveyorStationRecord record = + SurveyorStationRecord.lineStation(dateValue++, + projectId, periodId, batchRecord.id, item1, item2, item3); + record.setLeftAndRightSurveyor(needLeftRightSurveyor); + record.setShowSlopDistance(showSlopDistance); + stationRecordList.add(record); + + item1 = item2; + item2 = item3; + } + + stationDataSource.save(stationRecordList); + + if (runnable != null) { + runnable.run(); + } + }); + } + + private static String checkValidate(String projectId, String cycleId, + List knownItems, + List unknownItems) { + ISurveyorStationDataSource stationDataSource = + SurveyorDatabaseFactory.instance.getSurveyorStation(); + //检测该测期下是否有同名测站 + List currentStationList = + stationDataSource.getDataList(projectId, cycleId); + //收集要创建的测站站点id + List expectedStationIds = new ArrayList<>(); + StationDetailItem tmp = knownItems.get(1); + for (int index = 0; index < unknownItems.size(); index++) { + StationDetailItem item3 = unknownItems.get(index); + expectedStationIds.add(tmp.getOriginalPointId()); + tmp = item3; + } + if (currentStationList != null) {//遍历当前已有测站,检测是否有同名测站 + for (SurveyorStationRecord record : currentStationList) { + List items = record.getItems(); + if (items != null) {//检测测站名是否相同 + for (SurveyorPoint stationItem : items) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + for (String stationDetailItemId : expectedStationIds) {//遍历即将创建的测站列表,对比是否有相同的 + if (stationItem.getPointId().equals(stationDetailItemId)) { +// return false; + PointRecord pointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationItem.getOriginalPointId()); + if (pointRecord != null) { + return pointRecord.getName(); + } + return ""; + } + } + break; + } + } + } + } + } + return null; + } + + public static final int titleCreate = R.string.title_create_sinle_line_station; + public static final int titleEdit = R.string.title_edit_sinle_line_station; + + public static final String TAG = LineStationSingleSetupFragment.class.getName(); + + public static void startCreate(Context context, String projectId, String period) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_PERIOD_ID, period); + FragmentContainerActivity.start(context, TAG, titleCreate, bundle); + } + + public static void startEdit(Context context, String projectId, String batchId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_LINE_ID, batchId); + FragmentContainerActivity.start(context, TAG, titleEdit, bundle); + } + + public static LineStationSingleSetupFragment newInstance(Bundle bundle) { + LineStationSingleSetupFragment fragment = new LineStationSingleSetupFragment(); + fragment.setArguments(bundle); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellDoubleGroundSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellDoubleGroundSetupFragment.java new file mode 100644 index 0000000..7abcc1a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellDoubleGroundSetupFragment.java @@ -0,0 +1,342 @@ +package com.bingce.controlnetwork.fragment.station.line.well; + +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.ILineRecordDataSource; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationConstants; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.station.line.AbstractLineStationWellDoubleGroundSetupFragment; +import com.bingce.utils.IOnListGetCallback; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * 新建二井定向-地上 + */ +public class LineStationWellDoubleGroundSetupFragment extends AbstractLineStationWellDoubleGroundSetupFragment { + + public static final int titleCreate = R.string.title_create_well_line_station_double_ground; + public static final int titleEdit = R.string.title_edit_well_line_station_double_ground; + public static final String TAG = LineStationWellDoubleGroundSetupFragment.class.getName(); + //区分是初始页面还是编辑页面 + private boolean isDefaultPage; + + public static void startCreate(Context context, String projectId, String periodId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_PERIOD_ID, periodId); + FragmentContainerActivity.start(context, TAG, titleCreate, bundle); + } + + public static void startEdit(Context context, String projectId, String batchId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_LINE_ID, batchId); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + FragmentContainerActivity.start(context, TAG, titleEdit, bundle); + } + + public static LineStationWellDoubleGroundSetupFragment newInstance(Bundle bundle) { + LineStationWellDoubleGroundSetupFragment fragment = new LineStationWellDoubleGroundSetupFragment(); + fragment.setArguments(bundle); + return fragment; + } + + @Override + protected boolean initLeftRightMeasure() { + return false; + } + + @Override + protected int groundLinkLeftMinCount() { + return 1; + } + + @Override + protected int groundSideAMinCount() { + return 1; + } + + @Override + protected int groundLinkMiddleMinCount() { + return 0; + } + + @Override + protected int groundSideBMinCount() { + return 1; + } + + @Override + protected int groundLinkRightMinCount() { + return 1; + } + + @Override + protected void defaultItems(IOnListGetCallback callback) { + if (callback == null || getArguments() == null) { + return; + } + String batchId = getArguments().getString(BundleConstants.KEY_LINE_ID); + isDefaultPage = TextUtils.isEmpty(batchId); + if (isDefaultPage) { + callback.onGet(Arrays.asList( + new StationDetailItem( + Tools.getString(R.string.well_a_surface_connection_direction_limit), + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT, + null), + new StationDetailItem( + Tools.getString(R.string.well_a_surface_near_well_point), + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A, + null), + new StationDetailItem( + Tools.getString(R.string.ground_connection_point_optional), + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE, + null), + new StationDetailItem( + Tools.getString(R.string.well_b_surface_near_well_point), + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B, + null), + new StationDetailItem( + Tools.getString(R.string.well_b_surface_connection_direction_limit), + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT, + null) + )); + } else { + loadBatchRecord(batchId, callback); + } + } + + + @Override + protected String defaultLineName() { + return getString(R.string.station_type_well_wire_double); + } + + @Override + protected void setup(String projectId, String periodId, String lineName, + List groundLinkLeftDataList, List groundLinkMiddleDataList, + List groundLinkRightDataList, List groundSideBDataList, + List groundSideADataList, Runnable callback) { + //判断数据是否准确 + if (groundLinkLeftDataList.size() < groundLinkLeftMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT); + return; + } + if (groundLinkMiddleDataList.size() < groundLinkMiddleMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_MIDDLE); + return; + } + if (groundLinkRightDataList.size() < groundLinkRightMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT); + return; + } + if (groundSideBDataList.size() < groundSideBMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B); + return; + } + if (groundSideADataList.size() < groundSideAMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A); + return; + } + //切换线程 + ThreadPoolUtil.execute(() -> { + + ILineRecordDataSource stationBatchDataSource = SurveyorDatabaseFactory + .instance.getLineRecordDatabase(); + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory + .instance.getSurveyorStation(); + + String lineId = ""; + if (getArguments() != null) { + lineId = getArguments().getString(BundleConstants.KEY_LINE_ID); + } + if (lineId != null && !lineId.isEmpty()) { + //0.删除原有导线和相关测站 + stationBatchDataSource.deleteSync(lineId); + stationDataSource.deleteByLineIdSync(lineId); + } + + String error = checkValidate(projectId, periodId, + groundLinkMiddleDataList, groundSideADataList, groundSideBDataList); + if (error != null && !error.isEmpty()) { + tipsError(error); + return; + } + + //0.处理全局控制点 + PointUtil.globalToProjectControlPoint(groundLinkLeftDataList, projectId); + PointUtil.globalToProjectControlPoint(groundLinkMiddleDataList, projectId); + PointUtil.globalToProjectControlPoint(groundLinkRightDataList, projectId); + PointUtil.globalToProjectControlPoint(groundSideBDataList, projectId); + PointUtil.globalToProjectControlPoint(groundSideADataList, projectId); + + //1.创建并存储batch + List lineRecordPointList = getAdapterDataList(); + LineRecord batchRecord = LineRecord.well(LineRecord.TYPE_WELL_DOUBLE_GROUND, lineName, projectId, periodId, lineRecordPointList); + stationBatchDataSource.save(batchRecord); + + ProjectRecord projectRecord = currentProject(); + boolean showSlopDistance = true; + if (projectRecord != null) { + showSlopDistance = projectRecord.showSlopDistance; + } + + //2.创建测站列表 + long dateValue = (new Date()).getTime(); + List stationRecordList = new ArrayList<>(); + boolean needLeftRightSurveyor = needLeftRightSurveyor(); + + for (StationDetailItem itemSideA : groundSideADataList) { + List pointList = new ArrayList<>(); + pointList.add(itemSideA); + pointList.addAll(groundLinkLeftDataList); + if (groundLinkMiddleDataList != null && !groundLinkMiddleDataList.isEmpty()) { + pointList.add(groundLinkMiddleDataList.get(0)); + } else { + pointList.add(groundSideBDataList.get(0)); + } + + SurveyorStationRecord wellStationRecord = SurveyorStationRecord.createWellStationRecord(dateValue++, + projectId, periodId, batchRecord.id, pointList); + //设置站是否闭合 + if (pointList.size() > SurveyorStationConstants.AUTO_CLOSE_NUM_INCLUDE_STATION) { + wellStationRecord.setAutoClose(true); + } + wellStationRecord.setLeftAndRightSurveyor(needLeftRightSurveyor); + wellStationRecord.setShowSlopDistance(showSlopDistance); + stationRecordList.add(wellStationRecord); + } + + if (groundLinkMiddleDataList != null && !groundLinkMiddleDataList.isEmpty()) { + for (int i = 0; i < groundLinkMiddleDataList.size(); i++) { + List pointList = new ArrayList<>(); + pointList.add(groundLinkMiddleDataList.get(i)); + + if (i - 1 < 0) { + //第一个节点 + pointList.add(groundSideADataList.get(0)); + } else { + pointList.add(groundLinkMiddleDataList.get(i - 1)); + } + + if (i + 1 > groundLinkMiddleDataList.size() - 1) { + pointList.add(groundSideBDataList.get(0)); + } else { + pointList.add(groundLinkMiddleDataList.get(i + 1)); + } + + SurveyorStationRecord wellStationRecord = SurveyorStationRecord.createWellStationRecord(dateValue++, + projectId, periodId, batchRecord.id, pointList); +// 设置站是否闭合 + if (pointList.size() > SurveyorStationConstants.AUTO_CLOSE_NUM_INCLUDE_STATION) { + wellStationRecord.setAutoClose(true); + } + wellStationRecord.setLeftAndRightSurveyor(needLeftRightSurveyor); + wellStationRecord.setShowSlopDistance(showSlopDistance); + stationRecordList.add(wellStationRecord); + } + } + + for (StationDetailItem itemSideB : groundSideBDataList) { + List pointList = new ArrayList<>(); + pointList.add(itemSideB); + if (groundLinkMiddleDataList != null && !groundLinkMiddleDataList.isEmpty()) { + pointList.add(groundLinkMiddleDataList.get(groundLinkMiddleDataList.size() - 1)); + } else { + pointList.add(groundSideADataList.get(0)); + } + pointList.addAll(groundLinkRightDataList); + + SurveyorStationRecord wellStationRecord = SurveyorStationRecord.createWellStationRecord(dateValue++, + projectId, periodId, batchRecord.id, pointList); + //设置站是否闭合 + if (pointList.size() > SurveyorStationConstants.AUTO_CLOSE_NUM_INCLUDE_STATION) { + wellStationRecord.setAutoClose(true); + } + wellStationRecord.setLeftAndRightSurveyor(needLeftRightSurveyor); + wellStationRecord.setShowSlopDistance(showSlopDistance); + stationRecordList.add(wellStationRecord); + } + + //3.存储新建的测站列表 + stationDataSource.save(stationRecordList); + + if (callback != null) { + callback.run(); + } + }); + } + + private String checkValidate(String projectId, String cycleId, + List groundLinkMiddleDataList, + List groundSideADataList, List groundSideBDataList) { + //如果是编辑页面就不检查 + if (!isDefaultPage) return null; + + //检测该测期下是否有同名测站 + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory.instance.getSurveyorStation(); + List currentStationList = + stationDataSource.getDataList(projectId, cycleId); + + //收集要创建的测站站点id + List expectedStationIds = new ArrayList<>(); + collectIdsFromList(expectedStationIds, groundLinkMiddleDataList); + collectIdsFromList(expectedStationIds, groundSideADataList); + collectIdsFromList(expectedStationIds, groundSideBDataList); + + if (currentStationList != null) {//遍历当前已有测站,检测是否有同名测站 + for (SurveyorStationRecord record : currentStationList) { + List items = record.getItems(); + if (items != null) {//检测测站名是否相同 + for (SurveyorPoint stationItem : items) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + for (String stationDetailItemId : expectedStationIds) {//遍历即将创建的测站列表,对比是否有相同的 + if (stationItem.getPointId().equals(stationDetailItemId)) { + PointRecord pointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationItem.getOriginalPointId()); + if (pointRecord != null) { + return pointRecord.getName(); + } + return ""; + } + } + break; + } + } + } + } + } + return null; + } + + private void collectIdsFromList(List collectIdList, List tagetList) { + for (StationDetailItem stationDetailItem : tagetList) { + String pointId = stationDetailItem.getOriginalPointId(); + if (!TextUtils.isEmpty(pointId)) { + collectIdList.add(pointId); + } + } + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellDoubleUnderGroundSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellDoubleUnderGroundSetupFragment.java new file mode 100644 index 0000000..3aba334 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellDoubleUnderGroundSetupFragment.java @@ -0,0 +1,382 @@ +package com.bingce.controlnetwork.fragment.station.line.well; + +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.ILineRecordDataSource; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecordOperate; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationConstants; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.station.line.AbstractLineStationWellDoubleUnderGroundSetupFragment; +import com.bingce.utils.IOnListGetCallback; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * 新建二井定向-地下 + */ +public class LineStationWellDoubleUnderGroundSetupFragment extends AbstractLineStationWellDoubleUnderGroundSetupFragment { + + public static final int titleCreate = R.string.title_create_well_line_station_double_under_ground; + public static final int titleEdit = R.string.title_edit_well_line_station_double_under_ground; + public static final String TAG = LineStationWellDoubleUnderGroundSetupFragment.class.getName(); + //区分是初始页面还是编辑页面 + private boolean isDefaultPage; + + public static void startCreate(Context context, String projectId, String periodId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_PERIOD_ID, periodId); + FragmentContainerActivity.start(context, TAG, titleCreate, bundle); + } + + public static void startEdit(Context context, String projectId, String batchId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_LINE_ID, batchId); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + FragmentContainerActivity.start(context, TAG, titleEdit, bundle); + } + + public static LineStationWellDoubleUnderGroundSetupFragment newInstance(Bundle bundle) { + LineStationWellDoubleUnderGroundSetupFragment fragment = new LineStationWellDoubleUnderGroundSetupFragment(); + fragment.setArguments(bundle); + return fragment; + } + + @Override + protected boolean initLeftRightMeasure() { + return false; + } + + @Override + protected int groundLinkLeftMinCount() { + return 1; + } + + @Override + protected int groundSideAMinCount() { + return 1; + } + + @Override + protected int steelAMinCount() { + return 1; + } + + @Override + protected int underGroundLinkMinCount() { + return 2; + } + + @Override + protected int steelBMinCount() { + return 1; + } + + @Override + protected int groundSideBMinCount() { + return 1; + } + + @Override + protected int groundLinkRightMinCount() { + return 1; + } + + @Override + protected void defaultItems(IOnListGetCallback callback) { + if (callback == null || getArguments() == null) { + return; + } + String batchId = getArguments().getString(BundleConstants.KEY_LINE_ID); + isDefaultPage = TextUtils.isEmpty(batchId); + if (isDefaultPage) { + callback.onGet(Arrays.asList( + new StationDetailItem( + Tools.getString(R.string.well_a_surface_connection_direction_limit), + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT, + null), + new StationDetailItem( + Tools.getString(R.string.well_a_surface_near_well_point), + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A, + null), + new StationDetailItem( + Tools.getString(R.string.a_well_wire), + StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A, + null), + new StationDetailItem( + Tools.getString(R.string.underground_connection_points_min_hint), + StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK, + null), + new StationDetailItem( + Tools.getString(R.string.b_well_wire), + StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B, + null), + new StationDetailItem( + Tools.getString(R.string.well_b_surface_near_well_point), + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B, + null), + new StationDetailItem( + Tools.getString(R.string.well_b_surface_connection_direction_limit), + StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT, + null) + )); + } else { + loadBatchRecord(batchId, callback); + } + } + + @Override + protected void setup(String projectId, String periodId, String lineName, + List groundLinkLeftDataList, List groundSideADataList, + List steelADataList, List underGroundLinkDataList, + List steelBDataList, List groundSideBDataList, + List groundLinkRightDataList, + Runnable callback) { + //判断数据是否准确 + if (groundLinkLeftDataList.size() < groundLinkLeftMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_LEFT); + return; + } + if (groundSideADataList.size() < groundSideAMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_A); + return; + } + if (steelADataList.size() < steelAMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_STEEL_A); + return; + } + if (underGroundLinkDataList.size() < underGroundLinkMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_UNDERGROUND_LINK); + return; + } + if (steelBDataList.size() < steelBMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_STEEL_B); + return; + } + if (groundSideBDataList.size() < groundSideBMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_SIDE_B); + return; + } + if (groundLinkRightDataList.size() < groundLinkRightMinCount()) { + showErrorMsgForWell(StationDetailItem.TYPE_WELL_DOUBLE_GROUND_LINK_RIGHT); + return; + } + + //存储钢丝点到数据库 + List stationDetailItemList = new ArrayList<>(); + stationDetailItemList.addAll(steelADataList); + stationDetailItemList.addAll(steelBDataList); + //save里有切换到子线程 + PointRecordOperate.saveStationDetailItemListToPointRecord(stationDetailItemList, projectId()); + + //切换线程 + ThreadPoolUtil.execute(() -> { + ILineRecordDataSource stationBatchDataSource = SurveyorDatabaseFactory + .instance.getLineRecordDatabase(); + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory + .instance.getSurveyorStation(); + + String lineId = ""; + if (getArguments() != null) { + lineId = getArguments().getString(BundleConstants.KEY_LINE_ID); + } + if (lineId != null && !lineId.isEmpty()) { + //0.删除原有导线和相关测站 + stationBatchDataSource.deleteSync(lineId); + stationDataSource.deleteByLineIdSync(lineId); + } + + String error = checkValidate(projectId, periodId, + groundSideADataList, + underGroundLinkDataList, + groundSideBDataList); + if (error != null && !error.isEmpty()) { + tipsError(error); + return; + } + //0.处理全局控制点 + PointUtil.globalToProjectControlPoint(groundLinkLeftDataList, projectId); + PointUtil.globalToProjectControlPoint(groundSideADataList, projectId); +// ProjectPointUtil.dealGlobalControlPoints2(steelADataList, projectId); + PointUtil.globalToProjectControlPoint(underGroundLinkDataList, projectId); +// ProjectPointUtil.dealGlobalControlPoints2(steelBDataList, projectId); + PointUtil.globalToProjectControlPoint(groundSideBDataList, projectId); + PointUtil.globalToProjectControlPoint(groundLinkRightDataList, projectId); + //1.创建并存储batch + List lineRecordPointList = getAdapterDataList(); + LineRecord batchRecord = LineRecord.well(LineRecord.TYPE_WELL_DOUBLE_UNDERGROUND, lineName, projectId, periodId, lineRecordPointList); + stationBatchDataSource.save(batchRecord); + + ProjectRecord projectRecord = currentProject(); + boolean showSlopDistance = true; + if (projectRecord != null) { + showSlopDistance = projectRecord.showSlopDistance; + } + + //2.创建测站列表 + long dateValue = (new Date()).getTime(); + List stationRecordList = new ArrayList<>(); + boolean needLeftRightSurveyor = needLeftRightSurveyor(); + + //A井地面近井点 + for (StationDetailItem itemSideA : groundSideADataList) { + List pointList = new ArrayList<>(); + pointList.add(itemSideA); + pointList.addAll(groundLinkLeftDataList); + pointList.addAll(steelADataList); + + SurveyorStationRecord wellStationRecord = SurveyorStationRecord.createWellStationRecord(dateValue++, + projectId, periodId, batchRecord.id, pointList); +// //设置站是否闭合 + if (pointList.size() > SurveyorStationConstants.AUTO_CLOSE_NUM_INCLUDE_STATION) { + wellStationRecord.setAutoClose(true); + } + wellStationRecord.setLeftAndRightSurveyor(needLeftRightSurveyor); + wellStationRecord.setShowSlopDistance(showSlopDistance); + stationRecordList.add(wellStationRecord); + } + + //地下连接点至少两个 + if (underGroundLinkDataList != null && !underGroundLinkDataList.isEmpty()) { + for (int i = 0; i < underGroundLinkDataList.size(); i++) { + List pointList = new ArrayList<>(); + pointList.add(underGroundLinkDataList.get(i)); + + if (i - 1 < 0) { + //第一个节点 + pointList.addAll(steelADataList); + } else { + pointList.add(underGroundLinkDataList.get(i - 1)); + } + + if (i + 1 > underGroundLinkDataList.size() - 1) { + pointList.addAll(steelBDataList); + } else { + pointList.add(underGroundLinkDataList.get(i + 1)); + } + + SurveyorStationRecord wellStationRecord = SurveyorStationRecord.createWellStationRecord(dateValue++, + projectId, periodId, batchRecord.id, pointList); + + //设置站是否闭合 + if (pointList.size() > SurveyorStationConstants.AUTO_CLOSE_NUM_INCLUDE_STATION) { + wellStationRecord.setAutoClose(true); + } + + wellStationRecord.setLeftAndRightSurveyor(needLeftRightSurveyor); + wellStationRecord.setShowSlopDistance(showSlopDistance); + stationRecordList.add(wellStationRecord); + } + } + + //B井地面近井点 + for (StationDetailItem itemSideB : groundSideBDataList) { + List pointList = new ArrayList<>(); + pointList.add(itemSideB); + pointList.addAll(steelBDataList); + pointList.addAll(groundLinkRightDataList); + + SurveyorStationRecord wellStationRecord = SurveyorStationRecord.createWellStationRecord(dateValue++, + projectId, periodId, batchRecord.id, pointList); + //设置站是否闭合 + if (pointList.size() > SurveyorStationConstants.AUTO_CLOSE_NUM_INCLUDE_STATION) { + wellStationRecord.setAutoClose(true); + } + wellStationRecord.setLeftAndRightSurveyor(needLeftRightSurveyor); + wellStationRecord.setShowSlopDistance(showSlopDistance); + stationRecordList.add(wellStationRecord); + } + + + //3.存储新建的测站列表 + stationDataSource.save(stationRecordList); + + if (callback != null) { + callback.run(); + } + }); + + } + + + @Override + protected String defaultLineName() { + return getString(R.string.station_type_well_wire_double); + } + + + private String checkValidate(String projectId, String cycleId, + List groundSideADataList, + List underGroundLinkDataList, + List groundSideBDataList) { + + //如果是编辑页面就不检查 + if (!isDefaultPage) return null; + + //检测该测期下是否有同名测站 + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory.instance.getSurveyorStation(); + List currentStationList = + stationDataSource.getDataList(projectId, cycleId); + + //收集要创建的测站站点id + List expectedStationIds = new ArrayList<>(); + collectIdsFromList(expectedStationIds, groundSideADataList); + collectIdsFromList(expectedStationIds, underGroundLinkDataList); + collectIdsFromList(expectedStationIds, groundSideBDataList); + + if (currentStationList != null) {//遍历当前已有测站,检测是否有同名测站 + for (SurveyorStationRecord record : currentStationList) { + List items = record.getItems(); + if (items != null) {//检测测站名是否相同 + for (SurveyorPoint stationItem : items) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + for (String stationDetailItemId : expectedStationIds) {//遍历即将创建的测站列表,对比是否有相同的 + if (stationItem.getPointId().equals(stationDetailItemId)) { + PointRecord pointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationItem.getOriginalPointId()); + if (pointRecord != null) { + return pointRecord.getName(); + } + return ""; + } + } + break; + } + } + } + } + } + return null; + } + + private void collectIdsFromList(List collectIdList, List tagetList) { + for (StationDetailItem stationDetailItem : tagetList) { + String pointId = stationDetailItem.getOriginalPointId(); + if (!TextUtils.isEmpty(pointId)) { + collectIdList.add(pointId); + } + } + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellSetupFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellSetupFragment.java new file mode 100644 index 0000000..ff2de9c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/station/line/well/LineStationWellSetupFragment.java @@ -0,0 +1,312 @@ +package com.bingce.controlnetwork.fragment.station.line.well; + +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.ILineRecordDataSource; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecordOperate; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationConstants; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.controlapphelper.util.PointUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.station.line.AbstractLineStationWellSetupFragment; +import com.bingce.utils.IOnListGetCallback; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + + +/** + * 新建一井定向 + */ +public class LineStationWellSetupFragment extends AbstractLineStationWellSetupFragment { + + public static final int titleCreate = R.string.title_create_well_line_station; + public static final int titleEdit = R.string.title_edit_well_line_station; + public static final String TAG = LineStationWellSetupFragment.class.getName(); + //区分是初始页面还是编辑页面 + private boolean isDefaultPage; + + public static void startCreate(Context context, String projectId, String periodId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + bundle.putString(BundleConstants.KEY_PERIOD_ID, periodId); + FragmentContainerActivity.start(context, TAG, titleCreate, bundle); + } + + public static void startEdit(Context context, String projectId, String batchId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_LINE_ID, batchId); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + FragmentContainerActivity.start(context, TAG, titleEdit, bundle); + } + + public static LineStationWellSetupFragment newInstance(Bundle bundle) { + LineStationWellSetupFragment fragment = new LineStationWellSetupFragment(); + fragment.setArguments(bundle); + return fragment; + } + + @Override + protected boolean initLeftRightMeasure() { + return false; + } + + @Override + protected void defaultItems(IOnListGetCallback callback) { + if (callback == null || getArguments() == null) { + return; + } + String batchId = getArguments().getString(BundleConstants.KEY_LINE_ID); + isDefaultPage = TextUtils.isEmpty(batchId); + if (isDefaultPage) { + callback.onGet(Arrays.asList( + new StationDetailItem( + Tools.getString(R.string.ground_connection_direction_one_or_two), + StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK, + null), + new StationDetailItem( + Tools.getString(R.string.surface_near_well_point), + StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE, + null), + new StationDetailItem( + Tools.getString(R.string.steel_wire_two_or_three), + StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE, + null), + new StationDetailItem( + Tools.getString(R.string.underground_near_well_point), + StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE, + null), + new StationDetailItem( + Tools.getString(R.string.underground_connection_direction_one_or_two), + StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK, + null) + )); + } else { + loadBatchRecord(batchId, callback); + } + } + + @Override + protected int groundLinkMinCount() { + return 1; + } + + @Override + protected int groundSideMinCount() { + return 1; + } + + @Override + protected int steelWireMinCount() { + return 2; + } + + @Override + protected int undergroundSideMinCount() { + return 1; + } + + @Override + protected int undergroundLinkMinCount() { + return 1; + } + + @Override + protected String defaultLineName() { + return getString(R.string.station_type_well_wire); + } + + @Override + protected void setup(String projectId, String cycleId, String lineName, + List groundLinkDataList, List groundSideDataList, + List steelWireDataList, List ungroundLinkDataList, + List ungroundSideDataList, Runnable callback) { + //判断数据是否准确 + if (groundLinkDataList.size() < groundLinkMinCount()) { + showErrorMsgForWell(StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_LINK); + return; + } + if (groundSideDataList.size() < groundSideMinCount()) { + showErrorMsgForWell(StationDetailItem.ITEM_TYPE_WELL_GROUP_GROUND_SIDE); + return; + } + if (steelWireDataList.size() < steelWireMinCount()) { + showErrorMsgForWell(StationDetailItem.ITEM_TYPE_WELL_GROUP_STEEL_WIRE); + return; + } + if (ungroundLinkDataList.size() < undergroundLinkMinCount()) { + showErrorMsgForWell(StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_LINK); + return; + } + if (ungroundSideDataList.size() < undergroundSideMinCount()) { + showErrorMsgForWell(StationDetailItem.ITEM_TYPE_WELL_GROUP_UNDERGROUND_SIDE); + return; + } + + //存储钢丝点到数据库 + List stationDetailItemList = new ArrayList<>(); + stationDetailItemList.addAll(steelWireDataList); + //save里有切换到子线程 + PointRecordOperate.saveStationDetailItemListToPointRecord(stationDetailItemList, projectId()); + + //切换线程 + ThreadPoolUtil.execute(() -> { + ILineRecordDataSource stationBatchDataSource = SurveyorDatabaseFactory + .instance.getLineRecordDatabase(); + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory + .instance.getSurveyorStation(); + + String lineId = ""; + if (getArguments() != null) { + lineId = getArguments().getString(BundleConstants.KEY_LINE_ID); + } + if (lineId != null && !lineId.isEmpty()) { + //0.删除原有导线和相关测站 + stationBatchDataSource.deleteSync(lineId); + stationDataSource.deleteByLineIdSync(lineId); + } + + String error = checkValidate(projectId, cycleId, + groundSideDataList, ungroundSideDataList); + if (error != null && !error.isEmpty()) { + tipsError(error); + return; + } + //0.处理全局控制点 + PointUtil.globalToProjectControlPoint(groundLinkDataList, projectId); + PointUtil.globalToProjectControlPoint(groundSideDataList, projectId); + PointUtil.globalToProjectControlPoint(steelWireDataList, projectId); + PointUtil.globalToProjectControlPoint(ungroundLinkDataList, projectId); + PointUtil.globalToProjectControlPoint(ungroundSideDataList, projectId); + //1.创建并存储batch + List lineRecordPointList = getAdapterDataList(); + LineRecord batchRecord = LineRecord.well(LineRecord.TYPE_WELL, lineName, projectId, cycleId, lineRecordPointList); + stationBatchDataSource.save(batchRecord); + + ProjectRecord projectRecord = currentProject(); + boolean showSlopDistance = true; + if (projectRecord != null) { + showSlopDistance = projectRecord.showSlopDistance; + } + + //2.创建测站列表 + long dateValue = (new Date()).getTime(); + List stationRecordList = new ArrayList<>(); + boolean needLeftRightSurveyor = needLeftRightSurveyor(); + + for (StationDetailItem groundStationDetailItem : groundSideDataList) { + List pointList = new ArrayList<>(); + pointList.add(groundStationDetailItem); + //添加地上观测点 + pointList.addAll(groundLinkDataList); + //添加钢丝点 + pointList.addAll(steelWireDataList); + SurveyorStationRecord wellStationRecord = SurveyorStationRecord.createWellStationRecord(dateValue++, + projectId, cycleId, batchRecord.id, pointList); + //设置站是否闭合 + if (pointList.size() > SurveyorStationConstants.AUTO_CLOSE_NUM_INCLUDE_STATION) { + wellStationRecord.setAutoClose(true); + } + wellStationRecord.setLeftAndRightSurveyor(needLeftRightSurveyor); + wellStationRecord.setShowSlopDistance(showSlopDistance); + stationRecordList.add(wellStationRecord); + } + + for (StationDetailItem ungroundStationDetailItem : ungroundSideDataList) { + List pointList = new ArrayList<>(); + pointList.add(ungroundStationDetailItem); + //添加地下观测点 + pointList.addAll(ungroundLinkDataList); + //添加钢丝点 + pointList.addAll(steelWireDataList); + SurveyorStationRecord wellStationRecord = SurveyorStationRecord.createWellStationRecord(dateValue++, + projectId, cycleId, batchRecord.id, pointList); + //设置站是否闭合 + if (pointList.size() > SurveyorStationConstants.AUTO_CLOSE_NUM_INCLUDE_STATION) { + wellStationRecord.setAutoClose(true); + } + + wellStationRecord.setLeftAndRightSurveyor(needLeftRightSurveyor); + wellStationRecord.setShowSlopDistance(showSlopDistance); + stationRecordList.add(wellStationRecord); + } + + + //3.存储新建的测站列表 + stationDataSource.save(stationRecordList); + + if (callback != null) { + callback.run(); + } + }); + } + + private String checkValidate(String projectId, String cycleId, + List groundSideDataList, + List ungroundSideDataList) { + //如果是编辑页面就不检查 + if (!isDefaultPage) return null; + + //检测该测期下是否有同名测站 + ISurveyorStationDataSource stationDataSource = SurveyorDatabaseFactory.instance.getSurveyorStation(); + List currentStationList = + stationDataSource.getDataList(projectId, cycleId); + + //收集要创建的测站站点id + List expectedStationIds = new ArrayList<>(); + collectIdsFromList(expectedStationIds, groundSideDataList); + collectIdsFromList(expectedStationIds, ungroundSideDataList); + + if (currentStationList != null) {//遍历当前已有测站,检测是否有同名测站 + for (SurveyorStationRecord record : currentStationList) { + List items = record.getItems(); + if (items != null) {//检测测站名是否相同 + for (SurveyorPoint stationItem : items) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + for (String stationDetailItemId : expectedStationIds) {//遍历即将创建的测站列表,对比是否有相同的 + if (stationItem.getPointId().equals(stationDetailItemId)) { + PointRecord pointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationItem.getOriginalPointId()); + if (pointRecord != null) { + return pointRecord.getName(); + } + return ""; + } + } + break; + } + } + } + } + } + return null; + } + + private void collectIdsFromList(List collectIdList, List tagetList) { + for (StationDetailItem stationDetailItem : tagetList) { + String pointId = stationDetailItem.getOriginalPointId(); + if (!TextUtils.isEmpty(pointId)) { + collectIdList.add(pointId); + } + } + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationdetail/SingleStationDetailAndEditFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationdetail/SingleStationDetailAndEditFragment.java new file mode 100644 index 0000000..1102918 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationdetail/SingleStationDetailAndEditFragment.java @@ -0,0 +1,211 @@ +package com.bingce.controlnetwork.fragment.stationdetail; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; + +import com.bingce.controlapphelper.datasource.database.ProjectType; +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.util.StationUtil; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.utils.ThreadPoolUtil; + +import org.jetbrains.annotations.NotNull; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.FragmentSurveyorStationDetailOrEditLayoutBinding; +import com.bingce.controlnetwork.fragment.station.defaultstation.ComponentSingleStationPointListFragment; + +/** + * 测站详情--包含编辑测点、站点功能,可能是「多测回测角」,也可能是「导线测站」中某站 + */ +public class SingleStationDetailAndEditFragment extends BaseFragment { + public static final int title = R.string.title_surveyor_station_edit; + public static final String TAG = SingleStationDetailAndEditFragment.class.getName(); + + private StationDetailViewModel stationDetailViewModel; + + private FragmentSurveyorStationDetailOrEditLayoutBinding mBinding; + private String stationId; + private boolean isHasDataForStation;//测站是否有测量记录 + + + @Override + public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + mBinding = FragmentSurveyorStationDetailOrEditLayoutBinding.inflate(inflater, container, false); + return mBinding.getRoot(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + mBinding = null; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (getArguments() == null) { + return; + } + + stationDetailViewModel = new ViewModelProvider(requireActivity()).get(StationDetailViewModel.class); + + //创建显示点列表的fragment + stationId = getArguments().getString(BundleConstants.KEY_SURVEYOR_STATION_ID); + String projectId = getArguments().getString(BundleConstants.KEY_PROJECT_ID); + //添加fragment + getChildFragmentManager() + .beginTransaction() + .replace(R.id.fragment_container, + ComponentSingleStationPointListFragment.newInstance(stationId, projectId), + ComponentSingleStationPointListFragment.TAG) + .commit(); + initData(); + } + + private void initListener() { + stationDetailViewModel.pointSurveyorCount().observe(getViewLifecycleOwner(), this::refreshViewCheckEnable); + + mBinding.autoCloseSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> updateStationAutoClose(isChecked)); + + mBinding.leftRightSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> updateStationLeftRightSurveyor(isChecked)); + } + + + private void initData() { + ThreadPoolUtil.execute(() -> { + SurveyorStationRecord stationRecord = SurveyorDatabaseFactory.instance.getSurveyorStation().getRecordSync(stationId); + if (stationRecord == null) { + throw new NullPointerException("SingleStationDetailAndEditFragment,stationRecord==null"); + } + ProjectRecord projectRecord = SurveyorDatabaseFactory.instance.getProjectDataSource().getRecord(stationRecord.getProjectId()); + if (projectRecord == null) { + throw new NullPointerException("SingleStationDetailAndEditFragment,projectRecord==null"); + } + + + setUiVisiableHint(stationRecord, projectRecord); + }); + + } + + private void refreshViewCheckEnable(int surveyorPointSize) { + if (isVisiable(mBinding.leftRightSwitch)) { + boolean canLeftOrRightSurveyor = StationUtil.isCanLeftOrRightSurveyor(surveyorPointSize); + boolean checkNew = canLeftOrRightSurveyor && mBinding.leftRightSwitch.isChecked(); + mBinding.leftRightSwitch.setChecked(checkNew); + + mBinding.leftRightSwitch.setEnabled(canLeftOrRightSurveyor); + } + if (isVisiable(mBinding.autoCloseSwitch)) { + boolean canZeroSurveyor = StationUtil.isCanZeroSurveyor(surveyorPointSize); + boolean checkNew = canZeroSurveyor && mBinding.autoCloseSwitch.isChecked(); + mBinding.autoCloseSwitch.setChecked(checkNew); + + mBinding.autoCloseSwitch.setEnabled(canZeroSurveyor); + } + } + + private boolean isVisiable(View view) { + return view.getVisibility() == View.VISIBLE; + } + + /** + * 当联系测量和高程导线,或者测站有记录禁止编辑 + */ + private void setUiVisiableHint(SurveyorStationRecord stationRecord, ProjectRecord projectRecord) { + long surveyorRecordCount = SurveyorDatabaseFactory + .instance + .getSurveyorRecordDataSource() + .recordCount(stationRecord.getId()); + + isHasDataForStation = surveyorRecordCount > 0; + + runOnUI(() -> { + if (!isTriangleProject(projectRecord)) { + mBinding.autoCloseSwitch.setVisibility(View.GONE); + mBinding.leftRightSwitch.setVisibility(View.GONE); + mBinding.tips.setText(R.string.tips_forbid_edit_line_station); + } else { + + if (stationRecord.isLineStation()) { + mBinding.tips.setText(R.string.tips_forbid_edit_line_station); + } else { + if (isHasDataForStation) { + mBinding.tips.setText(R.string.station_point_edit_tips2); + } + } + } + + mBinding.leftRightSwitch.setChecked(stationRecord.leftAndRightSurveyor); + mBinding.autoCloseSwitch.setChecked(stationRecord.autoClose); + refreshViewCheckEnable(stationRecord.items.size() - 1); + + initListener(); + }); + } + + private void updateStationAutoClose(boolean autoClose) { + ThreadPoolUtil.execute(() -> { + ISurveyorStationDataSource surveyorStationDataSource = + SurveyorDatabaseFactory + .instance + .getSurveyorStation(); + SurveyorStationRecord surveyorStationRecord = + surveyorStationDataSource.getRecordSync(stationId); + //修改 + surveyorStationRecord.setAutoClose(autoClose); + //存储 + surveyorStationDataSource.save(surveyorStationRecord); + }); + } + + private void updateStationLeftRightSurveyor(boolean leftRightSurveyor) { + ThreadPoolUtil.execute(() -> { + ISurveyorStationDataSource surveyorStationDataSource = + SurveyorDatabaseFactory + .instance + .getSurveyorStation(); + SurveyorStationRecord surveyorStationRecord = + surveyorStationDataSource.getRecordSync(stationId); + //修改 + surveyorStationRecord.setLeftAndRightSurveyor(leftRightSurveyor); + //存储 + surveyorStationDataSource.save(surveyorStationRecord); + }); + } + + public static void start(Context context, String surveyorStationId, + String surveyorStationName, String projectId) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_SURVEYOR_STATION_ID, surveyorStationId); + bundle.putString(BundleConstants.KEY_SURVEYOR_STATION_NAME, surveyorStationName); + bundle.putString(BundleConstants.KEY_PROJECT_ID, projectId); + FragmentContainerActivity.start(context, TAG, context.getString(title) + "-" + surveyorStationName, bundle); + } + + public static SingleStationDetailAndEditFragment newInstance(Bundle bundle) { + SingleStationDetailAndEditFragment fragment = new SingleStationDetailAndEditFragment(); + fragment.setArguments(bundle); + return fragment; + } + + + public boolean isTriangleProject(ProjectRecord projectRecord) { + return projectRecord.getProjectType() == null || projectRecord.getProjectType().equals(ProjectType.TRIANGLE.getFlag()); + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationdetail/StationDetailViewModel.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationdetail/StationDetailViewModel.java new file mode 100644 index 0000000..dcfeba8 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationdetail/StationDetailViewModel.java @@ -0,0 +1,17 @@ +package com.bingce.controlnetwork.fragment.stationdetail; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class StationDetailViewModel extends ViewModel { + private final MutableLiveData pointSurveyorCount = new MutableLiveData<>(); + + public LiveData pointSurveyorCount() { + return pointSurveyorCount; + } + + public void setPointSurveyorCount(int count) { + pointSurveyorCount.setValue(count); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/BaseStationSettingFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/BaseStationSettingFragment.kt new file mode 100644 index 0000000..eea4028 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/BaseStationSettingFragment.kt @@ -0,0 +1,49 @@ +package com.bingce.controlnetwork.fragment.stationsetting + +import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import com.bingce.controlnetwork.fragment.base.BaseFragment +import com.bingce.controlnetwork.R + +abstract class BaseStationSettingFragment : BaseFragment() { + + companion object { + const val DEFAULT_TEMPERATURE = "12" + const val DEFAULT_HUMIDITY = "60" + const val DEFAULT_AIR_PRESSURE = "1013.3" + const val DEFAULT_CONSTANT = "0" + const val DEFAULT_INSTRUMEN_HEIGHT = "0" + + const val KEY_SURVEYOR_STATION_ID = "___surveyor_station_id___" + + } + + protected abstract fun clickConfirm() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setHasOptionsMenu(true) + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.menu_confirm, menu) + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (R.id.menu_confirm === item.itemId) { + clickConfirm() + } + return super.onOptionsItemSelected(item) + } + + /** + * 返回非空测站id + */ + fun stationId(): String { + return requireArguments().getString(KEY_SURVEYOR_STATION_ID)!! + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/StationSettingHeightTraverseFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/StationSettingHeightTraverseFragment.kt new file mode 100644 index 0000000..24df454 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/StationSettingHeightTraverseFragment.kt @@ -0,0 +1,496 @@ +package com.bingce.controlnetwork.fragment.stationsetting + +import android.content.Context +import android.os.Bundle +import android.text.TextUtils +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText +import androidx.annotation.WorkerThread +import blankj.utilcode.util.ToastUtils +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants +import com.bingce.controlapphelper.datasource.database.config.ConfigRecord +import com.bingce.controlapphelper.datasource.database.heighttraverse.stationsetting.model.StationSettingHeightTraverseRecord +import com.bingce.controlapphelper.util.Tools +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.databinding.FragmentStationSettingHeightTraverseBinding +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class StationSettingHeightTraverseFragment : BaseStationSettingFragment() { + + + private var _binding: FragmentStationSettingHeightTraverseBinding? = null + + val mBinding get() = _binding!! + + private val mainScope = MainScope() + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = + FragmentStationSettingHeightTraverseBinding.inflate(inflater, container, false) + return mBinding.root + } + + override fun onDestroyView() { + super.onDestroyView() + mainScope.cancel() + _binding = null + + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initView() + initData() + initListener() + } + + private fun initListener() { + + //距离修正参数 + mBinding.ilTitle1.button1.setOnClickListener { + //默认设置 + setDataFromRecord(null) + } + + mBinding.ilTitle1.button2.setOnClickListener { + //使用上次数据 + setDataFromLast() + } + + //仪器高,棱镜高 + mBinding.ilInstrumentHeight.button1.setOnClickListener { + mBinding.ilInstrumentHeight.etValueAfter.setText( + getEtText(mBinding.ilInstrumentHeight.etValueBefore) + ) + } + mBinding.ilBackPrismHeight.button1.setOnClickListener { + mBinding.ilBackPrismHeight.etValueAfter.setText( + getEtText(mBinding.ilBackPrismHeight.etValueBefore) + ) + } + mBinding.ilFrontPrismHeight.button1.setOnClickListener { + mBinding.ilFrontPrismHeight.etValueAfter.setText( + getEtText(mBinding.ilFrontPrismHeight.etValueBefore) + ) + } + + } + + private fun setDataFromLast() { + mainScope.launch { + val record = withContext(Dispatchers.IO) { + val dryTemperature = getValueFromLastKey(ConfigConstants.KEY_LAST_DRY_TEMPERATURE) + val humidityTemperature = + getValueFromLastKey(ConfigConstants.KEY_LAST_HUMIDITY_TEMPERATURE) + val airPressure = getValueFromLastKey(ConfigConstants.KEY_LAST_AIR_PRESSURE) + val additionConstant = + getValueFromLastKey(ConfigConstants.KEY_LAST_ADDITION_CONSTANT) + val multiplicationConstant = + getValueFromLastKey(ConfigConstants.KEY_LAST_MULTIPLICATION_CONSTANT) + val instrumentHeightBefore = + getValueFromLastKey(ConfigConstants.KEY_LAST_INSTRUMENT_HEIGHT_BEFORE) + val instrumentHeightAfter = + getValueFromLastKey(ConfigConstants.KEY_LAST_INSTRUMENT_HEIGHT_AFTER) + val backPrismHeightBefore = + getValueFromLastKey(ConfigConstants.KEY_LAST_BACK_PRISM_HEIGHT_BEFORE) + val backPrismHeightAfter = + getValueFromLastKey(ConfigConstants.KEY_LAST_BACK_PRISM_HEIGHT_AFTER) + val frontPrismHeightBefore = + getValueFromLastKey(ConfigConstants.KEY_LAST_FRONT_PRISM_HEIGHT_BEFORE) + val frontPrismHeightAfter = + getValueFromLastKey(ConfigConstants.KEY_LAST_FRONT_PRISM_HEIGHT_AFTER) + + if (dryTemperature == null + || humidityTemperature == null + || airPressure == null + || additionConstant == null + || multiplicationConstant == null + || instrumentHeightBefore == null + || instrumentHeightAfter == null + || backPrismHeightBefore == null + || backPrismHeightAfter == null + || frontPrismHeightBefore == null + || frontPrismHeightAfter == null + ) { + return@withContext null + } + + StationSettingHeightTraverseRecord.newInstance( + stationId(), + dryTemperature, + humidityTemperature, + airPressure, + additionConstant, + multiplicationConstant, + instrumentHeightBefore, + instrumentHeightAfter, + backPrismHeightBefore, + backPrismHeightAfter, + frontPrismHeightBefore, + frontPrismHeightAfter + ) + } + + setDataFromRecord(record) + } + } + + private fun getValueFromLastKey(key: String): String? { + val record = + SurveyorDatabaseFactory.instance.configDataSource.getByKeySync(key) + return record?.configValue + } + + private fun initData() { + + mainScope.launch { + val record = withContext(Dispatchers.IO) { + SurveyorDatabaseFactory.instance.getStationSettingHeightTraverseDataSource() + .getRecordByStationId(stationId()) + } + setDataFromRecord(record) + } + } + + private fun setDataFromRecord(record: StationSettingHeightTraverseRecord?) { + mBinding.ilDryTemperature.etValue.setText( + record?.dryTemperature ?: DEFAULT_TEMPERATURE + ) + mBinding.ilHumidityTemperature.etValue.setText( + record?.humidityTemperature ?: DEFAULT_TEMPERATURE + ) + mBinding.ilAirPressure.etValue.setText(record?.airPressure ?: DEFAULT_AIR_PRESSURE) + mBinding.ilAdditionConstant.etValue.setText( + record?.additionConstant ?: DEFAULT_CONSTANT + ) + mBinding.ilmultiplicationConstant.etValue.setText( + record?.multiplicationConstant ?: DEFAULT_CONSTANT + ) + + mBinding.ilInstrumentHeight.etValueBefore.setText( + record?.instrumentHeightBefore ?: DEFAULT_INSTRUMEN_HEIGHT + ) + mBinding.ilInstrumentHeight.etValueAfter.setText( + record?.instrumentHeightAfter ?: DEFAULT_INSTRUMEN_HEIGHT + ) + mBinding.ilBackPrismHeight.etValueBefore.setText( + record?.backPrismHeightBefore ?: DEFAULT_INSTRUMEN_HEIGHT + ) + mBinding.ilBackPrismHeight.etValueAfter.setText( + record?.backPrismHeightAfter ?: DEFAULT_INSTRUMEN_HEIGHT + ) + mBinding.ilFrontPrismHeight.etValueBefore.setText( + record?.frontPrismHeightBefore ?: DEFAULT_INSTRUMEN_HEIGHT + ) + mBinding.ilFrontPrismHeight.etValueAfter.setText( + record?.frontPrismHeightAfter ?: DEFAULT_INSTRUMEN_HEIGHT + ) + } + + + private fun initView() { + mBinding.ilTitle1.title.text = Tools.getString(R.string.distance_correction_parameter) + mBinding.ilTitle1.button1.text = Tools.getString(R.string.default_setting) + mBinding.ilTitle1.button2.text = Tools.getString(R.string.button_use_last_station_settings) + + mBinding.ilTitle2.title.text = Tools.getString(R.string.instrument_height_prism_height_m) + + + mBinding.ilDryTemperature.tvName.text = getString(R.string.dry_temperature) + mBinding.ilDryTemperature.etValue.hint = getString(R.string.dry_temperature) + mBinding.ilDryTemperature.tvUnit.text = "℃" + + mBinding.ilHumidityTemperature.tvName.text = getString(R.string.humidity_temperature) + mBinding.ilHumidityTemperature.etValue.hint = getString(R.string.humidity_temperature) + mBinding.ilHumidityTemperature.tvUnit.text = "℃" + + mBinding.ilAirPressure.tvName.text = getString(R.string.hint_air_pressure) + mBinding.ilAirPressure.etValue.hint = getString(R.string.hint_air_pressure) + mBinding.ilAirPressure.tvUnit.text = "hPa" + + mBinding.ilAdditionConstant.tvName.text = getString(R.string.addition_constant) + mBinding.ilAdditionConstant.etValue.hint = getString(R.string.addition_constant) + mBinding.ilAdditionConstant.tvUnit.text = "mm" + + mBinding.ilmultiplicationConstant.tvName.text = getString(R.string.multiplication_constant) + mBinding.ilmultiplicationConstant.etValue.hint = getString(R.string.multiplication_constant) + mBinding.ilmultiplicationConstant.tvUnit.text = "ppm" + + mBinding.ilInstrumentHeight.tvName.text = getString(R.string.instrument_height) + mBinding.ilBackPrismHeight.tvName.text = getString(R.string.back_prism_height) + mBinding.ilFrontPrismHeight.tvName.text = getString(R.string.front_prism_height) + } + + companion object { + + @JvmField + val TAG: String = StationSettingHeightTraverseFragment::class.java.name + + @JvmStatic + fun newInstance(bundle: Bundle?): StationSettingHeightTraverseFragment { + val fragment = StationSettingHeightTraverseFragment() + fragment.arguments = bundle + return fragment + } + + @JvmStatic + fun start(context: Context, surveyorStationId: String?) { + val bundle = Bundle() + bundle.putString(KEY_SURVEYOR_STATION_ID, surveyorStationId) + FragmentContainerActivity.start( + context, + TAG, + R.string.title_instrument_prism_setting, + bundle + ) + } + } + + override fun clickConfirm() { + + mainScope.launch(Dispatchers.IO) { + if (checkConfirmEmpty()) { + return@launch + } + + val stationId = stationId() + + val stationSettingHeightTraverseRecord = + SurveyorDatabaseFactory.instance.getStationSettingHeightTraverseDataSource() + .getRecordByStationId(stationId) + + + val dryTemperature = getEtText(mBinding.ilDryTemperature.etValue) + val humidityTemperature = getEtText(mBinding.ilHumidityTemperature.etValue) + val airPressure = getEtText(mBinding.ilAirPressure.etValue) + val additionConstant = getEtText(mBinding.ilAdditionConstant.etValue) + val multiplicationConstant = getEtText(mBinding.ilmultiplicationConstant.etValue) + val instrumentHeightBefore = getEtText(mBinding.ilInstrumentHeight.etValueBefore) + val instrumentHeightAfter = getEtText(mBinding.ilInstrumentHeight.etValueAfter) + val backPrismHeightBefore = getEtText(mBinding.ilBackPrismHeight.etValueBefore) + val backPrismHeightAfter = getEtText(mBinding.ilBackPrismHeight.etValueAfter) + val frontPrismHeightBefore = getEtText(mBinding.ilFrontPrismHeight.etValueBefore) + val frontPrismHeightAfter = getEtText(mBinding.ilFrontPrismHeight.etValueAfter) + + if (stationSettingHeightTraverseRecord == null) { + val stationSettingHeightTraverseRecordNew = + StationSettingHeightTraverseRecord.newInstance( + stationId, + dryTemperature, + humidityTemperature, + airPressure, + additionConstant, + multiplicationConstant, + instrumentHeightBefore, + instrumentHeightAfter, + backPrismHeightBefore, + backPrismHeightAfter, + frontPrismHeightBefore, + frontPrismHeightAfter + ) + SurveyorDatabaseFactory.instance.getStationSettingHeightTraverseDataSource() + .saveRecord(stationSettingHeightTraverseRecordNew) + } else { + stationSettingHeightTraverseRecord.dryTemperature = dryTemperature + stationSettingHeightTraverseRecord.humidityTemperature = humidityTemperature + stationSettingHeightTraverseRecord.airPressure = airPressure + stationSettingHeightTraverseRecord.additionConstant = additionConstant + stationSettingHeightTraverseRecord.multiplicationConstant = multiplicationConstant + stationSettingHeightTraverseRecord.instrumentHeightBefore = instrumentHeightBefore + stationSettingHeightTraverseRecord.instrumentHeightAfter = instrumentHeightAfter + stationSettingHeightTraverseRecord.backPrismHeightBefore = backPrismHeightBefore + stationSettingHeightTraverseRecord.backPrismHeightAfter = backPrismHeightAfter + stationSettingHeightTraverseRecord.frontPrismHeightBefore = frontPrismHeightBefore + stationSettingHeightTraverseRecord.frontPrismHeightAfter = frontPrismHeightAfter + SurveyorDatabaseFactory.instance.getStationSettingHeightTraverseDataSource() + .updateRecord(stationSettingHeightTraverseRecord) + } + + val stationRecord = + SurveyorDatabaseFactory.instance.surveyorStation.getRecordSync(stationId) + if (stationRecord != null) { + stationRecord.instrumentHeight = instrumentHeightBefore + if (!stationRecord.items.isNullOrEmpty()) { + stationRecord.items.last().prismHeight = frontPrismHeightBefore + if (stationRecord.items.size > 2) { + stationRecord.items[1].prismHeight = backPrismHeightBefore + } + } + } + SurveyorDatabaseFactory.instance.surveyorStation.update(stationRecord) + + saveLastData( + dryTemperature, + humidityTemperature, + airPressure, + additionConstant, + multiplicationConstant, + instrumentHeightBefore, + instrumentHeightAfter, + backPrismHeightBefore, + backPrismHeightAfter, + frontPrismHeightBefore, + frontPrismHeightAfter + ) + + ToastUtils.showShort(R.string.save_success) + requireActivity().finish() + + } + + } + + @WorkerThread + private fun saveLastData( + dryTemperature: String, + humidityTemperature: String, + airPressure: String, + additionConstant: String, + multiplicationConstant: String, + instrumentHeightBefore: String, + instrumentHeightAfter: String, + backPrismHeightBefore: String, + backPrismHeightAfter: String, + frontPrismHeightBefore: String, + frontPrismHeightAfter: String + ) { + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_DRY_TEMPERATURE, + dryTemperature + ) + ) + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_HUMIDITY_TEMPERATURE, + humidityTemperature + ) + ) + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_AIR_PRESSURE, + airPressure + ) + ) + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_ADDITION_CONSTANT, + additionConstant + ) + ) + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_MULTIPLICATION_CONSTANT, + multiplicationConstant + ) + ) + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_INSTRUMENT_HEIGHT_BEFORE, + instrumentHeightBefore + ) + ) + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_INSTRUMENT_HEIGHT_AFTER, + instrumentHeightAfter + ) + ) + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_BACK_PRISM_HEIGHT_BEFORE, + backPrismHeightBefore + ) + ) + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_BACK_PRISM_HEIGHT_AFTER, + backPrismHeightAfter + ) + ) + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_FRONT_PRISM_HEIGHT_BEFORE, + frontPrismHeightBefore + ) + ) + SurveyorDatabaseFactory.instance.configDataSource.recordSync( + ConfigRecord( + ConfigConstants.KEY_LAST_FRONT_PRISM_HEIGHT_AFTER, + frontPrismHeightAfter + ) + ) + } + + + private fun checkConfirmEmpty(): Boolean { + if (editTextEmpty(mBinding.ilDryTemperature.etValue)) { + ToastUtils.showShort(R.string.please_enter_dry_temperature) + return true + } + if (editTextEmpty(mBinding.ilHumidityTemperature.etValue)) { + ToastUtils.showShort(R.string.please_enter_humidity_temperature) + return true + } + if (editTextEmpty(mBinding.ilAirPressure.etValue)) { + ToastUtils.showShort(Tools.getString(R.string.please_enter_air_pressure)) + return true + } + if (editTextEmpty(mBinding.ilAdditionConstant.etValue)) { + ToastUtils.showShort(R.string.please_enter_addition_constant) + return true + } + if (editTextEmpty(mBinding.ilmultiplicationConstant.etValue)) { + ToastUtils.showShort(R.string.please_enter_multiplication_constant) + return true + } + + if (editTextEmpty(mBinding.ilInstrumentHeight.etValueBefore)) { + ToastUtils.showShort(R.string.please_enter_instrument_height_before) + return true + } + if (editTextEmpty(mBinding.ilInstrumentHeight.etValueAfter)) { + ToastUtils.showShort(R.string.please_enter_instrument_height_after) + return true + } + if (editTextEmpty(mBinding.ilBackPrismHeight.etValueBefore)) { + ToastUtils.showShort(R.string.please_enter_back_prism_height_before) + return true + } + if (editTextEmpty(mBinding.ilBackPrismHeight.etValueAfter)) { + ToastUtils.showShort(R.string.please_enter_back_prism_height_after) + return true + } + if (editTextEmpty(mBinding.ilFrontPrismHeight.etValueBefore)) { + ToastUtils.showShort(R.string.please_enter_front_prism_height_before) + return true + } + if (editTextEmpty(mBinding.ilFrontPrismHeight.etValueAfter)) { + ToastUtils.showShort(R.string.please_enter_front_prism_height_after) + return true + } + return false + } + + + private fun editTextEmpty(et: EditText): Boolean { + return TextUtils.isEmpty(getEtText(et)) + } + + private fun getEtText(et: EditText) = et.text.toString().trim() + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/StationSettingsFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/StationSettingsFragment.java new file mode 100644 index 0000000..60bf388 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsetting/StationSettingsFragment.java @@ -0,0 +1,752 @@ +package com.bingce.controlnetwork.fragment.stationsetting; + +import android.content.Context; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.CheckBox; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.ConfigRecord; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.point.IPointDataSource; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.prism.IPrismManagerDataSource; +import com.bingce.controlapphelper.datasource.database.prism.PrismRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.util.HideKeyUtil; +import com.bingce.controlapphelper.util.StationUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.adapter.BaseAdapter; +import com.bingce.controlnetwork.adapter.SpinnerAdapter; +import com.bingce.utils.ThreadPoolUtil; +import com.rengwuxian.materialedittext.MaterialEditText; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.adapter.BaseAdapter; +import com.bingce.controlnetwork.adapter.SpinnerAdapter; + +/** + * 仪器棱镜设置 + */ +public class StationSettingsFragment extends BaseStationSettingFragment { + public static final String TAG = StationSettingsFragment.class.getName(); + private SurveyorStationRecord surveyorStationRecord; + private _Adapter adapter = null; + private List prismRecords; + + private StationSettingsFragment() { + super(); + } + + @Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_list_layout, container, false); + RecyclerView recyclerView = view.findViewById(R.id.list); + if (recyclerView != null && getArguments() != null) { + String stationId = getArguments().getString(KEY_SURVEYOR_STATION_ID); + ThreadPoolUtil.execute(() -> { + surveyorStationRecord = + SurveyorDatabaseFactory.instance.getSurveyorStation() + .getRecordSync(stationId); + if (surveyorStationRecord == null) { + return; + } + + + IConfigDataSource configDataSource = + SurveyorDatabaseFactory + .instance.getConfigDataSource(); + + ConfigRecord temperature = configDataSource.getByKeySync(ConfigConstants.KEY_LAST_TEMPERATURE); + ConfigRecord humidity = configDataSource.getByKeySync(ConfigConstants.KEY_LAST_HUMIDITY); + ConfigRecord airPress = configDataSource.getByKeySync(ConfigConstants.KEY_LAST_AIR_PRESSURE); + + List<_Item> items = new ArrayList<>(); + //添加环境title + items.add(new _TitleWithButtonItem(getString(R.string.title_set_environment_info), + getString(R.string.button_use_default_station_settings), + getString(R.string.button_use_last_station_settings), + items)); + //添加温度 + items.add(new _1EditTextItem(getString(R.string.hint_temperature), + temperature(surveyorStationRecord, temperature, DEFAULT_TEMPERATURE), + getString(R.string.hint_temperature), + "℃", + _VH.ATTRIBUTE_TEMPERATURE, + surveyorStationRecord)); + //添加湿度 + items.add(new _1EditTextItem(getString(R.string.hint_humidity), + humidity(surveyorStationRecord, humidity, DEFAULT_HUMIDITY), + getString(R.string.hint_humidity), + "%", + _VH.ATTRIBUTE_HUMIDITY, + surveyorStationRecord)); + //添加气压 + items.add(new _1EditTextItem(getString(R.string.hint_air_pressure), + airPress(surveyorStationRecord, airPress, DEFAULT_AIR_PRESSURE), + getString(R.string.hint_air_pressure), + "hPa", + _VH.ATTRIBUTE_AIR_PRESSURE, + surveyorStationRecord)); + + if (surveyorStationRecord.getTemperature() == null) { + surveyorStationRecord.setTemperature(DEFAULT_TEMPERATURE); + } + if (surveyorStationRecord.getHumidity() == null) { + surveyorStationRecord.setHumidity(DEFAULT_HUMIDITY); + } + if (surveyorStationRecord.getAirPressure() == null) { + surveyorStationRecord.setAirPressure(DEFAULT_AIR_PRESSURE); + } + + //添加高度title + items.add(new _TitleItem(getString(R.string.title_set_height_info))); + //添加仪器高 + items.add(new _1EditTextItem(getString(R.string.instrument_height), + valueOf(surveyorStationRecord.getInstrumentHeight()), + getString(R.string.instrument_height), + "m", + _VH.ATTRIBUTE_INSTRUMENT_HEIGHT, + surveyorStationRecord)); + if (surveyorStationRecord.getInstrumentHeight() == null) { + surveyorStationRecord.setInstrumentHeight("0"); + } + + //添加point title + items.add(new _PointTitleItem()); + //添加点坐标 + IPointDataSource pointDataSource = SurveyorDatabaseFactory.instance.getPointDataSource(); + List stationItems = surveyorStationRecord.getItems(); + + IPrismManagerDataSource prismManagerDataSource = SurveyorDatabaseFactory.instance.getPrismManagerDataSource(); + prismRecords = prismManagerDataSource.getAllRecordSync(); + + boolean stationHasRecord = StationUtil.hasRecord(surveyorStationRecord.getId()); + if (stationItems != null) { + for (SurveyorPoint surveyorPoint : stationItems) { + if (surveyorPoint == null || !SurveyorPoint.TYPE_POINT.equals(surveyorPoint.getType())) { + continue; + } + if (surveyorPoint.isWellSteel()) { + continue; + } + + if (surveyorPoint.getPrismHeight() == null) { + surveyorPoint.setPrismHeight("0"); + } + + //当是测点的时候 + PointRecord pointRecord = pointDataSource.findByIdSync(surveyorPoint.getOriginalPointId()); + items.add(new _2EditTextItem( + pointRecord.getName(), + surveyorPoint, + prismRecords, + !stationHasRecord + )); + } + } + //刷新recycle view + adapter = new _Adapter(items); + runOnUI(() -> recyclerView.setAdapter(adapter)); + }); + } + return view; + } + + @Override + protected void clickConfirm() { + if (adapter != null) { + String error = adapter.checkSave(); + if (error == null || error.isEmpty()) {//成功 + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .save(surveyorStationRecord); + + IConfigDataSource configDataSource = + SurveyorDatabaseFactory.instance.getConfigDataSource(); + configDataSource.set(ConfigConstants.KEY_LAST_TEMPERATURE, surveyorStationRecord.getTemperature()); + configDataSource.set(ConfigConstants.KEY_LAST_AIR_PRESSURE, surveyorStationRecord.getAirPressure()); + configDataSource.set(ConfigConstants.KEY_LAST_HUMIDITY, surveyorStationRecord.getHumidity()); + + HideKeyUtil.hideSoftInput(getActivity()); + if (getActivity() != null) { + getActivity().finish(); + } + } else { + ToastUtils.showShort(error); + } + } + } + + private abstract static class _Item { + final int type; + final String name; + View itemView = null; + + _Item(int type, String name) { + this.type = type; + this.name = name; + } + + void attach(View itemView) { + this.itemView = itemView; + } + + abstract String prepare2Save(); + } + + private static class _TitleItem extends _Item { + _TitleItem(String name) { + super(_VH.TYPE_TITLE, name); + } + + @Override + String prepare2Save() { + return null; + } + } + + private static class _TitleWithButtonItem extends _Item { + final String button1; + final String button2; + final List<_Item> items; + + _TitleWithButtonItem(String name, String button1, String button2, List<_Item> items) { + super(_VH.TYPE_TITLE_WITH_2BUTTON, name); + this.button1 = button1; + this.button2 = button2; + this.items = items; + } + + @Override + String prepare2Save() { + return null; + } + } + + private static class _PointTitleItem extends _Item { + _PointTitleItem() { + super(_VH.TYPE_POINT_TITLE, null); + } + + @Override + String prepare2Save() { + return null; + } + } + + private static class _1EditTextItem extends _Item { + private final String value; + private final String hintString; + private final String unit; + private final SurveyorStationRecord stationRecord; + private final int attributeType; + + _1EditTextItem(String name, String value, + String hintString, String unit, + int attributeType, + SurveyorStationRecord stationRecord) { + super(_VH.TYPE_1_EDIT_TEXT, name); + this.value = value; + this.hintString = hintString; + this.unit = unit; + this.attributeType = attributeType; + this.stationRecord = stationRecord; + } + + @Override + void attach(View itemView) { + super.attach(itemView); + MaterialEditText value = itemView.findViewById(R.id.value); + if (value != null) { + Watcher watcher = new Watcher() { + @Override + void onChanged(String string) { + if (_VH.ATTRIBUTE_TEMPERATURE == attributeType) { + stationRecord.setTemperature(string); + } else if (_VH.ATTRIBUTE_HUMIDITY == attributeType) { + stationRecord.setHumidity(string); + } else if (_VH.ATTRIBUTE_AIR_PRESSURE == attributeType) { + stationRecord.setAirPressure(string); + } else if (_VH.ATTRIBUTE_INSTRUMENT_HEIGHT == attributeType) { + stationRecord.setInstrumentHeight(string); + } + } + }; + value.addTextChangedListener(watcher); + } + } + + @Override + String prepare2Save() { + if (_VH.ATTRIBUTE_TEMPERATURE == attributeType) { + if (!isEmptyString(stationRecord.getTemperature())) { + return null; + } + } else if (_VH.ATTRIBUTE_HUMIDITY == attributeType) { + if (!isEmptyString(stationRecord.getHumidity())) { + return null; + } + } else if (_VH.ATTRIBUTE_AIR_PRESSURE == attributeType) { + if (!isEmptyString(stationRecord.getAirPressure())) { + return null; + } + } else if (_VH.ATTRIBUTE_INSTRUMENT_HEIGHT == attributeType) { + if (!isEmptyString(stationRecord.getInstrumentHeight())) { + return null; + } + } + return Tools.getString(R.string.please_enter) + name; + } + } + + private static class _2EditTextItem extends _Item { + private final SurveyorPoint surveyorPoint; + private final List prismRecords; + private final boolean isCanSelectAloneDistance; + private final List prismTypes; + + _2EditTextItem(String pointName, + SurveyorPoint surveyorPoint, + List prismRecords, + boolean isCanSelectAloneDistance) { + super(_VH.TYPE_2_EDIT_TEXT, pointName); + this.surveyorPoint = surveyorPoint; + this.prismRecords = prismRecords; + this.isCanSelectAloneDistance = isCanSelectAloneDistance; + prismTypes = new ArrayList<>(); + for (PrismRecord prismRecord : prismRecords) { + prismTypes.add(prismRecord.getShowPrismTypeName()); + } + } + + @Override + void attach(View itemView) { + super.attach(itemView); + MaterialEditText value1 = itemView.findViewById(R.id.value1); + if (value1 != null) { + value1.addTextChangedListener(new Watcher() { + @Override + void onChanged(String string) { + surveyorPoint.setPrismHeight(string); + } + }); + } + + Spinner spinner = itemView.findViewById(R.id.spinner); + if (spinner != null) { + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + PrismRecord prismRecord = prismRecords.get(position); + surveyorPoint.setPrismType(prismRecord.prismType); + surveyorPoint.setPrismTypeConstant(prismRecord.prismTypeConstant); + surveyorPoint.setPrismTypeName(prismRecord.getShowPrismTypeName()); + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + } + + CheckBox checkBox = itemView.findViewById(R.id.checkBox); + if (checkBox != null) { + checkBox.setEnabled(isCanSelectAloneDistance); + checkBox.setOnCheckedChangeListener((compoundButton, checked) -> { + surveyorPoint.setAloneDistance(checked); + }); + } + + } + + @Override + String prepare2Save() { + if (!isEmptyString(surveyorPoint.getPrismHeight())) { + return null; + } + return Tools.getString(R.string.please_enter) + name + Tools.getString(R.string.prism_height); + } + } + + private static abstract class _VH extends RecyclerView.ViewHolder { + static final int TYPE_TITLE = 0; + static final int TYPE_TITLE_WITH_2BUTTON = TYPE_TITLE + 1; + static final int TYPE_POINT_TITLE = TYPE_TITLE_WITH_2BUTTON + 1; + static final int TYPE_1_EDIT_TEXT = TYPE_POINT_TITLE + 1; + static final int TYPE_2_EDIT_TEXT = TYPE_1_EDIT_TEXT + 1; + + static final int ATTRIBUTE_TEMPERATURE = 0;//温度 + static final int ATTRIBUTE_HUMIDITY = ATTRIBUTE_TEMPERATURE + 1;//湿度 + static final int ATTRIBUTE_AIR_PRESSURE = ATTRIBUTE_HUMIDITY + 1;//气压 + static final int ATTRIBUTE_INSTRUMENT_HEIGHT = ATTRIBUTE_AIR_PRESSURE + 1;//仪器高 + + public _VH(@NonNull @NotNull View itemView) { + super(itemView); + } + + abstract void setup(_Item item); + } + + private static class _TitleVH extends _VH { + private final TextView titleText; + + public _TitleVH(@NonNull @NotNull View itemView) { + super(itemView); + titleText = itemView.findViewById(R.id.title); + } + + @Override + void setup(_Item item) { + if (titleText != null) { + titleText.setText(item.name); + } + } + } + + private static class _TitleWith2ButtonVH extends _TitleVH { + final TextView button1; + final TextView button2; + + public _TitleWith2ButtonVH(@NonNull @NotNull View itemView) { + super(itemView); + button1 = itemView.findViewById(R.id.button1); + button2 = itemView.findViewById(R.id.button2); + } + + @Override + void setup(_Item item) { + super.setup(item); + if (item instanceof _TitleWithButtonItem) { + _TitleWithButtonItem titleWithButtonItem = (_TitleWithButtonItem) item; + if (button1 != null) { + button1.setText(titleWithButtonItem.button1); + button1.setOnClickListener(v -> update(titleWithButtonItem.items, + DEFAULT_TEMPERATURE, DEFAULT_HUMIDITY, DEFAULT_AIR_PRESSURE)); + } + if (button2 != null) { + button2.setText(titleWithButtonItem.button2); + //判断能否点击 + ThreadPoolUtil.execute(() -> { + IConfigDataSource configDataSource = + SurveyorDatabaseFactory + .instance.getConfigDataSource(); + + ConfigRecord temperature = configDataSource.getByKeySync(ConfigConstants.KEY_LAST_TEMPERATURE); + ConfigRecord humidity = configDataSource.getByKeySync(ConfigConstants.KEY_LAST_HUMIDITY); + ConfigRecord airPress = configDataSource.getByKeySync(ConfigConstants.KEY_LAST_AIR_PRESSURE); + if (temperature != null && humidity != null && airPress != null) { + ThreadPoolUtil.executeInMain(() -> { + button2.setEnabled(true); + button2.setAlpha(1); + button2.setOnClickListener(v -> update(titleWithButtonItem.items, + temperature.getConfigValue(), + humidity.getConfigValue(), + airPress.getConfigValue())); + }); + } + }); + } + } + } + + private void update(List<_Item> items, String temperature, String humidity, String airPress) { + for (int index = 0; index < items.size(); index++) { + _Item item = items.get(index); + if (!(item instanceof _1EditTextItem)) { + continue; + } + _1EditTextItem editTextItem = (_1EditTextItem) item; + MaterialEditText value = item.itemView.findViewById(R.id.value); + if (editTextItem.attributeType == _VH.ATTRIBUTE_TEMPERATURE) {//温度 + if (value != null) { + value.setText(temperature); + } + } else if (editTextItem.attributeType == _VH.ATTRIBUTE_AIR_PRESSURE) {//气压 + if (value != null) { + value.setText(airPress); + } + } else if (editTextItem.attributeType == _VH.ATTRIBUTE_HUMIDITY) {//湿度 + if (value != null) { + value.setText(humidity); + } + } + } + } + } + + private static class _PointTitleVH extends _VH { + public _PointTitleVH(@NonNull @NotNull View itemView) { + super(itemView); + } + + @Override + void setup(_Item item) { + } + } + + private static class _1EditTextVH extends _VH { + private final TextView name; + private final MaterialEditText value; + private final TextView unit; + + public _1EditTextVH(@NonNull @NotNull View itemView) { + super(itemView); + name = itemView.findViewById(R.id.name); + value = itemView.findViewById(R.id.value); + unit = itemView.findViewById(R.id.unit); + } + + @Override + void setup(_Item item) { + if (item instanceof _1EditTextItem) { + _1EditTextItem editTextItem = (_1EditTextItem) item; + if (name != null) { + name.setText(editTextItem.name); + } + String v1 = null; + if (editTextItem.attributeType == _VH.ATTRIBUTE_INSTRUMENT_HEIGHT) { + v1 = editTextItem.stationRecord.getInstrumentHeight(); + } else if (editTextItem.attributeType == _VH.ATTRIBUTE_TEMPERATURE) {//温度 + v1 = editTextItem.stationRecord.getTemperature(); + } else if (editTextItem.attributeType == _VH.ATTRIBUTE_AIR_PRESSURE) {//气压 + v1 = editTextItem.stationRecord.getAirPressure(); + } else if (editTextItem.attributeType == _VH.ATTRIBUTE_HUMIDITY) {//湿度 + v1 = editTextItem.stationRecord.getHumidity(); + } + + + if (value != null) { + value.setText(v1); + value.setHint(editTextItem.hintString); + } + if (unit != null) { + unit.setText(editTextItem.unit); + } + } + } + } + + private static class _2EditTextVH extends _VH { + private final TextView tvPointName; + private final MaterialEditText etPrismHeight; + private final Spinner spinnerPrismType; + private final CheckBox checkBoxAloneDistance; + + public _2EditTextVH(@NonNull @NotNull View itemView) { + super(itemView); + tvPointName = itemView.findViewById(R.id.name); + etPrismHeight = itemView.findViewById(R.id.value1); + spinnerPrismType = itemView.findViewById(R.id.spinner); + checkBoxAloneDistance = itemView.findViewById(R.id.checkBox); + } + + @Override + void setup(_Item item) { + if (item instanceof _2EditTextItem) { + _2EditTextItem editTextItem = (_2EditTextItem) item; + if (tvPointName != null) { + tvPointName.setText(editTextItem.name); + } + + if (etPrismHeight != null) { + etPrismHeight.setText(editTextItem.surveyorPoint.getPrismHeight()); + } + + if (spinnerPrismType != null) { + SpinnerAdapter spinnerAdapter = new SpinnerAdapter(itemView.getContext(), editTextItem.prismTypes); + spinnerPrismType.setAdapter(spinnerAdapter); + spinnerPrismType.setSelection(editTextItem.prismTypes.indexOf(editTextItem.surveyorPoint.getPrismTypeName())); + } + + if (checkBoxAloneDistance != null) { + checkBoxAloneDistance.setChecked(editTextItem.surveyorPoint.isAloneDistance()); + } + + } + } + } + + private static class _Adapter extends BaseAdapter<_Item, _VH> { + + public _Adapter(List<_Item> items) { + super(items); + } + + @Override + public int getItemViewType(int position) { + _Item item = getItem(position); + return item.type; + } + + @Override + protected _VH createVH(@NotNull ViewGroup parent, int viewType) { + if (_VH.TYPE_TITLE == viewType) { + View itemView = LayoutInflater + .from(parent.getContext()) + .inflate(R.layout.item_surveyor_station_settings_title_layout, parent, false); + return new _TitleVH(itemView); + } else if (_VH.TYPE_TITLE_WITH_2BUTTON == viewType) { + View itemView = LayoutInflater + .from(parent.getContext()) + .inflate(R.layout.item_surveyor_station_settings_title_with_2button_layout, parent, false); + return new _TitleWith2ButtonVH(itemView); + } else if (_VH.TYPE_POINT_TITLE == viewType) { + View itemView = LayoutInflater + .from(parent.getContext()) + .inflate(R.layout.item_surveyor_station_settings_point_title_layout, parent, false); + return new _PointTitleVH(itemView); + } else if (_VH.TYPE_1_EDIT_TEXT == viewType) { + View itemView = LayoutInflater + .from(parent.getContext()) + .inflate(R.layout.item_surveyor_station_settings_1_edittext_layout, parent, false); + return new _1EditTextVH(itemView); + } else if (_VH.TYPE_2_EDIT_TEXT == viewType) { + View itemView = LayoutInflater + .from(parent.getContext()) + .inflate(R.layout.item_surveyor_station_settings_2_edittext_layout, parent, false); + return new _2EditTextVH(itemView); + } + return null; + } + + @Override + public void onBindViewHolder(@NonNull @NotNull StationSettingsFragment._VH holder, int position) { + _Item item = getItem(position); + item.attach(holder.itemView); + holder.setup(item); + } + + /** + * 保存前的检查 + * + * @return + */ + String checkSave() { + for (int index = 0; index < getItemCount(); index++) { + _Item item = getItem(index); + String error = item.prepare2Save(); + if (error != null && !error.isEmpty()) { + return error; + } + } + return null; + } + } + + private static String getString(MaterialEditText editText) { + if (editText == null) { + return ""; + } + if (editText.getText() == null) { + return ""; + } + return editText.getText().toString(); + } + + private String valueOf(String value) { + if (value == null) { + return ""; + } + return value; + } + + public static StationSettingsFragment newInstance(Bundle bundle) { + StationSettingsFragment fragment = new StationSettingsFragment(); + fragment.setArguments(bundle); + return fragment; + } + + public static void start(Context context, String surveyorStationId) { + Bundle bundle = new Bundle(); + bundle.putString(KEY_SURVEYOR_STATION_ID, surveyorStationId); + FragmentContainerActivity.start(context, TAG, R.string.title_instrument_prism_setting, bundle); + } + + private String temperature(SurveyorStationRecord surveyorStationRecord, + ConfigRecord lastRecord, + String defaultRecord) { + if (surveyorStationRecord != null && !valueOf(surveyorStationRecord.temperature).isEmpty()) { + return surveyorStationRecord.temperature; + } + + return configValue(lastRecord, defaultRecord); + } + + private String humidity(SurveyorStationRecord surveyorStationRecord, + ConfigRecord lastRecord, + String defaultRecord) { + if (surveyorStationRecord != null && !valueOf(surveyorStationRecord.humidity).isEmpty()) { + return surveyorStationRecord.humidity; + } + + return configValue(lastRecord, defaultRecord); + } + + private String airPress(SurveyorStationRecord surveyorStationRecord, + ConfigRecord lastRecord, + String defaultRecord) { + if (surveyorStationRecord != null && !valueOf(surveyorStationRecord.airPressure).isEmpty()) { + return surveyorStationRecord.airPressure; + } + + return configValue(lastRecord, defaultRecord); + } + + private String configValue(ConfigRecord lastRecord, String defaultRecord) { + if (lastRecord != null && !valueOf(lastRecord.getConfigValue()).isEmpty()) { + return lastRecord.getConfigValue(); + } + return defaultRecord; + } + + private abstract static class Watcher implements TextWatcher { + @Override + final public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + final public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + final public void afterTextChanged(Editable s) { + onChanged(s.toString()); + } + + abstract void onChanged(String string); + } + + private static boolean isEmptyString(String string) { + return string == null || string.isEmpty(); + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/IMeasureOperate.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/IMeasureOperate.java new file mode 100644 index 0000000..ac6ee3c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/IMeasureOperate.java @@ -0,0 +1,28 @@ +package com.bingce.controlnetwork.fragment.stationsurvey; + +/** + * 开始测量等操作接口 + */ +public interface IMeasureOperate { + void doSurveyor(); + + void autoSurvey(); + + void switchCycle(int cycleIndex); + + void deleteStationAllPeroidRecord(); + + void deleteStationOnePeriodRecord(int cycleIndex); + + String stationCheck(); + + void stationAdjust(); + + void goBack(); + + boolean isCurrentCycleComplete(); + + void refreshGoBackBtnEnable(); + + int measureTypePosition(); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/MethodCheckSetting.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/MethodCheckSetting.java new file mode 100644 index 0000000..e0a03bb --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/MethodCheckSetting.java @@ -0,0 +1,94 @@ +package com.bingce.controlnetwork.fragment.stationsurvey; + +import androidx.annotation.NonNull; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.Fragment; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.util.IUIRunner; +import com.bingce.controlapphelper.util.Tools; + +import java.util.List; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; +import com.bingce.controlnetwork.fragment.stationsetting.StationSettingsFragment; + +public class MethodCheckSetting { + /** + * 检测测站是否设置了棱镜相关属性,如果没有则跳转到设置界面 + */ + @WorkerThread + public static void checkStationSettings(String stationId, + @NonNull Fragment fragment, + @NonNull IUIRunner runner) { + ISurveyorStationDataSource stationDataSource = + SurveyorDatabaseFactory.instance.getSurveyorStation(); + //检测温度、湿度、气压、棱镜是否设置 + SurveyorStationRecord stationRecord = stationDataSource.getRecordSync(stationId); + if (stationRecord == null) { + return; + } + List stationItemList = stationRecord.getItems(); + if (stationItemList == null || stationItemList.isEmpty()) { + return; + } + boolean failure = false; + for (SurveyorPoint stationItem : stationItemList) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + continue; + } + if (stationItem.isWellSteel()) { + continue; + } + if (isEmpty(stationItem.getPrismHeight())) { + failure = true; + break; + } + } + if (!failure && (isEmpty(stationRecord.getTemperature()) || + isEmpty(stationRecord.getHumidity()) || + isEmpty(stationRecord.getAirPressure()) || + isEmpty(stationRecord.getInstrumentHeight()))) { + failure = true; + } + + if (!failure) { + TipsWith2OptionFragment.dismissNowMe(); + return; + } + + runner.runOnUI(() -> { + TipsWith2OptionFragment.Argument argument = new TipsWith2OptionFragment.Argument(); + argument.content(Tools.getString(R.string.please_set_environment)); + argument.cancelable(false); + argument.autoDismiss(false); + + TipsWith2OptionFragment.tips( + fragment.getChildFragmentManager(), + fragment.getViewLifecycleOwner(), + argument, + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + StationSettingsFragment.start(fragment.getContext(), stationId); + } + + @Override + public void onCancel() { + if (fragment.getActivity() != null) { + fragment.getActivity().finish(); + } + } + }); + }); + } + + public static boolean isEmpty(String string) { + return string == null || string.isEmpty(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/StationSurveyorFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/StationSurveyorFragment.java new file mode 100644 index 0000000..d95508b --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/StationSurveyorFragment.java @@ -0,0 +1,398 @@ +package com.bingce.controlnetwork.fragment.stationsurvey; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.Fragment; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.AutoSurveyorButtonVisibleEvent; +import com.bingce.controlapphelper.event.RefreshGoBackButton; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.surveyor.test.Test; +import com.bingce.controlapphelper.util.DigitalUtil; +import com.bingce.controlapphelper.util.StationUtil; +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.fragment.BottomSheetSelectListFragment; +import com.bingce.controlnetwork.fragment.ComponentStationSurveyorDataListFragment; +import com.bingce.controlnetwork.fragment.SurveyorSettingsFragment; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.fragment.stationsetting.StationSettingsFragment; +import com.bingce.controlnetwork.surveyor.surveyor.TestDataSelectFragment; +import com.bingce.utils.ThreadPoolUtil; +import com.github.razir.progressbutton.DrawableButtonExtensionsKt; +import com.github.razir.progressbutton.ProgressButtonHolderKt; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; + +/** + * 测站测量页面(开始测量) + */ +public class StationSurveyorFragment extends BaseFragment { + public static final String TAG = StationSurveyorFragment.class.getName(); + private ComponentStationSurveyorDataListFragment fragment; + private MenuItem goBack = null;//数据回退菜单 + private SurveyorStationRecord surveyorStationRecord; + private int cycleIndex = 0; + + public StationSurveyorFragment() { + super(); + } + + @Override + public void onStart() { + super.onStart(); + EventBus.getDefault().register(this); + } + + @Override + public void onStop() { + super.onStop(); + EventBus.getDefault().unregister(this); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onRefreshGoBack(RefreshGoBackButton event) { + if (goBack != null) { + goBack.setEnabled(event.validate); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onSurveyorStateChanged(SurveyStateEvent event) { + if (getView() == null) { + return; + } + Button surveyorButton = getView().findViewById(R.id.surveyor); + if (surveyorButton == null) { + return; + } + if (event.isIdle() || event.isSuccess() || event.isCompleted()) { + DrawableButtonExtensionsKt.hideProgress(surveyorButton, R.string.start_surveyor); + } else if (event.isSurveying()) { + DrawableButtonExtensionsKt.showProgress(surveyorButton, progressParams -> { + progressParams.setButtonTextRes(R.string.tips_surveying); + progressParams.setProgressColor(Color.WHITE); + return null; + }); + } else if (event.isFailure()) { + DrawableButtonExtensionsKt.hideProgress(surveyorButton, R.string.tips_surveyor_failure_and_retry); + } + + boolean enable = event.isIdle() || event.isFailure() || event.isSuccess(); + setSurveyorEnable(getView(), R.id.surveyor, enable); + setSurveyorEnable(getView(), R.id.auto_surveyor, enable); + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onAutoSurveyorChanged(AutoSurveyorButtonVisibleEvent event) { + if (getView() == null) { + return; + } + Button autoSurveyButton = getView().findViewById(R.id.auto_surveyor); + if (autoSurveyButton != null) { + autoSurveyButton.setVisibility(event.isReadyAutoSurvey() && !event.isOpenAutoSurvey() + ? View.VISIBLE : View.GONE); + } + } + + private String stationId() { + if (getArguments() == null) { + return null; + } + return getArguments().getString(BundleConstants.KEY_SURVEYOR_STATION_ID); + } + + @Override + public void onResume() { + super.onResume(); + ThreadPoolUtil.execute(() -> MethodCheckSetting.checkStationSettings(stationId(), fragment, this::runOnUI)); + //测量界面保持常亮 + if (getActivity() != null) { + getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + } + + @Override + public void onPause() { + super.onPause(); + //关闭测量界面保持常亮 + if (getActivity() != null) { + getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_project_surveyor_station_detail_layout, + container, + false); + + //1.添加测量数据显示fragment + fragment = ComponentStationSurveyorDataListFragment + .newInstance(stationId()); + getChildFragmentManager() + .beginTransaction() + .replace(R.id.fragment_container, fragment, "___station_list") + .commit(); + //2.设置测量按钮 + Button surveyor = view.findViewById(R.id.surveyor); + if (surveyor != null) { + ProgressButtonHolderKt.bindProgressButton(getViewLifecycleOwner(), surveyor); + } + setSurveyorClick(view, R.id.surveyor, () -> { + if (fragment != null) { + fragment.doSurveyor(); + } + }); + setSurveyorClick(view, R.id.auto_surveyor, () -> { + if (fragment != null) { + fragment.autoSurvey(); + } + }); + //3.查询测站信息 + ThreadPoolUtil.execute(() -> { + surveyorStationRecord = SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getRecordSync(stationId()); + //监听当前测回切换 + monitorCurrentCycle(view); + //监听数据变化 + ToleranceDetailRecord toleranceRecord = getTolerance(surveyorStationRecord); + if (toleranceRecord == null) { + return; + } + //注册UI监听 + View pick = view.findViewById(R.id.cycleLayout); + if (pick == null) { + return; + } + int cycleCount = toleranceRecord.getCycleCount(); + pick.setOnClickListener(v -> { + ArrayList cycleList = SurveyorCycleUtil.cycleStrings(cycleCount, + surveyorStationRecord != null && surveyorStationRecord.leftAndRightSurveyor); + + TextView circleText = view.findViewById(R.id.circle_text); + runOnUI(() -> BottomSheetSelectListFragment.showSelect( + getChildFragmentManager(), + getViewLifecycleOwner(), + cycleIndex, + cycleList, + null,//不再限制测期 + (index, string) -> { + if (circleText != null) { + circleText.setText(string); + } + cycleIndex = index; + if (fragment != null) { + //检测当前测回是否完成 + fragment.switchCycle(cycleIndex); + } + })); + }); + }); + + + setHasOptionsMenu(true); + + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + + } + + @WorkerThread + private void monitorCurrentCycle(View view) { + if (getActivity() != null) { + getActivity().runOnUiThread(() -> SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .findSchedule(SurveyorScheduleConstants.getCurrentCycleKey(stationId(), null)) + .observe(getViewLifecycleOwner(), record -> { + TextView circleText = view.findViewById(R.id.circle_text); + //测回发生变化的时候,更新相应ui + int cycleIndex = DigitalUtil.valueOfIntString(record == null ? "0" : record.getStatue(), 0); + //更新测回名称 + if (circleText != null) { + boolean showLeftOrRight = true; + if (surveyorStationRecord != null) { + showLeftOrRight = surveyorStationRecord.leftAndRightSurveyor; + } + circleText.setText(SurveyorCycleUtil.cycleName(cycleIndex, showLeftOrRight)); + } + StationSurveyorFragment.this.cycleIndex = cycleIndex; + })); + } + } + + private static void setSurveyorClick(View rootView, int id, Runnable runnable) { + View view = rootView.findViewById(id); + if (view != null) { + view.setOnClickListener(v -> runnable.run()); + } + } + + private static void setSurveyorEnable(View rootView, int id, boolean enable) { + if (rootView == null) { + return; + } + View view = rootView.findViewById(id); + if (view != null) { + view.setEnabled(enable); + if (enable) { + view.setAlpha(1); + } else { + view.setAlpha(.4f); + } + } + } + + @Override + public void onCreateOptionsMenu(@NonNull @NotNull Menu menu, @NonNull @NotNull MenuInflater inflater) { + if (Test.DEBUG) { + inflater.inflate(R.menu.menu_surveyor_station_record_data_edit_debug, menu); + } else { + inflater.inflate(R.menu.menu_surveyor_station_record_data_edit_release, menu); + } + MenuItem stationCheck = menu.findItem(R.id.menu_item_station_check); + MenuItem stationAdjust = menu.findItem(R.id.menu_item_station_adjust); + goBack = menu.findItem(R.id.menu_item_go_back); + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .findSchedule(SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), null)) + .observe(getViewLifecycleOwner(), surveyorScheduleRecord -> { + boolean checkStatue = false; + boolean adjustStatue = false; + if (surveyorScheduleRecord != null) { + String statue = surveyorScheduleRecord.getStatue(); + if (SurveyorScheduleConstants.STATUE_VALUE_CHECKED.equals(statue)) { + adjustStatue = true; + } else if (SurveyorScheduleConstants.STATUE_VALUE_COMPLETED.equals(statue)) { + checkStatue = true; + } else if (SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED.equals(statue)) { + //重置提醒标识 + String key = ConfigConstants.KEY_CONFIG_STATION_CHECK_REMINDED + stationId(); + SurveyorDatabaseFactory + .instance + .getConfigDataSource() + .set(key, ConfigConstants.VALUE_NO); + } + } + //更新菜单enable + if (stationCheck != null) { + stationCheck.setEnabled(checkStatue); + } + if (stationAdjust != null) { + stationAdjust.setEnabled(adjustStatue); + } + }); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(@NonNull @NotNull MenuItem item) { + if (R.id.menu_item_delete_current_records == item.getItemId()) { + //删除当前测回记录 + if (surveyorStationRecord != null) { + //通知fragment + fragment.deleteByStationAndPeriod(cycleIndex); + } + } else if (R.id.menu_item_delete_all_records == item.getItemId()) { + //删除所有测回记录 + if (surveyorStationRecord != null) { + //通知fragment + fragment.deleteCurrentStationSurveyorData(); + } + } else if (R.id.menu_item_station_check == item.getItemId()) { + //测站检测,检测所有测回 + fragment.stationCheck(); + } else if (R.id.menu_item_data_source == item.getItemId()) { + //数据源 debug使用 + TestDataSelectFragment.show(getChildFragmentManager()); + } else if (R.id.menu_item_go_back == item.getItemId()) { + //回退 + fragment.goBack(); + } else if (R.id.menu_item_station_environment_prism_settings == item.getItemId()) { + //环境、棱镜设置 + StationSettingsFragment.start(getContext(), stationId()); + } else if (R.id.menu_item_surveyor_settings == item.getItemId()) { + //测量设置 + ThreadPoolUtil.execute(() -> { + String name = StationUtil.getStationName(surveyorStationRecord); + runOnUI(() -> SurveyorSettingsFragment.start(getContext(), surveyorStationRecord.getId(), name)); + }); + } else if (R.id.menu_item_station_adjust == item.getItemId()) { + //测站平差,平差检测 + fragment.stationAdjust(); + } + return super.onOptionsItemSelected(item); + } + + @WorkerThread + private static ToleranceDetailRecord getTolerance(SurveyorStationRecord surveyorStationRecord) { + if (surveyorStationRecord == null) { + return null; + } + //获取project信息 + ProjectRecord projectRecord = SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getRecord(surveyorStationRecord.getProjectId()); + if (projectRecord == null) { + return null; + } + //获取限差数据 + return SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource() + .getRecordSync(projectRecord.getToleranceId()); + } + + public static void start(Context context, String surveyorStationId, String surveyorStationName) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_SURVEYOR_STATION_ID, surveyorStationId); + FragmentContainerActivity.start(context, TAG, surveyorStationName, bundle); + } + + public static Fragment newInstance(Bundle args) { + Fragment fragment = new StationSurveyorFragment(); + fragment.setArguments(args); + return fragment; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureDefaultFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureDefaultFragment.java new file mode 100644 index 0000000..d381b58 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureDefaultFragment.java @@ -0,0 +1,411 @@ +package com.bingce.controlnetwork.fragment.stationsurvey.angledistance; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.RefreshGoBackButton; +import com.bingce.controlapphelper.surveyor.data.CachedData; +import com.bingce.controlapphelper.surveyor.data.IDistanceTypeChangeListener; +import com.bingce.controlapphelper.surveyor.data.SurveyorData; +import com.bingce.controlapphelper.surveyor.state.ISurveyState; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParamAuto; +import com.bingce.controlapphelper.util.DigitalUtil; +import com.bingce.controlapphelper.util.IUIRunner; +import com.bingce.controlnetwork.adapter.MeasureAngleDistanceAdapter; +import com.bingce.controlnetwork.fragment.ComponentStationSurveyorDataListFragment; +import com.bingce.controlnetwork.fragment.StationDataAdjustDialogFragment; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.IMeasureOperate; +import com.bingce.controlnetwork.surveyor.state.IScrollDelegate; +import com.bingce.controlnetwork.surveyor.state.angledistance.StateManager; +import com.bingce.controlnetwork.surveyor.state.angledistance._IsSingleCycleCompletedState; +import com.bingce.totalstation.TotalStation; +import com.bingce.utils.ThreadPoolUtil; + +import org.greenrobot.eventbus.EventBus; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.MeasureAngleDistanceAdapter; +import com.bingce.controlnetwork.fragment.ComponentStationSurveyorDataListFragment; +import com.bingce.controlnetwork.fragment.StationDataAdjustDialogFragment; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.IMeasureOperate; +import com.bingce.controlnetwork.surveyor.state.IScrollDelegate; +import com.bingce.controlnetwork.surveyor.state.angledistance.StateManager; +import com.bingce.controlnetwork.surveyor.state.angledistance._IsSingleCycleCompletedState; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; + +/** + * 测角测距 + */ +public class MeasureDefaultFragment extends BaseFragment + implements IDistanceTypeChangeListener, ISurveyState, IMeasureOperate { + private MeasureAngleDistanceAdapter adapter = null; + private StateManager stateManager; + private RecyclerView recyclerView; + private ICachedData cachedData = null; + private ISurveyorData surveyedData = null; + private ISurveyState surveyState; + + private String stationId() { + if (getArguments() == null) { + return null; + } + return getArguments().getString(KEY_STATION_ID); + } + + private String getTypeAngleOrDistance() { + if (getArguments() != null) { + return getArguments().getString(KEY_TYPE_ANGLE_OR_DISTANCE); + } + return null; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate( + R.layout.fragment_project_surveyor_station_point_list_layout, + container, + false); + String stationId = stationId(); + recyclerView = view.findViewById(R.id.recycler_view); + if (stationId != null) { + //收集信息 + collectData(stationId, + getContext(), + getChildFragmentManager(), + getViewLifecycleOwner(), + this::runOnUI, + index -> { + if (index >= 0 && adapter != null && index < adapter.getItemCount()) { + recyclerView.scrollToPosition(index); + } + }, + new ICollectCacheCallback() { + @Override + public void onFailure() { + } + + @Override + public void onSuccess(boolean showSlopDistance, ICachedData cachedData, SurveyorData surveyorData, StateManager stateManager) { + onCollectStationData(showSlopDistance, cachedData, surveyorData, stateManager); + surveyState = stateManager; + } + } + ); + } + + return view; + } + + @WorkerThread + private void onCollectStationData( + boolean showSlopDistance, + ICachedData cachedData, + SurveyorData surveyorData, + StateManager stateManager) { + this.stateManager = stateManager; + this.cachedData = cachedData; + surveyedData = surveyorData; + + //测量数据收集完毕后,就可以更新UI了 + runOnUI(() -> { + //刷新UI + if (adapter == null) { + adapter = new MeasureAngleDistanceAdapter(stationId(), + cachedData, surveyorData, surveyorData, getTypeAngleOrDistance()); + adapter.onShowSlopDistance(showSlopDistance); + if (recyclerView != null) { + recyclerView.setAdapter(adapter); + //滚动到当前目标点 + int currentItemIndex = surveyorData.currentIndex(); + if (currentItemIndex >= 0 && currentItemIndex < adapter.getItemCount()) { + recyclerView.scrollToPosition(currentItemIndex); + } + } + } + + //监听测站数据 + //监听「平距」「斜距」切换,更新UI显示 + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getLiveDataRecord(stationId()) + .observe(getViewLifecycleOwner(), + surveyorStationRecord -> onShowSlopDistance(surveyorStationRecord.isShowSlopDistance())); + }); + } + + /** + * 收集测站信息 + */ + private void collectData( + String stationId, + Context context, + FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + IUIRunner runner, + IScrollDelegate scrollDelegate, + ICollectCacheCallback callback) { + if (callback == null) { + return; + } + boolean isSupportAutoMode = TotalStation.getInstance().isSupportMotor(); + ThreadPoolUtil.execute(() -> { + //读取当前测站的当前测回--很重要 + SurveyorScheduleRecord scheduleRecord = + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .findScheduleSync(SurveyorScheduleConstants.getCurrentCycleKey(stationId, SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE)); + int defaultCycle = scheduleRecord == null ? 0 : + DigitalUtil.valueOfIntString(scheduleRecord.getStatue(), 0); + //加载测站信息 + SurveyorStationRecord surveyorStationRecord = + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getRecordSync(stationId); + //加载对应项目 + ProjectRecord projectRecord = SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getRecord(surveyorStationRecord.getProjectId()); + if (projectRecord == null) { + callback.onFailure(); + return; + } + //加载对应限差 + ToleranceDetailRecord toleranceRecord = SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource() + .getRecordSync(projectRecord.getToleranceId()); + if (toleranceRecord == null) { + callback.onFailure(); + return; + } + //创建缓存数据 + CachedData cachedData = + CachedData.newInstance(surveyorStationRecord.isAutoClose(), + surveyorStationRecord.isLeftAndRightSurveyor(), + stationId, toleranceRecord); + if (cachedData == null) { + callback.onFailure(); + return; + } + + + //是否显示斜距? + cachedData.onShowSlopDistance(surveyorStationRecord.isShowSlopDistance()); + if (cachedData.pointCount() <= 0) { + callback.onFailure(); + return; + } + + //创建stateManager实例 + SurveyorData surveyorDataSource = new SurveyorData(toleranceRecord.getSurveyorCount()); + surveyorDataSource.onShowSlopDistance(surveyorStationRecord.isShowSlopDistance()); + + //存入cacheData 用于自动测量时使用 + MeasureVm measureVm = new ViewModelProvider(requireParentFragment()).get(MeasureVm.class); + RequestSurveyorParamAuto requestSurveyorParamAuto = new RequestSurveyorParamAuto(stationId, cachedData); + measureVm.setRequestSurveyorParamAuto(requestSurveyorParamAuto); + + StateManager stateManager = StateManager.newInstance( + isSupportAutoMode, + requestSurveyorParamAuto, + surveyorStationRecord, + context, + fragmentManager, + lifecycleOwner, + toleranceRecord, + surveyorDataSource, + surveyorDataSource, + cachedData, + scrollDelegate, + runner); + //fragment创建后立即计算当前cycle的测量状态 + runner.runOnUI(() -> stateManager.calScheduleWhenEnterSurveyFragment(defaultCycle)); + callback.onSuccess(surveyorStationRecord.isShowSlopDistance(), cachedData, surveyorDataSource, stateManager); + }); + } + + @Override + public void onResume() { + super.onResume(); + if (stateManager != null) { + stateManager.resume(); + } + } + + @Override + public void onPause() { + super.onPause(); + if (stateManager != null) { + stateManager.quite(); + } + } + + public interface ICollectCacheCallback { + void onFailure(); + + void onSuccess(boolean showSlopDistance, ICachedData cachedData, SurveyorData surveyorData, StateManager stateManager); + } + + @Override + public void doSurveyor() { + if (stateManager == null) { + return; + } + stateManager.doSurveyor(); + } + + @Override + public void autoSurvey() { + if (stateManager == null) { + return; + } + stateManager.doAutoSurveyor(); + } + + @Override + public void switchCycle(int cycleIndex) { + if (stateManager == null) { + return; + } + stateManager.switch2Cycle(cycleIndex); + } + + @Override + public void deleteStationAllPeroidRecord() { + if (stateManager == null) { + return; + } + stateManager.deleteCurrentStationSurveyorData(); + } + + @Override + public void deleteStationOnePeriodRecord(int cycleIndex) { + if (stateManager == null) { + return; + } + stateManager.deleteCurrentStationSurveyorData(cycleIndex); + } + + @Override + public String stationCheck() { + if (stateManager == null) { + return null; + } + return stateManager.stationCheckOnly(); + } + + @Override + public void stationAdjust() { + if (stateManager == null) { + return; + } + stateManager.stationAdjustOnly(StationDataAdjustDialogFragment.TYPE_ANGLE_DISTANCE); + } + + @Override + public void goBack() { + if (stateManager == null) { + return; + } + stateManager.moveBack(); + } + + @Override + public boolean isCurrentCycleComplete() { + if (stateManager == null) + return false; + boolean completed = _IsSingleCycleCompletedState.isSingleCycleCompleted( + stationId(), + stateManager.getCurrentCycle(), + stateManager.getCachedData()); + return completed; + } + + @Override + public void refreshGoBackBtnEnable() { + if (stateManager == null || stateManager.getCachedData().pointCount() == 0) { + EventBus.getDefault().post(new RefreshGoBackButton(false)); + return; + } + stateManager.refreshGoBackBtnEnable(); + } + + @Override + public int measureTypePosition() { + return MeasureFragment.POSITION_DIRECTION_MEASURE; + } + + @Override + public void onShowSlopDistance(boolean value) { + if (cachedData != null) { + cachedData.onShowSlopDistance(value); + } + if (surveyedData != null) { + surveyedData.onShowSlopDistance(value); + } + if (adapter != null) { + adapter.onShowSlopDistance(value); + adapter.notifyItemRangeChanged(0, adapter.getItemCount()); + } + } + + @Override + public boolean isSurveying() { + if (surveyState != null) { + return surveyState.isSurveying(); + } + return false; + } + + @Override + public boolean isAutoSurveying() { + if (surveyState != null) { + return surveyState.isAutoSurveying(); + } + return false; + } + + private static final String KEY_STATION_ID = "__station_id"; + private static final String KEY_TYPE_ANGLE_OR_DISTANCE = "__key_type_angle_or_distance"; + public static final String TAG = ComponentStationSurveyorDataListFragment.class.getName(); + + public static MeasureDefaultFragment newInstance(String stationId, String typeAngleOrDistance) { + MeasureDefaultFragment fragment = new MeasureDefaultFragment(); + Bundle bundle = new Bundle(); + bundle.putString(KEY_STATION_ID, stationId); + bundle.putString(KEY_TYPE_ANGLE_OR_DISTANCE, typeAngleOrDistance); + fragment.setArguments(bundle); + return fragment; + } +} + + + diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureDistanceFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureDistanceFragment.java new file mode 100644 index 0000000..c1254a1 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureDistanceFragment.java @@ -0,0 +1,394 @@ +package com.bingce.controlnetwork.fragment.stationsurvey.angledistance; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.RefreshGoBackButtonAloneDistance; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.data.IDistanceTypeChangeListener; +import com.bingce.controlapphelper.surveyor.data.IMeasureCache; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.data.SurveyorData; +import com.bingce.controlapphelper.surveyor.state.ISurveyState; +import com.bingce.controlapphelper.util.DigitalUtil; +import com.bingce.controlapphelper.util.IUIRunner; +import com.bingce.controlnetwork.adapter.MeasureAngleDistanceAdapter; +import com.bingce.controlnetwork.fragment.ComponentStationSurveyorDataListFragment; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.IMeasureOperate; +import com.bingce.controlnetwork.surveyor.state.IScrollDelegate; +import com.bingce.totalstation.TotalStation; +import com.bingce.utils.ThreadPoolUtil; + +import org.greenrobot.eventbus.EventBus; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.MeasureAngleDistanceAdapter; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.fragment.ComponentStationSurveyorDataListFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.IMeasureOperate; +import com.bingce.controlnetwork.surveyor.state.IScrollDelegate; +import com.bingce.controlnetwork.surveyor.state.alonedistance.StateManagerAloneDistance; +import com.bingce.controlnetwork.surveyor.state.alonedistance._CheckStationState; +import com.bingce.controlnetwork.surveyor.state.alonedistance._DoCalAdjustState; +import com.bingce.controlnetwork.surveyor.state.alonedistance._IsSingleCycleCompletedState; + +/** + * 单独测距 + */ +public class MeasureDistanceFragment extends BaseFragment + implements IDistanceTypeChangeListener, ISurveyState, IMeasureOperate { + + private MeasureAngleDistanceAdapter adapter = null; + private StateManagerAloneDistance stateManager; //这里的stateManager是克隆StateManager + private RecyclerView recyclerView; + private IMeasureCache cachedData = null; + private ISurveyorData surveyedData = null; + + private String stationId() { + if (getArguments() == null) { + return null; + } + return getArguments().getString(KEY_STATION_ID); + } + + private String getWellType() { + if (getArguments() != null) { + return getArguments().getString(KEY_TYPE_ANGLE_OR_DISTANCE); + } + return null; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate( + R.layout.fragment_project_surveyor_station_point_list_layout, + container, + false); + recyclerView = view.findViewById(R.id.recycler_view); + + + collectData(stationId(), + getContext(), + getChildFragmentManager(), + getViewLifecycleOwner(), + this::runOnUI, + index -> { + scrollToPosition(index); + }, + new ICollectCacheCallback() { + @Override + public void onFailure() { + } + + @Override + public void onSuccess(boolean showSlopDistance, IMeasureCache cachedData, SurveyorData surveyorData, StateManagerAloneDistance stateManager) { + onCollectStationData(showSlopDistance, cachedData, surveyorData, stateManager); + } + } + ); + + return view; + } + + @WorkerThread + private void onCollectStationData( + boolean showSlopDistance, + IMeasureCache cachedData, + SurveyorData surveyorData, + StateManagerAloneDistance stateManager) { + this.stateManager = stateManager; + this.cachedData = cachedData; + this.surveyedData = surveyorData; + + //测量数据收集完毕后,就可以更新UI了 + runOnUI(() -> { + //刷新UI + if (adapter == null) { + adapter = new MeasureAngleDistanceAdapter(stationId(), + cachedData, surveyorData, surveyorData, getWellType()); + adapter.onShowSlopDistance(showSlopDistance); + if (recyclerView != null) { + recyclerView.setAdapter(adapter); + //滚动到当前目标点 + int currentItemIndex = surveyorData.currentIndex(); + scrollToPosition(currentItemIndex); + } + + adapter.setOnItemClickListener(position -> { + if (isSurveying() || isAutoSurveying()) { + ToastUtils.showShort(R.string.measuring_please_waite); + return; + } + stateManager.switchCurrentMeasurePosition(position); + scrollToPosition(position); +// adapter.notifyDataSetChanged(); + }); + } + + //监听测站数据,更新界面「平距」「斜距」显示 + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getLiveDataRecord(stationId()) + .observe(getViewLifecycleOwner(), + surveyorStationRecord -> { + stateManager.updateStationRecord(surveyorStationRecord); + onShowSlopDistance(surveyorStationRecord.isShowSlopDistance()); + }); + }); + } + + private void scrollToPosition(int position) { + if (position >= 0 && adapter != null && position < adapter.getItemCount()) { + recyclerView.scrollToPosition(position); + adapter.notifyDataSetChanged(); + } + } + + /** + * 收集测站信息 + */ + private synchronized void collectData( + String stationId, + Context context, + FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + IUIRunner runner, + IScrollDelegate scrollDelegate, + ICollectCacheCallback callback) { + + boolean isSupportAutoMode = TotalStation.getInstance().isSupportMotor(); + ThreadPoolUtil.execute(() -> { + //读取当前测站的当前测回--很重要 + SurveyorScheduleRecord scheduleRecord = + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .findScheduleSync(SurveyorScheduleConstants.getCurrentCycleKey(stationId, SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE)); + int defaultCycle = scheduleRecord == null ? 0 : + DigitalUtil.valueOfIntString(scheduleRecord.getStatue(), 0); + //加载测站信息 + SurveyorStationRecord surveyorStationRecord = + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getRecordSync(stationId); + //加载对应项目 + ProjectRecord projectRecord = SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getRecord(surveyorStationRecord.getProjectId()); + if (projectRecord == null) { + callback.onFailure(); + return; + } + //加载对应限差 + ToleranceDetailRecord toleranceRecord = SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource() + .getRecordSync(projectRecord.getToleranceId()); + if (toleranceRecord == null) { + callback.onFailure(); + return; + } + //创建缓存数据 + CachedDataAloneDistance cachedData = CachedDataAloneDistance.newInstance(stationId); + //是否显示斜距? + cachedData.onShowSlopDistance(surveyorStationRecord.isShowSlopDistance()); + + //创建stateManager实例 + SurveyorData surveyorDataSource = new SurveyorData(ToleranceDetailRecord.ALONE_DISTANCE_MEASURE_COUNT); + surveyorDataSource.onShowSlopDistance(surveyorStationRecord.isShowSlopDistance()); + + StateManagerAloneDistance stateManager = StateManagerAloneDistance.newInstance( + isSupportAutoMode, + surveyorStationRecord, + context, + fragmentManager, + lifecycleOwner, + toleranceRecord, + surveyorDataSource, + surveyorDataSource, + cachedData, + createMeasureVm(), + scrollDelegate, + runner); + //fragment创建后立即计算当前cycle的测量状态 + runner.runOnUI(() -> + stateManager.calScheduleWhenEnterSurveyFragment(defaultCycle)); + callback.onSuccess(surveyorStationRecord.isShowSlopDistance(), cachedData, surveyorDataSource, stateManager); + }); + } + + public interface ICollectCacheCallback { + void onFailure(); + + void onSuccess(boolean showSlopDistance, IMeasureCache cachedData, SurveyorData surveyorData, StateManagerAloneDistance stateManager); + } + + @Override + public void doSurveyor() { + if (stateManager == null) { + return; + } + stateManager.doSurveyor(); + } + + @Override + public void autoSurvey() { + if (stateManager == null) { + return; + } + stateManager.doAutoSurveyor(); + } + + @Override + public void switchCycle(int cycleIndex) { + if (stateManager == null) { + return; + } + stateManager.switch2Cycle(cycleIndex); + } + + @Override + public void deleteStationAllPeroidRecord() { + if (stateManager == null) { + return; + } + stateManager.deleteCurrentStationSurveyorData(); + } + + @Override + public void deleteStationOnePeriodRecord(int cycleIndex) { +// if (stateManager == null) { +// return; +// } +// stateManager.deleteCurrentStationSurveyorData(cycleIndex); + } + + @Override + public String stationCheck() { + if (stateManager == null) { + return null; + } + return _CheckStationState._stationCheckAloneDistance(stationId(), stateManager.getToleranceRecord(), stateManager.getCachedData()); + } + + @Override + public void stationAdjust() { + if (stateManager == null) { + return; + } + _DoCalAdjustState.doCalAdjust(stationId(), stateManager.getCachedData(), requireContext(), + getChildFragmentManager(), getViewLifecycleOwner()); +// stateManager.stationAdjust(); + } + + @Override + public void goBack() { + if (stateManager == null) { + return; + } + stateManager.moveBack(); + } + + @Override + public void onShowSlopDistance(boolean value) { + if (cachedData != null) { + cachedData.onShowSlopDistance(value); + } + if (surveyedData != null) { + surveyedData.onShowSlopDistance(value); + } + if (adapter != null) { + adapter.onShowSlopDistance(value); + adapter.notifyItemRangeChanged(0, adapter.getItemCount()); + } + } + + @Override + public boolean isSurveying() { + if (stateManager != null) { + return stateManager.isSurveying(); + } + return false; + } + + @Override + public boolean isAutoSurveying() { + if (stateManager != null) { + return stateManager.isAutoSurveying(); + } + return false; + } + + private static final String KEY_STATION_ID = "__station_id"; + private static final String KEY_TYPE_ANGLE_OR_DISTANCE = "__key_type_angle_or_distance"; + public static final String TAG = ComponentStationSurveyorDataListFragment.class.getName(); + + public static MeasureDistanceFragment newInstance(String stationId, String typeAngleOrDistance) { + MeasureDistanceFragment fragment = new MeasureDistanceFragment(); + Bundle bundle = new Bundle(); + bundle.putString(KEY_STATION_ID, stationId); + bundle.putString(KEY_TYPE_ANGLE_OR_DISTANCE, typeAngleOrDistance); + fragment.setArguments(bundle); + return fragment; + } + + @Override + public boolean isCurrentCycleComplete() { + if (stateManager == null) + return false; + boolean completed = _IsSingleCycleCompletedState.isSingleCycleCompleted( + stationId(), + StateManagerAloneDistance.CYCLE_INDEX_DEFAULT, + stateManager.getCachedData(), ToleranceDetailRecord.ALONE_DISTANCE_MEASURE_COUNT); + return completed; + } + + @Override + public void refreshGoBackBtnEnable() { + if (stateManager == null || stateManager.getCachedData().pointCount() == 0) { + EventBus.getDefault().post(new RefreshGoBackButtonAloneDistance(false)); + return; + } + stateManager.refreshGoBackBtnEnable(); + } + + @Override + public int measureTypePosition() { + return MeasureFragment.POSITION_DISTANCE_MEASURE; + } + + private MeasureVm createMeasureVm() { + return new ViewModelProvider(requireParentFragment()).get(MeasureVm.class); + } + + +} + + + diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureFragment.java new file mode 100644 index 0000000..05e9ae3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureFragment.java @@ -0,0 +1,179 @@ +package com.bingce.controlnetwork.fragment.stationsurvey.angledistance; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.util.StationUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; +import com.bingce.controlnetwork.adapter.MeasureAngleDistanceAdapter; +import com.bingce.controlnetwork.fragment.SurveyorSettingsFragment; +import com.bingce.controlnetwork.fragment.stationsetting.StationSettingsFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.MethodCheckSetting; +import com.bingce.controlnetwork.fragment.stationsurvey.base.MeasureBaseFragment; +import com.bingce.controlnetwork.surveyor.surveyor.TestDataSelectFragment; +import com.bingce.utils.ThreadPoolUtil; + +import org.jetbrains.annotations.NotNull; + +/** + * 测站测量页面(开始测量) + */ +public class MeasureFragment extends MeasureBaseFragment { + public static final String TAG = MeasureFragment.class.getName(); + + //方位观测fragment的在adapter的索引 + public static final int POSITION_DIRECTION_MEASURE = 0; + public static final int POSITION_DISTANCE_MEASURE = 1; + + @Override + protected boolean isShowSelectCycle(int position) { + return POSITION_DIRECTION_MEASURE == position; + } + + @Override + protected int defaultPageIndex() { + return POSITION_DIRECTION_MEASURE; + } + + @Override + protected void addFragmentsTabs(Runnable runnable) { + MeasureDefaultFragment fragmentAngle = MeasureDefaultFragment.newInstance(stationId(), MeasureAngleDistanceAdapter.TYPE_ANGLE); + fragments.add(fragmentAngle); + MeasureDistanceFragment fragmentDistance = MeasureDistanceFragment.newInstance(stationId(), MeasureAngleDistanceAdapter.TYPE_DISTANCE); + fragments.add(fragmentDistance); + + tabs.add(Tools.getString(R.string.azimuth_observation)); + tabs.add(Tools.getString(R.string.alone_measure_distance)); + runnable.run(); + } + + @Override + protected boolean isAloneDistancePage(int pageIndex) { + return POSITION_DISTANCE_MEASURE == pageIndex; + } + + @Override + protected String getCurrentPageCycleKey() { + if (mBinding.vp.getCurrentItem() == POSITION_DIRECTION_MEASURE) { + return SurveyorScheduleConstants.getCurrentCycleKey(stationId(), null); + } else { + return SurveyorScheduleConstants.getCurrentCycleKey(stationId(), SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE); + } + } + + @Override + protected String getScheduleIdForAllCycle() { + int currentItem = mBinding.vp.getCurrentItem(); + String scheduleId; + if (!isAloneDistancePage(currentItem)) { + scheduleId = SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), null); + } else { + scheduleId = SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE); + } + return scheduleId; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + initObserver(); + return view; + } + + private void initObserver() { + //监听测站变化 + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getLiveDataRecord(stationId()) + .observe(getViewLifecycleOwner(), + stationRecord -> { + checkStationSettings(); + }); + +// SurveyorScheduleConstants.getCurrentCycleKey(stationId(), SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE); + monitorCurrentCycle(SurveyorScheduleConstants.getCurrentCycleKey(stationId(), null)); + } + + private void checkStationSettings() { + ThreadPoolUtil.execute(() -> MethodCheckSetting.checkStationSettings(stationId(), this, this::runOnUI)); + } + + @Override + public void onPrepareOptionsMenu(@NonNull Menu menu) { + super.onPrepareOptionsMenu(menu); + //删除当前测回记录 + menu.findItem(R.id.menu_item_delete_current_records).setEnabled(deleteSingleCycleEnable()); + } + + @Override + public boolean onOptionsItemSelected(@NonNull @NotNull MenuItem item) { + if (R.id.menu_item_delete_current_records == item.getItemId()) { + //删除当前测回记录 + if (surveyorStationRecord != null && currentFragment != null) { + //通知fragment + currentFragment.deleteStationOnePeriodRecord(cycleIndex); + } + } else if (R.id.menu_item_delete_all_records == item.getItemId()) { + //删除所有测回记录 + if (surveyorStationRecord != null && currentFragment != null) { + //通知fragment + currentFragment.deleteStationAllPeroidRecord(); + } + } else if (R.id.menu_item_station_check == item.getItemId() && currentFragment != null) { + //测站检测 + stationCheckBefore(); + } else if (R.id.menu_item_data_source == item.getItemId()) { + //数据源 debug使用 + TestDataSelectFragment.show(getChildFragmentManager()); + } else if (R.id.menu_item_go_back == item.getItemId() && currentFragment != null) { + //回退 + currentFragment.goBack(); + } else if (R.id.menu_item_station_environment_prism_settings == item.getItemId()) { + //环境、棱镜设置 + StationSettingsFragment.start(getContext(), stationId()); + } else if (R.id.menu_item_surveyor_settings == item.getItemId()) { + //测量设置 设置是否显示平距 + ThreadPoolUtil.execute(() -> { + String name = StationUtil.getStationName(surveyorStationRecord); + runOnUI(() -> SurveyorSettingsFragment.start(getContext(), surveyorStationRecord.getId(), name)); + }); + } else if (R.id.menu_item_station_adjust == item.getItemId() && currentFragment != null) { + //测站平差 + stationCheckAdjustBefore(); + } + return super.onOptionsItemSelected(item); + } + + private boolean deleteSingleCycleEnable() { + return currentFragment != null && currentFragment instanceof MeasureDefaultFragment; + } + + public static void start(Context context, String surveyorStationId, String surveyorStationName) { + Bundle bundle = new Bundle(); + bundle.putString(BundleConstants.KEY_SURVEYOR_STATION_ID, surveyorStationId); + FragmentContainerActivity.start(context, TAG, surveyorStationName, bundle); + } + + public static Fragment newInstance(Bundle args) { + Fragment fragment = new MeasureFragment(); + fragment.setArguments(args); + return fragment; + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureVm.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureVm.java new file mode 100644 index 0000000..133f85c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/MeasureVm.java @@ -0,0 +1,20 @@ +package com.bingce.controlnetwork.fragment.stationsurvey.angledistance; + +import androidx.lifecycle.ViewModel; + +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParamAuto; + +public class MeasureVm extends ViewModel { + private RequestSurveyorParamAuto requestSurveyorParamAuto; + + + public RequestSurveyorParamAuto getRequestSurveyorParamAuto() { + return requestSurveyorParamAuto; + } + + public void setRequestSurveyorParamAuto(RequestSurveyorParamAuto requestSurveyorParamAuto) { + this.requestSurveyorParamAuto = requestSurveyorParamAuto; + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/StationCheckBeforeUtil.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/StationCheckBeforeUtil.java new file mode 100644 index 0000000..621e2a2 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/angledistance/StationCheckBeforeUtil.java @@ -0,0 +1,83 @@ +package com.bingce.controlnetwork.fragment.stationsurvey.angledistance; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.utils.ThreadPoolUtil; + +import com.bingce.controlnetwork.R; + +public class StationCheckBeforeUtil { + + public static final int STATION_CHECK = 1; + public static final int STATION_ADJUST = 2; + + + private static final String DATA_COMPLETE_NOT = Tools.getString(R.string.station_data_is_incomplete_hint); + + /** + * @param scheduleId 进度id eg:SurveyorScheduleConstants.stationScheduleKeyForAllCycle(stationId(), null) + * @param callBack + */ + public static void stationDetectBefore(String scheduleId, ICallBack callBack) { + ThreadPoolUtil.execute(() -> { + SurveyorScheduleRecord surveyorScheduleRecord = SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .findScheduleSync(scheduleId); + ThreadPoolUtil.executeInMain(() -> { + if (surveyorScheduleRecord == null) { + callBack.error(DATA_COMPLETE_NOT); + return; + } + String statue = surveyorScheduleRecord.getStatue(); + if (SurveyorScheduleConstants.STATUE_VALUE_CHECKED.equals(statue) + || SurveyorScheduleConstants.STATUE_VALUE_COMPLETED.equals(statue)) { + //完成测量或者经过检测后进行测站检测 + callBack.next(STATION_CHECK); + } else { + callBack.error(DATA_COMPLETE_NOT); + } + }); + }); + } + + /** + * 测站平差 + * + * @param scheduleId 进度id eg:SurveyorScheduleConstants.stationScheduleKeyForAllCycle(stationId(), null) + * @param callBack + */ + public static void stationAdjustBefore(String scheduleId, ICallBack callBack) { + ThreadPoolUtil.execute(() -> { + SurveyorScheduleRecord surveyorScheduleRecord = SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .findScheduleSync(scheduleId); + ThreadPoolUtil.executeInMain(() -> { + if (surveyorScheduleRecord == null) { + callBack.error(DATA_COMPLETE_NOT); + return; + } + String statue = surveyorScheduleRecord.getStatue(); + if (SurveyorScheduleConstants.STATUE_VALUE_CHECKED.equals(statue)) { + //测站经过检测->测站平差 + callBack.next(STATION_ADJUST); + } else if (SurveyorScheduleConstants.STATUE_VALUE_COMPLETED.equals(statue)) { + //测站完成测量->测站检测 + callBack.next(STATION_CHECK); + } else { + callBack.error(DATA_COMPLETE_NOT); + } + }); + }); + } + + public interface ICallBack { + void next(int nextType); + + void error(String error); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/base/MeasureBaseFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/base/MeasureBaseFragment.java new file mode 100644 index 0000000..da46c93 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/base/MeasureBaseFragment.java @@ -0,0 +1,489 @@ +package com.bingce.controlnetwork.fragment.stationsurvey.base; + +import android.graphics.Color; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.lifecycle.Lifecycle; +import androidx.viewpager.widget.ViewPager; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.AutoSurveyorButtonVisibleEvent; +import com.bingce.controlapphelper.event.RefreshGoBackButton; +import com.bingce.controlapphelper.event.RefreshGoBackButtonAloneDistance; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.surveyor.test.Test; +import com.bingce.controlapphelper.util.DigitalUtil; +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.databinding.FragmentMeasureBinding; +import com.bingce.controlnetwork.fragment.BottomSheetSelectListFragment; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.controlnetwork.fragment.base.BaseFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.IMeasureOperate; +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.StationCheckBeforeUtil; +import com.bingce.utils.ThreadPoolUtil; +import com.flyco.tablayout.SlidingTabLayout; +import com.github.razir.progressbutton.DrawableButtonExtensionsKt; +import com.github.razir.progressbutton.ProgressButtonHolderKt; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import blankj.utilcode.util.ToastUtils; + +public abstract class MeasureBaseFragment extends BaseFragment { + private boolean menuItemRollBackEnable; + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onRefreshGoBack(RefreshGoBackButton event) { + if (mBinding != null) { + int currentItem = mBinding.vp.getCurrentItem(); + if (!isAloneDistancePage(currentItem)) { + menuItemRollBackEnable = event.validate; + } + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onRefreshGoBack(RefreshGoBackButtonAloneDistance event) { + if (mBinding != null) { + int currentItem = mBinding.vp.getCurrentItem(); + if (isAloneDistancePage(currentItem)) { + menuItemRollBackEnable = event.validate; + } + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onSurveyorStateChanged(SurveyStateEvent event) { + if (isInValidEventPosition(event.getPosition())) + return; + + if (event.isIdle() || event.isSuccess() || event.isCompleted()) { + DrawableButtonExtensionsKt.hideProgress(mBinding.surveyor, R.string.start_surveyor); + } else if (event.isSurveying()) { + DrawableButtonExtensionsKt.showProgress(mBinding.surveyor, progressParams -> { + progressParams.setButtonTextRes(R.string.tips_surveying); + progressParams.setProgressColor(Color.WHITE); + return null; + }); + } else if (event.isFailure()) { + DrawableButtonExtensionsKt.hideProgress(mBinding.surveyor, R.string.tips_surveyor_failure_and_retry); + } + + boolean enable = event.isIdle() || event.isFailure() || event.isSuccess(); + setSurveyorEnable(mBinding.surveyor, enable); + setSurveyorEnable(mBinding.autoSurveyor, enable); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onAutoSurveyorChanged(AutoSurveyorButtonVisibleEvent event) { + if (isInValidEventPosition(event.getPosition())) + return; + mBinding.autoSurveyor.setVisibility(event.isReadyAutoSurvey() ? View.VISIBLE : View.GONE); + } + + protected FragmentMeasureBinding mBinding; + + protected IMeasureOperate currentFragment; + + protected SurveyorStationRecord surveyorStationRecord; + protected int cycleIndex = 0; + protected ArrayList cycleList; + + protected abstract boolean isShowSelectCycle(int position); + + protected abstract int defaultPageIndex(); + + protected abstract void addFragmentsTabs(Runnable runnable); + + protected abstract boolean isAloneDistancePage(int pageIndex); + + protected abstract String getCurrentPageCycleKey(); + + protected abstract String getScheduleIdForAllCycle(); + + protected void setSurveyorEnable(View view, boolean enable) { + if (view != null) { + view.setEnabled(enable); + if (enable) { + view.setAlpha(1); + } else { + view.setAlpha(.4f); + } + } + } + + protected List fragments = new ArrayList<>(); + protected List tabs = new ArrayList<>(); + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + setHasOptionsMenu(true); + EventBus.getDefault().register(this); + mBinding = FragmentMeasureBinding.inflate(inflater, container, false); + //设置测量按钮 + ProgressButtonHolderKt.bindProgressButton(getViewLifecycleOwner(), mBinding.surveyor); + initClickListener(); + return mBinding.getRoot(); + } + + @Override + public void onResume() { + super.onResume(); + //测量界面保持常亮 + if (getActivity() != null) { + getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + } + + @Override + public void onPause() { + super.onPause(); + //关闭测量界面保持常亮 + if (getActivity() != null) { + getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initStation(); + initView(); + initViewPager(view); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + mBinding = null; + EventBus.getDefault().unregister(this); + } + + @Override + public void onCreateOptionsMenu(@NonNull @NotNull Menu menu, @NonNull @NotNull MenuInflater inflater) { + if (Test.DEBUG) { + inflater.inflate(R.menu.menu_surveyor_station_record_data_edit_debug, menu); + } else { + inflater.inflate(R.menu.menu_surveyor_station_record_data_edit_release, menu); + } + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public void onPrepareOptionsMenu(@NonNull Menu menu) { + super.onPrepareOptionsMenu(menu); + menu.findItem(R.id.menu_item_go_back).setEnabled(menuItemRollBackEnable); + } + + private void initClickListener() { + mBinding.surveyor.setOnClickListener(view -> { + goSurvey(); + }); + mBinding.autoSurveyor.setOnClickListener(view -> { + goAutoSurvey(); + }); + + //测回点击 + mBinding.cycleLayout.setOnClickListener(view -> { + if (cycleList == null || cycleList.isEmpty()) { + ToastUtils.showShort(R.string.cycle_data_abnormal_toast); + return; + } + BottomSheetSelectListFragment.showSelect( + getChildFragmentManager(), + getViewLifecycleOwner(), + cycleIndex, + cycleList, + null,//不再限制测期 + (index, string) -> { + mBinding.circleText.setText(string); + cycleIndex = index; + refreshCycleForFragment(); + }); + } + ); + } + + private void refreshCycleForFragment() { + if (currentFragment != null) { + //检测当前测回是否完成 + currentFragment.switchCycle(cycleIndex); + } + } + + protected String stationId() { + if (getArguments() == null) { + return null; + } + return getArguments().getString(BundleConstants.KEY_SURVEYOR_STATION_ID); + } + + private void initStation() { + ThreadPoolUtil.execute(() -> { + surveyorStationRecord = SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getRecordSync(stationId()); + //监听数据变化 + ToleranceDetailRecord toleranceRecord = getTolerance(surveyorStationRecord); + if (toleranceRecord == null) { + return; + } + AtomicInteger cycleCount = new AtomicInteger(toleranceRecord.getCycleCount()); + cycleList = SurveyorCycleUtil.cycleStrings(cycleCount.get(), + surveyorStationRecord != null && surveyorStationRecord.leftAndRightSurveyor); + + }); + } + + protected void initView() { + + } + + private void initViewPager(View view) { + fragments = new ArrayList<>(); + addFragmentsTabs(() -> { + mBinding.tabLayout.setVisibility(fragments.size() == 1 ? View.GONE : View.VISIBLE); + + mBinding.cycleLayout.setVisibility(isShowSelectCycle(mBinding.vp.getCurrentItem()) ? View.VISIBLE : View.GONE); + + SlidingTabLayout tabLayout = view.findViewById(R.id.tabLayout); + mBinding.vp.setAdapter(new MyPagerAdapter(getChildFragmentManager())); + tabLayout.setViewPager(mBinding.vp); + + mBinding.vp.setCurrentItem(defaultPageIndex()); + currentFragment = fragments.get(defaultPageIndex()); + + mBinding.vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + currentFragment = fragments.get(position); + View pick = view.findViewById(R.id.cycleLayout); +// //是否显示选择测期 + pick.setVisibility(isShowSelectCycle(position) ? View.VISIBLE : View.GONE); + //刷新测量按钮状态 + boolean currentCycleComplete = currentFragment.isCurrentCycleComplete(); + if (currentCycleComplete) { + SurveyStateEvent.postCompleted(position); + } else { + SurveyStateEvent.postIdle(position); + } + + setCycleForSwitchPage(); + + currentFragment.refreshGoBackBtnEnable(); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + }); + } + + private void setCycleForSwitchPage() { + ThreadPoolUtil.execute(() -> { + SurveyorScheduleRecord record = SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .findScheduleSync(getCurrentPageCycleKey()); + + if (record != null) { + refreshCycleUi(record); + refreshCycleForFragment(); + } + }); + } + + protected void monitorCurrentCycle(String currentCycleKey) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .findSchedule(currentCycleKey) + .observe(getViewLifecycleOwner(), record -> { + if (!currentCycleKey.equals(getCurrentPageCycleKey())) { + return; + } + refreshCycleUi(record); + }); + } + + private void refreshCycleUi(SurveyorScheduleRecord record) { + int cycleIndex = DigitalUtil.valueOfIntString(record == null ? "0" : record.getStatue(), 0); + //更新测回名称 + boolean showLeftOrRight = true; + if (surveyorStationRecord != null) { + showLeftOrRight = surveyorStationRecord.leftAndRightSurveyor; + } + mBinding.circleText.setText(SurveyorCycleUtil.cycleName(cycleIndex, showLeftOrRight)); + this.cycleIndex = cycleIndex; + } + + + @WorkerThread + private static ToleranceDetailRecord getTolerance(SurveyorStationRecord surveyorStationRecord) { + if (surveyorStationRecord == null) { + return null; + } + //获取project信息 + ProjectRecord projectRecord = SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getRecord(surveyorStationRecord.getProjectId()); + if (projectRecord == null) { + return null; + } + //获取限差数据 + return SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource() + .getRecordSync(projectRecord.getToleranceId()); + } + + private void goSurvey() { + if (currentFragment != null) { + currentFragment.doSurveyor(); + } + } + + private void goAutoSurvey() { + if (currentFragment != null) { + currentFragment.autoSurvey(); + } + } + + private class MyPagerAdapter extends FragmentPagerAdapter { + public MyPagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public int getCount() { + return fragments.size(); + } + + @Override + public CharSequence getPageTitle(int position) { + return tabs.get(position); + } + + @Override + public Fragment getItem(int position) { + return (Fragment) fragments.get(position); + } + } + + protected void stationCheckAdjustBefore() { + StationCheckBeforeUtil.stationAdjustBefore(getScheduleIdForAllCycle(), new StationCheckBeforeUtil.ICallBack() { + + @Override + public void next(int nextType) { + if (currentFragment != null) { + if (nextType == StationCheckBeforeUtil.STATION_ADJUST) { + currentFragment.stationAdjust(); + } else if (nextType == StationCheckBeforeUtil.STATION_CHECK) { + //已经完成测量,开始测站检测 + String error = currentFragment.stationCheck(); + if (TextUtils.isEmpty(error)) { + currentFragment.stationAdjust(); + } else { + TipsFragment.cancelAbleTips(getChildFragmentManager(), getViewLifecycleOwner(), requireContext(), + error + Tools.getString(R.string.is_adjustment_forced), 0, () -> { + currentFragment.stationAdjust(); + }); + } + } + } + } + + @Override + public void error(String error) { + tipsError(error); + } + }); + + } + + protected void stationCheckBefore() { + StationCheckBeforeUtil.stationDetectBefore(getScheduleIdForAllCycle(), new StationCheckBeforeUtil.ICallBack() { + @Override + public void next(int nextType) { + if (currentFragment != null) { + String error = currentFragment.stationCheck(); + if (TextUtils.isEmpty(error)) { + if (isVisiable()) { + TipsFragment.cancelAbleTips(getChildFragmentManager(), getViewLifecycleOwner(), requireContext(), + Tools.getString(R.string.station_passed_is_adjust), 0, + () -> currentFragment.stationAdjust()); + } + } else { + tipsError(error); + } + } + } + + @Override + public void error(String error) { + tipsError(error); + } + }); + } + + private void tipsError(String error) { + if (isVisiable() && !TextUtils.isEmpty(error)) { + TipsFragment.tipsOnly(getChildFragmentManager(), getViewLifecycleOwner(), requireContext(), error); + } + } + + private boolean isVisiable() { + return getViewLifecycleOwner().getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED); + } + + private int getCurrentPageTypePosition() { + return fragments.get(mBinding.vp.getCurrentItem()).measureTypePosition(); + } + + /** + * 是否是无效的点 + * + * @param position + * @return + */ + private boolean isInValidEventPosition(int position) { + return mBinding == null || position != getCurrentPageTypePosition(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/heighttraverse/MeasureHeightTraverseFragment.kt b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/heighttraverse/MeasureHeightTraverseFragment.kt new file mode 100644 index 0000000..7dbaa22 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/heighttraverse/MeasureHeightTraverseFragment.kt @@ -0,0 +1,194 @@ +package com.bingce.controlnetwork.fragment.stationsurvey.heighttraverse + +import android.content.Context +import android.os.Bundle +import android.view.MenuItem +import android.view.View +import androidx.fragment.app.Fragment +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory +import com.bingce.controlapphelper.datasource.database.heighttraverse.config.model.StationLayout +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants +import com.bingce.controlapphelper.model.BundleConstants +import com.bingce.controlapphelper.util.StationUtil.getStationName +import com.bingce.controlapphelper.util.Tools +import com.bingce.controlnetwork.R +import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity +import com.bingce.controlnetwork.fragment.SurveyorSettingsFragment +import com.bingce.controlnetwork.fragment.stationsetting.StationSettingHeightTraverseFragment +import com.bingce.controlnetwork.fragment.stationsurvey.base.MeasureBaseFragment +import com.bingce.controlnetwork.surveyor.state.heighttraverse.__BaseState +import com.bingce.controlnetwork.surveyor.surveyor.TestDataSelectFragment +import com.bingce.utils.ThreadPoolUtil +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class MeasureHeightTraverseFragment : MeasureBaseFragment() { + + private val mainScope = MainScope() + + companion object { + const val POSITION_BACK_PAGE = 0 + const val POSITION_FRONT_PAGE = 1 + + @JvmField + val TAG: String = MeasureHeightTraverseFragment::class.java.name + + @JvmStatic + fun start(context: Context, surveyorStationId: String, surveyorStationName: String?) { + val bundle = Bundle() + bundle.putString(BundleConstants.KEY_SURVEYOR_STATION_ID, surveyorStationId) + FragmentContainerActivity.start( + context, + TAG, + surveyorStationName, + bundle + ) + } + + @JvmStatic + fun newInstance(args: Bundle?): Fragment { + val fragment: Fragment = MeasureHeightTraverseFragment() + fragment.arguments = args + return fragment + } + + } + + override fun isShowSelectCycle(position: Int): Boolean { + return false + } + + override fun defaultPageIndex(): Int { + return POSITION_BACK_PAGE + } + + override fun initView() { + super.initView() + setSurveyorEnable(mBinding.surveyor, false) + } + + override fun addFragmentsTabs(runnable: Runnable) { + mainScope.launch(Dispatchers.IO) { + val stationId = stationId() + + val stationRecord = + SurveyorDatabaseFactory.instance.surveyorStation.getRecordSync(stationId) + val configRecord = + SurveyorDatabaseFactory.instance.getHeightTraverseConfigDataSource() + .getRecordByProjectId(stationRecord.getProjectId()) + + if (configRecord?.stationLayout == StationLayout.SEPARATE) { + fragments.add( + MeasureHeightTraverseSubFragment.newInstance( + stationId, + POSITION_BACK_PAGE + ) + ) + fragments.add( + MeasureHeightTraverseSubFragment.newInstance( + stationId, + POSITION_FRONT_PAGE + ) + ) + + tabs.add(Tools.getString(R.string.rearview)) + tabs.add(Tools.getString(R.string.forward_view)) + } else if (configRecord?.stationLayout == StationLayout.EVERY) { + fragments.add( + MeasureHeightTraverseSubFragment.newInstance( + stationId, + POSITION_FRONT_PAGE + ) + ) + tabs.add(Tools.getString(R.string.forward_view)) + } + withContext(Dispatchers.Main) { + runnable.run() + } + } + } + + override fun isAloneDistancePage(pageIndex: Int): Boolean { + return false + } + + override fun getCurrentPageCycleKey(): String { + return SurveyorScheduleConstants.getCurrentCycleKey( + stationId(), + __BaseState.getScheduleKey(mBinding.vp.currentItem) + ) + } + + override fun getScheduleIdForAllCycle(): String { + val measureHeightTraverseSubFragment = currentFragment as MeasureHeightTraverseSubFragment + val positionFragment = measureHeightTraverseSubFragment.backOrFrontPosition + return SurveyorScheduleConstants.getAllCycleScheduleKey( + stationId(), + __BaseState.getScheduleKey(positionFragment) + ) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + monitorCurrentCycle( + SurveyorScheduleConstants.getCurrentCycleKey( + stationId(), + SurveyorScheduleConstants.STATION_TYPE_HEIGHT_TRAVERSE_BACK + ) + ) + monitorCurrentCycle( + SurveyorScheduleConstants.getCurrentCycleKey( + stationId(), + SurveyorScheduleConstants.STATION_TYPE_HEIGHT_TRAVERSE_FRONT + ) + ) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (R.id.menu_item_delete_current_records == item.itemId) { + //删除当前测回记录 + if (surveyorStationRecord != null && currentFragment != null) { + //通知fragment + currentFragment.deleteStationOnePeriodRecord(cycleIndex) + } + } else if (R.id.menu_item_delete_all_records == item.itemId) { + //删除所有测回记录 + if (surveyorStationRecord != null && currentFragment != null) { + //通知fragment + currentFragment.deleteStationAllPeroidRecord() + } + } else if (R.id.menu_item_station_check == item.itemId && currentFragment != null) { + //测站检测 + stationCheckBefore() + } else if (R.id.menu_item_data_source == item.itemId) { + //数据源 debug使用 + TestDataSelectFragment.show(childFragmentManager) + } else if (R.id.menu_item_go_back == item.itemId && currentFragment != null) { + //回退 + currentFragment.goBack() + } else if (R.id.menu_item_station_environment_prism_settings == item.itemId) { + //环境、棱镜设置 + StationSettingHeightTraverseFragment.start(requireContext(), stationId()) + } else if (R.id.menu_item_surveyor_settings == item.itemId) { + //测量设置 设置是否显示平距 + ThreadPoolUtil.execute { + val name = getStationName(surveyorStationRecord) + runOnUI { + SurveyorSettingsFragment.start( + context, + surveyorStationRecord.getId(), + name + ) + } + } + } else if (R.id.menu_item_station_adjust == item.itemId && currentFragment != null) { + //测站平差 + stationCheckAdjustBefore() + } + return super.onOptionsItemSelected(item) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/heighttraverse/MeasureHeightTraverseSubFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/heighttraverse/MeasureHeightTraverseSubFragment.java new file mode 100644 index 0000000..1d8e2d0 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/stationsurvey/heighttraverse/MeasureHeightTraverseSubFragment.java @@ -0,0 +1,416 @@ +package com.bingce.controlnetwork.fragment.stationsurvey.heighttraverse; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.RefreshGoBackButton; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.CachedDataHeightTraverse; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.IDistanceTypeChangeListener; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.data.SurveyorData; +import com.bingce.controlapphelper.surveyor.state.ISurveyState; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParamAuto; +import com.bingce.controlapphelper.util.IUIRunner; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlnetwork.adapter.MeasureHeightTraverseAdapter; +import com.bingce.controlnetwork.fragment.ComponentStationSurveyorDataListFragment; +import com.bingce.controlnetwork.fragment.StationDataAdjustDialogFragment; +import com.bingce.controlnetwork.fragment.base.BaseLazyFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.IMeasureOperate; +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.MeasureVm; +import com.bingce.controlnetwork.surveyor.state.IScrollDelegate; +import com.bingce.controlnetwork.surveyor.state.heighttraverse.StateManagerHeightTraverse; +import com.bingce.totalstation.TotalStation; +import com.bingce.utils.ThreadPoolUtil; + +import org.greenrobot.eventbus.EventBus; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.MeasureHeightTraverseAdapter; +import com.bingce.controlnetwork.fragment.ComponentStationSurveyorDataListFragment; +import com.bingce.controlnetwork.fragment.StationDataAdjustDialogFragment; +import com.bingce.controlnetwork.fragment.base.BaseLazyFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.IMeasureOperate; +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.MeasureVm; +import com.bingce.controlnetwork.surveyor.state.IScrollDelegate; +import com.bingce.controlnetwork.surveyor.state.heighttraverse.StateManagerHeightTraverse; + +/** + * 测角测距 + */ +public class MeasureHeightTraverseSubFragment extends BaseLazyFragment + implements IDistanceTypeChangeListener, ISurveyState, IMeasureOperate { + private MeasureHeightTraverseAdapter adapter = null; + private StateManagerHeightTraverse stateManager; + private RecyclerView recyclerView; + private ICachedData cachedData = null; + private ISurveyorData surveyedData = null; + private ISurveyState surveyState; + + private String stationId() { + if (getArguments() == null) { + throw new RuntimeException("getArguments()==null"); + } + return getArguments().getString(KEY_STATION_ID); + } + + public int getBackOrFrontPosition() { + if (getArguments() == null) { + throw new RuntimeException("getArguments()==null"); + } + return getArguments().getInt(KEY_TYPE_BACK_OR_FRONT); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate( + R.layout.fragment_project_surveyor_station_point_list_layout, + container, + false); + recyclerView = view.findViewById(R.id.recycler_view); + return view; + } + + @WorkerThread + private void onCollectStationData( + boolean showSlopDistance, + ICachedData cachedData, + SurveyorData surveyorData, + StateManagerHeightTraverse stateManager) { + this.stateManager = stateManager; + this.cachedData = cachedData; + surveyedData = surveyorData; + + //测量数据收集完毕后,就可以更新UI了 + runOnUI(() -> { + //刷新UI + if (adapter == null) { + adapter = new MeasureHeightTraverseAdapter(stationId(), + cachedData, surveyorData, surveyorData, getBackOrFrontPosition()); + adapter.onShowSlopDistance(showSlopDistance); + if (recyclerView != null) { + recyclerView.setAdapter(adapter); + //滚动到当前目标点 + int currentItemIndex = surveyorData.currentIndex(); + if (currentItemIndex >= 0 && currentItemIndex < adapter.getItemCount()) { + recyclerView.scrollToPosition(currentItemIndex); + } + } + } + + //监听测站数据 + //监听「平距」「斜距」切换,更新UI显示 + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getLiveDataRecord(stationId()) + .observe(getViewLifecycleOwner(), + surveyorStationRecord -> onShowSlopDistance(surveyorStationRecord.isShowSlopDistance())); + }); + } + + /** + * 收集测站信息 + */ + private void collectData( + String stationId, + Context context, + FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + IUIRunner runner, + IScrollDelegate scrollDelegate, + ICollectCacheCallback callback) { + if (callback == null) { + return; + } + boolean isSupportAutoMode = TotalStation.getInstance().isSupportMotor(); + ThreadPoolUtil.execute(() -> { + //加载测站信息 + SurveyorStationRecord surveyorStationRecord = + SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getRecordSync(stationId); + //加载对应项目 + ProjectRecord projectRecord = SurveyorDatabaseFactory + .instance + .getProjectDataSource() + .getRecord(surveyorStationRecord.getProjectId()); + if (projectRecord == null) { + callback.onFailure(); + return; + } + //加载对应限差 + ToleranceDetailRecord toleranceRecord = SurveyorDatabaseFactory + .instance + .getToleranceDetailDataSource() + .getRecordSync(projectRecord.getToleranceId()); + if (toleranceRecord == null) { + callback.onFailure(); + return; + } + //创建缓存数据 + CachedDataHeightTraverse cachedData = + CachedDataHeightTraverse.newInstance(getBackOrFrontPosition(), + stationId, toleranceRecord); + if (cachedData == null) { + callback.onFailure(); + return; + } + + //是否显示斜距? + cachedData.onShowSlopDistance(surveyorStationRecord.isShowSlopDistance()); + if (cachedData.pointCount() <= 0) { + callback.onFailure(); + return; + } + + //创建stateManager实例 + SurveyorData surveyorDataSource = new SurveyorData(toleranceRecord.getSurveyorCount()); + surveyorDataSource.onShowSlopDistance(surveyorStationRecord.isShowSlopDistance()); + + //存入cacheData 用于自动测量时使用 + MeasureVm measureVm = new ViewModelProvider(requireParentFragment()).get(MeasureVm.class); + RequestSurveyorParamAuto requestSurveyorParamAuto = new RequestSurveyorParamAuto(stationId, cachedData); + measureVm.setRequestSurveyorParamAuto(requestSurveyorParamAuto); + + StateManagerHeightTraverse stateManager = StateManagerHeightTraverse.newInstance( + getBackOrFrontPosition(), + isSupportAutoMode, + requestSurveyorParamAuto, + surveyorStationRecord, + context, + fragmentManager, + lifecycleOwner, + toleranceRecord, + surveyorDataSource, + surveyorDataSource, + cachedData, + scrollDelegate, + runner); + //fragment创建后立即计算当前cycle的测量状态 + runner.runOnUI(() -> stateManager.calScheduleWhenEnterSurveyFragment(0)); + callback.onSuccess(surveyorStationRecord.isShowSlopDistance(), cachedData, surveyorDataSource, stateManager); + }); + } + + @Override + public void onResume() { + super.onResume(); + if (stateManager != null) { + stateManager.resume(); + } + } + + @Override + public void onPause() { + super.onPause(); + if (stateManager != null) { + stateManager.quite(); + } + } + + @Override + protected void loadData() { + String stationId = stationId(); + if (stationId != null) { + //收集信息 + collectData(stationId, + getContext(), + getChildFragmentManager(), + getViewLifecycleOwner(), + this::runOnUI, + index -> { + if (index >= 0 && adapter != null && index < adapter.getItemCount()) { + recyclerView.scrollToPosition(index); + } + }, + new ICollectCacheCallback() { + @Override + public void onFailure() { + } + + @Override + public void onSuccess(boolean showSlopDistance, ICachedData cachedData, SurveyorData surveyorData, StateManagerHeightTraverse stateManager) { + onCollectStationData(showSlopDistance, cachedData, surveyorData, stateManager); + surveyState = stateManager; + } + } + ); + } + } + + public interface ICollectCacheCallback { + void onFailure(); + + void onSuccess(boolean showSlopDistance, ICachedData cachedData, SurveyorData surveyorData, StateManagerHeightTraverse stateManager); + } + + @Override + public void doSurveyor() { + if (stateManager == null) { + return; + } + stateManager.doSurveyor(); + } + + @Override + public void autoSurvey() { + if (stateManager == null) { + return; + } + stateManager.doAutoSurveyor(); + } + + @Override + public void switchCycle(int cycleIndex) { + if (stateManager == null) { + return; + } + stateManager.switch2Cycle(cycleIndex); + } + + @Override + public void deleteStationAllPeroidRecord() { + if (stateManager == null) { + return; + } + stateManager.deleteCurrentStationSurveyorData(); + } + + @Override + public void deleteStationOnePeriodRecord(int cycleIndex) { + if (stateManager == null) { + return; + } + stateManager.deleteCurrentStationSurveyorData(cycleIndex); + } + + @Override + public String stationCheck() { + if (stateManager == null) { + return null; + } + return stateManager.stationCheckOnly(); + } + + @Override + public void stationAdjust() { + if (stateManager == null) { + return; + } + stateManager.stationAdjustOnly(StationDataAdjustDialogFragment.TYPE_ANGLE_VER_AND_DISTANCE); + } + + @Override + public void goBack() { + if (stateManager == null) { + return; + } + stateManager.moveBack(); + } + + /** + * 对于高程导线来说 这个方法实现当前目标的所有测回是否完成 + * + * @return + */ + @Override + public boolean isCurrentCycleComplete() { + if (stateManager == null || cachedData == null || cachedData.pointCount() == 0) + return false; + for (int i = 0; i < cachedData.pointCount(); i++) { + String pointId = cachedData.pointId(i, i); + String recordIdLeft = IdUtil.createSurveyorRecordId(stationId(), i, pointId, LeftOrRight.left); + String recordIdRight = IdUtil.createSurveyorRecordId(stationId(), i, pointId, LeftOrRight.right); + DataCategory dataCategoryLeft = cachedData.valueState(recordIdLeft); + DataCategory dataCategoryRight = cachedData.valueState(recordIdRight); + if (dataCategoryLeft.isEmptyData() || dataCategoryRight.isEmptyData()) { + //只要有空数据就是未完成 + return false; + } + } + return true; + } + + @Override + public void refreshGoBackBtnEnable() { + if (stateManager == null || stateManager.getCachedData().pointCount() == 0) { + EventBus.getDefault().post(new RefreshGoBackButton(false)); + return; + } + stateManager.refreshGoBackBtnEnable(); + } + + @Override + public int measureTypePosition() { + return getBackOrFrontPosition(); + } + + @Override + public void onShowSlopDistance(boolean value) { + if (cachedData != null) { + cachedData.onShowSlopDistance(value); + } + if (surveyedData != null) { + surveyedData.onShowSlopDistance(value); + } + if (adapter != null) { + adapter.onShowSlopDistance(value); + adapter.notifyItemRangeChanged(0, adapter.getItemCount()); + } + } + + @Override + public boolean isSurveying() { + if (surveyState != null) { + return surveyState.isSurveying(); + } + return false; + } + + @Override + public boolean isAutoSurveying() { + if (surveyState != null) { + return surveyState.isAutoSurveying(); + } + return false; + } + + private static final String KEY_STATION_ID = "__station_id"; + private static final String KEY_TYPE_BACK_OR_FRONT = "__KEY_TYPE_BACK_OR_FRONT"; + public static final String TAG = ComponentStationSurveyorDataListFragment.class.getName(); + + public static MeasureHeightTraverseSubFragment newInstance(String stationId, int frontOrBack) { + MeasureHeightTraverseSubFragment fragment = new MeasureHeightTraverseSubFragment(); + Bundle bundle = new Bundle(); + bundle.putString(KEY_STATION_ID, stationId); + bundle.putInt(KEY_TYPE_BACK_OR_FRONT, frontOrBack); + fragment.setArguments(bundle); + return fragment; + } +} + + + diff --git a/app/src/main/java/com/bingce/controlnetwork/guide/GuideSequence.java b/app/src/main/java/com/bingce/controlnetwork/guide/GuideSequence.java new file mode 100644 index 0000000..239e38f --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/guide/GuideSequence.java @@ -0,0 +1,110 @@ +package com.bingce.controlnetwork.guide; + +import android.app.Activity; +import android.app.Dialog; +import android.view.View; + +import androidx.appcompat.widget.Toolbar; + +import com.getkeepsafe.taptargetview.TapTarget; +import com.getkeepsafe.taptargetview.TapTargetView; + +public class GuideSequence implements ITapTargetProvider { + private int currentIndex = 0; + private final int targetCount; + private final IDelegate delegate; + private final TapTargetView.Listener listener = new TapTargetView.Listener() { +// @Override +// public void onTargetClick(TapTargetView view) { +// super.onTargetClick(view); +// } + + @Override + public void onTargetDismissed(TapTargetView view, boolean userInitiated) { + super.onTargetDismissed(view, userInitiated); + //下一个 + delegate.dismiss(currentIndex); + currentIndex++; + if (currentIndex >= targetCount) { + return; + } + delegate.show(currentIndex, GuideSequence.this); + } + +// @Override +// public void onTargetCancel(TapTargetView view) { +// super.onTargetCancel(view); +// } +// +// @Override +// public void onTargetLongClick(TapTargetView view) { +// super.onTargetLongClick(view); +// } + +// @Override +// public void onOuterCircleClick(TapTargetView view) { +// super.onOuterCircleClick(view); +// } + }; + + public GuideSequence(int targetCount, final IDelegate delegate) { + this.targetCount = targetCount; + this.delegate = delegate; + } + + public void start(int index) { + if (index < 0) { + return; + } + currentIndex = index; + delegate.show(currentIndex, this); + } + + @Override + public void show4View(Activity activity, View target, String msg, String describe) { + if (activity.isFinishing()) { + return; + } + if (activity.isDestroyed()) { + return; + } + TapTargetView.showFor( + activity, + TapTarget.forView(target, msg, describe).transparentTarget(true), + listener + ); + } + + @Override + public void show4View(Dialog dialog, View target, String msg, String describe) { + if (!dialog.isShowing()) { + return; + } + TapTargetView.showFor( + dialog, + TapTarget.forView(target, msg, describe).transparentTarget(true), + listener + ); + } + + @Override + public void show4ToolbarMenu(Activity activity, Toolbar toolbar, int menuItem, String msg, String describe) { + if (activity.isFinishing()) { + return; + } + if (activity.isDestroyed()) { + return; + } + TapTargetView.showFor( + activity, + TapTarget.forToolbarMenuItem(toolbar, menuItem, msg, describe).transparentTarget(true), + listener + ); + } + + public interface IDelegate { + void show(int index, ITapTargetProvider provider); + + void dismiss(int index); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/guide/ITapTargetProvider.java b/app/src/main/java/com/bingce/controlnetwork/guide/ITapTargetProvider.java new file mode 100644 index 0000000..fe4f127 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/guide/ITapTargetProvider.java @@ -0,0 +1,15 @@ +package com.bingce.controlnetwork.guide; + +import android.app.Activity; +import android.app.Dialog; +import android.view.View; + +import androidx.appcompat.widget.Toolbar; + +public interface ITapTargetProvider { + void show4View(Activity activity, View target, String msg, String describe); + + void show4View(Dialog dialog, View target, String msg, String describe); + + void show4ToolbarMenu(Activity activity, Toolbar toolbar, int menuItem, String msg, String describe); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/http/HttpExtend.kt b/app/src/main/java/com/bingce/controlnetwork/http/HttpExtend.kt new file mode 100644 index 0000000..ccee6b3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/http/HttpExtend.kt @@ -0,0 +1,54 @@ +package com.bingce.controlnetwork.http + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +fun CoroutineScope.retrofit(dsl: RetrofitDSL.() -> Unit) { + launch(Dispatchers.IO) { + val retrofitDsl = RetrofitDSL() + retrofitDsl.dsl() + try { + val result = retrofitDsl.api() ?: throw NullPointerException() + retrofitDsl.onSuccess?.invoke(result) + } catch (e: NullPointerException) { + retrofitDsl.onFailed?.invoke(e.message, -1) + } catch (e: Exception) { + retrofitDsl.onFailed?.invoke(e.message, -100) + } + } +} + +class RetrofitDSL { + internal lateinit var api: (suspend () -> T) + private set + internal var onSuccess: ((T) -> Unit)? = null + private set + internal var onFailed: ((msg: String?, code: Int) -> Unit)? = null + private set + + /** + * 获取数据 + * @param block (T) -> Unit + */ + fun api(block: suspend () -> T) { + this.api = block + } + + /** + * 获取数据成功 + * @param block (T) -> Unit + */ + fun onSuccess(block: (T) -> Unit) { + this.onSuccess = block + } + + /** + * 获取数据失败 + * @param block (msg: String, errorCode: Int) -> Unit + */ + fun onFailed(block: (msg: String?, code: Int) -> Unit) { + this.onFailed = block + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/http/RetrofitClient.kt b/app/src/main/java/com/bingce/controlnetwork/http/RetrofitClient.kt new file mode 100644 index 0000000..e1149cc --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/http/RetrofitClient.kt @@ -0,0 +1,142 @@ +package com.bingce.controlnetwork.http + +import android.util.Log +import blankj.utilcode.util.ToastUtils +import com.bingce.controlapphelper.util.GsonUtil +import com.bingce.controlnetwork.BuildConfig +import com.google.gson.JsonParseException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import okhttp3.Interceptor +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.OkHttpClient +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.logging.HttpLoggingInterceptor +import org.apache.http.conn.ConnectTimeoutException +import org.json.JSONException +import retrofit2.HttpException +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.io.IOException +import java.net.SocketTimeoutException +import java.net.UnknownHostException +import java.util.concurrent.TimeUnit + +object RetrofitClient { + //根路径 + private const val BASE_URL = "https://www.wanandroid.com/" + + private val mMediaTypeJson = "application/json; charset=utf-8".toMediaTypeOrNull() + + private val retrofit = Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .client(initOkhttpClient()) + .build() + + + private fun initOkhttpClient(): OkHttpClient { + return OkHttpClient.Builder() + .retryOnConnectionFailure(true) //重试 + .connectTimeout(20, TimeUnit.SECONDS) + .readTimeout(20, TimeUnit.SECONDS) + .writeTimeout(20, TimeUnit.SECONDS) +// .addNetworkInterceptor(initTokenInterceptor()) + .addInterceptor(initLogInterceptor()) + .build() + } + + private fun initTokenInterceptor(): Interceptor = Interceptor { chain -> // 为请求添加 Token + val token: String? = null + val originalRequest = chain.request() + if (token.isNullOrEmpty()) { + chain.proceed(originalRequest) + } else { + val updateRequest = originalRequest.newBuilder().header("token", token).build() + chain.proceed(updateRequest) + } + } + + + /* + * 日志拦截器 + * */ + private fun initLogInterceptor(): HttpLoggingInterceptor { + if (!BuildConfig.DEBUG) { //生产环境不打日志 + return HttpLoggingInterceptor() + } + + val interceptor = HttpLoggingInterceptor { message -> Log.d("OkhttpClient", message) } + interceptor.level = HttpLoggingInterceptor.Level.BODY + return interceptor + } + + // 请求数据转 Json 形式; + open fun getJsonBody(data: Any): RequestBody { + val strEntity = GsonUtil.toJson(data) + return strEntity.toRequestBody(mMediaTypeJson) + } + + fun create(serviceClass: Class): T = retrofit.create(serviceClass) + + inline fun createService(): T = create(T::class.java) + + + suspend inline fun apiCall(crossinline call: suspend CoroutineScope.() -> T): T? { + return withContext(Dispatchers.IO) { + var res: T? = null + try { + res = call() + } catch (e: Throwable) { + Log.e("ApiCaller", "request error", e) + // 请求出错,将状态码和消息封装为 ResponseResult +// return@withContext ApiException.build(e).toResponse() + ToastUtils.showShort(ApiException.build(e).toString()) + } + return@withContext res + } + } + + // 网络、数据解析错误处理 + class ApiException(val code: Int, override val message: String?, override val cause: Throwable? = null) : + RuntimeException(message, cause) { + companion object { + // 网络状态码 + const val CODE_NET_ERROR = 4000 + const val CODE_TIMEOUT = 4080 + const val CODE_JSON_PARSE_ERROR = 4010 + const val CODE_SERVER_ERROR = 5000 + + // 业务状态码 + const val CODE_AUTH_INVALID = 401 + + fun build(e: Throwable): ApiException { + return if (e is HttpException) { + ApiException(CODE_NET_ERROR, "网络异常(${e.code()},${e.message()})") + } else if (e is UnknownHostException) { + ApiException(CODE_NET_ERROR, "网络连接失败,请检查后再试") + } else if (e is ConnectTimeoutException || e is SocketTimeoutException) { + ApiException(CODE_TIMEOUT, "请求超时,请稍后再试") + } else if (e is IOException) { + ApiException(CODE_NET_ERROR, "网络异常(${e.message})") + } else if (e is JsonParseException || e is JSONException) { + // Json解析失败 + ApiException(CODE_JSON_PARSE_ERROR, "数据解析错误,请稍后再试") + } else { + ApiException(CODE_SERVER_ERROR, "系统错误(${e.message})") + } + } + } + +// fun toResponse(): ResponseResult { +// return ResponseResult(code, message) +// } + + override + fun toString(): String { + return "code:$code,message:$message" + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/http/sevice/CommonService.kt b/app/src/main/java/com/bingce/controlnetwork/http/sevice/CommonService.kt new file mode 100644 index 0000000..71c7c0b --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/http/sevice/CommonService.kt @@ -0,0 +1,9 @@ +package com.bingce.controlnetwork.http.sevice + +import com.google.gson.JsonObject +import retrofit2.http.GET + +interface CommonService { + @GET("article/list/0/json") + suspend fun getPassageData(): JsonObject +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/method/SingleCycleTipsMethod.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/method/SingleCycleTipsMethod.java new file mode 100644 index 0000000..6d87248 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/method/SingleCycleTipsMethod.java @@ -0,0 +1,102 @@ +package com.bingce.controlnetwork.surveyor.method; + +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.IPointDataSource; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.surveyor.method.model.IStateDelegate; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.fragment.SelectReSurveyorPointFragment; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.R; + +public class SingleCycleTipsMethod { + /* + * todo 如果没有对单测回内错误处理,后面该怎么办?? + * */ + public static void showTips(String msg, String stationId, + int currentCycleIndex, IStateDelegate delegate, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner) { + //取消 + delegate.onOptionTips(msg, + Tools.getString(R.string.retest_direction), + Tools.getString(R.string.retest_cycle), + () -> {//选择重测方向 + ThreadPoolUtil.execute(() -> reSurveyorPoint(stationId, delegate, + fragmentManager, lifecycleOwner)); + }, + () -> {//选择重测测回 + reSurveyorCycle(msg, stationId, currentCycleIndex, + delegate, fragmentManager, lifecycleOwner); + }, + delegate::resetSurveyorStateAndKeepPosition); + } + + @WorkerThread + private static void reSurveyorPoint(String stationId, IStateDelegate delegate, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner) { + //弹框提示选择重测数据 + ISurveyorStationDataSource dataSource = SurveyorDatabaseFactory.instance.getSurveyorStation(); + SurveyorStationRecord instance = dataSource.getRecordSync(stationId); + IPointDataSource pointDataSource = SurveyorDatabaseFactory.instance.getPointDataSource(); + List stationItems = instance.getItems(); + ArrayList ids = new ArrayList<>(); + ArrayList names = new ArrayList<>(); + for (SurveyorPoint item : stationItems) { + if (item.isAbandon()) { + continue; + } + + if (!SurveyorPoint.TYPE_POINT.equals(item.getType())) { + continue; + } + PointRecord pointRecord = pointDataSource.findByIdSync(item.getPointId()); + if (pointRecord == null) { + continue; + } + ids.add(pointRecord.id); + names.add(pointRecord.name); + } + ThreadPoolUtil.executeInMain(() -> SelectReSurveyorPointFragment.pick( + fragmentManager, + lifecycleOwner, + instance.leftAndRightSurveyor, + ids, + names, + (cycleIndex, pointIds) -> { + if (pointIds == null || pointIds.isEmpty()) { + //没有选择,退出 + delegate.resetSurveyorStateAndKeepPosition(); + } else { + delegate.resurveyPoints(cycleIndex, pointIds); + } + } + )); + } + + private static void reSurveyorCycle(String msg, String stationId, + int currentCycleIndex, IStateDelegate delegate, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner) { + delegate.onOptionTips(Tools.getString(R.string.tips_delete_current_cycle_surveyor_record), + null, null, + () -> { + delegate.deleteSingleCycleData(currentCycleIndex); + }, + () -> { + //循环显示 + showTips(msg, stationId, currentCycleIndex, delegate, + fragmentManager, lifecycleOwner); + }, + delegate::resetSurveyorStateAndKeepPosition); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/AutoModeType.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/AutoModeType.java new file mode 100644 index 0000000..9dc0e26 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/AutoModeType.java @@ -0,0 +1,10 @@ +package com.bingce.controlnetwork.surveyor.state; + +/** + * 自动测量相关的状态 + */ +public enum AutoModeType { + unknown,//未指定是否开启自动测量 + start,//开启了自动测量 + stop,//主动关闭了自动测量 +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/IScrollDelegate.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/IScrollDelegate.java new file mode 100644 index 0000000..907a77c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/IScrollDelegate.java @@ -0,0 +1,10 @@ +package com.bingce.controlnetwork.surveyor.state; + +/** + * 测量过程中,将跳转到当前item处 + *

+ * 这个委托就是做这项任务 + */ +public interface IScrollDelegate { + void onScrollTo(int index); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/StateConstants.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/StateConstants.java new file mode 100644 index 0000000..a1e1604 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/StateConstants.java @@ -0,0 +1,18 @@ +package com.bingce.controlnetwork.surveyor.state; + +public class StateConstants { + + /** + * measureWhat + */ + public static final int VALUE_MEASURE_WHAT_ANGLE_DISTANCE = 0;// 测角测距 + public static final int VALUE_MEASURE_WHAT_DISTANCE = 1;//单独测距 + + /** + * key 当前是否是旋转到位状态 + */ + public static final String KEY_IS_ROTATION_READY_STATE = "KEY_IS_ROTATION_READY_STATE"; + public static final String KEY_ROTATION_STATE_FROM_WHERE = "KEY_ROTATION_STATE_FROM_WHERE"; + public static final String ROTATION_STATE_FROM_WHERE_MEASURE = "1"; + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/StateManagerAloneDistance.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/StateManagerAloneDistance.java new file mode 100644 index 0000000..f03b45f --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/StateManagerAloneDistance.java @@ -0,0 +1,498 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.alonedistance.AloneDistanceRecord; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.RefreshGoBackButtonAloneDistance; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.AutoSurveyorMethod; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.IStateType; +import com.bingce.controlapphelper.surveyor.state.ISurveyState; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyor; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorListener; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorRemindListener; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParamAuto; +import com.bingce.controlapphelper.surveyor.surveyor.SurveyorAutoImpl; +import com.bingce.controlapphelper.surveyor.surveyor.SurveyorMock; +import com.bingce.controlapphelper.surveyor.surveyor.SurveyorMockAuto; +import com.bingce.controlapphelper.surveyor.surveyor.SurveyorSingleImpl; +import com.bingce.controlapphelper.surveyor.test.Test; +import com.bingce.controlapphelper.util.DigitalUtil; +import com.bingce.controlapphelper.util.IUIRunner; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.MeasureVm; +import com.bingce.controlnetwork.surveyor.state.AutoModeType; +import com.bingce.controlnetwork.surveyor.state.IScrollDelegate; +import com.bingce.controlnetwork.surveyor.state.StateConstants; +import com.bingce.coordlib.model.Coordinate; +import com.bingce.totalstation.ControlSurveyData; +import com.bingce.totalstation.ControlSurveyResult; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.utils.VipManager; + +import org.greenrobot.eventbus.EventBus; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import blankj.utilcode.util.ToastUtils; + +public class StateManagerAloneDistance implements IAutoModeSwitcher, ISurveyState, IStateType { + + //单独测距代码里的cycleIndex只有一个测回 + public static final int CYCLE_INDEX_DEFAULT = 0; + + private final Map stateMap = new HashMap<>(); + private StateType currentStateType = StateType.idle; + private final FragmentManager fragmentManager; + private final LifecycleOwner lifecycleOwner; + private final IUIRunner iuiRunner; + final IScrollDelegate scrollDelegate; + + @NonNull + SurveyorStationRecord stationRecord; + @NonNull + final CachedDataAloneDistance cachedData; + final @NonNull + ToleranceDetailRecord toleranceRecord; + final @NonNull + ISurveyorData surveyorData; + final @NonNull + MeasureVm measureVm; + final @NonNull + ICycleRecorder cycleRecorder; + final @NonNull + Context context; + private AutoModeType autoMode = AutoModeType.unknown; + @NonNull + final ISurveyor surveyor; + final PointRecord stationPointRecord; + + final boolean supportAutoSurvey; + + + private StateManagerAloneDistance(final boolean supportAutoSurvey,//是否支持自动测量 + final @NonNull SurveyorStationRecord stationRecord, + final @NonNull PointRecord stationPointRecord, + final @NonNull ToleranceDetailRecord toleranceRecord, + final @NonNull Context context, + final @NonNull ISurveyorData surveyorData, + final @NonNull ICycleRecorder cycleRecorder, + final @NonNull CachedDataAloneDistance cachedData, + final @NonNull MeasureVm measureVm, + final @NonNull IScrollDelegate scrollDelegate, + FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + IUIRunner iuiRunner) { + this.supportAutoSurvey = supportAutoSurvey; + + this.stationRecord = stationRecord; + this.stationPointRecord = stationPointRecord; + this.fragmentManager = fragmentManager; + this.lifecycleOwner = lifecycleOwner; + this.iuiRunner = iuiRunner; + this.scrollDelegate = scrollDelegate; + + this.context = context; + this.toleranceRecord = toleranceRecord; + this.surveyorData = surveyorData; + this.cachedData = cachedData; + this.measureVm = measureVm; + this.cycleRecorder = cycleRecorder; + + if (Test.DEBUG) { + surveyor = new SurveyorMockAuto(StateConstants.VALUE_MEASURE_WHAT_DISTANCE, + this.stationRecord.getId(), + this.stationRecord.isAutoClose(), + toleranceRecord.getCycleCount(), + cachedData, surveyorData, cycleRecorder, this, this); + } else { + if (supportAutoSurvey) { + surveyor = new SurveyorAutoImpl(StateConstants.VALUE_MEASURE_WHAT_DISTANCE, this); + } else { + surveyor = new SurveyorSingleImpl(StateConstants.VALUE_MEASURE_WHAT_DISTANCE); + } + } + _DoSurveyorState doSurveyorState = new _DoSurveyorState(this, this); + surveyor.register((ISurveyorListener) doSurveyorState); + surveyor.register((ISurveyorRemindListener) doSurveyorState); + + stateMap.put(StateType.doSurveyor, doSurveyorState); + stateMap.put(StateType.doAutoSurveyor, new _DoAutoSurveyorState(this, this)); + stateMap.put(StateType.SurveyorFailure, new _SurveyorFailureState(this)); + stateMap.put(StateType.doMove2NextValidate, new _DoMove2NextValidateState(this)); + stateMap.put(StateType.doMoveBack, new _DoMoveBackState(this)); + stateMap.put(StateType.checkReadData, new _CheckReadDataState(this, this)); + stateMap.put(StateType.isSingleCycleCompleted, new _IsSingleCycleCompletedState(this)); + stateMap.put(StateType.isAllCycleCompleted, new _IsAllCycleCompletedState(this, this)); + stateMap.put(StateType.checkSingleCycle, new _CheckSingleCycleState(this)); + stateMap.put(StateType.checkStation, new _CheckStationState(this)); + stateMap.put(StateType.stationCheckedSuccess, new _CheckStationSuccessState(this)); + + stateMap.put(StateType.doDeleteAllCycle, new _DoDeleteAllCycleState(this)); + stateMap.put(StateType.doDeleteCurrentCycle, new _DoDeleteCurrentCycleState(this)); + + stateMap.put(StateType.doCalScheduleSingleCycle, new _DoCalScheduleInSingleCycleState(this, this)); + stateMap.put(StateType.doCalAdjust, new _DoCalAdjustState(this)); + stateMap.put(StateType.idle, new _IdleState(this, this)); + stateMap.put(StateType.doWellMeasureRotationReady, new _DoWellMeasureRotationReadyState(this)); + + } + + public void updateStationRecord(SurveyorStationRecord stationRecord) { + this.stationRecord = stationRecord; + ThreadPoolUtil.execute(() -> { + cachedData.updateDataSouce(stationRecord); + if (Test.DEBUG && surveyor instanceof SurveyorMock) { + ((SurveyorMock) surveyor).updateData(); + } + _DoCalScheduleInSingleCycleState.enter(this, CYCLE_INDEX_DEFAULT); + + //最后刷新下页面 + runOnUI(cachedData::notifyDateChange); + }); + +// //更新测点棱镜信息 +// if (stationRecord.getItems() != null) { +// for (SurveyorPoint item : stationRecord.getItems()) { +// if (item == null || !SurveyorPoint.TYPE_POINT.equals(item.getType())) { +// continue; +// } +// cachedData.updateSurveyPointParams(item); +// } +// } + } + + String stationId() { + return stationRecord.getId(); + } + + @Override + public void enter(StateType type, Bundle args) { + __BaseState baseState = stateMap.get(type); + if (baseState != null) { + this.currentStateType = type; + runOnUI(() -> baseState.enter(args)); + } + } + + @Override + public void enter(StateType type) { + enter(type, null); + } + + void runOnUI(Runnable action) { + if (iuiRunner != null) { + iuiRunner.runOnUI(action); + } + } + + public void doSurveyor() { + boolean inValidate = isInValidate(); + + if (inValidate) { + return; + } + + int pointCount = cachedData.pointCount(); + if (pointCount == 0) { + ToastUtils.showShort(R.string.no_data_available_yet); + return; + } + + Bundle bundle = null; + if (isRotationReadyState()) { + //当前是旋转到位状态 + bundle = new Bundle(); + bundle.putBoolean(StateConstants.KEY_IS_ROTATION_READY_STATE, true); + } + + enter(StateType.doSurveyor, bundle); + + } + + private boolean isRotationReadyState() { + return currentStateType == StateType.doWellMeasureRotationReady; + } + + public void doAutoSurveyor() { + if (isInValidate()) { + return; + } + enter(StateType.doAutoSurveyor); + } + + /** + * 删除站的所有测回记录 + */ + public void deleteCurrentStationSurveyorData() { + if (isInValidate()) { + return; + } + enter(StateType.doDeleteAllCycle, _DoDeleteAllCycleState.args(stationId())); + } + + public void deleteCurrentStationSurveyorData(int cycleIndex) { + if (isInValidate()) { + return; + } + enter(StateType.doDeleteCurrentCycle, _DoDeleteCurrentCycleState.args(stationId(), cycleIndex)); + } + + public void stationCheck() { + if (isInValidate()) { + return; + } + enter(StateType.checkStation); + } + + public void stationAdjust() { + if (isInValidate()) { + return; + } + enter(StateType.doCalAdjust); + } + + /** + * 切换测回时触发 + * + * @param cycleIndex + */ + public void switch2Cycle(int cycleIndex) { + //由于井定向的距离测量是不用切换测回的,在一个页面展示了两个测回 +// if (isInValidate()) { +// return; +// } +// _DoCalScheduleInSingleCycleState.enter(this, cycleIndex); + } + + /** + * 进入开始测量的时候触发 + * + * @param cycleIndex + */ + public void calScheduleWhenEnterSurveyFragment(int cycleIndex) { + if (isInValidate()) { + return; + } + _DoCalScheduleInSingleCycleState.enter(this, cycleIndex); + } + + public void moveBack() { + if (isInValidate()) { + return; + } + enter(StateType.doMoveBack); + } + + //检测当前状态是否支持从外界主动改变状态 + //如果是空闲或者是测站通过检测是有效的状态 + private boolean isInValidate() { + return currentStateType != StateType.idle + && StateType.stationCheckedSuccess != currentStateType + && !isRotationReadyState(); + } + + + FragmentManager fragmentManager() { + return this.fragmentManager; + } + + LifecycleOwner lifecycleOwner() { + return this.lifecycleOwner; + } + + final boolean isStationAutoClosed() { + return stationRecord.isAutoClose(); + } + + @WorkerThread + public static StateManagerAloneDistance newInstance( + boolean isSupportAutoMode, + @NonNull SurveyorStationRecord stationRecord, + @NonNull Context context, + @NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + @NonNull ToleranceDetailRecord toleranceRecord, + @NonNull ISurveyorData surveyorData, + @NonNull ICycleRecorder cycleRecorder, + @NonNull CachedDataAloneDistance cachedData, + @NonNull MeasureVm measureVm, + IScrollDelegate scrollDelegate, + IUIRunner runner) { + //读取测点record + String stationPointId = null; + if (stationRecord.getItems() != null) { + for (SurveyorPoint stationItem : stationRecord.getItems()) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + stationPointId = stationItem.getPointId(); + break; + } + } + } + PointRecord stationPointRecord = null; + if (stationPointId != null) { + stationPointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationPointId); + } + if (stationPointRecord == null) { + return null; + } + boolean supportAuto = Test.DEBUG; + //App.isDebug() + if (isSupportAutoMode && + (VipManager.getInstance().checkReg() || VipManager.getInstance().checkControlProProLevel())) { + supportAuto = true; + } + StateManagerAloneDistance manager = new StateManagerAloneDistance(supportAuto, + stationRecord, + stationPointRecord, + toleranceRecord, + context, + surveyorData, + cycleRecorder, + cachedData, + measureVm, + scrollDelegate, + fragmentManager, lifecycleOwner, runner); + return manager; + } + + @Override + public boolean isAutoModeOpen() { + return autoMode == AutoModeType.start; + } + + @Override + public boolean isAutoModeClose() { + return autoMode == AutoModeType.stop; + } + + @Override + public boolean isAutoModeNotSpecial() { + return autoMode == AutoModeType.unknown; + } + + @Override + public void openAutoMode() { + autoMode = AutoModeType.start; + } + + @Override + public void closeAutoMode() { + autoMode = AutoModeType.stop; + } + + @Override + public void resetAutoMode() { + autoMode = AutoModeType.unknown; + } + + @Override + public int isReadyAutoSurvey() { + if (!supportAutoSurvey) { + return ControlSurveyResult.CODE_ERROR; + } + if (!surveyor.isReady()) { + return ControlSurveyResult.CODE_ERROR; + } + if (getRequestSurveyorParamAuto() == null) { + return ControlSurveyResult.CODE_ERROR; + } + + double instrumentHeight = getInsturmentHeight(); + Coordinate stationBasePoint = getStationCoord(); + + return getRequestSurveyorParamAuto().checkAutoCondition(getCachedData(), stationBasePoint, instrumentHeight); + } + + @Override + public String isMeasuredValueMatchDesign() { + if (!supportAutoSurvey) return null; + + double instrumentHeight = getInsturmentHeight(); + Coordinate stationBasePoint = getStationCoord(); + + List originMeasureList = getRequestSurveyorParamAuto().getOriginMeasureList(getCachedData()); + + return AutoSurveyorMethod.checkAutoSurveyorMeasuredValue(stationBasePoint, instrumentHeight, originMeasureList); + } + + @Override + public boolean isSurveying() { + return currentStateType == StateType.doSurveyor || currentStateType == StateType.doAutoSurveyor; + } + + @Override + public boolean isAutoSurveying() { + return isAutoModeOpen(); + } + + public void switchCurrentMeasurePosition(int position) { + if (currentStateType == StateType.idle) { + __BaseState baseState = stateMap.get(currentStateType); + if (baseState != null) { + baseState.setSurveyPosition(position, LeftOrRight.left); + } + } + } + + public CachedDataAloneDistance getCachedData() { + return cachedData; + } + + @NonNull + public ToleranceDetailRecord getToleranceRecord() { + return toleranceRecord; + } + + + private Coordinate getStationCoord() { + if (PointRecord.TYPE_KNOWN_POINT.equals(stationPointRecord.getPointType())) { + return new Coordinate( + stationPointRecord.getX(), + stationPointRecord.getY(), + stationPointRecord.getZ()); + } + return null; + } + + public double getInsturmentHeight() { + return DigitalUtil.valueOfDoubleString(stationRecord.getInstrumentHeight(), 0); + } + + public RequestSurveyorParamAuto getRequestSurveyorParamAuto() { + return measureVm.getRequestSurveyorParamAuto(); + } + + + public void refreshGoBackBtnEnable() { + CachedDataAloneDistance cachedData = getCachedData(); + int currentCycle = cycleRecorder.currentCycleIndex(); + String pointId = getCachedData().pointId(currentCycle, 0); + String cacheKey = IdUtil.createSurveyorRecordId(stationId(), currentCycle, pointId, LeftOrRight.left); + AloneDistanceRecord aloneDistanceRecord = cachedData.getAloneDistanceRecord(cacheKey); + boolean isRollBackBtnEnable = aloneDistanceRecord != null && !aloneDistanceRecord.distanceValues.isEmpty(); + EventBus.getDefault().post(new RefreshGoBackButtonAloneDistance(isRollBackBtnEnable)); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckReadDataState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckReadDataState.java new file mode 100644 index 0000000..6ab37f0 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckReadDataState.java @@ -0,0 +1,75 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/** + * 检测当前测量数据读数互差 + */ +class _CheckReadDataState extends __BaseState { + private static final int RESULT_SUCCESS = 0; + private static final int RESULT_FAILURE_HOR = 1; + private static final int RESULT_FAILURE_VER = 2; + private static final int RESULT_FAILURE_DISTANCE = 3; + private final IAutoModeSwitcher autoModeSwitcher; + + public _CheckReadDataState(StateManagerAloneDistance stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(StateType.checkReadData, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + public void enter(Bundle args) { + //先检测测量值和设计值是否匹配(仅在自动测量打开下检测) + String error = autoModeSwitcher.isMeasuredValueMatchDesign(); + if (error != null) { + failureTipsWithAutoStandStill(error); + return; + } + + onCompleted(RESULT_SUCCESS); + } + + private void onCompleted(int result) { + if (RESULT_SUCCESS == result) { + navigation2(StateType.checkSingleCycle); + } else { + String msg = ""; + switch (result) { + case RESULT_FAILURE_HOR: + msg = Tools.getString(R.string.hor_angle_read_data_limit); + break; + case RESULT_FAILURE_VER: + msg = Tools.getString(R.string.ver_angle_read_data_limit); + break; + case RESULT_FAILURE_DISTANCE: + msg = Tools.getString(R.string.distance_read_data_limit); + break; + default: + navigation2(StateType.idle); + return; + } + if (isAutoSurveyOpen()) { + TtsManager.getInstance().speak(msg); + } + failureTipsWithAutoStandStill(msg); + } + } + + /** + * 斜距两次读数差 + * + * @param distance1 读数1 + * @param distance2 读数2 + * @return 读数差(单位毫米) + */ + public static double distanceReadDiff(double distance1, double distance2) { + return Math.abs(distance1 - distance2) * 1000; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckSingleCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckSingleCycleState.java new file mode 100644 index 0000000..6e3d607 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckSingleCycleState.java @@ -0,0 +1,90 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.alonedistance.AloneDistanceRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; + +import java.util.List; + +/** + * 测回内不同方向2c、方向i互差检测 + */ +class _CheckSingleCycleState extends __BaseState { + + public _CheckSingleCycleState(StateManagerAloneDistance stateManager) { + super(StateType.checkSingleCycle, stateManager); + } + + @Override + public void enter(Bundle args) { + doCheck(); + } + + private void doCheck() { + ToleranceDetailRecord toleranceRecord = getToleranceRecord(); + CachedDataAloneDistance cachedData = getCachedData(); + int surveyorCount = getSurveyorCount(); + int cycleIndex = getCycleRecorder().currentCycleIndex(); + int currentIndex = getCurrentIndex(); + double distCyclesDifference = toleranceRecord.getSlopeCycleDistanceDifference()/*slopeCycleDistanceDifference*/; + AloneDistanceRecord aloneDistanceRecord = getAloneDistanceRecord(currentIndex); + if (aloneDistanceRecord == null || aloneDistanceRecord.distanceValues.size() < surveyorCount * 2) { + //进入旋转到位状态等待点击继续测量 + navigation2(StateType.doWellMeasureRotationReady); + return; + } + + List valuesFirst = aloneDistanceRecord.distanceValues.subList(0, surveyorCount); + List valuesSecond = aloneDistanceRecord.distanceValues.subList(surveyorCount, surveyorCount * 2); + + + Double averageFirst = Tools.calculateCollectionDoubleAverage(valuesFirst); + Double averageSecond = Tools.calculateCollectionDoubleAverage(valuesSecond); + + double compareValue = Math.abs(averageFirst - averageSecond); + + if (compareValue * 1000 > distCyclesDifference) { + optionTips(Tools.getString(R.string.cycle_between_distance_limit) + distCyclesDifference, + Tools.getString(R.string.retest_cycle), + Tools.getString(R.string.retest_point), + () -> { + cachedData.deleteAloneDistanceRecord(stationId(), cycleIndex, currentIndex, LeftOrRight.left, true); + //更新进度 + setCurrentCycle(cycleIndex); + setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + findTargetFromBeginInCurrentCycle(false); + }, + () -> { + //重测目标 + cachedData.deleteAloneDistanceRecord(stationId(), cycleIndex, currentIndex, LeftOrRight.left, false); + //更新进度 + setCurrentCycle(cycleIndex); + setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + findTargetFromBeginInCurrentCycle(false); + }, + () -> { + enterIdleAndClearSurveyStateAndResetAutoMode(true); + }); + + } else { + onSuccess(); + } + } + + private void onSuccess() { + //更新测量进度 + setSingleCycleSchedule(getCycleRecorder().currentCycleIndex(), + SurveyorScheduleConstants.STATUE_VALUE_CHECKED); + //跳转 + navigation2(StateType.isSingleCycleCompleted); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckStationState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckStationState.java new file mode 100644 index 0000000..983335c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckStationState.java @@ -0,0 +1,195 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.utils.Util; + +import java.util.ArrayList; +import java.util.List; + +/** + * 执行「测站检测」 + *

+ * 前置条件: + * 所有测回都完成测量,并且通过「测回内检测」 + */ +public class _CheckStationState extends __BaseState { + + public _CheckStationState(StateManagerAloneDistance stateManager) { + super(StateType.checkStation, stateManager); + } + + @Override + public void enter(Bundle args) { + //执行测站检测 + String error = _stationCheckAloneDistance(stationId(), getToleranceRecord(), getCachedData()); + if (error == null || error.isEmpty()) { + //进入finish状态 + navigation2(StateType.stationCheckedSuccess); + } else { + failureTipsWithAutoStandStill(error); + } + } + + public static String _stationCheckAloneDistance(final String stationId, + final ToleranceDetailRecord toleranceRecord, + final CachedDataAloneDistance cachedDataSource) { + + final int cycleCount = ToleranceDetailRecord.ALONE_DISTANCE_CYCLE_COUNT; + final int surveyorCount = toleranceRecord.getSurveyorCount(); + + + //测回间斜距互差 + double distCyclesDifference = toleranceRecord.getSlopeCycleDistanceDifference()/*slopeCycleDistanceDifference*/; + List<_ErrorItem> distError = new ArrayList<>(); + + List<_Point> pointArrayList = new ArrayList<>(); + //遍历第一测回,收集所有待测点id + for (int index = 0; index < cachedDataSource.pointCount(); index++) { + pointArrayList.add(new _Point(cachedDataSource.pointId(0, index), cachedDataSource.pointName(0, index))); + } + // if (!distError.isEmpty()) { +// stringBuilder.append("测回间距离较差超限(限差:") +// .append(Util.formatDouble2String(distLimit, 1)) +// .append("'')"); +// for (_ErrorItem item : distError) { +// stringBuilder +// .append("\n ") +// .append(item.pointName) +// .append(":\n") +// .append(" |") +// .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) +// .append("-") +// .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) +// .append("| = ") +// .append(Util.formatDouble2String(item.difference, 1)) +// .append("'')"); +// } +// } + return ""; + } + + /** + * 根据超限信息生成错误描述 + * + * @param horValueError 水平角同方向值互差 + * @param verValueError 垂直角同方向值互差 + */ + private static String _errorString(double horLimit, double verLimit, double verILimit, double distLimit, + List<_ErrorItem> horValueError, List<_ErrorItem> verValueError, List<_ErrorItem> verIError, List<_ErrorItem> distError) { + if (horValueError.isEmpty() && verValueError.isEmpty()) { + return null; + } + StringBuilder stringBuilder = new StringBuilder(); + if (!horValueError.isEmpty()) { + stringBuilder.append(Tools.getString(R.string.cycle_between_same_direction_value_limit)) + .append(Util.formatDouble2String(horLimit, 1)) + .append("'')"); + for (_ErrorItem item : horValueError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + if (!verValueError.isEmpty()) { + stringBuilder.append("\n").append(Tools.getString(R.string.cycle_between_ver_angle_limit)) + .append(Util.formatDouble2String(verLimit, 1)) + .append("'')"); + for (_ErrorItem item : verValueError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + if (!verIError.isEmpty()) { + stringBuilder.append("\n").append(Tools.getString(R.string.ver_angle_i_same_direction_each_cycle)) + .append(Util.formatDouble2String(verILimit, 1)) + .append("'')"); + for (_ErrorItem item : verIError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + if (!distError.isEmpty()) { + stringBuilder.append("\n").append(Tools.getString(R.string.cycle_between_distance_limit_brackets)) + .append(Util.formatDouble2String(distLimit, 1)) + .append("'')"); + for (_ErrorItem item : distError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + return stringBuilder.toString(); + } + + /** + * 存储错误信息的item + */ + private static class _ErrorItem { + final String pointName; + final int cycleIndex1; + final int cycleIndex2; + final double difference; + + public _ErrorItem(String pointName, int cycleIndex1, int cycleIndex2, double difference) { + this.pointName = pointName; + this.cycleIndex1 = cycleIndex1; + this.cycleIndex2 = cycleIndex2; + this.difference = difference; + } + } + + private static class _Point { + final String pointId; + final String pointName; + + _Point(String pointId, String pointName) { + this.pointId = pointId; + this.pointName = pointName; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckStationSuccessState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckStationSuccessState.java new file mode 100644 index 0000000..f120c55 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_CheckStationSuccessState.java @@ -0,0 +1,33 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.StateType; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import com.bingce.controlnetwork.R; + +class _CheckStationSuccessState extends __BaseState { + + public _CheckStationSuccessState(StateManagerAloneDistance stateManager) { + super(StateType.stationCheckedSuccess, stateManager); + } + + @Override + public void enter(Bundle args) { + ISurveyorData surveyorData = getSurveyorData(); + surveyorData.clearSurveyStateAndPosition(); + //设置测量进度(数据库存储) + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_CHECKED); + //通知刷新 + tips(getContext().getString(R.string.tips_all_cycle_has_finish_and_checked), null); + if (isAutoSurveyOpen()) { + runOnUI(() -> TtsManager.getInstance().speak(getContext().getString(R.string.tips_all_cycle_has_finish_and_checked))); + } + //清除测量状态,进入idle,停止自动测量 + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoAutoSurveyorState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoAutoSurveyorState.java new file mode 100644 index 0000000..2ca12da --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoAutoSurveyorState.java @@ -0,0 +1,32 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.totalstation.ControlSurveyResult; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/** + * 先检测是否有其他未完成测回,继续本次测量将删除其他测回数据 + */ +class _DoAutoSurveyorState extends __BaseState { + private final IAutoModeSwitcher autoModeSwitcher; + + public _DoAutoSurveyorState(StateManagerAloneDistance stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(StateType.doAutoSurveyor, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + public void enter(Bundle args) { + if (autoModeSwitcher.isReadyAutoSurvey() == ControlSurveyResult.CODE_SUCCESS) { + autoModeSwitcher.openAutoMode(); + navigation2(StateType.doMove2NextValidate); + TtsManager.getInstance().speak(Tools.getString(R.string.start_auto_measure)); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoCalAdjustState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoCalAdjustState.java new file mode 100644 index 0000000..e62f793 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoCalAdjustState.java @@ -0,0 +1,74 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.content.Context; +import android.os.Bundle; + +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.method.SurveyorAdjustMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlnetwork.fragment.StationDataAdjustDialogFragment; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.ArrayList; + +/** + * 平差计算 + */ +public class _DoCalAdjustState extends __BaseState { + + public _DoCalAdjustState(StateManagerAloneDistance stateManager) { + super(StateType.doCalAdjust, stateManager); + } + + @Override + public void enter(Bundle args) { + + } + + public static void doCalAdjust(String stationId, CachedDataAloneDistance cachedData, Context context, FragmentManager fragmentManager + , LifecycleOwner lifecycleOwner) { + ThreadPoolUtil.execute(() -> { + SurveyorAdjustMethod.calAloneDistance( + stationId, cachedData, new SurveyorAdjustMethod.ICallback() { + @Override + public void onGet(ArrayList finalItemList, Boolean isShowSlopDistance) { +// //清除测量状态,进入idle,停止自动测量 +// enterIdleAndClearSurveyStateAndResetAutoMode(true); + //展示结果数据 + //检测归零值是否为负,如果是需要+2PI + for (SurveyorAdjustMethod.Item item : finalItemList) { + if (item.getHorAngle() < 0) { + item.setHorAngle(Math.PI * 2 + item.getHorAngle()); + } + } + StationDataAdjustDialogFragment.showDialog(StationDataAdjustDialogFragment.TYPE_ALONE_DISTANCE, finalItemList, isShowSlopDistance, fragmentManager); + } + + @Override + public void onFailure(String error) { + ThreadPoolUtil.executeInMain(() -> { + TipsFragment.tipsOnly(fragmentManager, lifecycleOwner, context, error); + }); + } + }); + + //伴随平差 设置进度为通过检测 + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getAllCycleScheduleKey(stationId, SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE), + SurveyorScheduleConstants.STATUE_VALUE_CHECKED)); + + }); + + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoCalScheduleInSingleCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoCalScheduleInSingleCycleState.java new file mode 100644 index 0000000..ff1e497 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoCalScheduleInSingleCycleState.java @@ -0,0 +1,108 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.MeasureFragment; + +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.MeasureFragment; + +/** + * 在单个测回内计算当前测量进度。 + *

+ * 1.如果有没有完成测量,则跳转到相应位置。 + * 2.如果测量完成,检测数据限差 + * 3.进入idle + */ +class _DoCalScheduleInSingleCycleState extends __BaseState { + private final IAutoModeSwitcher autoModeSwitcher; + + public _DoCalScheduleInSingleCycleState(StateManagerAloneDistance stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(StateType.doCalScheduleSingleCycle, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + final public void enter(Bundle args) { + + int pointCount = getCachedData().pointCount(); + if (pointCount == 0) { + postBtnEvent(); + return; + } + + //重置自动测量状态 + if (autoModeSwitcher.isAutoModeClose()) { + autoModeSwitcher.resetAutoMode(); + } + //计算状态之前,重置测量状态 + getSurveyorData().clearSurveyStateAndPosition(); + + ICycleRecorder cycleRecorder = getCycleRecorder(); + cycleRecorder.changeCycleIndex(args.getInt(KEY_CYCLE_INDEX, 0)); + setCurrentCycle(cycleRecorder.currentCycleIndex()); + + //1.检测当前cycle是否完成测量 + boolean completed = _IsSingleCycleCompletedState.isSingleCycleCompleted( + stationId(), + getCycleRecorder().currentCycleIndex(), + getCachedData(), getSurveyorCount()); + //2.如果当前测回还有待测数据,则执行测量 + if (!completed) { + //从当前测回开始处查找目标并执行测量 + findTargetFromBeginInCurrentCycle(false); + return; + } + //3.如果当前测回结束测量,判断是否通过检测 +// ToleranceDetailRecord toleranceDetailRecord = getToleranceRecord(); +// double horCycle2CDiff = toleranceDetailRecord.getHorCycleDirect2CDifference(); +// double verCycle2CDiff = toleranceDetailRecord.getVerCycleDirectIDifference(); +// String error = SingleCycleCheckMethod.check( +// horCycle2CDiff, +// verCycle2CDiff, +// stationId(), +// getCycleRecorder().currentCycleIndex(), +// getSurveyorData(), +// getCachedData()); +// if (error != null && !error.isEmpty()) { +// SingleCycleTipsMethod.showTips(error, +// stationId(), +// getCycleRecorder().currentCycleIndex(), +// stateDelegate(), +// fragmentManager(), +// lifecycleOwner()); +// return; +// } + //4.更新测站状态,在当前测回经过检测 + setSingleCycleSchedule(getCycleRecorder().currentCycleIndex(), + SurveyorScheduleConstants.STATUE_VALUE_CHECKED); + + //6.清空测量状态 + onCompletedCheck(); + } + + protected void onCompletedCheck() { + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } + + protected static final String KEY_CYCLE_INDEX = "___cycle__index__"; + + static void enter(StateManagerAloneDistance stateManager, int cycleIndex) { + Bundle args = new Bundle(); + args.putInt(KEY_CYCLE_INDEX, cycleIndex); + stateManager.enter(StateType.doCalScheduleSingleCycle, args); + } + + private void postBtnEvent() { + int pointCount = getCachedData().pointCount(); + if (pointCount == 0) { + SurveyStateEvent.postCompleted(MeasureFragment.POSITION_DISTANCE_MEASURE); + } else { + SurveyStateEvent.postIdle(MeasureFragment.POSITION_DISTANCE_MEASURE); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoDeleteAllCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoDeleteAllCycleState.java new file mode 100644 index 0000000..1e49e92 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoDeleteAllCycleState.java @@ -0,0 +1,63 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.utils.ThreadPoolUtil; + +import com.bingce.controlnetwork.R; + +/** + * 删除本测站所有测回数据 + * 对于钢丝测距 所有两测回数据都在一个view里显示了,不用切换 + */ +class _DoDeleteAllCycleState extends __BaseState { + + private static final String KEY_STATION_ID = "__station_id"; + + static Bundle args(String stationId) { + Bundle args = new Bundle(); + args.putString(KEY_STATION_ID, stationId); + return args; + } + + public _DoDeleteAllCycleState(StateManagerAloneDistance stateManager) { + super(StateType.doDeleteAllCycle, stateManager); + } + + @Override + public void enter(Bundle args) { + String stationId = args.getString(KEY_STATION_ID); + + optionTipsWithStandStill(getContext().getString(R.string.tips_delete_station_all_surveyor_records), + () -> deleteAllCycleData(stationId)); + } + + private void deleteAllCycleData(String stationId) { + ThreadPoolUtil.execute(() -> { + //删除数据 + getCachedData().deleteAloneDistanceRecord(stationId); + + //清除已经提示测站可以检测标识 + IConfigDataSource configDataSource = + SurveyorDatabaseFactory.instance.getConfigDataSource(); + String key = ConfigConstants.KEY_CONFIG_STATION_CHECK_REMINDED + stationId; + configDataSource.setSync(key, ConfigConstants.VALUE_NO); + + //重置所有测回进度 + setAllCycleScheduleSync(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setSingleCycleScheduleSync(cycleIndexDefault, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + + //从第一测回开始 + setCurrentCycle(cycleIndexDefault); + //重新测量,并刷新 + findTargetFromBeginInCurrentCycle(true); + }); + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoDeleteCurrentCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoDeleteCurrentCycleState.java new file mode 100644 index 0000000..0c07e34 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoDeleteCurrentCycleState.java @@ -0,0 +1,55 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.state.StateType; + +import com.bingce.controlnetwork.R; + +class _DoDeleteCurrentCycleState extends __BaseState { + public _DoDeleteCurrentCycleState(StateManagerAloneDistance stateManager) { + super(StateType.doDeleteCurrentCycle, stateManager); + } + + @Override + public void enter(Bundle args) { + String stationId = args.getString(KEY_STATION_ID); + int cycleIndex = args.getInt(KEY_PERIOD_INDEX); + + optionTipsWithStandStill(getContext().getString(R.string.tips_delete_current_cycle_surveyor_record), + () -> { + //删除数据 + getCachedData().deleteAloneDistanceRecord(stationId, cycleIndex); + + //清除已经提示测站可以检测标识 + IConfigDataSource configDataSource = + SurveyorDatabaseFactory.instance.getConfigDataSource(); + String key = ConfigConstants.KEY_CONFIG_STATION_CHECK_REMINDED + stationId; + configDataSource.set(key, ConfigConstants.VALUE_NO); + + //重置进度 + //当前测回 + setCurrentCycle(cycleIndex); + //所有测回未完成 + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + //单个测回未完成 + setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + //重新测量,并刷新 + findTargetFromBeginInCurrentCycle(true); + }); + } + + private static final String KEY_STATION_ID = "__station_id"; + private static final String KEY_PERIOD_INDEX = "__period_index__"; + + static Bundle args(String stationId, int periodIndex) { + Bundle args = new Bundle(); + args.putString(KEY_STATION_ID, stationId); + args.putInt(KEY_PERIOD_INDEX, periodIndex); + return args; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoMove2NextValidateState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoMove2NextValidateState.java new file mode 100644 index 0000000..c0cff3c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoMove2NextValidateState.java @@ -0,0 +1,72 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.FindTargetMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; + +/** + * 移动到一个待测量位置 + *

+ * 不会跳转到其他测期 + *

+ * 可能涉及转向(盘左->盘右) + */ +class _DoMove2NextValidateState extends __BaseState { + + public _DoMove2NextValidateState(StateManagerAloneDistance stateManager) { + super(StateType.doMove2NextValidate, stateManager); + } + + @Override + public void enter(Bundle args) { + CachedDataAloneDistance cachedData = getCachedData(); + ISurveyorData surveyorData = getSurveyorData(); + ICycleRecorder cycleRecorder = getCycleRecorder(); + + int pointCount = cachedData.pointCount(); + int currentIndex = surveyorData.currentIndex(); + if (currentIndex < 0) { + currentIndex = 0; + } + final int currentCycleIndex = cycleRecorder.currentCycleIndex(); + final LeftOrRight currentSurveyorState = surveyorData.leftOrRight(); + + + FindTargetMethod.Target needMeasureForAloneDistanceTarget = FindTargetMethod.findNeedMeasureTargetInSingleCycleForAloneDistance(stationId(), currentCycleIndex, + currentIndex, + currentSurveyorState, + pointCount, + true, + cachedData); + + if (needMeasureForAloneDistanceTarget != null) { + navigation2(needMeasureForAloneDistanceTarget.itemIndex, needMeasureForAloneDistanceTarget.leftOrRight); + return; + } + + + //3.当前测回完成测量,停留状态 + //重置标识 + enterIdleAndClearSurveyorStatePosition(); + } + + /** + * 跳转到下一目标点 + * + * @param targetIndex 目标点索引 + * @param targetSurveyorState 测量状态(盘左or盘右) + */ + private void navigation2(int targetIndex, LeftOrRight targetSurveyorState) { + //更新测量进度 + setSurveyPosition(targetIndex, targetSurveyorState); + //清除测量状态,进入idle,但是不停止自动测量 + enterIdleAndClearSurveyStateAndResetAutoMode(false); + //滚动 + scroll2(targetIndex); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoMoveBackState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoMoveBackState.java new file mode 100644 index 0000000..0f87315 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoMoveBackState.java @@ -0,0 +1,85 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.alonedistance.AloneDistanceRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; + +import blankj.utilcode.util.ToastUtils; + +/** + * 移动到上一测量结点,伴随删除上次测量数据 + */ +public class _DoMoveBackState extends __BaseState { + + public _DoMoveBackState(StateManagerAloneDistance stateManager) { + super(StateType.doMoveBack, stateManager); + } + + @Override + public void enter(Bundle args) { + CachedDataAloneDistance cachedDataSource = getCachedData(); + ISurveyorData surveyorDataSource = getSurveyorData(); + ICycleRecorder cycleRecorder = getCycleRecorder(); + + final int pointCount = cachedDataSource.pointCount(); + final int currentCycle = cycleRecorder.currentCycleIndex(); + final int currentIndex = surveyorDataSource.currentIndex(); + final LeftOrRight leftOrRight = surveyorDataSource.leftOrRight(); + + int targetIndex = currentIndex; + if (targetIndex < 0) { + //如果测量结束,直接使用0号点盘右 + targetIndex = pointCount - 1; + } + warningWithStandStill(cachedDataSource, currentCycle, targetIndex, LeftOrRight.left); + } + + private void warningWithStandStill( + CachedDataAloneDistance cachedDataSource, + int currentCycle, int itemIndex, LeftOrRight leftOrRight) { + optionTipsWithStandStill(Tools.getString(R.string.roll_back_node_data), + () -> { + //删除当前数据 + int nextSurveyorPointIndex = cachedDataSource.deleteAloneDistanceRecord(stationId(), + currentCycle, itemIndex, leftOrRight, true); + + if (nextSurveyorPointIndex == -1) { + ToastUtils.showShort(R.string.roll_back_failed); + navigation2(StateType.idle); + return; + } + + AloneDistanceRecord aloneDistanceRecord = getAloneDistanceRecord(nextSurveyorPointIndex); + if (aloneDistanceRecord != null && aloneDistanceRecord.distanceValues.size() == getSurveyorCount()) { + navigation2(StateType.doWellMeasureRotationReady); + } else { + navigation2(StateType.idle); + } + + //重置进度 + setCurrentCycle(nextSurveyorPointIndex); + setSingleCycleSchedule(currentCycle, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + + resetSchedule(this, nextSurveyorPointIndex, leftOrRight); + }); + } + + private void resetSchedule(__BaseState state, + int targetIndex, + LeftOrRight leftOrRight) { + //设置测量目标点 + state.setSurveyPosition(targetIndex, leftOrRight); + + state.scroll2(targetIndex); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoSurveyorState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoSurveyorState.java new file mode 100644 index 0000000..7cdd659 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoSurveyorState.java @@ -0,0 +1,177 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; + +import com.bingce.controlapphelper.datasource.database.alonedistance.AloneDistanceRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.ISurveyState; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorListener; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorRemindListener; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParam; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.surveyor.state.StateConstants; +import com.bingce.device.Device; +import com.bingce.totalstation.TotalStation; +import com.bingce.totalstation.protocol.south.SouthAndroidBtInterface; +import com.bingce.totalstation.protocol.topcon.TopconInterface; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import blankj.utilcode.util.ToastUtils; +import blankj.utilcode.util.Utils; + +/** + * 先检测是否有其他未完成测回,继续本次测量将删除其他测回数据 + */ +class _DoSurveyorState extends __BaseState implements ISurveyorListener, ISurveyorRemindListener { + private final ISurveyState surveyState; + //最多测量次数,如果5次测量都没有获取正常数据,则跳过 + private static final int MAX_SURVEYOR_COUNT = 3; + private static int failureCount = 0; + private static final int RESULT_SUCCESS = 0; + private static final int RESULT_FAILURE_EXCEED_MAX = 1;//测量失败次数超出最大限制 + private static final int RESULT_FAILURE_ERROR = 2;//测量失败,又没有允许重复尝试 + private static final boolean allowTryWhenFailure = true;//在测量失败的时候,是否允许重新测量 + + private int measureTimeIndex = 0; + private boolean isAlreadyRemindUserAimingAtWire = false; + + private final Handler handler; + + public _DoSurveyorState(StateManagerAloneDistance stateManager, ISurveyState surveyState) { + super(StateType.doSurveyor, stateManager); + this.surveyState = surveyState; + handler = new Handler(Looper.getMainLooper()); + } + + @Override + public void enter(Bundle args) { + measureTimeIndex = 0; + + isAlreadyRemindUserAimingAtWire = false; + if (args != null) { + isAlreadyRemindUserAimingAtWire = args.getBoolean(StateConstants.KEY_IS_ROTATION_READY_STATE); + } + + //3.其他测回没有正在测量数据,则在当前测回执行测量 + doSurveyor(); + } + + private void doSurveyor() { + failureCount = 0; + //判断设备是否连接 + if (surveyorImpl().isReady()) { + //发送测量信号 + SurveyStateEvent.postSurveying(positionFragment); + //注册接收测量数据 + surveyorImpl().prepareSurveyor(); + sendSurveyRequest(); + } else { + enterIdleAndClearSurveyStateAndResetAutoMode(true); + Device.getInstance().remindConnectDevice(); + } + } + + @Override + public void onReceive(double originalHa, double originalVa, double sd, double clockwiseHa, double topVa, double hd, double vd) { + //重置错误读数 + failureCount = 0; + AloneDistanceRecord aloneDistanceRecord + = getCachedData().cacheAloneDistance(stationId(), StateManagerAloneDistance.CYCLE_INDEX_DEFAULT, getCurrentIndex(), sd, hd); + + //刷新页面 + refreshUI(); + int surveyorCount = getCachedData().getSurveyorCount(); + if (aloneDistanceRecord.distanceValues.size() == surveyorCount) { + ToastUtils.showShort(Utils.getApp().getString(R.string.alone_distance_first_round_measure_finish)); + onSuccess(); + } else if (aloneDistanceRecord.distanceValues.size() >= surveyorCount * 2) { + onSuccess(); + } else { + //当数据不够的时候 继续发送指令 + measureTimeIndex++; + if (TotalStation.getInstance() instanceof TopconInterface) { + //这个仪器需要延迟500毫秒发送指令 + handler.postDelayed(this::sendSurveyRequest, 500); + } else if (TotalStation.getInstance() instanceof SouthAndroidBtInterface) { + handler.postDelayed(this::sendSurveyRequest, 100); + } else { + sendSurveyRequest(); + } + } + } + + @Override + public void onError(String errorMsg) { + TtsManager.getInstance().speak(errorMsg); + if (allowTryWhenFailure) {//允许重新测量 + //测量出现异常,需要处理 + failureCount++; + if (failureCount >= MAX_SURVEYOR_COUNT) { + if (isAutoSurveyOpen()) { + TtsManager.getInstance().speak(Tools.getString(R.string.many_measure_failed)); + } + onCompleted(RESULT_FAILURE_EXCEED_MAX, Tools.getString(R.string.many_measure_failed_1)); + } else { + //再次尝试 + sendSurveyRequest(); + ToastUtils.showShort(R.string.receive_data_time_out); + } + } else { + onCompleted(RESULT_FAILURE_ERROR, errorMsg); + } + } + + private void sendSurveyRequest() { + SurveyorPoint surveyorPoint = getCachedData().getSurveyorPoint(getCycleRecorder().currentCycleIndex(), getCurrentIndex()); + + ISurveyorData surveyorData = getSurveyorData(); + int measureTimeIndex = 0; + surveyorImpl().requestSurveyor(new RequestSurveyorParam(getRequestSurveyorParamAuto(), getInsturmentHeight(), surveyorPoint, measureTimeIndex, + surveyorData.currentIndex(), surveyorData.leftOrRight(), isAlreadyRemindUserAimingAtWire)); + } + + private void onSuccess() { + onCompleted(RESULT_SUCCESS, ""); + } + + private void onCompleted(int result, String msg) { + //退出测量 + surveyorImpl().exitSurveyor(); + switch (result) { + case RESULT_SUCCESS://进入读数检测状态 + //检测是否处于「自动测量」 + if (!surveyState.isAutoSurveying()) { + SurveyStateEvent.postSuccess(positionFragment); + } + navigation2(StateType.checkReadData); + break; + case RESULT_FAILURE_EXCEED_MAX: + case RESULT_FAILURE_ERROR: { + SurveyStateEvent.postFailure(positionFragment); + //进入失败状态 + Bundle args = _SurveyorFailureState.args(msg); + navigation2(StateType.SurveyorFailure, args); + } + break; + default: + throw new RuntimeException("un reached state -- surveyor"); + } + } + + @Override + public void remindUserAimingAtWire() { + //退出测量 + surveyorImpl().exitSurveyor(); + + Bundle bundle = new Bundle(); + bundle.putString(StateConstants.KEY_ROTATION_STATE_FROM_WHERE, StateConstants.ROTATION_STATE_FROM_WHERE_MEASURE); + navigation2(StateType.doWellMeasureRotationReady, bundle); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoWellMeasureRotationReadyState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoWellMeasureRotationReadyState.java new file mode 100644 index 0000000..be6c86a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_DoWellMeasureRotationReadyState.java @@ -0,0 +1,41 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; +import android.text.TextUtils; + +import com.bingce.controlapphelper.event.AutoSurveyorButtonVisibleEvent; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.surveyor.state.StateConstants; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import org.greenrobot.eventbus.EventBus; + +import com.bingce.controlnetwork.surveyor.state.StateConstants; + +/** + * 钢丝测量旋转到位状态 + */ +class _DoWellMeasureRotationReadyState extends __BaseState { + + public _DoWellMeasureRotationReadyState(StateManagerAloneDistance stateManager) { + super(StateType.doWellMeasureRotationReady, stateManager); + } + + @Override + public void enter(Bundle args) { + if (args != null) { + String fromWhere = args.getString(StateConstants.KEY_ROTATION_STATE_FROM_WHERE); + if (TextUtils.equals(fromWhere, StateConstants.ROTATION_STATE_FROM_WHERE_MEASURE)) { + runOnUI(() -> TtsManager.getInstance().speak(getContext().getString(R.string.please_aiming_at_alone_distance_point_then_measure))); + } + } + //更新回退按钮状态 + refreshGoBack(); + SurveyStateEvent.postIdle(positionFragment); + EventBus.getDefault().post(new AutoSurveyorButtonVisibleEvent(positionFragment, false, true)); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IdleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IdleState.java new file mode 100644 index 0000000..4fa88a0 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IdleState.java @@ -0,0 +1,64 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import androidx.annotation.NonNull; + +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.AutoSurveyorButtonVisibleEvent; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.totalstation.ControlSurveyResult; +import com.bingce.utils.ThreadPoolUtil; + +import org.greenrobot.eventbus.EventBus; + +/** + * 空闲状态 + *

+ * 将刷新界面 + */ +class _IdleState extends __BaseState { + private final @NonNull + IAutoModeSwitcher autoModeSwitcher; + + public _IdleState(StateManagerAloneDistance stateManager, @NonNull IAutoModeSwitcher autoModeSwitcher) { + super(StateType.idle, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + public void enter(Bundle args) { + + refreshGoBack(); + + ThreadPoolUtil.execute(() -> { + boolean completed = _IsSingleCycleCompletedState.isSingleCycleCompleted( + stationId(), + StateManagerAloneDistance.CYCLE_INDEX_DEFAULT, + getCachedData(), ToleranceDetailRecord.ALONE_DISTANCE_MEASURE_COUNT); + + //判断当前条件是否满足自动测量 + boolean haveAutoCondition = autoModeSwitcher.isReadyAutoSurvey() == ControlSurveyResult.CODE_SUCCESS; + + //自动测量是否显示 + EventBus.getDefault().post(new AutoSurveyorButtonVisibleEvent(positionFragment, haveAutoCondition, autoModeSwitcher.isAutoModeOpen())); + + if (haveAutoCondition && autoModeSwitcher.isAutoModeOpen()) { + //继续自动测量 + navigation2(StateType.doSurveyor); + } else { + if (autoModeSwitcher.isAutoModeOpen()) { + autoModeSwitcher.resetAutoMode(); + } + if (completed) { + SurveyStateEvent.postCompleted(positionFragment); + } else { + SurveyStateEvent.postIdle(positionFragment); + } + } + }); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IsAllCycleCompletedState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IsAllCycleCompletedState.java new file mode 100644 index 0000000..701fae1 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IsAllCycleCompletedState.java @@ -0,0 +1,54 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import androidx.annotation.NonNull; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.ConfigRecord; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.utils.ThreadPoolUtil; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/* + * 检测是否所有 测期都完成了测量 + * + * 只有在当前测期完成测量之后,才会进入当前状态 + * */ +public class _IsAllCycleCompletedState extends __BaseState { + private final IAutoModeSwitcher autoModeSwitcher; + + public _IsAllCycleCompletedState(@NonNull StateManagerAloneDistance stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(StateType.isAllCycleCompleted, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + public void enter(Bundle args) { + if (isAutoSurveyOpen()) { + //检测是否已经提示 + //检测是否需要提示测站检测 + IConfigDataSource configDataSource = + SurveyorDatabaseFactory.instance.getConfigDataSource(); + ThreadPoolUtil.execute(() -> { + String key = ConfigConstants.KEY_CONFIG_STATION_CHECK_REMINDED + stationId(); + ConfigRecord record = configDataSource.getByKeySync(key); + if (record == null || ConfigConstants.VALUE_NO.equals(record.getConfigValue())) { + runOnUI(() -> TtsManager.getInstance().speak(Tools.getString(R.string.all_cycle_completed))); + } + }); + } + //标识测站完成测量(数据库存储) + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_COMPLETED); + //进入idle状态 + //清除测量状态,进入测站检测,停止自动测量 + enterStationCheckAndClearSurveyStateAndResetAutoMode(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IsSingleCycleCompletedState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IsSingleCycleCompletedState.java new file mode 100644 index 0000000..ca23390 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_IsSingleCycleCompletedState.java @@ -0,0 +1,61 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.alonedistance.AloneDistanceRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; + +public class _IsSingleCycleCompletedState extends __BaseState { + private static final int RESULT_YES = 0;//测回结束 + private static final int RESULT_NO = 1;//测回未结束 + + public _IsSingleCycleCompletedState(StateManagerAloneDistance stateManager) { + super(StateType.isSingleCycleCompleted, stateManager); + } + + @Override + public void enter(Bundle args) { + onCompleted( + isSingleCycleCompleted(stationId(), + getCycleRecorder().currentCycleIndex(), + getCachedData(), getSurveyorCount())); + } + + private void onCompleted(boolean completed) { + if (completed) { + //这里先刷新下UI,不然弹窗后面的list不显示最后一条数据 + getSurveyorData().clearSurveyStateAndPosition(); + refreshUI(); + + int cycleIndex = getCycleRecorder().currentCycleIndex(); + //更新单测回测量进度 + setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_COMPLETED); + //状态切换 + navigation2(StateType.isAllCycleCompleted); + } else { + findTargetFromBeginInCurrentCycle(false); + } + } + + /** + * 判断单个测回是否测量完成(不要求通过检测) + */ + public static boolean isSingleCycleCompleted(String stationId, int cycleIndex, CachedDataAloneDistance cachedData, int surveyCount) { + int result = RESULT_YES; + for (int index = 0; index < cachedData.pointCount(); index++) { + String pointId = cachedData.pointId(cycleIndex, index); + String leftOrRightKey = IdUtil.createSurveyorRecordId(stationId, cycleIndex, pointId, LeftOrRight.left); + AloneDistanceRecord aloneDistanceRecord = cachedData.getAloneDistanceRecord(leftOrRightKey); + if (aloneDistanceRecord == null || aloneDistanceRecord.distanceValues == null || + aloneDistanceRecord.distanceValues.size() < surveyCount * 2) { + result = RESULT_NO; + break; + } + } + return RESULT_YES == result; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_SurveyorFailureState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_SurveyorFailureState.java new file mode 100644 index 0000000..0d532bb --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/_SurveyorFailureState.java @@ -0,0 +1,36 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; + +/* + * 仪器导致的测量失败 + * + * 全站仪多次测量失败,进入该状态 + * */ +class _SurveyorFailureState extends __BaseState { + + public _SurveyorFailureState(StateManagerAloneDistance stateManager) { + super(StateType.SurveyorFailure, stateManager); + } + + @Override + public void enter(Bundle args) { + String error = ""; + if (args != null) { + error = args.getString(KEY); + } + failureTipsWithAutoStandStill(error + Tools.getString(R.string.please_observe_target)); + } + + private static final String KEY = "error"; + + public static Bundle args(String error) { + Bundle args = new Bundle(); + args.putString(KEY, error); + return args; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/__BaseState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/__BaseState.java new file mode 100644 index 0000000..2c94cf3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/alonedistance/__BaseState.java @@ -0,0 +1,395 @@ +package com.bingce.controlnetwork.surveyor.state.alonedistance; + +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.alonedistance.AloneDistanceRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyor; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParamAuto; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.MeasureFragment; + +import blankj.utilcode.util.ToastUtils; + +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.MeasureFragment; + +abstract class __BaseState { + private final StateType type; + private final StateManagerAloneDistance stateManager; + + protected final int positionFragment = MeasureFragment.POSITION_DISTANCE_MEASURE; + + /** + * 判断常量 + */ + private final int DEFAULT_AUTO_MODE = 0; + private final int RESET_AUTO_MODE = 1; + private final int CLOSE_AUTO_MODE = 2; + + protected final int cycleIndexDefault = StateManagerAloneDistance.CYCLE_INDEX_DEFAULT; + + public __BaseState(final StateType stateType, final StateManagerAloneDistance stateManager) { + this.type = stateType; + this.stateManager = stateManager; + } + + final protected StateType getType() { + return type; + } + + final protected @NonNull + ToleranceDetailRecord getToleranceRecord() { + return stateManager.toleranceRecord; + } + + final protected @NonNull + ISurveyorData getSurveyorData() { + return stateManager.surveyorData; + } + + private @NonNull + IAutoModeSwitcher autoModeRecorder() { + return stateManager; + } + + /** + * 设置测量位置 + */ + final protected void setSurveyPosition(int index, LeftOrRight leftOrRight) { + stateManager.surveyorData.setCurrentIndex(index); + stateManager.surveyorData.setLeftOrRight(leftOrRight); + } + + protected int getCurrentIndex() { + return stateManager.surveyorData.currentIndex(); + } + + protected AloneDistanceRecord getAloneDistanceRecord(int surveyorPointIndex) { + int cycleIndex = getCycleRecorder().currentCycleIndex(); + String pointId = getCachedData().pointId(cycleIndex, surveyorPointIndex); + String cacheKey = IdUtil.createSurveyorRecordId(stationId(), cycleIndex, pointId, LeftOrRight.left); + return getCachedData().getAloneDistanceRecord(cacheKey); + } + + final protected ISurveyor surveyorImpl() { + return stateManager.surveyor; + } + + + @NonNull + final protected CachedDataAloneDistance getCachedData() { + return stateManager.cachedData; + } + + @NonNull + final protected ICycleRecorder getCycleRecorder() { + return stateManager.cycleRecorder; + } + + @NonNull + final protected Context getContext() { + return stateManager.context; + } + + final protected void scroll2(int itemIndex) { + stateManager.scrollDelegate.onScrollTo(itemIndex); + } + + + final protected void toast(String warning) { + ToastUtils.showShort(warning); + } + + final protected void toast(@StringRes int warning) { + ToastUtils.showShort(warning); + } + + public abstract void enter(Bundle args);//进入状态 + + final protected void navigation2(StateType stateType) { + stateManager.enter(stateType); + } + + final protected void navigation2(StateType stateType, Bundle args) { + stateManager.enter(stateType, args); + } + + final protected String stationId() { + return stateManager.stationId(); + } + + protected int getSurveyorCount() { + return stateManager.surveyorData.surveyorCount(); + } + + final protected FragmentManager fragmentManager() { + return stateManager.fragmentManager(); + } + + final protected LifecycleOwner lifecycleOwner() { + return stateManager.lifecycleOwner(); + } + + final protected void tips(String msg, Runnable runnable) { + TipsFragment.noCancelAbleTips(stateManager.fragmentManager(), stateManager.lifecycleOwner(), + getContext(), + msg, + -1, + () -> { + if (runnable != null) { + runnable.run(); + } + }); + } + + /** + * 错误提示 + *

+ * 用户不能忽略,点击确定后自动「停留原地」 + */ + final protected void failureTipsWithAutoStandStill(String msg) { + TipsFragment.noCancelAbleTips(stateManager.fragmentManager(), stateManager.lifecycleOwner(), + getContext(), + msg, + -1, + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true)); + } + + final protected void failureTipsWithAutoStandStill(String msg, Runnable runnable) { + TipsFragment.noCancelAbleTips(stateManager.fragmentManager(), stateManager.lifecycleOwner(), + getContext(), + msg, + -1, + () -> { + runnable.run(); + enterIdleAndClearSurveyStateAndResetAutoMode(true); + }); + } + + final protected void optionTipsWithStandStill(String msg, Runnable confirmCallback) { + optionTips(msg, null, null, + confirmCallback, + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true), + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true)); + } + + final protected void optionTips(String msg, + String confirmButton, + String cancelButton, + Runnable confirmCallback, + Runnable cancelCallback, + Runnable ignoreCallback) { + TipsWith2OptionFragment.tips( + stateManager.fragmentManager(), + stateManager.lifecycleOwner(), + confirmButton, + cancelButton, + null, + msg, + new TipsWith2OptionFragment.IOperatorCallback() { + @Override + public void onConfirm() { + if (confirmCallback == null) { + return; + } + confirmCallback.run(); + } + + @Override + public void onCancel() { + if (cancelCallback == null) { + return; + } + cancelCallback.run(); + } + + @Override + public void onIgnore() { + if (ignoreCallback == null) { + return; + } + ignoreCallback.run(); + } + + @Override + public void onOption() { + } + }); + } + + final protected void runOnUI(Runnable runnable) { + stateManager.runOnUI(runnable); + } + + final protected void setCurrentCycle(int cycle) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getCurrentCycleKey(stationId(), SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE), + String.valueOf(cycle))); + } + + final protected void setCurrentCycleSync(int cycle) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .recordSync( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getCurrentCycleKey(stationId(), SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE), + String.valueOf(cycle))); + } + + final protected void setSingleCycleSchedule(int cycleIndex, String statue) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getSingleCycleScheduleKey(stationId(), SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE, cycleIndex), + statue)); + } + + final protected void setSingleCycleScheduleSync(int cycleIndex, String statue) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .recordSync( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getSingleCycleScheduleKey(stationId(), SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE, cycleIndex), + statue)); + } + + final protected void setAllCycleSchedule(String statue) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE), + statue)); + } + + final protected void setAllCycleScheduleSync(String statue) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .recordSync( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), SurveyorScheduleConstants.SCHEDULE_OR_CYCLE_TYPE_ALONE_DISTANCE), + statue)); + } + + /** + * 如果resetAutoSurveyState为true,将重置autoSurvey状态为unknown + */ + final protected void findTargetFromBeginInCurrentCycle(boolean resetAutoSurveyState) { + getSurveyorData().clearSurveyStateAndPosition(); + if (resetAutoSurveyState) { + autoModeRecorder().resetAutoMode(); + } + navigation2(StateType.doMove2NextValidate); + } + + final protected void enterIdleAndClearSurveyState() { + clearSurveyStateAndCloseAutoModeAndStandStill(DEFAULT_AUTO_MODE, + false, StateType.idle); + } + + final protected void enterIdleAndClearSurveyorStatePosition() { + clearSurveyStateAndCloseAutoModeAndStandStill(DEFAULT_AUTO_MODE, + true, StateType.idle); + } + + /** + * 取消测量,会停在当前位置(索引+盘左or盘右),并进入idle + */ + final protected void enterIdleAndClearSurveyStateAndResetAutoMode(boolean resetAutoMode) { + clearSurveyStateAndCloseAutoModeAndStandStill(resetAutoMode ? RESET_AUTO_MODE : DEFAULT_AUTO_MODE, + false, StateType.idle); + } + + + final protected void enterStationCheckAndClearSurveyStateAndResetAutoMode() { + clearSurveyStateAndCloseAutoModeAndStandStill(RESET_AUTO_MODE, + false, StateType.checkStation); + } + + /** + * 原_Check2CState 使用这个方法 + */ + final protected void enterIdleAndClearSurveyStateAndCloseAutoMode() { + clearSurveyStateAndCloseAutoModeAndStandStill(CLOSE_AUTO_MODE, false, StateType.idle); + } + + /** + * @param autoMode + * @param clearPosition + * @param stateType + */ + private void clearSurveyStateAndCloseAutoModeAndStandStill(int autoMode, boolean clearPosition, StateType stateType) { + //重置或者关闭自动模式 + if (autoMode == RESET_AUTO_MODE) { + autoModeRecorder().resetAutoMode(); + } else if (autoMode == CLOSE_AUTO_MODE) { + autoModeRecorder().closeAutoMode(); + } + //更新测量进度标识 + if (clearPosition) { + getSurveyorData().clearSurveyStateAndPosition(); + } else { + getSurveyorData().clearSurveyState(); + } + //进入某个状态 + navigation2(stateType); + } + + + /** + * 更新UI + */ + final protected void refreshUI() { + runOnUI(() -> getCachedData().notifyDateChange()); + } + + protected boolean isAutoSurveyOpen() { + return stateManager.isAutoModeOpen(); + } + + protected boolean isAutoSurveyClosed() { + return stateManager.isAutoModeClose(); + } + + double getInsturmentHeight() { + return stateManager.getInsturmentHeight(); + } + + RequestSurveyorParamAuto getRequestSurveyorParamAuto() { + return stateManager.getRequestSurveyorParamAuto(); + } + + protected void refreshGoBack() { + stateManager.refreshGoBackBtnEnable(); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/StateManager.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/StateManager.java new file mode 100644 index 0000000..2b474e0 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/StateManager.java @@ -0,0 +1,535 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.RefreshGoBackButton; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.AutoSurveyorMethod; +import com.bingce.controlapphelper.surveyor.method.SurveyorAdjustMethod; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.IStateType; +import com.bingce.controlapphelper.surveyor.state.ISurveyState; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyor; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorListener; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorRemindListener; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParamAuto; +import com.bingce.controlapphelper.surveyor.surveyor.SurveyorAutoImpl; +import com.bingce.controlapphelper.surveyor.surveyor.SurveyorMockAuto; +import com.bingce.controlapphelper.surveyor.surveyor.SurveyorSingleImpl; +import com.bingce.controlapphelper.surveyor.test.Test; +import com.bingce.controlapphelper.util.DigitalUtil; +import com.bingce.controlapphelper.util.IUIRunner; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.StationDataAdjustDialogFragment; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.controlnetwork.surveyor.state.AutoModeType; +import com.bingce.controlnetwork.surveyor.state.IScrollDelegate; +import com.bingce.controlnetwork.surveyor.state.StateConstants; +import com.bingce.coordlib.model.Coordinate; +import com.bingce.totalstation.ControlSurveyData; +import com.bingce.totalstation.ControlSurveyResult; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.utils.VipManager; + +import org.greenrobot.eventbus.EventBus; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import blankj.utilcode.util.ToastUtils; + +public class StateManager implements IAutoModeSwitcher, ISurveyState, IStateType { + private final Map stateMap = new HashMap<>(); + private StateType currentStateType = StateType.idle; + private final FragmentManager fragmentManager; + private final LifecycleOwner lifecycleOwner; + private final IUIRunner iuiRunner; + final IScrollDelegate scrollDelegate; + + @NonNull + SurveyorStationRecord stationRecord; + final @NonNull + RequestSurveyorParamAuto requestSurveyorParamAuto; + final @NonNull + ToleranceDetailRecord toleranceRecord; + final @NonNull + ISurveyorData surveyorData; + final @NonNull + ICachedData cachedData; + final @NonNull + ICycleRecorder cycleRecorder; + final @NonNull + Context context; + private AutoModeType autoMode = AutoModeType.unknown; + @NonNull + final ISurveyor surveyor; + private final PointRecord stationPointRecord; + final boolean supportAutoSurvey; + + private StateManager(final boolean supportAutoSurvey,//是否支持自动测量 + final @NonNull RequestSurveyorParamAuto requestSurveyorParamAuto, + final @NonNull SurveyorStationRecord stationRecord, + final @NonNull PointRecord stationPointRecord, + final @NonNull ToleranceDetailRecord toleranceRecord, + final @NonNull Context context, + final @NonNull ISurveyorData surveyorData, + final @NonNull ICycleRecorder cycleRecorder, + final @NonNull ICachedData cachedData, + final @NonNull IScrollDelegate scrollDelegate, + FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + IUIRunner iuiRunner) { + this.supportAutoSurvey = supportAutoSurvey; + + this.requestSurveyorParamAuto = requestSurveyorParamAuto; + this.stationRecord = stationRecord; + this.fragmentManager = fragmentManager; + this.lifecycleOwner = lifecycleOwner; + this.iuiRunner = iuiRunner; + this.scrollDelegate = scrollDelegate; + + this.context = context; + this.toleranceRecord = toleranceRecord; + this.surveyorData = surveyorData; + this.cachedData = cachedData; + this.cycleRecorder = cycleRecorder; + + this.stationPointRecord = stationPointRecord; + + if (Test.DEBUG) { + surveyor = new SurveyorMockAuto(StateConstants.VALUE_MEASURE_WHAT_ANGLE_DISTANCE, this.stationRecord.getId(), + this.stationRecord.isAutoClose(), + toleranceRecord.getCycleCount(), + cachedData, surveyorData, cycleRecorder, this, this); + } else { + if (supportAutoSurvey) { + surveyor = new SurveyorAutoImpl(StateConstants.VALUE_MEASURE_WHAT_ANGLE_DISTANCE, this); + } else { + surveyor = new SurveyorSingleImpl(StateConstants.VALUE_MEASURE_WHAT_ANGLE_DISTANCE); + } + } + _DoSurveyorState doSurveyorState = new _DoSurveyorState(this, this); + //注册接收数据的状态 + surveyor.register((ISurveyorListener) doSurveyorState); + surveyor.register((ISurveyorRemindListener) doSurveyorState); + + stateMap.put(StateType.doSurveyor, doSurveyorState); + stateMap.put(StateType.doAutoSurveyor, new _DoAutoSurveyorState(this, this)); + stateMap.put(StateType.SurveyorFailure, new _SurveyorFailureState(this)); + stateMap.put(StateType.doMove2NextValidate, new _DoMove2NextValidateState(this)); + stateMap.put(StateType.doMoveBack, new _DoMoveBackState(this)); + stateMap.put(StateType.doRecordClean, new _DoRecordCleanState(this)); + stateMap.put(StateType.checkReadData, new _CheckReadDataState(this, this)); + stateMap.put(StateType.isHalfCycleZeroCheckReady, new _IsHalfCycleZeroCheckReadyState(this)); + stateMap.put(StateType.checkHalfCycleZero, new _CheckHalfCycleZeroState(this)); + stateMap.put(StateType.isReady2CCheck, new _Is2CCheckReadyState(this)); + stateMap.put(StateType.check2C, new _Check2CState(this)); + stateMap.put(StateType.isSingleCycleCompleted, new _IsSingleCycleCompletedState(this)); + stateMap.put(StateType.isAllCycleCompleted, new _IsAllCycleCompletedState(this, this)); + stateMap.put(StateType.checkSingleCycle, new _CheckSingleCycleState(this)); + stateMap.put(StateType.checkStation, new _CheckStationState(this)); + stateMap.put(StateType.stationCheckedSuccess, new _CheckStationSuccessState(this)); + + stateMap.put(StateType.doDeleteAllCycle, new _DoDeleteAllCycleState(this)); + stateMap.put(StateType.doDeleteCurrentCycle, new _DoDeleteCurrentCycleState(this)); + + stateMap.put(StateType.doCalScheduleSingleCycle, new _DoCalScheduleInSingleCycleState(this, this)); + stateMap.put(StateType.doCalScheduleAllCycle, new _DoCalScheduleInAllCycleState(this, this)); + stateMap.put(StateType.doCalAdjust, new _DoCalAdjustState(this)); + stateMap.put(StateType.idle, new _IdleState(this, this)); + stateMap.put(StateType.doWellMeasureRotationReady, new _DoWellMeasureRotationReadyState(this)); + + //监听测站数据变化 + runOnUI(() -> SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getLiveDataRecord(stationRecord.getId()) + .observe(lifecycleOwner, record -> { + if (record == null || !stationRecord.getId().equals(record.getId())) { + return; + } + updateSurveyorStationRecord(record); + })); + } + + private void updateSurveyorStationRecord(SurveyorStationRecord record) { + this.stationRecord = record; + //更新测点信息 + if (stationRecord.getItems() != null) { + for (SurveyorPoint item : stationRecord.getItems()) { + if (item == null || !SurveyorPoint.TYPE_POINT.equals(item.getType())) { + //排除非测点 + continue; + } + cachedData.updateSurveyPointParams(item); + } + } + cachedData.notifyDateChange(); + } + + String stationId() { + return stationRecord.getId(); + } + + + @Override + public void enter(StateType type, Bundle args) { + if (isDead()) { + return; + } + __BaseState baseState = stateMap.get(type); + if (baseState != null) { + this.currentStateType = type; + runOnUI(() -> baseState.enter(args)); + } + } + + @Override + public void enter(StateType type) { + enter(type, null); + } + + void runOnUI(Runnable action) { + if (iuiRunner != null) { + iuiRunner.runOnUI(action); + } + } + + public void doSurveyor() { + boolean inValidate = isInValidate(); + + if (inValidate) { + return; + } + + int pointCount = cachedData.pointCount(); + if (pointCount == 0) { + ToastUtils.showShort(R.string.no_data_available_yet); + return; + } + + Bundle bundle = null; + if (isRotationReadyState()) { + //当前是旋转到位状态 + bundle = new Bundle(); + bundle.putBoolean(StateConstants.KEY_IS_ROTATION_READY_STATE, true); + } + + enter(StateType.doSurveyor, bundle); + } + + public void doAutoSurveyor() { + if (isInValidate()) { + return; + } + enter(StateType.doAutoSurveyor); + } + + public void deleteCurrentStationSurveyorData() { + if (isInValidate()) { + return; + } + enter(StateType.doDeleteAllCycle, _DoDeleteAllCycleState.args(stationId())); + } + + public void deleteCurrentStationSurveyorData(int cycleIndex) { + if (isInValidate()) { + return; + } + enter(StateType.doDeleteCurrentCycle, _DoDeleteCurrentCycleState.args(stationId(), cycleIndex)); + } + + public void stationCheck() { + if (isInValidate()) { + return; + } + enter(StateType.checkStation); + } + + public String stationCheckOnly() { + return _CheckStationState._stationCheck(stationId(), toleranceRecord, cachedData); + } + + public void stationAdjustOnly(String showType) { + ThreadPoolUtil.execute(() -> { + SurveyorAdjustMethod.AdjustResult adjustResult = SurveyorAdjustMethod.calStationAdjust(stationRecord, cachedData); + if (adjustResult.isError()) { + runOnUI(() -> TipsFragment.tipsOnly(fragmentManager, lifecycleOwner, context, adjustResult.errorString)); + return; + } + //显示平差结果 + StationDataAdjustDialogFragment.showDialog(showType, adjustResult.result, adjustResult.showSlopDistance, fragmentManager()); + + //伴随平差 设置进度为通过检测 + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), null), + SurveyorScheduleConstants.STATUE_VALUE_CHECKED)); + }); + } + + public void stationAdjust(String type) { + if (isInValidate()) { + return; + } + Bundle bundle = new Bundle(); + bundle.putString(StationDataAdjustDialogFragment.KEY_SHOW_TYPE, type); + enter(StateType.doCalAdjust, bundle); + } + + public void switch2Cycle(int cycleIndex) { + if (isInValidate()) { + return; + } + _DoCalScheduleInSingleCycleState.enter(this, cycleIndex); + } + + public void calScheduleWhenEnterSurveyFragment(int cycleIndex) { + if (isInValidate()) { + return; + } + _DoCalScheduleInAllCycleState.enter(this, cycleIndex); + } + + public void moveBack() { + if (isInValidate()) { + return; + } + enter(StateType.doMoveBack); + } + + //检测当前状态是否支持从外界主动改变状态 + //如果是空闲或者是测站通过检测是有效的状态 + private boolean isInValidate() { + return currentStateType != StateType.idle + && StateType.stationCheckedSuccess != currentStateType + && !isRotationReadyState(); + } + + private boolean isRotationReadyState() { + return currentStateType == StateType.doWellMeasureRotationReady; + } + + public void quite() { + _live = false; + for (Map.Entry entry : stateMap.entrySet()) { + entry.getValue().quite(); + } + //进入idle状态 + this.currentStateType = StateType.idle; + } + + private boolean _live = true; + + boolean isDead() { + return !_live; + } + + public void resume() { + _live = true; + for (Map.Entry entry : stateMap.entrySet()) { + entry.getValue().resume(); + } + } + + FragmentManager fragmentManager() { + return this.fragmentManager; + } + + LifecycleOwner lifecycleOwner() { + return this.lifecycleOwner; + } + + final boolean isStationAutoClosed() { + return stationRecord.isAutoClose(); + } + + @WorkerThread + public static StateManager newInstance( + boolean isSupportAutoMode, + @NonNull RequestSurveyorParamAuto requestSurveyorParamAuto, + @NonNull SurveyorStationRecord stationRecord, + @NonNull Context context, + @NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + @NonNull ToleranceDetailRecord toleranceRecord, + @NonNull ISurveyorData surveyorData, + @NonNull ICycleRecorder cycleRecorder, + @NonNull ICachedData cachedData, + IScrollDelegate scrollDelegate, + IUIRunner runner) { + //读取测点record + String stationPointId = null; + if (stationRecord.getItems() != null) { + for (SurveyorPoint stationItem : stationRecord.getItems()) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + stationPointId = stationItem.getPointId(); + break; + } + } + } + PointRecord stationPointRecord = null; + if (stationPointId != null) { + stationPointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationPointId); + } + if (stationPointRecord == null) { + return null; + } + boolean supportAuto = Test.DEBUG; + //AppUtils.isAppDebug() + if (isSupportAutoMode && + (VipManager.getInstance().checkReg() || VipManager.getInstance().checkControlProProLevel())) { + supportAuto = true; + } + StateManager manager = new StateManager(supportAuto, + requestSurveyorParamAuto, + stationRecord, + stationPointRecord, + toleranceRecord, + context, + surveyorData, + cycleRecorder, + cachedData, + scrollDelegate, + fragmentManager, lifecycleOwner, runner); + return manager; + } + + @Override + public boolean isAutoModeOpen() { + return autoMode == AutoModeType.start; + } + + @Override + public boolean isAutoModeClose() { + return autoMode == AutoModeType.stop; + } + + @Override + public boolean isAutoModeNotSpecial() { + return autoMode == AutoModeType.unknown; + } + + @Override + public void openAutoMode() { + autoMode = AutoModeType.start; + } + + @Override + public void closeAutoMode() { + autoMode = AutoModeType.stop; + } + + @Override + public void resetAutoMode() { + autoMode = AutoModeType.unknown; + } + + + @Override + public int isReadyAutoSurvey() { + if (!supportAutoSurvey) { + return ControlSurveyResult.CODE_ERROR; + } + if (!surveyor.isReady()) {//仪器连接上才算ready + return ControlSurveyResult.CODE_ERROR; + } + + Coordinate stationBasePoint = getStationCoord(); + double instrumentHeight = getInsturmentHeight(); + + return requestSurveyorParamAuto.checkAutoCondition(getCachedData(), stationBasePoint, instrumentHeight); + } + + @Override + public String isMeasuredValueMatchDesign() { + if (!supportAutoSurvey) { + return null; + } + Coordinate stationBasePoint = getStationCoord(); + double instrumentHeight = getInsturmentHeight(); + List originMeasureList = requestSurveyorParamAuto.getOriginMeasureList(getCachedData()); + return AutoSurveyorMethod.checkAutoSurveyorMeasuredValue(stationBasePoint, instrumentHeight, originMeasureList); + } + + @Override + public boolean isSurveying() { + return currentStateType == StateType.doSurveyor || currentStateType == StateType.doAutoSurveyor; + } + + @Override + public boolean isAutoSurveying() { + return isAutoModeOpen(); + } + + + public ICachedData getCachedData() { + return cachedData; + } + + /** + * 获取当前测回 + * + * @return + */ + public int getCurrentCycle() { + return cycleRecorder.currentCycleIndex(); + } + + public int getCurrentIndex() { + return surveyorData.currentIndex(); + } + + private Coordinate getStationCoord() { + if (PointRecord.TYPE_KNOWN_POINT.equals(stationPointRecord.getPointType())) { + return new Coordinate( + stationPointRecord.getX(), + stationPointRecord.getY(), + stationPointRecord.getZ()); + } + return null; + } + + public double getInsturmentHeight() { + return DigitalUtil.valueOfDoubleString(stationRecord.getInstrumentHeight(), 0); + } + + @NonNull + public RequestSurveyorParamAuto getRequestSurveyorParamAuto() { + return requestSurveyorParamAuto; + } + + public void refreshGoBackBtnEnable() { + int currentCycle = cycleRecorder.currentCycleIndex(); + String pointId = getCachedData().pointId(currentCycle, 0); + DataCategory dataCategory = getCachedData().valueState( + IdUtil.createSurveyorRecordId(stationId(), currentCycle, pointId, LeftOrRight.left), 0); + EventBus.getDefault().post(new RefreshGoBackButton(!dataCategory.isEmptyData())); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_Check2CState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_Check2CState.java new file mode 100644 index 0000000..a1d2566 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_Check2CState.java @@ -0,0 +1,113 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.ValueOf2cMethod; +import com.bingce.controlapphelper.surveyor.method.model.CacheResult; +import com.bingce.controlapphelper.surveyor.method.model.SdAngleValueType; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.utils.Util; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/* + * 检测2c + * */ +class _Check2CState extends __BaseState { + + public _Check2CState(StateManager stateManager) { + super(StateType.check2C, stateManager); + } + + @Override + public void enter(Bundle args) { + String error = _check2C(stationId(), getToleranceRecord(), + getSurveyorData(), + getCycleRecorder().currentCycleIndex(), + getCachedData()); + if (error.isEmpty()) { + navigation2(StateType.doRecordClean); + } else { + if (isAutoSurveyOpen()) { + TtsManager.getInstance().speak(Tools.getString(R.string.erxi_is_over_limit_please_check)); + } + optionTips(error, + Tools.getString(R.string.retest_cycle), + Tools.getString(R.string.retest_point), + () -> optionTipsWithStandStill(Tools.getString(R.string.tips_delete_current_cycle_surveyor_record), + () -> { + String stationId = stationId(); + int currentCycleIndex = getCycleRecorder().currentCycleIndex(); + //删除数据 + ICachedData cachedData = getCachedData(); + cachedData.deleteSurveyorRecord(stationId, currentCycleIndex); + //更新进度 + setSingleCycleSchedule(currentCycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + //重新查找目标开启测量 + findTargetFromBeginInCurrentCycle(true); + }), + this::enterIdleAndClearSurveyState, + this::enterIdleAndClearSurveyStateAndCloseAutoMode); + } + } + + private static String _check2C(String stationId, + ToleranceDetailRecord toleranceRecord, + ISurveyorData surveyorData, + int cycleIndex, + ICachedData cachedData) { + StringBuilder stringBuilder = new StringBuilder(); + + int currentIndex = surveyorData.currentIndex(); + + CacheResult value2C = ValueOf2cMethod.valueOf2C(SdAngleValueType.horAngle, currentIndex, stationId, + surveyorData, cycleIndex, cachedData); + + if (!value2C.validate || toleranceRecord.getHor2C() < Math.abs(value2C.value)) { + stringBuilder.append(Tools.getString(R.string.hor_angle_2c_limit)) + .append(toleranceRecord.getHor2C()) + .append("'')\n") + .append(" ") + .append(Tools.getString(R.string.measurements)) + .append(Util.formatDouble2String(Math.abs(value2C.value), 1)) + .append("''"); + } + + value2C = ValueOf2cMethod.valueOf2C(SdAngleValueType.verAngle, currentIndex, stationId, + surveyorData, cycleIndex, cachedData); + if (!value2C.validate || toleranceRecord.getVerI() < Math.abs(value2C.value)) { + stringBuilder.append("\n") + .append(Tools.getString(R.string.ver_angle_i_limit)) + .append(toleranceRecord.getVerI()) + .append("'')\n") + .append(" ") + .append(Tools.getString(R.string.measurements)) + .append(Util.formatDouble2String(Math.abs(value2C.value), 1)) + .append("''"); + } + + if (!cachedData.isAloneDistance(cycleIndex, surveyorData.currentIndex())) { + value2C = ValueOf2cMethod.valueOf2C(SdAngleValueType.distance, currentIndex, stationId, + surveyorData, cycleIndex, cachedData); + if (!value2C.validate || toleranceRecord.getSlopeLensDistanceDifference() < Math.abs(value2C.value)) { + stringBuilder.append("\n") + .append(Tools.getString(R.string.distance_positive_and_negative_mirror_limit)) + .append(toleranceRecord.getSlopeLensDistanceDifference()) + .append("mm)\n") + .append(" ") + .append(Tools.getString(R.string.measurements)) + .append(Util.formatDouble2String(Math.abs(value2C.value), 1)) + .append("mm"); + } + } + + return stringBuilder.toString(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckHalfCycleZeroState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckHalfCycleZeroState.java new file mode 100644 index 0000000..156a56b --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckHalfCycleZeroState.java @@ -0,0 +1,81 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.AverageValueMethod; +import com.bingce.controlapphelper.surveyor.method.DeviationValueOfRadianMethod; +import com.bingce.controlapphelper.surveyor.method.model.CacheResult; +import com.bingce.controlapphelper.surveyor.method.model.SdAngleValueType; +import com.bingce.controlapphelper.surveyor.state.StateType; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import com.bingce.controlnetwork.R; + +/* + * 半测回归零检测 --- 只检测水平角 + * */ +class _CheckHalfCycleZeroState extends __BaseState { + private final static int RESULT_SUCCESS = 0; + private final static int RESULT_FAILURE = 1; + + public _CheckHalfCycleZeroState(StateManager stateManager) { + super(StateType.checkHalfCycleZero, stateManager); + } + + @Override + public void enter(Bundle args) { + if (isStationClosed()) { + ISurveyorData surveyorDataSource = getSurveyorData(); + int cycleIndex = getCycleRecorder().currentCycleIndex(); + ICachedData stationSurveyorDataSource = getCachedData(); + ToleranceDetailRecord toleranceRecord = getToleranceRecord(); + int pointCount = stationSurveyorDataSource.pointCount(); + LeftOrRight leftOrRight = surveyorDataSource.leftOrRight(); + + CacheResult angleHorFirst = AverageValueMethod.leftOrRightValue(SdAngleValueType.horAngle, + stationId(), + 0, + leftOrRight, + surveyorDataSource, + cycleIndex, + stationSurveyorDataSource); + CacheResult angleHorEnd = AverageValueMethod.leftOrRightValue(SdAngleValueType.horAngle, + stationId(), + pointCount - 1, + leftOrRight, + surveyorDataSource, + cycleIndex, + stationSurveyorDataSource); + if (!angleHorFirst.validate || !angleHorEnd.validate) { + onCompleted(RESULT_FAILURE); + } else { + double diff = DeviationValueOfRadianMethod.similarRadianDiff(angleHorFirst.value, angleHorEnd.value); + if (toleranceRecord.getHorHalfReturnZeroDifference() < Math.toDegrees(diff) * 3600) { + onCompleted(RESULT_FAILURE); + } else { + onCompleted(RESULT_SUCCESS); + } + } + } else { + onCompleted(RESULT_SUCCESS); + } + } + + private void onCompleted(int result) { + if (RESULT_SUCCESS == result) { + navigation2(StateType.isReady2CCheck); + } else if (RESULT_FAILURE == result) { + if (isAutoSurveyOpen()) { + TtsManager.getInstance().speak(getContext().getString(R.string.tips_error_half_cycle_zero_stop_survey)); + } + failureTipsWithAutoStandStill(getContext().getString(R.string.tips_error_half_cycle_zero_stop_survey)); + } else { + throw new RuntimeException("半测回归零差 failure"); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckReadDataState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckReadDataState.java new file mode 100644 index 0000000..4d64557 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckReadDataState.java @@ -0,0 +1,126 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.DeviationValueOfRadianMethod; +import com.bingce.controlapphelper.surveyor.method.RadianMethod; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.totalstation.TotalStation; + +import net.tatans.tensorflowtts.tts.TtsManager; + + +/* + * 检测当前测量数据读数互差 + * */ +class _CheckReadDataState extends __BaseState { + private static final int RESULT_SUCCESS = 0; + private static final int RESULT_FAILURE_HOR = 1; + private static final int RESULT_FAILURE_VER = 2; + private static final int RESULT_FAILURE_DISTANCE = 3; + private final IAutoModeSwitcher autoModeSwitcher; + + public _CheckReadDataState(StateManager stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(StateType.checkReadData, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + public void enter(Bundle args) { + //先检测测量值和设计值是否匹配(仅在自动测量打开下检测) + String error = autoModeSwitcher.isMeasuredValueMatchDesign(); + if (error != null) { + failureTipsWithAutoStandStill(error); + return; + } + int surveyorCount = getToleranceRecord().getSurveyorCount(); + if (surveyorCount <= 1) {//单次测量,直接通过检测 + onCompleted(RESULT_SUCCESS); + } else {//多次测量,执行检测 + ISurveyorData surveyorDataSource = getSurveyorData(); + double horDifference = getToleranceRecord().getHorReadDifference(); + double verDifference = getToleranceRecord().getVerReadDifference(); + double distanceDifference = getToleranceRecord().getSlopeReadDifference(); + double horDiffRadian = DeviationValueOfRadianMethod.similarRadianDiff(surveyorDataSource.getAngleHor1(), surveyorDataSource.getAngleHor2()); + double verDiffRadian = DeviationValueOfRadianMethod.similarRadianDiff(surveyorDataSource.getAngleVer1(), surveyorDataSource.getAngleVer2()); + + int resultCode = RESULT_SUCCESS; + if (horDifference < RadianMethod.radian2S(horDiffRadian)) { + resultCode = RESULT_FAILURE_HOR; + } else if (verDifference < RadianMethod.radian2S(verDiffRadian)) { + resultCode = RESULT_FAILURE_VER; + } else if (!isAloneDistance()//增加单独测距判断 + && distanceDifference < distanceReadDiff(surveyorDataSource.getDistance1(), surveyorDataSource.getDistance2())) { + resultCode = RESULT_FAILURE_DISTANCE; + } + onCompleted(resultCode); + } + } + + private void onCompleted(int result) { + if (RESULT_SUCCESS == result) { + checkLeft(); + } else { + String msg = ""; + switch (result) { + case RESULT_FAILURE_HOR: + msg = Tools.getString(R.string.hor_angle_read_data_limit); + break; + case RESULT_FAILURE_VER: + msg = Tools.getString(R.string.ver_angle_read_data_limit); + break; + case RESULT_FAILURE_DISTANCE: + msg = Tools.getString(R.string.distance_read_data_limit); + break; + default: + navigation2(StateType.idle); + return; + } + if (isAutoSurveyOpen()) { + TtsManager.getInstance().speak(msg); + } + failureTipsWithAutoStandStill(msg); + } + } + + /** + * 如果是测回内首次测量,需要判断是否是盘左 + */ + private void checkLeft() { + int currentItem = getSurveyorData().currentIndex(); + LeftOrRight leftOrRight = getSurveyorData().leftOrRight(); + if (leftOrRight == LeftOrRight.left) { + //如果是首次测量,强制要求使用盘左 + double vAngle = getSurveyorData().getAngleVer(); + if (!isFirstValidate(vAngle)) { + failureTipsWithAutoStandStill( + getContext().getString(R.string.error_tips_please_start_from_left), + () -> { + TotalStation.getInstance().requestChangeFace(); + }); + return; + } + } + navigation2(StateType.isHalfCycleZeroCheckReady); + } + + private boolean isFirstValidate(double vAngle) { + return vAngle >= 0 && vAngle <= Math.PI; + } + + /** + * 斜距两次读数差 + * + * @param distance1 读数1 + * @param distance2 读数2 + * @return 读数差(单位毫米) + */ + public static double distanceReadDiff(double distance1, double distance2) { + return Math.abs(distance1 - distance2) * 1000; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckSingleCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckSingleCycleState.java new file mode 100644 index 0000000..d1f154a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckSingleCycleState.java @@ -0,0 +1,102 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.surveyorrecord.SurveyorRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.SingleCycleCheckMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.surveyor.method.SingleCycleTipsMethod; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/** + * 测回内不同方向2c、方向i互差检测 + */ +class _CheckSingleCycleState extends __BaseState { + + public _CheckSingleCycleState(StateManager stateManager) { + super(StateType.checkSingleCycle, stateManager); + } + + @Override + public void enter(Bundle args) { + //1.先将该测回内所有补测数据设置为正常数据,再进行检测 + ICachedData cachedDataSource = getCachedData(); + ICycleRecorder cycleRecorder = getCycleRecorder(); + int pointCount = cachedDataSource.pointCount(); + int currentCycleIndex = cycleRecorder.currentCycleIndex(); + String stationId = stationId(); + + for (int index = 0; index < pointCount; index++) { + String pointId = cachedDataSource.pointId(currentCycleIndex, index); + String keyLeft = IdUtil.createSurveyorRecordId(stationId, currentCycleIndex, pointId, LeftOrRight.left); + SurveyorRecord left = cachedDataSource.getSurveyorRecord(keyLeft); + _changeDirtyRecord2NormalBeforeCheck(left, cachedDataSource); + String keyRight = IdUtil.createSurveyorRecordId(stationId, currentCycleIndex, pointId, LeftOrRight.right); + SurveyorRecord right = cachedDataSource.getSurveyorRecord(keyRight); + _changeDirtyRecord2NormalBeforeCheck(right, cachedDataSource); + } + //2.执行检测 + doCheck(); + } + + private static void _changeDirtyRecord2NormalBeforeCheck( + SurveyorRecord record, ICachedData cachedDataSource) { + if (record == null) { + return; + } + if (record.value1Status.isResurveyed() || record.value2Status.isResurveyed()) { + if (record.value1Status.isResurveyed()) { + record.value1Status = DataCategory.normalCategory(); + } + if (record.value2Status.isResurveyed()) { + record.value2Status = DataCategory.normalCategory(); + } + + cachedDataSource.updateCache(record); + } + } + + private void doCheck() { + ToleranceDetailRecord toleranceRecord = getToleranceRecord(); + ISurveyorData surveyorDataSource = getSurveyorData(); + ICycleRecorder cycleRecorder = getCycleRecorder(); + ICachedData stationSurveyorDataSource = getCachedData(); + + //1.执行单测回内检测 + String error = SingleCycleCheckMethod.check( + toleranceRecord.getHorCycleDirect2CDifference(), toleranceRecord.getVerCycleDirectIDifference(), + stationId(), cycleRecorder.currentCycleIndex(), surveyorDataSource, stationSurveyorDataSource); + if (error != null) { + if (isAutoSurveyOpen()) { + TtsManager.getInstance().speak(Tools.getString(R.string.check_cycle_inner_failed)); + } + //TODO 这里可能存在不对测回内错误处理的情况,后面应该兼容处理下 + SingleCycleTipsMethod.showTips(error, stationId(), cycleRecorder.currentCycleIndex(), + stateDelegate(), + fragmentManager(), + lifecycleOwner()); + } else { + onSuccess(); + } + } + + private void onSuccess() { + //更新测量进度 + setSingleCycleSchedule(getCycleRecorder().currentCycleIndex(), + SurveyorScheduleConstants.STATUE_VALUE_CHECKED); + + //跳转 + navigation2(StateType.isAllCycleCompleted); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckStationState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckStationState.java new file mode 100644 index 0000000..b741368 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckStationState.java @@ -0,0 +1,415 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.IPointDataSource; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.AverageValueMethod; +import com.bingce.controlapphelper.surveyor.method.DeviationValueOfRadianMethod; +import com.bingce.controlapphelper.surveyor.method.RadianMethod; +import com.bingce.controlapphelper.surveyor.method.ValueOf2cMethod; +import com.bingce.controlapphelper.surveyor.method.model.CacheResult; +import com.bingce.controlapphelper.surveyor.method.model.SdAngleValueType; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.SelectReSurveyorPointFragment; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.utils.Util; + +import java.util.ArrayList; +import java.util.List; + +/** + * 执行「测站检测」 + *

+ * 前置条件: + * 所有测回都完成测量,并且通过「测回内检测」 + */ +class _CheckStationState extends __BaseState { + + public _CheckStationState(StateManager stateManager) { + super(StateType.checkStation, stateManager); + } + + @Override + public void enter(Bundle args) { + //执行测站检测 + String error = _stationCheck(stationId(), getToleranceRecord(), getCachedData()); + if (error == null || error.isEmpty()) { + //进入finish状态 + navigation2(StateType.stationCheckedSuccess); + } else { + showErrorTips(error, stationId(), getToleranceRecord().getCycleCount(), + getSurveyorData(), getCycleRecorder(), getCachedData(), + this, + fragmentManager(), + lifecycleOwner()); + } + } + + /** + * 提示错误信息,并让用户选择下一步操作 + */ + static void showErrorTips(String msg, String stationId, int cycleCount, + ISurveyorData surveyorDataSource, + ICycleRecorder cycleRecorder, + ICachedData stationSurveyorDataSource, + __BaseState state, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner) { + state.optionTips(msg, + Tools.getString(R.string.retest_direction), + Tools.getString(R.string.retest_station), + () -> state.runOnBackground(() -> reSurveyorPoint(stationId, cycleCount, + cycleRecorder, stationSurveyorDataSource, + state, fragmentManager, lifecycleOwner)), + () -> reSurveyorStation(msg, stationId, cycleCount, + surveyorDataSource, cycleRecorder, stationSurveyorDataSource, + state, fragmentManager, lifecycleOwner), + () -> state.enterIdleAndClearSurveyStateAndResetAutoMode(true)); + } + + @WorkerThread + static void reSurveyorPoint(String stationId, int cycleCount, + ICycleRecorder cycleRecorder, + ICachedData cachedData, + __BaseState state, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner) { + //弹框提示选择重测数据 + ISurveyorStationDataSource dataSource = SurveyorDatabaseFactory.instance.getSurveyorStation(); + SurveyorStationRecord instance = dataSource.getRecordSync(stationId); + if (instance == null) { + state.enterIdleAndClearSurveyStateAndResetAutoMode(true); + return; + } + IPointDataSource pointDataSource = SurveyorDatabaseFactory.instance.getPointDataSource(); + List stationItems = instance.getItems(); + ArrayList ids = new ArrayList<>(); + ArrayList names = new ArrayList<>(); + for (SurveyorPoint item : stationItems) { + if (item.isAbandon()) { + continue; + } + + if (!SurveyorPoint.TYPE_POINT.equals(item.getType())) { + continue; + } + PointRecord pointRecord = pointDataSource.findByIdSync(item.getPointId()); + if (pointRecord == null) { + continue; + } + ids.add(pointRecord.id); + names.add(pointRecord.name); + } + state.runOnUI(() -> SelectReSurveyorPointFragment.pick( + fragmentManager, + lifecycleOwner, + cycleCount, + instance.leftAndRightSurveyor, + ids, + names, + (cycleIndex, pointIds) -> { + if (pointIds == null || pointIds.isEmpty()) { + state.enterIdleAndClearSurveyStateAndResetAutoMode(true); + } else { + //记录补测数据类型,切换测回 + cachedData.markReSurveyor(stationId, cycleIndex, pointIds); + cycleRecorder.changeCycleIndex(cycleIndex); + + //更新测量状态 + state.setCurrentCycle(cycleIndex); + state.setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + state.setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + + //查找新测量目标 + state.findTargetFromBeginInCurrentCycle(true); + } + } + )); + } + + static void reSurveyorStation(String msg, String stationId, int cycleCount, + ISurveyorData surveyorData, + ICycleRecorder cycleRecorder, + ICachedData cachedData, + __BaseState state, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner) { + state.optionTips(Tools.getString(R.string.is_delete_all_station_data), null, null, + () -> {//1.选择删除测站所有数据,则执行相应逻辑 + ThreadPoolUtil.execute(() -> { + //删除数据 + cachedData.deleteSurveyorRecord(stationId); + + //更新测量进度 + state.setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + for (int index = 0; index < cycleCount; index++) { + state.setSingleCycleSchedule(index, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + } + + state.resetLearnDataTag(); + + //重新测量 + state.findTargetFromBeginInCurrentCycle(true); + }); + }, + () -> {//2.如果用户不选择删除,则循环提示,让他重新在重测和删除做选择 + //循环显示 + showErrorTips(msg, stationId, cycleCount, + surveyorData, cycleRecorder, cachedData, state, + fragmentManager, lifecycleOwner); + }, + () -> state.enterIdleAndClearSurveyStateAndResetAutoMode(true));//3.如果用户忽略,则停留在当前位置 + } + + + //检测合法性 + + /** + * 检测所有测回数据 + *

+ * 在「无自动闭合」情况下,为了兼容「左右角」测量结果,根据pointId将所有测量数据存入map中 + * 根据「左角」测量来检测「测回间同方向值互差」,所有测回的归零值使用「左角」第一个point来做0点 + *

+ * 如果是「自动闭合」情况,则忽略「左右角」测量,直接按照itemIndex依次计算,第个测回的归零值, + * 使用每次循环的itemIndex=0做0点 + * + * @param toleranceRecord 限差 + * @param cachedDataSource 缓存的测量数据 + * @return 错误信息,如果为null或空,说明没有错误 + */ + public static String _stationCheck(final String stationId, + final ToleranceDetailRecord toleranceRecord, + final ICachedData cachedDataSource) { + final int cycleCount = toleranceRecord.getCycleCount(); + final int surveyorCount = toleranceRecord.getSurveyorCount(); + + //*****测回间同方向值互差(水平角) + double horCyclesDirectValueDifference = toleranceRecord.getHorCyclesDirectValueDifference()/*horCyclesDirectValueDifference*/; + List<_ErrorItem> horValueError = new ArrayList<>(); + //*****测回间垂直角互差(垂直角) + double verCyclesAngleDifference = toleranceRecord.getVerCyclesAngleDifference()/*verCyclesAngleDifference*/; + List<_ErrorItem> verValueError = new ArrayList<>(); + + //执行计算 + for (int cycleI = 0; cycleI < cycleCount; cycleI++) { + List valuesI = + DeviationValueOfRadianMethod.zeroValueOfSingleCycleInLeftOrientation(stationId, cycleI, surveyorCount, cachedDataSource); + for (int cycleJ = cycleI + 1; cycleJ < cycleCount; cycleJ++) { + List valuesJ = + DeviationValueOfRadianMethod.zeroValueOfSingleCycleInLeftOrientation(stationId, cycleJ, surveyorCount, cachedDataSource); + if (valuesI.size() != valuesJ.size()) { + return Tools.getString(R.string.please_complete_all_retest_data); + } + int size = valuesI.size(); + for (int index = 0; index < size; index++) { + + double diff = Math.abs( + DeviationValueOfRadianMethod + .similarRadianDiff( + valuesI.get(index).horRadian, + valuesJ.get(index).horRadian)); + if (horCyclesDirectValueDifference < RadianMethod.radian2S(diff)) { + horValueError.add(new _ErrorItem(valuesI.get(index).pointName, + cycleI, cycleJ, RadianMethod.radian2S(diff))); + } + + diff = Math.abs(DeviationValueOfRadianMethod + .similarRadianDiff(valuesI.get(index).verRadian, valuesJ.get(index).verRadian)); + if (verCyclesAngleDifference < RadianMethod.radian2S(diff)) { + verValueError.add(new _ErrorItem(valuesI.get(index).pointName, + cycleI, cycleJ, RadianMethod.radian2S(diff))); + } + } + } + } + //*****测回间垂直角I互差(垂直角) + double verCyclesIDifference = toleranceRecord.getVerCyclesIDifference()/*verCyclesIDifference*/; + List<_ErrorItem> verIError = new ArrayList<>(); + //*****测回间斜距互差(距离) + double distCyclesDifference = toleranceRecord.getSlopeCycleDistanceDifference()/*slopeCycleDistanceDifference*/; + List<_ErrorItem> distError = new ArrayList<>(); + + List<_Point> pointArrayList = new ArrayList<>(); + //遍历第一测回,收集所有待测点id + for (int index = 0; index < cachedDataSource.pointCount(); index++) { + if (cachedDataSource.isPointAbandon(0, index)) { + continue; + } + pointArrayList.add(new _Point(cachedDataSource.pointId(0, index), + cachedDataSource.pointName(0, index), + cachedDataSource.isAloneDistance(0, index))); + } + //检测所有待测点i互差 + for (_Point point : pointArrayList) { + for (int cycleI = 0; cycleI < cycleCount; cycleI++) { + String leftRecordId_I = IdUtil.createSurveyorRecordId(stationId, cycleI, point.pointId, LeftOrRight.left); + String rightRecordId_I = IdUtil.createSurveyorRecordId(stationId, cycleI, point.pointId, LeftOrRight.right); + CacheResult value2C_I = ValueOf2cMethod.valueOf2C(SdAngleValueType.verAngle, leftRecordId_I, rightRecordId_I, + toleranceRecord.getSurveyorCount(), cachedDataSource); + CacheResult distanceLeftAndRightAverageValue_I = AverageValueMethod.leftAndRightValue(SdAngleValueType.distance, + leftRecordId_I, + rightRecordId_I, surveyorCount, cachedDataSource); + for (int cycleJ = cycleI + 1; cycleJ < cycleCount; cycleJ++) { + String leftRecordId_J = IdUtil.createSurveyorRecordId(stationId, cycleJ, point.pointId, LeftOrRight.left); + String rightRecordId_J = IdUtil.createSurveyorRecordId(stationId, cycleJ, point.pointId, LeftOrRight.right); + CacheResult value2C_J = ValueOf2cMethod.valueOf2C(SdAngleValueType.verAngle, leftRecordId_J, rightRecordId_J, + toleranceRecord.getSurveyorCount(), cachedDataSource); + CacheResult distanceLeftAndRightAverageValue_J = AverageValueMethod.leftAndRightValue(SdAngleValueType.distance, + leftRecordId_J, + rightRecordId_J, surveyorCount, cachedDataSource); + double verI = Math.abs(value2C_I.value - value2C_J.value); + if (verCyclesIDifference < verI) { + verIError.add(new _ErrorItem(point.pointName, cycleI, cycleJ, verI)); + } + + if (!point.aloneDistance) { + double distance = Math.abs(distanceLeftAndRightAverageValue_I.value - distanceLeftAndRightAverageValue_J.value); + if (distCyclesDifference < distance * 1000) { + distError.add(new _ErrorItem(point.pointName, cycleI, cycleJ, distance * 1000)); + } + } + + } + } + } + + return _errorString(horCyclesDirectValueDifference, verCyclesAngleDifference, verCyclesIDifference, distCyclesDifference, + horValueError, verValueError, verIError, distError); + } + + /** + * 根据超限信息生成错误描述 + * + * @param horValueError 水平角同方向值互差 + * @param verValueError 垂直角同方向值互差 + */ + private static String _errorString(double horLimit, double verLimit, double verILimit, double distLimit, + List<_ErrorItem> horValueError, List<_ErrorItem> verValueError, List<_ErrorItem> verIError, List<_ErrorItem> distError) { + if (horValueError.isEmpty() && verValueError.isEmpty()) { + return null; + } + StringBuilder stringBuilder = new StringBuilder(); + if (!horValueError.isEmpty()) { + stringBuilder.append(Tools.getString(R.string.cycle_between_same_direction_value_limit)) + .append(Util.formatDouble2String(horLimit, 1)) + .append("'')"); + for (_ErrorItem item : horValueError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + if (!verValueError.isEmpty()) { + stringBuilder.append("\n").append(Tools.getString(R.string.cycle_between_ver_angle_limit)) + .append(Util.formatDouble2String(verLimit, 1)) + .append("'')"); + for (_ErrorItem item : verValueError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + if (!verIError.isEmpty()) { + stringBuilder.append("\n").append(Tools.getString(R.string.ver_angle_i_same_direction_each_cycle)) + .append(Util.formatDouble2String(verILimit, 1)) + .append("'')"); + for (_ErrorItem item : verIError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + if (!distError.isEmpty()) { + stringBuilder.append("\n").append(Tools.getString(R.string.cycle_between_distance_limit_brackets)) + .append(Util.formatDouble2String(distLimit, 1)) + .append("'')"); + for (_ErrorItem item : distError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + return stringBuilder.toString(); + } + + /** + * 存储错误信息的item + */ + private static class _ErrorItem { + final String pointName; + final int cycleIndex1; + final int cycleIndex2; + final double difference; + + public _ErrorItem(String pointName, int cycleIndex1, int cycleIndex2, double difference) { + this.pointName = pointName; + this.cycleIndex1 = cycleIndex1; + this.cycleIndex2 = cycleIndex2; + this.difference = difference; + } + } + + private static class _Point { + final String pointId; + final String pointName; + final boolean aloneDistance; + + _Point(String pointId, String pointName, boolean aloneDistance) { + this.pointId = pointId; + this.pointName = pointName; + this.aloneDistance = aloneDistance; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckStationSuccessState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckStationSuccessState.java new file mode 100644 index 0000000..ffe951f --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_CheckStationSuccessState.java @@ -0,0 +1,33 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.StateType; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import com.bingce.controlnetwork.R; + +class _CheckStationSuccessState extends __BaseState { + + public _CheckStationSuccessState(StateManager stateManager) { + super(StateType.stationCheckedSuccess, stateManager); + } + + @Override + public void enter(Bundle args) { + ISurveyorData surveyorData = getSurveyorData(); + surveyorData.clearSurveyStateAndPosition(); + //设置测量进度(数据库存储) + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_CHECKED); + //通知刷新 + tips(getContext().getString(R.string.tips_all_cycle_has_finish_and_checked), null); + if (isAutoSurveyOpen()) { + runOnUI(() -> TtsManager.getInstance().speak(getContext().getString(R.string.tips_all_cycle_has_finish_and_checked))); + } + //清除测量状态,进入idle,停止自动测量 + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoAutoSurveyorState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoAutoSurveyorState.java new file mode 100644 index 0000000..499830a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoAutoSurveyorState.java @@ -0,0 +1,32 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.totalstation.ControlSurveyResult; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/** + * 先检测是否有其他未完成测回,继续本次测量将删除其他测回数据 + */ +class _DoAutoSurveyorState extends __BaseState { + private final IAutoModeSwitcher autoModeSwitcher; + + public _DoAutoSurveyorState(StateManager stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(StateType.doAutoSurveyor, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + public void enter(Bundle args) { + if (autoModeSwitcher.isReadyAutoSurvey() == ControlSurveyResult.CODE_SUCCESS) { + autoModeSwitcher.openAutoMode(); + navigation2(StateType.doMove2NextValidate); + TtsManager.getInstance().speak(Tools.getString(R.string.start_auto_measure)); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalAdjustState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalAdjustState.java new file mode 100644 index 0000000..bbbabf6 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalAdjustState.java @@ -0,0 +1,44 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.surveyor.method.SurveyorAdjustMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlnetwork.fragment.StationDataAdjustDialogFragment; + +/** + * 平差计算 + */ +public class _DoCalAdjustState extends __BaseState { + + public _DoCalAdjustState(StateManager stateManager) { + super(StateType.doCalAdjust, stateManager); + } + + @Override + public void enter(Bundle args) { + String showType = null; + if (args != null) { + showType = args.getString(StationDataAdjustDialogFragment.KEY_SHOW_TYPE); + } + startCalAdjust(showType); + } + + private void startCalAdjust(String showType) { + runOnBackground(() -> { + SurveyorAdjustMethod.AdjustResult adjustResult = SurveyorAdjustMethod.calStationAdjust(getStation(), getCachedData()); + if (adjustResult.isError()) { + runOnUI(() -> _CheckStationState.showErrorTips(adjustResult.errorString, stationId(), getToleranceRecord().getCycleCount(), + getSurveyorData(), getCycleRecorder(), getCachedData(), + _DoCalAdjustState.this, + fragmentManager(), + lifecycleOwner())); + return; + } + //清除测量状态,进入idle,停止自动测量 + enterIdleAndClearSurveyStateAndResetAutoMode(true); + StationDataAdjustDialogFragment.showDialog(showType, adjustResult.result, adjustResult.showSlopDistance, fragmentManager()); + } + ); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalScheduleInAllCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalScheduleInAllCycleState.java new file mode 100644 index 0000000..a28e35e --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalScheduleInAllCycleState.java @@ -0,0 +1,134 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.schedule.ISurveyorScheduleDataSource; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.method.FindTargetMethod; +import com.bingce.controlapphelper.surveyor.method.SingleCycleCheckMethod; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlnetwork.surveyor.method.SingleCycleTipsMethod; +import com.bingce.utils.ThreadPoolUtil; + +/** + * 在所有测回范围计算测量进度。 + *

+ * 1.检测当前测回,如果有没有完成测量,则跳转到相应位置。 + * 2.如果测量完成,检测数据限差。 + * 3.检测其他测回是否有待测数据 + * A.优先考虑dirty数据 + * B.其次考虑empty数据 + * 发现目标,执行跳转 + * 4.如果其他测回也完成测量,检测其限差 + * 发现超限,则立即返回true + * 5.如果其他测回限差通过检测,设置标识测站可以执行检测 + */ +class _DoCalScheduleInAllCycleState extends _DoCalScheduleInSingleCycleState { + + public _DoCalScheduleInAllCycleState(StateManager stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(StateType.doCalScheduleAllCycle, stateManager, autoModeSwitcher); + } + + @Override + protected boolean isNeedCancelEnterIdle(int currentCycle) { + ICachedData cachedData = getCachedData(); + int pointCount = cachedData.pointCount(); + ToleranceDetailRecord toleranceDetailRecord = getToleranceRecord(); + //5.当前测回完成且通过检测,则对其他测回执行检测 + FindTargetMethod.Target resurveyTarget = null; + int emptyCycleIndex = -1; + for (int cycleIndex = 0; cycleIndex < toleranceDetailRecord.getCycleCount(); cycleIndex++) { + if (cycleIndex == getCycleRecorder().currentCycleIndex()) { + continue; + } + + if (_IsSingleCycleCompletedState.isSingleCycleCompleted(stationId(), cycleIndex, getCachedData())) { + //更新该测回进度 + setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_COMPLETED); + continue; + } + //从0号位置盘左开始向后查询,找到需要补测位置 + resurveyTarget = FindTargetMethod.findTargetInSingleCycle( + stationId(), cycleIndex, 0, LeftOrRight.left, pointCount, true, + DataCategory.needResurvey(), cachedData); + if (resurveyTarget != null) { + break; + } + //测量没有完成,且没有补测数据,说明有空数据 + if (emptyCycleIndex < 0) { + emptyCycleIndex = cycleIndex; + } + } + + //6.如果有需要补测数据,优先处理 + if (resurveyTarget != null) { + option4Jump2OtherCycle4Resurvey(resurveyTarget.cycleIndex); + return true; + } + //7.如果其他测回有empty数据,提示 + if (emptyCycleIndex >= 0) { + option4Jump2OtherEmptyCycle(emptyCycleIndex); + return true; + } + //8.所有测回都完成测量(当前测回完成检测),执行检测 + double horCycle2CDiff = toleranceDetailRecord.getHorCycleDirect2CDifference(); + double verCycle2CDiff = toleranceDetailRecord.getVerCycleDirectIDifference(); + for (int cycleIndex = 0; cycleIndex < toleranceDetailRecord.getCycleCount(); cycleIndex++) { + if (cycleIndex == getCycleRecorder().currentCycleIndex()) { + continue; + } + String result = SingleCycleCheckMethod.check( + horCycle2CDiff, + verCycle2CDiff, + stationId(), + cycleIndex, + getSurveyorData(), + getCachedData()); + if (result != null && !result.isEmpty()) { + SingleCycleTipsMethod.showTips(result, + stationId(), + cycleIndex, + stateDelegate(), + fragmentManager(), + lifecycleOwner()); + return true; + } + //更新该测回进度 + setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_CHECKED); + } + //9.所有测回都通过检测,可以执行「测站检测」 + //设置测量进度,但是需要注意,如果station已经通过检测,则不需要设置为completed + ThreadPoolUtil.execute(() -> { + ISurveyorScheduleDataSource scheduleDataSource = + SurveyorDatabaseFactory.instance.getScheduleDataSource(); + String key = SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), null); + SurveyorScheduleRecord scheduleRecord = scheduleDataSource.findScheduleSync(key); + if (scheduleRecord != null) { + String statue = scheduleRecord.getStatue(); + if (SurveyorScheduleConstants.STATUE_VALUE_CHECKED.equals(statue)) { + onCompletedCheck(); + return; + } + } + scheduleDataSource.record(new SurveyorScheduleRecord(key, + SurveyorScheduleConstants.STATUE_VALUE_COMPLETED)); + + //如果测量完成,则进入测站检测界面 + navigation2(StateType.checkStation); + }); + return true; + } + + static void enter(StateManager stateManager, int cycleIndex) { + Bundle args = new Bundle(); + args.putInt(KEY_CYCLE_INDEX, cycleIndex); + stateManager.enter(StateType.doCalScheduleAllCycle, args); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalScheduleInSingleCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalScheduleInSingleCycleState.java new file mode 100644 index 0000000..527ced4 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoCalScheduleInSingleCycleState.java @@ -0,0 +1,110 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.method.SingleCycleCheckMethod; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlnetwork.surveyor.method.SingleCycleTipsMethod; + +/** + * 在单个测回内计算当前测量进度。 + *

+ * 1.如果有没有完成测量,则跳转到相应位置。 + * 2.如果测量完成,检测数据限差 + * 3.进入idle + */ +class _DoCalScheduleInSingleCycleState extends __BaseState { + private final IAutoModeSwitcher autoModeSwitcher; + + public _DoCalScheduleInSingleCycleState(StateManager stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(StateType.doCalScheduleSingleCycle, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + protected _DoCalScheduleInSingleCycleState(StateType stateType, final StateManager stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(stateType, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + /** + * 在其他测回是否包含需要测量的数据 + *

+ * 当前类默认返回false,不检测其他测回 + */ + protected boolean isNeedCancelEnterIdle(int currentCycle) { + return false; + } + + @Override + final public void enter(Bundle args) { + //重置自动测量状态 + if (autoModeSwitcher.isAutoModeClose()) { + autoModeSwitcher.resetAutoMode(); + } + //计算状态之前,重置测量状态 + getSurveyorData().clearSurveyStateAndPosition(); + + ICycleRecorder cycleRecorder = getCycleRecorder(); + cycleRecorder.changeCycleIndex(args.getInt(KEY_CYCLE_INDEX, 0)); + setCurrentCycle(cycleRecorder.currentCycleIndex()); + + //1.检测当前cycle是否完成测量 + boolean completed = _IsSingleCycleCompletedState.isSingleCycleCompleted( + stationId(), + getCycleRecorder().currentCycleIndex(), + getCachedData()); + //2.如果当前测回还有待测数据,则执行测量 + if (!completed) { + //从当前测回开始处查找目标并执行测量 + findTargetFromBeginInCurrentCycle(false); + return; + } + //3.如果当前测回结束测量,判断是否通过检测 + ToleranceDetailRecord toleranceDetailRecord = getToleranceRecord(); + double horCycle2CDiff = toleranceDetailRecord.getHorCycleDirect2CDifference(); + double verCycle2CDiff = toleranceDetailRecord.getVerCycleDirectIDifference(); + String error = SingleCycleCheckMethod.check( + horCycle2CDiff, + verCycle2CDiff, + stationId(), + getCycleRecorder().currentCycleIndex(), + getSurveyorData(), + getCachedData()); + if (error != null && !error.isEmpty()) { + SingleCycleTipsMethod.showTips(error, + stationId(), + getCycleRecorder().currentCycleIndex(), + stateDelegate(), + fragmentManager(), + lifecycleOwner()); + return; + } + //4.更新测站状态 + setSingleCycleSchedule(getCycleRecorder().currentCycleIndex(), + SurveyorScheduleConstants.STATUE_VALUE_CHECKED); + + //5.检测其他测回状态 + if (isNeedCancelEnterIdle(getCycleRecorder().currentCycleIndex())) { + return; + } + + //6.清空测量状态 + onCompletedCheck(); + } + + protected void onCompletedCheck() { + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } + + protected static final String KEY_CYCLE_INDEX = "___cycle__index__"; + + static void enter(StateManager stateManager, int cycleIndex) { + Bundle args = new Bundle(); + args.putInt(KEY_CYCLE_INDEX, cycleIndex); + stateManager.enter(StateType.doCalScheduleSingleCycle, args); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoDeleteAllCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoDeleteAllCycleState.java new file mode 100644 index 0000000..c687f54 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoDeleteAllCycleState.java @@ -0,0 +1,70 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.utils.ThreadPoolUtil; + +import com.bingce.controlnetwork.R; + +/* + * 删除本测站所有测回数据 + * */ +class _DoDeleteAllCycleState extends __BaseState { + + private static final String KEY_STATION_ID = "__station_id"; + + static Bundle args(String stationId) { + Bundle args = new Bundle(); + args.putString(KEY_STATION_ID, stationId); + return args; + } + + public _DoDeleteAllCycleState(StateManager stateManager) { + super(StateType.doDeleteAllCycle, stateManager); + } + + @Override + public void enter(Bundle args) { + String stationId = args.getString(KEY_STATION_ID); + + optionTipsWithStandStill(getContext().getString(R.string.tips_delete_station_all_surveyor_records), + () -> deleteAllCycleData(stationId)); + } + + private void deleteAllCycleData(String stationId) { + ThreadPoolUtil.execute(() -> { + //删除数据 + ICachedData cachedData = getCachedData(); + cachedData.deleteSurveyorRecord(stationId); + + //清除已经提示测站可以检测标识 + IConfigDataSource configDataSource = + SurveyorDatabaseFactory.instance.getConfigDataSource(); + String key = ConfigConstants.KEY_CONFIG_STATION_CHECK_REMINDED + stationId; + configDataSource.setSync(key, ConfigConstants.VALUE_NO); + + //重置进度 + setAllCycleScheduleSync(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + for (int cycleIndex = 0; cycleIndex < getToleranceRecord().getCycleCount(); cycleIndex++) { + setSingleCycleScheduleSync(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + } + + //重置学习测量的标志 + resetLearnDataTag(); + + //从第一测回开始 + setCurrentCycleSync(0); + + //重新测量,并刷新 + findTargetFromBeginInCurrentCycle(true); + }); + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoDeleteCurrentCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoDeleteCurrentCycleState.java new file mode 100644 index 0000000..6fa1af8 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoDeleteCurrentCycleState.java @@ -0,0 +1,69 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.utils.ThreadPoolUtil; + +import com.bingce.controlnetwork.R; + +class _DoDeleteCurrentCycleState extends __BaseState { + + private static final String KEY_STATION_ID = "__station_id"; + private static final String KEY_PERIOD_INDEX = "__period_index__"; + + static Bundle args(String stationId, int periodIndex) { + Bundle args = new Bundle(); + args.putString(KEY_STATION_ID, stationId); + args.putInt(KEY_PERIOD_INDEX, periodIndex); + return args; + } + + public _DoDeleteCurrentCycleState(StateManager stateManager) { + super(StateType.doDeleteCurrentCycle, stateManager); + } + + @Override + public void enter(Bundle args) { + String stationId = args.getString(KEY_STATION_ID); + int cycleIndex = args.getInt(KEY_PERIOD_INDEX); + + optionTipsWithStandStill(getContext().getString(R.string.tips_delete_current_cycle_surveyor_record), + () -> deleteSingleCycle(stationId, cycleIndex)); + } + + private void deleteSingleCycle(String stationId, int cycleIndex) { + ThreadPoolUtil.execute(() -> { + //删除数据 + ICachedData stationSurveyorDataSource = getCachedData(); + stationSurveyorDataSource.deleteSurveyorRecordSync(stationId, cycleIndex); + + //清除已经提示测站可以检测标识 + IConfigDataSource configDataSource = SurveyorDatabaseFactory.instance.getConfigDataSource(); + String key = ConfigConstants.KEY_CONFIG_STATION_CHECK_REMINDED + stationId; + configDataSource.setSync(key, ConfigConstants.VALUE_NO); + + //设置当前测回 + setCurrentCycleSync(cycleIndex); + //重置所有测回和当次测回进度 + setAllCycleScheduleSync(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setSingleCycleScheduleSync(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + + if (cycleIndex == 0) { + //当第一测回 + //重置学习测量的标志 + resetLearnDataTag(); + } + + //重新测量,并刷新 + findTargetFromBeginInCurrentCycle(true); + }); + + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoMove2NextValidateState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoMove2NextValidateState.java new file mode 100644 index 0000000..7afaeb3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoMove2NextValidateState.java @@ -0,0 +1,95 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.FindTargetMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/** + * 移动到一个待测量位置 + *

+ * 不会跳转到其他测期 + *

+ * 可能涉及转向(盘左->盘右) + */ +class _DoMove2NextValidateState extends __BaseState { + + public _DoMove2NextValidateState(StateManager stateManager) { + super(StateType.doMove2NextValidate, stateManager); + } + + @Override + public void enter(Bundle args) { + ICachedData cachedData = getCachedData(); + ISurveyorData surveyorData = getSurveyorData(); + ICycleRecorder cycleRecorder = getCycleRecorder(); + + int pointCount = cachedData.pointCount(); + int currentIndex = surveyorData.currentIndex(); + if (currentIndex < 0) { + currentIndex = 0; + } + final int currentCycleIndex = cycleRecorder.currentCycleIndex(); + final LeftOrRight currentSurveyorState = surveyorData.leftOrRight(); + + //1.先查找补测数据 + FindTargetMethod.Target surveyorTarget = FindTargetMethod.findDirtyTargetInSingleCycle(stationId(), currentCycleIndex, + currentIndex, + currentSurveyorState, + pointCount, + true, + cachedData); + //如果在当前测回找到待被测数据,立刻跳转到相应位置 + if (surveyorTarget != null) { + navigation2(surveyorTarget.itemIndex, surveyorTarget.leftOrRight); + return; + } + //2.查找empty数据 + FindTargetMethod.Target emptyTarget = FindTargetMethod.findEmptyTargetInSingleCycle(stationId(), currentCycleIndex, + currentIndex, + currentSurveyorState, + pointCount, + true, + cachedData); + if (emptyTarget != null) { + if (isAutoSurveyOpen()) { + if (emptyTarget.itemIndex == getCachedData().pointCount() - 1 + && emptyTarget.leftOrRight == LeftOrRight.right) { + TtsManager.getInstance().speak(Tools.getString(R.string.start_face_right)); + } + } + //直接跳转到目标点,开启新测量 + navigation2(emptyTarget.itemIndex, emptyTarget.leftOrRight); + return; + } + //3.当前测回完成测量,停留状态 + //重置标识 +// quitSurveyStateAndStandStill(false); + enterIdleAndClearSurveyorStatePosition(); + } + + /** + * 跳转到下一目标点 + * + * @param targetIndex 目标点索引 + * @param targetSurveyorState 测量状态(盘左or盘右) + */ + private void navigation2(int targetIndex, LeftOrRight targetSurveyorState) { + //更新测量进度 + setSurveyPosition(targetIndex, targetSurveyorState); + + //清除测量状态,进入idle,但是不停止自动测量 + enterIdleAndClearSurveyStateAndResetAutoMode(false); + + //滚动 + scroll2(targetIndex); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoMoveBackState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoMoveBackState.java new file mode 100644 index 0000000..14b7152 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoMoveBackState.java @@ -0,0 +1,143 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.surveyorrecord.SurveyorRecord; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.FindTargetMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; + +import com.bingce.controlnetwork.R; + +/** + * 移动到上一测量结点,伴随删除上次测量数据 + */ +public class _DoMoveBackState extends __BaseState { + + public _DoMoveBackState(StateManager stateManager) { + super(StateType.doMoveBack, stateManager); + } + + @Override + public void enter(Bundle args) { + ICachedData cachedDataSource = getCachedData(); + ISurveyorData surveyorDataSource = getSurveyorData(); + ICycleRecorder cycleRecorder = getCycleRecorder(); + + final int pointCount = cachedDataSource.pointCount(); + final int currentCycle = cycleRecorder.currentCycleIndex(); + final int currentIndex = surveyorDataSource.currentIndex(); + final LeftOrRight leftOrRight = surveyorDataSource.leftOrRight(); + + if (currentIndex < 0) { + //如果测量结束,直接使用0号点盘右 + int targetIndex = 0; + LeftOrRight targetState = LeftOrRight.right; + warningWithStandStill(cachedDataSource, currentCycle, targetIndex, targetState); + return; + } + String currentPointId = cachedDataSource.pointId(currentCycle, currentIndex); + String currentRecordKey = IdUtil.createSurveyorRecordId(stationId(), currentCycle, currentPointId, leftOrRight); + DataCategory dataCategory = cachedDataSource.valueState(currentRecordKey); + if (dataCategory.isNeedResurvey()) {//如果当前位置是脏数据(说明正在补测) + //回退到上一个脏数据位置 + back2LastDirtyPosition(currentCycle, currentIndex, leftOrRight, pointCount, cachedDataSource); + } else if (dataCategory.isEmptyData()) { + //如果是空数据,说明测量进行中,查找上一个数据即可 + //需要提醒用户数据会被删除 + back2LastVisiblePosition(currentCycle, currentIndex, leftOrRight, pointCount, cachedDataSource); + } else { + //bug,不应该有这个地方 + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } + } + + private void back2LastDirtyPosition(int currentCycle, int currentIndex, LeftOrRight leftOrRight, + int pointCount, ICachedData cachedData) { + //反向查找,但是找到目标后不能删除其数据,否则会造成「数据空洞」 + FindTargetMethod.Target target = FindTargetMethod.findTargetInSingleCycle( + stationId(), currentCycle, currentIndex, leftOrRight, pointCount, false, + DataCategory.dirtyAndSurveyed, + cachedData); + if (target == null) { + //在dirtyAndNeedReSurveyor数据没有修复完成之前,不能回退正常数据 + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } else { + //找到dirtyAndSurveyed数据, + //则将其校正为dirtyAndNeedReSurveyor + String pointId = cachedData.pointId(target.cycleIndex, target.itemIndex); + String recordKey = IdUtil.createSurveyorRecordId(stationId(), target.cycleIndex, pointId, target.leftOrRight); + SurveyorRecord surveyorRecord = cachedData.getSurveyorRecord(recordKey); + if (surveyorRecord != null) { + if (surveyorRecord.value1Status.isResurveyed()) { + surveyorRecord.value1Status = DataCategory.needResurvey(); + } + if (surveyorRecord.value2Status.isResurveyed()) { + surveyorRecord.value2Status = DataCategory.needResurvey(); + } + cachedData.updateCache(surveyorRecord); + //重置进度 + resetSchedule(_DoMoveBackState.this, + target.itemIndex, + target.leftOrRight); + } else { + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } + } + } + + private void back2LastVisiblePosition(int currentCycle, int currentIndex, LeftOrRight leftOrRight, + int pointCount, + ICachedData cachedData) { + + //从当前开始,向上查找第一个normal数据 + FindTargetMethod.Target target = + FindTargetMethod.findTargetInSingleCycle( + stationId(), currentCycle, currentIndex, leftOrRight, pointCount, false, + DataCategory.normalCategory(), + cachedData); + if (target == null) { + failureTipsWithAutoStandStill(getContext().getString(R.string.tips_no_more_record_2_rollback)); + return; + } + + warningWithStandStill(cachedData, + currentCycle, + target.itemIndex, + target.leftOrRight); + } + + private void warningWithStandStill( + ICachedData cachedDataSource, + int currentCycle, int itemIndex, LeftOrRight leftOrRight) { + optionTipsWithStandStill(getContext().getString(R.string.tips_will_resurvey_last_record), + () -> { + //删除当前数据 + cachedDataSource.deleteSurveyorRecord(stationId(), + currentCycle, itemIndex, leftOrRight); + //重置进度 + setSingleCycleSchedule(currentCycle, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + + resetSchedule(this, itemIndex, leftOrRight); + }); + } + + private static void resetSchedule(__BaseState state, + int targetIndex, + LeftOrRight leftOrRight) { + //设置测量目标点 + state.setSurveyPosition(targetIndex, leftOrRight); + //清除测量状态,进入idle + //如果当前已经关闭自动测量,就不重置自动测量开关(用户已经表示不想自动测量) + state.enterIdleAndClearSurveyStateAndResetAutoMode(!state.isAutoSurveyClosed()); + + state.scroll2(targetIndex); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoRecordCleanState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoRecordCleanState.java new file mode 100644 index 0000000..222fbc8 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoRecordCleanState.java @@ -0,0 +1,32 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.StateType; + +/** + * 记录测量数据 + */ +class _DoRecordCleanState extends __BaseState { + public _DoRecordCleanState(StateManager stateManager) { + super(StateType.doRecordClean, stateManager); + } + + @Override + public void enter(Bundle args) { + ICachedData cacheData = getCachedData(); + ISurveyorData surveyorData = getSurveyorData(); + ICycleRecorder cycleRecorder = getCycleRecorder(); + //设置数据正常 + surveyorData.setDataCategory(DataCategory.normalCategory()); + //存储(缓存+数据库) + cacheData.cache(cycleRecorder.currentCycleIndex(), surveyorData); + + //检测单测回是否完成 + navigation2(StateType.isSingleCycleCompleted); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoSurveyorState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoSurveyorState.java new file mode 100644 index 0000000..d0eb34f --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoSurveyorState.java @@ -0,0 +1,294 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; + +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.ISurveyState; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorListener; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorRemindListener; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParam; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.surveyor.state.StateConstants; +import com.bingce.device.Device; +import com.bingce.totalstation.TotalStation; +import com.bingce.totalstation.protocol.south.SouthAndroidBtInterface; +import com.bingce.totalstation.protocol.topcon.TopconInterface; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import blankj.utilcode.util.ToastUtils; + +/** + * 先检测是否有其他未完成测回,继续本次测量将删除其他测回数据 + */ +class _DoSurveyorState extends __BaseState implements ISurveyorListener, ISurveyorRemindListener { + private final ISurveyState surveyState; + //最多测量次数,如果3次测量都没有获取正常数据,则跳过 + private static final int MAX_SURVEYOR_COUNT = 3; + private static int failureCount = 0; + private static final int RESULT_SUCCESS = 0; + private static final int RESULT_FAILURE_EXCEED_MAX = 1;//测量失败次数超出最大限制 + private static final int RESULT_FAILURE_ERROR = 2;//测量失败,又没有允许重复尝试 + private static final boolean allowTryWhenFailure = true;//在测量失败的时候,是否允许重新测量 + + private int measureTimeIndex = 0;//当前测点是第几次测量 + private boolean isAlreadyRemindUserAimingAtWire = false; + + private final Handler handler; + + public _DoSurveyorState(StateManager stateManager, ISurveyState surveyState) { + super(StateType.doSurveyor, stateManager); + this.surveyState = surveyState; + handler = new Handler(Looper.getMainLooper()); + } + + @Override + public void enter(Bundle args) { + measureTimeIndex = 0; + + isAlreadyRemindUserAimingAtWire = false; + if (args != null) { + isAlreadyRemindUserAimingAtWire = args.getBoolean(StateConstants.KEY_IS_ROTATION_READY_STATE); + } + + ToleranceDetailRecord toleranceRecord = getToleranceRecord(); + ICycleRecorder cycleRecorder = getCycleRecorder(); + ICachedData cachedDataSource = getCachedData(); + + int currentCycleIndex = cycleRecorder.currentCycleIndex(); + int cycleCount = toleranceRecord.getCycleCount(); + int pointCount = cachedDataSource.pointCount(); + + int otherCycle = -1; + //1.先检测其他测回是否有正在测量数据 + for (int cycleIndex = 0; cycleIndex < cycleCount; cycleIndex++) { + if (cycleIndex == currentCycleIndex) { + continue; + } + //遍历该测回内所有点,检测是否有测量数据 + for (int itemIndex = 0; itemIndex < pointCount; itemIndex++) { + String pointId = cachedDataSource.pointId(cycleIndex, 0); + String key = IdUtil.createSurveyorRecordId(stationId(), cycleIndex, pointId, LeftOrRight.left); + //检测该测回是否有数据,目前应该只需要检测盘左0就可以了,因为一个测回内数据不能跳过 + DataCategory dataCategory = cachedDataSource.valueState(key); + if (dataCategory.hasData()) { + //说明该测回有数据,则进一步检测是否完成 + if (!cachedDataSource.isSingleCycleAllDataValidate(cycleIndex)) { + //已经测量但是没有完成,则提示 + otherCycle = cycleIndex; + break; + } + } + } + //如果当前遍历到的测回有数据,则退出遍历,提醒用户 + if (otherCycle >= 0) { + break; + } + } + //2.如果其他测回有正在测量数据,且没有完成测量,提示用户继续测量将会删除其数据 + if (otherCycle != -1) { + final int targetCycleIndex = otherCycle; + optionTipsWithStandStill( + SurveyorCycleUtil.cycleName(otherCycle) + Tools.getString(R.string.unfinished_measurements_starting_this_measurement_will_delete), + () -> optionTipsWithStandStill( + Tools.getString(R.string.confirm_delete) + SurveyorCycleUtil.cycleName(targetCycleIndex) + Tools.getString(R.string.data_ask), + () -> { + String stationId = stationId(); + //删除数据 + cachedDataSource.deleteSurveyorRecord(stationId, targetCycleIndex); +// isAlreadyRemindUserAimingAtWire = false; + //执行测量 + doSurveyor(); + })); + return; + } + + //3.其他测回没有正在测量数据,则在当前测回执行测量 + doSurveyor(); + } + + private void doSurveyor() { + failureCount = 0; + //判断设备是否连接 + if (surveyorImpl().isReady()) { + //发送测量信号 + SurveyStateEvent.postSurveying(positionFragment); + //注册接收测量数据 + surveyorImpl().prepareSurveyor(); + sendSurveyRequest(); + } else { + enterIdleAndClearSurveyStateAndResetAutoMode(true); + Device.getInstance().remindConnectDevice(); + } + } + + @Override + public void onReceive(double originalHa, double originalVa, double sd, double clockwiseHa, double topVa, double hd, double vd) { + //重置错误读数 + failureCount = 0; + if (getSurveyorData().onSurveyor(originalHa, originalVa, sd, hd)) { + //测量数据成功,可以退出测量状态 + onSuccess(); + } else {//测量数据不完全,需要继续测量 + measureTimeIndex = 1;//更新测量索引 + refreshUI(); + + if (TotalStation.getInstance() instanceof TopconInterface) { + //这个仪器需要延迟500毫秒发送指令 + handler.postDelayed(this::sendSurveyRequest, 500); + } else if (TotalStation.getInstance() instanceof SouthAndroidBtInterface) { + handler.postDelayed(this::sendSurveyRequest, 100); + } else { + sendSurveyRequest(); + } + } + } + + @Override + public void onError(String errorMsg) { + TtsManager.getInstance().speak(errorMsg); + if (allowTryWhenFailure) {//允许重新测量 + if (!isLive()) { + return; + } + //测量出现异常,需要处理 + failureCount++; + if (failureCount >= MAX_SURVEYOR_COUNT) { + if (isAutoSurveyOpen()) { + TtsManager.getInstance().speak(Tools.getString(R.string.many_measure_failed)); + } + onCompleted(RESULT_FAILURE_EXCEED_MAX, Tools.getString(R.string.many_measure_failed_1)); + } else { + //再次尝试 + sendSurveyRequest(); + ToastUtils.showShort(R.string.receive_data_time_out); + } + } else { + onCompleted(RESULT_FAILURE_ERROR, errorMsg); + } + } + + private void sendSurveyRequest() { + int currentIndex = getCurrentIndex(); + if (currentIndex < 0) { + currentIndex = 0; + } + + SurveyorPoint surveyorPoint = getCachedData().getSurveyorPoint(getCycleRecorder().currentCycleIndex(), currentIndex); + ISurveyorData surveyorData = getSurveyorData(); + + surveyorImpl().requestSurveyor(new RequestSurveyorParam(getRequestSurveyorParamAuto(), getInstrumentHeight(), surveyorPoint, measureTimeIndex, + surveyorData.currentIndex(), surveyorData.leftOrRight(), isAlreadyRemindUserAimingAtWire)); + } + + private void onSuccess() { + onCompleted(RESULT_SUCCESS, ""); + } + + private void onCompleted(int result, String msg) { + //退出测量 + surveyorImpl().exitSurveyor(); + switch (result) { + case RESULT_SUCCESS://进入读数检测状态 + //检测是否处于「自动测量」 + if (!surveyState.isAutoSurveying()) { + SurveyStateEvent.postSuccess(positionFragment); + } + navigation2(StateType.checkReadData); + break; + case RESULT_FAILURE_EXCEED_MAX: +// boolean allowAbandon = getStation().isAllowAbandon(); + if (SettingValueUtil.isAbandonPoint() && isAllowAbandonForVarifyIndex()) { + dealErrorDataSkip(msg); + } else { + dealErrorDataNormal(msg); + } + break; + case RESULT_FAILURE_ERROR: + dealErrorDataNormal(msg); + break; + default: + throw new RuntimeException("un reached state -- surveyor"); + } + } + + @Override + protected void quite() { + super.quite(); + surveyorImpl().exitSurveyor(); + } + + @Override + protected void resume() { + getSurveyorData().clearSurveyState(); + } + + @Override + public void remindUserAimingAtWire() { + //退出测量 + surveyorImpl().exitSurveyor(); + navigation2(StateType.doWellMeasureRotationReady); + } + + private void dealErrorDataNormal(String msg) { + SurveyStateEvent.postFailure(positionFragment); + //进入失败状态 + Bundle args = _SurveyorFailureState.args(msg); + navigation2(StateType.SurveyorFailure, args); + } + + private void dealErrorDataNormal(String msg, boolean isShowDialog) { + SurveyStateEvent.postFailure(positionFragment); + //进入失败状态 + Bundle args = _SurveyorFailureState.args(msg, isShowDialog); + navigation2(StateType.SurveyorFailure, args); + } + + private void dealErrorDataSkip(String msg) { + optionTipsCountDown(msg + Tools.getString(R.string.is_it_abandoned), + Tools.getString(R.string.switch_abandon), + Tools.getString(R.string.ignore), + () -> { + changeSkip(getCycleRecorder().currentCycleIndex(), getCurrentIndex()); + navigation2(StateType.isSingleCycleCompleted); + }, + () -> dealErrorDataNormal(msg, false), + () -> dealErrorDataNormal(msg, false)); + } + + /** + * 针对第一个点和闭合是否废弃验证 + * + * @return + */ + private boolean isAllowAbandonForVarifyIndex() { + boolean autoClose = getStation().isAutoClose(); + int pointCount = getCachedData().pointCount(); + boolean abandon = true; + int currentIndex = getCurrentIndex(); + if (autoClose) { + if (currentIndex == 0 || currentIndex == pointCount - 1) { + abandon = false; + } + } else { + if (currentIndex == 0) { + abandon = false; + } + } + return abandon; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoWellMeasureRotationReadyState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoWellMeasureRotationReadyState.java new file mode 100644 index 0000000..9bdbde8 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoWellMeasureRotationReadyState.java @@ -0,0 +1,30 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.event.AutoSurveyorButtonVisibleEvent; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlnetwork.R; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import org.greenrobot.eventbus.EventBus; + +/** + * 钢丝测量旋转到位状态 + */ +class _DoWellMeasureRotationReadyState extends __BaseState { + + public _DoWellMeasureRotationReadyState(StateManager stateManager) { + super(StateType.doWellMeasureRotationReady, stateManager); + } + + @Override + public void enter(Bundle args) { + runOnUI(() -> TtsManager.getInstance().speak(getContext().getString(R.string.please_aiming_at_alone_distance_point_then_measure))); + SurveyStateEvent.postIdle(positionFragment); + EventBus.getDefault().post(new AutoSurveyorButtonVisibleEvent(positionFragment, false, true)); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IdleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IdleState.java new file mode 100644 index 0000000..0606880 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IdleState.java @@ -0,0 +1,134 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import androidx.annotation.NonNull; + +import com.bingce.controlapphelper.event.AutoSurveyorButtonVisibleEvent; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.totalstation.ControlSurveyResult; +import com.bingce.utils.ThreadPoolUtil; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import org.greenrobot.eventbus.EventBus; + +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; + +/** + * 空闲状态 + *

+ * 将刷新界面 + */ +class _IdleState extends __BaseState { + private final @NonNull + IAutoModeSwitcher autoModeSwitcher; + + public _IdleState(StateManager stateManager, @NonNull IAutoModeSwitcher autoModeSwitcher) { + super(StateType.idle, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + public void enter(Bundle args) { + //1.刷新界面 + refreshUI(); + + refreshGoBackBtnEnable(); + + //3.当前cycle是否完成测量 + boolean completed = _IsSingleCycleCompletedState.isSingleCycleCompleted( + stationId(), + getCycleRecorder().currentCycleIndex(), + getCachedData()); + //4.检测是否满足自动测量条件 + ThreadPoolUtil.execute(() -> { + //判断当前条件是否满足自动测量 + + boolean haveAutoCondition = haveAutoCondition(); + + if (haveAutoCondition && autoModeSwitcher.isAutoModeOpen() && isLive()) { + navigation2(StateType.doSurveyor); + } else if (haveAutoCondition && autoModeSwitcher.isAutoModeNotSpecial() && !completed) { + //用户选择后会发送通知,更新测量按钮UI + tips4StartAutoSurvey(); + } else { +// ControlSurveyResult.isAbandon(autoMeasureReadyCode) != null//这个错误 + if (autoModeSwitcher.isAutoModeOpen()) { + autoModeSwitcher.resetAutoMode(); + } + postEvent(haveAutoCondition, autoModeSwitcher.isAutoModeOpen(), completed); + } + + }); + } + + /** + * 弹框提示用户是否开启自动测量 + */ + private void tips4StartAutoSurvey() { + runOnUI(() -> + TipsWith2OptionFragment.hardTips( + fragmentManager(), + lifecycleOwner(), + getContext().getString(R.string.tips_finish_study_should_auto_survey), + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + TtsManager.getInstance().speak(Tools.getString(R.string.start_auto_measure)); + autoModeSwitcher.openAutoMode(); + navigation2(StateType.doSurveyor); + + postEvent(true, true, false); + } + + @Override + public void onCancel() { + autoModeSwitcher.closeAutoMode(); + + postEvent(true, false, false); + } + + @Override + public void onIgnore() { + autoModeSwitcher.closeAutoMode(); + + postEvent(true, false, false); + } + } + )); + } + + private void postEvent(boolean isReadyAutoSurvey, boolean isOpenAutoSurvey, boolean isSingleCompleted) { + EventBus.getDefault().post(new AutoSurveyorButtonVisibleEvent(positionFragment, isReadyAutoSurvey, isOpenAutoSurvey)); + if (isSingleCompleted) { + SurveyStateEvent.postCompleted(positionFragment); + } else if (!isOpenAutoSurvey) { + SurveyStateEvent.postIdle(positionFragment); + } + } + + @Override + protected void resume() { + autoModeSwitcher.resetAutoMode(); + //刷新测量按钮 + boolean completed = _IsSingleCycleCompletedState.isSingleCycleCompleted( + stationId(), + getCycleRecorder().currentCycleIndex(), + getCachedData()); + boolean isReady = autoModeSwitcher.isReadyAutoSurvey() == ControlSurveyResult.CODE_SUCCESS; + + postEvent(isReady, false, completed); + } + + private boolean haveAutoCondition() { + int autoMeasureReadyCode = autoModeSwitcher.isReadyAutoSurvey(); + return autoMeasureReadyCode == ControlSurveyResult.CODE_SUCCESS; + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_Is2CCheckReadyState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_Is2CCheckReadyState.java new file mode 100644 index 0000000..4b17c04 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_Is2CCheckReadyState.java @@ -0,0 +1,55 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; + +/** + * 判断是否满足「2C」检测条件 + */ +class _Is2CCheckReadyState extends __BaseState { + private static final int RESULT_YES = 0;//可以检测「2C」 + private static final int RESULT_NO = 1;//不可以检测「2C」 + + public _Is2CCheckReadyState(StateManager stateManager) { + super(StateType.isReady2CCheck, stateManager); + } + + @Override + public void enter(Bundle args) { + ISurveyorData surveyorDataSource = getSurveyorData(); + ICycleRecorder cycleRecorder = getCycleRecorder(); + ICachedData cachedData = getCachedData(); + + int currentIndex = surveyorDataSource.currentIndex(); + int currentCycleIndex = cycleRecorder.currentCycleIndex(); + LeftOrRight currentLeftOrRight = surveyorDataSource.leftOrRight(); + + //只需要对面位置有「新鲜数据」,就能执行2c + //当前位置正处于测量,数据还没有缓存,所以不需要检测数据合法性 + String pointId = cachedData.pointId(currentCycleIndex, currentIndex); + DataCategory oppositeCategory = cachedData.valueState( + IdUtil.createSurveyorRecordId(stationId(), currentCycleIndex, pointId, currentLeftOrRight.opposite())); + if (oppositeCategory.isFreshData()) { + onCompleted(RESULT_YES); + } else { + onCompleted(RESULT_NO); + } + } + + private void onCompleted(int result) { + if (RESULT_YES == result) { + navigation2(StateType.check2C); + } else if (RESULT_NO == result) { + navigation2(StateType.doRecordClean); + } else { + throw new RuntimeException("error half cycle complete check"); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsAllCycleCompletedState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsAllCycleCompletedState.java new file mode 100644 index 0000000..01a20e4 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsAllCycleCompletedState.java @@ -0,0 +1,90 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import androidx.annotation.NonNull; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.ConfigRecord; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.data.SpeakCache; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.utils.ThreadPoolUtil; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/* + * 检测是否所有 测期都完成了测量 + * + * 只有在当前测期完成测量之后,才会进入当前状态 + * */ +public class _IsAllCycleCompletedState extends __BaseState { + private static final int INVALIDATE_CYCLE = -1; + private final IAutoModeSwitcher autoModeSwitcher; + + public _IsAllCycleCompletedState(@NonNull StateManager stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(StateType.isAllCycleCompleted, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + public void enter(Bundle args) { + int cycleCount = getToleranceRecord().getCycleCount(); + + int theCycleNotAllDataIsValidate = INVALIDATE_CYCLE; + //查找数据不全的测回 + for (int cycleIndex = 0; cycleIndex < cycleCount; cycleIndex++) { + if (!getCachedData().isSingleCycleAllDataValidate(cycleIndex)) { + //对不全数据的测回赋值 + theCycleNotAllDataIsValidate = cycleIndex; + break; + } + } + + boolean completed = INVALIDATE_CYCLE == theCycleNotAllDataIsValidate; + + if (completed) { + if (isAutoSurveyOpen()) { + //检测是否已经提示 + //检测是否需要提示测站检测 + IConfigDataSource configDataSource = + SurveyorDatabaseFactory.instance.getConfigDataSource(); + ThreadPoolUtil.execute(() -> { + String key = ConfigConstants.KEY_CONFIG_STATION_CHECK_REMINDED + stationId(); + ConfigRecord record = configDataSource.getByKeySync(key); + if (record == null || ConfigConstants.VALUE_NO.equals(record.getConfigValue())) { + runOnUI(() -> TtsManager.getInstance().speak(Tools.getString(R.string.all_cycle_completed))); + } + }); + } + //标识测站完成测量(数据库存储) + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_COMPLETED); + //进入idle状态 + //清除测量状态,进入测站检测,停止自动测量 + enterStationCheckAndClearSurveyStateAndResetAutoMode(); + } else { + if (autoModeSwitcher.isAutoModeOpen()) { + //直接切换测回 + //切换测回 + getCycleRecorder().changeCycleIndex(theCycleNotAllDataIsValidate); + //修改当前测回 + setCurrentCycle(theCycleNotAllDataIsValidate); + //存储一下已经播放切换测回的的节点 + SpeakCache.getInstance().saveSpeakSwitchCycle(); + //查找测量目标 + findTargetFromBeginInCurrentCycle(false); + //播报 + TtsManager.getInstance().speak(Tools.getString(R.string.current_cycle_complete_start_surveyor) + SurveyorCycleUtil.cycleName(theCycleNotAllDataIsValidate)); + } else { + //提示是否进入其他未完成测回继续测量 + option4Jump2OtherEmptyCycle(theCycleNotAllDataIsValidate); + } + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsHalfCycleZeroCheckReadyState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsHalfCycleZeroCheckReadyState.java new file mode 100644 index 0000000..cfdc465 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsHalfCycleZeroCheckReadyState.java @@ -0,0 +1,68 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; + +/* + * 判断是否需要检测「半测回归零差」 + * */ +class _IsHalfCycleZeroCheckReadyState extends __BaseState { + private static final int RESULT_ERROR = -1;//状态错误 + private static final int RESULT_YES = 0;//可以检测「半测回归零差」 + private static final int RESULT_NO = 1;//不可以检测「半测回归零差」 + + public _IsHalfCycleZeroCheckReadyState(StateManager stateManager) { + super(StateType.isHalfCycleZeroCheckReady, stateManager); + } + + + @Override + public void enter(Bundle args) { + if (isStationClosed()) { + ICachedData cachedData = getCachedData(); + ISurveyorData surveyorData = getSurveyorData(); + int pointCount = cachedData.pointCount(); + int currentItemIndex = surveyorData.currentIndex(); + + //检测target处数据类型,如果存在dirty或empty数据,则不进行半测回归零 + //当前位置不需要检测,因为下处于测量中 + int result = RESULT_NO; + if (currentItemIndex == 0 || currentItemIndex == pointCount - 1) { + ICycleRecorder cycleRecorder = getCycleRecorder(); + int cycleIndex = cycleRecorder.currentCycleIndex(); + String stationId = stationId(); + LeftOrRight leftOrRight = surveyorData.leftOrRight(); + int targetIndex = pointCount - 1 - currentItemIndex; + + String targetPointId = cachedData.pointId(cycleRecorder.currentCycleIndex(), targetIndex); + String targetKey = IdUtil.createSurveyorRecordId(stationId, cycleIndex, targetPointId, leftOrRight); + DataCategory targetDataCategory = cachedData.valueState(targetKey); + //对面数据正常,可以执行半测回归零 + if (targetDataCategory.isFreshData()) { + result = RESULT_YES; + } + } + onCompleted(result); + } else { + onCompleted(RESULT_ERROR); + } + + } + + private void onCompleted(int result) { + if (RESULT_YES == result) {//检测半测回归零 + navigation2(StateType.checkHalfCycleZero); + } else if (RESULT_NO == result || RESULT_ERROR == result) { + navigation2(StateType.isReady2CCheck); + } else { + throw new RuntimeException("error half cycle complete check"); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsSingleCycleCompletedState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsSingleCycleCompletedState.java new file mode 100644 index 0000000..e54e20c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_IsSingleCycleCompletedState.java @@ -0,0 +1,75 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; + + +public class _IsSingleCycleCompletedState extends __BaseState { + private static final int RESULT_YES = 0;//测回结束 + private static final int RESULT_NO = 1;//测回未结束 + + public _IsSingleCycleCompletedState(StateManager stateManager) { + super(StateType.isSingleCycleCompleted, stateManager); + } + + @Override + public void enter(Bundle args) { + onCompleted( + isSingleCycleCompleted(stationId(), + getCycleRecorder().currentCycleIndex(), + getCachedData())); + } + + private void onCompleted(boolean completed) { + if (completed) { + //这里先刷新下UI,不然弹窗后面的list不显示最后一条数据 + getSurveyorData().clearSurveyStateAndPosition(); + refreshUI(); + + int cycleIndex = getCycleRecorder().currentCycleIndex(); + //更新测回测量进度 + setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_COMPLETED); + //状态切换 + navigation2(StateType.checkSingleCycle); + } else { + findTargetFromBeginInCurrentCycle(false); + } + } + + /** + * 判断单个测回是否测量完成(不要求通过检测) + */ + public static boolean isSingleCycleCompleted(String stationId, int cycleIndex, ICachedData cachedData) { + int result = RESULT_YES; + + //测回内所有数据都是「新鲜数据」才能执行「测回内检测」 + for (int index = 0; index < cachedData.pointCount(); index++) { + + if (cachedData.isPointAbandon(cycleIndex, index)) { + continue; + } + + String pointId = cachedData.pointId(cycleIndex, index); + + String leftKey = IdUtil.createSurveyorRecordId(stationId, cycleIndex, pointId, LeftOrRight.left); + String rightKey = IdUtil.createSurveyorRecordId(stationId, cycleIndex, pointId, LeftOrRight.right); + + DataCategory leftDataCategory = cachedData.valueState(leftKey); + DataCategory rightDataCategory = cachedData.valueState(rightKey); + + if (leftDataCategory.isFreshData() && rightDataCategory.isFreshData()) { + continue; + } + result = RESULT_NO; + break; + } + + return RESULT_YES == result; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_SurveyorFailureState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_SurveyorFailureState.java new file mode 100644 index 0000000..9135bf6 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_SurveyorFailureState.java @@ -0,0 +1,52 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.os.Bundle; + +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; + +/* + * 仪器导致的测量失败 + * + * 全站仪多次测量失败,进入该状态 + * */ +class _SurveyorFailureState extends __BaseState { + + public _SurveyorFailureState(StateManager stateManager) { + super(StateType.SurveyorFailure, stateManager); + } + + @Override + public void enter(Bundle args) { + String error = ""; + boolean isShowDialog = true; + if (args != null) { + error = args.getString(KEY); + isShowDialog = args.getBoolean(KEY_IS_SHOW_DIALOG, true); + } + + if (isShowDialog) { + failureTipsWithAutoStandStill(error + Tools.getString(R.string.please_observe_target)); + } else { + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } + + } + + private static final String KEY = "error"; + private static final String KEY_IS_SHOW_DIALOG = "KEY_IS_SHOW_DIALOG"; + + public static Bundle args(String error) { + Bundle args = new Bundle(); + args.putString(KEY, error); + return args; + } + + public static Bundle args(String error, boolean isShowDialog) { + Bundle args = new Bundle(); + args.putString(KEY, error); + args.putBoolean(KEY_IS_SHOW_DIALOG, isShowDialog); + return args; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/__BaseState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/__BaseState.java new file mode 100644 index 0000000..a4dfef3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/__BaseState.java @@ -0,0 +1,586 @@ +package com.bingce.controlnetwork.surveyor.state.angledistance; + +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; + +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.model.IStateDelegate; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyor; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParamAuto; +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.angledistance.MeasureFragment; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +public abstract class __BaseState { + private final StateType type; + private final StateManager stateManager; + + protected final int positionFragment = MeasureFragment.POSITION_DIRECTION_MEASURE; + + /** + * 判断常量 + */ + private final int DEFAULT_AUTO_MODE = 0; + private final int RESET_AUTO_MODE = 1; + private final int CLOSE_AUTO_MODE = 2; + + public __BaseState(final StateType stateType, final StateManager stateManager) { + this.type = stateType; + this.stateManager = stateManager; + } + + final protected StateType getType() { + return type; + } + + final protected @NonNull + ToleranceDetailRecord getToleranceRecord() { + return stateManager.toleranceRecord; + } + + final protected @NonNull + ISurveyorData getSurveyorData() { + return stateManager.surveyorData; + } + + private @NonNull + IAutoModeSwitcher autoModeRecorder() { + return stateManager; + } + + /** + * 设置测量位置 + */ + final protected void setSurveyPosition(int index, LeftOrRight leftOrRight) { + stateManager.surveyorData.setCurrentIndex(index); + stateManager.surveyorData.setLeftOrRight(leftOrRight); + //新增 + if (isAloneDistance()) + ToastUtils.showShort(getContext().getString(R.string.attention_point_is_alone_distance)); + } + + final protected ISurveyor surveyorImpl() { + return stateManager.surveyor; + } + + final protected @NonNull + ICachedData getCachedData() { + return stateManager.cachedData; + } + + SurveyorStationRecord getStation() { + return stateManager.stationRecord; + } + + RequestSurveyorParamAuto getRequestSurveyorParamAuto() { + return stateManager.getRequestSurveyorParamAuto(); + } + + void changeSkip(int cycleIndex, int index) { + SurveyorStationRecord station = getStation(); + //缓存点 + getCachedData().setPointAbandon(cycleIndex, index); + //数据库点 + String pointId = getCachedData().originalPointId(cycleIndex, index); + for (SurveyorPoint surveyorPoint : station.items) { + if (TextUtils.equals(pointId, surveyorPoint.getOriginalPointId())) { + surveyorPoint.setAbandon(true); + break; + } + } + ThreadPoolUtil.execute(() -> { + SurveyorDatabaseFactory.instance.getSurveyorStation().update(station); + }); + } + + final protected @NonNull + ICycleRecorder getCycleRecorder() { + return stateManager.cycleRecorder; + } + + final protected @NonNull + Context getContext() { + return stateManager.context; + } + + final protected void scroll2(int itemIndex) { + stateManager.scrollDelegate.onScrollTo(itemIndex); + } + + final protected void toast(String warning) { + ToastUtils.showShort(warning); + } + + final protected void toast(@StringRes int warning) { + ToastUtils.showShort(warning); + } + + public abstract void enter(Bundle args);//进入状态 + + final protected void navigation2(StateType stateType) { + stateManager.enter(stateType); + } + + final protected void navigation2(StateType stateType, Bundle args) { + stateManager.enter(stateType, args); + } + + final boolean isStationClosed() { + return stateManager.isStationAutoClosed(); + } + + final protected String stationId() { + return stateManager.stationId(); + } + + final protected FragmentManager fragmentManager() { + return stateManager.fragmentManager(); + } + + final protected LifecycleOwner lifecycleOwner() { + return stateManager.lifecycleOwner(); + } + + final protected void tips(String msg, Runnable runnable) { + if (stateManager.isDead()) { + return; + } + TipsFragment.noCancelAbleTips(stateManager.fragmentManager(), stateManager.lifecycleOwner(), + getContext(), + msg, + -1, + () -> { + if (runnable != null) { + runnable.run(); + } + }); + } + + /** + * 错误提示 + *

+ * 用户不能忽略,点击确定后自动「停留原地」 + */ + final protected void failureTipsWithAutoStandStill(String msg) { + if (stateManager.isDead()) { + return; + } + TipsFragment.noCancelAbleTips(stateManager.fragmentManager(), stateManager.lifecycleOwner(), + getContext(), + msg, + -1, + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true)); + } + + final protected void failureTipsWithAutoStandStill(String msg, Runnable runnable) { + if (stateManager.isDead()) { + return; + } + TipsFragment.noCancelAbleTips(stateManager.fragmentManager(), stateManager.lifecycleOwner(), + getContext(), + msg, + -1, + () -> { + runnable.run(); + enterIdleAndClearSurveyStateAndResetAutoMode(true); + }); + } + + final protected void optionTipsWithStandStill(String msg, Runnable confirmCallback) { + optionTips(msg, null, null, + confirmCallback, + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true), + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true)); + } + + final protected void optionTips(String msg, + String confirmButton, + String cancelButton, + Runnable confirmCallback, + Runnable cancelCallback, + Runnable ignoreCallback) { + if (stateManager.isDead()) { + return; + } + TipsWith2OptionFragment.tips( + stateManager.fragmentManager(), + stateManager.lifecycleOwner(), + confirmButton, + cancelButton, + null, + msg, + new TipsWith2OptionFragment.IOperatorCallback() { + @Override + public void onConfirm() { + if (confirmCallback == null) { + return; + } + confirmCallback.run(); + } + + @Override + public void onCancel() { + if (cancelCallback == null) { + return; + } + cancelCallback.run(); + } + + @Override + public void onIgnore() { + if (ignoreCallback == null) { + return; + } + ignoreCallback.run(); + } + + @Override + public void onOption() { + } + }); + } + + final protected void optionTipsCountDown(String msg, + String confirmButton, + String cancelButton, + Runnable confirmCallback, + Runnable cancelCallback, + Runnable ignoreCallback) { + if (stateManager.isDead()) { + return; + } + + TipsWith2OptionFragment.tipsCountDownTime( + stateManager.fragmentManager(), + stateManager.lifecycleOwner(), + confirmButton, + cancelButton, + null, + msg, + new TipsWith2OptionFragment.IOperatorCallback() { + @Override + public void onConfirm() { + if (confirmCallback == null) { + return; + } + confirmCallback.run(); + } + + @Override + public void onCancel() { + if (cancelCallback == null) { + return; + } + cancelCallback.run(); + } + + @Override + public void onIgnore() { + if (ignoreCallback == null) { + return; + } + ignoreCallback.run(); + } + + @Override + public void onOption() { + } + }); + } + + protected final void option4Jump2OtherCycle4Resurvey(int cycleIndex) { + option4Jump2OtherCycle(cycleIndex, true); + } + + protected final void option4Jump2OtherEmptyCycle(int cycleIndex) { + option4Jump2OtherCycle(cycleIndex, false); + } + + private void option4Jump2OtherCycle(int cycleIndex, boolean resurveyOrEmpty) { + String msg = Tools.getString(R.string.there_is_empty_data_to_be_tested_hint); + if (resurveyOrEmpty) { + msg = Tools.getString(R.string.there_is_supplementary_data_to_be_tested_hint); + } + optionTips(Tools.getString(R.string.at) + SurveyorCycleUtil.cycleName(cycleIndex) + msg, + null, + null, + () -> { + //切换测回 + getCycleRecorder().changeCycleIndex(cycleIndex); + //数据库存储修改当前测回 + setCurrentCycle(cycleIndex); + //查找测量目标 + findTargetFromBeginInCurrentCycle(false); + }, + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true), + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true)); + } + + final protected void runOnUI(Runnable runnable) { + stateManager.runOnUI(runnable); + } + + final protected void runOnBackground(Runnable runnable) { + ThreadPoolUtil.execute(runnable); + } + + /** + * 设置测站的测回 + * + * @param cycle + */ + final protected void setCurrentCycle(int cycle) { + getCycleRecorder().changeCycleIndex(cycle); + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getCurrentCycleKey(stationId(), null), + String.valueOf(cycle))); + } + + final protected void setCurrentCycleSync(int cycle) { + getCycleRecorder().changeCycleIndex(cycle); + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .recordSync( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getCurrentCycleKey(stationId(), null), + String.valueOf(cycle))); + } + + final protected void setSingleCycleSchedule(int cycleIndex, String schedule) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getSingleCycleScheduleKey(stationId(), null, cycleIndex), + schedule)); + } + + final protected void setSingleCycleScheduleSync(int cycleIndex, String schedule) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .recordSync( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getSingleCycleScheduleKey(stationId(), null, cycleIndex), + schedule)); + } + + final protected void setAllCycleSchedule(String schedule) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), null), + schedule)); + } + + final protected void setAllCycleScheduleSync(String schedule) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .recordSync( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), null), + schedule)); + } + + /** + * 如果resetAutoSurveyState为true,将重置autoSurvey状态为unknown + */ + final protected void findTargetFromBeginInCurrentCycle(boolean resetAutoSurveyState) { + getSurveyorData().clearSurveyStateAndPosition(); + if (resetAutoSurveyState) { + autoModeRecorder().resetAutoMode(); + } + navigation2(StateType.doMove2NextValidate); + } + + final protected void enterIdleAndClearSurveyState() { + clearSurveyStateAndCloseAutoModeAndStandStill(DEFAULT_AUTO_MODE, + false, StateType.idle); + } + + /** + * 取消测量,会停在当前位置(索引+盘左or盘右),并进入idle + */ + final protected void enterIdleAndClearSurveyStateAndResetAutoMode(boolean resetAutoMode) { + clearSurveyStateAndCloseAutoModeAndStandStill(resetAutoMode ? RESET_AUTO_MODE : DEFAULT_AUTO_MODE, + false, StateType.idle); + } + + final protected void enterIdleAndClearSurveyorStatePosition() { + clearSurveyStateAndCloseAutoModeAndStandStill(DEFAULT_AUTO_MODE, + true, StateType.idle); + } + + final protected void enterStationCheckAndClearSurveyStateAndResetAutoMode() { + clearSurveyStateAndCloseAutoModeAndStandStill(RESET_AUTO_MODE, + false, StateType.checkStation); + } + + final protected void enterIdleAndClearSurveyStateAndCloseAutoMode() { + clearSurveyStateAndCloseAutoModeAndStandStill(CLOSE_AUTO_MODE, false, StateType.idle); + } + + /** + * @param autoMode + * @param clearPosition + * @param stateType + */ + private void clearSurveyStateAndCloseAutoModeAndStandStill(int autoMode, boolean clearPosition, StateType stateType) { + //重置或者关闭自动模式 + if (autoMode == RESET_AUTO_MODE) { + autoModeRecorder().resetAutoMode(); + } else if (autoMode == CLOSE_AUTO_MODE) { + autoModeRecorder().closeAutoMode(); + } + //更新测量进度标识 + if (clearPosition) { + getSurveyorData().clearSurveyStateAndPosition(); + } else { + getSurveyorData().clearSurveyState(); + } + //进入某个状态 + navigation2(stateType); + } + + + /** + * 更新UI + */ + final protected void refreshUI() { + runOnUI(() -> getCachedData().notifyDateChange()); + } + + protected void quite() { + } + + protected void resume() { + } + + protected boolean isLive() { + return !stateManager.isDead(); + } + + protected boolean isAutoSurveyOpen() { + return stateManager.isAutoModeOpen(); + } + + protected boolean isAutoSurveyClosed() { + return stateManager.isAutoModeClose(); + } + + protected IStateDelegate stateDelegate() { + return new IStateDelegate() { + @Override + public void onOptionTips( + String msg, String confirmButton, String cancelButton, + Runnable confirmCallback, Runnable cancelCallback, Runnable ignoreCallback) { + optionTips( + msg, confirmButton, cancelButton, + confirmCallback, cancelCallback, ignoreCallback); + } + + @Override + public void resetSurveyorStateAndKeepPosition() { + //关闭自动测量 + autoModeRecorder().resetAutoMode(); + //更新测量进度标识 + getSurveyorData().clearSurveyState(); + //进入空闲状态 + navigation2(StateType.idle); + } + + @Override + public void resurveyPoints(int cycleIndex, List pointIds) { + if (cycleIndex == -1) { + cycleIndex = getCycleRecorder().currentCycleIndex(); + } + + //更新记录数据,包括将数据置为dirty和切换cycle + getCachedData().markReSurveyor(stationId(), cycleIndex, pointIds); + getCycleRecorder().changeCycleIndex(cycleIndex); + + //根据当前状态,查找一个目标 + findTargetFromBeginInCurrentCycle(true); + + //更新数据库标识 + setCurrentCycle(cycleIndex); + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + } + + @Override + public void deleteSingleCycleData(int cycleIndex) { + //删除数据 + getCachedData().deleteSurveyorRecord(stationId(), cycleIndex); + //切换测回--一般不用,但是这里为了保险 + getCycleRecorder().changeCycleIndex(cycleIndex); + //查找一个新目标开启测量 + findTargetFromBeginInCurrentCycle(true); + + //更新数据库标识 + setCurrentCycle(cycleIndex); + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + } + }; + } + + protected int getCurrentIndex() { + return stateManager.surveyorData.currentIndex(); + } + + protected int getCurrentCycleIndex() { + return stateManager.cycleRecorder.currentCycleIndex(); + } + + protected boolean isAloneDistance() { + return stateManager.getCachedData().isAloneDistance(stateManager.getCurrentCycle(), getCurrentIndex()); + } + + protected double getInstrumentHeight() { + return stateManager.getInsturmentHeight(); + } + + protected void refreshGoBackBtnEnable() { + stateManager.refreshGoBackBtnEnable(); + } + + protected void resetLearnDataTag() { + getRequestSurveyorParamAuto().resetCodeAutoMeasureCondition(); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/ILookCase.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/ILookCase.java new file mode 100644 index 0000000..2c74b90 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/ILookCase.java @@ -0,0 +1,9 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + + +import com.bingce.controlapphelper.model.DataCategory; + +public interface ILookCase { + boolean whichCase(DataCategory dataCategory); +} + diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/StateManagerHeightTraverse.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/StateManagerHeightTraverse.java new file mode 100644 index 0000000..ff14250 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/StateManagerHeightTraverse.java @@ -0,0 +1,536 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.point.PointRecord; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.RefreshGoBackButton; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.AutoSurveyorMethod; +import com.bingce.controlapphelper.surveyor.method.FindTargetMethod; +import com.bingce.controlapphelper.surveyor.method.SurveyorAdjustMethod; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.IStateType; +import com.bingce.controlapphelper.surveyor.state.ISurveyState; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyor; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorListener; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorRemindListener; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParamAuto; +import com.bingce.controlapphelper.surveyor.surveyor.SurveyorAutoImpl; +import com.bingce.controlapphelper.surveyor.surveyor.SurveyorMockAuto; +import com.bingce.controlapphelper.surveyor.surveyor.SurveyorSingleImpl; +import com.bingce.controlapphelper.surveyor.test.Test; +import com.bingce.controlapphelper.util.DigitalUtil; +import com.bingce.controlapphelper.util.IUIRunner; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.StationDataAdjustDialogFragment; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.controlnetwork.surveyor.state.AutoModeType; +import com.bingce.controlnetwork.surveyor.state.IScrollDelegate; +import com.bingce.controlnetwork.surveyor.state.StateConstants; +import com.bingce.coordlib.model.Coordinate; +import com.bingce.totalstation.ControlSurveyData; +import com.bingce.totalstation.ControlSurveyResult; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.utils.VipManager; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import blankj.utilcode.util.ToastUtils; + +public class StateManagerHeightTraverse implements IAutoModeSwitcher, ISurveyState, IStateType { + private final Map stateMap = new HashMap<>(); + private StateType currentStateType = StateType.idle; + private final FragmentManager fragmentManager; + private final LifecycleOwner lifecycleOwner; + private final IUIRunner iuiRunner; + final IScrollDelegate scrollDelegate; + + @NonNull + SurveyorStationRecord stationRecord; + final @NonNull + RequestSurveyorParamAuto requestSurveyorParamAuto; + final @NonNull + ToleranceDetailRecord toleranceRecord; + final @NonNull + ISurveyorData surveyorData; + final @NonNull + ICachedData cachedData; + final @NonNull + ICycleRecorder cycleRecorder; + final @NonNull + Context context; + private AutoModeType autoMode = AutoModeType.unknown; + @NonNull + final ISurveyor surveyor; + private final PointRecord stationPointRecord; + private final int positionFragment; + final boolean supportAutoSurvey; + + private StateManagerHeightTraverse( + final int positionFragment, + final boolean supportAutoSurvey,//是否支持自动测量 + final @NonNull RequestSurveyorParamAuto requestSurveyorParamAuto, + final @NonNull SurveyorStationRecord stationRecord, + final @NonNull PointRecord stationPointRecord, + final @NonNull ToleranceDetailRecord toleranceRecord, + final @NonNull Context context, + final @NonNull ISurveyorData surveyorData, + final @NonNull ICycleRecorder cycleRecorder, + final @NonNull ICachedData cachedData, + final @NonNull IScrollDelegate scrollDelegate, + FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + IUIRunner iuiRunner) { + this.positionFragment = positionFragment; + this.supportAutoSurvey = supportAutoSurvey; + + this.requestSurveyorParamAuto = requestSurveyorParamAuto; + this.stationRecord = stationRecord; + this.fragmentManager = fragmentManager; + this.lifecycleOwner = lifecycleOwner; + this.iuiRunner = iuiRunner; + this.scrollDelegate = scrollDelegate; + + this.context = context; + this.toleranceRecord = toleranceRecord; + this.surveyorData = surveyorData; + this.cachedData = cachedData; + this.cycleRecorder = cycleRecorder; + + this.stationPointRecord = stationPointRecord; + + if (Test.DEBUG) { + surveyor = new SurveyorMockAuto(StateConstants.VALUE_MEASURE_WHAT_ANGLE_DISTANCE, this.stationRecord.getId(), + this.stationRecord.isAutoClose(), + toleranceRecord.getCycleCount(), + cachedData, surveyorData, cycleRecorder, this, this); + } else { + if (supportAutoSurvey) { + surveyor = new SurveyorAutoImpl(StateConstants.VALUE_MEASURE_WHAT_ANGLE_DISTANCE, this); + } else { + surveyor = new SurveyorSingleImpl(StateConstants.VALUE_MEASURE_WHAT_ANGLE_DISTANCE); + } + } + _DoSurveyorState doSurveyorState = new _DoSurveyorState(positionFragment, this, this); + //注册接收数据的状态 + surveyor.register((ISurveyorListener) doSurveyorState); + surveyor.register((ISurveyorRemindListener) doSurveyorState); + + stateMap.put(StateType.init, new _Init(positionFragment, this)); + stateMap.put(StateType.doSurveyor, doSurveyorState); + stateMap.put(StateType.doAutoSurveyor, new _DoAutoSurveyorState(positionFragment, this, this)); + stateMap.put(StateType.SurveyorFailure, new _SurveyorFailureState(positionFragment, this)); + stateMap.put(StateType.doMove2NextValidate, new _DoMove2NextValidateState(positionFragment, this)); + stateMap.put(StateType.doMoveBack, new _DoMoveBackState(positionFragment, this)); + stateMap.put(StateType.checkStation, new _CheckStationState(positionFragment, this)); + + stateMap.put(StateType.doDeleteAllCycle, new _DoDeleteAllCycleState(positionFragment, this)); + stateMap.put(StateType.doDeleteCurrentCycle, new _DoDeleteCurrentCycleState(positionFragment, this)); + stateMap.put(StateType.doCalAdjust, new _DoCalAdjustState(positionFragment, this)); + stateMap.put(StateType.idle, new _IdleState(positionFragment, this, this)); + stateMap.put(StateType.doWellMeasureRotationReady, new _DoWellMeasureRotationReadyState(positionFragment, this)); + stateMap.put(StateType.checkTolerance, new _CheckToleranceState(positionFragment, this)); + + //监听测站数据变化 + runOnUI(() -> SurveyorDatabaseFactory + .instance + .getSurveyorStation() + .getLiveDataRecord(stationRecord.getId()) + .observe(lifecycleOwner, record -> { + if (record == null || !stationRecord.getId().equals(record.getId())) { + return; + } + updateSurveyorStationRecord(record); + })); + } + + private void updateSurveyorStationRecord(SurveyorStationRecord record) { + this.stationRecord = record; + //更新测点信息 + if (stationRecord.getItems() != null) { + for (SurveyorPoint item : stationRecord.getItems()) { + if (item == null || !SurveyorPoint.TYPE_POINT.equals(item.getType())) { + //排除非测点 + continue; + } + cachedData.updateSurveyPointParams(item); + } + } + + cachedData.notifyDateChange(); + } + + String stationId() { + return stationRecord.getId(); + } + + + @Override + public void enter(StateType type, Bundle args) { + if (isDead()) { + return; + } + __BaseState baseState = stateMap.get(type); + if (baseState != null) { + this.currentStateType = type; + runOnUI(() -> baseState.enter(args)); + } + } + + @Override + public void enter(StateType type) { + enter(type, null); + } + + void runOnUI(Runnable action) { + if (iuiRunner != null) { + iuiRunner.runOnUI(action); + } + } + + public void doSurveyor() { + boolean inValidate = isInValidate(); + + if (inValidate) { + return; + } + + int pointCount = cachedData.pointCount(); + if (pointCount == 0) { + ToastUtils.showShort(Tools.getString(R.string.no_data_available_yet)); + return; + } + + Bundle bundle = null; + if (isRotationReadyState()) { + //当前是旋转到位状态 + bundle = new Bundle(); + bundle.putBoolean(StateConstants.KEY_IS_ROTATION_READY_STATE, true); + } + + enter(StateType.doSurveyor, bundle); + } + + public void doAutoSurveyor() { + if (isInValidate()) { + return; + } + enter(StateType.doAutoSurveyor); + } + + public void deleteCurrentStationSurveyorData() { + if (isInValidate()) { + return; + } + enter(StateType.doDeleteAllCycle, _DoDeleteAllCycleState.args(stationId())); + } + + public void deleteCurrentStationSurveyorData(int cycleIndex) { + if (isInValidate()) { + return; + } + enter(StateType.doDeleteCurrentCycle, _DoDeleteCurrentCycleState.args(stationId(), cycleIndex)); + } + + public void stationCheck() { + if (isInValidate()) { + return; + } + enter(StateType.checkStation); + } + + public String stationCheckOnly() { + return _CheckStationState._stationCheck(stationId(), toleranceRecord, cachedData); + } + + public void stationAdjustOnly(String showType) { + ThreadPoolUtil.execute(() -> { + SurveyorAdjustMethod.AdjustResult adjustResult = SurveyorAdjustMethod.calStationAdjust(stationRecord, cachedData); + if (adjustResult.isError()) { + runOnUI(() -> TipsFragment.tipsOnly(fragmentManager, lifecycleOwner, context, adjustResult.errorString)); + return; + } + + ArrayList adjustList = new ArrayList<>(); + if (adjustResult.result != null && !adjustResult.result.isEmpty()) { + adjustList.add(adjustResult.result.get(0)); + } + StationDataAdjustDialogFragment.showDialog(showType, adjustList, adjustResult.showSlopDistance, fragmentManager()); + + //伴随平差 设置进度为通过检测 + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + __BaseState.getScheduleKey(positionFragment), + SurveyorScheduleConstants.STATUE_VALUE_CHECKED)); + }); + + } + + + public void stationAdjust(String type) { + if (isInValidate()) { + return; + } + Bundle bundle = new Bundle(); + bundle.putString(StationDataAdjustDialogFragment.KEY_SHOW_TYPE, type); + enter(StateType.doCalAdjust, bundle); + } + + public void switch2Cycle(int cycleIndex) { + if (isInValidate()) { + } +// _DoCalScheduleInSingleCycleState.enter(this, cycleIndex); + } + + public void calScheduleWhenEnterSurveyFragment(int cycleIndex) { + if (isInValidate()) { + return; + } + _Init.enter(this, cycleIndex); + } + + public void moveBack() { + if (isInValidate()) { + return; + } + enter(StateType.doMoveBack); + } + + //检测当前状态是否支持从外界主动改变状态 + //如果是空闲或者是测站通过检测是有效的状态 + private boolean isInValidate() { + return currentStateType != StateType.idle + && StateType.stationCheckedSuccess != currentStateType + && !isRotationReadyState(); + } + + private boolean isRotationReadyState() { + return currentStateType == StateType.doWellMeasureRotationReady; + } + + public void quite() { + _live = false; + for (Map.Entry entry : stateMap.entrySet()) { + entry.getValue().quite(); + } + //进入idle状态 + this.currentStateType = StateType.idle; + } + + private boolean _live = true; + + boolean isDead() { + return !_live; + } + + public void resume() { + _live = true; + for (Map.Entry entry : stateMap.entrySet()) { + entry.getValue().resume(); + } + } + + FragmentManager fragmentManager() { + return this.fragmentManager; + } + + LifecycleOwner lifecycleOwner() { + return this.lifecycleOwner; + } + + final boolean isStationAutoClosed() { + return stationRecord.isAutoClose(); + } + + @WorkerThread + public static StateManagerHeightTraverse newInstance( + int positionFragment, + boolean isSupportAutoMode, + @NonNull RequestSurveyorParamAuto requestSurveyorParamAuto, + @NonNull SurveyorStationRecord stationRecord, + @NonNull Context context, + @NonNull FragmentManager fragmentManager, + @NonNull LifecycleOwner lifecycleOwner, + @NonNull ToleranceDetailRecord toleranceRecord, + @NonNull ISurveyorData surveyorData, + @NonNull ICycleRecorder cycleRecorder, + @NonNull ICachedData cachedData, + IScrollDelegate scrollDelegate, + IUIRunner runner) { + //读取测点record + String stationPointId = null; + if (stationRecord.getItems() != null) { + for (SurveyorPoint stationItem : stationRecord.getItems()) { + if (SurveyorPoint.TYPE_STATION.equals(stationItem.getType())) { + stationPointId = stationItem.getPointId(); + break; + } + } + } + PointRecord stationPointRecord = null; + if (stationPointId != null) { + stationPointRecord = SurveyorDatabaseFactory + .instance + .getPointDataSource() + .findByIdSync(stationPointId); + } + if (stationPointRecord == null) { + return null; + } + boolean supportAuto = Test.DEBUG; + if (isSupportAutoMode && + (VipManager.getInstance().checkReg() || VipManager.getInstance().checkControlProProLevel())) { + supportAuto = true; + } + return new StateManagerHeightTraverse( + positionFragment, + supportAuto, + requestSurveyorParamAuto, + stationRecord, + stationPointRecord, + toleranceRecord, + context, + surveyorData, + cycleRecorder, + cachedData, + scrollDelegate, + fragmentManager, lifecycleOwner, runner); + } + + @Override + public boolean isAutoModeOpen() { + return autoMode == AutoModeType.start; + } + + @Override + public boolean isAutoModeClose() { + return autoMode == AutoModeType.stop; + } + + @Override + public boolean isAutoModeNotSpecial() { + return autoMode == AutoModeType.unknown; + } + + @Override + public void openAutoMode() { + autoMode = AutoModeType.start; + } + + @Override + public void closeAutoMode() { + autoMode = AutoModeType.stop; + } + + @Override + public void resetAutoMode() { + autoMode = AutoModeType.unknown; + } + + + @Override + public int isReadyAutoSurvey() { + if (!supportAutoSurvey) { + return ControlSurveyResult.CODE_ERROR; + } + if (!surveyor.isReady()) {//仪器连接上才算ready + return ControlSurveyResult.CODE_ERROR; + } + + Coordinate stationBasePoint = getStationCoord(); + double instrumentHeight = getInsturmentHeight(); + + return requestSurveyorParamAuto.checkAutoCondition(getCachedData(), stationBasePoint, instrumentHeight); + } + + @Override + public String isMeasuredValueMatchDesign() { + if (!supportAutoSurvey) { + return null; + } + Coordinate stationBasePoint = getStationCoord(); + double instrumentHeight = getInsturmentHeight(); + List originMeasureList = requestSurveyorParamAuto.getOriginMeasureList(getCachedData()); + return AutoSurveyorMethod.checkAutoSurveyorMeasuredValue(stationBasePoint, instrumentHeight, originMeasureList); + } + + @Override + public boolean isSurveying() { + return currentStateType == StateType.doSurveyor || currentStateType == StateType.doAutoSurveyor; + } + + @Override + public boolean isAutoSurveying() { + return isAutoModeOpen(); + } + + + @NonNull + public ICachedData getCachedData() { + return cachedData; + } + + /** + * 获取当前测回 + * + * @return + */ + public int getCurrentCycle() { + return cycleRecorder.currentCycleIndex(); + } + + public int getCurrentIndex() { + return surveyorData.currentIndex(); + } + + private Coordinate getStationCoord() { + if (PointRecord.TYPE_KNOWN_POINT.equals(stationPointRecord.getPointType())) { + return new Coordinate( + stationPointRecord.getX(), + stationPointRecord.getY(), + stationPointRecord.getZ()); + } + return null; + } + + public double getInsturmentHeight() { + return DigitalUtil.valueOfDoubleString(stationRecord.getInstrumentHeight(), 0); + } + + @NonNull + public RequestSurveyorParamAuto getRequestSurveyorParamAuto() { + return requestSurveyorParamAuto; + } + + public void refreshGoBackBtnEnable() { + FindTargetMethod.Target deleteTartget = _DoMove2NextValidateState.findTarget(stationId(), cachedData.pointCount(), cachedData, + surveyorData.currentIndex(), false, + dataCategory -> !dataCategory.isEmptyData()); + EventBus.getDefault().post(new RefreshGoBackButton(deleteTartget != null)); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_CheckStationState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_CheckStationState.java new file mode 100644 index 0000000..8b2ae0d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_CheckStationState.java @@ -0,0 +1,343 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import androidx.annotation.WorkerThread; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.method.AverageValueMethod; +import com.bingce.controlapphelper.surveyor.method.DeviationValueOfRadianMethod; +import com.bingce.controlapphelper.surveyor.method.RadianMethod; +import com.bingce.controlapphelper.surveyor.method.ValueOf2cMethod; +import com.bingce.controlapphelper.surveyor.method.model.CacheResult; +import com.bingce.controlapphelper.surveyor.method.model.SdAngleValueType; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.SelectReSurveyorCycleFragment; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.utils.Util; + +import java.util.ArrayList; +import java.util.List; + +/** + * 执行「测站检测」 + *

+ * 前置条件: + * 所有测回都完成测量,并且通过「测回内检测」 + */ +class _CheckStationState extends __BaseState { + + public _CheckStationState(int positionFragment, StateManagerHeightTraverse stateManager) { + super(StateType.checkStation, positionFragment, stateManager); + } + + @Override + public void enter(Bundle args) { + //执行测站检测 + String error = _stationCheck(stationId(), getToleranceRecord(), getCachedData()); + if (error.isEmpty()) { + //进入finish状态 + navigation2(StateType.stationCheckedSuccess); + } else { + showErrorTips(error, stationId(), getToleranceRecord().getCycleCount(), + getCachedData(), + this, + fragmentManager(), + lifecycleOwner()); + } + } + + /** + * 提示错误信息,并让用户选择下一步操作 + */ + public static void showErrorTips(String msg, String stationId, int cycleCount, + ICachedData stationSurveyorDataSource, + __BaseState state, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner) { + state.optionTips(msg, + Tools.getString(R.string.retest_cycle), + Tools.getString(R.string.retest_station), + () -> state.runOnBackground(() -> reSurveyorCycle(stationId, cycleCount, + stationSurveyorDataSource, + state, fragmentManager, lifecycleOwner)), + () -> reSurveyorStation(msg, stationId, cycleCount, + stationSurveyorDataSource, + state, fragmentManager, lifecycleOwner), + () -> state.enterIdleAndClearSurveyStateAndResetAutoMode(true)); + } + + + @WorkerThread + private static void reSurveyorCycle(String stationId, int cycleCount, + ICachedData cachedData, + __BaseState state, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner) { + SurveyorStationRecord stationRecord = SurveyorDatabaseFactory.instance.getSurveyorStation().getRecordSync(stationId); + if (stationRecord == null) { + state.enterIdleAndClearSurveyStateAndResetAutoMode(true); + return; + } + state.runOnUI(() -> SelectReSurveyorCycleFragment.start( + fragmentManager, + lifecycleOwner, + cycleCount, + (cycleIndex) -> { + if (cycleIndex == -1) { + state.enterIdleAndClearSurveyStateAndResetAutoMode(true); + } else { + //记录补测数据类型 + List pointIds = new ArrayList<>(); + pointIds.add(cachedData.pointId(cycleIndex, cycleIndex)); + cachedData.markReSurveyor(stationId, cycleIndex, pointIds); + //更新测量状态 + state.setCurrentCycle(cycleIndex); + state.setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + state.setSingleCycleSchedule(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + + //查找新测量目标 + state.findTargetFromBeginInCurrentCycle(true, cycleIndex); + } + } + )); + } + + static void reSurveyorStation(String msg, String stationId, int cycleCount, + ICachedData cachedData, + __BaseState state, + FragmentManager fragmentManager, LifecycleOwner lifecycleOwner) { + state.optionTips(Tools.getString(R.string.is_delete_all_station_data), null, null, + () -> {//1.选择删除测站所有数据,则执行相应逻辑 + ThreadPoolUtil.execute(() -> { + //删除数据 + cachedData.deleteSurveyorRecord(stationId); + //更新测量进度 + state.setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + for (int index = 0; index < cycleCount; index++) { + state.setSingleCycleSchedule(index, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + } + + state.resetLearnDataTag(); + + //重新测量 + state.findTargetFromBeginInCurrentCycle(true, 0); + }); + }, + () -> {//2.如果用户不选择删除,则循环提示,让他重新在重测和删除做选择 + //循环显示 + showErrorTips(msg, stationId, cycleCount, + cachedData, state, + fragmentManager, lifecycleOwner); + }, + () -> state.enterIdleAndClearSurveyStateAndResetAutoMode(true));//3.如果用户忽略,则停留在当前位置 + } + + + //检测合法性 + + /** + * 检测所有测回数据 + *

+ * 在「无自动闭合」情况下,为了兼容「左右角」测量结果,根据pointId将所有测量数据存入map中 + * 根据「左角」测量来检测「测回间同方向值互差」,所有测回的归零值使用「左角」第一个point来做0点 + *

+ * 如果是「自动闭合」情况,则忽略「左右角」测量,直接按照itemIndex依次计算,第个测回的归零值, + * 使用每次循环的itemIndex=0做0点 + * + * @param toleranceRecord 限差 + * @param cachedDataSource 缓存的测量数据 + * @return 错误信息,如果为null或空,说明没有错误 + */ + public static String _stationCheck(final String stationId, + final ToleranceDetailRecord toleranceRecord, + final ICachedData cachedDataSource) { + final int cycleCount = toleranceRecord.getCycleCount(); + final int surveyorCount = toleranceRecord.getSurveyorCount(); + + //*****测回间垂直角互差(垂直角) + double verCyclesAngleDifference = toleranceRecord.getVerCyclesAngleDifference()/*verCyclesAngleDifference*/; + List<_ErrorItem> verValueError = new ArrayList<>(); + + //执行计算 + for (int cycleI = 0; cycleI < cycleCount; cycleI++) { + List valuesI = + DeviationValueOfRadianMethod.zeroValueOfSingleCycleInLeftOrientation(stationId, cycleI, surveyorCount, cachedDataSource); + for (int cycleJ = cycleI + 1; cycleJ < cycleCount; cycleJ++) { + List valuesJ = + DeviationValueOfRadianMethod.zeroValueOfSingleCycleInLeftOrientation(stationId, cycleJ, surveyorCount, cachedDataSource); + if (valuesI.size() != valuesJ.size()) { + return Tools.getString(R.string.please_complete_all_retest_data); + } + int size = valuesI.size(); + for (int index = 0; index < 1; index++) { + double diff = Math.abs(DeviationValueOfRadianMethod + .similarRadianDiff(valuesI.get(index).verRadian, valuesJ.get(index).verRadian)); + if (verCyclesAngleDifference < RadianMethod.radian2S(diff)) { + verValueError.add(new _ErrorItem(valuesI.get(index).pointName, + cycleI, cycleJ, RadianMethod.radian2S(diff))); + } + } + } + } + //*****测回间垂直角I互差(垂直角) + double verCyclesIDifference = toleranceRecord.getVerCyclesIDifference()/*verCyclesIDifference*/; + List<_ErrorItem> verIError = new ArrayList<>(); + //*****测回间斜距互差(距离) + double distCyclesDifference = toleranceRecord.getSlopeCycleDistanceDifference()/*slopeCycleDistanceDifference*/; + List<_ErrorItem> distError = new ArrayList<>(); + + List<_Point> pointArrayList = new ArrayList<>(); + //遍历第一测回,收集所有待测点id + for (int index = 0; index < 1; index++) { + if (cachedDataSource.isPointAbandon(0, index)) { + continue; + } + pointArrayList.add(new _Point(cachedDataSource.pointId(0, index), + cachedDataSource.pointName(0, index), + cachedDataSource.isAloneDistance(0, index))); + } + //检测所有待测点i互差 + for (_Point point : pointArrayList) { + for (int cycleI = 0; cycleI < cycleCount; cycleI++) { + String leftRecordId_I = IdUtil.createSurveyorRecordId(stationId, cycleI, point.pointId, LeftOrRight.left); + String rightRecordId_I = IdUtil.createSurveyorRecordId(stationId, cycleI, point.pointId, LeftOrRight.right); + CacheResult value2C_I = ValueOf2cMethod.valueOf2C(SdAngleValueType.verAngle, leftRecordId_I, rightRecordId_I, + toleranceRecord.getSurveyorCount(), cachedDataSource); + CacheResult distanceLeftAndRightAverageValue_I = AverageValueMethod.leftAndRightValue(SdAngleValueType.distance, + leftRecordId_I, + rightRecordId_I, surveyorCount, cachedDataSource); + for (int cycleJ = cycleI + 1; cycleJ < cycleCount; cycleJ++) { + String leftRecordId_J = IdUtil.createSurveyorRecordId(stationId, cycleJ, point.pointId, LeftOrRight.left); + String rightRecordId_J = IdUtil.createSurveyorRecordId(stationId, cycleJ, point.pointId, LeftOrRight.right); + CacheResult value2C_J = ValueOf2cMethod.valueOf2C(SdAngleValueType.verAngle, leftRecordId_J, rightRecordId_J, + toleranceRecord.getSurveyorCount(), cachedDataSource); + CacheResult distanceLeftAndRightAverageValue_J = AverageValueMethod.leftAndRightValue(SdAngleValueType.distance, + leftRecordId_J, + rightRecordId_J, surveyorCount, cachedDataSource); + double verI = Math.abs(value2C_I.value - value2C_J.value); + if (verCyclesIDifference < verI) { + verIError.add(new _ErrorItem(point.pointName, cycleI, cycleJ, verI)); + } + + if (!point.aloneDistance) { + double distance = Math.abs(distanceLeftAndRightAverageValue_I.value - distanceLeftAndRightAverageValue_J.value); + if (distCyclesDifference < distance * 1000) { + distError.add(new _ErrorItem(point.pointName, cycleI, cycleJ, distance * 1000)); + } + } + + } + } + } + + return _errorString(verCyclesAngleDifference, verCyclesIDifference, distCyclesDifference, + verValueError, verIError, distError); + } + + /** + * 根据超限信息生成错误描述 + * + * @param verValueError 垂直角同方向值互差 + */ + private static String _errorString(double verLimit, double verILimit, double distLimit + , List<_ErrorItem> verValueError, List<_ErrorItem> verIError, List<_ErrorItem> distError) { + StringBuilder stringBuilder = new StringBuilder(); + if (!verValueError.isEmpty()) { + stringBuilder.append("\n").append(Tools.getString(R.string.cycle_between_ver_angle_limit)) + .append(Util.formatDouble2String(verLimit, 1)) + .append("'')"); + for (_ErrorItem item : verValueError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + if (!verIError.isEmpty()) { + stringBuilder.append("\n").append(Tools.getString(R.string.ver_angle_i_same_direction_each_cycle)) + .append(Util.formatDouble2String(verILimit, 1)) + .append("'')"); + for (_ErrorItem item : verIError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + if (!distError.isEmpty()) { + stringBuilder.append("\n").append(Tools.getString(R.string.cycle_between_distance_limit_brackets)) + .append(Util.formatDouble2String(distLimit, 1)) + .append("'')"); + for (_ErrorItem item : distError) { + stringBuilder + .append("\n ") + .append(item.pointName) + .append(":\n") + .append(" |") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex1)) + .append("-") + .append(SurveyorCycleUtil.cycleName(item.cycleIndex2)) + .append("| = ") + .append(Util.formatDouble2String(item.difference, 1)) + .append("'')"); + } + } + + return stringBuilder.toString(); + } + + /** + * 存储错误信息的item + */ + private static class _ErrorItem { + final String pointName; + final int cycleIndex1; + final int cycleIndex2; + final double difference; + + public _ErrorItem(String pointName, int cycleIndex1, int cycleIndex2, double difference) { + this.pointName = pointName; + this.cycleIndex1 = cycleIndex1; + this.cycleIndex2 = cycleIndex2; + this.difference = difference; + } + } + + private static class _Point { + final String pointId; + final String pointName; + final boolean aloneDistance; + + _Point(String pointId, String pointName, boolean aloneDistance) { + this.pointId = pointId; + this.pointName = pointName; + this.aloneDistance = aloneDistance; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_CheckToleranceState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_CheckToleranceState.java new file mode 100644 index 0000000..96dd47b --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_CheckToleranceState.java @@ -0,0 +1,313 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; +import android.text.TextUtils; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.ConfigRecord; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.surveyorrecord.SurveyorRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.data.SpeakCache; +import com.bingce.controlapphelper.surveyor.method.DeviationValueOfRadianMethod; +import com.bingce.controlapphelper.surveyor.method.SingleCycleCheckMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.surveyor.state.AutoModeType; +import com.bingce.totalstation.TotalStation; +import com.bingce.utils.ThreadPoolUtil; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/** + * 检测限差 + */ +public class _CheckToleranceState extends __BaseState { + + public _CheckToleranceState(int positionFragment, + StateManagerHeightTraverse stateManager) { + super(StateType.checkTolerance, positionFragment, stateManager); + } + + @Override + public void enter(Bundle args) { + //检测读数 + if (!checkReadData()) { + return; + } + + ICachedData cacheData = getCachedData(); + ISurveyorData surveyorData = getSurveyorData(); + + + //设置数据正常 + surveyorData.setDataCategory(DataCategory.normalCategory()); + //存储(缓存+数据库) + cacheData.cache(getCurrentCycleIndex(), surveyorData); + + if (isSingleCycleCompleted(stationId(), getCurrentCycleIndex(), cacheData)) { + refreshUI(); + //更新测回测量进度 + setSingleCycleSchedule(getCurrentCycleIndex(), SurveyorScheduleConstants.STATUE_VALUE_COMPLETED); + boolean singleSuccess = checkSingleCycle(); + if (singleSuccess) { + checkAllCycle(); + } + } else { + findNextSurveyorPoint(); + } + + } + + private void checkAllCycle() { + int cycleCount = getToleranceRecord().getCycleCount(); + int nextCycleIndex = -1; + //查找数据不全的测回 + for (int cycleIndex = 0; cycleIndex < cycleCount; cycleIndex++) { + if (!getCachedData().isSingleCycleAllDataValidate(cycleIndex)) { + //对不全数据的测回赋值 + nextCycleIndex = cycleIndex; + break; + } + } + + if (nextCycleIndex != -1) { + //有其他测回数据没有测完 + if (isAutoSurveyOpen()) { + //修改当前测回 + setCurrentCycle(nextCycleIndex); + //存储一下已经播放切换测回的的节点 + SpeakCache.getInstance().saveSpeakSwitchCycle(); + //播报 + TtsManager.getInstance().speak(Tools.getString(R.string.current_cycle_complete_start_surveyor) + SurveyorCycleUtil.cycleName(nextCycleIndex)); + //查找测量目标 + findNextSurveyorPoint(); + } else { +// //提示是否进入其他未完成测回继续测量 +// option4Jump2OtherEmptyCycle(nextCycleIndex); + //查找测量目标 + findNextSurveyorPoint(); + } + return; + } + + if (isAutoSurveyOpen()) { + //检测是否已经提示 + //检测是否需要提示测站检测 + IConfigDataSource configDataSource = + SurveyorDatabaseFactory.instance.getConfigDataSource(); + ThreadPoolUtil.execute(() -> { + String key = ConfigConstants.KEY_CONFIG_STATION_CHECK_REMINDED + stationId(); + ConfigRecord record = configDataSource.getByKeySync(key); + if (record == null || ConfigConstants.VALUE_NO.equals(record.getConfigValue())) { + runOnUI(() -> TtsManager.getInstance().speak(Tools.getString(R.string.all_cycle_completed))); + } + }); + } + //标识测站完成测量(数据库存储) + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_COMPLETED); + //进入idle状态 + //清除测量状态,进入测站检测,停止自动测量 + setAutoAndSurveyorState(AutoModeType.unknown, false); + + String error = _CheckStationState._stationCheck(stationId(), getToleranceRecord(), getCachedData()); + if (error.isEmpty()) { + //进入finish状态 + ISurveyorData surveyorData = getSurveyorData(); + surveyorData.clearSurveyStateAndPosition(); + //设置测量进度(数据库存储) + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_CHECKED); + //通知刷新 + tips(getContext().getString(R.string.tips_all_cycle_has_finish_and_checked), null); + if (isAutoSurveyOpen()) { + runOnUI(() -> TtsManager.getInstance().speak(getContext().getString(R.string.tips_all_cycle_has_finish_and_checked))); + } + //清除测量状态,进入idle,停止自动测量 + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } else { + _CheckStationState.showErrorTips(error, stationId(), getToleranceRecord().getCycleCount(), + getCachedData(), + this, + fragmentManager(), + lifecycleOwner()); + } + + } + + private boolean checkSingleCycle() { + ICachedData cachedData = getCachedData(); + String stationId = stationId(); + ISurveyorData surveyorData = getSurveyorData(); + int currentCycleIndex = surveyorData.currentIndex(); + ToleranceDetailRecord toleranceRecord = getToleranceRecord(); + int cycleCount = toleranceRecord.cycleCount; + + //预处理 + for (int index = 0; index < cachedData.pointCount(); index++) { + String pointId = cachedData.pointId(currentCycleIndex, index); + String keyLeft = IdUtil.createSurveyorRecordId(stationId, currentCycleIndex, pointId, LeftOrRight.left); + SurveyorRecord left = cachedData.getSurveyorRecord(keyLeft); + _changeDirtyRecord2NormalBeforeCheck(left, cachedData); + String keyRight = IdUtil.createSurveyorRecordId(stationId, currentCycleIndex, pointId, LeftOrRight.right); + SurveyorRecord right = cachedData.getSurveyorRecord(keyRight); + _changeDirtyRecord2NormalBeforeCheck(right, cachedData); + } + + //执行单测回内检测 + String error = SingleCycleCheckMethod.checkVerI( + toleranceRecord.getVerCycleDirectIDifference(), + stationId(), currentCycleIndex, surveyorData, cachedData); + if (error != null) { + if (isAutoSurveyOpen()) { + TtsManager.getInstance().speak(Tools.getString(R.string.check_cycle_inner_failed)); + } + _CheckStationState.showErrorTips(error, stationId(), cycleCount, cachedData, this, fragmentManager(), lifecycleOwner()); + return false; + } + + //更新测量进度 + setSingleCycleSchedule(currentCycleIndex, + SurveyorScheduleConstants.STATUE_VALUE_CHECKED); + + return true; + } + + private void _changeDirtyRecord2NormalBeforeCheck( + SurveyorRecord record, ICachedData cachedDataSource) { + if (record == null) { + return; + } + if (record.value1Status.isResurveyed() || record.value2Status.isResurveyed()) { + if (record.value1Status.isResurveyed()) { + record.value1Status = DataCategory.normalCategory(); + } + if (record.value2Status.isResurveyed()) { + record.value2Status = DataCategory.normalCategory(); + } + + cachedDataSource.updateCache(record); + } + } + + private boolean checkReadData() { + int surveyorCount = getToleranceRecord().getSurveyorCount(); + if (surveyorCount > 1) {//单次测量,直接通过检测 + //多次测量,执行检测 + ISurveyorData surveyorDataSource = getSurveyorData(); + double horDifference = getToleranceRecord().getHorReadDifference(); + double verDifference = getToleranceRecord().getVerReadDifference(); + double distanceDifference = getToleranceRecord().getSlopeReadDifference(); + double horDiffRadian = DeviationValueOfRadianMethod.similarRadianDiff(surveyorDataSource.getAngleHor1(), surveyorDataSource.getAngleHor2()); + double verDiffRadian = DeviationValueOfRadianMethod.similarRadianDiff(surveyorDataSource.getAngleVer1(), surveyorDataSource.getAngleVer2()); + + String msg = null; +// if (verDifference < RadianMethod.radian2S(verDiffRadian)) { +// msg = "垂直角读数超限,请重新观测该目标."; +// } else + if (!isAloneDistance()//增加单独测距判断 + && distanceDifference < distanceReadDiff(surveyorDataSource.getDistance1(), surveyorDataSource.getDistance2())) { + msg = Tools.getString(R.string.distance_read_data_limit); + } + + if (!TextUtils.isEmpty(msg)) { + failureTipsWithAutoStandStill(msg); + return false; + } + } + + return checkLeft(); + } + + /** + * 如果是测回内首次测量,需要判断是否是盘左 + */ + private boolean checkLeft() { + LeftOrRight leftOrRight = getSurveyorData().leftOrRight(); + if (leftOrRight == LeftOrRight.left) { + //如果是首次测量,强制要求使用盘左 + double vAngle = getSurveyorData().getAngleVer(); + if (!isFaceLeft(vAngle)) { + failureTipsWithAutoStandStill( + getContext().getString(R.string.error_tips_please_start_from_left), + () -> { + TotalStation.getInstance().requestChangeFace(); + }); + return false; + } + } + return true; + } + + /** + * 是否是盘左 + * + * @param vAngle + * @return + */ + private boolean isFaceLeft(double vAngle) { + return vAngle >= 0 && vAngle <= Math.PI; + } + + /** + * 斜距两次读数差 + * + * @param distance1 读数1 + * @param distance2 读数2 + * @return 读数差(单位毫米) + */ + public double distanceReadDiff(double distance1, double distance2) { + return Math.abs(distance1 - distance2) * 1000; + } + + /** + * 判断单个测回是否测量完成(不要求通过检测) + */ + public static boolean isSingleCycleCompleted(String stationId, int cycleIndex, ICachedData cachedData) { + if (cachedData.pointCount() == 0) { + return false; + } + if (cycleIndex == -1) { + cycleIndex = 0; + } + + boolean isCompleted = true; + + //测回内所有数据都是「新鲜数据」才能执行「测回内检测」 + for (int index = 0; index < cachedData.pointCountReal(); index++) { + + if (cachedData.isPointAbandon(cycleIndex, index)) { + continue; + } + + String pointId = cachedData.pointId(cycleIndex, index); + + String leftKey = IdUtil.createSurveyorRecordId(stationId, cycleIndex, pointId, LeftOrRight.left); + String rightKey = IdUtil.createSurveyorRecordId(stationId, cycleIndex, pointId, LeftOrRight.right); + + DataCategory leftDataCategory = cachedData.valueState(leftKey); + DataCategory rightDataCategory = cachedData.valueState(rightKey); + + if (leftDataCategory.isFreshData() && rightDataCategory.isFreshData()) { + continue; + } + isCompleted = false; + break; + } + + return isCompleted; + } + + private void findNextSurveyorPoint() { + findTargetFromBeginInCurrentCycle(false, 0); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoAutoSurveyorState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoAutoSurveyorState.java new file mode 100644 index 0000000..4e366b2 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoAutoSurveyorState.java @@ -0,0 +1,32 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.totalstation.ControlSurveyResult; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/** + * 先检测是否有其他未完成测回,继续本次测量将删除其他测回数据 + */ +class _DoAutoSurveyorState extends __BaseState { + private final IAutoModeSwitcher autoModeSwitcher; + + public _DoAutoSurveyorState(int positionFragment, StateManagerHeightTraverse stateManager, IAutoModeSwitcher autoModeSwitcher) { + super(StateType.doAutoSurveyor, positionFragment, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + public void enter(Bundle args) { + if (autoModeSwitcher.isReadyAutoSurvey() == ControlSurveyResult.CODE_SUCCESS) { + autoModeSwitcher.openAutoMode(); + navigation2(StateType.doMove2NextValidate); + TtsManager.getInstance().speak(Tools.getString(R.string.start_auto_measure)); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoCalAdjustState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoCalAdjustState.java new file mode 100644 index 0000000..da5f28c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoCalAdjustState.java @@ -0,0 +1,45 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import com.bingce.controlapphelper.surveyor.method.SurveyorAdjustMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlnetwork.fragment.StationDataAdjustDialogFragment; + +/** + * 平差计算 + */ +public class _DoCalAdjustState extends __BaseState { + + public _DoCalAdjustState(int positionFragment, StateManagerHeightTraverse stateManager) { + super(StateType.doCalAdjust, positionFragment, stateManager); + } + + @Override + public void enter(Bundle args) { + String showType = null; + if (args != null) { + showType = args.getString(StationDataAdjustDialogFragment.KEY_SHOW_TYPE); + } + startCalAdjust(showType); + } + + private void startCalAdjust(String showType) { + runOnBackground(() -> { + SurveyorAdjustMethod.AdjustResult adjustResult = SurveyorAdjustMethod.calStationAdjust(getStation(), getCachedData()); + if (adjustResult.isError()) { + runOnUI(() -> _CheckStationState.showErrorTips(adjustResult.errorString, stationId(), getToleranceRecord().getCycleCount(), + getCachedData(), + _DoCalAdjustState.this, + fragmentManager(), + lifecycleOwner())); + return; + } + //清除测量状态,进入idle,停止自动测量 + enterIdleAndClearSurveyStateAndResetAutoMode(true); + + StationDataAdjustDialogFragment.showDialog(showType, adjustResult.result, adjustResult.showSlopDistance, fragmentManager()); + } + ); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoDeleteAllCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoDeleteAllCycleState.java new file mode 100644 index 0000000..b84f3e3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoDeleteAllCycleState.java @@ -0,0 +1,70 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.utils.ThreadPoolUtil; + +import com.bingce.controlnetwork.R; + +/* + * 删除本测站所有测回数据 + * */ +class _DoDeleteAllCycleState extends __BaseState { + + private static final String KEY_STATION_ID = "__station_id"; + + static Bundle args(String stationId) { + Bundle args = new Bundle(); + args.putString(KEY_STATION_ID, stationId); + return args; + } + + public _DoDeleteAllCycleState(int positionFragment, StateManagerHeightTraverse stateManager) { + super(StateType.doDeleteAllCycle, positionFragment, stateManager); + } + + @Override + public void enter(Bundle args) { + String stationId = args.getString(KEY_STATION_ID); + + optionTipsWithStandStill(getContext().getString(R.string.tips_delete_station_all_surveyor_records), + () -> deleteAllCycleData(stationId)); + } + + private void deleteAllCycleData(String stationId) { + ThreadPoolUtil.execute(() -> { + //删除数据 + ICachedData cachedData = getCachedData(); + cachedData.deleteSurveyorRecord(stationId); + + //清除已经提示测站可以检测标识 + IConfigDataSource configDataSource = + SurveyorDatabaseFactory.instance.getConfigDataSource(); + String key = ConfigConstants.KEY_CONFIG_STATION_CHECK_REMINDED + stationId; + configDataSource.setSync(key, ConfigConstants.VALUE_NO); + + //重置进度 + setAllCycleScheduleSync(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + for (int cycleIndex = 0; cycleIndex < getToleranceRecord().getCycleCount(); cycleIndex++) { + setSingleCycleScheduleSync(cycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + } + + //重置学习测量的标志 + resetLearnDataTag(); + + //从第一测回开始 + setCurrentCycleSync(0); + + //重新测量,并刷新 + findTargetFromBeginInCurrentCycle(true, 0); + }); + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoDeleteCurrentCycleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoDeleteCurrentCycleState.java new file mode 100644 index 0000000..1f50f3e --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoDeleteCurrentCycleState.java @@ -0,0 +1,84 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.IConfigDataSource; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.method.FindTargetMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.utils.ThreadPoolUtil; + +import com.bingce.controlnetwork.R; + +class _DoDeleteCurrentCycleState extends __BaseState { + + private static final String KEY_STATION_ID = "__station_id"; + private static final String KEY_PERIOD_INDEX = "__period_index__"; + + static Bundle args(String stationId, int periodIndex) { + Bundle args = new Bundle(); + args.putString(KEY_STATION_ID, stationId); + args.putInt(KEY_PERIOD_INDEX, periodIndex); + return args; + } + + public _DoDeleteCurrentCycleState(int positionFragment, StateManagerHeightTraverse stateManager) { + super(StateType.doDeleteCurrentCycle, positionFragment, stateManager); + } + + @Override + public void enter(Bundle args) { + String stationId = args.getString(KEY_STATION_ID); + int cycleIndex = args.getInt(KEY_PERIOD_INDEX); + + optionTipsWithStandStill(getContext().getString(R.string.tips_delete_current_cycle_surveyor_record), + () -> deleteSingleCycle(stationId, cycleIndex)); + } + + private void deleteSingleCycle(String stationId, int cycleIndex) { + ThreadPoolUtil.execute(() -> { + ICachedData cachedData = getCachedData(); + + int pointIndex = getCurrentIndex(); + + FindTargetMethod.Target target = _DoMove2NextValidateState.getTargetAscOrDesc(stationId, pointIndex, cachedData, + false, dataCategory -> !dataCategory.isEmptyData()); + + if (target == null) { + navigation2(StateType.idle); + return; + } + + int deleteCycleIndex = target.cycleIndex; + //删除数据 + ICachedData stationSurveyorDataSource = getCachedData(); + stationSurveyorDataSource.deleteSurveyorRecordSync(stationId, deleteCycleIndex); + + //清除已经提示测站可以检测标识 + IConfigDataSource configDataSource = SurveyorDatabaseFactory.instance.getConfigDataSource(); + String key = ConfigConstants.KEY_CONFIG_STATION_CHECK_REMINDED + stationId; + configDataSource.setSync(key, ConfigConstants.VALUE_NO); + + if (deleteCycleIndex == 0) { + //当第一测回 + //重置学习测量的标志 + resetLearnDataTag(); + } + + //重置所有测回和当次测回进度 + setAllCycleScheduleSync(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setSingleCycleScheduleSync(deleteCycleIndex, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + + //设置当前测回 + setCurrentCycleSync(deleteCycleIndex); + + //重新测量,并刷新 + findTargetFromBeginInCurrentCycle(true, 0); + }); + + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoMove2NextValidateState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoMove2NextValidateState.java new file mode 100644 index 0000000..c476e4e --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoMove2NextValidateState.java @@ -0,0 +1,122 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import androidx.annotation.NonNull; + +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.method.FindTargetMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; + +import net.tatans.tensorflowtts.tts.TtsManager; + +/** + * 移动到一个待测量位置 + *

+ * 不会跳转到其他测期 + *

+ * 可能涉及转向(盘左->盘右) + */ +class _DoMove2NextValidateState extends __BaseState { + + public _DoMove2NextValidateState(int positionFragment, StateManagerHeightTraverse stateManager) { + super(StateType.doMove2NextValidate, positionFragment, stateManager); + } + + @Override + public void enter(Bundle args) { + ICachedData cachedData = getCachedData(); + + int pointCount = cachedData.pointCount(); + + int cycle = 0; + if (args != null) { + cycle = args.getInt(BundleConstants.KEY_CYCLE_INDEX, 0); + } + + //1.先查找补测数据 + FindTargetMethod.Target surveyorTarget = findTarget(stationId(), pointCount, cachedData, cycle, true, + dataCategory -> DataCategory.dirtyAndNeedReSurveyor == dataCategory); + + + //如果在当前测回找到待被测数据,立刻跳转到相应位置 + if (surveyorTarget != null) { + lookTargetAfter(surveyorTarget.itemIndex, surveyorTarget.leftOrRight); + return; + } + //2.查找empty数据 + FindTargetMethod.Target emptyTarget = findTarget(stationId(), pointCount, cachedData, cycle, true, + dataCategory -> DataCategory.empty == dataCategory); + + if (emptyTarget != null) { + if (isAutoSurveyOpen()) { + if (emptyTarget.itemIndex == getCachedData().pointCount() - 1 + && emptyTarget.leftOrRight == LeftOrRight.right) { + TtsManager.getInstance().speak(Tools.getString(R.string.start_face_right)); + } + } + //直接跳转到目标点,开启新测量 + lookTargetAfter(emptyTarget.itemIndex, emptyTarget.leftOrRight); + return; + } + + enterIdleAndClearSurveyorStatePosition(); + + } + + public static FindTargetMethod.Target findTarget(final String stationId, + final int pointCount, + final @NonNull ICachedData cachedData, + int startLookPosition, + boolean isAscLook, + ILookCase lookCase) { + if (isAscLook) { + for (int i = startLookPosition; i < pointCount; i++) { + FindTargetMethod.Target targetAscOrDesc = getTargetAscOrDesc(stationId, i, cachedData, true, lookCase); + if (targetAscOrDesc != null) { + return targetAscOrDesc; + } + } + } else { + for (int j = startLookPosition; j >= 0; j--) { + FindTargetMethod.Target targetAscOrDesc = getTargetAscOrDesc(stationId, j, cachedData, false, lookCase); + if (targetAscOrDesc != null) { + return targetAscOrDesc; + } + } + } + return null; + } + + public static FindTargetMethod.Target getTargetAscOrDesc(String stationId, int pointIndex, ICachedData cachedData, boolean isAscLook, ILookCase lookCase) { + FindTargetMethod.Target target; + if (isAscLook) { + target = getTarget(stationId, pointIndex, cachedData, LeftOrRight.left, lookCase); + if (target != null) return target; + target = getTarget(stationId, pointIndex, cachedData, LeftOrRight.right, lookCase); + } else { + target = getTarget(stationId, pointIndex, cachedData, LeftOrRight.right, lookCase); + if (target != null) return target; + target = getTarget(stationId, pointIndex, cachedData, LeftOrRight.left, lookCase); + } + return target; + } + + private static FindTargetMethod.Target getTarget(String stationId, int pointIndex, ICachedData cachedData, LeftOrRight leftOrRight, ILookCase lookCase) { + String pointId = cachedData.pointId(pointIndex, pointIndex); + String leftKey = IdUtil.createSurveyorRecordId(stationId, pointIndex, pointId, leftOrRight); + DataCategory dataCategory = cachedData.valueState(leftKey); + if (lookCase.whichCase(dataCategory)) { + return new FindTargetMethod.Target(pointIndex, pointIndex, leftOrRight); + } + return null; + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoMoveBackState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoMoveBackState.java new file mode 100644 index 0000000..fdec5ca --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoMoveBackState.java @@ -0,0 +1,161 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.surveyorrecord.SurveyorRecord; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.method.FindTargetMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.IdUtil; + +import com.bingce.controlnetwork.R; + +/** + * 回退 + * 移动到上一测量结点,伴随删除上次测量数据 + */ +public class _DoMoveBackState extends __BaseState { + + public _DoMoveBackState(int positionFragment, StateManagerHeightTraverse stateManager) { + super(StateType.doMoveBack, positionFragment, stateManager); + } + + @Override + public void enter(Bundle args) { + ICachedData cachedData = getCachedData(); + + final int pointCount = cachedData.pointCount(); + +// if (currentIndex < 0) { +// //如果测量结束,直接使用0号点盘右 +// int targetIndex = 0; +// LeftOrRight targetState = LeftOrRight.right; +// warningWithStandStill(cachedDataSource, currentCycle, targetIndex, targetState); +// return; +// } + + FindTargetMethod.Target deleteTartget = _DoMove2NextValidateState.findTarget(stationId(), pointCount, cachedData, + getCurrentIndex(), false, dataCategory -> !dataCategory.isEmptyData()); + + if (deleteTartget == null) { + goIdle(); + return; + } + + cachedData.deleteSurveyorRecord(stationId(), deleteTartget.itemIndex, deleteTartget.itemIndex, deleteTartget.leftOrRight); + + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + + + //直接跳转到目标点,开启新测量 + //更新测量进度 + setSurveyPosition(deleteTartget.itemIndex, deleteTartget.leftOrRight); + //清除测量状态,进入idle,但是不停止自动测量 + goIdle(); + //滚动 + scroll2(deleteTartget.itemIndex); + + +// if (dataCategory.isNeedResurvey()) {//如果当前位置是脏数据(说明正在补测) +// //回退到上一个脏数据位置 +// back2LastDirtyPosition(currentCycle, currentIndex, leftOrRight, pointCount, cachedDataSource); +// } else if (dataCategory.isEmptyData()) { +// //如果是空数据,说明测量进行中,查找上一个数据即可 +// //需要提醒用户数据会被删除 +// back2LastVisiblePosition(currentCycle, currentIndex, leftOrRight, pointCount, cachedDataSource); +// } else { +// //bug,不应该有这个地方 +// enterIdleAndClearSurveyStateAndResetAutoMode(true); +// } + } + + private void goIdle() { + enterIdleAndClearSurveyStateAndResetAutoMode(false); + } + + private void back2LastDirtyPosition(int currentCycle, int currentIndex, LeftOrRight leftOrRight, + int pointCount, ICachedData cachedData) { + //反向查找,但是找到目标后不能删除其数据,否则会造成「数据空洞」 + FindTargetMethod.Target target = FindTargetMethod.findTargetInSingleCycle( + stationId(), currentCycle, currentIndex, leftOrRight, pointCount, false, + DataCategory.dirtyAndSurveyed, + cachedData); + if (target == null) { + //在dirtyAndNeedReSurveyor数据没有修复完成之前,不能回退正常数据 + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } else { + //找到dirtyAndSurveyed数据, + //则将其校正为dirtyAndNeedReSurveyor + String pointId = cachedData.pointId(target.cycleIndex, target.itemIndex); + String recordKey = IdUtil.createSurveyorRecordId(stationId(), target.cycleIndex, pointId, target.leftOrRight); + SurveyorRecord surveyorRecord = cachedData.getSurveyorRecord(recordKey); + if (surveyorRecord != null) { + if (surveyorRecord.value1Status.isResurveyed()) { + surveyorRecord.value1Status = DataCategory.needResurvey(); + } + if (surveyorRecord.value2Status.isResurveyed()) { + surveyorRecord.value2Status = DataCategory.needResurvey(); + } + cachedData.updateCache(surveyorRecord); + //重置进度 + resetSchedule(_DoMoveBackState.this, + target.itemIndex, + target.leftOrRight); + } else { + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } + } + } + + private void back2LastVisiblePosition(int currentCycle, int currentIndex, LeftOrRight leftOrRight, + int pointCount, + ICachedData cachedData) { + + //从当前开始,向上查找第一个normal数据 + FindTargetMethod.Target target = + FindTargetMethod.findTargetInSingleCycle( + stationId(), currentCycle, currentIndex, leftOrRight, pointCount, false, + DataCategory.normalCategory(), + cachedData); + if (target == null) { + failureTipsWithAutoStandStill(getContext().getString(R.string.tips_no_more_record_2_rollback)); + return; + } + + warningWithStandStill(cachedData, + currentCycle, + target.itemIndex, + target.leftOrRight); + } + + private void warningWithStandStill( + ICachedData cachedDataSource, + int currentCycle, int itemIndex, LeftOrRight leftOrRight) { + optionTipsWithStandStill(getContext().getString(R.string.tips_will_resurvey_last_record), + () -> { + //删除当前数据 + cachedDataSource.deleteSurveyorRecord(stationId(), + currentCycle, itemIndex, leftOrRight); + //重置进度 + setSingleCycleSchedule(currentCycle, SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_NO_COMPLETED); + + resetSchedule(this, itemIndex, leftOrRight); + }); + } + + private static void resetSchedule(__BaseState state, + int targetIndex, + LeftOrRight leftOrRight) { + //设置测量目标点 + state.setSurveyPosition(targetIndex, leftOrRight); + //清除测量状态,进入idle + //如果当前已经关闭自动测量,就不重置自动测量开关(用户已经表示不想自动测量) + state.enterIdleAndClearSurveyStateAndResetAutoMode(!state.isAutoSurveyClosed()); + + state.scroll2(targetIndex); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoSurveyorState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoSurveyorState.java new file mode 100644 index 0000000..db91136 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoSurveyorState.java @@ -0,0 +1,243 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; + +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.ISurveyState; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorListener; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorRemindListener; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParam; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.surveyor.state.StateConstants; +import com.bingce.device.Device; +import com.bingce.totalstation.TotalStation; +import com.bingce.totalstation.protocol.south.SouthAndroidBtInterface; +import com.bingce.totalstation.protocol.topcon.TopconInterface; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import blankj.utilcode.util.ToastUtils; + +/** + * 先检测是否有其他未完成测回,继续本次测量将删除其他测回数据 + */ +class _DoSurveyorState extends __BaseState implements ISurveyorListener, ISurveyorRemindListener { + private final ISurveyState surveyState; + //最多测量次数,如果3次测量都没有获取正常数据,则跳过 + private static final int MAX_SURVEYOR_COUNT = 3; + private static int failureCount = 0; + private static final int RESULT_SUCCESS = 0; + private static final int RESULT_FAILURE_EXCEED_MAX = 1;//测量失败次数超出最大限制 + private static final int RESULT_FAILURE_ERROR = 2;//测量失败,又没有允许重复尝试 + private static final boolean allowTryWhenFailure = true;//在测量失败的时候,是否允许重新测量 + + private int measureTimeIndex = 0;//当前测点是第几次测量 + private boolean isAlreadyRemindUserAimingAtWire = false; + + private final Handler handler; + + public _DoSurveyorState(int positionFragment, StateManagerHeightTraverse stateManager, ISurveyState surveyState) { + super(StateType.doSurveyor, positionFragment, stateManager); + this.surveyState = surveyState; + handler = new Handler(Looper.getMainLooper()); + } + + @Override + public void enter(Bundle args) { + measureTimeIndex = 0; + + isAlreadyRemindUserAimingAtWire = false; + if (args != null) { + isAlreadyRemindUserAimingAtWire = args.getBoolean(StateConstants.KEY_IS_ROTATION_READY_STATE); + } + + ToleranceDetailRecord toleranceRecord = getToleranceRecord(); + ICycleRecorder cycleRecorder = getCycleRecorder(); + ICachedData cachedDataSource = getCachedData(); + + //3.其他测回没有正在测量数据,则在当前测回执行测量 + doSurveyor(); + } + + private void doSurveyor() { + failureCount = 0; + //判断设备是否连接 + if (surveyorImpl().isReady()) { + //发送测量信号 + SurveyStateEvent.postSurveying(positionFragment); + //注册接收测量数据 + surveyorImpl().prepareSurveyor(); + sendSurveyRequest(); + } else { + enterIdleAndClearSurveyStateAndResetAutoMode(true); + Device.getInstance().remindConnectDevice(); + } + } + + + @Override + public void onReceive(double originalHa, double originalVa, double sd, double clockwiseHa, double topVa, double hd, double vd) { + //重置错误读数 + failureCount = 0; + if (getSurveyorData().onSurveyor(originalHa, originalVa, sd, hd)) { + //测量数据成功,可以退出测量状态 + onSuccess(); + } else {//测量数据不完全,需要继续测量 + measureTimeIndex = 1;//更新测量索引 + refreshUI(); + + if (TotalStation.getInstance() instanceof TopconInterface) { + //这个仪器需要延迟500毫秒发送指令 + handler.postDelayed(this::sendSurveyRequest, 500); + } else if (TotalStation.getInstance() instanceof SouthAndroidBtInterface) { + handler.postDelayed(this::sendSurveyRequest, 100); + } else { + sendSurveyRequest(); + } + } + } + + @Override + public void onError(String errorMsg) { + TtsManager.getInstance().speak(errorMsg); + if (allowTryWhenFailure) {//允许重新测量 + if (!isLive()) { + return; + } + //测量出现异常,需要处理 + failureCount++; + if (failureCount >= MAX_SURVEYOR_COUNT) { + if (isAutoSurveyOpen()) { + TtsManager.getInstance().speak(Tools.getString(R.string.many_measure_failed)); + } + onCompleted(RESULT_FAILURE_EXCEED_MAX, Tools.getString(R.string.many_measure_failed_1)); + } else { + //再次尝试 + sendSurveyRequest(); + ToastUtils.showShort(Tools.getString(R.string.receive_data_time_out)); + } + } else { + onCompleted(RESULT_FAILURE_ERROR, errorMsg); + } + } + + private void sendSurveyRequest() { + int currentIndex = getCurrentIndex(); + if (currentIndex < 0) { + currentIndex = 0; + } + + SurveyorPoint surveyorPoint = getCachedData().getSurveyorPoint(getCycleRecorder().currentCycleIndex(), currentIndex); + ISurveyorData surveyorData = getSurveyorData(); + + surveyorImpl().requestSurveyor(new RequestSurveyorParam(getRequestSurveyorParamAuto(), getInstrumentHeight(), surveyorPoint, measureTimeIndex, + surveyorData.currentIndex(), surveyorData.leftOrRight(), isAlreadyRemindUserAimingAtWire)); + } + + private void onSuccess() { + onCompleted(RESULT_SUCCESS, ""); + } + + private void onCompleted(int result, String msg) { + //退出测量 + surveyorImpl().exitSurveyor(); + switch (result) { + case RESULT_SUCCESS://进入读数检测状态 + //检测是否处于「自动测量」 + if (!surveyState.isAutoSurveying()) { + SurveyStateEvent.postSuccess(positionFragment); + } + navigation2(StateType.checkTolerance); + break; + case RESULT_FAILURE_EXCEED_MAX: +// boolean allowAbandon = getStation().isAllowAbandon(); + if (SettingValueUtil.isAbandonPoint() && isAllowAbandonForVarifyIndex()) { + dealErrorDataSkip(msg); + } else { + dealErrorDataNormal(msg); + } + break; + case RESULT_FAILURE_ERROR: + dealErrorDataNormal(msg); + break; + default: + throw new RuntimeException("un reached state -- surveyor"); + } + } + + @Override + protected void quite() { + super.quite(); + surveyorImpl().exitSurveyor(); + } + + @Override + protected void resume() { + getSurveyorData().clearSurveyState(); + } + + @Override + public void remindUserAimingAtWire() { + //退出测量 + surveyorImpl().exitSurveyor(); + navigation2(StateType.doWellMeasureRotationReady); + } + + private void dealErrorDataNormal(String msg) { + SurveyStateEvent.postFailure(positionFragment); + //进入失败状态 + Bundle args = _SurveyorFailureState.args(msg); + navigation2(StateType.SurveyorFailure, args); + } + + private void dealErrorDataNormal(String msg, boolean isShowDialog) { + SurveyStateEvent.postFailure(positionFragment); + //进入失败状态 + Bundle args = _SurveyorFailureState.args(msg, isShowDialog); + navigation2(StateType.SurveyorFailure, args); + } + + private void dealErrorDataSkip(String msg) { + optionTipsCountDown(msg + Tools.getString(R.string.is_it_abandoned), + Tools.getString(R.string.switch_abandon), + Tools.getString(R.string.ignore), + () -> { + changeSkip(getCycleRecorder().currentCycleIndex(), getCurrentIndex()); + navigation2(StateType.isSingleCycleCompleted); + }, + () -> dealErrorDataNormal(msg, false), + () -> dealErrorDataNormal(msg, false)); + } + + /** + * 针对第一个点和闭合是否废弃验证 + * + * @return + */ + private boolean isAllowAbandonForVarifyIndex() { + boolean autoClose = getStation().isAutoClose(); + int pointCount = getCachedData().pointCount(); + boolean abandon = true; + int currentIndex = getCurrentIndex(); + if (autoClose) { + if (currentIndex == 0 || currentIndex == pointCount - 1) { + abandon = false; + } + } else { + if (currentIndex == 0) { + abandon = false; + } + } + return abandon; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoWellMeasureRotationReadyState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoWellMeasureRotationReadyState.java new file mode 100644 index 0000000..0a98059 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoWellMeasureRotationReadyState.java @@ -0,0 +1,30 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import com.bingce.controlapphelper.event.AutoSurveyorButtonVisibleEvent; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlnetwork.R; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import org.greenrobot.eventbus.EventBus; + +/** + * 钢丝测量旋转到位状态 + */ +class _DoWellMeasureRotationReadyState extends __BaseState { + + public _DoWellMeasureRotationReadyState(int positionFragment, StateManagerHeightTraverse stateManager) { + super(StateType.doWellMeasureRotationReady, positionFragment, stateManager); + } + + @Override + public void enter(Bundle args) { + runOnUI(() -> TtsManager.getInstance().speak(getContext().getString(R.string.please_aiming_at_alone_distance_point_then_measure))); + SurveyStateEvent.postIdle(positionFragment); + EventBus.getDefault().post(new AutoSurveyorButtonVisibleEvent(positionFragment, false, true)); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_IdleState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_IdleState.java new file mode 100644 index 0000000..0fe1e91 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_IdleState.java @@ -0,0 +1,135 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import androidx.annotation.NonNull; + +import com.bingce.controlapphelper.event.AutoSurveyorButtonVisibleEvent; +import com.bingce.controlapphelper.event.SurveyStateEvent; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.totalstation.ControlSurveyResult; +import com.bingce.utils.ThreadPoolUtil; + +import net.tatans.tensorflowtts.tts.TtsManager; + +import org.greenrobot.eventbus.EventBus; + +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; + +/** + * 空闲状态 + *

+ * 将刷新界面 + */ +class _IdleState extends __BaseState { + private final @NonNull + IAutoModeSwitcher autoModeSwitcher; + + public _IdleState(int positionFragment, StateManagerHeightTraverse stateManager, @NonNull IAutoModeSwitcher autoModeSwitcher) { + super(StateType.idle, positionFragment, stateManager); + this.autoModeSwitcher = autoModeSwitcher; + } + + @Override + public void enter(Bundle args) { + //1.刷新界面 + refreshUI(); + + refreshGoBackBtnEnable(); + + //3.当前cycle是否完成测量 + boolean completed = _CheckToleranceState.isSingleCycleCompleted( + stationId(), + getCurrentCycleIndex(), + getCachedData()); + + //4.检测是否满足自动测量条件 + ThreadPoolUtil.execute(() -> { + //判断当前条件是否满足自动测量 + + boolean haveAutoCondition = haveAutoCondition(); + + if (haveAutoCondition && autoModeSwitcher.isAutoModeOpen() && isLive()) { + navigation2(StateType.doSurveyor); + } else if (haveAutoCondition && autoModeSwitcher.isAutoModeNotSpecial() && !completed) { + //用户选择后会发送通知,更新测量按钮UI + tips4StartAutoSurvey(); + } else { +// ControlSurveyResult.isAbandon(autoMeasureReadyCode) != null//这个错误 + if (autoModeSwitcher.isAutoModeOpen()) { + autoModeSwitcher.resetAutoMode(); + } + postEvent(haveAutoCondition, autoModeSwitcher.isAutoModeOpen(), completed); + } + + }); + } + + /** + * 弹框提示用户是否开启自动测量 + */ + private void tips4StartAutoSurvey() { + runOnUI(() -> + TipsWith2OptionFragment.hardTips( + fragmentManager(), + lifecycleOwner(), + getContext().getString(R.string.tips_finish_study_should_auto_survey), + new TipsWith2OptionFragment.SimpleCallback() { + @Override + public void onConfirm() { + TtsManager.getInstance().speak(Tools.getString(R.string.start_auto_measure)); + autoModeSwitcher.openAutoMode(); + navigation2(StateType.doSurveyor); + + postEvent(true, true, false); + } + + @Override + public void onCancel() { + autoModeSwitcher.closeAutoMode(); + + postEvent(true, false, false); + } + + @Override + public void onIgnore() { + autoModeSwitcher.closeAutoMode(); + + postEvent(true, false, false); + } + } + )); + } + + private void postEvent(boolean isReadyAutoSurvey, boolean isOpenAutoSurvey, boolean isSingleCompleted) { + EventBus.getDefault().post(new AutoSurveyorButtonVisibleEvent(positionFragment, isReadyAutoSurvey, isOpenAutoSurvey)); + if (isSingleCompleted) { + SurveyStateEvent.postCompleted(positionFragment); + } else if (!isOpenAutoSurvey) { + SurveyStateEvent.postIdle(positionFragment); + } + } + + @Override + protected void resume() { + autoModeSwitcher.resetAutoMode(); + //刷新测量按钮 + boolean completed = _CheckToleranceState.isSingleCycleCompleted( + stationId(), + getCurrentCycleIndex(), + getCachedData()); + boolean isReady = autoModeSwitcher.isReadyAutoSurvey() == ControlSurveyResult.CODE_SUCCESS; + + postEvent(isReady, false, completed); + } + + private boolean haveAutoCondition() { + int autoMeasureReadyCode = autoModeSwitcher.isReadyAutoSurvey(); + return autoMeasureReadyCode == ControlSurveyResult.CODE_SUCCESS; + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_Init.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_Init.java new file mode 100644 index 0000000..a7508f2 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_Init.java @@ -0,0 +1,69 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.surveyor.method.FindTargetMethod; +import com.bingce.controlapphelper.surveyor.state.StateType; + +public class _Init extends __BaseState { + + public _Init(int positionFragment, StateManagerHeightTraverse stateManager) { + super(StateType.init, positionFragment, stateManager); + } + + @Override + public void enter(Bundle args) { + + if (getCachedData().pointCount() == 0) { + navigation2(StateType.idle); + return; + } + + //计算状态之前,重置测量状态 + getSurveyorData().clearSurveyStateAndPosition(); + + //1.先查找补测数据 + FindTargetMethod.Target target = lookTarget(dataCategory -> DataCategory.dirtyAndNeedReSurveyor == dataCategory); + if (target != null) { + lookTargetAfter(target.itemIndex, target.leftOrRight); + return; + } + //2.查找empty数据 + target = lookTarget(dataCategory -> DataCategory.empty == dataCategory); + if (target != null) { + //直接跳转到目标点,开启新测量 + lookTargetAfter(target.itemIndex, target.leftOrRight); + return; + } + //3. + String error = _CheckStationState._stationCheck(stationId(), getToleranceRecord(), getCachedData()); + if (error.isEmpty()) { + //设置测量进度(数据库存储) + setAllCycleSchedule(SurveyorScheduleConstants.STATUE_VALUE_CHECKED); + + //清除测量状态,进入idle,停止自动测量 + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } else { + _CheckStationState.showErrorTips(error, stationId(), getToleranceRecord().getCycleCount(), + getCachedData(), + this, + fragmentManager(), + lifecycleOwner()); + } + } + + private FindTargetMethod.Target lookTarget(ILookCase lookCase) { + return _DoMove2NextValidateState.findTarget(stationId(), + getCachedData().pointCount(), getCachedData(), 0, true, + lookCase); + } + + static void enter(StateManagerHeightTraverse stateManager, int cycleIndex) { + Bundle args = new Bundle(); + args.putInt(BundleConstants.KEY_CYCLE_INDEX, cycleIndex); + stateManager.enter(StateType.init, args); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_SurveyorFailureState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_SurveyorFailureState.java new file mode 100644 index 0000000..43527b3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_SurveyorFailureState.java @@ -0,0 +1,52 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.os.Bundle; + +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; + +/* + * 仪器导致的测量失败 + * + * 全站仪多次测量失败,进入该状态 + * */ +class _SurveyorFailureState extends __BaseState { + + public _SurveyorFailureState(int positionFragment, StateManagerHeightTraverse stateManager) { + super(StateType.SurveyorFailure, positionFragment, stateManager); + } + + @Override + public void enter(Bundle args) { + String error = ""; + boolean isShowDialog = true; + if (args != null) { + error = args.getString(KEY); + isShowDialog = args.getBoolean(KEY_IS_SHOW_DIALOG, true); + } + + if (isShowDialog) { + failureTipsWithAutoStandStill(error + Tools.getString(R.string.please_observe_target)); + } else { + enterIdleAndClearSurveyStateAndResetAutoMode(true); + } + + } + + private static final String KEY = "error"; + private static final String KEY_IS_SHOW_DIALOG = "KEY_IS_SHOW_DIALOG"; + + public static Bundle args(String error) { + Bundle args = new Bundle(); + args.putString(KEY, error); + return args; + } + + public static Bundle args(String error, boolean isShowDialog) { + Bundle args = new Bundle(); + args.putString(KEY, error); + args.putBoolean(KEY_IS_SHOW_DIALOG, isShowDialog); + return args; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/__BaseState.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/__BaseState.java new file mode 100644 index 0000000..a26c1e6 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/__BaseState.java @@ -0,0 +1,572 @@ +package com.bingce.controlnetwork.surveyor.state.heighttraverse; + +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; + +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleConstants; +import com.bingce.controlapphelper.datasource.database.schedule.SurveyorScheduleRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.model.BundleConstants; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.state.IAutoModeSwitcher; +import com.bingce.controlapphelper.surveyor.state.StateType; +import com.bingce.controlapphelper.surveyor.surveyor.ISurveyor; +import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParamAuto; +import com.bingce.controlapphelper.util.SurveyorCycleUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.TipsFragment; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; +import com.bingce.controlnetwork.fragment.stationsurvey.heighttraverse.MeasureHeightTraverseFragment; +import com.bingce.controlnetwork.surveyor.state.AutoModeType; +import com.bingce.utils.ThreadPoolUtil; + +import blankj.utilcode.util.ToastUtils; + +public abstract class __BaseState { + private final StateType type; + private final StateManagerHeightTraverse stateManager; + + protected final int positionFragment; + + /** + * 判断常量 + */ + private final int DEFAULT_AUTO_MODE = 0; + private final int RESET_AUTO_MODE = 1; + private final int CLOSE_AUTO_MODE = 2; + + public __BaseState(final StateType stateType, final int positionFragment, final StateManagerHeightTraverse stateManager) { + this.type = stateType; + this.positionFragment = positionFragment; + this.stateManager = stateManager; + } + + final protected StateType getType() { + return type; + } + + final protected @NonNull + ToleranceDetailRecord getToleranceRecord() { + return stateManager.toleranceRecord; + } + + final protected @NonNull + ISurveyorData getSurveyorData() { + return stateManager.surveyorData; + } + + private @NonNull + IAutoModeSwitcher autoModeRecorder() { + return stateManager; + } + + protected void lookTargetAfter(int targetIndex, LeftOrRight targetSurveyorState) { + //更新测量进度 + setSurveyPosition(targetIndex, targetSurveyorState); + + //清除测量状态,进入idle,但是不停止自动测量 + enterIdleAndClearSurveyStateAndResetAutoMode(false); + + //滚动 + scroll2(targetIndex); + } + + /** + * 设置测量位置 + */ + final protected void setSurveyPosition(int index, LeftOrRight leftOrRight) { + stateManager.surveyorData.setCurrentIndex(index); + stateManager.surveyorData.setLeftOrRight(leftOrRight); + //新增 + if (isAloneDistance()) + ToastUtils.showShort(getContext().getString(R.string.attention_point_is_alone_distance)); + } + + final protected ISurveyor surveyorImpl() { + return stateManager.surveyor; + } + + final protected @NonNull + ICachedData getCachedData() { + return stateManager.cachedData; + } + + SurveyorStationRecord getStation() { + return stateManager.stationRecord; + } + + RequestSurveyorParamAuto getRequestSurveyorParamAuto() { + return stateManager.getRequestSurveyorParamAuto(); + } + + void changeSkip(int cycleIndex, int index) { + SurveyorStationRecord station = getStation(); + //缓存点 + getCachedData().setPointAbandon(cycleIndex, index); + //数据库点 + String pointId = getCachedData().originalPointId(cycleIndex, index); + for (SurveyorPoint surveyorPoint : station.items) { + if (TextUtils.equals(pointId, surveyorPoint.getOriginalPointId())) { + surveyorPoint.setAbandon(true); + break; + } + } + ThreadPoolUtil.execute(() -> { + SurveyorDatabaseFactory.instance.getSurveyorStation().update(station); + }); + } + + final protected @NonNull + ICycleRecorder getCycleRecorder() { + return stateManager.cycleRecorder; + } + + final protected @NonNull + Context getContext() { + return stateManager.context; + } + + final protected void scroll2(int itemIndex) { + stateManager.scrollDelegate.onScrollTo(itemIndex); + } + + final protected void toast(String warning) { + ToastUtils.showShort(warning); + } + + final protected void toast(@StringRes int warning) { + ToastUtils.showShort(warning); + } + + public abstract void enter(Bundle args);//进入状态 + + final protected void navigation2(StateType stateType) { + stateManager.enter(stateType); + } + + final protected void navigation2(StateType stateType, Bundle args) { + stateManager.enter(stateType, args); + } + + final boolean isStationClosed() { + return stateManager.isStationAutoClosed(); + } + + final protected String stationId() { + return stateManager.stationId(); + } + + final protected FragmentManager fragmentManager() { + return stateManager.fragmentManager(); + } + + final protected LifecycleOwner lifecycleOwner() { + return stateManager.lifecycleOwner(); + } + + final protected void tips(String msg, Runnable runnable) { + if (stateManager.isDead()) { + return; + } + TipsFragment.noCancelAbleTips(stateManager.fragmentManager(), stateManager.lifecycleOwner(), + getContext(), + msg, + -1, + () -> { + if (runnable != null) { + runnable.run(); + } + }); + } + + /** + * 错误提示 + *

+ * 用户不能忽略,点击确定后自动「停留原地」 + */ + final protected void failureTipsWithAutoStandStill(String msg) { + if (stateManager.isDead()) { + return; + } + TipsFragment.noCancelAbleTips(stateManager.fragmentManager(), stateManager.lifecycleOwner(), + getContext(), + msg, + -1, + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true)); + } + + final protected void failureTipsWithAutoStandStill(String msg, Runnable runnable) { + if (stateManager.isDead()) { + return; + } + TipsFragment.noCancelAbleTips(stateManager.fragmentManager(), stateManager.lifecycleOwner(), + getContext(), + msg, + -1, + () -> { + if (runnable != null) + runnable.run(); + enterIdleAndClearSurveyStateAndResetAutoMode(true); + }); + } + + final protected void optionTipsWithStandStill(String msg, Runnable confirmCallback) { + optionTips(msg, null, null, + confirmCallback, + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true), + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true)); + } + + final protected void optionTips(String msg, + String confirmButton, + String cancelButton, + Runnable confirmCallback, + Runnable cancelCallback, + Runnable ignoreCallback) { + if (stateManager.isDead()) { + return; + } + TipsWith2OptionFragment.tips( + stateManager.fragmentManager(), + stateManager.lifecycleOwner(), + confirmButton, + cancelButton, + null, + msg, + new TipsWith2OptionFragment.IOperatorCallback() { + @Override + public void onConfirm() { + if (confirmCallback == null) { + return; + } + confirmCallback.run(); + } + + @Override + public void onCancel() { + if (cancelCallback == null) { + return; + } + cancelCallback.run(); + } + + @Override + public void onIgnore() { + if (ignoreCallback == null) { + return; + } + ignoreCallback.run(); + } + + @Override + public void onOption() { + } + }); + } + + final protected void optionTipsCountDown(String msg, + String confirmButton, + String cancelButton, + Runnable confirmCallback, + Runnable cancelCallback, + Runnable ignoreCallback) { + if (stateManager.isDead()) { + return; + } + + TipsWith2OptionFragment.tipsCountDownTime( + stateManager.fragmentManager(), + stateManager.lifecycleOwner(), + confirmButton, + cancelButton, + null, + msg, + new TipsWith2OptionFragment.IOperatorCallback() { + @Override + public void onConfirm() { + if (confirmCallback == null) { + return; + } + confirmCallback.run(); + } + + @Override + public void onCancel() { + if (cancelCallback == null) { + return; + } + cancelCallback.run(); + } + + @Override + public void onIgnore() { + if (ignoreCallback == null) { + return; + } + ignoreCallback.run(); + } + + @Override + public void onOption() { + } + }); + } + + protected final void option4Jump2OtherCycle4Resurvey(int cycleIndex) { + option4Jump2OtherCycle(cycleIndex, true); + } + + protected final void option4Jump2OtherEmptyCycle(int cycleIndex) { + option4Jump2OtherCycle(cycleIndex, false); + } + + private void option4Jump2OtherCycle(int cycleIndex, boolean resurveyOrEmpty) { + String msg = Tools.getString(R.string.there_is_empty_data_to_be_tested_hint); + if (resurveyOrEmpty) { + msg = Tools.getString(R.string.there_is_supplementary_data_to_be_tested_hint); + } + optionTips(Tools.getString(R.string.at) + SurveyorCycleUtil.cycleName(cycleIndex) + msg, + null, + null, + () -> { + //切换测回 + getCycleRecorder().changeCycleIndex(cycleIndex); + //数据库存储修改当前测回 + setCurrentCycle(cycleIndex); + //查找测量目标 + findTargetFromBeginInCurrentCycle(false, 0); + }, + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true), + () -> enterIdleAndClearSurveyStateAndResetAutoMode(true)); + } + + final protected void runOnUI(Runnable runnable) { + stateManager.runOnUI(runnable); + } + + final protected void runOnBackground(Runnable runnable) { + ThreadPoolUtil.execute(runnable); + } + + /** + * 设置测站的测回 + * + * @param cycle + */ + final protected void setCurrentCycle(int cycle) { + getCycleRecorder().changeCycleIndex(cycle); + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getCurrentCycleKey(stationId(), getScheduleKey(positionFragment)), + String.valueOf(cycle))); + } + + final protected void setCurrentCycleSync(int cycle) { + getCycleRecorder().changeCycleIndex(cycle); + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .recordSync( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getCurrentCycleKey(stationId(), getScheduleKey(positionFragment)), + String.valueOf(cycle))); + } + + final protected void setSingleCycleSchedule(int cycleIndex, String schedule) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getSingleCycleScheduleKey(stationId(), getScheduleKey(positionFragment), cycleIndex), + schedule)); + } + + final protected void setSingleCycleScheduleSync(int cycleIndex, String schedule) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .recordSync( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getSingleCycleScheduleKey(stationId(), getScheduleKey(positionFragment), cycleIndex), + schedule)); + } + + final protected void setAllCycleSchedule(String schedule) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .record( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), getScheduleKey(positionFragment)), + schedule)); + } + + final protected void setAllCycleScheduleSync(String schedule) { + SurveyorDatabaseFactory + .instance + .getScheduleDataSource() + .recordSync( + new SurveyorScheduleRecord( + SurveyorScheduleConstants.getAllCycleScheduleKey(stationId(), getScheduleKey(positionFragment)), + schedule)); + } + + /** + * 如果resetAutoSurveyState为true,将重置autoSurvey状态为unknown + */ + final protected void findTargetFromBeginInCurrentCycle(boolean resetAutoSurveyState, int startLookCycleIndex) { +// getSurveyorData().clearSurveyStateAndPosition(); + if (resetAutoSurveyState) { + autoModeRecorder().resetAutoMode(); + } + if (startLookCycleIndex != -1) { + Bundle bundle = new Bundle(); + bundle.putInt(BundleConstants.KEY_CYCLE_INDEX, startLookCycleIndex); + navigation2(StateType.doMove2NextValidate, bundle); + } else { + navigation2(StateType.doMove2NextValidate); + } + } + + final protected void enterIdleAndClearSurveyState() { + clearSurveyStateAndCloseAutoModeAndStandStill(DEFAULT_AUTO_MODE, + false, StateType.idle); + } + + /** + * 取消测量,会停在当前位置(索引+盘左or盘右),并进入idle + */ + final protected void enterIdleAndClearSurveyStateAndResetAutoMode(boolean resetAutoMode) { + clearSurveyStateAndCloseAutoModeAndStandStill(resetAutoMode ? RESET_AUTO_MODE : DEFAULT_AUTO_MODE, + false, StateType.idle); + } + + final protected void enterIdleAndClearSurveyorStatePosition() { + clearSurveyStateAndCloseAutoModeAndStandStill(DEFAULT_AUTO_MODE, + true, StateType.idle); + } + + final protected void enterStationCheckAndClearSurveyStateAndResetAutoMode() { + clearSurveyStateAndCloseAutoModeAndStandStill(RESET_AUTO_MODE, + false, StateType.checkStation); + } + + final protected void enterIdleAndClearSurveyStateAndCloseAutoMode() { + clearSurveyStateAndCloseAutoModeAndStandStill(CLOSE_AUTO_MODE, false, StateType.idle); + } + + /** + * @param autoMode + * @param clearPosition + * @param stateType + */ + private void clearSurveyStateAndCloseAutoModeAndStandStill(int autoMode, boolean clearPosition, StateType stateType) { + //重置或者关闭自动模式 + if (autoMode == RESET_AUTO_MODE) { + autoModeRecorder().resetAutoMode(); + } else if (autoMode == CLOSE_AUTO_MODE) { + autoModeRecorder().closeAutoMode(); + } + //更新测量进度标识 + if (clearPosition) { + getSurveyorData().clearSurveyStateAndPosition(); + } else { + getSurveyorData().clearSurveyState(); + } + //进入某个状态 + navigation2(stateType); + } + + protected void setAutoAndSurveyorState(AutoModeType autoModeType, boolean clearPosition) { + if (autoModeType == AutoModeType.start) { + autoModeRecorder().openAutoMode(); + } else if (autoModeType == AutoModeType.stop) { + autoModeRecorder().closeAutoMode(); + } else if (autoModeType == AutoModeType.unknown) { + autoModeRecorder().resetAutoMode(); + } + + if (clearPosition) { + getSurveyorData().clearSurveyStateAndPosition(); + } else { + getSurveyorData().clearSurveyState(); + } + } + + + /** + * 更新UI + */ + final protected void refreshUI() { + runOnUI(() -> getCachedData().notifyDateChange()); + } + + protected void quite() { + } + + protected void resume() { + } + + protected boolean isLive() { + return !stateManager.isDead(); + } + + protected boolean isAutoSurveyOpen() { + return stateManager.isAutoModeOpen(); + } + + protected boolean isAutoSurveyClosed() { + return stateManager.isAutoModeClose(); + } + + protected int getCurrentIndex() { + return stateManager.surveyorData.currentIndex(); + } + + protected int getCurrentCycleIndex() { +// return stateManager.cycleRecorder.currentCycleIndex(); + return getCurrentIndex(); + } + + protected boolean isAloneDistance() { + return stateManager.getCachedData().isAloneDistance(stateManager.getCurrentCycle(), getCurrentIndex()); + } + + protected double getInstrumentHeight() { + return stateManager.getInsturmentHeight(); + } + + protected void refreshGoBackBtnEnable() { + stateManager.refreshGoBackBtnEnable(); + } + + protected void resetLearnDataTag() { + getRequestSurveyorParamAuto().resetCodeAutoMeasureCondition(); + } + + public static String getScheduleKey(int positionFragment) { + if (positionFragment == MeasureHeightTraverseFragment.POSITION_BACK_PAGE) { + return SurveyorScheduleConstants.STATION_TYPE_HEIGHT_TRAVERSE_BACK; + } + return SurveyorScheduleConstants.STATION_TYPE_HEIGHT_TRAVERSE_FRONT; + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/surveyor/surveyor/TestDataSelectFragment.java b/app/src/main/java/com/bingce/controlnetwork/surveyor/surveyor/TestDataSelectFragment.java new file mode 100644 index 0000000..c8f1a2b --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/surveyor/surveyor/TestDataSelectFragment.java @@ -0,0 +1,74 @@ +package com.bingce.controlnetwork.surveyor.surveyor; + +import android.app.Dialog; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.surveyor.test.Test; + +import org.jetbrains.annotations.NotNull; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.adapter.IndexWithTextAdapter; +import com.bingce.controlnetwork.adapter.IndexWithTextAdapter; + +public class TestDataSelectFragment extends DialogFragment { + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_single_list_layout, container, false); + + // Set the adapter + if (view instanceof RecyclerView) { + RecyclerView recyclerView = (RecyclerView) view; + refreshRecyclerView(recyclerView); + } + + return view; + } + + @Override + public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + Dialog dialog = getDialog(); + if (dialog == null) { + return; + } + Window window = dialog.getWindow(); + if (window == null) { + return; + } + window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); + WindowManager.LayoutParams lps = window.getAttributes(); + lps.verticalMargin = 0.4F; + lps.horizontalMargin = 0.4F; + window.setAttributes(lps); + } + + protected void refreshRecyclerView(RecyclerView recyclerView) { + IndexWithTextAdapter adapter = new IndexWithTextAdapter<>(Test.items, new IndexWithTextAdapter.IOnItemClick() { + @Override + public void onItemClick(Test.Item item) { + Test.type = item; + dismiss(); + } + }); + recyclerView.setAdapter(adapter); + } + + public static void show(FragmentManager fragmentManager) { + TestDataSelectFragment fragment = new TestDataSelectFragment(); + fragment.show(fragmentManager, TestDataSelectFragment.class.getName()); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/ViewUtil.java b/app/src/main/java/com/bingce/controlnetwork/ui/ViewUtil.java new file mode 100644 index 0000000..944b6e4 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/ViewUtil.java @@ -0,0 +1,18 @@ +package com.bingce.controlnetwork.ui; + +import android.app.Activity; +import android.view.View; + +public class ViewUtil { + public static void setOnClick(View view, View.OnClickListener listener) { + if (view == null) { + return; + } + view.setOnClickListener(listener); + } + + public static void setOnClick(Activity activity, int view, View.OnClickListener listener) { + View v = activity.findViewById(view); + setOnClick(v, listener); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/WechatImagePicker.java b/app/src/main/java/com/bingce/controlnetwork/ui/WechatImagePicker.java new file mode 100644 index 0000000..9d47f67 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/WechatImagePicker.java @@ -0,0 +1,21 @@ +package com.bingce.controlnetwork.ui; + +import android.content.Context; + +import com.qingmei2.rximagepicker.entity.Result; +import com.qingmei2.rximagepicker.entity.sources.Camera; +import com.qingmei2.rximagepicker.entity.sources.Gallery; +import com.qingmei2.rximagepicker.ui.ICustomPickerConfiguration; +import com.qingmei2.rximagepicker_extension_wechat.ui.WechatImagePickerActivity; + +import io.reactivex.Observable; + +public interface WechatImagePicker { + + @Gallery(componentClazz = WechatImagePickerActivity.class, + openAsFragment = false) + Observable openGallery(Context context, ICustomPickerConfiguration config); + + @Camera + Observable openCamera(Context context); +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/helper/OnActivityTouchListener.java b/app/src/main/java/com/bingce/controlnetwork/ui/helper/OnActivityTouchListener.java new file mode 100644 index 0000000..419c603 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/helper/OnActivityTouchListener.java @@ -0,0 +1,7 @@ +package com.bingce.controlnetwork.ui.helper; + +import android.view.MotionEvent; + +public interface OnActivityTouchListener { + void getTouchCoordinates(MotionEvent ev); +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/helper/RecyclerTouchListener.java b/app/src/main/java/com/bingce/controlnetwork/ui/helper/RecyclerTouchListener.java new file mode 100644 index 0000000..6687e8c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/helper/RecyclerTouchListener.java @@ -0,0 +1,918 @@ +package com.bingce.controlnetwork.ui.helper; + +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.app.Activity; +import android.graphics.Rect; +import android.os.Handler; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.animation.DecelerateInterpolator; +import android.widget.ListView; + +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener, OnActivityTouchListener { + private static final String TAG = "RecyclerTouchListener"; + final Handler handler = new Handler(); + Activity act; + List unSwipeableRows; + /* + * independentViews are views on the foreground layer which when clicked, act "independent" from the foreground + * ie, they are treated separately from the "row click" action + */ + List independentViews; + List unClickableRows; + List optionViews; + Set ignoredViewTypes; + // Cached ViewConfiguration and system-wide constant values + private final int touchSlop; + private final int minFlingVel; + private final int maxFlingVel; + private final long ANIMATION_STANDARD = 300; + private final long ANIMATION_CLOSE = 150; + // Fixed properties + private final RecyclerView rView; + // private SwipeListener mSwipeListener; + private int bgWidth = 1; + private final int bgWidthLeft = 1; // 1 and not 0 to prevent dividing by zero + // Transient properties + // private List mPendingDismisses = new ArrayList<>(); + private int mDismissAnimationRefCount = 0; + private float touchedX; + private float touchedY; + private boolean isFgSwiping; + private int mSwipingSlop; + private VelocityTracker mVelocityTracker; + private int touchedPosition; + private View touchedView; + private boolean mPaused; + private boolean bgVisible, fgPartialViewClicked; + private int bgVisiblePosition; + private View bgVisibleView; + private boolean isRViewScrolling; + private int heightOutsideRView, screenHeight; + private boolean mLongClickPerformed; + // Foreground view (to be swiped), Background view (to show) + private View fgView; + private View bgView; + //view ID + private int fgViewID; + private int bgViewID, bgViewIDLeft; + private ArrayList fadeViews; + private OnRowClickListener mRowClickListener; + private OnRowLongClickListener mRowLongClickListener; + private OnSwipeOptionsClickListener mBgClickListener, mBgClickListenerLeft; + // user choices + private boolean clickable = false; + private boolean longClickable = false; + private boolean swipeable = false; + private final boolean swipeableLeftOptions = false; + private final int LONG_CLICK_DELAY = 800; + private boolean longClickVibrate; + Runnable mLongPressed = new Runnable() { + public void run() { + if (!longClickable) + return; + + mLongClickPerformed = true; + + if (!bgVisible && touchedPosition >= 0 && !unClickableRows.contains(touchedPosition) && !isRViewScrolling) { + if (longClickVibrate) { +// Vibrator vibe = (Vibrator) act.getSystemService(Context.VIBRATOR_SERVICE); +// vibe.vibrate(100); // do we really need to add vibrate service + } + mRowLongClickListener.onRowLongClicked(touchedPosition); + } + } + }; + + public RecyclerTouchListener(Activity a, RecyclerView recyclerView) { + this.act = a; + ViewConfiguration vc = ViewConfiguration.get(recyclerView.getContext()); + touchSlop = vc.getScaledTouchSlop(); + minFlingVel = vc.getScaledMinimumFlingVelocity() * 16; + maxFlingVel = vc.getScaledMaximumFlingVelocity(); + rView = recyclerView; + bgVisible = false; + bgVisiblePosition = -1; + bgVisibleView = null; + fgPartialViewClicked = false; + unSwipeableRows = new ArrayList<>(); + unClickableRows = new ArrayList<>(); + ignoredViewTypes = new HashSet<>(); + independentViews = new ArrayList<>(); + optionViews = new ArrayList<>(); + fadeViews = new ArrayList<>(); + isRViewScrolling = false; + +// mSwipeListener = listener; + + rView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + /** + * This will ensure that this RecyclerTouchListener is paused during recycler view scrolling. + * If a scroll listener is already assigned, the caller should still pass scroll changes through + * to this listener. + */ + setEnabled(newState != RecyclerView.SCROLL_STATE_DRAGGING); + + /** + * This is used so that clicking a row cannot be done while scrolling + */ + isRViewScrolling = newState != RecyclerView.SCROLL_STATE_IDLE; + } + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + + } + }); + } + + /** + * Enables or disables (pauses or resumes) watching for swipe-to-dismiss gestures. + * + * @param enabled Whether or not to watch for gestures. + */ + public void setEnabled(boolean enabled) { + mPaused = !enabled; + } + + @Override + public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent motionEvent) { + return handleTouchEvent(motionEvent); + } + + @Override + public void onTouchEvent(RecyclerView rv, MotionEvent motionEvent) { + handleTouchEvent(motionEvent); + } + + /*////////////// Clickable ////////////////////*/ + + public RecyclerTouchListener setClickable(OnRowClickListener listener) { + this.clickable = true; + this.mRowClickListener = listener; + return this; + } + + public RecyclerTouchListener setClickable(boolean clickable) { + this.clickable = clickable; + return this; + } + + public RecyclerTouchListener setLongClickable(boolean vibrate, OnRowLongClickListener listener) { + this.longClickable = true; + this.mRowLongClickListener = listener; + this.longClickVibrate = vibrate; + return this; + } + + public RecyclerTouchListener setLongClickable(boolean longClickable) { + this.longClickable = longClickable; + return this; + } + + public RecyclerTouchListener setIndependentViews(Integer... viewIds) { + this.independentViews = new ArrayList<>(Arrays.asList(viewIds)); + return this; + } + + public RecyclerTouchListener setUnClickableRows(Integer... rows) { + this.unClickableRows = new ArrayList<>(Arrays.asList(rows)); + return this; + } + + public RecyclerTouchListener setIgnoredViewTypes(Integer... viewTypes) { + ignoredViewTypes.clear(); + ignoredViewTypes.addAll(Arrays.asList(viewTypes)); + return this; + } + + //////////////// Swipeable //////////////////// + + public RecyclerTouchListener setSwipeable(int foregroundID, int backgroundID, OnSwipeOptionsClickListener listener) { + this.swipeable = true; + if (fgViewID != 0 && foregroundID != fgViewID) + throw new IllegalArgumentException("foregroundID does not match previously set ID"); + fgViewID = foregroundID; + bgViewID = backgroundID; + this.mBgClickListener = listener; + + if (act instanceof RecyclerTouchListenerHelper) + ((RecyclerTouchListenerHelper) act).setOnActivityTouchListener(this); + + DisplayMetrics displaymetrics = new DisplayMetrics(); + act.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); + screenHeight = displaymetrics.heightPixels; + + return this; + } + + public RecyclerTouchListener setSwipeable(boolean value) { + this.swipeable = value; + if (!value) + invalidateSwipeOptions(); + return this; + } + + public RecyclerTouchListener setSwipeOptionViews(Integer... viewIds) { + this.optionViews = new ArrayList<>(Arrays.asList(viewIds)); + return this; + } + + public RecyclerTouchListener setUnSwipeableRows(Integer... rows) { + this.unSwipeableRows = new ArrayList<>(Arrays.asList(rows)); + return this; + } + + //////////////// Fade Views //////////////////// + + // Set views which are faded out as fg is opened + public RecyclerTouchListener setViewsToFade(Integer... viewIds) { + this.fadeViews = new ArrayList<>(Arrays.asList(viewIds)); + return this; + } + + // the entire foreground is faded out as it is opened + public RecyclerTouchListener setFgFade() { + if (!fadeViews.contains(fgViewID)) + this.fadeViews.add(fgViewID); + return this; + } + + //-------------- Checkers for preventing ---------------// + + private boolean isIndependentViewClicked(MotionEvent motionEvent) { + for (int i = 0; i < independentViews.size(); i++) { + if (touchedView != null) { + Rect rect = new Rect(); + int x = (int) motionEvent.getRawX(); + int y = (int) motionEvent.getRawY(); + touchedView.findViewById(independentViews.get(i)).getGlobalVisibleRect(rect); + if (rect.contains(x, y)) { + return false; + } + } + } + return true; + } + + private int getOptionViewID(MotionEvent motionEvent) { + for (int i = 0; i < optionViews.size(); i++) { + if (touchedView != null) { + Rect rect = new Rect(); + int x = (int) motionEvent.getRawX(); + int y = (int) motionEvent.getRawY(); + touchedView.findViewById(optionViews.get(i)).getGlobalVisibleRect(rect); + if (rect.contains(x, y)) { + return optionViews.get(i); + } + } + } + return -1; + } + + private int getIndependentViewID(MotionEvent motionEvent) { + for (int i = 0; i < independentViews.size(); i++) { + if (touchedView != null) { + Rect rect = new Rect(); + int x = (int) motionEvent.getRawX(); + int y = (int) motionEvent.getRawY(); + touchedView.findViewById(independentViews.get(i)).getGlobalVisibleRect(rect); + if (rect.contains(x, y)) { + return independentViews.get(i); + } + } + } + return -1; + } + + @Override + public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { + + } + + public void invalidateSwipeOptions() { + bgWidth = 1; + } + + public void openSwipeOptions(int position) { + if (!swipeable || rView.getChildAt(position) == null + || unSwipeableRows.contains(position) || shouldIgnoreAction(position)) + return; + if (bgWidth < 2) { + if (act.findViewById(bgViewID) != null) + bgWidth = act.findViewById(bgViewID).getWidth(); + heightOutsideRView = screenHeight - rView.getHeight(); + } + touchedPosition = position; + touchedView = rView.getChildAt(position); + fgView = touchedView.findViewById(fgViewID); + bgView = touchedView.findViewById(bgViewID); + bgView.setMinimumHeight(fgView.getHeight()); + + closeVisibleBG(null); + animateFG(touchedView, Animation.OPEN, ANIMATION_STANDARD); + bgVisible = true; + bgVisibleView = fgView; + bgVisiblePosition = touchedPosition; + } + + @Deprecated + public void closeVisibleBG() { + if (bgVisibleView == null) { + Log.e(TAG, "No rows found for which background options are visible"); + return; + } + bgVisibleView.animate() + .translationX(0) + .setDuration(ANIMATION_CLOSE) + .setListener(null); + + animateFadeViews(bgVisibleView, 1f, ANIMATION_CLOSE); + bgVisible = false; + bgVisibleView = null; + bgVisiblePosition = -1; + } + + public void closeVisibleBG(final OnSwipeListener mSwipeCloseListener) { + if (bgVisibleView == null) { + Log.e(TAG, "No rows found for which background options are visible"); + return; + } + final ObjectAnimator translateAnimator = ObjectAnimator.ofFloat(bgVisibleView, + View.TRANSLATION_X, 0f); + translateAnimator.setDuration(ANIMATION_CLOSE); + translateAnimator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + if (mSwipeCloseListener != null) + mSwipeCloseListener.onSwipeOptionsClosed(); + translateAnimator.removeAllListeners(); + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }); + translateAnimator.start(); + + animateFadeViews(bgVisibleView, 1f, ANIMATION_CLOSE); + bgVisible = false; + bgVisibleView = null; + bgVisiblePosition = -1; + } + + private void animateFadeViews(View downView, float alpha, long duration) { + if (fadeViews != null) { + for (final int viewID : fadeViews) { + downView.findViewById(viewID).animate() + .alpha(alpha) + .setDuration(duration); + } + } + } + + private void animateFG(View downView, Animation animateType, long duration) { + if (animateType == Animation.OPEN) { + ObjectAnimator translateAnimator = ObjectAnimator.ofFloat( + fgView, View.TRANSLATION_X, -bgWidth); + translateAnimator.setDuration(duration); + translateAnimator.setInterpolator(new DecelerateInterpolator(1.5f)); + translateAnimator.start(); + animateFadeViews(downView, 0f, duration); + } else if (animateType == Animation.CLOSE) { + ObjectAnimator translateAnimator = ObjectAnimator.ofFloat( + fgView, View.TRANSLATION_X, 0f); + translateAnimator.setDuration(duration); + translateAnimator.setInterpolator(new DecelerateInterpolator(1.5f)); + translateAnimator.start(); + animateFadeViews(downView, 1f, duration); + } + } + + private void animateFG(View downView, final Animation animateType, long duration, + final OnSwipeListener mSwipeCloseListener) { + final ObjectAnimator translateAnimator; + if (animateType == Animation.OPEN) { + translateAnimator = ObjectAnimator.ofFloat(fgView, View.TRANSLATION_X, -bgWidth); + translateAnimator.setDuration(duration); + translateAnimator.setInterpolator(new DecelerateInterpolator(1.5f)); + translateAnimator.start(); + animateFadeViews(downView, 0f, duration); + } else /*if (animateType == Animation.CLOSE)*/ { + translateAnimator = ObjectAnimator.ofFloat(fgView, View.TRANSLATION_X, 0f); + translateAnimator.setDuration(duration); + translateAnimator.setInterpolator(new DecelerateInterpolator(1.5f)); + translateAnimator.start(); + animateFadeViews(downView, 1f, duration); + } + + translateAnimator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + if (mSwipeCloseListener != null) { + if (animateType == Animation.OPEN) + mSwipeCloseListener.onSwipeOptionsOpened(); + else if (animateType == Animation.CLOSE) + mSwipeCloseListener.onSwipeOptionsClosed(); + } + translateAnimator.removeAllListeners(); + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }); + } + + private boolean handleTouchEvent(MotionEvent motionEvent) { + if (swipeable && bgWidth < 2) { +// bgWidth = rView.getWidth(); + if (act.findViewById(bgViewID) != null) + bgWidth = act.findViewById(bgViewID).getWidth(); + + heightOutsideRView = screenHeight - rView.getHeight(); + } + + switch (motionEvent.getActionMasked()) { + + // When finger touches screen + case MotionEvent.ACTION_DOWN: { + if (mPaused) { + break; + } + + // Find the child view that was touched (perform a hit test) + Rect rect = new Rect(); + int childCount = rView.getChildCount(); + int[] listViewCoords = new int[2]; + rView.getLocationOnScreen(listViewCoords); + // x and y values respective to the recycler view + int x = (int) motionEvent.getRawX() - listViewCoords[0]; + int y = (int) motionEvent.getRawY() - listViewCoords[1]; + View child; + + /* + * check for every child (row) in the recycler view whether the touched co-ordinates belong to that + * respective child and if it does, register that child as the touched view (touchedView) + */ + for (int i = 0; i < childCount; i++) { + child = rView.getChildAt(i); + child.getHitRect(rect); + if (rect.contains(x, y)) { + touchedView = child; + break; + } + } + + if (touchedView != null) { + touchedX = motionEvent.getRawX(); + touchedY = motionEvent.getRawY(); + touchedPosition = rView.getChildAdapterPosition(touchedView); + + if (shouldIgnoreAction(touchedPosition)) { + touchedPosition = ListView.INVALID_POSITION; + return false; // <-- guard here allows for ignoring events, allowing more than one view type and preventing NPE + } + + if (longClickable) { + mLongClickPerformed = false; + handler.postDelayed(mLongPressed, LONG_CLICK_DELAY); + } + if (swipeable) { + mVelocityTracker = VelocityTracker.obtain(); + mVelocityTracker.addMovement(motionEvent); + fgView = touchedView.findViewById(fgViewID); + bgView = touchedView.findViewById(bgViewID); +// bgView.getLayoutParams().height = fgView.getHeight(); + bgView.setMinimumHeight(fgView.getHeight()); + + /* + * bgVisible is true when the options menu is opened + * This block is to register fgPartialViewClicked status - Partial view is the view that is still + * shown on the screen if the options width is < device width + */ + if (bgVisible && fgView != null) { + handler.removeCallbacks(mLongPressed); + x = (int) motionEvent.getRawX(); + y = (int) motionEvent.getRawY(); + fgView.getGlobalVisibleRect(rect); + fgPartialViewClicked = rect.contains(x, y); + } else { + fgPartialViewClicked = false; + } + } + } + + /* + * If options menu is shown and the touched position is not the same as the row for which the + * options is displayed - close the options menu for the row which is displaying it + * (bgVisibleView and bgVisiblePosition is used for this purpose which registers which view and + * which position has it's options menu opened) + */ + x = (int) motionEvent.getRawX(); + y = (int) motionEvent.getRawY(); + rView.getHitRect(rect); + if (swipeable && bgVisible && touchedPosition != bgVisiblePosition) { + handler.removeCallbacks(mLongPressed); + closeVisibleBG(null); + } + break; + } + + case MotionEvent.ACTION_CANCEL: { + handler.removeCallbacks(mLongPressed); + if (mLongClickPerformed) + break; + + if (mVelocityTracker == null) { + break; + } + if (swipeable) { + if (touchedView != null && isFgSwiping) { + // cancel + animateFG(touchedView, Animation.CLOSE, ANIMATION_STANDARD); + } + mVelocityTracker.recycle(); + mVelocityTracker = null; + isFgSwiping = false; + bgView = null; + } + touchedX = 0; + touchedY = 0; + touchedView = null; + touchedPosition = ListView.INVALID_POSITION; + break; + } + + // When finger is lifted off the screen (after clicking, flinging, swiping, etc..) + case MotionEvent.ACTION_UP: { + handler.removeCallbacks(mLongPressed); + if (mLongClickPerformed) + break; + + if (mVelocityTracker == null && swipeable) { + break; + } + if (touchedPosition < 0) + break; + + // swipedLeft and swipedRight are true if the user swipes in the respective direction (no conditions) + boolean swipedLeft = false; + boolean swipedRight = false; + /* + * swipedLeftProper and swipedRightProper are true if user swipes in the respective direction + * and if certain conditions are satisfied (given some few lines below) + */ + boolean swipedLeftProper = false; + boolean swipedRightProper = false; + + float mFinalDelta = motionEvent.getRawX() - touchedX; + + // if swiped in a direction, make that respective variable true + if (isFgSwiping) { + swipedLeft = mFinalDelta < 0; + swipedRight = mFinalDelta > 0; + } + + /* + * If the user has swiped more than half of the width of the options menu, or if the + * velocity of swiping is between min and max fling values + * "proper" variable are set true + */ + if (Math.abs(mFinalDelta) > bgWidth / 2 && isFgSwiping) { + swipedLeftProper = mFinalDelta < 0; + swipedRightProper = mFinalDelta > 0; + } else if (swipeable) { + mVelocityTracker.addMovement(motionEvent); + mVelocityTracker.computeCurrentVelocity(1000); + float velocityX = mVelocityTracker.getXVelocity(); + float absVelocityX = Math.abs(velocityX); + float absVelocityY = Math.abs(mVelocityTracker.getYVelocity()); + if (minFlingVel <= absVelocityX && absVelocityX <= maxFlingVel + && absVelocityY < absVelocityX && isFgSwiping) { + // dismiss only if flinging in the same direction as dragging + swipedLeftProper = (velocityX < 0) == (mFinalDelta < 0); + swipedRightProper = (velocityX > 0) == (mFinalDelta > 0); + } + } + + ///////// Manipulation of view based on the 4 variables mentioned above /////////// + + // if swiped left properly and options menu isn't already visible, animate the foreground to the left + if (swipeable && !swipedRight && swipedLeftProper && touchedPosition != RecyclerView.NO_POSITION + && !unSwipeableRows.contains(touchedPosition) && !bgVisible) { + + final View downView = touchedView; // touchedView gets null'd before animation ends + final int downPosition = touchedPosition; + ++mDismissAnimationRefCount; + //TODO - speed + animateFG(touchedView, Animation.OPEN, ANIMATION_STANDARD); + bgVisible = true; + bgVisibleView = fgView; + bgVisiblePosition = downPosition; + } + // else if swiped right properly when options menu is visible, close the menu and bring the foreground + // to it's original position + else if (swipeable && !swipedLeft && swipedRightProper && touchedPosition != RecyclerView.NO_POSITION + && !unSwipeableRows.contains(touchedPosition) && bgVisible) { + // dismiss + final View downView = touchedView; // touchedView gets null'd before animation ends + final int downPosition = touchedPosition; + + ++mDismissAnimationRefCount; + //TODO - speed + animateFG(touchedView, Animation.CLOSE, ANIMATION_STANDARD); + bgVisible = false; + bgVisibleView = null; + bgVisiblePosition = -1; + } + // else if swiped left incorrectly (not satisfying the above conditions), animate the foreground back to + // it's original position (spring effect) + else if (swipeable && swipedLeft && !bgVisible) { + // cancel + final View tempBgView = bgView; + animateFG(touchedView, Animation.CLOSE, ANIMATION_STANDARD, new OnSwipeListener() { + @Override + public void onSwipeOptionsClosed() { + if (tempBgView != null) + tempBgView.setVisibility(View.VISIBLE); + } + + @Override + public void onSwipeOptionsOpened() { + + } + }); + + bgVisible = false; + bgVisibleView = null; + bgVisiblePosition = -1; + } + // else if swiped right incorrectly (not satisfying the above conditions), animate the foreground to + // it's open position (spring effect) + else if (swipeable && swipedRight && bgVisible) { + // cancel + animateFG(touchedView, Animation.OPEN, ANIMATION_STANDARD); + bgVisible = true; + bgVisibleView = fgView; + bgVisiblePosition = touchedPosition; + } + // This case deals with an error where the user can swipe left, then right + // really fast and the fg is stuck open - so in that case we close the fg + else if (swipeable && swipedRight && !bgVisible) { + // cancel + animateFG(touchedView, Animation.CLOSE, ANIMATION_STANDARD); + bgVisible = false; + bgVisibleView = null; + bgVisiblePosition = -1; + } + // This case deals with an error where the user can swipe right, then left + // really fast and the fg is stuck open - so in that case we open the fg + else if (swipeable && swipedLeft && bgVisible) { + // cancel + animateFG(touchedView, Animation.OPEN, ANIMATION_STANDARD); + bgVisible = true; + bgVisibleView = fgView; + bgVisiblePosition = touchedPosition; + } + + // if clicked + else if (!swipedRight && !swipedLeft) { + // if partial foreground view is clicked (see ACTION_DOWN) bring foreground back to original position + // bgVisible is true automatically since it's already checked in ACTION_DOWN block + if (swipeable && fgPartialViewClicked) { + animateFG(touchedView, Animation.CLOSE, ANIMATION_STANDARD); + bgVisible = false; + bgVisibleView = null; + bgVisiblePosition = -1; + } + // On Click listener for rows + else if (clickable && !bgVisible && touchedPosition >= 0 && !unClickableRows.contains(touchedPosition) + && isIndependentViewClicked(motionEvent) && !isRViewScrolling) { + mRowClickListener.onRowClicked(touchedPosition); + } + // On Click listener for independent views inside the rows + else if (clickable && !bgVisible && touchedPosition >= 0 && !unClickableRows.contains(touchedPosition) + && !isIndependentViewClicked(motionEvent) && !isRViewScrolling) { + final int independentViewID = getIndependentViewID(motionEvent); + if (independentViewID >= 0) + mRowClickListener.onIndependentViewClicked(independentViewID, touchedPosition); + } + // On Click listener for background options + else if (swipeable && bgVisible && !fgPartialViewClicked) { + final int optionID = getOptionViewID(motionEvent); + if (optionID >= 0 && touchedPosition >= 0) { + final int downPosition = touchedPosition; + closeVisibleBG(new OnSwipeListener() { + @Override + public void onSwipeOptionsClosed() { + mBgClickListener.onSwipeOptionClicked(optionID, downPosition); + } + + @Override + public void onSwipeOptionsOpened() { + + } + }); + } + } + } + } + // if clicked and not swiped + + if (swipeable) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } + touchedX = 0; + touchedY = 0; + touchedView = null; + touchedPosition = ListView.INVALID_POSITION; + isFgSwiping = false; + bgView = null; + break; + + // when finger is moving across the screen (and not yet lifted) + case MotionEvent.ACTION_MOVE: { + if (mLongClickPerformed) + break; + if (mVelocityTracker == null || mPaused || !swipeable) { + break; + } + + mVelocityTracker.addMovement(motionEvent); + float deltaX = motionEvent.getRawX() - touchedX; + float deltaY = motionEvent.getRawY() - touchedY; + + /* + * isFgSwiping variable which is set to true here is used to alter the swipedLeft, swipedRightProper + * variables in "ACTION_UP" block by checking if user is actually swiping at present or not + */ + if (!isFgSwiping && Math.abs(deltaX) > touchSlop && Math.abs(deltaY) < Math.abs(deltaX) / 2) { + handler.removeCallbacks(mLongPressed); + isFgSwiping = true; + mSwipingSlop = (deltaX > 0 ? touchSlop : -touchSlop); + } + + // This block moves the foreground along with the finger when swiping + if (swipeable && isFgSwiping && !unSwipeableRows.contains(touchedPosition)) { + if (bgView == null) { + bgView = touchedView.findViewById(bgViewID); + bgView.setVisibility(View.VISIBLE); + } + // if fg is being swiped left + if (deltaX < touchSlop && !bgVisible) { + float translateAmount = deltaX - mSwipingSlop; +// if ((Math.abs(translateAmount) > bgWidth ? -bgWidth : translateAmount) <= 0) { + // swipe fg till width of bg. If swiped further, nothing happens (stalls at width of bg) + fgView.setTranslationX(Math.abs(translateAmount) > bgWidth ? -bgWidth : translateAmount); + if (fgView.getTranslationX() > 0) fgView.setTranslationX(0); +// } + + // fades all the fadeViews gradually to 0 alpha as dragged + if (fadeViews != null) { + for (int viewID : fadeViews) { + touchedView.findViewById(viewID).setAlpha(1 - (Math.abs(translateAmount) / bgWidth)); + } + } + } + // if fg is being swiped right + else if (deltaX > 0 && bgVisible) { + // for closing rightOptions + if (bgVisible) { + float translateAmount = (deltaX - mSwipingSlop) - bgWidth; + + // swipe fg till it reaches original position. If swiped further, nothing happens (stalls at 0) + fgView.setTranslationX(translateAmount > 0 ? 0 : translateAmount); + + // fades all the fadeViews gradually to 0 alpha as dragged + if (fadeViews != null) { + for (int viewID : fadeViews) { + touchedView.findViewById(viewID).setAlpha(1 - (Math.abs(translateAmount) / bgWidth)); + } + } + } + // for opening leftOptions + else { + float translateAmount = (deltaX - mSwipingSlop) - bgWidth; + + // swipe fg till it reaches original position. If swiped further, nothing happens (stalls at 0) + fgView.setTranslationX(translateAmount > 0 ? 0 : translateAmount); + + // fades all the fadeViews gradually to 0 alpha as dragged + if (fadeViews != null) { + for (int viewID : fadeViews) { + touchedView.findViewById(viewID).setAlpha(1 - (Math.abs(translateAmount) / bgWidth)); + } + } + } + } + return true; + } + // moves the fg slightly to give the illusion of an "unswipeable" row + else if (swipeable && isFgSwiping && unSwipeableRows.contains(touchedPosition)) { + if (deltaX < touchSlop && !bgVisible) { + float translateAmount = deltaX - mSwipingSlop; + if (bgView == null) + bgView = touchedView.findViewById(bgViewID); + + if (bgView != null) + bgView.setVisibility(View.GONE); + + // swipe fg till width of bg. If swiped further, nothing happens (stalls at width of bg) + fgView.setTranslationX(translateAmount / 5); + if (fgView.getTranslationX() > 0) fgView.setTranslationX(0); + + // fades all the fadeViews gradually to 0 alpha as dragged +// if (fadeViews != null) { +// for (int viewID : fadeViews) { +// touchedView.findViewById(viewID).setAlpha(1 - (Math.abs(translateAmount) / bgWidth)); +// } +// } + } + return true; + } + break; + } + } + return false; + } + + /** + * Gets coordinates from Activity and closes any + * swiped rows if touch happens outside the recycler view + */ + @Override + public void getTouchCoordinates(MotionEvent ev) { + int y = (int) ev.getRawY(); + if (swipeable && bgVisible && ev.getActionMasked() == MotionEvent.ACTION_DOWN + && y < heightOutsideRView) closeVisibleBG(null); + } + + private boolean shouldIgnoreAction(int touchedPosition) { + return rView == null || ignoredViewTypes.contains(rView.getAdapter().getItemViewType(touchedPosition)); + } + + private enum Animation { + OPEN, CLOSE + } + + /////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////// Interfaces ///////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////// + + public interface OnRowClickListener { + void onRowClicked(int position); + + void onIndependentViewClicked(int independentViewID, int position); + } + + public interface OnRowLongClickListener { + void onRowLongClicked(int position); + } + + public interface OnSwipeOptionsClickListener { + void onSwipeOptionClicked(int viewID, int position); + } + + public interface RecyclerTouchListenerHelper { + void setOnActivityTouchListener(OnActivityTouchListener listener); + } + + public interface OnSwipeListener { + void onSwipeOptionsClosed(); + + void onSwipeOptionsOpened(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/DraggableTextViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/DraggableTextViewHolder.java new file mode 100644 index 0000000..81db07d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/DraggableTextViewHolder.java @@ -0,0 +1,32 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.StationDetailItem; + +import com.bingce.controlnetwork.R; + +public class DraggableTextViewHolder extends RecyclerView.ViewHolder { + public final TextView title; + public final ImageView dragBar; + + public DraggableTextViewHolder(@NonNull View itemView) { + super(itemView); + title = itemView.findViewById(R.id.title); + dragBar = itemView.findViewById(R.id.drag_bar); + } + + public static void update(DraggableTextViewHolder draggableTextViewHolder, StationDetailItem item, boolean editable) { + draggableTextViewHolder.title.setText(item.getName()); + if (StationDetailItem.ITEM_TYPE_STATION_ITEM.equals(item.getType()) || !editable) { + draggableTextViewHolder.dragBar.setVisibility(View.GONE); + } else { + draggableTextViewHolder.dragBar.setVisibility(View.VISIBLE); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/DraggableViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/DraggableViewHolder.java new file mode 100644 index 0000000..d8b69f7 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/DraggableViewHolder.java @@ -0,0 +1,14 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; + +import androidx.annotation.NonNull; + +import org.jetbrains.annotations.NotNull; + +public class DraggableViewHolder extends IndexTextViewHolder { + + public DraggableViewHolder(@NonNull @NotNull View itemView) { + super(itemView); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/GroupParentViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/GroupParentViewHolder.java new file mode 100644 index 0000000..3daafea --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/GroupParentViewHolder.java @@ -0,0 +1,21 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; + +public class GroupParentViewHolder extends RecyclerView.ViewHolder { + public final TextView name; + public final ImageView expandIcon; + + public GroupParentViewHolder(@NonNull View itemView) { + super(itemView); + expandIcon = itemView.findViewById(R.id.expand_icon); + name = itemView.findViewById(R.id.groupName); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextSelectableViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextSelectableViewHolder.java new file mode 100644 index 0000000..ed8705b --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextSelectableViewHolder.java @@ -0,0 +1,21 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.ImageView; + +import androidx.annotation.NonNull; + +import com.bingce.controlnetwork.R; + +public class IndexTextSelectableViewHolder extends IndexTextViewHolder { + public final ImageView status; + public final View mask; + public final View item; + + public IndexTextSelectableViewHolder(@NonNull View itemView) { + super(itemView); + status = itemView.findViewById(R.id.status); + mask = itemView.findViewById(R.id.mask); + item = itemView.findViewById(R.id.item); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextViewHolder.java new file mode 100644 index 0000000..1231cb8 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextViewHolder.java @@ -0,0 +1,20 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; + +public class IndexTextViewHolder extends RecyclerView.ViewHolder { + public final TextView index; + public final TextView name; + + public IndexTextViewHolder(@NonNull View itemView) { + super(itemView); + index = itemView.findViewById(R.id.index); + name = itemView.findViewById(R.id.text); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextWithPrefixViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextWithPrefixViewHolder.java new file mode 100644 index 0000000..a979be9 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/IndexTextWithPrefixViewHolder.java @@ -0,0 +1,17 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.bingce.controlnetwork.R; + +public class IndexTextWithPrefixViewHolder extends IndexTextViewHolder { + public final TextView prefix; + + public IndexTextWithPrefixViewHolder(@NonNull View itemView) { + super(itemView); + prefix = itemView.findViewById(R.id.prefix); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/ItemWellViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/ItemWellViewHolder.java new file mode 100644 index 0000000..b35ec36 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/ItemWellViewHolder.java @@ -0,0 +1,40 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.StationDetailItem; + +import com.bingce.controlnetwork.R; + +public class ItemWellViewHolder extends RecyclerView.ViewHolder { + public final TextView title; + public final ImageView dragBar; + + public ItemWellViewHolder(@NonNull View itemView) { + super(itemView); + title = itemView.findViewById(R.id.title); + dragBar = itemView.findViewById(R.id.drag_bar); + } + + public static void update(ItemWellViewHolder holder, StationDetailItem item, boolean editable, IUIBuilderDelegate iuiBuilderDelegate) { + holder.title.setText(item.getName()); + if (StationDetailItem.ITEM_TYPE_STATION_ITEM.equals(item.getType()) || !editable) { + holder.dragBar.setVisibility(View.GONE); + } else { + holder.dragBar.setVisibility(View.VISIBLE); + } + + if (iuiBuilderDelegate != null) { + iuiBuilderDelegate.build(item.getType(), holder); + } + } + + public interface IUIBuilderDelegate { + void build(String itemType, ItemWellViewHolder holder); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/KeyBoolViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/KeyBoolViewHolder.java new file mode 100644 index 0000000..078fd4c --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/KeyBoolViewHolder.java @@ -0,0 +1,21 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.CheckBox; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; + +public class KeyBoolViewHolder extends RecyclerView.ViewHolder { + public final TextView key; + public final CheckBox checkBox; + + public KeyBoolViewHolder(@NonNull View itemView) { + super(itemView); + key = itemView.findViewById(R.id.name); + checkBox = itemView.findViewById(R.id.checkBox); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/KeyValueViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/KeyValueViewHolder.java new file mode 100644 index 0000000..e31e537 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/KeyValueViewHolder.java @@ -0,0 +1,20 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; + +public class KeyValueViewHolder extends RecyclerView.ViewHolder { + public final TextView key; + public final TextView value; + + public KeyValueViewHolder(@NonNull View itemView) { + super(itemView); + key = itemView.findViewById(R.id.name); + value = itemView.findViewById(R.id.value); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/PrismManageViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/PrismManageViewHolder.java new file mode 100644 index 0000000..255fe93 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/PrismManageViewHolder.java @@ -0,0 +1,22 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; + +public class PrismManageViewHolder extends RecyclerView.ViewHolder { + public final TextView tvName; + public final TextView tvType; + public final TextView tvConstant; + + public PrismManageViewHolder(@NonNull View itemView) { + super(itemView); + tvName = itemView.findViewById(R.id.tvName); + tvType = itemView.findViewById(R.id.tvType); + tvConstant = itemView.findViewById(R.id.tvConstant); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/StationAdjustItemViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/StationAdjustItemViewHolder.java new file mode 100644 index 0000000..1b25b39 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/StationAdjustItemViewHolder.java @@ -0,0 +1,24 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; + +public class StationAdjustItemViewHolder extends RecyclerView.ViewHolder { + public final TextView pointName; + public final TextView horAngle; + public final TextView verAngle; + public final TextView distance; + + public StationAdjustItemViewHolder(@NonNull View itemView) { + super(itemView); + pointName = itemView.findViewById(R.id.point_name); + horAngle = itemView.findViewById(R.id.hor_angle); + verAngle = itemView.findViewById(R.id.ver_angle); + distance = itemView.findViewById(R.id.distance); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/StationGroupItemViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/StationGroupItemViewHolder.java new file mode 100644 index 0000000..f504ac0 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/StationGroupItemViewHolder.java @@ -0,0 +1,46 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.StationDetailItem; + +import org.jetbrains.annotations.NotNull; + +import com.bingce.controlnetwork.R; + +public class StationGroupItemViewHolder extends RecyclerView.ViewHolder { + public final TextView title; + public final View pick; + public final View switchView; + + public StationGroupItemViewHolder(@NonNull @NotNull View itemView) { + super(itemView); + title = itemView.findViewById(R.id.groupName); + pick = itemView.findViewById(R.id.pick_station_point); + switchView = itemView.findViewById(R.id.switch_station_point); + } + + public static void update(StationGroupItemViewHolder surveyorStationSetupGroupParentViewHolder, + StationDetailItem item, + boolean adjustable, + IUIBuilderDelegate builderDelegate) { + surveyorStationSetupGroupParentViewHolder.title.setText(item.getName()); + //判断是否需要un enable添加按钮 + if (!adjustable) { + surveyorStationSetupGroupParentViewHolder.pick.setVisibility(View.GONE); + surveyorStationSetupGroupParentViewHolder.switchView.setVisibility(View.GONE); + } else { + if (builderDelegate != null) { + builderDelegate.build(item.getType(), surveyorStationSetupGroupParentViewHolder); + } + } + } + + public interface IUIBuilderDelegate { + void build(String itemType, StationGroupItemViewHolder surveyorStationSetupGroupParentViewHolder); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataAloneDistanceViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataAloneDistanceViewHolder.java new file mode 100644 index 0000000..2b3524a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataAloneDistanceViewHolder.java @@ -0,0 +1,243 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.content.Context; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.datasource.database.alonedistance.AloneDistanceRecord; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.CachedDataAloneDistance; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.utils.Util; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class SurveyorDataAloneDistanceViewHolder extends RecyclerView.ViewHolder { + private final Context context; + private final TextView leftLabel;//平距或斜距 + + private final TextView pointName; + private final TextView heightValue; + private final TextView prismValue; + + private final List distanceViews; + private final TextView tvFirstRound1, tvFirstRound2, tvFirstRound3, tvFirstRound4; + private final TextView tvSecondRound1, tvSecondRound2, tvSecondRound3, tvSecondRound4; + + private final TextView tvFirstRoundAverageDistance, tvSecondRoundAverageDistance;//第一,第二测回中值 + private final TextView tvFirstRound2D, tvSecondRound2D;//第一,第二测回2D + + private final View selectMask;//黄框 + + private final int ROUND_NUM = 2; + private final int EVERY_ROUND_NUM = 4; + + private final List realDistanceValues = new ArrayList<>(); + + public SurveyorDataAloneDistanceViewHolder(Context context, @NonNull @NotNull View itemView) { + super(itemView); + this.context = context; + + pointName = itemView.findViewById(R.id.pointName); + heightValue = itemView.findViewById(R.id.height_value); + prismValue = itemView.findViewById(R.id.prism_value); + + leftLabel = itemView.findViewById(R.id.left_label); + + tvFirstRound1 = itemView.findViewById(R.id.tvFirstRound1); + tvFirstRound2 = itemView.findViewById(R.id.tvFirstRound2); + tvFirstRound3 = itemView.findViewById(R.id.tvFirstRound3); + tvFirstRound4 = itemView.findViewById(R.id.tvFirstRound4); + tvSecondRound1 = itemView.findViewById(R.id.tvSecondRound1); + tvSecondRound2 = itemView.findViewById(R.id.tvSecondRound2); + tvSecondRound3 = itemView.findViewById(R.id.tvSecondRound3); + tvSecondRound4 = itemView.findViewById(R.id.tvSecondRound4); + + distanceViews = new ArrayList<>(); + distanceViews.add(tvFirstRound1); + distanceViews.add(tvFirstRound2); + distanceViews.add(tvFirstRound3); + distanceViews.add(tvFirstRound4); + distanceViews.add(tvSecondRound1); + distanceViews.add(tvSecondRound2); + distanceViews.add(tvSecondRound3); + distanceViews.add(tvSecondRound4); + + + tvFirstRoundAverageDistance = itemView.findViewById(R.id.tvFirstRoundAverageDistance); + tvSecondRoundAverageDistance = itemView.findViewById(R.id.tvSecondRoundAverageDistance); + tvFirstRound2D = itemView.findViewById(R.id.tvFirstRound2D); + tvSecondRound2D = itemView.findViewById(R.id.tvSecondRound2D); + + selectMask = itemView.findViewById(R.id.mask); + } + + public void setup(int itemIndex, + String stationId, + boolean showSlopDistance, + CachedDataAloneDistance cachedData, + ICycleRecorder cycleRecorder, + ISurveyorData surveyorData) { + if (showSlopDistance) { + leftLabel.setText(R.string.distance_slope); + } else { + leftLabel.setText(R.string.distance_horizontal); + } + int currentCycleIndex = cycleRecorder.currentCycleIndex(); + int currentSurveyorIndex = surveyorData.currentIndex(); + //设置当前测量状态标识 + if (currentSurveyorIndex == itemIndex) { + selectMask.setVisibility(View.VISIBLE); + } else { + selectMask.setVisibility(View.GONE); + } + + //初始化 + initDefault(); + + //设置值 + pointName.setText(cachedData.pointName(currentCycleIndex, itemIndex)); + heightValue.setText(cachedData.getPrismHeight(currentCycleIndex, itemIndex)); + prismValue.setText(cachedData.getPrismTypeName(currentCycleIndex, itemIndex)); + + //先清空下realDistanceValues保证数据不错乱,注意位置在前面 + clearRealDistanceValues(); + List distanceDatas = getDistanceDataFromCacheData(cachedData, stationId, currentCycleIndex, itemIndex); + setDistanceViewData(distanceDatas, currentSurveyorIndex == itemIndex); + + //设置中值和2d + if (!realDistanceValues.isEmpty()) { + int distanceSize = realDistanceValues.size(); + int hanNum = distanceSize / EVERY_ROUND_NUM; + if (hanNum >= 1) { + //有可以显示的中值 + if (hanNum == ROUND_NUM) { + //当满足两测回都可以显示中值和2d的时候 + setFirstRound2DAndAverageDistance(); + setSecondRound2DAndAverageDistance(); + } else { + //当满足第一测回可以显示中值和2d的时候 + setFirstRound2DAndAverageDistance(); + } + } + } + + } + + /** + * 从缓存数据中读取距离数据 + * + * @param cachedData + * @param stationId + * @param currentCycleIndex + * @param itemIndex + * @return + */ + private List getDistanceDataFromCacheData(CachedDataAloneDistance cachedData, String stationId, int currentCycleIndex, int itemIndex) { + List distanceValues = null; + String pointId = cachedData.pointId(currentCycleIndex, itemIndex); + String recordId = IdUtil.createSurveyorRecordId(stationId, currentCycleIndex, pointId, LeftOrRight.left); + AloneDistanceRecord aloneDistanceRecord = cachedData.getAloneDistanceRecord(recordId); + if (aloneDistanceRecord != null) { + distanceValues = aloneDistanceRecord.distanceValues; + } + return distanceValues; + } + + private void setFirstRound2DAndAverageDistance() { + List doubles1 = realDistanceValues.subList(0, EVERY_ROUND_NUM); + Double averageFirstRound = Tools.calculateCollectionDoubleAverage(doubles1); + Double maxSubMinFirstRound = Tools.calculateCollectionMaxSubMin(doubles1); + setAverageDistanceText(tvFirstRoundAverageDistance, averageFirstRound); + set2DText(tvFirstRound2D, maxSubMinFirstRound); + } + + private void setSecondRound2DAndAverageDistance() { + List doubles2 = realDistanceValues.subList(EVERY_ROUND_NUM, realDistanceValues.size()); + Double averageSecondRound = Tools.calculateCollectionDoubleAverage(doubles2); + Double maxSubMinSecondRound = Tools.calculateCollectionMaxSubMin(doubles2); + setAverageDistanceText(tvSecondRoundAverageDistance, averageSecondRound); + set2DText(tvSecondRound2D, maxSubMinSecondRound); + } + + + private void setTextColor(TextView tv, int value) { + tv.setTextColor(context.getResources().getColor(value)); + } + + private void setDistance(TextView tv, double distance) { + String distanceS; + if (distance == 0) { + distanceS = ORIGINAL_VALUE; + } else { + distanceS = Util.formatDouble2String(distance, SettingValueUtil.getLengthDecimalPoint()); + } + tv.setText(distanceS); + } + + private void set2DText(TextView tv, double value) { + tv.setText(String.format("%smm", Util.formatDouble2String(value * 1000, 1))); + } + + private void setAverageDistanceText(TextView tv, double value) { + tv.setText(Util.formatDouble2String(value, SettingValueUtil.getLengthDecimalPoint())); + } + + /** + * 初始化 + */ + private void initDefault() { + leftLabel.setTextColor(context.getResources().getColor(R.color.value_1_normal)); + + initDefaultDistanceViewsData(); + + tvFirstRoundAverageDistance.setText(ORIGINAL_VALUE); + tvSecondRoundAverageDistance.setText(ORIGINAL_VALUE); + + tvFirstRound2D.setText(ORIGINAL_VALUE); + tvSecondRound2D.setText(ORIGINAL_VALUE); + } + + private void initDefaultDistanceViewsData() { + for (TextView textView : distanceViews) { + setDistance(textView, 0); + setTextColor(textView, R.color.value_1_normal); + } + } + + /** + * 设置view的数据 + * + * @param aloneDistanceValues + * @param isSelected + */ + private void setDistanceViewData(List aloneDistanceValues, boolean isSelected) { + if (aloneDistanceValues == null) return; + for (int i = 0; i < aloneDistanceValues.size(); i++) { + Double aDouble = aloneDistanceValues.get(i); + TextView textView = distanceViews.get(i); + setDistance(textView, aDouble); + setTextColor(textView, isSelected ? R.color.value_1_selected : R.color.value_1_normal); + //存一下 + realDistanceValues.add(aDouble); + } + } + + private void clearRealDistanceValues() { + realDistanceValues.clear(); + } + + + private static final String ORIGINAL_VALUE = "-"; +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataViewHolder.java new file mode 100644 index 0000000..744c8f8 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataViewHolder.java @@ -0,0 +1,408 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.content.Context; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.AverageValueMethod; +import com.bingce.controlapphelper.surveyor.method.RadianMethod; +import com.bingce.controlapphelper.surveyor.method.ValueOf2cMethod; +import com.bingce.controlapphelper.surveyor.method.model.CacheResult; +import com.bingce.controlapphelper.surveyor.method.model.SdAngleValueType; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.utils.Util; + +import org.jetbrains.annotations.NotNull; + +public class SurveyorDataViewHolder extends RecyclerView.ViewHolder { + private final Context context; + private final TextView leftLabel; + private final TextView rightLabel; + + public final TextView pointName; + public final TextView heightValue; + public final TextView prismValue; + + public final TextView leftAngleHor1; + public final TextView leftAngleHor2; + public final TextView leftAngleVer1; + public final TextView leftAngleVer2; + public final TextView leftDistance1; + public final TextView leftDistance2; + + public final TextView rightAngleHor1; + public final TextView rightAngleHor2; + public final TextView rightAngleVer1; + public final TextView rightAngleVer2; + public final TextView rightDistance1; + public final TextView rightDistance2; + + public final TextView averageHorAngle; + public final TextView averageVerAngle; + public final TextView averageDistance; + + public final View selectMask; + + public final TextView _2c; + public final TextView _i; + public final TextView _2d; + + public final TextView distanceTitle; + private final View itemView; + + public SurveyorDataViewHolder(Context context, @NonNull @NotNull View itemView) { + super(itemView); + this.context = context; + leftLabel = itemView.findViewById(R.id.left_label); + rightLabel = itemView.findViewById(R.id.right_label); + + pointName = itemView.findViewById(R.id.pointName); + heightValue = itemView.findViewById(R.id.height_value); + prismValue = itemView.findViewById(R.id.prism_value); + + leftAngleHor1 = itemView.findViewById(R.id.left_angle_hor_1); + leftAngleHor2 = itemView.findViewById(R.id.left_angle_hor_2); + leftAngleVer1 = itemView.findViewById(R.id.left_angle_ver_1); + leftAngleVer2 = itemView.findViewById(R.id.left_angle_ver_2); + leftDistance1 = itemView.findViewById(R.id.left_distance_1); + leftDistance2 = itemView.findViewById(R.id.left_distance_2); + + rightAngleHor1 = itemView.findViewById(R.id.right_angle_hor_1); + rightAngleHor2 = itemView.findViewById(R.id.right_angle_hor_2); + rightAngleVer1 = itemView.findViewById(R.id.right_angle_ver_1); + rightAngleVer2 = itemView.findViewById(R.id.right_angle_ver_2); + rightDistance1 = itemView.findViewById(R.id.right_distance_1); + rightDistance2 = itemView.findViewById(R.id.right_distance_2); + + averageHorAngle = itemView.findViewById(R.id.average_angle_hor); + averageVerAngle = itemView.findViewById(R.id.average_angle_ver); + averageDistance = itemView.findViewById(R.id.average_distance); + + selectMask = itemView.findViewById(R.id.mask); + + _2c = itemView.findViewById(R.id.value_2c); + _i = itemView.findViewById(R.id.value_i); + _2d = itemView.findViewById(R.id.value_2d); + + distanceTitle = itemView.findViewById(R.id.distance_title); + this.itemView = itemView; + } + + public void setup(int itemIndex, + String stationId, + boolean showSlopDistance, + ICachedData cachedData, + ICycleRecorder cycleRecorder, + ISurveyorData surveyorData) { + if (showSlopDistance) { + distanceTitle.setText(R.string.distance_slope); + } else { + distanceTitle.setText(R.string.distance_horizontal); + } + int currentCycleIndex = cycleRecorder.currentCycleIndex(); + int currentSurveyorIndex = surveyorData.currentIndex(); + //设置当前测量状态标识 + if (currentSurveyorIndex == itemIndex) { + //当前非跳过点背景黄边白色 + selectMask.setBackground(Tools.getDrawable(R.drawable.select_mask)); + } else { + if (cachedData.isPointAbandon(currentCycleIndex, itemIndex)) { + selectMask.setBackground(Tools.getDrawable(R.drawable.bg_gray_3)); + } else { + selectMask.setBackgroundColor(Tools.getColor(R.color.white)); + } + } + + //初始化 + setValue(TYPE_LEFT1, ORIGINAL_VALUE, ORIGINAL_VALUE, ORIGINAL_VALUE); + setValue(TYPE_LEFT2, ORIGINAL_VALUE, ORIGINAL_VALUE, ORIGINAL_VALUE); + setValue(TYPE_RIGHT1, ORIGINAL_VALUE, ORIGINAL_VALUE, ORIGINAL_VALUE); + setValue(TYPE_RIGHT2, ORIGINAL_VALUE, ORIGINAL_VALUE, ORIGINAL_VALUE); + leftLabel.setTextColor(context.getResources().getColor(R.color.value_1_normal)); + setTextColor(TYPE_LEFT1, R.color.value_1_normal); + setTextColor(TYPE_LEFT2, R.color.value_2_normal); + rightLabel.setTextColor(context.getResources().getColor(R.color.value_1_normal)); + setTextColor(TYPE_RIGHT1, R.color.value_1_normal); + setTextColor(TYPE_RIGHT2, R.color.value_2_normal); + + averageHorAngle.setText(ORIGINAL_VALUE); + averageVerAngle.setText(ORIGINAL_VALUE); + averageDistance.setText(ORIGINAL_VALUE); + + _2c.setText(ORIGINAL_VALUE); + _i.setText(ORIGINAL_VALUE); + _2d.setText(ORIGINAL_VALUE); + + boolean aloneDistance = cachedData.isAloneDistance(currentCycleIndex, itemIndex); + + //如果当前正在测量,使用缓存数据设置相应信息 + LeftOrRight surveyorState = surveyorData.leftOrRight(); + if (currentSurveyorIndex == itemIndex) { + if (surveyorState == LeftOrRight.left) { + if (surveyorData.hasSurveyor1()) { + setValue(aloneDistance, TYPE_LEFT1, surveyorData.getAngleHor1(), surveyorData.getAngleVer1(), surveyorData.getDistance1()); + } + if (surveyorData.hasSurveyor2()) { + setValue(aloneDistance, TYPE_LEFT2, surveyorData.getAngleHor2(), surveyorData.getAngleVer2(), surveyorData.getDistance2()); + } + //设置颜色 + setTextColor(TYPE_LEFT1, R.color.value_1_selected); + setTextColor(TYPE_LEFT2, R.color.value_2_selected); + leftLabel.setTextColor(context.getResources().getColor(R.color.value_1_selected)); + } else if (surveyorState == LeftOrRight.right) { + if (surveyorData.hasSurveyor1()) { + setValue(aloneDistance, TYPE_RIGHT1, surveyorData.getAngleHor1(), surveyorData.getAngleVer1(), surveyorData.getDistance1()); + } + if (surveyorData.hasSurveyor2()) { + setValue(aloneDistance, TYPE_RIGHT2, surveyorData.getAngleHor2(), surveyorData.getAngleVer2(), surveyorData.getDistance2()); + } + //设置颜色 + setTextColor(TYPE_RIGHT1, R.color.value_1_selected); + setTextColor(TYPE_RIGHT2, R.color.value_2_selected); + rightLabel.setTextColor(context.getResources().getColor(R.color.value_1_selected)); + } + } + + //根据测量次数,控制数据显示 + setValue2Visibility(surveyorData.surveyorCount() > 1); + + pointName.setText(cachedData.pointName(currentCycleIndex, itemIndex)); + heightValue.setText(cachedData.getPrismHeight(currentCycleIndex, itemIndex)); + prismValue.setText(cachedData.getPrismTypeName(currentCycleIndex, itemIndex)); + + //重新监听observe---但是根据当前测量状态,需要排除一些数据监听 + boolean skipLeft1 = false, skipLeft2 = false, skipRight1 = false, skipRight2 = false; + //根据内存缓存排除 + if (currentSurveyorIndex == itemIndex) { + if (surveyorState == LeftOrRight.left) { + if (surveyorData.hasSurveyor1()) { + skipLeft1 = true; + } + if (surveyorData.hasSurveyor2() || surveyorData.surveyorCount() == 1) { + skipLeft2 = true; + } + } else if (surveyorState == LeftOrRight.right) { + if (surveyorData.hasSurveyor1()) { + skipRight1 = true; + } + if (surveyorData.hasSurveyor2() || surveyorData.surveyorCount() == 1) { + skipRight2 = true; + } + } + } + + String pointId = cachedData.pointId(currentCycleIndex, itemIndex); + String leftRecordId = IdUtil.createSurveyorRecordId(stationId, currentCycleIndex, pointId, LeftOrRight.left); + if (!skipLeft1) { + DataCategory dataCategory = cachedData.valueState(leftRecordId, 0); + if (!dataCategory.isEmptyData()) { + setValue(aloneDistance, TYPE_LEFT1, + cachedData.angleHor1(leftRecordId), + cachedData.angleVer1(leftRecordId), + cachedData.distance1(leftRecordId)); + } + if (dataCategory.isNeedResurvey()) { + setTextColor(TYPE_LEFT1, R.color.value_dirty); + } else if (dataCategory == DataCategory.dirtyAndSurveyed) { + setTextColor(TYPE_LEFT1, R.color.value_resurveyed); + } + } + if (!skipLeft2) { + DataCategory dataCategory = cachedData.valueState(leftRecordId, 1); + if (!dataCategory.isEmptyData()) { + setValue(aloneDistance, TYPE_LEFT2, + cachedData.angleHor2(leftRecordId), + cachedData.angleVer2(leftRecordId), + cachedData.distance2(leftRecordId)); + } + if (dataCategory.isNeedResurvey()) { + setTextColor(TYPE_LEFT2, R.color.value_dirty); + } else if (dataCategory == DataCategory.dirtyAndSurveyed) { + setTextColor(TYPE_LEFT2, R.color.value_resurveyed); + } + } + String rightRecordId = IdUtil.createSurveyorRecordId(stationId, currentCycleIndex, pointId, LeftOrRight.right); + if (!skipRight1) { + DataCategory dataCategory = cachedData.valueState(rightRecordId, 0); + if (!dataCategory.isEmptyData()) { + setValue(aloneDistance, TYPE_RIGHT1, + cachedData.angleHor1(rightRecordId), + cachedData.angleVer1(rightRecordId), + cachedData.distance1(rightRecordId)); + } + if (dataCategory.isNeedResurvey()) { + setTextColor(TYPE_RIGHT1, R.color.value_dirty); + } else if (dataCategory == DataCategory.dirtyAndSurveyed) { + setTextColor(TYPE_RIGHT1, R.color.value_resurveyed); + } + } + if (!skipRight2) { + DataCategory dataCategory = cachedData.valueState(rightRecordId, 1); + if (!dataCategory.isEmptyData()) { + setValue(aloneDistance, TYPE_RIGHT2, + cachedData.angleHor2(rightRecordId), + cachedData.angleVer2(rightRecordId), + cachedData.distance2(rightRecordId)); + } + if (dataCategory.isNeedResurvey()) { + setTextColor(TYPE_RIGHT2, R.color.value_dirty); + } else if (dataCategory == DataCategory.dirtyAndSurveyed) { + setTextColor(TYPE_RIGHT2, R.color.value_resurveyed); + } + } + + + //均值(中值) + int surveyorCount = surveyorData.surveyorCount(); + CacheResult horAngleLeftAndRightAverageValue = AverageValueMethod.leftAndRightValue(SdAngleValueType.horAngle, + leftRecordId, + rightRecordId, surveyorCount, cachedData); + + if (horAngleLeftAndRightAverageValue.validate) { + double radian = RadianMethod.formatRadian(horAngleLeftAndRightAverageValue.value); + averageHorAngle.setText(RadianMethod.dmsStringOf(radian)); + } else { + averageHorAngle.setText(ORIGINAL_VALUE); + } + + + CacheResult verAngleLeftAndRightAverageValue = AverageValueMethod.leftAndRightValue(SdAngleValueType.verAngle, + leftRecordId, + rightRecordId, surveyorCount, cachedData); + if (verAngleLeftAndRightAverageValue.validate) {//显示天顶距 + averageVerAngle.setText(RadianMethod.dmsStringOf(Math.PI / 2 - verAngleLeftAndRightAverageValue.value)); + } else { + averageVerAngle.setText(ORIGINAL_VALUE); + } + + CacheResult distanceLeftAndRightAverageValue = AverageValueMethod.leftAndRightValue(SdAngleValueType.distance, + leftRecordId, + rightRecordId, surveyorCount, cachedData); + if (aloneDistance) { + averageDistance.setText(ORIGINAL_VALUE); + } else { + if (distanceLeftAndRightAverageValue.validate) { + averageDistance.setText(Util.formatDouble2String(distanceLeftAndRightAverageValue.value, + SettingValueUtil.getLengthDecimalPoint())); + } else { + averageDistance.setText(ORIGINAL_VALUE); + } + } + + //设置2c、i、2d + CacheResult value2C = ValueOf2cMethod.valueOf2C(SdAngleValueType.horAngle, + itemIndex, stationId, surveyorData, currentCycleIndex, cachedData); + if (value2C.validate && horAngleLeftAndRightAverageValue.validate) { + _2c.setText(String.format("%s″", Util.formatDouble2String(value2C.value, 1))); + } else { + _2c.setText(ORIGINAL_VALUE); + } + CacheResult valueI = ValueOf2cMethod.valueOf2C(SdAngleValueType.verAngle, + itemIndex, stationId, surveyorData, currentCycleIndex, cachedData); + if (valueI.validate && verAngleLeftAndRightAverageValue.validate) { + _i.setText(String.format("%s″", Util.formatDouble2String(valueI.value, 1))); + } else { + _i.setText(ORIGINAL_VALUE); + } + + CacheResult value2D = ValueOf2cMethod.valueOf2C(SdAngleValueType.distance, + itemIndex, stationId, surveyorData, currentCycleIndex, cachedData); + if (aloneDistance) { + _2d.setText(ORIGINAL_VALUE); + } else { + if (value2D.validate && distanceLeftAndRightAverageValue.validate) { + _2d.setText(String.format("%smm", Util.formatDouble2String(value2D.value, 1))); + } else { + _2d.setText(ORIGINAL_VALUE); + } + } + + } + + private void setTextColor(int type, int value) { + angleHor(type).setTextColor(context.getResources().getColor(value)); + angleVer(type).setTextColor(context.getResources().getColor(value)); + distance(type).setTextColor(context.getResources().getColor(value)); + } + + private void setValue(boolean aloneDistance, int type, double angleHor, double angleVer, double distance) { + //判断是否测水平角 + String angleVerS = RadianMethod.dmsStringOf(angleVer); + String distanceS = ORIGINAL_VALUE; + if (!aloneDistance) { + distanceS = Util.formatDouble2String(distance, + SettingValueUtil.getLengthDecimalPoint()); + } + setValue(type, + RadianMethod.dmsStringOf(angleHor), + angleVerS, + distanceS); + } + + private void setValue(int type, String angleHor, String angleVer, String distance) { + angleHor(type).setText(angleHor); + angleVer(type).setText(angleVer); + distance(type).setText(distance); + } + + private void setValue2Visibility(boolean visibility) { + leftAngleHor2.setVisibility(visibility ? View.VISIBLE : View.GONE); + leftAngleVer2.setVisibility(visibility ? View.VISIBLE : View.GONE); + leftDistance2.setVisibility(visibility ? View.VISIBLE : View.GONE); + rightAngleHor2.setVisibility(visibility ? View.VISIBLE : View.GONE); + rightAngleVer2.setVisibility(visibility ? View.VISIBLE : View.GONE); + rightDistance2.setVisibility(visibility ? View.VISIBLE : View.GONE); + } + + private TextView angleHor(int type) { + if (TYPE_LEFT1 == type) { + return leftAngleHor1; + } else if (TYPE_LEFT2 == type) { + return leftAngleHor2; + } else if (TYPE_RIGHT1 == type) { + return rightAngleHor1; + } + return rightAngleHor2; + } + + private TextView angleVer(int type) { + if (TYPE_LEFT1 == type) { + return leftAngleVer1; + } else if (TYPE_LEFT2 == type) { + return leftAngleVer2; + } else if (TYPE_RIGHT1 == type) { + return rightAngleVer1; + } + return rightAngleVer2; + } + + + private TextView distance(int type) { + if (TYPE_LEFT1 == type) { + return leftDistance1; + } else if (TYPE_LEFT2 == type) { + return leftDistance2; + } else if (TYPE_RIGHT1 == type) { + return rightDistance1; + } + return rightDistance2; + } + + private static final int TYPE_LEFT1 = 1; + private static final int TYPE_LEFT2 = 2; + private static final int TYPE_RIGHT1 = 3; + private static final int TYPE_RIGHT2 = 4; + private static final String ORIGINAL_VALUE = "-"; + private static final String SKIP_VALUE = "*"; +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataViewHolderHeightTraverse.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataViewHolderHeightTraverse.java new file mode 100644 index 0000000..6a989bf --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/SurveyorDataViewHolderHeightTraverse.java @@ -0,0 +1,366 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.content.Context; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.DataCategory; +import com.bingce.controlapphelper.model.LeftOrRight; +import com.bingce.controlapphelper.surveyor.data.ICachedData; +import com.bingce.controlapphelper.surveyor.data.ICycleRecorder; +import com.bingce.controlapphelper.surveyor.data.ISurveyorData; +import com.bingce.controlapphelper.surveyor.method.AverageValueMethod; +import com.bingce.controlapphelper.surveyor.method.RadianMethod; +import com.bingce.controlapphelper.surveyor.method.ValueOf2cMethod; +import com.bingce.controlapphelper.surveyor.method.model.CacheResult; +import com.bingce.controlapphelper.surveyor.method.model.SdAngleValueType; +import com.bingce.controlapphelper.util.IdUtil; +import com.bingce.controlapphelper.util.SettingValueUtil; +import com.bingce.controlapphelper.util.Tools; +import com.bingce.controlnetwork.R; +import com.bingce.utils.Util; + +import org.jetbrains.annotations.NotNull; + +public class SurveyorDataViewHolderHeightTraverse extends RecyclerView.ViewHolder { + private final Context context; + private final TextView leftLabel; + private final TextView rightLabel; + + public final TextView pointName; + public final TextView heightValue; + public final TextView prismValue; + + public final TextView leftAngleVer1; + public final TextView leftAngleVer2; + public final TextView leftDistance1; + public final TextView leftDistance2; + + public final TextView rightAngleVer1; + public final TextView rightAngleVer2; + public final TextView rightDistance1; + public final TextView rightDistance2; + + public final TextView averageVerAngle; + public final TextView averageDistance; + + public final View selectMask; + + public final TextView _i; + public final TextView _2d; + + public final TextView distanceTitle; + public final TextView tvCycleNum; + private final View itemView; + + public SurveyorDataViewHolderHeightTraverse(Context context, @NonNull @NotNull View itemView) { + super(itemView); + this.context = context; + leftLabel = itemView.findViewById(R.id.left_label); + rightLabel = itemView.findViewById(R.id.right_label); + + pointName = itemView.findViewById(R.id.pointName); + heightValue = itemView.findViewById(R.id.height_value); + prismValue = itemView.findViewById(R.id.prism_value); + + leftAngleVer1 = itemView.findViewById(R.id.left_angle_ver_1); + leftAngleVer2 = itemView.findViewById(R.id.left_angle_ver_2); + leftDistance1 = itemView.findViewById(R.id.left_distance_1); + leftDistance2 = itemView.findViewById(R.id.left_distance_2); + + rightAngleVer1 = itemView.findViewById(R.id.right_angle_ver_1); + rightAngleVer2 = itemView.findViewById(R.id.right_angle_ver_2); + rightDistance1 = itemView.findViewById(R.id.right_distance_1); + rightDistance2 = itemView.findViewById(R.id.right_distance_2); + + averageVerAngle = itemView.findViewById(R.id.average_angle_ver); + averageDistance = itemView.findViewById(R.id.average_distance); + + selectMask = itemView.findViewById(R.id.mask); + + _i = itemView.findViewById(R.id.value_i); + _2d = itemView.findViewById(R.id.value_2d); + + distanceTitle = itemView.findViewById(R.id.distance_title); + tvCycleNum = itemView.findViewById(R.id.tvCycleNum); + + this.itemView = itemView; + } + + public void setup(int itemIndex, + String stationId, + boolean showSlopDistance, + ICachedData cachedData, + ICycleRecorder cycleRecorder, + ISurveyorData surveyorData) { + if (showSlopDistance) { + distanceTitle.setText(R.string.distance_slope); + } else { + distanceTitle.setText(R.string.distance_horizontal); + } +// int currentCycleIndex = cycleRecorder.currentCycleIndex(); + int currentCycleIndex = itemIndex; + int currentSurveyorIndex = surveyorData.currentIndex(); + //设置当前测量状态标识 + if (currentSurveyorIndex == itemIndex) { + //当前非跳过点背景黄边白色 + selectMask.setBackground(Tools.getDrawable(R.drawable.select_mask)); + } else { + if (cachedData.isPointAbandon(currentCycleIndex, itemIndex)) { + selectMask.setBackground(Tools.getDrawable(R.drawable.bg_gray_3)); + } else { + selectMask.setBackgroundColor(Tools.getColor(R.color.white)); + } + } + tvCycleNum.setText(Tools.getString(R.string.test_n_cycle, (itemIndex + 1))); + + //初始化 + setValue(TYPE_LEFT1, ORIGINAL_VALUE, ORIGINAL_VALUE, ORIGINAL_VALUE); + setValue(TYPE_LEFT2, ORIGINAL_VALUE, ORIGINAL_VALUE, ORIGINAL_VALUE); + setValue(TYPE_RIGHT1, ORIGINAL_VALUE, ORIGINAL_VALUE, ORIGINAL_VALUE); + setValue(TYPE_RIGHT2, ORIGINAL_VALUE, ORIGINAL_VALUE, ORIGINAL_VALUE); + leftLabel.setTextColor(context.getResources().getColor(R.color.value_1_normal)); + setTextColor(TYPE_LEFT1, R.color.value_1_normal); + setTextColor(TYPE_LEFT2, R.color.value_2_normal); + rightLabel.setTextColor(context.getResources().getColor(R.color.value_1_normal)); + setTextColor(TYPE_RIGHT1, R.color.value_1_normal); + setTextColor(TYPE_RIGHT2, R.color.value_2_normal); + + averageVerAngle.setText(ORIGINAL_VALUE); + averageDistance.setText(ORIGINAL_VALUE); + + _i.setText(ORIGINAL_VALUE); + _2d.setText(ORIGINAL_VALUE); + + boolean aloneDistance = cachedData.isAloneDistance(currentCycleIndex, itemIndex); + + //如果当前正在测量,使用缓存数据设置相应信息 + LeftOrRight surveyorState = surveyorData.leftOrRight(); + if (currentSurveyorIndex == itemIndex) { + if (surveyorState == LeftOrRight.left) { + if (surveyorData.hasSurveyor1()) { + setValue(aloneDistance, TYPE_LEFT1, surveyorData.getAngleHor1(), surveyorData.getAngleVer1(), surveyorData.getDistance1()); + } + if (surveyorData.hasSurveyor2()) { + setValue(aloneDistance, TYPE_LEFT2, surveyorData.getAngleHor2(), surveyorData.getAngleVer2(), surveyorData.getDistance2()); + } + //设置颜色 + setTextColor(TYPE_LEFT1, R.color.value_1_selected); + setTextColor(TYPE_LEFT2, R.color.value_2_selected); + leftLabel.setTextColor(context.getResources().getColor(R.color.value_1_selected)); + } else if (surveyorState == LeftOrRight.right) { + if (surveyorData.hasSurveyor1()) { + setValue(aloneDistance, TYPE_RIGHT1, surveyorData.getAngleHor1(), surveyorData.getAngleVer1(), surveyorData.getDistance1()); + } + if (surveyorData.hasSurveyor2()) { + setValue(aloneDistance, TYPE_RIGHT2, surveyorData.getAngleHor2(), surveyorData.getAngleVer2(), surveyorData.getDistance2()); + } + //设置颜色 + setTextColor(TYPE_RIGHT1, R.color.value_1_selected); + setTextColor(TYPE_RIGHT2, R.color.value_2_selected); + rightLabel.setTextColor(context.getResources().getColor(R.color.value_1_selected)); + } + } + + //根据测量次数,控制数据显示 + setValue2Visibility(surveyorData.surveyorCount() > 1); + + pointName.setText(cachedData.pointName(currentCycleIndex, itemIndex)); + heightValue.setText(cachedData.getPrismHeight(currentCycleIndex, itemIndex)); + prismValue.setText(cachedData.getPrismTypeName(currentCycleIndex, itemIndex)); + + //重新监听observe---但是根据当前测量状态,需要排除一些数据监听 + boolean skipLeft1 = false, skipLeft2 = false, skipRight1 = false, skipRight2 = false; + //根据内存缓存排除 + if (currentSurveyorIndex == itemIndex) { + if (surveyorState == LeftOrRight.left) { + if (surveyorData.hasSurveyor1()) { + skipLeft1 = true; + } + if (surveyorData.hasSurveyor2() || surveyorData.surveyorCount() == 1) { + skipLeft2 = true; + } + } else if (surveyorState == LeftOrRight.right) { + if (surveyorData.hasSurveyor1()) { + skipRight1 = true; + } + if (surveyorData.hasSurveyor2() || surveyorData.surveyorCount() == 1) { + skipRight2 = true; + } + } + } + + String pointId = cachedData.pointId(currentCycleIndex, itemIndex); + String leftRecordId = IdUtil.createSurveyorRecordId(stationId, currentCycleIndex, pointId, LeftOrRight.left); + if (!skipLeft1) { + DataCategory dataCategory = cachedData.valueState(leftRecordId, 0); + if (!dataCategory.isEmptyData()) { + setValue(aloneDistance, TYPE_LEFT1, + cachedData.angleHor1(leftRecordId), + cachedData.angleVer1(leftRecordId), + cachedData.distance1(leftRecordId)); + } + if (dataCategory.isNeedResurvey()) { + setTextColor(TYPE_LEFT1, R.color.value_dirty); + } else if (dataCategory == DataCategory.dirtyAndSurveyed) { + setTextColor(TYPE_LEFT1, R.color.value_resurveyed); + } + } + if (!skipLeft2) { + DataCategory dataCategory = cachedData.valueState(leftRecordId, 1); + if (!dataCategory.isEmptyData()) { + setValue(aloneDistance, TYPE_LEFT2, + cachedData.angleHor2(leftRecordId), + cachedData.angleVer2(leftRecordId), + cachedData.distance2(leftRecordId)); + } + if (dataCategory.isNeedResurvey()) { + setTextColor(TYPE_LEFT2, R.color.value_dirty); + } else if (dataCategory == DataCategory.dirtyAndSurveyed) { + setTextColor(TYPE_LEFT2, R.color.value_resurveyed); + } + } + String rightRecordId = IdUtil.createSurveyorRecordId(stationId, currentCycleIndex, pointId, LeftOrRight.right); + if (!skipRight1) { + DataCategory dataCategory = cachedData.valueState(rightRecordId, 0); + if (!dataCategory.isEmptyData()) { + setValue(aloneDistance, TYPE_RIGHT1, + cachedData.angleHor1(rightRecordId), + cachedData.angleVer1(rightRecordId), + cachedData.distance1(rightRecordId)); + } + if (dataCategory.isNeedResurvey()) { + setTextColor(TYPE_RIGHT1, R.color.value_dirty); + } else if (dataCategory == DataCategory.dirtyAndSurveyed) { + setTextColor(TYPE_RIGHT1, R.color.value_resurveyed); + } + } + if (!skipRight2) { + DataCategory dataCategory = cachedData.valueState(rightRecordId, 1); + if (!dataCategory.isEmptyData()) { + setValue(aloneDistance, TYPE_RIGHT2, + cachedData.angleHor2(rightRecordId), + cachedData.angleVer2(rightRecordId), + cachedData.distance2(rightRecordId)); + } + if (dataCategory.isNeedResurvey()) { + setTextColor(TYPE_RIGHT2, R.color.value_dirty); + } else if (dataCategory == DataCategory.dirtyAndSurveyed) { + setTextColor(TYPE_RIGHT2, R.color.value_resurveyed); + } + } + + + //均值(中值) + int surveyorCount = surveyorData.surveyorCount(); + + CacheResult verAngleLeftAndRightAverageValue = AverageValueMethod.leftAndRightValue(SdAngleValueType.verAngle, + leftRecordId, + rightRecordId, surveyorCount, cachedData); + if (verAngleLeftAndRightAverageValue.validate) {//显示天顶距 + averageVerAngle.setText(RadianMethod.dmsStringOf(Math.PI / 2 - verAngleLeftAndRightAverageValue.value)); + } else { + averageVerAngle.setText(ORIGINAL_VALUE); + } + + CacheResult distanceLeftAndRightAverageValue = AverageValueMethod.leftAndRightValue(SdAngleValueType.distance, + leftRecordId, + rightRecordId, surveyorCount, cachedData); + if (aloneDistance) { + averageDistance.setText(ORIGINAL_VALUE); + } else { + if (distanceLeftAndRightAverageValue.validate) { + averageDistance.setText(Util.formatDouble2String(distanceLeftAndRightAverageValue.value, + SettingValueUtil.getLengthDecimalPoint())); + } else { + averageDistance.setText(ORIGINAL_VALUE); + } + } + + //设置2c、i、2d + CacheResult valueI = ValueOf2cMethod.valueOf2C(SdAngleValueType.verAngle, + itemIndex, stationId, surveyorData, currentCycleIndex, cachedData); + if (valueI.validate && verAngleLeftAndRightAverageValue.validate) { + _i.setText(String.format("%s″", Util.formatDouble2String(valueI.value, 1))); + } else { + _i.setText(ORIGINAL_VALUE); + } + + CacheResult value2D = ValueOf2cMethod.valueOf2C(SdAngleValueType.distance, + itemIndex, stationId, surveyorData, currentCycleIndex, cachedData); + if (aloneDistance) { + _2d.setText(ORIGINAL_VALUE); + } else { + if (value2D.validate && distanceLeftAndRightAverageValue.validate) { + _2d.setText(String.format("%smm", Util.formatDouble2String(value2D.value, 1))); + } else { + _2d.setText(ORIGINAL_VALUE); + } + } + + } + + private void setTextColor(int type, int value) { + angleVer(type).setTextColor(context.getResources().getColor(value)); + distance(type).setTextColor(context.getResources().getColor(value)); + } + + private void setValue(boolean aloneDistance, int type, double angleHor, double angleVer, double distance) { + //判断是否测水平角 + String angleVerS = RadianMethod.dmsStringOf(angleVer); + String distanceS = ORIGINAL_VALUE; + if (!aloneDistance) { + distanceS = Util.formatDouble2String(distance, + SettingValueUtil.getLengthDecimalPoint()); + } + setValue(type, + RadianMethod.dmsStringOf(angleHor), + angleVerS, + distanceS); + } + + private void setValue(int type, String angleHor, String angleVer, String distance) { + angleVer(type).setText(angleVer); + distance(type).setText(distance); + } + + private void setValue2Visibility(boolean visibility) { + leftAngleVer2.setVisibility(visibility ? View.VISIBLE : View.GONE); + leftDistance2.setVisibility(visibility ? View.VISIBLE : View.GONE); + rightAngleVer2.setVisibility(visibility ? View.VISIBLE : View.GONE); + rightDistance2.setVisibility(visibility ? View.VISIBLE : View.GONE); + } + + private TextView angleVer(int type) { + if (TYPE_LEFT1 == type) { + return leftAngleVer1; + } else if (TYPE_LEFT2 == type) { + return leftAngleVer2; + } else if (TYPE_RIGHT1 == type) { + return rightAngleVer1; + } + return rightAngleVer2; + } + + + private TextView distance(int type) { + if (TYPE_LEFT1 == type) { + return leftDistance1; + } else if (TYPE_LEFT2 == type) { + return leftDistance2; + } else if (TYPE_RIGHT1 == type) { + return rightDistance1; + } + return rightDistance2; + } + + private static final int TYPE_LEFT1 = 1; + private static final int TYPE_LEFT2 = 2; + private static final int TYPE_RIGHT1 = 3; + private static final int TYPE_RIGHT2 = 4; + private static final String ORIGINAL_VALUE = "-"; + private static final String SKIP_VALUE = "*"; +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/TextSelectableViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/TextSelectableViewHolder.java new file mode 100644 index 0000000..cfd15ae --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/TextSelectableViewHolder.java @@ -0,0 +1,21 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; + +public class TextSelectableViewHolder extends RecyclerView.ViewHolder { + public final ImageView status; + public final TextView name; + + public TextSelectableViewHolder(@NonNull View itemView) { + super(itemView); + status = itemView.findViewById(R.id.status); + name = itemView.findViewById(R.id.text); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/vh/TitleWithSubtitleViewHolder.java b/app/src/main/java/com/bingce/controlnetwork/ui/vh/TitleWithSubtitleViewHolder.java new file mode 100644 index 0000000..14d7e98 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/vh/TitleWithSubtitleViewHolder.java @@ -0,0 +1,20 @@ +package com.bingce.controlnetwork.ui.vh; + +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; + +public class TitleWithSubtitleViewHolder extends RecyclerView.ViewHolder { + public final TextView title; + public final TextView subTitle; + + public TitleWithSubtitleViewHolder(@NonNull View itemView) { + super(itemView); + title = itemView.findViewById(R.id.title); + subTitle = itemView.findViewById(R.id.sub_title); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/CommentListTextView.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/CommentListTextView.java new file mode 100644 index 0000000..5b873e3 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/CommentListTextView.java @@ -0,0 +1,380 @@ +package com.bingce.controlnetwork.ui.widget; + +import android.content.Context; +import android.graphics.Color; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.text.style.ForegroundColorSpan; +import android.util.AttributeSet; +import android.view.View; + +import androidx.appcompat.widget.AppCompatTextView; + +import java.util.List; + +/** + * Created by lujianchao on 2017/1/19. + * + * @author lujianchao + */ + +public class CommentListTextView extends AppCompatTextView { + /** + * 所有评论数据 + */ + private List mInfos; + private onCommentListener mListener; + + /** + * 点击文字会触发两个回调,用这个变量控制屏蔽掉一个 + */ + private boolean isNickNameClick = false; + + + /** + * 最大显示行数,超过指定行数多一行显示为查看更多文本,可设置文本 + */ + private int mMaxlines = 6; + /** + * 当超过n行后,n+1行显示为这个文本; + */ + private String mMoreStr = "查看全部评论"; + /** + * 谁回复谁中回复字符串,可以变成别的 + */ + private String mTalkStr = "回复"; + /** + * 人名称颜色 + */ + private int mNameColor = Color.parseColor("#00376a"); + private int mCommentColor = Color.parseColor("#2d2d2d"); + private int mTalkColor = Color.parseColor("#2d2d2d"); + + public int getTalkColor() { + return mTalkColor; + } + + public CommentListTextView setTalkColor(final int mTalkColor) { + this.mTalkColor = mTalkColor; + return this; + } + + public int getMaxlines() { + return mMaxlines; + } + + public CommentListTextView setMaxlines(final int mMaxlines) { + this.mMaxlines = mMaxlines; + return this; + } + + public String getMoreStr() { + return mMoreStr; + } + + public CommentListTextView setMoreStr(final String mMoreStr) { + this.mMoreStr = mMoreStr; + return this; + } + + public String getTalkStr() { + return mTalkStr; + } + + public CommentListTextView setTalkStr(final String mTalkStr) { + this.mTalkStr = mTalkStr; + return this; + } + + public int getNameColor() { + return mNameColor; + } + + public CommentListTextView setNameColor(final int mNameColor) { + this.mNameColor = mNameColor; + return this; + } + + public int getCommentColor() { + return mCommentColor; + } + + public CommentListTextView setCommentColor(final int mCommentColor) { + this.mCommentColor = mCommentColor; + return this; + } + + public CommentListTextView(final Context context) { + super(context); + } + + + public CommentListTextView(final Context context, final AttributeSet attrs) { + super(context, attrs); + } + + public CommentListTextView setonCommentListener(final onCommentListener mListener) { + this.mListener = mListener; + return this; + } + + public void setData(List mInfos) { + this.mInfos = mInfos; + /** + * textview必须设置,否则自定义点击事件没响应 + */ + setMovementMethod(LinkMovementMethod.getInstance()); + setHighlightColor(Color.TRANSPARENT); + setText(getCommentString()); + setOnClickListener(new OnClickListener() { + @Override + public void onClick(final View v) { + if (isNickNameClick) { + isNickNameClick = false; + return; + } + if (mListener != null) { + mListener.onOtherClick(); + } + } + }); + } + + private SpannableStringBuilder getCommentString() { + SpannableStringBuilder mStringBuilder = new SpannableStringBuilder(); + /** + * 对评论数据进行处理,默认超过mMaxlines条则第mMaxlines+1条显示查看全部 + */ + for (int mI = 0; mI < mInfos.size(); mI++) { + final CommentInfo mInfo = mInfos.get(mI); + /** + * 拼接成“张三:今天天气真好”这种形式,就是一行显示的文本。 + * 或者为张三 回复 李四:今天天气真好 + */ + String mS = null; + if (mInfo.getTonickname() == null || mInfo.getTonickname().equals("")) { + mS = mInfo.getNickname() + ":" + mInfo.getComment(); + } else { + mS = mInfo.getNickname() + mTalkStr + mInfo.getTonickname() + ":" + mInfo.getComment(); + } + /** + * 获得一个SpannableString文本的对象 + */ + SpannableString mString = new SpannableString(mS); + /** + * 我们假设“张三:今天天气真好”这句话中“张三:”这三个字符为橘红色字体并且添加点击事件,其余评论内容单独添加事件,一般业务需求是点击人名跳到个人主页或者聊天,点击评论内容是对这条评论进行评论。 + * 谁回复谁同理,就不写了 + */ + int start = 0; + int end = (mInfo.getNickname()).length(); + final int finalMI = mI; + /** + * 处理第一个人名 + * 设置文本从第0个开始到end位置具有点击事件,点击后回调,updateDrawState中设置文本从第0个到第end位置的文本前景色就是文字颜色为橘红色 + */ + mString.setSpan(new ClickableSpan() { + + @Override + public void updateDrawState(TextPaint ds) { + /** + * 是否有下划线 + */ + ds.setUnderlineText(false); + /** + * 橘红色字体 + */ + ds.setColor(mNameColor); + } + + @Override + public void onClick(final View widget) { + isNickNameClick = true; + if (mListener != null) { + mListener.onNickNameClick(finalMI, mInfos.get(finalMI)); + } + } + }, 0, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + mString.setSpan(new ForegroundColorSpan(mTalkColor), mInfo.getNickname().length(), mInfo.getNickname().length() + mTalkStr.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + /** + * 处理第二个人名 + */ + if (mInfo.getTonickname() != null && !mInfo.getTonickname().equals("")) { + start = mInfo.getNickname().length() + mTalkStr.length(); + end = mInfo.getNickname().length() + mTalkStr.length() + mInfo.getTonickname().length(); + mString.setSpan(new ClickableSpan() { + @Override + public void updateDrawState(TextPaint ds) { + /** + * 是否有下划线 + */ + ds.setUnderlineText(false); + /** + * 橘红色字体 + */ + ds.setColor(mNameColor); + } + + @Override + public void onClick(final View widget) { + isNickNameClick = true; + if (mListener != null) { + mListener.onToNickNameClick(finalMI, mInfos.get(finalMI)); + } + } + }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + + /** + * 设置文本从第end个开始到最后位置具有点击事件,点击后回调,updateDrawState中设置文本从第end个到最后的文本前景色就是文字颜色为黑色 + */ + + mString.setSpan(new ClickableSpan() { + + @Override + public void updateDrawState(TextPaint ds) { + /** + * 是否有下划线 + */ + ds.setUnderlineText(false); + /** + * 黑色字体 + */ + ds.setColor(mCommentColor); + } + + @Override + public void onClick(final View widget) { + isNickNameClick = true; + if (mListener != null) { + mListener.onCommentItemClick(finalMI, mInfos.get(finalMI)); + } + } + }, end, mS.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + /** + * 设置文本从第end个到最后的文本前景色就是文字颜色为黑色,即评论内容为黑色 + */ + + mStringBuilder.append(mString); + mStringBuilder.append("\r\n"); + if (mI == (mMaxlines - 1)) { + break; + } + } + if (mInfos.size() > mMaxlines) { + mStringBuilder.append("查看全部评论"); + } else { + /** + * 如果不大于3条,则删除最后的换行 + */ + mStringBuilder.delete(mStringBuilder.length() - 2, mStringBuilder.length()); + } + return mStringBuilder; + } + + + public interface onCommentListener { + /** + * 点击人名的回调 + * + * @param position 第几条评论 从0开始 + * @param mInfo 评论相关信息 + */ + void onNickNameClick(int position, CommentInfo mInfo); + + /** + * 点击被评论人名的回调 + * + * @param position 第几条评论 从0开始 + * @param mInfo 评论相关信息 + */ + void onToNickNameClick(int position, CommentInfo mInfo); + + /** + * 点击评论文本回调,主要针对对谁回复操作 + * + * @param position + * @param mInfo + */ + void onCommentItemClick(int position, CommentInfo mInfo); + + /** + * 点击非文字部分 + */ + void onOtherClick(); + } + + public static class CommentInfo { + /** + * 评论ID + */ + private int ID; + /** + * 评论人名称 + */ + private String nickname; + /** + * 评论内容 + */ + private String comment; + /** + * 被评论人名称 + */ + private String tonickname; + + @Override + public String toString() { + return "CommentInfo{" + + "ID=" + ID + + ", nickname='" + nickname + '\'' + + ", comment='" + comment + '\'' + + ", tonickname='" + tonickname + '\'' + + '}'; + } + + /** + * 下面可以继续写自定义需要的属性,需要传什么写什么 + */ + + + public int getID() { + return ID; + } + + public CommentInfo setID(final int mID) { + ID = mID; + return this; + } + + public String getNickname() { + return nickname; + } + + public CommentInfo setNickname(final String mNickname) { + nickname = mNickname; + return this; + } + + public String getComment() { + return comment; + } + + public CommentInfo setComment(final String mComment) { + comment = mComment; + return this; + } + + public String getTonickname() { + return tonickname; + } + + public CommentInfo setTonickname(final String mTonickname) { + tonickname = mTonickname; + return this; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/ItemWithEditText.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/ItemWithEditText.java new file mode 100644 index 0000000..22f114a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/ItemWithEditText.java @@ -0,0 +1,25 @@ +package com.bingce.controlnetwork.ui.widget; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class ItemWithEditText extends TextItem { + public ItemWithEditText(@NonNull Context context) { + super(context); + } + + public ItemWithEditText(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public ItemWithEditText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public ItemWithEditText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/MyDrawerBuilder.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/MyDrawerBuilder.java new file mode 100644 index 0000000..b3b6cc7 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/MyDrawerBuilder.java @@ -0,0 +1,27 @@ +package com.bingce.controlnetwork.ui.widget; + +import android.app.Activity; + +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; + +import com.mikepenz.materialdrawer.DrawerBuilder; + +public class MyDrawerBuilder extends DrawerBuilder { + + public MyDrawerBuilder(@NonNull Activity activity) { + super(activity); + } + + public MyDrawerBuilder withCustomLayout(@LayoutRes int resLayout) { + if (mActivity == null) { + throw new RuntimeException("please pass an activity first to use this call"); + } + + if (resLayout != -1) { + this.mCustomView = mActivity.getLayoutInflater().inflate(resLayout, mRootView, false); + } + + return this; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/NoScrollView.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/NoScrollView.java new file mode 100644 index 0000000..af386e6 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/NoScrollView.java @@ -0,0 +1,39 @@ +package com.bingce.controlnetwork.ui.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.widget.ScrollView; + +public class NoScrollView extends ScrollView { + private boolean noScroll = false; + + public NoScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public NoScrollView(Context context) { + super(context); + } + + public void setNoScroll(boolean noScroll) { + this.noScroll = noScroll; + } + + @Override + public boolean onTouchEvent(MotionEvent arg0) { + /* return false;//super.onTouchEvent(arg0); */ + if (noScroll) + return false; + else + return super.onTouchEvent(arg0); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent arg0) { + if (noScroll) + return false; + else + return super.onInterceptTouchEvent(arg0); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/NoScrollViewPager.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/NoScrollViewPager.java new file mode 100644 index 0000000..39b651a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/NoScrollViewPager.java @@ -0,0 +1,56 @@ +package com.bingce.controlnetwork.ui.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import androidx.viewpager.widget.ViewPager; + +public class NoScrollViewPager extends ViewPager { + private boolean noScroll = false; + + public NoScrollViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public NoScrollViewPager(Context context) { + super(context); + } + + public void setNoScroll(boolean noScroll) { + this.noScroll = noScroll; + } + + @Override + public void scrollTo(int x, int y) { + super.scrollTo(x, y); + } + + @Override + public boolean onTouchEvent(MotionEvent arg0) { + /* return false;//super.onTouchEvent(arg0); */ + if (noScroll) + return false; + else + return super.onTouchEvent(arg0); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent arg0) { + if (noScroll) + return false; + else + return super.onInterceptTouchEvent(arg0); + } + + @Override + public void setCurrentItem(int item, boolean smoothScroll) { + super.setCurrentItem(item, smoothScroll); + } + + @Override + public void setCurrentItem(int item) { + super.setCurrentItem(item); + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/RotateLayout.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/RotateLayout.java new file mode 100644 index 0000000..1ef42a7 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/RotateLayout.java @@ -0,0 +1,189 @@ +package com.bingce.controlnetwork.ui.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Rect; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; + +import com.bingce.controlnetwork.R; + +import static java.lang.Math.PI; + +/** + * Rotates first view in this layout by specified angle. + *

+ * This layout is supposed to have only one view. Behaviour of the views after the first one + * is not defined. + *

+ * XML attributes + * See com.github.rongi.rotate_layout.R.styleable#RotateLayout RotateLayout Attributes, + */ +public class RotateLayout extends ViewGroup { + private float angle; + + private final Matrix rotateMatrix = new Matrix(); + + private final Rect viewRectRotated = new Rect(); + + private final RectF tempRectF1 = new RectF(); + private final RectF tempRectF2 = new RectF(); + + private final float[] viewTouchPoint = new float[2]; + private final float[] childTouchPoint = new float[2]; + + private boolean angleChanged = true; + + public RotateLayout(Context context) { + this(context, null); + } + + public RotateLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public RotateLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs); + + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RotateLayout); + angle = a.getInt(R.styleable.RotateLayout_rotate_angle, 0); + a.recycle(); + + setWillNotDraw(false); + } + + /** + * Returns current angle of this layout + */ + public float getAngle() { + return angle; + } + + /** + * Sets current angle of this layout. + */ + public void setAngle(float angle) { + if (this.angle != angle) { + this.angle = angle; + angleChanged = true; + requestLayout(); + invalidate(); + } + } + + /** + * Returns this layout's child or null if there is no any + */ + public View getView() { + if (getChildCount() > 0) { + return getChildAt(0); + } else { + return null; + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final View child = getView(); + if (child != null) { + measureChild(child, widthMeasureSpec, heightMeasureSpec); + setMeasuredDimension( + resolveSize(child.getMeasuredWidth(), widthMeasureSpec), + resolveSize(child.getMeasuredHeight(), heightMeasureSpec)); +// if (abs(angle % 180) == 90) { +// //noinspection SuspiciousNameCombination +// measureChild(child, heightMeasureSpec, widthMeasureSpec); +// setMeasuredDimension( +// resolveSize(child.getMeasuredHeight(), widthMeasureSpec), +// resolveSize(child.getMeasuredWidth(), heightMeasureSpec)); +// } else if (abs(angle % 180) == 0) { +// measureChild(child, widthMeasureSpec, heightMeasureSpec); +// setMeasuredDimension( +// resolveSize(child.getMeasuredWidth(), widthMeasureSpec), +// resolveSize(child.getMeasuredHeight(), heightMeasureSpec)); +// } else { +// int childWithMeasureSpec = MeasureSpec.makeMeasureSpec(0, UNSPECIFIED); +// int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, UNSPECIFIED); +// measureChild(child, childWithMeasureSpec, childHeightMeasureSpec); +// +// int measuredWidth = (int) ceil(child.getMeasuredWidth() * abs(cos(angle_c())) + child.getMeasuredHeight() * abs(sin(angle_c()))); +// int measuredHeight = (int) ceil(child.getMeasuredWidth() * abs(sin(angle_c())) + child.getMeasuredHeight() * abs(cos(angle_c()))); +// +// setMeasuredDimension( +// resolveSize(measuredWidth, widthMeasureSpec), +// resolveSize(measuredHeight, heightMeasureSpec)); +// } + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + int layoutWidth = r - l; + int layoutHeight = b - t; + + if (angleChanged || changed) { + final RectF layoutRect = tempRectF1; + layoutRect.set(0, 0, layoutWidth, layoutHeight); + final RectF layoutRectRotated = tempRectF2; + rotateMatrix.setRotate(angle, layoutRect.centerX(), layoutRect.centerY()); + rotateMatrix.mapRect(layoutRectRotated, layoutRect); + layoutRectRotated.round(viewRectRotated); + angleChanged = false; + } + + final View child = getView(); + if (child != null) { + int childLeft = (layoutWidth - child.getMeasuredWidth()) / 2; + int childTop = (layoutHeight - child.getMeasuredHeight()) / 2; + int childRight = childLeft + child.getMeasuredWidth(); + int childBottom = childTop + child.getMeasuredHeight(); + child.layout(childLeft, childTop, childRight, childBottom); + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + canvas.save(); + canvas.rotate(angle, getWidth() / 2f, getHeight() / 2f); + super.dispatchDraw(canvas); + canvas.restore(); + } + + @Override + public ViewParent invalidateChildInParent(int[] location, Rect dirty) { + invalidate(); + return super.invalidateChildInParent(location, dirty); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + viewTouchPoint[0] = event.getX(); + viewTouchPoint[1] = event.getY(); + + rotateMatrix.mapPoints(childTouchPoint, viewTouchPoint); + + event.setLocation(childTouchPoint[0], childTouchPoint[1]); + boolean result = super.dispatchTouchEvent(event); + event.setLocation(viewTouchPoint[0], viewTouchPoint[1]); + + return result; + } + + /** + * Circle angle, from 0 to TAU + */ + private Double angle_c() { + // True circle constant, not that petty imposter known as "PI" + double TAU = 2 * PI; + return TAU * angle / 360; + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItem.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItem.java new file mode 100644 index 0000000..b73b2f2 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItem.java @@ -0,0 +1,100 @@ +package com.bingce.controlnetwork.ui.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.bingce.controlnetwork.R; + +public class TextItem extends FrameLayout { + public final static int GRAVITY_TEXT_START = 0; + public final static int GRAVITY_TEXT_CENTER = 1; + public final static int GRAVITY_TEXT_END = 2; + + public final static int DIVIDER_VISIBLE = 0; + public final static int DIVIDER_INVISIBLE = 1; + + public TextItem(@NonNull Context context) { + super(context); + init(context, null); + } + + public TextItem(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public TextItem(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + public TextItem(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(context, attrs); + } + + protected int contentLayout() { + return R.layout.item_with_text_layout; + } + + void init(Context context, AttributeSet attrs) { + String string = "TEXT"; + int color = Color.BLACK; + int size = -1; + int gravity = GRAVITY_TEXT_START; + int divider = DIVIDER_VISIBLE; + if (attrs != null) { + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextItem); + string = a.getString(R.styleable.TextItem_text); + color = a.getColor(R.styleable.TextItem_text_color, Color.BLACK); + size = a.getDimensionPixelSize(R.styleable.TextItem_text_size, -1); + gravity = a.getInt(R.styleable.TextItem_text_gravity, GRAVITY_TEXT_START); + divider = a.getInt(R.styleable.TextItem_dividerVisible, DIVIDER_VISIBLE); + a.recycle(); + } + View content = LayoutInflater.from(context).inflate(contentLayout(), null, false); + addView(content); + View text = content.findViewById(R.id.text); + if (text instanceof TextView) { + TextView textView = (TextView) text; + textView.setText(string); + textView.setTextColor(color); + if (size > 0) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size); + } + switch (gravity) { + case GRAVITY_TEXT_CENTER: + textView.setGravity(Gravity.CENTER); + break; + case GRAVITY_TEXT_END: + textView.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); + break; + default: + textView.setGravity(Gravity.START | Gravity.CENTER_VERTICAL); + break; + } + } + View dividerView = content.findViewById(R.id.divider); + if (dividerView != null) { + dividerView.setVisibility(divider == DIVIDER_VISIBLE ? VISIBLE : GONE); + } + } + + public void setText(String string) { + View text = findViewById(R.id.text); + if (text instanceof TextView) { + ((TextView) text).setText(string); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItemWithDescribe.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItemWithDescribe.java new file mode 100644 index 0000000..b91a92a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItemWithDescribe.java @@ -0,0 +1,58 @@ +package com.bingce.controlnetwork.ui.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.bingce.controlnetwork.R; + +public class TextItemWithDescribe extends TextItem { + public TextItemWithDescribe(@NonNull Context context) { + super(context); + } + + public TextItemWithDescribe(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public TextItemWithDescribe(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public TextItemWithDescribe(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + void init(Context context, AttributeSet attrs) { + super.init(context, attrs); + String describe = ""; + if (attrs != null) { + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextItemWithDescribe); + describe = a.getString(R.styleable.TextItemWithDescribe_describeValue); + a.recycle(); + } + setDescribeText(describe); + } + + @Override + protected int contentLayout() { + return super.contentLayout(); + } + + public void setDescribeText(String text) { + TextView describe = findViewById(R.id.describe); + if (describe != null) { + if (text == null || text.isEmpty()) { + describe.setVisibility(GONE); + } else { + describe.setVisibility(VISIBLE); + describe.setText(text); + } + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItemWithMore.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItemWithMore.java new file mode 100644 index 0000000..edc6592 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/TextItemWithMore.java @@ -0,0 +1,32 @@ +package com.bingce.controlnetwork.ui.widget; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.bingce.controlnetwork.R; + +public class TextItemWithMore extends TextItemWithDescribe { + public TextItemWithMore(@NonNull Context context) { + super(context); + } + + public TextItemWithMore(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public TextItemWithMore(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public TextItemWithMore(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected int contentLayout() { + return R.layout.item_with_more_layout; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/ViewFactory.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/ViewFactory.java new file mode 100644 index 0000000..25c8ffe --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/ViewFactory.java @@ -0,0 +1,125 @@ +package com.bingce.controlnetwork.ui.widget; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.ViewItemType; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.ui.vh.DraggableTextViewHolder; +import com.bingce.controlnetwork.ui.vh.GroupParentViewHolder; +import com.bingce.controlnetwork.ui.vh.IndexTextSelectableViewHolder; +import com.bingce.controlnetwork.ui.vh.IndexTextViewHolder; +import com.bingce.controlnetwork.ui.vh.IndexTextWithPrefixViewHolder; +import com.bingce.controlnetwork.ui.vh.ItemWellViewHolder; +import com.bingce.controlnetwork.ui.vh.KeyBoolViewHolder; +import com.bingce.controlnetwork.ui.vh.KeyValueViewHolder; +import com.bingce.controlnetwork.ui.vh.StationAdjustItemViewHolder; +import com.bingce.controlnetwork.ui.vh.StationGroupItemViewHolder; +import com.bingce.controlnetwork.ui.vh.SurveyorDataAloneDistanceViewHolder; +import com.bingce.controlnetwork.ui.vh.SurveyorDataViewHolder; +import com.bingce.controlnetwork.ui.vh.SurveyorDataViewHolderHeightTraverse; +import com.bingce.controlnetwork.ui.vh.TextSelectableViewHolder; +import com.bingce.controlnetwork.ui.vh.TitleWithSubtitleViewHolder; +import com.bingce.controlnetwork.ui.vh.DraggableTextViewHolder; +import com.bingce.controlnetwork.ui.vh.GroupParentViewHolder; +import com.bingce.controlnetwork.ui.vh.IndexTextSelectableViewHolder; +import com.bingce.controlnetwork.ui.vh.IndexTextViewHolder; +import com.bingce.controlnetwork.ui.vh.IndexTextWithPrefixViewHolder; +import com.bingce.controlnetwork.ui.vh.ItemWellViewHolder; +import com.bingce.controlnetwork.ui.vh.KeyBoolViewHolder; +import com.bingce.controlnetwork.ui.vh.KeyValueViewHolder; +import com.bingce.controlnetwork.ui.vh.StationAdjustItemViewHolder; +import com.bingce.controlnetwork.ui.vh.StationGroupItemViewHolder; +import com.bingce.controlnetwork.ui.vh.SurveyorDataAloneDistanceViewHolder; +import com.bingce.controlnetwork.ui.vh.SurveyorDataViewHolder; +import com.bingce.controlnetwork.ui.vh.SurveyorDataViewHolderHeightTraverse; +import com.bingce.controlnetwork.ui.vh.TextSelectableViewHolder; +import com.bingce.controlnetwork.ui.vh.TitleWithSubtitleViewHolder; + + +public class ViewFactory { + + //生成对应的配置view + public static View generatorView(Context context, ViewGroup parent, ViewItemType viewType) { + switch (viewType) { + case indexWithName: + return LayoutInflater.from(context).inflate(R.layout.list_item_index_text_layout, parent, false); + case indexWithNameAndPrefix: + return LayoutInflater.from(context).inflate(R.layout.list_item_index_text_with_prefix_layout, parent, false); + case indexWithNameSelectable: + return LayoutInflater.from(context).inflate(R.layout.list_item_index_text_selectable_layout, parent, false); + case groupParent: + return LayoutInflater.from(context).inflate(R.layout.list_item_group_parent_layout, parent, false); + case nameWithText: + return LayoutInflater.from(context).inflate(R.layout.list_item_text_value_layout, parent, false); + case nameWithBool: + return LayoutInflater.from(context).inflate(R.layout.list_item_text_boolen_layout, parent, false); + case titleWithSubtitle: + return LayoutInflater.from(context).inflate(R.layout.list_item_title_subtitle_layout, parent, false); + case draggableItem: + return LayoutInflater.from(context).inflate(R.layout.list_item_draggable_layout, parent, false); + case surveyorStationCreateStationGroupItem: + return LayoutInflater.from(context).inflate(R.layout.list_item_surveyor_station_group_parent_with_add_layout, parent, false); + case textSelectable: + return LayoutInflater.from(context).inflate(R.layout.list_item_text_selectable_layout, parent, false); + case surveyorStationPointItem: + return LayoutInflater.from(context).inflate(R.layout.list_item_surveyor_station_point_layout, parent, false); + case stationAdjust: + return LayoutInflater.from(context).inflate(R.layout.list_item_station_adjust_layout, parent, false); + case wellItem: + return LayoutInflater.from(context).inflate(R.layout.list_item_well, parent, false); + case aloneDistanceMeasure: + return LayoutInflater.from(context).inflate(R.layout.list_item_well_measure_distance, parent, false); + case heightTraverseSurveyor: + return LayoutInflater.from(context).inflate(R.layout.list_item_surveyor_station_height_traverse, parent, false); + default: + return null; + } + } + + public static RecyclerView.ViewHolder generatorViewHolder(Context context, ViewGroup parent, ViewItemType viewType) { + View view = generatorView(context, parent, viewType); + if (view == null) { + return null; + } + switch (viewType) { + case indexWithName: + return new IndexTextViewHolder(view); + case indexWithNameAndPrefix: + return new IndexTextWithPrefixViewHolder(view); + case indexWithNameSelectable: + return new IndexTextSelectableViewHolder(view); + case groupParent: + return new GroupParentViewHolder(view); + case nameWithText: + return new KeyValueViewHolder(view); + case nameWithBool: + return new KeyBoolViewHolder(view); + case titleWithSubtitle: + return new TitleWithSubtitleViewHolder(view); + case draggableItem: + return new DraggableTextViewHolder(view); + case surveyorStationCreateStationGroupItem: + return new StationGroupItemViewHolder(view); + case textSelectable: + return new TextSelectableViewHolder(view); + case surveyorStationPointItem: + return new SurveyorDataViewHolder(context, view); + case stationAdjust: + return new StationAdjustItemViewHolder(view); + case wellItem: + return new ItemWellViewHolder(view); + case aloneDistanceMeasure: + return new SurveyorDataAloneDistanceViewHolder(context, view); + case heightTraverseSurveyor: + return new SurveyorDataViewHolderHeightTraverse(context, view); + default: + return null; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingDialog.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingDialog.java new file mode 100644 index 0000000..21fda4d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingDialog.java @@ -0,0 +1,86 @@ +package com.bingce.controlnetwork.ui.widget.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import com.bingce.controlnetwork.R; + + +public class LoadingDialog extends Dialog { + + public LoadingDialog(Context context) { + super(context, R.style.loading_dialog); + } + + public static class Builder { + + private final Context context; + private String message; + private boolean isCancelable = false; + private boolean isCancelOutside = false; + + + public Builder(Context context) { + this.context = context; + } + + /** + * 设置提示信息 + * + * @param message + * @return + */ + + public Builder setMessage(String message) { + this.message = message; + return this; + } + + /** + * 设置是否可以按返回键取消 + * + * @param isCancelable + * @return + */ + + public Builder setCancelable(boolean isCancelable) { + this.isCancelable = isCancelable; + return this; + } + + /** + * 设置是否可以取消 + * + * @param isCancelOutside + * @return + */ + public Builder setCancelOutside(boolean isCancelOutside) { + this.isCancelOutside = isCancelOutside; + return this; + } + + public LoadingDialog create() { + LayoutInflater inflater = LayoutInflater.from(context); + View view = inflater.inflate(R.layout.loading_dialog, null); + LoadingDialog loadingDailog = new LoadingDialog(context); + TextView msgText = view.findViewById(R.id.tipTextView); + if (TextUtils.isEmpty(message)) { + msgText.setVisibility(View.GONE); + } else { + msgText.setText(message); + msgText.setVisibility(View.VISIBLE); + } + loadingDailog.setContentView(view); + loadingDailog.setCancelable(isCancelable); + loadingDailog.setCanceledOnTouchOutside(isCancelOutside); + return loadingDailog; + + } + } + + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingUtil.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingUtil.java new file mode 100644 index 0000000..1b60e30 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingUtil.java @@ -0,0 +1,32 @@ +package com.bingce.controlnetwork.ui.widget.dialog; + +import android.content.Context; + +import androidx.annotation.MainThread; + +public class LoadingUtil { + private static LoadingDialog loadingDialog; + + @MainThread + public static void show(Context context, String msg) { + LoadingDialog.Builder loadBuilder = new LoadingDialog.Builder(context) + .setMessage(msg) + .setCancelable(true)//返回键是否可点击 + .setCancelOutside(false);//窗体外是否可点击 + loadingDialog = loadBuilder.create(); + loadingDialog.show(); + } + + @MainThread + public static void dismiss() { + try { + if (loadingDialog != null && loadingDialog.isShowing()) { + loadingDialog.dismiss(); + } + loadingDialog = null; + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingUtilKt.kt b/app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingUtilKt.kt new file mode 100644 index 0000000..4f75437 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/dialog/LoadingUtilKt.kt @@ -0,0 +1,33 @@ +package com.bingce.controlnetwork.ui.widget.dialog + +import android.content.Context + +object LoadingUtilKt { + + private var loadingDialog: LoadingDialog? = null + + + fun show(context: Context, msg: String?) { + val loadBuilder = LoadingDialog.Builder(context) + .setMessage(msg) + .setCancelable(true) //返回键是否可点击 + .setCancelOutside(false) //窗体外是否可点击 + + loadingDialog = loadBuilder.create() + loadingDialog!!.show() + } + + fun dismiss() { + try { + loadingDialog?.let { + if (it.isShowing) { + it.dismiss() + } + loadingDialog = null + } + } catch (e: Exception) { + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/AbstractDraggableRecycleViewAdapter.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/AbstractDraggableRecycleViewAdapter.java new file mode 100644 index 0000000..2362dc5 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/AbstractDraggableRecycleViewAdapter.java @@ -0,0 +1,173 @@ +package com.bingce.controlnetwork.ui.widget.recyclerview; + +import android.annotation.SuppressLint; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlapphelper.model.ViewItemType; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.ui.widget.ViewFactory; +import com.bingce.controlnetwork.ui.widget.ViewFactory; + +public abstract class AbstractDraggableRecycleViewAdapter + extends RecyclerView.Adapter + implements IDragSwipeChecker { + private final List items = new ArrayList<>(); + private @Nullable + IViewHolderDragDelegate viewHolderDragDelegate; + + public AbstractDraggableRecycleViewAdapter(List itemList) { + if (itemList != null) { + this.items.addAll(itemList); + } + } + + protected void replace(int start, List data) { + if (getItemCount() > start) { + items.subList(start, getItemCount()).clear(); + } + items.addAll(data); + } + + protected int indexOf(T item) { + return items.indexOf(item); + } + + protected void remove(T item) { + items.remove(item); + } + + protected void removeAll(List item) { + items.removeAll(item); + } + + protected void insert(int index, T item) { + if (items.size() <= index) { + return; + } + items.add(index, item); + } + + protected void insertAll(List item) { + items.addAll(item); + } + + protected void refreshAll(List item) { + items.clear(); + items.addAll(item); + notifyDataSetChanged(); + } + + /** + * 一井定向使用 + * + * @param index 要插入的位置 + * @param item + */ + protected void insertForWell(int index, List item) { + if (index < 0) { + return; + } + if (index == items.size()) { + items.addAll(item); + } else if (index < items.size()) { + items.addAll(index, item); + } + } + + final protected T getItem(int position) { + if (position >= items.size()) { + return null; + } + return items.get(position); + } + + final protected void setItem(int position, T item) { + if (position >= items.size() || position < 0) { + return; + } + items.set(position, item); + } + + public List getItems() { + return Collections.unmodifiableList(items); + } + + public void setViewHolderDragDelegate(@Nullable IViewHolderDragDelegate viewHolderDragDelegate) { + this.viewHolderDragDelegate = viewHolderDragDelegate; + } + + @Override + public int getItemViewType(int position) { + return ViewItemType.draggableItem.ordinal(); + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) { + return Objects.requireNonNull(ViewFactory.generatorViewHolder(parent.getContext(), parent, ViewItemType.values()[viewType])); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void onBindViewHolder(@NonNull @NotNull RecyclerView.ViewHolder holder, int position) { + bindItem(items.get(position), holder); + View dragBar = holder.itemView.findViewById(R.id.drag_bar); + if (dragBar != null) { + dragBar.setOnTouchListener((v, event) -> { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + if (viewHolderDragDelegate != null) { + viewHolderDragDelegate.startDrag(holder); + } + } + return true; + }); + } + //原先代码注释 +// if (holder instanceof DraggableTextViewHolder) { +// DraggableTextViewHolder draggableTextViewHolder = (DraggableTextViewHolder) holder; +// draggableTextViewHolder.dragBar.setOnTouchListener((v, event) -> { +// if (event.getAction() == MotionEvent.ACTION_DOWN) { +// if (viewHolderDragDelegate != null) { +// viewHolderDragDelegate.startDrag(holder); +// } +// } +// return true; +// }); +// } + } + + @Override + public int getItemCount() { + return items.size(); + } + + //交换 + public void onItemSwap(int from, int target) { + T s = items.get(from); + items.remove(from); + items.add(target, s); + notifyItemMoved(from, target); + } + + //滑动 + public void onItemRemoved(int position) { + items.remove(position); + notifyItemRemoved(position); + } + + protected abstract void bindItem(T item, RecyclerView.ViewHolder viewHolder); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragActionDelegate.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragActionDelegate.java new file mode 100644 index 0000000..dc5d902 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragActionDelegate.java @@ -0,0 +1,5 @@ +package com.bingce.controlnetwork.ui.widget.recyclerview; + +public interface IDragActionDelegate { + void startDragAction(); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragSwipeActionListener.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragSwipeActionListener.java new file mode 100644 index 0000000..f4ddadb --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragSwipeActionListener.java @@ -0,0 +1,23 @@ +package com.bingce.controlnetwork.ui.widget.recyclerview; + +public interface IDragSwipeActionListener { + /** + * 左右滑动删除操作 + * + * @param adapterPosition --被滑动的item索引 + */ + void onItemSwiped(int adapterPosition); + + /** + * 上下拖拽操作进行中,没有完成,用户手指还没离开屏幕 + * + * @param from 被拖拽item原来索引 + * @param to 被拖拽item目标索引 + */ + void onItemDragging(int from, int to); + + /** + * 上下拖拽操作完成,用户手指离开屏幕 + */ + void onItemDragCompleted(); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragSwipeChecker.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragSwipeChecker.java new file mode 100644 index 0000000..b1e1bbe --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IDragSwipeChecker.java @@ -0,0 +1,7 @@ +package com.bingce.controlnetwork.ui.widget.recyclerview; + +public interface IDragSwipeChecker { + boolean isItemSwipeAble(int position); + + boolean isItemDragAble(int position); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/ISwipeDragListener.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/ISwipeDragListener.java new file mode 100644 index 0000000..ae1d0a6 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/ISwipeDragListener.java @@ -0,0 +1,7 @@ +package com.bingce.controlnetwork.ui.widget.recyclerview; + +public interface ISwipeDragListener { + void onItemSwap(int from, int target); + + void onItemMoved(int position); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IViewHolderDragDelegate.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IViewHolderDragDelegate.java new file mode 100644 index 0000000..fa903e1 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/IViewHolderDragDelegate.java @@ -0,0 +1,7 @@ +package com.bingce.controlnetwork.ui.widget.recyclerview; + +import androidx.recyclerview.widget.RecyclerView; + +public interface IViewHolderDragDelegate { + void startDrag(RecyclerView.ViewHolder viewHolder); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/ItemTouchHelperCallbackImpl.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/ItemTouchHelperCallbackImpl.java new file mode 100644 index 0000000..992731d --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/ItemTouchHelperCallbackImpl.java @@ -0,0 +1,105 @@ +package com.bingce.controlnetwork.ui.widget.recyclerview; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +import org.jetbrains.annotations.NotNull; + +public class ItemTouchHelperCallbackImpl extends ItemTouchHelper.Callback { + private final IDragSwipeActionListener listener; + private final IDragSwipeChecker dragSwipeChecker; + + public ItemTouchHelperCallbackImpl(IDragSwipeChecker dragSwipeChecker, + IDragSwipeActionListener listener) { + this.dragSwipeChecker = dragSwipeChecker; + this.listener = listener; + } + + @Override + public int getMovementFlags(@NonNull @NotNull RecyclerView recyclerView, @NonNull @NotNull RecyclerView.ViewHolder viewHolder) { + int dragFlag; //拖动标记 + int swipeFlags; //滑动标记 + //如果是表格布局,则可以上下左右的拖动,但是不能滑动 + if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { + dragFlag = ItemTouchHelper.UP | + ItemTouchHelper.DOWN | + ItemTouchHelper.LEFT | + ItemTouchHelper.RIGHT; + swipeFlags = 0; + } else {//如果是线性布局,那么只能上下拖动,只能左右滑动 + dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN; + swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; + } + + int position = viewHolder.getAdapterPosition(); + if (dragSwipeChecker != null && !dragSwipeChecker.isItemDragAble(position)) { + dragFlag = 0; + } + if (dragSwipeChecker != null && !dragSwipeChecker.isItemSwipeAble(position)) { + swipeFlags = 0; + } + + //通过makeMovementFlags生成最终结果 + return makeMovementFlags(dragFlag, swipeFlags); + } + + + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { + //被拖动的item位置 + int fromPosition = viewHolder.getLayoutPosition(); + //他的目标位置 + int targetPosition = target.getLayoutPosition(); + if (!isDragValidate(recyclerView, targetPosition, fromPosition)) { + return false; + } + if (listener != null) { + listener.onItemDragging(fromPosition, targetPosition); + } + return true; + } + + final protected boolean isDragValidate(@NonNull RecyclerView recyclerView, int targetPosition, int fromPosition) { + RecyclerView.Adapter adapter = recyclerView.getAdapter(); + if (adapter != null) { + int targetType = adapter.getItemViewType(targetPosition); + int fromType = adapter.getItemViewType(fromPosition); + return targetType == fromType && targetPosition > 1; + } + return true; + } + + @Override + public void onSwiped(@NonNull @NotNull RecyclerView.ViewHolder viewHolder, int direction) { + if (listener != null) { + listener.onItemSwiped(viewHolder.getAdapterPosition()); + } + } + + @Override + public boolean isLongPressDragEnabled() { + return false; + } + + private boolean listener2DragComplete = false; + + @Override + public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) { + super.onSelectedChanged(viewHolder, actionState); + if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { + listener2DragComplete = true; + } else if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { + listener2DragComplete = false; + } else if (actionState == ItemTouchHelper.ACTION_STATE_IDLE) { + if (listener2DragComplete) { + if (listener != null) { + listener.onItemDragCompleted(); + } + } + listener2DragComplete = false; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/SwipeDraggableRecyclerViewUtil.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/SwipeDraggableRecyclerViewUtil.java new file mode 100644 index 0000000..8d8f7c0 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/recyclerview/SwipeDraggableRecyclerViewUtil.java @@ -0,0 +1,80 @@ +package com.bingce.controlnetwork.ui.widget.recyclerview; + +import android.content.Context; + +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; +import com.bingce.controlnetwork.fragment.TipsWith2OptionFragment; + +public class SwipeDraggableRecyclerViewUtil { + public static void setup(AbstractDraggableRecycleViewAdapter adapter, + RecyclerView recyclerView, + FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner, + IStationPointOperatorListener operatorListener, + Context context) { + ItemTouchHelperCallbackImpl callback = new ItemTouchHelperCallbackImpl(adapter, new IDragSwipeActionListener() { + @Override + public void onItemSwiped(int adapterPosition) { + TipsWith2OptionFragment.tips(fragmentManager, lifecycleOwner, + null, null, + context.getString(R.string.tips_r_u_sure_delete_item), + new TipsWith2OptionFragment.IOperatorCallback() { + @Override + public void onConfirm() { + if (operatorListener != null) { + operatorListener.onItemRemoved(adapterPosition); + } + if (adapter != null) { + adapter.onItemRemoved(adapterPosition); + } + } + + @Override + public void onOption() { + } + + @Override + public void onCancel() { + if (adapter != null) { + adapter.notifyItemChanged(adapterPosition); + } + } + + @Override + public void onIgnore() { + if (adapter != null) { + adapter.notifyItemChanged(adapterPosition); + } + } + }); + } + + @Override + public void onItemDragging(int from, int to) { + adapter.onItemSwap(from, to); + } + + @Override + public void onItemDragCompleted() { + if (operatorListener != null) { + operatorListener.onItemDragCompleted(); + } + } + }); + ItemTouchHelper helper = new ItemTouchHelper(callback); + adapter.setViewHolderDragDelegate(helper::startDrag); + helper.attachToRecyclerView(recyclerView); + } + + public interface IStationPointOperatorListener { + void onItemRemoved(int adapterPosition); + + void onItemDragCompleted(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeNode.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeNode.java new file mode 100644 index 0000000..af8c986 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeNode.java @@ -0,0 +1,231 @@ +/* + * Copyright 2016 - 2017 ShineM (Xinyuan) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under. + */ + +package com.bingce.controlnetwork.ui.widget.treeview; + +import com.bingce.controlnetwork.ui.widget.treeview.helper.TreeHelper; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.ui.widget.treeview.helper.TreeHelper; + + +/** + * Created by xinyuanzhong on 2017/4/20. + */ + +public class TreeNode { + private int level; + + private Value value; + + private TreeNode parent; + + private List children; + + private int index; + + private boolean expanded; + + private boolean selected; + + private boolean itemClickEnable = true; + + private boolean enable = true; + + public TreeNode(Value value) { + this.value = value; + this.children = new ArrayList<>(); + } + + public TreeNode(Value value, int level) { + this(value); + setLevel(level); + } + + public static TreeNode root() { + TreeNode treeNode = new TreeNode(null); + return treeNode; + } + + public void addChild(TreeNode treeNode) { + if (treeNode == null) { + return; + } + children.add(treeNode); + treeNode.setIndex(getChildren().size()); + treeNode.setParent(this); + } + + + public void removeChild(TreeNode treeNode) { + if (treeNode == null || getChildren().size() < 1) { + return; + } + if (getChildren().contains(treeNode)) { + getChildren().remove(treeNode); + } + } + + public boolean isLastChild() { + if (parent == null) { + return false; + } + List children = parent.getChildren(); + return children.size() > 0 && children.indexOf(this) == children.size() - 1; + } + + public boolean isRoot() { + return parent == null; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public Value getValue() { + return value; + } + + public void setValue(Value value) { + this.value = value; + } + + public TreeNode getParent() { + return parent; + } + + public void setParent(TreeNode parent) { + this.parent = parent; + } + + public List getChildren() { + if (children == null) { + return new ArrayList<>(); + } + return children; + } + + public List getSelectedChildren() { + List selectedChildren = new ArrayList<>(); + for (TreeNode child : getChildren()) { + if (child.isSelected()) { + selectedChildren.add(child); + } + } + return selectedChildren; + } + + public void setChildren(List children) { + if (children == null) { + return; + } + this.children = new ArrayList<>(); + for (TreeNode child : children) { + addChild(child); + } + } + + /** + * Updating the list of children while maintaining the tree structure + */ + public void updateChildren(List children) { + List expands = new ArrayList<>(); + List allNodesPre = TreeHelper.getAllNodes(this); + for (TreeNode node : allNodesPre) { + expands.add(node.isExpanded()); + } + + this.children = children; + List allNodes = TreeHelper.getAllNodes(this); + if (allNodes.size() == expands.size()) { + for (int i = 0; i < allNodes.size(); i++) { + allNodes.get(i).setExpanded(expands.get(i)); + } + } + } + + public void setExpanded(boolean expanded) { + this.expanded = expanded; + } + + public boolean isExpanded() { + return expanded; + } + + public boolean isEnable() { + return enable; + } + + public void setEnable(boolean enable) { + this.enable = enable; + } + + public boolean hasChild() { + return children.size() > 0; + } + + public boolean isItemClickEnable() { + return itemClickEnable; + } + + public void setItemClickEnable(boolean itemClickEnable) { + this.itemClickEnable = itemClickEnable; + } + + public String getId() { + return getLevel() + "," + getIndex(); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public boolean isSelected() { + return selected; + } + + public void setSelected(boolean selected) { + this.selected = selected; + } + + + public static class Value { + private final Object value; + private final String id; + + public Value(Object value, String id) { + this.value = value; + this.id = id; + } + + public Object getValue() { + return value; + } + + public String getId() { + return id; + } + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeView.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeView.java new file mode 100644 index 0000000..92aefa7 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeView.java @@ -0,0 +1,214 @@ +/* + * Copyright 2016 - 2017 ShineM (Xinyuan) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under. + */ + +package com.bingce.controlnetwork.ui.widget.treeview; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; + +import com.bingce.controlnetwork.ui.widget.treeview.base.BaseNodeViewFactory; +import com.bingce.controlnetwork.ui.widget.treeview.base.SelectableTreeAction; +import com.bingce.controlnetwork.ui.widget.treeview.helper.TreeHelper; + +import java.util.List; + +import com.bingce.controlnetwork.ui.widget.treeview.base.BaseNodeViewFactory; +import com.bingce.controlnetwork.ui.widget.treeview.base.SelectableTreeAction; +import com.bingce.controlnetwork.ui.widget.treeview.helper.TreeHelper; + + +/** + * Created by xinyuanzhong on 2017/4/20. + */ + +public class TreeView implements SelectableTreeAction { + private final TreeNode root; + + private final Context context; + + private final BaseNodeViewFactory baseNodeViewFactory; + + private RecyclerView rootView; + + private TreeViewAdapter adapter; + + private boolean itemSelectable = true; + + public TreeView(@NonNull TreeNode root, @NonNull Context context, @NonNull BaseNodeViewFactory baseNodeViewFactory) { + this.root = root; + this.context = context; + this.baseNodeViewFactory = baseNodeViewFactory; + if (baseNodeViewFactory == null) { + throw new IllegalArgumentException("You must assign a BaseNodeViewFactory!"); + } + } + + // public View getView() { +// if (rootView == null) { +// this.rootView = buildRootView(); +// } +// +// return rootView; +// } + public void setup(RecyclerView recyclerView) { + buildRootView(recyclerView); + } + + @NonNull + private void buildRootView(RecyclerView recyclerView) { +// private RecyclerView buildRootView() { +// RecyclerView recyclerView = new RecyclerView(context); + /** + * disable multi touch event to prevent terrible data set error when calculate list. + */ + recyclerView.setMotionEventSplittingEnabled(false); + ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); +// recyclerView.setItemAnimator(null); + + recyclerView.setLayoutManager(new LinearLayoutManager(context, RecyclerView.VERTICAL, false)); + adapter = new TreeViewAdapter(context, root, baseNodeViewFactory); + adapter.setTreeView(this); + recyclerView.setAdapter(adapter); +// return recyclerView; + } + + @Override + public void expandAll() { + if (root == null) { + return; + } + TreeHelper.expandAll(root); + + refreshTreeView(); + } + + + public void refreshTreeView() { + if (rootView != null) { + ((TreeViewAdapter) rootView.getAdapter()).refreshView(); + } + } + + public void updateTreeView() { + if (rootView != null) { + rootView.getAdapter().notifyDataSetChanged(); + } + } + + @Override + public void expandNode(TreeNode treeNode) { + adapter.expandNode(treeNode); + } + + @Override + public void expandLevel(int level) { + TreeHelper.expandLevel(root, level); + + refreshTreeView(); + } + + @Override + public void collapseAll() { + if (root == null) { + return; + } + TreeHelper.collapseAll(root); + + refreshTreeView(); + } + + @Override + public void collapseNode(TreeNode treeNode) { + adapter.collapseNode(treeNode); + } + + @Override + public void collapseLevel(int level) { + TreeHelper.collapseLevel(root, level); + + refreshTreeView(); + } + + @Override + public void toggleNode(TreeNode treeNode) { + if (treeNode.isExpanded()) { + collapseNode(treeNode); + } else { + expandNode(treeNode); + } + } + + @Override + public void deleteNode(TreeNode node) { + adapter.deleteNode(node); + } + + @Override + public void addNode(TreeNode parent, TreeNode treeNode) { + parent.addChild(treeNode); + + refreshTreeView(); + } + + @Override + public List getAllNodes() { + return TreeHelper.getAllNodes(root); + } + + @Override + public void selectNode(TreeNode treeNode) { + if (treeNode != null) { + adapter.selectNode(true, treeNode); + } + } + + @Override + public void deselectNode(TreeNode treeNode) { + if (treeNode != null) { + adapter.selectNode(false, treeNode); + } + } + + @Override + public void selectAll() { + TreeHelper.selectNodeAndChild(root, true); + + refreshTreeView(); + } + + @Override + public void deselectAll() { + TreeHelper.selectNodeAndChild(root, false); + + refreshTreeView(); + } + + @Override + public List getSelectedNodes() { + return TreeHelper.getSelectedNodes(root); + } + + public boolean isItemSelectable() { + return itemSelectable; + } + + public void setItemSelectable(boolean itemSelectable) { + this.itemSelectable = itemSelectable; + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeViewAdapter.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeViewAdapter.java new file mode 100644 index 0000000..cdd7558 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/TreeViewAdapter.java @@ -0,0 +1,286 @@ +/* + * Copyright 2016 - 2017 ShineM (Xinyuan) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under. + */ + +package com.bingce.controlnetwork.ui.widget.treeview; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Checkable; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.ui.widget.treeview.base.BaseNodeViewBinder; +import com.bingce.controlnetwork.ui.widget.treeview.base.BaseNodeViewFactory; +import com.bingce.controlnetwork.ui.widget.treeview.base.CheckableNodeViewBinder; +import com.bingce.controlnetwork.ui.widget.treeview.helper.TreeHelper; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.ui.widget.treeview.base.BaseNodeViewBinder; +import com.bingce.controlnetwork.ui.widget.treeview.base.BaseNodeViewFactory; +import com.bingce.controlnetwork.ui.widget.treeview.base.CheckableNodeViewBinder; +import com.bingce.controlnetwork.ui.widget.treeview.helper.TreeHelper; + +/** + * Created by xinyuanzhong on 2017/4/21. + */ + +public class TreeViewAdapter extends RecyclerView.Adapter { + + private final Context context; + + private final TreeNode root; + + private final List expandedNodeList; + + private final BaseNodeViewFactory baseNodeViewFactory; + + private TreeView treeView; + + TreeViewAdapter(Context context, TreeNode root, + @NonNull BaseNodeViewFactory baseNodeViewFactory) { + this.context = context; + this.root = root; + this.baseNodeViewFactory = baseNodeViewFactory; + + this.expandedNodeList = new ArrayList<>(); + + buildExpandedNodeList(); + } + + private void buildExpandedNodeList() { + expandedNodeList.clear(); + + for (TreeNode child : root.getChildren()) { + insertNode(expandedNodeList, child); + } + } + + private void insertNode(List nodeList, TreeNode treeNode) { + nodeList.add(treeNode); + + if (!treeNode.hasChild()) { + return; + } + if (treeNode.isExpanded()) { + for (TreeNode child : treeNode.getChildren()) { + insertNode(nodeList, child); + } + } + } + + @Override + public int getItemViewType(int position) { + // return expandedNodeList.get(position).getLevel(); // this old code row used to always return the level + TreeNode treeNode = expandedNodeList.get(position); + int viewType = this.baseNodeViewFactory.getViewType(treeNode); // default implementation returns the three node level but it can be overridden + return viewType; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int level) { + View view = LayoutInflater.from(context).inflate(baseNodeViewFactory.getNodeLayoutId(level), parent, false); + + BaseNodeViewBinder nodeViewBinder = baseNodeViewFactory.getNodeViewBinder(view, level); + nodeViewBinder.setTreeView(treeView); + return nodeViewBinder; + } + + @Override + public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) { + final View nodeView = holder.itemView; + final TreeNode treeNode = expandedNodeList.get(position); + final BaseNodeViewBinder viewBinder = (BaseNodeViewBinder) holder; + + if (viewBinder.getToggleTriggerViewId() != 0) { + View triggerToggleView = nodeView.findViewById(viewBinder.getToggleTriggerViewId()); + + if (triggerToggleView != null) { + triggerToggleView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onNodeToggled(treeNode); + viewBinder.onNodeToggled(treeNode, treeNode.isExpanded()); + } + }); + } + } else if (treeNode.isItemClickEnable()) { + nodeView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onNodeToggled(treeNode); + viewBinder.onNodeToggled(treeNode, treeNode.isExpanded()); + } + }); + } + + if (viewBinder instanceof CheckableNodeViewBinder) { + setupCheckableItem(nodeView, treeNode, (CheckableNodeViewBinder) viewBinder); + } + + viewBinder.bindView(treeNode); + } + + private void setupCheckableItem(View nodeView, + final TreeNode treeNode, + final CheckableNodeViewBinder viewBinder) { + final View view = nodeView.findViewById(viewBinder.getCheckableViewId()); + + if (view instanceof Checkable) { + final Checkable checkableView = (Checkable) view; + + view.setEnabled(treeNode.isEnable()); + if (treeNode.isEnable()) { + checkableView.setChecked(treeNode.isSelected()); + + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean checked = checkableView.isChecked(); + selectNode(checked, treeNode); + viewBinder.onNodeSelectedChanged(treeNode, checked); + } + }); + } + } else { + throw new ClassCastException("The getCheckableViewId() " + + "must return a CheckBox's id"); + } + } + + void selectNode(boolean checked, TreeNode treeNode) { + treeNode.setSelected(checked); + + selectChildren(treeNode, checked); + selectParentIfNeed(treeNode, checked); + } + + private void selectChildren(TreeNode treeNode, boolean checked) { + List impactedChildren = TreeHelper.selectNodeAndChild(treeNode, checked); + int index = expandedNodeList.indexOf(treeNode); + if (index != -1 && impactedChildren.size() > 0) { + notifyItemRangeChanged(index, impactedChildren.size() + 1); + } + } + + private void selectParentIfNeed(TreeNode treeNode, boolean checked) { + List impactedParents = TreeHelper.selectParentIfNeedWhenNodeSelected(treeNode, checked); + if (impactedParents.size() > 0) { + for (TreeNode parent : impactedParents) { + int position = expandedNodeList.indexOf(parent); + if (position != -1) notifyItemChanged(position); + } + } + } + + private void onNodeToggled(TreeNode treeNode) { + treeNode.setExpanded(!treeNode.isExpanded()); + + if (treeNode.isExpanded()) { + expandNode(treeNode); + } else { + collapseNode(treeNode); + } + } + + @Override + public int getItemCount() { + return expandedNodeList == null ? 0 : expandedNodeList.size(); + } + + /** + * Refresh all,this operation is only used for refreshing list when a large of nodes have + * changed value or structure because it take much calculation. + */ + void refreshView() { + buildExpandedNodeList(); + notifyDataSetChanged(); + } + + // Insert a node list after index. + private void insertNodesAtIndex(int index, List additionNodes) { + if (index < 0 || index > expandedNodeList.size() - 1 || additionNodes == null) { + return; + } + expandedNodeList.addAll(index + 1, additionNodes); + notifyItemRangeInserted(index + 1, additionNodes.size()); + } + + //Remove a node list after index. + private void removeNodesAtIndex(int index, List removedNodes) { + if (index < 0 || index > expandedNodeList.size() - 1 || removedNodes == null) { + return; + } + expandedNodeList.removeAll(removedNodes); + notifyItemRangeRemoved(index + 1, removedNodes.size()); + } + + /** + * Expand node. This operation will keep the structure of children(not expand children) + */ + void expandNode(TreeNode treeNode) { + if (treeNode == null) { + return; + } + List additionNodes = TreeHelper.expandNode(treeNode, false); + int index = expandedNodeList.indexOf(treeNode); + + insertNodesAtIndex(index, additionNodes); + } + + + /** + * Collapse node. This operation will keep the structure of children(not collapse children) + */ + void collapseNode(TreeNode treeNode) { + if (treeNode == null) { + return; + } + List removedNodes = TreeHelper.collapseNode(treeNode, false); + int index = expandedNodeList.indexOf(treeNode); + + removeNodesAtIndex(index, removedNodes); + } + + /** + * Delete a node from list.This operation will also delete its children. + */ + void deleteNode(TreeNode node) { + if (node == null || node.getParent() == null) { + return; + } + List allNodes = TreeHelper.getAllNodes(root); + if (allNodes.contains(node)) { + node.getParent().removeChild(node); + } + + //remove children form list before delete + collapseNode(node); + + int index = expandedNodeList.indexOf(node); + if (index != -1) { + expandedNodeList.remove(node); + } + notifyItemRemoved(index); + } + + void setTreeView(TreeView treeView) { + this.treeView = treeView; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseNodeViewBinder.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseNodeViewBinder.java new file mode 100644 index 0000000..88cbd09 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseNodeViewBinder.java @@ -0,0 +1,70 @@ +/* + * Copyright 2016 - 2017 ShineM (Xinyuan) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under. + */ + +package com.bingce.controlnetwork.ui.widget.treeview.base; + +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; +import com.bingce.controlnetwork.ui.widget.treeview.TreeView; + + +/** + * Created by zxy on 17/4/23. + */ + +public abstract class BaseNodeViewBinder extends RecyclerView.ViewHolder { + /** + * This reference of TreeView make BaseNodeViewBinder has the ability + * to expand node or select node. + */ + protected TreeView treeView; + + public BaseNodeViewBinder(View itemView) { + super(itemView); + } + + public void setTreeView(TreeView treeView) { + this.treeView = treeView; + } + + /** + * Bind your data to view,you can get the data from treeNode by getValue() + * + * @param treeNode Node data + */ + public abstract void bindView(TreeNode treeNode); + + /** + * if you do not want toggle the node when click whole item view,then you can assign a view to + * trigger the toggle action + * + * @return The assigned view id to trigger expand or collapse. + */ + public int getToggleTriggerViewId() { + return 0; + } + + /** + * Callback when a toggle action happened (only by clicked) + * + * @param treeNode The toggled node + * @param expand Expanded or collapsed + */ + public void onNodeToggled(TreeNode treeNode, boolean expand) { + //empty + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseNodeViewFactory.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseNodeViewFactory.java new file mode 100644 index 0000000..9c016d5 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseNodeViewFactory.java @@ -0,0 +1,58 @@ +/* + * Copyright 2016 - 2017 ShineM (Xinyuan) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under. + */ + +package com.bingce.controlnetwork.ui.widget.treeview.base; + +import android.view.View; + +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; + + +/** + * Created by zxy on 17/4/23. + */ + +public abstract class BaseNodeViewFactory { + + /** + * The default implementation below behaves as in previous version when TreeViewAdapter.getItemViewType always returned the level, + * but you can override it if you want some other viewType value to become the parameter to the method getNodeViewBinder. + * + * @param treeNode + * @return + */ + public int getViewType(TreeNode treeNode) { + return treeNode.getLevel(); + } + + /** + * If you want build a tree view,you must implement this factory method + * + * @param view The parameter for BaseNodeViewBinder's constructor, do not use this for other + * purpose! + * @param viewType The viewType value is the treeNode level in the default implementation. + * @return BaseNodeViewBinder + */ + public abstract BaseNodeViewBinder getNodeViewBinder(View view, int viewType); + + + /** + * If you want build a tree view,you must implement this factory method + * + * @param level Level of view, returned from {@link #getViewType} + * @return node layout id + */ + public abstract int getNodeLayoutId(int level); + +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseTreeAction.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseTreeAction.java new file mode 100644 index 0000000..7f18cdb --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/BaseTreeAction.java @@ -0,0 +1,50 @@ +/* + * Copyright 2016 - 2017 ShineM (Xinyuan) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under. + */ + +package com.bingce.controlnetwork.ui.widget.treeview.base; + +import java.util.List; + +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; + +/** + * Created by xinyuanzhong on 2017/4/20. + */ + +public interface BaseTreeAction { + void expandAll(); + + void expandNode(TreeNode treeNode); + + void expandLevel(int level); + + void collapseAll(); + + void collapseNode(TreeNode treeNode); + + void collapseLevel(int level); + + void toggleNode(TreeNode treeNode); + + void deleteNode(TreeNode node); + + void addNode(TreeNode parent, TreeNode treeNode); + + List getAllNodes(); + + // TODO: 17/4/30 + // 1.add node at position + // 2.add slide delete or other operations + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/CheckableNodeViewBinder.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/CheckableNodeViewBinder.java new file mode 100644 index 0000000..1c80515 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/CheckableNodeViewBinder.java @@ -0,0 +1,47 @@ +/* + * Copyright 2016 - 2017 ShineM (Xinyuan) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under. + */ + +package com.bingce.controlnetwork.ui.widget.treeview.base; + +import android.view.View; + +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; + +/** + * Created by xinyuanzhong on 2017/4/27. + */ + +public abstract class CheckableNodeViewBinder extends BaseNodeViewBinder { + + public CheckableNodeViewBinder(View itemView) { + super(itemView); + } + + /** + * Get the checkable view id. MUST BE A Checkable type! + * + * @return + */ + public abstract int getCheckableViewId(); + + /** + * Do something when a node select or deselect(only triggered by clicked) + * + * @param treeNode + * @param selected + */ + public void onNodeSelectedChanged(TreeNode treeNode, boolean selected) { + /*empty*/ + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/SelectableTreeAction.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/SelectableTreeAction.java new file mode 100644 index 0000000..1107280 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/base/SelectableTreeAction.java @@ -0,0 +1,35 @@ +/* + * Copyright 2016 - 2017 ShineM (Xinyuan) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under. + */ + +package com.bingce.controlnetwork.ui.widget.treeview.base; + +import java.util.List; + +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; + +/** + * Created by xinyuanzhong on 2017/4/27. + */ + +public interface SelectableTreeAction extends BaseTreeAction { + void selectNode(TreeNode treeNode); + + void deselectNode(TreeNode treeNode); + + void selectAll(); + + void deselectAll(); + + List getSelectedNodes(); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/FirstLevelNodeViewBinder.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/FirstLevelNodeViewBinder.java new file mode 100644 index 0000000..37bd6fd --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/FirstLevelNodeViewBinder.java @@ -0,0 +1,45 @@ +package com.bingce.controlnetwork.ui.widget.treeview.custom; + +import android.view.View; +import android.widget.TextView; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.ui.widget.treeview.base.CheckableNodeViewBinder; +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; +import com.bingce.controlnetwork.ui.widget.treeview.base.CheckableNodeViewBinder; + +/** + * Created by zxy on 17/4/23. + */ + +public class FirstLevelNodeViewBinder extends CheckableNodeViewBinder { + TextView textView; + View imageView; + + public FirstLevelNodeViewBinder(View itemView) { + super(itemView); + textView = itemView.findViewById(R.id.node_name_view); + imageView = itemView.findViewById(R.id.arrow_img); + } + + @Override + public int getCheckableViewId() { + return R.id.checkBox; + } + + @Override + public void bindView(final TreeNode treeNode) { + textView.setText(treeNode.getValue().getValue().toString()); + imageView.setRotation(treeNode.isExpanded() ? 90 : 0); + imageView.setVisibility(treeNode.hasChild() ? View.VISIBLE : View.INVISIBLE); + } + + @Override + public void onNodeToggled(TreeNode treeNode, boolean expand) { + if (expand) { + imageView.animate().rotation(90).setDuration(200).start(); + } else { + imageView.animate().rotation(0).setDuration(200).start(); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/MyNodeViewFactory.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/MyNodeViewFactory.java new file mode 100644 index 0000000..383e451 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/MyNodeViewFactory.java @@ -0,0 +1,43 @@ +package com.bingce.controlnetwork.ui.widget.treeview.custom; + +import android.view.View; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.ui.widget.treeview.base.BaseNodeViewBinder; +import com.bingce.controlnetwork.ui.widget.treeview.base.BaseNodeViewFactory; + + +/** + * Created by zxy on 17/4/23. + */ + +public class MyNodeViewFactory extends BaseNodeViewFactory { + + @Override + public BaseNodeViewBinder getNodeViewBinder(View view, int level) { + switch (level) { + case 0: + return new FirstLevelNodeViewBinder(view); + case 1: + return new SecondLevelNodeViewBinder(view); + case 2: + return new ThirdLevelNodeViewBinder(view); + default: + return null; + } + } + + @Override + public int getNodeLayoutId(int level) { + switch (level) { + case 0: + return R.layout.item_first_level; + case 1: + return R.layout.item_second_level; + case 2: + return R.layout.item_third_level; + default: + return 0; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/SecondLevelNodeViewBinder.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/SecondLevelNodeViewBinder.java new file mode 100644 index 0000000..9503e02 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/SecondLevelNodeViewBinder.java @@ -0,0 +1,51 @@ +package com.bingce.controlnetwork.ui.widget.treeview.custom; + +import android.view.View; +import android.widget.TextView; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.ui.widget.treeview.base.CheckableNodeViewBinder; +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; +import com.bingce.controlnetwork.ui.widget.treeview.base.CheckableNodeViewBinder; + +/** + * Created by zxy on 17/4/23. + */ + +public class SecondLevelNodeViewBinder extends CheckableNodeViewBinder { + + TextView textView; + View imageView; + + public SecondLevelNodeViewBinder(View itemView) { + super(itemView); + textView = itemView.findViewById(R.id.node_name_view); + imageView = itemView.findViewById(R.id.arrow_img); + } + +// @Override +// public int getLayoutId() { +// return R.layout.item_second_level; +// } + + @Override + public int getCheckableViewId() { + return R.id.checkBox; + } + + @Override + public void bindView(final TreeNode treeNode) { + textView.setText(treeNode.getValue().getValue().toString()); + imageView.setRotation(treeNode.isExpanded() ? 90 : 0); + imageView.setVisibility(treeNode.hasChild() ? View.VISIBLE : View.INVISIBLE); + } + + @Override + public void onNodeToggled(TreeNode treeNode, boolean expand) { + if (expand) { + imageView.animate().rotation(90).setDuration(200).start(); + } else { + imageView.animate().rotation(0).setDuration(200).start(); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/ThirdLevelNodeViewBinder.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/ThirdLevelNodeViewBinder.java new file mode 100644 index 0000000..ae73150 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/custom/ThirdLevelNodeViewBinder.java @@ -0,0 +1,43 @@ +package com.bingce.controlnetwork.ui.widget.treeview.custom; + +import android.view.View; +import android.widget.Checkable; +import android.widget.TextView; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.ui.widget.treeview.base.CheckableNodeViewBinder; +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; +import com.bingce.controlnetwork.ui.widget.treeview.base.CheckableNodeViewBinder; + +/** + * Created by zxy on 17/4/23. + */ + +public class ThirdLevelNodeViewBinder extends CheckableNodeViewBinder { + TextView textView; + + public ThirdLevelNodeViewBinder(View itemView) { + super(itemView); + textView = itemView.findViewById(R.id.node_name_view); + } + + @Override + public int getCheckableViewId() { + return R.id.checkBox; + } + + @Override + public void bindView(TreeNode treeNode) { + textView.setText(treeNode.getValue().getValue().toString()); + } + + @Override + public void onNodeToggled(TreeNode treeNode, boolean expand) { + final View view = itemView.findViewById(getCheckableViewId()); + if (view instanceof Checkable && treeNode.isEnable()) { + final Checkable checkableView = (Checkable) view; + checkableView.setChecked(!checkableView.isChecked()); + treeNode.setSelected(checkableView.isChecked()); + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/helper/TreeHelper.java b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/helper/TreeHelper.java new file mode 100644 index 0000000..ada7a75 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/ui/widget/treeview/helper/TreeHelper.java @@ -0,0 +1,290 @@ +/* + * Copyright 2016 - 2017 ShineM (Xinyuan) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under. + */ + +package com.bingce.controlnetwork.ui.widget.treeview.helper; + +import java.util.ArrayList; +import java.util.List; + +import com.bingce.controlnetwork.ui.widget.treeview.TreeNode; + +/** + * Created by xinyuanzhong on 2017/4/27. + */ + +public class TreeHelper { + + public static void expandAll(TreeNode node) { + if (node == null) { + return; + } + expandNode(node, true); + } + + /** + * Expand node and calculate the visible addition nodes. + * + * @param treeNode target node to expand + * @param includeChild should expand child + * @return the visible addition nodes + */ + public static List expandNode(TreeNode treeNode, boolean includeChild) { + List expandChildren = new ArrayList<>(); + + if (treeNode == null) { + return expandChildren; + } + + treeNode.setExpanded(true); + + if (!treeNode.hasChild()) { + return expandChildren; + } + + for (TreeNode child : treeNode.getChildren()) { + expandChildren.add(child); + + if (includeChild || child.isExpanded()) { + expandChildren.addAll(expandNode(child, includeChild)); + } + } + + return expandChildren; + } + + /** + * Expand the same deep(level) nodes. + * + * @param root the tree root + * @param level the level to expand + */ + public static void expandLevel(TreeNode root, int level) { + if (root == null) { + return; + } + + for (TreeNode child : root.getChildren()) { + if (child.getLevel() == level) { + expandNode(child, false); + } else { + expandLevel(child, level); + } + } + } + + public static void collapseAll(TreeNode node) { + if (node == null) { + return; + } + for (TreeNode child : node.getChildren()) { + performCollapseNode(child, true); + } + } + + /** + * Collapse node and calculate the visible removed nodes. + * + * @param node target node to collapse + * @param includeChild should collapse child + * @return the visible addition nodes before remove + */ + public static List collapseNode(TreeNode node, boolean includeChild) { + List treeNodes = performCollapseNode(node, includeChild); + node.setExpanded(false); + return treeNodes; + } + + private static List performCollapseNode(TreeNode node, boolean includeChild) { + List collapseChildren = new ArrayList<>(); + + if (node == null) { + return collapseChildren; + } + if (includeChild) { + node.setExpanded(false); + } + for (TreeNode child : node.getChildren()) { + collapseChildren.add(child); + + if (child.isExpanded()) { + collapseChildren.addAll(performCollapseNode(child, includeChild)); + } else if (includeChild) { + performCollapseNodeInner(child); + } + } + + return collapseChildren; + } + + /** + * Collapse all children node recursive + * + * @param node target node to collapse + */ + private static void performCollapseNodeInner(TreeNode node) { + if (node == null) { + return; + } + node.setExpanded(false); + for (TreeNode child : node.getChildren()) { + performCollapseNodeInner(child); + } + } + + public static void collapseLevel(TreeNode root, int level) { + if (root == null) { + return; + } + for (TreeNode child : root.getChildren()) { + if (child.getLevel() == level) { + collapseNode(child, false); + } else { + collapseLevel(child, level); + } + } + } + + public static List getAllNodes(TreeNode root) { + List allNodes = new ArrayList<>(); + + fillNodeList(allNodes, root); + allNodes.remove(root); + + return allNodes; + } + + private static void fillNodeList(List treeNodes, TreeNode treeNode) { + treeNodes.add(treeNode); + + if (treeNode.hasChild()) { + for (TreeNode child : treeNode.getChildren()) { + fillNodeList(treeNodes, child); + } + } + } + + /** + * Select the node and node's children,return the visible nodes + */ + public static List selectNodeAndChild(TreeNode treeNode, boolean select) { + List expandChildren = new ArrayList<>(); + + if (treeNode == null) { + return expandChildren; + } + + treeNode.setSelected(select); + + if (!treeNode.hasChild()) { + return expandChildren; + } + + if (treeNode.isExpanded()) { + for (TreeNode child : treeNode.getChildren()) { + expandChildren.add(child); + + if (child.isExpanded()) { + expandChildren.addAll(selectNodeAndChild(child, select)); + } else { + selectNodeInner(child, select); + } + } + } else { + selectNodeInner(treeNode, select); + } + return expandChildren; + } + + private static void selectNodeInner(TreeNode treeNode, boolean select) { + if (treeNode == null) { + return; + } + treeNode.setSelected(select); + if (treeNode.hasChild()) { + for (TreeNode child : treeNode.getChildren()) { + selectNodeInner(child, select); + } + } + } + + /** + * Select parent when all the brothers have been selected, otherwise deselect parent, + * and check the grand parent recursive. + */ + public static List selectParentIfNeedWhenNodeSelected(TreeNode treeNode, boolean select) { + List impactedParents = new ArrayList<>(); + if (treeNode == null) { + return impactedParents; + } + + //ensure that the node's level is bigger than 1(first level is 1) + TreeNode parent = treeNode.getParent(); + if (parent == null || parent.getParent() == null) { + return impactedParents; + } + + List brothers = parent.getChildren(); + int selectedBrotherCount = 0; + for (TreeNode brother : brothers) { + if (brother.isSelected()) selectedBrotherCount++; + } + + if (select && selectedBrotherCount == brothers.size()) { + parent.setSelected(true); + impactedParents.add(parent); + impactedParents.addAll(selectParentIfNeedWhenNodeSelected(parent, true)); + } else if (!select && selectedBrotherCount == brothers.size() - 1) { + // only the condition that the size of selected's brothers + // is one less than total count can trigger the deselect + parent.setSelected(false); + impactedParents.add(parent); + impactedParents.addAll(selectParentIfNeedWhenNodeSelected(parent, false)); + } + return impactedParents; + } + + /** + * Get the selected nodes under current node, include itself + */ + public static List getSelectedNodes(TreeNode treeNode) { + List selectedNodes = new ArrayList<>(); + if (treeNode == null) { + return selectedNodes; + } + + if (treeNode.isSelected() && treeNode.getParent() != null) selectedNodes.add(treeNode); + + for (TreeNode child : treeNode.getChildren()) { + selectedNodes.addAll(getSelectedNodes(child)); + } + return selectedNodes; + } + + /** + * Return true when the node has one selected child(recurse all children) at least, + * otherwise return false + */ + public static boolean hasOneSelectedNodeAtLeast(TreeNode treeNode) { + if (treeNode == null || treeNode.getChildren().size() == 0) { + return false; + } + List children = treeNode.getChildren(); + for (TreeNode child : children) { + if (child.isSelected() || hasOneSelectedNodeAtLeast(child)) { + return true; + } + } + return false; + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/util/CheckControlUpdateUtil.java b/app/src/main/java/com/bingce/controlnetwork/util/CheckControlUpdateUtil.java new file mode 100644 index 0000000..2148a39 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/util/CheckControlUpdateUtil.java @@ -0,0 +1,97 @@ +package com.bingce.controlnetwork.util; + +import android.app.Activity; +import android.content.Context; + +import androidx.appcompat.app.AlertDialog; + +import com.bingce.AppChannel; +import com.bingce.BaseApp; +import com.bingce.data.sync.utils.LeanCloudConfigLoader; +import com.bingce.utils.StringUtil; +import com.bingce.utils.UpdateUtils; + +import blankj.utilcode.util.AppUtils; +import blankj.utilcode.util.Utils; + +import com.bingce.controlnetwork.R; + +public class CheckControlUpdateUtil { + public static void checkUpdate(Context context, boolean forceShow) { + String queryUrl = "latestVersionCodeUrlControl"; + if (AppChannel.customChannel == AppChannel.CUSTOM_CONTROL_PRO) { + queryUrl = "latestVersionCodeUrlControlPro"; + } + LeanCloudConfigLoader.findInBackground(queryUrl, instance -> { +// new LCQuery<>("Configuration") +// .whereEqualTo("name", queryUrl) +// .limit(1) +// .findInBackground().subscribe(new Observer>() { +// @Override +// public void onSubscribe(Disposable d) { +// +// } +// +// @Override +// public void onNext(List avObjects) { + if (context instanceof Activity && ((Activity) context).isFinishing()) return; + if (/*avObjects != null && !avObjects.isEmpty() && avObjects.get(0).getString("value") != null*/instance != null && StringUtil.isNotEmpty(instance.value)) { + String latestVersionCodeUrl = /*avObjects.get(0).getString("value")*/instance.value; + String updateLog = /*avObjects.get(0).getString("value2")*/instance.value2; + String specialVersions = instance.value3; + boolean isInSpecialVersions = false; + if (StringUtil.isNotEmpty(specialVersions)) { + String[] versionArr = specialVersions.split(",", -2); + int currentVersionCode = AppUtils.getAppVersionCode(); + for (String s : versionArr) { + String[] subVersionArr = s.split("-", -2); + if (subVersionArr.length == 2) { + int v1 = Integer.parseInt(subVersionArr[0]); + int v2 = Integer.parseInt(subVersionArr[1]); + if (currentVersionCode >= v1 && currentVersionCode <= v2) { + isInSpecialVersions = true; + break; + } + } + } + } + String[] arr = latestVersionCodeUrl.split(",", -2); + if (arr.length == 2 && updateLog != null && arr[1].endsWith(".apk")) { + try { + if (isInSpecialVersions) { + UpdateUtils.getInstance().showUpdate(context, updateLog, arr[0], arr[1], forceShow); + } else { + if (forceShow) { + if (Integer.parseInt(arr[0]) > AppUtils.getAppVersionCode()) { + UpdateUtils.getInstance().showUpdate(context, updateLog, arr[0], arr[1], forceShow); + } else { + new AlertDialog.Builder(context) + .setTitle(R.string.hint) + .setMessage(R.string.already_the_latest_version) + .setPositiveButton(R.string.close, null) + .show(); + } + } else { + if (Integer.parseInt(arr[0]) > AppUtils.getAppVersionCode() && Integer.parseInt(arr[0]) > ((BaseApp) Utils.getApp()).ignoredVersionCode) { + UpdateUtils.getInstance().showUpdate(context, updateLog, arr[0], arr[1], forceShow); + } + } + } + } catch (Exception ignored) { + } + } + } +// } +// +// @Override +// public void onError(Throwable e) { +// emergency();//后门,防止leancloud崩溃时会员无法登录 +// } +// +// @Override +// public void onComplete() { +// +// } + }); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/util/DatabaseFixUtils.java b/app/src/main/java/com/bingce/controlnetwork/util/DatabaseFixUtils.java new file mode 100644 index 0000000..5dc7d38 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/util/DatabaseFixUtils.java @@ -0,0 +1,53 @@ +package com.bingce.controlnetwork.util; + +import com.bingce.controlapphelper.datasource.database.SurveyorDataBase; +import com.bingce.controlapphelper.datasource.database.ToleranceTemplate; +import com.bingce.controlapphelper.datasource.database.config.ConfigConstants; +import com.bingce.controlapphelper.datasource.database.config.ConfigRecord; +import com.bingce.controlapphelper.datasource.database.project.ProjectRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord; +import com.bingce.controlapphelper.datasource.database.tolerance.group.ToleranceGroupConstants; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.List; + +public class DatabaseFixUtils { + //解决某个版本的bug: + //由于升级数据库,导致限差方案丢失,所以启动的时候检测所有project,为没有限差的项目重新添加限差 + public static void changeDefaultTolerance() { + ThreadPoolUtil.execute(() -> { + List projectRecordList = SurveyorDataBase.getInstance() + .projectDao().getAllSync(); + if (projectRecordList != null) { + //查询默认限限差 + ConfigRecord defaultToleranceId = SurveyorDataBase.getInstance().configDao().getByKeySync(ConfigConstants.KEY_DEFAULT_TOLERANCE_DETAIL); + ToleranceDetailRecord defaultTolerance = null; + if (defaultToleranceId == null) { + List detailRecords = + ToleranceTemplate.detailListOfGroup(ToleranceGroupConstants.VALUE_MUL_CYCLE_ANGLE); + if (detailRecords.isEmpty()) { + return; + } + defaultTolerance = detailRecords.get(0); + } else { + defaultTolerance = SurveyorDataBase.getInstance().toleranceDetailDao() + .getByIdSync(defaultToleranceId.configValue); + } + if (defaultTolerance == null) { + return; + } + for (ProjectRecord projectRecord : projectRecordList) { + String toleranceId = projectRecord.toleranceId; + ToleranceDetailRecord toleranceDetailRecord = SurveyorDataBase.getInstance().toleranceDetailDao() + .getByIdSync(toleranceId); + if (toleranceDetailRecord == null) { + projectRecord.toleranceId = defaultTolerance.id; + SurveyorDataBase.getInstance().projectDao() + .save(projectRecord); + //项目的限差id不为空了,但是数据库的限差可能还是没有? + } + } + } + }); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/util/DefaultNameUtil.kt b/app/src/main/java/com/bingce/controlnetwork/util/DefaultNameUtil.kt new file mode 100644 index 0000000..52a0cd1 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/util/DefaultNameUtil.kt @@ -0,0 +1,29 @@ +package com.bingce.controlnetwork.util + +import com.bingce.controlapphelper.util.Tools +import com.bingce.controlnetwork.R +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +object DefaultNameUtil { + /** + * DateUtils.ymdWithCharacter(Date()) + */ + @JvmStatic + fun getDefaultProjectName(): String { + val format = Tools.getString(R.string.default_project_format) + val simpleDateFormat = SimpleDateFormat(format, Locale.getDefault()) + return simpleDateFormat.format(Date()) + } + + /** + * DateUtils.ymdHMSWithCharacter(Date()) + */ + @JvmStatic + fun getDefaultPeriodName(): String { + val format = Tools.getString(R.string.default_period_format) + val simpleDateFormat = SimpleDateFormat(format, Locale.getDefault()) + return simpleDateFormat.format(Date()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/util/SurveyorStationUtil.java b/app/src/main/java/com/bingce/controlnetwork/util/SurveyorStationUtil.java new file mode 100644 index 0000000..7e0d407 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/util/SurveyorStationUtil.java @@ -0,0 +1,126 @@ +package com.bingce.controlnetwork.util; + +import android.content.Context; + +import androidx.annotation.MainThread; + +import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; +import com.bingce.controlapphelper.datasource.database.line.LineRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord; +import com.bingce.controlapphelper.datasource.database.surveyorstation.model.SurveyorPoint; +import com.bingce.controlapphelper.model.StationDetailItem; +import com.bingce.utils.IOnSingleGetCallback; +import com.bingce.utils.ThreadPoolUtil; + +import java.util.List; + +import com.bingce.controlnetwork.fragment.station.line.attached.LineStationAttachedSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.close.LineStationCloseSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.random.LineStationRandomSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.single.LineStationSingleSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellDoubleGroundSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellDoubleUnderGroundSetupFragment; +import com.bingce.controlnetwork.fragment.station.line.well.LineStationWellSetupFragment; + +public class SurveyorStationUtil { + @MainThread + public static void editLine(Context context, String lineId) { + ThreadPoolUtil.execute(() -> { + LineRecord stationBatchRecord = + SurveyorDatabaseFactory.instance.getLineRecordDatabase().findById(lineId); + if (stationBatchRecord == null) { + return; + } +// //1.查询该线路下所有测站 +// List stationRecordList = +// SurveyorDatabaseFactory.instance.getSurveyorStation().getDataListByLine(stationBatchRecord.id); +// //2.遍历测站,检测是否有测量数据 +// if (stationRecordList != null) { +// for (SurveyorStationRecord record : stationRecordList) { +// if (record == null) { +// continue; +// } +// long count = SurveyorDatabaseFactory +// .instance +// .getSurveyorRecordDataSource() +// .recordCount(record.id); +// if (count > 0) {//如果有测量数据,则该导线不能编辑 +// ThreadPoolUtil.executeInMain(() -> TipsFragment.tipsOnly(fragmentManager, +// lifecycleOwner, +// context, +// context.getString(R.string.tips_forbid_edit_line_because_has_surveyor_record))); +// return; +// } +// } +// } + if (LineRecord.TYPE_LINE_SINGLE.equals(stationBatchRecord.type)) { + LineStationSingleSetupFragment.startEdit(context, stationBatchRecord.projectId, lineId); + } else if (LineRecord.TYPE_LINE_ATTACH.equals(stationBatchRecord.type)) { + LineStationAttachedSetupFragment.startEdit(context, stationBatchRecord.projectId, lineId); + } else if (LineRecord.TYPE_LINE_CLOSE.equals(stationBatchRecord.type)) { + LineStationCloseSetupFragment.startEdit(context, stationBatchRecord.projectId, lineId); + } else if (LineRecord.TYPE_LINE_RANDOM.equals(stationBatchRecord.type)) { + LineStationRandomSetupFragment.startEdit(context, stationBatchRecord.projectId, lineId); + } else if (LineRecord.TYPE_WELL.equals(stationBatchRecord.type)) { + LineStationWellSetupFragment.startEdit(context, stationBatchRecord.projectId, lineId); + } else if (LineRecord.TYPE_WELL_DOUBLE_GROUND.equals(stationBatchRecord.type)) { + LineStationWellDoubleGroundSetupFragment.startEdit(context, stationBatchRecord.projectId, lineId); + } else if (LineRecord.TYPE_WELL_DOUBLE_UNDERGROUND.equals(stationBatchRecord.type)) { + LineStationWellDoubleUnderGroundSetupFragment.startEdit(context, stationBatchRecord.projectId, lineId); + } + }); + } + + @MainThread + public static void getBatchItemList(String lineId, IOnSingleGetCallback callback) { + ThreadPoolUtil.execute(() -> { + LineRecord batchRecord = + SurveyorDatabaseFactory.instance.getLineRecordDatabase() + .findById(lineId); + if (batchRecord == null) { + return; + } + callback.onGet(batchRecord); + }); + } + + @MainThread + public static void updateLineRecord(LineRecord lineRecord) { + if (lineRecord == null) return; + SurveyorDatabaseFactory.instance.getLineRecordDatabase().update(lineRecord); + } + + @MainThread + public static void updateStationPointsMeasureHorAag(LineRecord lineRecord) { + if (lineRecord == null) return; + List stationDetailList = lineRecord.items; + if (stationDetailList == null) { + return; + } + + ThreadPoolUtil.execute(() -> { + List stationRecordList = SurveyorDatabaseFactory.instance.getSurveyorStation().getDataListByLine(lineRecord.id); + if (stationRecordList != null && !stationRecordList.isEmpty()) { + for (SurveyorStationRecord record : stationRecordList) { + List items = record.items; + if (items == null) { + continue; + } + for (SurveyorPoint point : items) { + for (StationDetailItem stationDetailItem : stationDetailList) { + if (point != null && point.getOriginalPointId().equals(stationDetailItem.getOriginalPointId()) + && point.isWellSteel() != point.isWellSteel()) { + // TODO: 2023/5/22 + point.setWellSteel(stationDetailItem.isWellSteel()); + SurveyorDatabaseFactory.instance.getSurveyorStation().update(record); + } + } + } + } + } + }); + + + } + +} diff --git a/app/src/main/java/com/bingce/controlnetwork/util/config/AbstractSetConfigs.java b/app/src/main/java/com/bingce/controlnetwork/util/config/AbstractSetConfigs.java new file mode 100644 index 0000000..3399c69 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/util/config/AbstractSetConfigs.java @@ -0,0 +1,80 @@ +package com.bingce.controlnetwork.util.config; + +import java.util.LinkedHashMap; +import java.util.Map; + +public abstract class AbstractSetConfigs { + private final Map list = new LinkedHashMap<>(); + + protected AbstractSetConfigs() { + } + + public void foreach(IConfigItemCallback callback) { + if (callback == null) { + return; + } + for (ConfigItem configItem : list.values()) { + callback.on(configItem); + } + } + + public ConfigItem get(int id) { + return list.get(id); + } + + public String allIds() { + return ConfigItem.ids(list.values()); + } + + public String defaultIds() { + return allIds(); + } + +// private static AbstractSetConfigs instance = null; +// +// public static AbstractSetConfigs getInstance() { +// synchronized (ParameterSetConfigs.class) { +// if (instance == null) { +// instance = new ParameterSetConfigs(); +// init(); +// } +// } +// return instance; +// } + + public void init() { + init(list); + } + + protected abstract void init(final Map list);// { +// list.put(99, new ConfigItem(99, R.string.road_project_management, R.mipmap.icon_parameter_road_project, DragIconInfo.CATEGORY_ONLY)); +// list.put(100, new ConfigItem(100, R.string.road_parameter, R.mipmap.icon_parameter_road, DragIconInfo.CATEGORY_ONLY)); +// list.put(101, new ConfigItem(101, R.string.break_chain, R.mipmap.icon_parameter_breakchain, DragIconInfo.CATEGORY_ONLY)); +// list.put(102, new ConfigItem(102, R.string.hor_parameter, R.mipmap.icon_parameter_hor, DragIconInfo.CATEGORY_ONLY)); +// list.put(103, new ConfigItem(103, R.string.ver_parameter, R.mipmap.icon_parameter_ver, DragIconInfo.CATEGORY_ONLY)); +// list.put(104, new ConfigItem(104, R.string.standard_cross_section, R.mipmap.icon_parameter_stand_cross_section, DragIconInfo.CATEGORY_ONLY)); +// list.put(105, new ConfigItem(105, R.string.super_elevation, R.mipmap.icon_parameter_super, DragIconInfo.CATEGORY_ONLY)); +// list.put(106, new ConfigItem(106, R.string.widen_change, R.mipmap.icon_parameter_widen, DragIconInfo.CATEGORY_ONLY)); +// list.put(107, new ConfigItem(107, R.string.tunnel_section_library, R.mipmap.icon_parameter_tunnel_section_library, DragIconInfo.CATEGORY_ONLY)); +// list.put(108, new ConfigItem(108, R.string.tcs_matching, R.mipmap.icon_parameter_tunnel_section_matching, DragIconInfo.CATEGORY_ONLY)); +// list.put(109, new ConfigItem(109, R.string.middle_line_offset, R.mipmap.icon_parameter_middle_line_offset, DragIconInfo.CATEGORY_ONLY)); +// list.put(110, new ConfigItem(110, R.string.subway_center_up_down, R.mipmap.icon_parameter_subway_updown, DragIconInfo.CATEGORY_ONLY)); +// list.put(111, new ConfigItem(111, R.string.tcs_feature_point, R.mipmap.icon_parameter_tunnel_feanture_points, DragIconInfo.CATEGORY_ONLY)); +// list.put(112, new ConfigItem(112, R.string.tunnel_embedded_part, R.mipmap.icon_parameter_tunnel_embedded_part, DragIconInfo.CATEGORY_ONLY)); +// list.put(113, new ConfigItem(113, R.string.tcs_rotate, R.mipmap.icon_parameter_tunnel_rotate, DragIconInfo.CATEGORY_ONLY)); +// list.put(114, new ConfigItem(114, R.string.control_point, R.mipmap.icon_parameter_points, DragIconInfo.CATEGORY_ONLY)); +// list.put(115, new ConfigItem(115, R.string.side_section_library, R.mipmap.icon_parameter_side_library, DragIconInfo.CATEGORY_ONLY)); +// list.put(116, new ConfigItem(116, R.string.scs_matching, R.mipmap.icon_parameter_side_section_matching, DragIconInfo.CATEGORY_ONLY)); +// list.put(117, new ConfigItem(117, R.string.subway_common_parameters, R.mipmap.icon_parameter_subway_common_parameters, DragIconInfo.CATEGORY_ONLY)); +// list.put(118, new ConfigItem(118, R.string.tbm_reference_point, R.mipmap.icon_parameter_subway_tbm_reference_point, DragIconInfo.CATEGORY_ONLY)); +// list.put(119, new ConfigItem(119, R.string.staking_point_library, R.mipmap.icon_parameter_staking_point_library, DragIconInfo.CATEGORY_ONLY)); +// list.put(120, new ConfigItem(120, R.string.point_survey_point_library, R.mipmap.icon_program_point_survey, DragIconInfo.CATEGORY_ONLY)); +// list.put(121, new ConfigItem(121, R.string.pier_template_library, R.mipmap.icon_parameter_pier_template_library, DragIconInfo.CATEGORY_ONLY)); +// list.put(122, new ConfigItem(122, R.string.bridge_and_layout, R.mipmap.icon_parameter_pier_layout, DragIconInfo.CATEGORY_ONLY)); +// if (AppChannel.customChannel == AppChannel.CUSTOM_ZJYGJ) { +// list.put(123, new ConfigItem(123, R.string.menu_item_zjygj_project_list, R.mipmap.icon_road_project_list_zjygj, DragIconInfo.CATEGORY_ONLY)); +// } +// } + +// public abstract void onItemClick(int id, Fragment fragment); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/util/config/ConfigItem.java b/app/src/main/java/com/bingce/controlnetwork/util/config/ConfigItem.java new file mode 100644 index 0000000..630759f --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/util/config/ConfigItem.java @@ -0,0 +1,86 @@ +package com.bingce.controlnetwork.util.config; + +import android.content.Context; + +import com.wedcel.dragexpandgrid.model.DragIconInfo; + +import java.util.ArrayList; +import java.util.Collection; + +public class ConfigItem { + public ConfigItem(int id, int title, int icon, int category) { + this.id = id; + this.title = title; + this.icon = icon; + this.category = category; + } + + private int id; + private int title; + private int icon; + int category; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getTitle() { + return title; + } + + public void setTitle(int title) { + this.title = title; + } + + public int getIcon() { + return icon; + } + + public void setIcon(int icon) { + this.icon = icon; + } + + public int getCategory() { + return category; + } + + public void setCategory(int category) { + this.category = category; + } + + private static int readStringResId(Context context, String name) { + return context.getResources().getIdentifier(name, "string", context.getPackageName()); + } + + private static int readMipmapResId(Context context, String name) { + return context.getResources().getIdentifier(name, "mipmap", context.getPackageName()); + } + + private static String readStringValue(Context context, String name) { + return context.getString(readStringResId(context, name)); + } + + public DragIconInfo convert(Context context) { + return new DragIconInfo( + getId(), + context.getString(getTitle()), + getIcon(), + DragIconInfo.CATEGORY_ONLY, + false, + new ArrayList<>()); + } + + public static String ids(Collection list) { + StringBuilder builder = new StringBuilder(); + for (ConfigItem item : list) { + builder + .append(item.getId()) + .append(","); + } + return builder.toString(); + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/util/config/ConfigsSetConfigs.java b/app/src/main/java/com/bingce/controlnetwork/util/config/ConfigsSetConfigs.java new file mode 100644 index 0000000..0f9eda2 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/util/config/ConfigsSetConfigs.java @@ -0,0 +1,110 @@ +package com.bingce.controlnetwork.util.config; + +import android.content.Context; +import android.content.Intent; + +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.AppChannel; +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.fragment.ConfigFragment; +import com.bingce.controlnetwork.fragment.PointListFragment; +import com.bingce.controlnetwork.fragment.PrismManageFragment; +import com.bingce.controlnetwork.fragment.SelectExportHeightTraverseFragment; +import com.bingce.controlnetwork.fragment.SelectExportSurveyorRecordFragment; +import com.bingce.controlnetwork.fragment.SelectExportSurveyorRecordWireFileFragment; +import com.bingce.controlnetwork.fragment.SelectMeasureDataExportTypeFragment; +import com.bingce.controlnetwork.fragment.ToleranceManageFragment; +import com.bingce.data.database.deformationmonitor.util.GsonUtils; +import com.bingce.device.ui.ConnectTSActivity; +import com.wedcel.dragexpandgrid.model.DragIconInfo; + +import java.util.Map; + +public class ConfigsSetConfigs extends AbstractSetConfigs { + + private final static int FUC_INSTRUMENTMANAGEMENT = 101; //仪器管理 + private final static int FUC_GLOBAL_CONTROL_POINT = 102;//全局控制点 + private final static int FUC_EXPORT_STATION = 103; //观测数据导出 + private final static int FUC_EXPORT_WIRE_FILE = 104;//导线文件导出 + private final static int FUC_TOLERANCE_MANAGER = 105;//自定义限差管理 + private final static int FUC_PRISM_MANAGER = 106;//棱镜管理 + private final static int FUC_HEIGHT_TRAVERSE_EXPORT = 107;//高程导线数据导出 + + @Override + protected void init(Map list) { + list.put(FUC_INSTRUMENTMANAGEMENT, + new ConfigItem(FUC_INSTRUMENTMANAGEMENT, R.string.total_station_online, R.drawable.icon_ts_connecting, DragIconInfo.CATEGORY_ONLY)); + list.put(FUC_GLOBAL_CONTROL_POINT, + new ConfigItem(FUC_GLOBAL_CONTROL_POINT, R.string.global_control_point, R.drawable.icon_parameter_points, DragIconInfo.CATEGORY_ONLY)); + list.put(FUC_EXPORT_STATION, + new ConfigItem(FUC_EXPORT_STATION, R.string.export, R.drawable.ic_export, DragIconInfo.CATEGORY_ONLY)); + list.put(FUC_EXPORT_WIRE_FILE, + new ConfigItem(FUC_EXPORT_WIRE_FILE, R.string.export_wire_file, R.drawable.ic_export_wire, DragIconInfo.CATEGORY_ONLY)); + list.put(FUC_TOLERANCE_MANAGER, + new ConfigItem(FUC_TOLERANCE_MANAGER, R.string.name_custom_telorance_manager, R.drawable.ic_custom_tolerance, DragIconInfo.CATEGORY_ONLY)); + list.put(FUC_PRISM_MANAGER, + new ConfigItem(FUC_PRISM_MANAGER, R.string.prism_manager, R.drawable.icon_prism_manager, DragIconInfo.CATEGORY_ONLY)); + list.put(FUC_HEIGHT_TRAVERSE_EXPORT, + new ConfigItem(FUC_HEIGHT_TRAVERSE_EXPORT, R.string.export_height_traverse, R.drawable.ic_export_height_traverse, DragIconInfo.CATEGORY_ONLY)); + } + + private static ConfigsSetConfigs instance = null; + + public static ConfigsSetConfigs getInstance() { + if (instance == null) { + synchronized (ConfigsSetConfigs.class) { + if (instance == null) { + instance = new ConfigsSetConfigs(); + instance.init(); + } + } + } + return instance; + } + + public void onItemClick(int id, ConfigFragment fragment) { + Context context = fragment.requireContext(); + switch (id) { + case FUC_INSTRUMENTMANAGEMENT://仪器管理 + Intent intent = new Intent(context, ConnectTSActivity.class); + intent.putExtra("customChannel", AppChannel.customChannel); + context.startActivity(intent); + break; + case FUC_GLOBAL_CONTROL_POINT://全局控制点 + PointListFragment.go2GlobalPointList(context); + break; + case FUC_EXPORT_STATION://观测数据导出 + startExportMeasureData(context, fragment.getChildFragmentManager(), fragment.getViewLifecycleOwner()); + break; + case FUC_EXPORT_WIRE_FILE://导线文件导出 + SelectExportSurveyorRecordWireFileFragment.start(context); + break; + case FUC_TOLERANCE_MANAGER://自定义限差管理 + ToleranceManageFragment.start(context, null); + break; + case FUC_PRISM_MANAGER://棱镜管理 + PrismManageFragment.start(context); + break; + case FUC_HEIGHT_TRAVERSE_EXPORT://高程导线数据导出 + SelectExportHeightTraverseFragment.start(context); + break; + } + } + + /** + * 测院导出观测前先选择导出文件类型 + * + * @param context + * @param fragmentManager + * @param lifecycleOwner + */ + private void startExportMeasureData(Context context, FragmentManager fragmentManager, + LifecycleOwner lifecycleOwner) { + SelectMeasureDataExportTypeFragment.start(fragmentManager, lifecycleOwner, beanList -> { + String json = GsonUtils.toJson(beanList); + SelectExportSurveyorRecordFragment.start(context); + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/util/config/IConfigItemCallback.java b/app/src/main/java/com/bingce/controlnetwork/util/config/IConfigItemCallback.java new file mode 100644 index 0000000..4c23deb --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/util/config/IConfigItemCallback.java @@ -0,0 +1,5 @@ +package com.bingce.controlnetwork.util.config; + +public interface IConfigItemCallback { + void on(ConfigItem item); +} diff --git a/app/src/main/java/com/bingce/controlnetwork/wxapi/Constants.java b/app/src/main/java/com/bingce/controlnetwork/wxapi/Constants.java new file mode 100644 index 0000000..9e79cf1 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/wxapi/Constants.java @@ -0,0 +1,7 @@ +package com.bingce.controlnetwork.wxapi; + +public class Constants { + + //appid 微信分配的ID + public static final String APP_ID = "wx8b41ad369eba83a9"; +} diff --git a/app/src/main/java/com/bingce/controlnetwork/wxapi/MD5.java b/app/src/main/java/com/bingce/controlnetwork/wxapi/MD5.java new file mode 100644 index 0000000..3357702 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/wxapi/MD5.java @@ -0,0 +1,26 @@ +package com.bingce.controlnetwork.wxapi; + +import java.security.MessageDigest; + +public class MD5 { + + public static String getMessageDigest(byte[] buffer) { + char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + try { + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(buffer); + byte[] md = mdTemp.digest(); + int j = md.length; + char[] str = new char[j * 2]; + int k = 0; + for (int i = 0; i < j; i++) { + byte byte0 = md[i]; + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; + str[k++] = hexDigits[byte0 & 0xf]; + } + return new String(str); + } catch (Exception e) { + return null; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/wxapi/WXEntryActivity.java b/app/src/main/java/com/bingce/controlnetwork/wxapi/WXEntryActivity.java new file mode 100644 index 0000000..a25cbca --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/wxapi/WXEntryActivity.java @@ -0,0 +1,111 @@ +package com.bingce.controlnetwork.wxapi; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; + +import com.bingce.event.WxRespCodeEvent; +import com.bingce.event.WxRespFailedEvent; +import com.tencent.mm.opensdk.constants.ConstantsAPI; +import com.tencent.mm.opensdk.modelbase.BaseReq; +import com.tencent.mm.opensdk.modelbase.BaseResp; +import com.tencent.mm.opensdk.modelmsg.SendAuth; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; + +import org.greenrobot.eventbus.EventBus; + +import blankj.utilcode.util.ToastUtils; +import cn.leancloud.LCObject; +import cn.leancloud.LCUser; + +import com.bingce.controlnetwork.R; + +public class WXEntryActivity extends Activity implements IWXAPIEventHandler { + // IWXAPI 是第三方app和微信通信的openapi接口 + private IWXAPI api; + public static final String APPID = "wx8b41ad369eba83a9"; + public static final String SECRET = "de5faa683f384095d79c6a75305c2bf0"; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // 通过WXAPIFactory工厂,获取IWXAPI的实例 + api = WXAPIFactory.createWXAPI(this, APPID, false); + api.handleIntent(getIntent(), this); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + api.handleIntent(intent, this); + } + + // 微信发送请求到第三方应用时,会回调到该方法 + @Override + public void onReq(BaseReq req) { + } + + @Override + public void onResp(BaseResp resp) { + if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) { + switch (resp.errCode) { + case BaseResp.ErrCode.ERR_OK: + String code = ((SendAuth.Resp) resp).code; + EventBus.getDefault().post(new WxRespCodeEvent(code)); + break; + case BaseResp.ErrCode.ERR_USER_CANCEL: + EventBus.getDefault().post(new WxRespFailedEvent("User cancel")); + break; + case BaseResp.ErrCode.ERR_AUTH_DENIED: + EventBus.getDefault().post(new WxRespFailedEvent("Auth denied")); + break; + case BaseResp.ErrCode.ERR_COMM: + EventBus.getDefault().post(new WxRespFailedEvent("Error Comm")); + break; + case BaseResp.ErrCode.ERR_SENT_FAILED: + EventBus.getDefault().post(new WxRespFailedEvent("Send failed")); + break; + case BaseResp.ErrCode.ERR_UNSUPPORT: + EventBus.getDefault().post(new WxRespFailedEvent("Error unsupported")); + break; + case BaseResp.ErrCode.ERR_BAN: + EventBus.getDefault().post(new WxRespFailedEvent("Error ban")); + break; + } + } else if (resp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX) { + switch (resp.errCode) { + case BaseResp.ErrCode.ERR_OK: + ToastUtils.showShort(R.string.share_success); + if (LCUser.getCurrentUser() != null) { + LCObject shareLog = new LCObject("ShareLog"); + shareLog.put("user", LCUser.getCurrentUser()); + shareLog.put("shareType", "wechat"); + shareLog.saveInBackground().subscribe(); + } + break; + case BaseResp.ErrCode.ERR_USER_CANCEL: + ToastUtils.showShort(R.string.share_cancel); + break; + case BaseResp.ErrCode.ERR_AUTH_DENIED: + ToastUtils.showShort(R.string.share_denied); + break; + case BaseResp.ErrCode.ERR_COMM: + ToastUtils.showShort("Error Comm"); + break; + case BaseResp.ErrCode.ERR_SENT_FAILED: + ToastUtils.showShort("Send failed"); + break; + case BaseResp.ErrCode.ERR_UNSUPPORT: + ToastUtils.showShort("Error unsupported"); + break; + case BaseResp.ErrCode.ERR_BAN: + ToastUtils.showShort("Error ban"); + break; + } + } + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/wxapi/WXPayEntryActivity.java b/app/src/main/java/com/bingce/controlnetwork/wxapi/WXPayEntryActivity.java new file mode 100644 index 0000000..c6b8fe5 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/wxapi/WXPayEntryActivity.java @@ -0,0 +1,51 @@ +package com.bingce.controlnetwork.wxapi; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import com.bingce.event.PayOverEvent; +import com.tencent.mm.opensdk.constants.ConstantsAPI; +import com.tencent.mm.opensdk.modelbase.BaseReq; +import com.tencent.mm.opensdk.modelbase.BaseResp; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; + +import org.greenrobot.eventbus.EventBus; + +public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { + private IWXAPI api; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + api = WXAPIFactory.createWXAPI(this, Constants.APP_ID); + api.handleIntent(getIntent(), this); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + api.handleIntent(intent, this); + } + + @Override + public void onReq(BaseReq req) { + } + + @Override + public void onResp(BaseResp resp) { + if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { + if (resp.errCode == 0) { + Log.d("WXPayEntryActivity", "Wechat pay success"); + } else { + Log.d("WXPayEntryActivity", "Wechat pay failed,errorCode:" + resp.errCode); + } + EventBus.getDefault().post(new PayOverEvent()); + } + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/res/anim/fade_in_quick.xml b/app/src/main/res/anim/fade_in_quick.xml new file mode 100644 index 0000000..d418d73 --- /dev/null +++ b/app/src/main/res/anim/fade_in_quick.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/fade_out_quick.xml b/app/src/main/res/anim/fade_out_quick.xml new file mode 100644 index 0000000..f7ebe07 --- /dev/null +++ b/app/src/main/res/anim/fade_out_quick.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_left.xml b/app/src/main/res/anim/slide_in_left.xml new file mode 100644 index 0000000..3921f79 --- /dev/null +++ b/app/src/main/res/anim/slide_in_left.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml new file mode 100644 index 0000000..105e2df --- /dev/null +++ b/app/src/main/res/anim/slide_in_right.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_left.xml b/app/src/main/res/anim/slide_out_left.xml new file mode 100644 index 0000000..3375d2c --- /dev/null +++ b/app/src/main/res/anim/slide_out_left.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_right.xml b/app/src/main/res/anim/slide_out_right.xml new file mode 100644 index 0000000..1f58f97 --- /dev/null +++ b/app/src/main/res/anim/slide_out_right.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/icon_small.png b/app/src/main/res/drawable-hdpi/icon_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1f17e4ffe69d2971420c29d21c089d38c3c9c2 GIT binary patch literal 9837 zcmYisWmH_vZt=z4p}0$NcX#)~$Kn(zP~3_YhvM$8#a$P7cZx1v9Euft+kbD*xjX01 z++-%1Op-|wsi7v1jzWS0007Vx6=bxaZQ#ELhzR{35Hp*AHt;r*s*(UeeH`kG83Od3 z(n3K?6#(#|hko}R0Qmdw`(psWodW>)4FUj!(g6TM=j;wm5$FJ-xw5p(_A@iu3P*ncw{O0szp>DauIdc&(r3c=}~8WnA_;Wr_Vx)ODO7=Sa7+0RO>B zq#~Y^!jX~!Nh2d8E01q>uf;oD*j!H0SvmcsUo%#c0$SnGD1nK>zl7As#*%WiSbj1o z;_^Radmh1?QlR;)BfoyN$4!xu@sNF+ee~2_CUTU01P*`f42ySyDJ5l(`-GSZJAspD z1ftS_!Glu+Bc{U$Ca54#OJH5W_)8GZqL9I5;^s-KqQ~0xoC@TmKfpVCZ@7ay29I=h zWb%E&qU_=BVTFT!f|pCfhKrt-`*b)yBJbR^@dNZ>(_n25>pvh~@zo)FwNw;br}&*( z7pC*WD-gZtA6cE1dJZxuw-7$Se)wW%dp6q2 zQDmlu13qxcL)<|0!>HT;l*>eoCIWcrs3>re?+GRTAt(z-8}a9J{^+dQW0gTA0<*Eb zIQwYbgP>@xhV>5+_=0*h<~PBm?1lIEpSJYgmLF=OK5U!F7Y1hvXZ0TZ1cn!2TWv+b zT-ryN8@YeTaIfG%l0BB`G{^8gb5LX;F_b)aD8z-)&JlRzR&!S{CKjBQNkS4gWnIvy z1O<6D+|eI2si!cf4F;b>*@Zc!7u5I<*XyU9)HPcbG{2cj>(uk)Gt)yC#XuA1XMn3;egGiA-P)GyuGrT6Oe6 zRHObzos!7o@f(}=lc&`dL+cRBGS0zi7|#G6;QGD23A%0 zCJTu}1h=J(*P#rDSmLU8=taur5LnNqahPCX6KfzLBLr`ByrBA--|4RY^l%%h$m(F)~p2IU$r)p6F%xe2ppDqrD|EgcFX^Tl)+-kpkeW+!0O{PM|DP*Ju!iJem z^5R4cI@X&vL^7a3_mr|uWSf@)y`um(0^u0-ZWrBGaMc~)c{d_YBu=hh-IYyxDn8V% zdjv{5Yt#F0Ou`x9RF2t)HS11pvJzAfv`5x|^Ierb26+b7_``!c_~F)MZ&v~1szYki z>(yTXpW$Gc3rgR#&PcDxqrb!QoPNPGtUoK8(Rk)x?f5B_M9R7OUrNs)(qKkPYHK$* z*J^x#K_etg*B4W)BS7lcB)tx5+K37KAFh$iZ<<&q73~#|W}p@**W;@JIG1CjH#_&o3tuj3hEk=Eohmzn_nGh$zX^XdO~;zfwy; z2G1{VO&Z;Rz&~<6oG0|(zFn&u8aLRkPY7)Ie`mP&W^BR>#O8k?_y(Zo~D zoO9FDuP22i{5G}6)#CZyrT|poPaXxsa^e@gm0olur8v|+c-HLfQRLg!pnXxS|@p4zXpbS+hdf!1t9Q?`f=Ow2qUwLUw>WJtt}GY$h%}#C)iv6 zqVn&g;s#dTm_+X$qu+h?I55&%R2zR9YJARv@ z{8wIW%w_|cod2OZ2lUu;kY&~s4C%0&h_xdt(h}`TTuQR)u^cShy&W{XM^akzpDABD z7M#p3=&X+4nw(dFR7ijP(@WiWkG4G}6hG<+N*8s;Pw>msnO}eG33~<95u1WX{0YBh z@kYyG3SU8Xr_L^XF~i3aF74D2C{$OuScdIjdUBk`!lfnh`Oiw0^`spor;2a9N}mLU zFv<6BI+WXQgMW?qEpz10*8_C(9$X6KnyvKy(F(g$>ZdG9rb#2mgI7}UhMROFPeQb~ zcG~uA;d$Gs{x;G!v+a8#x>0xI^8=kMj|S<4AvOz#k348D8=;kJq>`1=*=>grJz89C zfaIb0_9^_}+bW?$p&gJiL z(`-U%zRLmbN`~DH@48|SV8Ye42A0#yPZ%$;PGVQ?9-bEk%~kj_p90KI`y7qC9;MC_ zbIL!cy2IQ~J}So4Iks?0OtUC*qr(L0nX;6vuUt{+zrl9;Lng2jY`-J5iccP5wp_JJ ze_Ytwjw(3bFnxq$j$-D@JxB47B+mZiiILkKV8+3t(B6nfoPqkA@5*|Hk2Q)e1panX z(2aax<1aCr1hvviHgJuaawpb{X-@g^K{??2CTDwdx$33kVRYQaxb~E~rjE`i@x;pY z%ChRlpVcXN>An~nVOa9?bB{`g6q#7Y+Scx%H3umy1ir=W5ea9|V3zodQ7{5BX&FZs zYC5;sCu$>j-qM?y(;ivb>wQrdRixZuO|8MG27Cb(3_Qa=>qdz7D-B{OwrG@UeGw4F zdT26rxp#L3uDnpmf7jeDhxdEamER>ImxD+)K!5*J2d$3D5W8S$)AalFF1d(ze!_a9 zk)@$rA|0)v)DkayRWDxEQl^idHt)SBMSf)+*M&2R7c#2ky~m~Wid(iGgFgE^(B!Qq zrW@uq9!Simh7ENB(qNKqYo`H|4H-2Ogib9EIc^``FPHMLX#*GbWfE!eWF>KVl~haG z^elbaY3!0~6bMu95fp-D%4(Auf)O0V8W2<$fHJVvwIZa_{Ij!%S#t|6KK;uQ)~Iz< z+leL8OS;vGp* zQLd?UUQ%88pJ0W^y<3;OXB%nRSP)~Rg4T<3xNZv$PcYeqaPZ3IflcizPSui<)2Om~ zUAXK}v<5o9(_pl2Jr1sU*QNb%p}|$SzpRUk>;#V0#Ig~nze)FG5TG!XFU1DLEtR@5VxEa;?MI=ry= zZrZN55?gkB1SBMb19b?>MpTPIt6 z2@WgfY^mSO}Ttd!q_xuVUh*y@qNdXoHPUsag>lI!L^MJ z1T>iFq45;uk2aM11C)&j>GHIUG`kn-IH0fO=V*N#XtavdSjh87mw6gSnmFyZ8^4%Z z@Nnm-E3`!vp}x*@d)J$m(aX&)lOz1I%QekNh!2y`6I!qH%O*yL3uuk+O^ z0ZU=gw=dNOhW|As=aXd5Y=V`DsKJST%1IcKSar;N>o1O79>;gcWwq?(rHe*VD*D=C zgz!P>9|ov|1zN2|k&w2^)-_etn+T=3SGPR^qx!$vMO7W6d(X|re}ClUNXnnBMV~FY z$B7(1{(T9#>6p;kl<-02h>NI$4+C;=lb$j_g)1J5GegzEaXWQxDK_Xuki zm*3sDr5UCY28#q%x4*)M#&r=tM_M&4+4fg=Tq;qRD?V102`|P{5fSe*wcs}%JWk*l zqC^sNsBFWFuv;#g+%n!bBrc%o5{aej^ofZK+F<2v@e?Ci9}9sNhhc(p&u zb!pnlD?4!raw^D2$d#Z7fU7x-t$<2lq~wyk>vjQhiE!gR8i4=-mX zSJ^+0zK5qEXBaf>eA?}Kv~WsbL~w+)E!uY^hGY+yYjeAE-tXqSi=L9aqYc3&co`^y z^V|KOQ_5~Uo;}Fuk+uTUEP5;!1%FEr9HY5YBWo%BpdCLy5c#`hu_$EMZh0`2ZQMbU zRDiWqbnDV-fQ*I>QoHcgL&q;0lT@7>WQR?`OP~u?1`bIv75zbY7VNzj`SBcQp@6uA zpxd=^!#tssR#=D~^<4{9-6ZIXC8t{8VrDOZZ%t0WI4kW(7d*J5qd8maE0=#k&(krn z8yE}ba328!5izP5q)pGhHJ?Z~XwK;-Ex)7-PtI=OCRR)4AIqy-HcNa4k(l{bU6_JP zmX3 zAT_x^sqm5UB&8o$`FER?qtncBf66oyy_M$~`LeMnrMb=}qPF|!!UZ^b=cX4x2Z6z0 zL)4kVRV|h1TKwMM@?pIda+#QbN2q}bXvflY44JeQ{B0VK? z#JhsEx^UK5L4ZIiwldpLuxYuu)=~V~7ek{QZ-+;id*1!85b|JfME@vU(HM+b#n12j z!Y%WAr!e5=-$gQo*gF1iY*=*291JsJC&v*A$%gbjDw>CkRzdDC{t4g4_i>h2Fn)UU zF8w7i>0{4sNTRmaly4GIh%8xBN4w;ut#!tp5;mjYQ z$b*To?s^1ifXy0j$Lk*jz+YNi)eZ#zgg2fxGgAY1lSn-~2N_UvpURJUHsl1(Z#JWO0}GM`~b7UuvPX)g>ZfxSMpt}_7h zvgHhM=VmCa(3XpnhR@U}kP;0WoagkpfvQ-xym3jBdn^eYRSv2bX!kk^t+>2*JKrsT zXN+Rhwj28sAlnQKGT1=RzCid+6(Di*&X$PKySw*PbZxL^^YOnCtr0E6qL7NCBLU>X6%?yJ18Km#`OfEEKqS+yy)rM@c@avr=n_Xqjg1}Bt07-y%?Zn zqG^e-L8UP@|7hlVsthj$qe6gtYClstvMp?yE%hG}wS)~6dKR!m0< z?mI}~kZs2}h_NTKv7{_?sxOEMp7;Dg>m zL>k4#=(;@amKF`FkjsN&tRR9>YEb;XJtf2#a26_bJ#MzB>gS(HxZ})yISXm2l&_gK zyVd=Z98H`w9hgdIjiK7big-r8AG_a203XAn$-;DOTSjuw%=1dc^~I} zf+9!o63;H23YKgdDifR?5FsRC?~7Sfi_&|x*C z8fkBF^ARH;yhCiKC#^T!GO=Fa+R@gc88EiZa-Pz)eoLZ$_6Gn;IxF`<>mwo&p47x4 zgPuRXc&E?vW<;Nzpc}?LVckL=kmP^B9Bv&*xTjTC$^$cs3LDT?=>G6i&KHVfe zZUf_X>}r6pz@QghLvT1=`wUdWy; zr4*%7CB=nd*14O=xwsagKm&3&;FLeqRQ)7Kt_H8TQ~tpCOW0GxmZ=|{-*4O}^(>`U z^WD^ou3<=Y4xB{*!|wcgAs!2%m~61AK| zcTikO5HMeXoSaP2eOt(DIE@UgBLb1uQ-w? z+*B`U4ooMIUgAa5mFIVpF)LSGre@9wQrq7z!1h0T;qO_I>FkZooF_rs+(9CIbxKY7 zD4Dvy_~{|V-P2`dUAS(P;M?QhIB(GV04uYRK&fV!AH2qwk9)B#Kg+RG+}%$ZHBj1o z2hxavn3iZ(iP6TS548F@KCj%m-EuqJeX&r~ z6h-tIZnFqejL#G=v%iSVV0GaE0?F>kj~ad}w}A`~pLC#({YXCzqGd3vv)vsDt#omF zZHE7O(RO0P?I^p4=Vig5o|I0UmK~ESF@*${9CIgBxkMyu`++TuG~??G9YtJbLkbxU z@L6Iz`F~{GZ#7;@Vv?fC_#J2Fx-j&i(O8|jP4#e*(%CR#2KA+5hVSmM*r=Q>uW9*m z($A?tjWqwK*4V!r^+6Wj?>HJ5EfVo$4EN8Aeyx2wBk#bSX!q|C`_KMc4u713mFdVg zF(QGOO&*!V>zG7iI@bE+D~|_{ADADGELg2pi#NY(RSBq!&)yqY7qnWLx0J^mZ;ML1(~%AjblAmtiLx-2&*({P9| zg|+UKk{`Bs=lT{o_qllP18-%rlF&;IQ3od}trvrtJ!n5HzIR$C(l8}V!m}-$ZrSIH z;Q66uUQ#h@LYMpMLJwi1dEu(jps*cI8a(JEMLX2scpETJzc*u=T*ljdjvTfyzO2%ZWuUAsQ;9|ehT{oP@s*vuOKsqMMA5a~~euvl*3EHt=D-&n^%OF2tmd(;)>+V-1v<#;9* z64t!t;CEAeYEaB-+3wC1W>;4$-YKua-L$yX6G)Q3WjKSbT)T&Rr>|)j{SirjjiufC z;Lce0owLSd8C=qwMoEpc;3}S(o2)I>Z^?PR8Z=U$S*;_;;(fL`GNQ)X$3N4Z=FFi& zNs>OMm(Ojshu7f#H4es8)pP6wXeT+CKDue+=lv2fh)9#m$wdD)_1gP54DL?1;tp7S z0@8l)nVQ{^lalspO^5Fa!(gCPQK1q^t+?_hvS}PQ*rXRgs2nb`$GF`0?J?0`%Iwkj`CRf&^(1B&X@j^us{jZ;y45)gw{OHZ?i|z z=i#f5dbn@-c_7A7@D3o(As{)t^*zDg@%i(~mxHzLnd|1G_XIe9qy`+Y1K;gs-Xj&% z&YTB%RF}3raNv;(@s$$On2Zt31(#MG%N_dnwZ}ufRwc3_FN_z2z}qy3oxXF-*iYLX z4MJ~bQ*2}pAEcL-boe<`H~R{pfhUf2kt0GdW|g2DB0Xdl4MyZyr>FQFY0-Ia8?Lwo|tI_sb6OVO%G0I{7}sU zVKND%p-CdG`z(4we0KAN>!}LKHJREdHV%B}wr7qh$EknY>i6eCe~$2&bcs8Cko?qX z!1d~56M9R1oh?;Iei?NsIJqOZnouEDE^r&C*WP;lB>@)pybnW-MJ#qE`{v{tm#EI= zeL;aQa-fgqnmCA7)5Iv2HbN$bky%m+b(}+f%I(=FLWU+?bq!O{-+LfUp!JX}s#+Fm z;Z*3kgDK~ESBE-Hd^Ko^H6y~4>XrEr&EX6V3a)tCdx8|&)xs z1it*|^Q`wVN7BpUnsNfes1Y2VF?t7UQi4W&MUp7a^bdB{T`%YZ68vsHFWuRnI&yRT zJImw8pKi-2#uRP%#csS?+}>hS4p<=AY783R2t@uVg(nB`n5CN6QyFDq)DgtE>$&x~ zeM`SUd5>3Q-3T*nhtY-@)(OU_;6lc96?!~bMSq4UoCfLxKWVQHSl|9`=E(?d?XL@APKD(ta0x*t=>$LQCNxFK zktjB|TcPO#`=Em)HhhTFyMzP4P`B;9|6RJ^CuoC5zT?ML4q>lyK_gby=Lo==Ydy5j~!<&Pik7M540x9bjl0eYUEDSP)A->D zo+wS7(pjD09?t=>T&X})S2J?YE+RG$-743=1;}%z`_wMPPFNOGe)uLa0Rq;aY}NL4yVg9aF&5v7>& z>C@Kkeq`RN)ukR%#Z*lMd}$5|T6_ux>=f*%JfPNe!JuHs_`gVCM`+Dk4Ynt~<-p2x zXI2@esIq*1h@A~@m_UUu$_4r92xoW;G;Q)6SVpgN>V`l$i+^Sv>W^S5z}vbjBS3ao z0jHWQsEj?-cD=COzv~omQ#6XADX64e9cuBLGm|Eq11|)3T))2BoatcbfRPV3v_$1>!kG@VYndX0llnnnDQdueDe0Ry%L=c2wZq86U zE-W%dp!Tb@ZK(dEc7s&%ec2jr5>65pvBNr6{Zu+%k zpJ&(4VM#N^p15QDvfMn>M#;CQ(-xbFja>6N!xe_N!kJYs~cUR6KbQoe?P(WxNNPoA4Z-c%e)H6$k$jTuDhC7p+U81(GBlBM)I6Sgamoi=X;cYEEPL zOU_u$ES;4$Ey5h_b=u(u;eRv#b)?#-@;eXu!i(;vli1LFrZj7GNx+4HW{q`s4vlkF zA&(%^6}I+NUEOy1g4exiaqPtq!=u+dPBC{QhAH*EWv|Omre!+JMZ&W=MtMXb@cax8eC%KEouD*{A$AG$Y(dgQ z*_swzex0-)8u!(_vA?aqh@henTKeC*ZYFbz@YOL!MT){i?pe1>#jMCJEH3t=shoG2 zYSCvoSV&OpkHN(Xmi=V^d04}Jkzdpcr>i}}^%jl%>EOR9ji~1=m$p6~TDD3SuK$`&-7BxyZ$ghPZvKb^5jT$a_rjKN6gZbhQ zL=m3ZuB4}g)kQS3f|=Lu5WaC@TxtnzX$x`Z0fQO0u#UEdzbG}r2bmk(db`)%>RM-v z(?l<-De#JeXz0g3?F2gB_c0An*_t*M1B>&PMYPT4p z5+x@qMlFaC!@h7}5$DS=?^Z`~1Bd#{jaavuPBU(R=3Q@kNzjCk{x4G+`r$g}*!f#sSIF1 zf&>0l$~-^RY%`*= zY878tZ;V90rl#!8nzYRlZ8^;Qt@Q6<8D1{Yi|((gSyp^xS^FaPhT;iJpd2E0nRIS3 zjlBHG=db20Emlj~Li0BKg^Z<0b+Z}$ku^+9!v`*=unyxI9_z+}-CSc#i&qsoe?g93 zbY=G9#(WvWSu2GUo4+FRpOlcjs+t{p~i^)@;+iszSHV5nMaZ!q*kN zC#W%xE^0is;4a6W#d=~%w#AID|JM!YD{IEED^JM;+{W8kv-+zKGnb0;KRC~z0OFd- zxwjv>_4~aG?`lX5V~MBqGZ~bYeC=PCv>}%dx$V|_o~1@_P5;*UPV{KkGLHWK#p}3v zj#&_Q^zQ!BZ-V!w)y(RB|D@{urul@?)5w1RrY!(bI6Dyg^Ic%4B@ z+@Jl@cL^xTp;3TVFk7SUmdMB@6uIlR3MazkdJ1PG%H|+hR~86^3b?`ZX*k@lhr1l= z>QX^k^=6D{6TQF3g2%uAutskr$>RBkgnkEUa?ak~20I7L55+?AN@{(|Sj zn`VL5<%o-DXp3={0pq_zVbI%Rz5HM&@ERxh`v)y<|F51$F_6~ygD0Ic%{6*?8MNL9 z8Dg?SwX+MQ{f8eaH_0In%>3@Z5~CG33Yb(?&dv-e?klpZBj~tcT(=1EBq?k$jbs>0 zka7_BtpO&SSJq?CsLfII+yduE`PpUf9Y1ukuS#R!ycx3KaZ5>KVka literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-v21/blue_bg.xml b/app/src/main/res/drawable-v21/blue_bg.xml new file mode 100644 index 0000000..c5476cd --- /dev/null +++ b/app/src/main/res/drawable-v21/blue_bg.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/fab_label_background.xml b/app/src/main/res/drawable-v21/fab_label_background.xml new file mode 100644 index 0000000..bd7694d --- /dev/null +++ b/app/src/main/res/drawable-v21/fab_label_background.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/ic_keyboard_arrow_right_white_24px.xml b/app/src/main/res/drawable-v21/ic_keyboard_arrow_right_white_24px.xml new file mode 100644 index 0000000..8ca5856 --- /dev/null +++ b/app/src/main/res/drawable-v21/ic_keyboard_arrow_right_white_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-v23/app_background.xml b/app/src/main/res/drawable-v23/app_background.xml new file mode 100644 index 0000000..0c6828d --- /dev/null +++ b/app/src/main/res/drawable-v23/app_background.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v23/icon_control_logo.png b/app/src/main/res/drawable-v23/icon_control_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7c6ad3bd7c4c23a94f207fe317d6a88c06435c2b GIT binary patch literal 10746 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 LS3j3^P6>uZxf6jTI&pGFhljh<6Em}%h3IKq1 zaVB`}#-Oi;Lhky-f;e*kkQ^6+y-$3=#y$TCIbT&)kI6l1-FFmU53vc1Y48o#2lT0y zsKW3L*KrB5eP7>UWJZ}a#EN%wp2YZcId)|iym81dWb|!}7ACjlmff%y%fOgfhjsnJ zlBROrjba_zk=J8It(~>CTnoYT6AL0*_d;=DYbg7ho3^=nOxL<&^dN3Kwc(TX`yVv> zyjU}iz}=wV`}Zdclhf0Ivoka1Izv5S+zJ@UxUkN_!Qml1Ox(jiTH-?7Vp6YBQ)Yi~ zPuBUNXFoCEOp8)!o*FQb&c~dQnl?(;U6RBHfjXayDc@sC5e3#w71bvME=1zUv%I{# zp0(ORZzQ}q=IxX><>JNe2Hxha9BU7Mf9}lO+?=7|cSTn;K<3gM8<8f6wMTjD&DdVOC;#NG}s3PeK9T%+_@`37xcF!~n}%pau% zkmJsg&raPQB3)*L7nQ=zv;6FbOs?-?#=IiqQM3)a`7CX)t;bpWrI5Y+4VG22|L6Ja zk&vYi@!Lk8fh`eu#3tu;@hL>}UK|43_-kTf;>c}W;F%cByo$ivV`i;BTbQ55)bY}Lx}4;Wg7c1nhx=4~^|cX$3z?%I ztuHA;N_{mQtCydUsZ^@nzCSCU7%p%iG^~;j?<**loOKo^qrJuUrjJ0{ey+$7*r{YR$Y~5&5*$%r49btTAD&Dp}OF} z8aw7y0$s*1E2^MB_pl<=3Vs~MbQaI_9qTn(_dD`&uP2S*g!Hfv9LyKTC8b%~EpR_BD2oEnD#=HeGHlBgy zNSwH?cP(u2WInGECWF7LKLJQJZku^m3R`Xe-bt2}=Y-kgX182yH$D^~WmoGF0P z9Lfy?#vI*vHyG0*P=cqA|1$1Ig2iK)TjRBEC>%nAuH#+tfAs%V4#GDv&;a?kt!Gy? zh&=yEQnRm8R#&HRY5czu{*I>r`W=#M72p*Mg}9xhJGN3f8q&-hpgy^#=#E1iD$e#v zMrxSNKU-18y-u$(Fa>oV6pl{=sZbqXO>yY$Qx&=lr7G6ee%K83YnTBvE(*?Izf~%O z9dgG-UDY>%uI#`ep(W7!r;=($b5k6yvPYsRW2DlAf-=iU7Ke`2cJkxt0?86VYQH3V1 zND}B)TAic)%r|C4rJB9UBWHZBY#LbEkHQ)JR7AzF)ImrpLY?|X9ikjz^Q%^5QMe?9 zBY@WvO5We*>>O=D>o8ZiO$|wxxnz^oy66CZette9ji9AS zdf*7#l&9B^@TCp6)MZu|$!<3vsX literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/efp__ic_folder.png b/app/src/main/res/drawable-xxhdpi/efp__ic_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..34d99b43768cb2b05764665146671412300611a0 GIT binary patch literal 1021 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 XfHeJB+b7*@00000NkvXXu0mjf0i~1u literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_deselect.png b/app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_deselect.png new file mode 100644 index 0000000000000000000000000000000000000000..d584a20b444f49c7ffcac69938d3e2f84a14a06b GIT binary patch literal 1276 zcmVUI_ephCS9Nt!lJH;q zgXHS^r=&{(yzc0`N#5q@`v6?;=xa#+Y`-O)2jBxo+e7kJ*Y_C!+Z=rZ$ndF;Q-;)3=%%N%rNM7UmJ_z7`N57Wji;n&qfCd8=fKUMHD?z`v zw%Ex|+_nHX=;(V%?r`+y0Bm*i)7%z27r;A?_5{h>UEikw+~VkGll;PMu}>WB1(G+n zw#nU&ei_NP-4^@a(GHSq<|yet0QWljR+7ycCH*w9#T;Y#X9of-s7yzo02GiAvtnk- z>vovr8)KF#Nv3y?sxg>q=En$>r1*1C0SG7()RKZO3EJg&{`TjbkxI~`0FG&N&=^5T zS#vS-Av2$X<`{WRNn6OGZhw)yDHaGxzxw?e+pmLfJ;`tU-zA*_;Oib^`Zb*pJC3Ah z0USHXIY`o<0|9h;2SBF+_%3!~Q~2yZy;*Q*yg|=F4xrrtUJZS`Mc)YEk?LpRh)K=s7?L(j_+s>PHg(S#al8+O|zX*UOuBS?n-K-9i-QgtYN|LXn zEI`uL01iX~v}E^U?KSjLumzxiNQ?p?N%k<0E?E*`8xW1N6>I*Dw zB)O2?R;A<|a^KzGQDDiQTh{GzS76EFIljQs%N+%leEqZQItnZu*XW=XRKx5nlAk(& mN|Co#6}$papiJP31n6IG~0CT`_ zxihJK^#^bZ8~`_F_L{e&Tm?DjW`I3l6&R@f(ZX)v3%CGw&Frq1>7Ibv%Gn3jfx)nQ zi^f_4=@Qs7v*)Z`c!NHsTWf()}&rcSxi|>ST=#JPyZ7-N@BQySdynqDYwgGS?%Hdwz4qRVl7uVe zACe2ouaX`G@U^3FC;5z{?*{Osqc0-)r+t@nAAs*1Z70cXuI?uQwmAB7lBbHgO9A}o zXuC;nbameX@Uo*nO!C{J?ri`rkD)00Nj~oCz5(DhM_*5JpQE1#P+`Cf5HdhrHR$i! z6uaH2+amxDI{F7BpLg`n0BmsdyWAAJ7r+rm`;g?buI@(wo_6$ABu~33_JgDCA-TCW zOJH6#zaDfX+Q9VA(eQPQgbUUBpdBr6#u{V_7d9Ap02fB-Wp;}OUJ1vJD~Fw^Yb;fUIX7Ul4t$zlI{R-rbC-vrdwm%k@P8m zn|kqsB>meHKzBC)bSHpcVg(z+XMcJnaHzdr{U8U>b^u?7IplKi+0 zK$0E;aA+0)s^UL3*fO3IBdpV)lmHsVBL;}Mcv1wYE^8-0Xb=ENdcdJ3l1F2;Dn)=K z-EWqr?`1wE8`NL8BT)^?0F5&tO^)IYSHZ#^)zM7I7A2}d@AVe$ND-jC%!j5$jh_9W z0ALpGuv->oF&nfs7GyWYb^`b+wqC(!o7K1H;a+Ulhz%NdyCWoU4tE3)$^eA{S`yN- zNczttFM3`{cDlJZvi?}MdN8i7AGD&j7dzRNRX-Mh`I*PU>IUX8Mjs742ySU!=;LuK1`?=jQL4ekgY_->u^b`QQrrZjk z`k&Crz-E8~Iz0%0B-z7|vRJs|_1L+dB0!StvC9o52A%FGCJN9sIn{_&x~uhrCT65( z)lr-(Kz$rNr=&rnN6%d(OVI{pKd7Zf*eYgkJbk$1uh=$H)F4R<`wVwX>JsNvjr5$a zoweC`AMU zGBr7hRc;*s7kr|R0peqMj~)YXeJOih#X_st5VfR@%vpm%8dMmilFf3MEh@hhi9Qav zHY~x?3yyBbw0`fl*dSlE@k`nj6Y#V^J?&!0T9as8^!`&x_#)8{fYa5*!uDCl=22(Tqi zaA#cOv*f69nY5*s?_Sop1+m9Ycf0A z`D^y_t3;cXlqUVupS17U_q>9CG1Uogcb7~IdAC2OAXc-X>p80e!%~)tqinTDIWFz4 zG2^rFd@XAIU|*ZAq=RzOg$>6G4>W>I&y8ktJ(6y8_IB+-aY6sfCVQ(--&($XiMMI6 zxIpCvDbFlJAl&%mz<+Tx*=Us&duORHn5y9SX7RFOM#I_iw)J{=+UVkt}(?a`X7+t*yVe zH#MMmU$7bTg$|dGQ?g9VTOB2?gs5h=p$CG*laI=5i2`huECweYy92|D=M#s>-g<@v X-%Xw=mW|H9C}Hq)^>bP0l+XkKQ!uhm literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_new_folder.png b/app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_new_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..d40425bc8c9a7ccf75fbf40f043a8e3dce40d924 GIT binary patch literal 723 zcmV;^0xbQBP)kWfY>V72sV~tBUos$e?Sl{6s)wfwGnX_ zLC|$sw=t4+MAyAD$=uBBjQ74%-bqf9C+|7Q&EyC_jRa&q%>)c6p%4Qypt2xh1zAB> zP#FO$sEnUukQKCr3JM|Y0Ctu&xn4U+`qqJ+-c2N3EQGKhxC~qcjsx2}>eVgaj-=I& z?Db-%5l{%>1aJ>H*+c8!E8DlntfpE(A%uOvW8f^Xtp`BSX29(%^%>LtO%nb(jt{6rgzZ_gxh}9s=*{;KUBLiZ3CAm`vA2LfuesV!LaS)^a=03Q(@m zSt@5hiP*}t0Wd_eE#yc$ArY#Iz%-}hT*@mTT%F@teAd`0wgW1%Tp&$ivYBje{U(0&H z*!skVp)73SRR`utCfpVC0w*k1YwXSbJZV~M-c#HimHu13Sf7MHU&ox?`27Iq^E<~Q7?N}KGd(2^i$9r{ebrRKb9H0-fu;>YAFLg$ z9?kh3!nS0B%>D!W*2hPcvTDR!4L|URPvIU@dvGat!5^cS@A#5KZmr#x*+y#5Ws$VY(4d?u|ee#md1BMS|3{+jsJ-eN@zhXHqzw1l& z>KiGp>L>UWG$YMDFE@p;zgiX=)O6~C?tzb|m+X7CrT*8YwUc&5TswF7g<7U!fiAP3 z?iMXw$BnyM)n}DAHkV#o72=?Kbhk(OZ_x)=qE@eB5Pg{!x$WED=+L0%f8CCC<*&ck zFOp|JzU|eNx4W}GS2Byu@adbje#Um4Psi50`VLfoaqYG!pkk%c)my`C8K+#l`{#OV zeB3Ip*)tx8EsD6EvpaMFUjYPw(|kJG_rn@n@!sj z01g`YN|N^)ZD#-&euhT5Npihudknx4Bi}&shLL{*kTPHdgb1jt27S*=v6)8QRsk3^ z^7AD38u?WKeMUaVOtGZ^9vImLlDkdYO8~YR`67}p%oKZKWY+$cC4k= zLA3xRA}b6vA^Ff(t3m`MBFoj%L^t0;3!sNLxf7pOo1MK|B>hp&2} zIM=0Rp7OUOhiqLD(cR5%&-QJrWrJ}=0WHY9i#@C2p*pn>5$SDu7wgo4jMQ_Na`Pkg zkfV7Yb@O^)GA$%ujphT5_Ps@5dQqWtF0ofsKG1bF3DCL_|LfNs5L$j=F45A`cOe zi0H>I6Ou8OI-?jUpcw8b`ZnM4dokBktBVH3t!EqW$!9`Ims1fSL^cznb z?)c){N1!%ndX?dhTD+`AFV<|N<2tD5Iw<{S9Ds&9>_@t7%~6LOB-hucsRiunKxN?$ z-CRkcba`<#x<4De9bKilS1WWske62~ar12b^VCi;F zf+d^(Y-3J>rOBxc8bdkE7Lt5w0L3J4nJjn_kRwgtm<03})x%x-VaOW_00000NkvXX Hu0mjf{0I4J literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_sort.png b/app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_sort.png new file mode 100644 index 0000000000000000000000000000000000000000..f5576db89eee0771dca6156e9c23353c2ff2e531 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2V2t#1aSW-5dppCC?~nlx%T0EM z|MhAg7?drPwwCQy>$>&umWj&alVN>&f5JF9>|V1lOp#zxV5n4Va+GLslw;)i^kX7c zmMojAOGW97&$*r}6<#)+zs4{{M8bg~O67o{@{;MCC2e1F&%K|pUCZ-)PTM8H(`uHV ziWy2%E==S-`K`@SVv6Oae=^Mm9L+XNKy!{fUcdT=#m*(akA;`<>!)7Gxm&Z;^@i`0 z=dKK263At6=N)5C6BD~G}9V1QI${xyW)MJVa)c)`65w0<} z#OI}US&-TNT;>(Z%?2;duo#?JZ712{DDgz_fI`1K7S?^~y{!SB6X)3^1H+oZ)78&q Iol`;+0I$@ZjsO4v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_storage.png b/app/src/main/res/drawable-xxhdpi/efp_dark__ic_action_storage.png new file mode 100644 index 0000000000000000000000000000000000000000..d361dd6202001fc050aca09f656ef6d15a299ea7 GIT binary patch literal 1017 zcmV zPjtPnl7bmnp8`lhO9y1ROWUWO8op3iUsJ)nXJ=>heCnoS~o1a&Qf zRCO+J7&zJN*%oSl1?~gafqNn{QK&JXLDUG!;2Z;v0t@RHTtnv%a0fUcB9E);#|Cr+ zI2#d8&f{+eX^)7!t^z3vpe%C6fr~(tF$X|UU|d8j;kRGC1qco0bk)|Ahrr<2XHBybBfYx`b1C`Ia`5Sz^n?9lQ%8%cR(LIa6;OInmZsnbc?m} zJ0L4#o7oj_YuMoq$m))V)&A75IjV{~puC1Ks#gIA^8=)+c9LpE*(r-FAWJPvv6RIX zkWJ1uNvABXfUMNTUh^r7D8n@jg-X|kS$Vev6`~D0-6VWOPLPf z3dr_>Y(FSvaRp>MiMFGdvbX}W&H7rGV>?9D6_CBfEX7h?&D$zq#Pvd*sy+ZVb|@mM znBspWQ&sKKirveoTLN6gp^$BD7vhkJT&dD&WhYhDZu8s*HYc<%WIGUdft@1q$`z1x zuBz*S)4-MlwqM)%v4E;t5!I&b;;vn_?%HXqeb7DxZd&w+h!uWSmdYtsd4$9jdO!sa num{uwYL?@D1oaWrEQ0<4oyz`L5RO_Y00000NkvXXu0mjfL@vrM literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/icon_back.png b/app/src/main/res/drawable-xxhdpi/icon_back.png new file mode 100644 index 0000000000000000000000000000000000000000..85690e78ed799bb16719078be076fd9329111d62 GIT binary patch literal 4271 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 + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/app_logo.xml b/app/src/main/res/drawable/app_logo.xml new file mode 100644 index 0000000..d808488 --- /dev/null +++ b/app/src/main/res/drawable/app_logo.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/baseline_reorder_grey_600_24dp.xml b/app/src/main/res/drawable/baseline_reorder_grey_600_24dp.xml new file mode 100644 index 0000000..464d5c6 --- /dev/null +++ b/app/src/main/res/drawable/baseline_reorder_grey_600_24dp.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_circle_white_chatui.xml b/app/src/main/res/drawable/bg_circle_white_chatui.xml new file mode 100644 index 0000000..39f83b6 --- /dev/null +++ b/app/src/main/res/drawable/bg_circle_white_chatui.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_gray_3.xml b/app/src/main/res/drawable/bg_gray_3.xml new file mode 100644 index 0000000..ef1e19d --- /dev/null +++ b/app/src/main/res/drawable/bg_gray_3.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_spinner.xml b/app/src/main/res/drawable/bg_spinner.xml new file mode 100644 index 0000000..4a104ec --- /dev/null +++ b/app/src/main/res/drawable/bg_spinner.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_splash.xml b/app/src/main/res/drawable/bg_splash.xml new file mode 100644 index 0000000..5efe8a6 --- /dev/null +++ b/app/src/main/res/drawable/bg_splash.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_table_color1.xml b/app/src/main/res/drawable/bg_table_color1.xml new file mode 100644 index 0000000..0fba3fc --- /dev/null +++ b/app/src/main/res/drawable/bg_table_color1.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_table_color2.xml b/app/src/main/res/drawable/bg_table_color2.xml new file mode 100644 index 0000000..4d3b839 --- /dev/null +++ b/app/src/main/res/drawable/bg_table_color2.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_table_family.xml b/app/src/main/res/drawable/bg_table_family.xml new file mode 100644 index 0000000..c37ffc7 --- /dev/null +++ b/app/src/main/res/drawable/bg_table_family.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_white_3.xml b/app/src/main/res/drawable/bg_white_3.xml new file mode 100644 index 0000000..d81ac0e --- /dev/null +++ b/app/src/main/res/drawable/bg_white_3.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/clickable_blue_bg.xml b/app/src/main/res/drawable/clickable_blue_bg.xml new file mode 100644 index 0000000..86ba277 --- /dev/null +++ b/app/src/main/res/drawable/clickable_blue_bg.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/corners_edit_white_chatui.xml b/app/src/main/res/drawable/corners_edit_white_chatui.xml new file mode 100644 index 0000000..fc471bd --- /dev/null +++ b/app/src/main/res/drawable/corners_edit_white_chatui.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawer_header.jpg b/app/src/main/res/drawable/drawer_header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f54a30e26f0f96def8f97a404e01c54df9103288 GIT binary patch literal 35612 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 + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_arrow_down.xml b/app/src/main/res/drawable/ic_arrow_down.xml new file mode 100644 index 0000000..0cace5d --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_down.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_to_right_dark.xml b/app/src/main/res/drawable/ic_arrow_to_right_dark.xml new file mode 100644 index 0000000..c854061 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_to_right_dark.xml @@ -0,0 +1,14 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_up.xml b/app/src/main/res/drawable/ic_arrow_up.xml new file mode 100644 index 0000000..7ede1fd --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_up.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_backup.xml b/app/src/main/res/drawable/ic_backup.xml new file mode 100644 index 0000000..7f36a13 --- /dev/null +++ b/app/src/main/res/drawable/ic_backup.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_baseline_clear_all_24.xml b/app/src/main/res/drawable/ic_baseline_clear_all_24.xml new file mode 100644 index 0000000..54ca983 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_clear_all_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_close_black_24dp.xml b/app/src/main/res/drawable/ic_close_black_24dp.xml new file mode 100644 index 0000000..e700807 --- /dev/null +++ b/app/src/main/res/drawable/ic_close_black_24dp.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_custom_tolerance.xml b/app/src/main/res/drawable/ic_custom_tolerance.xml new file mode 100644 index 0000000..7c5abcb --- /dev/null +++ b/app/src/main/res/drawable/ic_custom_tolerance.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_export.xml b/app/src/main/res/drawable/ic_export.xml new file mode 100644 index 0000000..81bf256 --- /dev/null +++ b/app/src/main/res/drawable/ic_export.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_export_height_traverse.xml b/app/src/main/res/drawable/ic_export_height_traverse.xml new file mode 100644 index 0000000..7d86cf4 --- /dev/null +++ b/app/src/main/res/drawable/ic_export_height_traverse.xml @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_export_wire.xml b/app/src/main/res/drawable/ic_export_wire.xml new file mode 100644 index 0000000..dbd25fc --- /dev/null +++ b/app/src/main/res/drawable/ic_export_wire.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_indeterminate_check_box_black_24dp.xml b/app/src/main/res/drawable/ic_indeterminate_check_box_black_24dp.xml new file mode 100644 index 0000000..8eb1cdc --- /dev/null +++ b/app/src/main/res/drawable/ic_indeterminate_check_box_black_24dp.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_known_point_24.xml b/app/src/main/res/drawable/ic_known_point_24.xml new file mode 100644 index 0000000..3958816 --- /dev/null +++ b/app/src/main/res/drawable/ic_known_point_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_ruler_selected.xml b/app/src/main/res/drawable/ic_ruler_selected.xml new file mode 100644 index 0000000..89d5af7 --- /dev/null +++ b/app/src/main/res/drawable/ic_ruler_selected.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_ruler_unselected.xml b/app/src/main/res/drawable/ic_ruler_unselected.xml new file mode 100644 index 0000000..e752d51 --- /dev/null +++ b/app/src/main/res/drawable/ic_ruler_unselected.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_selected.xml b/app/src/main/res/drawable/ic_selected.xml new file mode 100644 index 0000000..1f7954f --- /dev/null +++ b/app/src/main/res/drawable/ic_selected.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_surveyor_24.xml b/app/src/main/res/drawable/ic_surveyor_24.xml new file mode 100644 index 0000000..42e97a5 --- /dev/null +++ b/app/src/main/res/drawable/ic_surveyor_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_switch.xml b/app/src/main/res/drawable/ic_switch.xml new file mode 100644 index 0000000..19c8834 --- /dev/null +++ b/app/src/main/res/drawable/ic_switch.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_tab_project_selected.xml b/app/src/main/res/drawable/ic_tab_project_selected.xml new file mode 100644 index 0000000..989b828 --- /dev/null +++ b/app/src/main/res/drawable/ic_tab_project_selected.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_tab_project_unselect.xml b/app/src/main/res/drawable/ic_tab_project_unselect.xml new file mode 100644 index 0000000..a00f0f2 --- /dev/null +++ b/app/src/main/res/drawable/ic_tab_project_unselect.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_tolerance_24.xml b/app/src/main/res/drawable/ic_tolerance_24.xml new file mode 100644 index 0000000..f6d7895 --- /dev/null +++ b/app/src/main/res/drawable/ic_tolerance_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_unknown_point_24.xml b/app/src/main/res/drawable/ic_unknown_point_24.xml new file mode 100644 index 0000000..3167e8a --- /dev/null +++ b/app/src/main/res/drawable/ic_unknown_point_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/icon_control_logo.png b/app/src/main/res/drawable/icon_control_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c21729a79268308d6cd43b6313745701f071cadb GIT binary patch literal 7070 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 EKcx4q4FCWD literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_control_text.png b/app/src/main/res/drawable/icon_control_text.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc8030eac8d584426b738f6011b7a4f9e615fda GIT binary patch literal 9233 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 MC}_%8%UXv07Y0K~DF6Tf literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_parameter_points.xml b/app/src/main/res/drawable/icon_parameter_points.xml new file mode 100644 index 0000000..557f883 --- /dev/null +++ b/app/src/main/res/drawable/icon_parameter_points.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/icon_prism_manager.xml b/app/src/main/res/drawable/icon_prism_manager.xml new file mode 100644 index 0000000..8a822d5 --- /dev/null +++ b/app/src/main/res/drawable/icon_prism_manager.xml @@ -0,0 +1,28 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/icon_ts_connecting.xml b/app/src/main/res/drawable/icon_ts_connecting.xml new file mode 100644 index 0000000..a1b4c8c --- /dev/null +++ b/app/src/main/res/drawable/icon_ts_connecting.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/app/src/main/res/drawable/img_request_android_data_access_permission.jpg b/app/src/main/res/drawable/img_request_android_data_access_permission.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c01cad4a2f812dea677c335d7fa29275e8498b1 GIT binary patch literal 273247 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%0AJsCbu(TfJLhdx!f>pa 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 acq?@#ht0}oICfQ~fM4hAwPf&{Z~HeK)9{)A literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/img_weixin_download_guide.jpg b/app/src/main/res/drawable/img_weixin_download_guide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d29adfd05f72fba54c7d50b7d6ee8ab5f7222c0a GIT binary patch literal 66702 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 Z?SFQ9|Ljx$mUQ_C-{LpX2VlnG{{=9~DZu~$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/iv_back_selector.xml b/app/src/main/res/drawable/iv_back_selector.xml new file mode 100644 index 0000000..b0d09d5 --- /dev/null +++ b/app/src/main/res/drawable/iv_back_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/loading_circle.xml b/app/src/main/res/drawable/loading_circle.xml new file mode 100644 index 0000000..dce7824 --- /dev/null +++ b/app/src/main/res/drawable/loading_circle.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/loading_dialog_bg_ll.xml b/app/src/main/res/drawable/loading_dialog_bg_ll.xml new file mode 100644 index 0000000..17072d0 --- /dev/null +++ b/app/src/main/res/drawable/loading_dialog_bg_ll.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/loading_dialog_bg_progress_bar.xml b/app/src/main/res/drawable/loading_dialog_bg_progress_bar.xml new file mode 100644 index 0000000..fdcbb79 --- /dev/null +++ b/app/src/main/res/drawable/loading_dialog_bg_progress_bar.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/loading_dialog_pic.png b/app/src/main/res/drawable/loading_dialog_pic.png new file mode 100644 index 0000000000000000000000000000000000000000..38151ee239477ba5dd0d908390b5eee66b7ff96c GIT binary patch literal 1512 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_U}6vO332^D3PwZV|NnjU-`4|E z#@dn~zhDMN7FH%^H8#=9Kdy@L3khU>|2daSP=qt|n~5;T>BBsB(aRt3D!grAPY-N- z#dqxGL2K^YH)WJnp1*j#P|Goo~b`;Rcc|L zc-I8*uK81QNycbLjh6OFRh8o%iyY%ZqI^V_tBW**acC-KC$L2x=(C%2PopiO>eI505y*LroWmzT)7O`cspX6wwsw6Wq;t=n`AhLgr46fQVOJUd1Pz zo5Sacubb@YAAkISz!?*xX-|wCXDs2~!XU%JW3(*o*{Ys^L}PC6T3PLEX@T3<&K;0j z*w{H;UgrB5zO-k3IerHBjV+@aw(Qs;_0Xepky+Za9KXD@o)0Du-z6qyu1r4qw$s;k z_jL0U73T74Dvti~_7hb9-7sNk=nZ%EmhWkFbkIF`!(@h))lSQ#PM*aA?*i8NO)^Y= zoR}za#lcZeN9PO+#~jfD&4;}G9UVPAJzZVT*gx?kIVgy6JSxcS=woMc7TCc0Nk}MB zfpdCWM~XxT!>37agAOQ|>Pk*$%RF3SaH8Xh^qqs+^Cag??e%TaSHIrNX?*ti)6+*) zMH4OuXap_^&FNB$2$D*lFeMnyONM88#r)|E?5x%v|9^K2? z_8iG((bUh*Iu_VwwACcU%p*kn>48lv#62qKRxxy(y>=_DFW^;hD2v{?&`FKcJVI6< z$jQ)O{rW{q%CvQPs^u+h^X~0S^O*W@LiEiE+~?gEx&FQ2_qYyvoy z8MY+Z<$dLD;LGYycgRT4n7Os!;+3O2u58wsdBGxG)8fsuUCt&38h-OGg`e+mZcdzb z=}79mgl9!F*yJaO_F0%bVbVR3(vTU!n0R*no!u)~+u80)7N@;hlr0dsQy`p+;n)KH zHRmE&uOB#Y$lYh-^0#)yrk*=9dw*rAYo+=y{QSMrUhI?8E?_=o@O1TaS?83{1OSQb Bss8`~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/msg_state_fail_resend.png b/app/src/main/res/drawable/msg_state_fail_resend.png new file mode 100644 index 0000000000000000000000000000000000000000..0dca30dfabaab7979f24a1fc64b3dbdc5aa065d6 GIT binary patch literal 1744 zcmbVMdpJ~i7@pi4WDGHeag9`($)%w|%$PA3V~k5Zq%x%@m)zFqsWug&QK%#-ZB5xW zl&(@CDwSMzcXFGNl*EWIF0EF%>{oXE*&lnJ-}%n_ecyY&_x=6O^PF@phpvglA`u9L zCX+$+gC_%SwwfZu$x91D5eNkzE<1oW?C1T11>_%e|95M^mp%9H$M2w@>jmituGhR= z4~I46=lz;ZpB^3_^kv_3a|S}+e}r}~&v_<{3NbT*ZkPAB4Z>UbtL^4f0I;AKX=x#4 zc>Y#yk|GQ!{lL{CnL+tfo&G`gBkOFf)0+9Kz-g+}$GN`v* zNszA4S_A~}1LRgF?U*fo&KpEA!vms(MS~U%qX!r)fs-Z%6)HS46R5yW+gLOJLV^tx zEi}~OD9YVkzO{V3Kq$w471Y6x7ZwA>=Tvu*qXPiAzynA>B)b9z=>|^<0GJPTNdKgJ z)X~U5ctlxy&DjYi1e+Sa^JZ34*21@N)Iq~3LDwFw9c5(!5*=)MgrzxIe=(Q@=|)eA zo8ICRb_5s&v_mUbz;?jf+~I&wI*q3Uk7oiujz2=terx)TX4%**0vCNtj#UeJJTrAa zSSzt#C4P8_{0fcEpY|xp_4lQ! zEc`gA8~)^ly0Oh(xdQ$LzDyd%8GU z7dd32ope-t#8M~WAWF5xkit_*TqgJ@O#}UT%iJu9vIb{;%BvQH@fl!QOQpo{NL=gIpZ0{`VA8_Gv@qdXvZQo3?oN(36p9(Qt;1IL$LN z&30R3;L5PqyD|RH^@}}pFqqK1^a$~<8kl%HtAfqq9P=sQovKH%M{RtX;BjV+O!Ul4YFes$ zHl@qXc$s)?G5=!IslcSBi$QAFyH9A85VcBf@eplxGBZ9-%N^;U_4qFZgkhNb_Vrvp zj$*M?jY!6#UTc(zlgg5#1fn6HDlTj(L!`Jad6Pi2{AT{5QdM^nN{Ln~dMFSj^4v=D z6A!jc_>+#ShP#>{4s$I%TriXQfxX(vk5f}rxS-2gvoHe@o1r2&M@_`_UuF47d-Qvl z<6^9NJ@?|C!d!-(ptxml4Jk2Adg`|9T2Nt@aJ@3=p43P%qY$TtJcK`+g4fPJDK9o7 zgxD&s+iaQb*JkZi&i~D&3Qu^Enw&ta+G14B6xJkHsP7VdEPH7oxN=@N%(E>%^e}km z&7ueNoyLT()z00+h7os+U6xSC;>@D-x=jqir;JZ_rKURUzc$MpEcxJXF3-C#)P7{E z{7zv0`@Y+upSwq77b?$*M$;gyo!*yV|C-G?MGpRyd@w5*U= z#xkPNNjD`kWz1vEOJbb0d%vbQq}fR2`#)E$!8Y&fPpLGj8>)R3YLfeT&)T-cBTx5z znW6<{)z;oQA)^b&%W)x*)!~`Xt7iXRW=}la(Qwhaz&7`ulV!(^+}mxjm+xNdb@av5 zh4*jZ*38qMSzl3WmQD q%h3i%yheNyg0K|TbyM$BkJdBQOQ&{tCxyd*1i_?nsMjgH + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/record_microphone_chatui.xml b/app/src/main/res/drawable/record_microphone_chatui.xml new file mode 100644 index 0000000..b4328ac --- /dev/null +++ b/app/src/main/res/drawable/record_microphone_chatui.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/recyclerview_divider.xml b/app/src/main/res/drawable/recyclerview_divider.xml new file mode 100644 index 0000000..111d79d --- /dev/null +++ b/app/src/main/res/drawable/recyclerview_divider.xml @@ -0,0 +1,24 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_btn_bg.xml b/app/src/main/res/drawable/round_btn_bg.xml new file mode 100644 index 0000000..dfdc7dd --- /dev/null +++ b/app/src/main/res/drawable/round_btn_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_white.xml b/app/src/main/res/drawable/round_white.xml new file mode 100644 index 0000000..bf751de --- /dev/null +++ b/app/src/main/res/drawable/round_white.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/select_mask.xml b/app/src/main/res/drawable/select_mask.xml new file mode 100644 index 0000000..99e9205 --- /dev/null +++ b/app/src/main/res/drawable/select_mask.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/separator_table.xml b/app/src/main/res/drawable/separator_table.xml new file mode 100644 index 0000000..6101b0a --- /dev/null +++ b/app/src/main/res/drawable/separator_table.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/separator_table_first.xml b/app/src/main/res/drawable/separator_table_first.xml new file mode 100644 index 0000000..fd06fa7 --- /dev/null +++ b/app/src/main/res/drawable/separator_table_first.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/separator_table_header.xml b/app/src/main/res/drawable/separator_table_header.xml new file mode 100644 index 0000000..c18dbe2 --- /dev/null +++ b/app/src/main/res/drawable/separator_table_header.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/separator_table_header_first.xml b/app/src/main/res/drawable/separator_table_header_first.xml new file mode 100644 index 0000000..37f083e --- /dev/null +++ b/app/src/main/res/drawable/separator_table_header_first.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_shadow.xml b/app/src/main/res/drawable/tab_shadow.xml new file mode 100644 index 0000000..6a01a85 --- /dev/null +++ b/app/src/main/res/drawable/tab_shadow.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/transparent_ripple_bg.xml b/app/src/main/res/drawable/transparent_ripple_bg.xml new file mode 100644 index 0000000..1898644 --- /dev/null +++ b/app/src/main/res/drawable/transparent_ripple_bg.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/voice_left_chatui.xml b/app/src/main/res/drawable/voice_left_chatui.xml new file mode 100644 index 0000000..0d40788 --- /dev/null +++ b/app/src/main/res/drawable/voice_left_chatui.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/voice_right_chatui.xml b/app/src/main/res/drawable/voice_right_chatui.xml new file mode 100644 index 0000000..a1907ad --- /dev/null +++ b/app/src/main/res/drawable/voice_right_chatui.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/white_ripple_bg.xml b/app/src/main/res/drawable/white_ripple_bg.xml new file mode 100644 index 0000000..b2b79f0 --- /dev/null +++ b/app/src/main/res/drawable/white_ripple_bg.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/wifi_chat_item_left_bg.9.png b/app/src/main/res/drawable/wifi_chat_item_left_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ebbac7c3ea5dbadbb4f6cabb1fde48a5dc8286f1 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^u0X8M!3HF^K4KSTU|?kPba4!+xb^n-My^8!B5sM_ z^L~l!`oU5gD(Lbex%7(Xq!{5BMQ@KT&0WROw8FBnUi8n3!VfzlYQDWlxL@nk5p|-; z!>Z$i*p#2Lp<9_!jV4y`IhrrvdG`0J*lxe=3wqKFHh#Ugo-Lkj>Eav0!dERb9cCW& zG}ZViyO~{ef4q!_F*B=3z&$rcW|4p$!48Z-4wPtZWa83T&;TYrE!GfsP}{HCy+l@F z@+*ae`0r)A#l_{1@iUZfdUku00k&O0SZun zf&v97KmiI+fbzd6PXN&@B7HxfVnq4|D4J!g+ixgdlpWg}Zhs|e%reof`I70Bx9o#k zcR>vMVcuET@Xm60@o+Soca7aciL+j@`Fn>_M05vd6inO!i44E2LDPP7W$nEj8RqA% zfKW0T7Q5kZ&Ck87!3l+?-YCJOTP(|ew#&DIUTm&?d(P}9BR)_W%j%Dgr=BvYR9ckr d7e(E>lxO}mK*OGSRy+Uz002ovPDHLkV1l|-w-o>Y literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000..39beb62 --- /dev/null +++ b/app/src/main/res/layout/activity_about.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_activate.xml b/app/src/main/res/layout/activity_activate.xml new file mode 100644 index 0000000..90b3ec2 --- /dev/null +++ b/app/src/main/res/layout/activity_activate.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + +