From 3bc254035a6a34c46a936a238f0397cca43735ef Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 4 Nov 2021 09:07:48 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=BB=BA=E7=AD=91?= =?UTF-8?q?=E5=86=85=E8=AE=BE=E5=A4=87=EF=BC=8C=20=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BF=9D=E5=AD=98=E4=BF=A1=E6=81=AF=E7=9A=84?= =?UTF-8?q?api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/serve-manager.ts | 3 ++- .../view/facility-window/facility-window.ts | 20 ++++++++++++------ .../babylon/building-basic-infos.service.ts | 8 +++---- src/assets/images/facility/in/FHFQ.png | Bin 0 -> 8846 bytes src/assets/images/facility/in/FHJL.png | Bin 0 -> 6722 bytes src/assets/images/facility/in/FHM.png | Bin 0 -> 2365 bytes src/assets/images/facility/in/HT.png | Bin 0 -> 4537 bytes src/assets/images/facility/in/LSXFB.png | Bin 0 -> 2676 bytes src/assets/images/facility/in/PTDT.png | Bin 0 -> 5091 bytes src/assets/images/facility/in/SNXHS.png | Bin 0 -> 2756 bytes src/assets/images/facility/in/SSLT.png | Bin 0 -> 4627 bytes src/assets/images/facility/in/SX.png | Bin 0 -> 2220 bytes src/assets/images/facility/in/WSXFB.png | Bin 0 -> 1777 bytes src/assets/images/facility/in/XFDT.png | Bin 0 -> 2954 bytes src/assets/images/facility/in/XF_MHQ_GF_8.png | Bin 0 -> 3191 bytes src/assets/images/facility/in/XF_MHQ_PT_8.png | Bin 0 -> 2330 bytes src/assets/images/facility/in/XKS.png | Bin 0 -> 2282 bytes 17 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 src/assets/images/facility/in/FHFQ.png create mode 100644 src/assets/images/facility/in/FHJL.png create mode 100644 src/assets/images/facility/in/FHM.png create mode 100644 src/assets/images/facility/in/HT.png create mode 100644 src/assets/images/facility/in/LSXFB.png create mode 100644 src/assets/images/facility/in/PTDT.png create mode 100644 src/assets/images/facility/in/SNXHS.png create mode 100644 src/assets/images/facility/in/SSLT.png create mode 100644 src/assets/images/facility/in/SX.png create mode 100644 src/assets/images/facility/in/WSXFB.png create mode 100644 src/assets/images/facility/in/XFDT.png create mode 100644 src/assets/images/facility/in/XF_MHQ_GF_8.png create mode 100644 src/assets/images/facility/in/XF_MHQ_PT_8.png create mode 100644 src/assets/images/facility/in/XKS.png diff --git a/src/app/babylon/controller/serve-manager.ts b/src/app/babylon/controller/serve-manager.ts index 12c7167..0ad6725 100644 --- a/src/app/babylon/controller/serve-manager.ts +++ b/src/app/babylon/controller/serve-manager.ts @@ -1,5 +1,6 @@ import { HttpErrorResponse } from "@angular/common/http"; import { classToPlain } from "class-transformer"; +import { PlanComponent } from "src/app/pages/plan/plan.component"; import { BuildingBasicInfosService } from "src/app/service/babylon/building-basic-infos.service"; import { ObjectsService } from "src/app/service/objects.service"; import { InsitutionDataSimple } from "../model/data/institution/institution-data-simple"; @@ -134,7 +135,7 @@ export class ServeManager { if (onSuccess) { onSuccess(allMarkPlanData.institutionID, data.result); } - // ThreeDimensionalHomeComponent.instance.openSnackBar("保存标绘信息成功"); + //PlanComponent.instance.openSnackBar("保存标绘信息成功"); // alert("保存标绘信息成功"); //暂时没有失败的回调 onError diff --git a/src/app/babylon/view/facility-window/facility-window.ts b/src/app/babylon/view/facility-window/facility-window.ts index 727d0c8..d985c3d 100644 --- a/src/app/babylon/view/facility-window/facility-window.ts +++ b/src/app/babylon/view/facility-window/facility-window.ts @@ -316,7 +316,7 @@ export class FacilityWindow extends UIBase { createNewFacilityByMesh(mesh: AbstractMesh, type: FacilityType) { let facilityData = this.createFacilityDataFromMesh(mesh, type); //let facilityInfo = this.createFacilityInfoFromMesh(facilityData, mesh, buildingInfo); - + console.log("获取到干粉灭火器", mesh); this.createNewFacility(facilityData, mesh); } @@ -330,7 +330,7 @@ export class FacilityWindow extends UIBase { let currentBuidngItem = StatusManager.getStatus(BuildingStatus) .buildingWindow.currentBuidngItem; if (currentBuidngItem == null) { - // alert("请先选中目标建筑"); + alert("请先选中目标建筑"); // ThreeDimensionalHomeComponent.instance.openSnackBar("请先选中目标建筑"); return } @@ -412,8 +412,16 @@ export class FacilityWindow extends UIBase { } - let defaultMesh = MeshBuilder.CreateBox(facilityData.key, { size: 1 }); - defaultMesh.isVisible = false; + let defaultMesh: AbstractMesh = null; + + if (mesh == null) { + defaultMesh = MeshBuilder.CreateBox(facilityData.key, { size: 1 }); + defaultMesh.isVisible = false; + } + else { + defaultMesh = mesh; + } + let facilityInfo = InfoManager.newModelInfo_facility( facilityData.key, facilityData, @@ -433,7 +441,7 @@ export class FacilityWindow extends UIBase { facilityInfo.belongToBuilding = buildingInfo; - if (facilityInfo.facilityShowType == FacilityShowType.ModelAndTag) { + if (facilityInfo.facilityShowType == FacilityShowType.ModelAndTag && mesh == null) { this.getFacilityPrefabSync(facilityData.resName).then((mesh) => { let prefab = mesh; @@ -480,7 +488,7 @@ export class FacilityWindow extends UIBase { } //设置设备transform信息 - setFacilityTransform(isLocalPos: boolean, isNew: boolean, facilityData: ModelData_facility, buildingInfo: BuildingInfo, newFacility: Mesh, facilityInfo?: ModelInfo_facility) { + setFacilityTransform(isLocalPos: boolean, isNew: boolean, facilityData: ModelData_facility, buildingInfo: BuildingInfo, newFacility: AbstractMesh, facilityInfo?: ModelInfo_facility) { //如果是局部坐标,要先设置父节点 if (isLocalPos) { buildingInfo.ModelInfo.setFacilityParent(facilityInfo); diff --git a/src/app/service/babylon/building-basic-infos.service.ts b/src/app/service/babylon/building-basic-infos.service.ts index 4cb08fc..5562801 100644 --- a/src/app/service/babylon/building-basic-infos.service.ts +++ b/src/app/service/babylon/building-basic-infos.service.ts @@ -38,9 +38,9 @@ export class BuildingBasicInfosService { postBuildingBasicInfos(name: string, data: any): Observable { let params = { name: name, - content: JSON.stringify(data), + // content: JSON.stringify(data), } - return this.http.post(this.baseUrl + this.c_post, {}, { params }) + return this.http.post(this.baseUrl + this.c_post, JSON.stringify(data), { params }) .pipe( catchError((err) => this.handleError(err)) ); @@ -66,9 +66,9 @@ export class BuildingBasicInfosService { postMarkData(name: string, data: any): Observable { let params = { name: name, - content: JSON.stringify(data), + //content: JSON.stringify(data), } - return this.http.post(this.markUrl + this.c_post, {}, { params }) + return this.http.post(this.markUrl + this.c_post, JSON.stringify(data), { params }) .pipe( catchError((err) => this.handleError(err)) ); diff --git a/src/assets/images/facility/in/FHFQ.png b/src/assets/images/facility/in/FHFQ.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc59c98d45aa2b883fc27917af8e4f4ca046efe GIT binary patch literal 8846 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/facility/in/HT.png b/src/assets/images/facility/in/HT.png new file mode 100644 index 0000000000000000000000000000000000000000..a15f56d425d3c861b0dc7dcd04177305798e6364 GIT binary patch literal 4537 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/facility/in/LSXFB.png b/src/assets/images/facility/in/LSXFB.png new file mode 100644 index 0000000000000000000000000000000000000000..0e38f1ae6482ca2414e0c1332b563a173ca2a0af GIT binary patch literal 2676 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 KMNUMnLSTYqfFtz) literal 0 HcmV?d00001 diff --git a/src/assets/images/facility/in/SSLT.png b/src/assets/images/facility/in/SSLT.png new file mode 100644 index 0000000000000000000000000000000000000000..002638a229abc44d9c53d33389d89e11375f7757 GIT binary patch literal 4627 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/facility/in/SX.png b/src/assets/images/facility/in/SX.png new file mode 100644 index 0000000000000000000000000000000000000000..128ada5cd55cb2dfb5b18339800b51519aef67d7 GIT binary patch literal 2220 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�FB)0GFnSN)VbGGm7b7Bvq z_9vZe-#sti&+mDE?lCUeMQ)sq&lszVClbTM3s3FZbyfJpi7Qgk=;dGT+t)b>v`Ih+ zfG-y;o&mycV5IZbTfcM$gP(<#Ecs;7`t?V>?d_-Qp^M|P=yh?xg+qsyeL663)A4QF zR)m4xI1r?a1OSqrU$LOvX9j?hd+r0GAz-j;AfUd+O+R_;yI>W*W zIx*sqaNO(0CsRN;F2fg#Bf~P70FI{m|acn>PYj z5&#fwY(#TF!tzWSOJfOODh;j3YGG8RTn-%ad-1O1z=eqnf{_S0f$T)zQ%`NX=9y>y zWYV?N#Q`0ES$g%O?|<~4N9IxY?F~W-h`3QwaD5^Pgr{mmZDAo7-t&5JAR{0%A;Xu5 z;w*q`uKw=xKRNW#?*I(hNoJ-F=>7x8JuwWdX$A0Aa}%y~^SC{kfO9laOU#OvYVzV$ zj~5?Ls%W_|igVe%;gz2;_AG!SmEu?L07dTkl_))x1o|387s3HAZu2tqgrh*RK68kQ z=Hc-{QxJcT1EGlo#^ot^fW1%3navQy56VT?9l+bns+-``K%Y%^#GaQ*Y z{IX@_b>N4iSmTwv$h7(J({v2M zv&oqYU$+j}wacJ_D;L_9MccgiqvV4$5=SDFKr`^lCdPhY)hF1k0o*_+^yoQYO+auW zIX{3+n4E?urxjn7?3P;!;q`RvnA>fcXK*B;X(NrKl{AxfVLCxP0QT=cK!AJZeYonKZq`$h@KI1c;ps2744;$fVbWPo_rE&S65-^>#l?P z_~XExcLJ(vosyyyfXf!aNGoY3?ZiMV74=aks9*oxxpVE$0r|J!*yi>YrZl2Uj)# z7z;MwrgRF3+FQ|>wcIkTxj;biWxQWt24~osIYiSM1F~-T=CI z6^PAlJ!>kmxJnoQuEDIZz+!2Qg_wwq7%erP+VhVUv`eW5T=-5ZWv>qB%+^pywr`*H zvyVU4hC$UvySG~dh=Ev$$(Lg^O=t4#*@aP{m&Vq)0?-zp)s~x{cd7ODfh}4DcH{_H ze}7?#x3*RXXVZv$NaEo?SD)P-(U76hJ@O4V zK%sR&uGw%~w%AIqni&Ey5u2D})$ivWKyPfwJ8qAFR$r}K;j~FbHAB4bKFt|w4oIkC z6sSfeF%g@PV=YNz3TUHGkIW#Zs&4|-#>lVecI?ocB0T&sM2-V@<(2u)u$D$l#AakA z6AfQN+T)B0B(2t2^)r6!R-myFICd=OnaVXmt)>5gRcQYl#Eg z^X8on0)y25pI3kppFIbt#qSl*pD!PwXtKi=EU-^A!_JXdh>6&Uky!O-1;h8El|MR2 z10+8&g=0>qt!WYk;e;xhOuA^BP45(|G~2xe4~>PG;yK1*{dwzt;+JnLz?e5Nf#WI< z`0cgls>&su&cEKGi#vI;O7tqt@6cF?iP(tIm_UI8=Jxh}*a7UNN;)+ZfZ(9^20HveU^Q1Py-_dVj(7CBSuRHklpyg3wy?CTRb|Bw;fI(II~{8E;|ZU zp6VdT?LIku7{^)H5w%(<20UWoy#5=~85>0`L|ON+UDE>6K(z}QiVBGmcwvoAdL z;Z2sa{lLV;^oY^a1h`xP^*a=nUYF5u+R_64op+|Q>+Xhp_^@``R5q>!EIP-3cZRSh z&cQo63P14rCdSt22Q2ji5@wVB)Xh70?%uv(!w*|W!@`^HX7n_<%f279ED>1-f96bC z=amD1MgL%DA3$w#<4r|Cc6yE}m$2{5Q*8NB3g09@s> ztY-48n#=}OI{i^AbMcyH(oPJ-LQH01Txn~|ES}E?B+75ctDT+TbKB>IDzg~l3j%nK^TIzIK~za$VPoU-{o(LqW|gIy zgOa7kBs4LGn>NZO+N`j zLS_k1TDIiiNh4|9lsz(A@!at2j>`Igp3$gwV)JXU8XT3qbXZ!yap}1Hr9Vtu`peAB zL|)8)nkur3_iuB>cCr3(($v1`f1SN#7qtQSA2}p2&-eUFUH||907*qoM6N<$f)UrN A`~Uy| literal 0 HcmV?d00001 diff --git a/src/assets/images/facility/in/XF_MHQ_GF_8.png b/src/assets/images/facility/in/XF_MHQ_GF_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b3e78e21d35d9026fd28e781f448547c8799270c GIT binary patch literal 3191 zcmV--42biIP)3kjzy0R+~AS_KwXRum}Ea#jBDUr`IPmPl=ZtOcS* zU@2UsbS+Uqj7C_%aX!T?sJ$V^*8k#50L=I02l#a7=R%FVgd965X@uh0aOAg0&oRDE`W0YvH+C#gix>W zU$1VS*UWR0f-?a80l*Xh1LS0@AdHU$0MqzqJAgs}hX5P^kii7m0CaShz}-av%@YJ* zJb)(v%;dX$J0QXa0{9CbWEDRG_!hu%01ZsWZ3})oumA`FkPKixfXDdm_XLLV@h1TL z0qh2F3_u-#_B%lU-SKz;ivc{v|Mv!n;H3Z_0q_lgodELLA`HVKo$yCvXIcTw1+WUh zLUw4qjlR6(;@BtL0MMvchQ0jPodqZz7mXhb;5h()W{+;sIJY-I@=OQt0L!uiKmmX@ z9oHr&>(&Cyd=PvAi~{g7fF*2-X7$s06(mDAfFuB+07?N=vtKZ2L?6>$9R$cv^Z_sy zz)Jw0X7jt-;Lpo}oN_Ve4>sveDnaPczw4bjAdNOGJCnO0=EQ6 zpf$hj9#CF_M8Yzb-L7Q?1a|~j+2PH*N0gTk#xg(0I%vWb0TkzFbAl7zYod1_Nah6q z=CCfR&gIh)PL;$!r#% zBgc$?v^~mWm3rxBZs6w$|37->6Z)eXg&Eb z_+jBfRGd1cmju%3bG8HrlmvKlJs;D}Iy=ESaUzo6d=o`K|BMrB);JNM2SEb|V)FX+ zn6Z63{xfZwuml~5VcmX_*9yuoD0Omr6nzsDh0rJ8c}F-ovzM2lqp73>$JeYuU~DY> zBO{H7Iz!p7P+9;DNc2Q`^4v+&v8kydtP$E88-;}o zf9WOk2?-G-4$-Kj0EVj(a9eHc+KU%adiXHsImqZNQFEd_JXn0Df`&pKIYBunpC`+B zXz5b;TdiWb*xTDtuy?Oes-?Qx{l)BdkvN^%umOonmx_#$<_V06LFmw-MhS4}Dks2D zYnv*!sT(&U=8;Em;N_Q{(ou4TANN$YGToJ0=baW71vJi;mV-6lG@O>YhEg^7Yr9 zbI3{Z^FzeL4~w+A;Jfb-F>V|NKmIsOmaaXSpaBCgV3x;4t3y}01ys6fd{XQ_k(TC2 zJSe<*lEn>v;t3=^|2!HC3%lg=evy#~ij76#Pd|zFT4h!ie1e1F*RP+$>r0?8Satfe z;p;OT%*!Px;^*_K@D2#V(C*T}ELFr=G*Z1!i zha8D7ynx{^z9^PP_LePf{XtW4vFP;?X}q8594BRiN%VUU1d_-n$=oE1FvbMn|JIFHe-jj!EoxmlYbd z#;S92aAxC15y~i}g~Yje2yHSUZ|6?oKM2E?ED_7h0DfTIoI<_YUSTipoo~|fd~nvT zT}W7@+i&&=C}G;2lHzLWeBK@`JsdT?!n;P)%3&LCMcuYHx?@K4@G zD~H1exZ5X4CvM}N*)_c)cK4u$W!@$|0@H#k0wn98^evs8;=MpZ4a-V0Uw1dym4}z& zrH#wSt^EDnykWA2J^ofM@1>+i(@VPBEG?Z#6IHM^_^@O2?_Sw&8?@%X0PrDzGt^pO z`R%g54oG{2^$;LU(9UIK4igg1+v)D~j&Uhs(R$wu;3CVXsXPo20L27$W;%x*WB`Cc zcaQ`d$9eMhySUlWA(K~CdFUj-q+n70e*sk72d&q?mU7W#aCLE<0$W|`!m)#U90 zy>E;tO-Mdz1Fy9L-g?&4FHK1(lD#x_oHIP>(Ug|Fn$Qyk)<8v6M&<<$MErP zdTmY#>9x7(U6P>30-!R1@^c%TAPJc1!Hbhx*Vg;uq*6}1%5SQ;?_Zt$ d9rrZ={2yHhi*%j5RTBUJ002ovPDHLkV1neo1mXYy literal 0 HcmV?d00001 diff --git a/src/assets/images/facility/in/XF_MHQ_PT_8.png b/src/assets/images/facility/in/XF_MHQ_PT_8.png new file mode 100644 index 0000000000000000000000000000000000000000..de94ddc8ba4817bd68de1627a2f963b859dbcd05 GIT binary patch literal 2330 zcmV+#3FY>QP)WncMkM+r6PP#i&OPUQ z=bm%!xp(jkPdNn1{NH28!%P5k0h9p91KktN05Z*q(TpYlhXAZGDnKH@W>S#~02cwQevHP0kF}bQU13I$Q3B|`8UR}X z6q-@MBnr6>HAZbQa?=zZlqkqKVriX5IJhpgTsK|NOF$WCdt!fB8U+)%Ze@CI(nG*X z9_+HM)Y@WXa~)S|6|0p1V)Y9E8Bc0p=s zQHdHNAm{PUsf@k57V@QW`Z(Ao;`g$oeauERH-G&iU62S+TMRjQjcsXd zALnvmmPi8?xrTIR3Jg4q*bJ}7*g|qF9FQ9YE(kf z*s&_vU=;V;`8B3R9#OBRNDK0iAOc0P-T8fd?)o?Fbq-hHE zC5_wI>jDE0f_Kc8ym6_i$lkaS8OxR-A=BC(N!QJrX!zzEG*(w5*x6}ROf#i-wIE2{ z+jq=(K*Dp+A@}poF}%DSaYKd}6%!Fe?%Yj9*|qn2s~?FiW_&jQ_4j_Z*! zt)&Har?cOTm*a@OI>T2Aus|jE0Nu-8HRHuV0GGyOf3h__6YBB6d+{P#|N0Ap&4!N4m(f;N$2^7Re9-4Z zu%m-@ij<%jL-#!T`)>riULqKVt^0{EB0>(|y?cmvyWxNE03BDZu#QpT&Yf(D zt%S}j&{7I8#^oO1(Mv!WM3DtPn&)IZflAfD!-qgH$ljBOP&}}AcB1>v9cDa5du5AE z6h+n+>$-J|eZTwmZT6xJQ?zei_>|EHkMwPM47g^>csk#5{yc7N+ZNW)q$~i*Tj(z* z1HAh~3#YJGS{m~bCECxN!OhA_Mv4i9Y?XTeoynPHMk+mRdTOGgtxZol(ALKOCs!we zq`n}<2h|R+D6-|Rpj=o5gDf6M9%c~7)d--D=?1g)0HrfQ5W-W6t;g9Y_{mdVQeh#S zFTJEKppzo2;&v3Zb51#ok#!hQ$1Q)x6HWCkXJKJNN%JLBODb z0=O0~WHo^S+)$o1R9gYkIlQ$-q|=k7fJQxnhOfVt*`f%E5+O9tuU=)TP>lc<0A=J+ z(UezN3HR%-tF9e1;0NVbOl^&+Re}V{(f5D;Ih60?Gcs`f!w=c!Nc*{S$Xc_8#R01H zC2{iX_eDVqN zggB=YuKDwOK8ZkJFUSm|b%BW;qC;w@OZz%0dNJA=z(^jT2Fe6BN{2oll8TD-s~-hX zJm3<4`XTh?0TMRzLx`3v$de~butJOxba7i$5$&vSjdCk#0OFw95gDy#h2H{DH-L?= z<2FP@Gy*7$(~eP0YSI{^p6ed$YZxu%)G+|>@lC~nf@ZGsv1s~gttTlKygxulXy&@s zX!)|9f_fMKfx?qK9qPG`yR_b*cSRwc#(ok5W1Z|YyJi?!QXS(zhC0Y|Y=5JR>oQr( zoL9o=#z>H}y_Q#5{e??hhq7qV-f99Q?BFHlw|uejxX{GM9L04o46C-r)^KI0biQuc zE>mxaT=rHzmf>HF$?@!mlhTE!^{2DX@Kgi9e;AR_@k+GZfB*mh07*qoM6N<$f*S)* A0RR91 literal 0 HcmV?d00001 diff --git a/src/assets/images/facility/in/XKS.png b/src/assets/images/facility/in/XKS.png new file mode 100644 index 0000000000000000000000000000000000000000..9c27faa16b9eb06611e416ae6a6c5b53f87aea4b GIT binary patch literal 2282 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 Eg6V`-(*OVf literal 0 HcmV?d00001 From 7eb3544ab0f4be065fd843cb07c5f2879dda7a39 Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Thu, 4 Nov 2021 10:18:21 +0800 Subject: [PATCH 02/14] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/service/babylon/building-basic-infos.service.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/service/babylon/building-basic-infos.service.ts b/src/app/service/babylon/building-basic-infos.service.ts index 5562801..ab0cd05 100644 --- a/src/app/service/babylon/building-basic-infos.service.ts +++ b/src/app/service/babylon/building-basic-infos.service.ts @@ -38,9 +38,11 @@ export class BuildingBasicInfosService { postBuildingBasicInfos(name: string, data: any): Observable { let params = { name: name, - // content: JSON.stringify(data), } - return this.http.post(this.baseUrl + this.c_post, JSON.stringify(data), { params }) + let headers = { + "Content-Type": "application/json" + } + return this.http.post(this.baseUrl + this.c_post, `'${JSON.stringify(data)}'`, { headers,params }) .pipe( catchError((err) => this.handleError(err)) ); From f1ca2501a1939482510a65f7dc1551b9f2ebf936 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 4 Nov 2021 10:19:24 +0800 Subject: [PATCH 03/14] =?UTF-8?q?=E5=B7=B2=E6=9C=89=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=9A=84=E9=87=8D=E6=96=B0=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/info-manager.ts | 12 +++++++++-- .../data/model-data/model-data-facility.ts | 20 +++++++++++++++---- .../model/data/model-data/model-data.ts | 10 ++++++++-- .../view/facility-window/facility-window.ts | 2 +- .../babylon/building-basic-infos.service.ts | 2 +- 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/app/babylon/controller/info-manager.ts b/src/app/babylon/controller/info-manager.ts index e4c8436..ed14f76 100644 --- a/src/app/babylon/controller/info-manager.ts +++ b/src/app/babylon/controller/info-manager.ts @@ -2,7 +2,7 @@ import { AbstractMesh } from "@babylonjs/core"; import { MarkData } from "../model/data/mark/mark-data"; import { ModelData } from "../model/data/model-data/model-data"; -import { FacilityInBuildingType, FacilityType, ModelData_facility } from "../model/data/model-data/model-data-facility"; +import { FacilityInBuildingType, FacilityPosType, FacilityType, ModelData_facility } from "../model/data/model-data/model-data-facility"; import { ModelEditData } from "../model/data/model-data/model-edit-data"; import { TransformData } from "../model/data/transform-data"; import { BuildingInfo } from "../model/info/building/building-info"; @@ -170,13 +170,21 @@ export class InfoManager { for (let i = 0; i < facilities.length; i++) { for (let j = 0; j < facilities[i].facilities.length; j++) { + + let mesh = null; + let facilityData = facilities[i].facilities[j] + if (facilityData.posType == FacilityPosType.In) { + mesh = SceneManager.Instance.scene.getMeshByID(facilityData.resName); + } + + FacilityWindow.instance.createFacility( modelEditData.facilities[i].facilities[j], false, buildingInfo, true, false, - null,//要根据类型,是不是从场景中查找 + mesh,//要根据类型,是不是从场景中查找 (modelInfo: ModelInfo_facility) => { if (ModeManager.currentMode == ModeType.Look) { modelInfo.setIconEnable(false);//查看模式下隐藏所有设备ui diff --git a/src/app/babylon/model/data/model-data/model-data-facility.ts b/src/app/babylon/model/data/model-data/model-data-facility.ts index 4965515..9106c37 100644 --- a/src/app/babylon/model/data/model-data/model-data-facility.ts +++ b/src/app/babylon/model/data/model-data/model-data-facility.ts @@ -10,9 +10,15 @@ import { ConfigManager } from "src/app/babylon/controller/config-manager"; //设备数据 export class ModelData_facility extends ModelData { - posType: FacilityPosType = FacilityPosType.Out;//位置类型 + /** + * 位置类型 + */ + posType: FacilityPosType = FacilityPosType.Out; - facilityType: FacilityType = FacilityType.PL;//具体设备类别 + /** + * 具体设备类别 + */ + facilityType: FacilityType = FacilityType.PL; @Type(() => PropertyData_Base) propertyData: PropertyData_Base = null;//属性信息 @Type(() => Vector3) @@ -102,8 +108,14 @@ export class ModelData_facility extends ModelData { //设备位置类型(室内还是室外) export enum FacilityPosType { - In = "in", //内置在建筑模型中 - Out = "out", //在编辑时单独放置 + /** + * 内置在建筑模型中 + */ + In = "in", + /** + * 在编辑时单独放置 + */ + Out = "out", } //设备展示类型 diff --git a/src/app/babylon/model/data/model-data/model-data.ts b/src/app/babylon/model/data/model-data/model-data.ts index 48df269..f0cd417 100644 --- a/src/app/babylon/model/data/model-data/model-data.ts +++ b/src/app/babylon/model/data/model-data/model-data.ts @@ -6,8 +6,14 @@ export class ModelData { key: string; //身份唯一标识 name: string; //用户定义的名称 - resName: string; //资源名称 - resPath: string; //资源路径(局部) 可使用 DataManager.getResPath进行构造 + /** + * 资源名称,如果是建筑内置设备,则代表了mesh的id(用于寻找mesh) + */ + resName: string; + /** + * 资源路径(局部) 可使用 DataManager.getResPath进行构造 + */ + resPath: string; @Type(() => TransformData) transformData: TransformData; //变换信息 version: number = 1;//版本号 diff --git a/src/app/babylon/view/facility-window/facility-window.ts b/src/app/babylon/view/facility-window/facility-window.ts index d985c3d..ae5a50d 100644 --- a/src/app/babylon/view/facility-window/facility-window.ts +++ b/src/app/babylon/view/facility-window/facility-window.ts @@ -622,7 +622,7 @@ export class FacilityWindow extends UIBase { createFacilityDataFromMesh(mesh: AbstractMesh, type: FacilityType) { let name = ConfigManager.getFacilityTypeName(type); - let result = new ModelData_facility(mesh.name, type, name, mesh.name, new TransformData(), FacilityPosType.In); + let result = new ModelData_facility(mesh.name, type, name, mesh.id, new TransformData(), FacilityPosType.In); return result; } diff --git a/src/app/service/babylon/building-basic-infos.service.ts b/src/app/service/babylon/building-basic-infos.service.ts index 5562801..950ba1f 100644 --- a/src/app/service/babylon/building-basic-infos.service.ts +++ b/src/app/service/babylon/building-basic-infos.service.ts @@ -40,7 +40,7 @@ export class BuildingBasicInfosService { name: name, // content: JSON.stringify(data), } - return this.http.post(this.baseUrl + this.c_post, JSON.stringify(data), { params }) + return this.http.post(this.baseUrl + this.c_post, (data), { params }) .pipe( catchError((err) => this.handleError(err)) ); From 1053801371714666735a4604321e8295406d19b1 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 4 Nov 2021 11:04:16 +0800 Subject: [PATCH 04/14] =?UTF-8?q?=E5=B0=81=E8=A3=85=E4=B8=8E=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E9=80=9A=E4=BF=A1=E7=9A=84api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../babylon/building-basic-infos.service.ts | 101 ++++++++++-------- 1 file changed, 59 insertions(+), 42 deletions(-) diff --git a/src/app/service/babylon/building-basic-infos.service.ts b/src/app/service/babylon/building-basic-infos.service.ts index f5d6c76..8245839 100644 --- a/src/app/service/babylon/building-basic-infos.service.ts +++ b/src/app/service/babylon/building-basic-infos.service.ts @@ -8,52 +8,35 @@ import { catchError, retry } from 'rxjs/operators'; }) export class BuildingBasicInfosService { - readonly c_get = "/Get"; - readonly c_post = "/PostOrPut"; + constructor( + private http: HttpClient + ) { } + /** - * 通用消息头 + * 单位信息的api [获取/保存] */ - headers = { - "Content-Type": "application/json" - }; - - //获取单位信息的api - baseUrl = 'api/Services/3D/BuildingBasicInfo'; + readonly api_buildingInfo = 'api/Services/3D/BuildingBasicInfo'; /** - * 事态标绘(电子沙盘)的api + * 事态标绘(电子沙盘)的api [获取/保存] */ - markUrl = "api/Services/3D/Sandboxie"; - + readonly api_sandBox = "api/Services/3D/Sandboxie"; - constructor( - private http: HttpClient - ) { } - /** * 获取三维信息 */ getBuildingBasicInfos(name: string): Observable { - return this.http.get(this.baseUrl + this.c_get + '?name=' + name); + return this.getInfos(this.api_buildingInfo, name); } /** * 保存三维信息 * @param name * @param data */ - postBuildingBasicInfos(name: string, data: any): Observable { - let params = { - name: name, - } - - let instance = this; - - return this.http.post(this.baseUrl + this.c_post, `'${JSON.stringify(data)}'`, { instance.headers, params }) - .pipe( - catchError((err) => this.handleError(err)) - ); + postBuildingBasicInfos(name: string, data: object): Observable { + return this.postInfos(this.api_buildingInfo, name, data); } /** @@ -61,29 +44,69 @@ export class BuildingBasicInfosService { * @param name */ getMarkData(name: string): Observable { - // name = "bb"; + return this.getInfos(this.api_sandBox, name); + } + + /** + * 推送事态标绘的信息 + * @param name + * @param data + */ + postMarkData(name: string, data: object): Observable { + return this.postInfos(this.api_sandBox, name, data); + } + + + //#region 通用封装,新增api时调用即可,不需关心具体组装规则。若修改规则,只需修改此通用封装 + /** + * get类api所需的固定内容 + */ + readonly c_get = "/Get"; + /** + * post类api所需的固定内容 + */ + readonly c_post = "/PostOrPut"; + + /** + * 通用消息头 + */ + readonly headers = { + "Content-Type": "application/json" + }; + /** + * 通用get 类api的封装 + * @param api + * @param name + */ + getInfos(api: string, name: string) { let id = { "name": name }; - return this.http.get(this.markUrl + this.c_get, { params: id }).pipe( //'?name=' + + return this.http.get(api + this.c_get, { params: id }).pipe( catchError((err) => this.handleError(err)) ); } /** - * 推送事态标绘的信息 + * 通用post 类api的封装 + * @param api * @param name * @param data */ - postMarkData(name: string, data: any): Observable { + postInfos(api: string, name: string, data: object) { let params = { name: name, - //content: JSON.stringify(data), - } - return this.http.post(this.markUrl + this.c_post, JSON.stringify(data), { params }) + }; + + let headers = this.headers; + + return this.http.post(api + this.c_post, `'${JSON.stringify(data)}'`, { headers, params }) .pipe( catchError((err) => this.handleError(err)) ); } + //#endregion + //#region 错误捕捉 private handleError(error: HttpErrorResponse) { if (error.error instanceof ErrorEvent) { @@ -106,11 +129,5 @@ export class BuildingBasicInfosService { return throwError( error); } + //#endregion } - -/** - * 服务器返回的结果 - */ -class HttpResult { - -} \ No newline at end of file From 2d43df9b29995eb98e39406666005e912fdf9e77 Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Thu, 4 Nov 2021 11:46:32 +0800 Subject: [PATCH 05/14] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/status/login-status.ts | 3 +++ src/app/pages/plan/plan.component.ts | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/app/babylon/controller/status/login-status.ts b/src/app/babylon/controller/status/login-status.ts index e146489..50aae2d 100644 --- a/src/app/babylon/controller/status/login-status.ts +++ b/src/app/babylon/controller/status/login-status.ts @@ -71,12 +71,15 @@ export class LoginSatus extends StatusBase { console.error("获取单位列表失败"); console.log(error); if (error instanceof HttpErrorResponse && error.status === 404) { + let isAdd = confirm('数据库为空,是否进行初始化?') + if (isAdd) { //数据库没有数据,新建 this.institutionList = []; if (onSuccess) { onSuccess(this.institutionList, this.institutionList); } console.log("新建数据列表"); + } } else { console.log("单纯报错", error instanceof HttpErrorResponse, error.status === 404) diff --git a/src/app/pages/plan/plan.component.ts b/src/app/pages/plan/plan.component.ts index d84cc07..13e1931 100644 --- a/src/app/pages/plan/plan.component.ts +++ b/src/app/pages/plan/plan.component.ts @@ -64,9 +64,12 @@ export class PlanComponent implements OnInit { this.beforeOneSatus = StatusManager.getStatus(LoginSatus); this.beforeOneSatus.onSelectInsSuccess(find) } else { //如果没有找到对应的单位key,则调用新建单位 - let name = 'ceshi'; - console.log("没找到单位,新建" + key); - loginStatus.createInsitution(key, name); + let isAdd = confirm('没有单位name,是否进行初始化?') + if (isAdd) { + let name = 'ceshi'; + console.log("没找到单位,新建" + key); + loginStatus.createInsitution(key, name); + } } } else { let find = data.find(item => { return item.key === ModeManager.institutionDemoKey }) From 9ef48c6dd28d6dadda54a738f995a1da6eb427af Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 4 Nov 2021 11:48:34 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=B8=8E=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E9=80=9A=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/serve-manager.ts | 2 +- src/app/service/objects.service.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/babylon/controller/serve-manager.ts b/src/app/babylon/controller/serve-manager.ts index 0ad6725..020deca 100644 --- a/src/app/babylon/controller/serve-manager.ts +++ b/src/app/babylon/controller/serve-manager.ts @@ -1,6 +1,5 @@ import { HttpErrorResponse } from "@angular/common/http"; import { classToPlain } from "class-transformer"; -import { PlanComponent } from "src/app/pages/plan/plan.component"; import { BuildingBasicInfosService } from "src/app/service/babylon/building-basic-infos.service"; import { ObjectsService } from "src/app/service/objects.service"; import { InsitutionDataSimple } from "../model/data/institution/institution-data-simple"; @@ -34,6 +33,7 @@ export class ServeManager { ) => void, onError?: (key: string, error: any) => void) { this.buildingBISrv.getBuildingBasicInfos(key) .subscribe(data => { + console.log("得到单位信息" + key, data); if (onSuccess) { onSuccess(key, JSON.parse((data as any).result)); } diff --git a/src/app/service/objects.service.ts b/src/app/service/objects.service.ts index af4280a..c983d62 100644 --- a/src/app/service/objects.service.ts +++ b/src/app/service/objects.service.ts @@ -27,7 +27,7 @@ enum EnvironmentType { export class ObjectsService { static readonly c_apiRoot = "/api/Objects/";//普通上传的API根路径 - static apiRoot_Multipart = "/api/";//分块上传的API根路径 + static readonly c_apiRoot_Multipart = "/api/";//分块上传的API根路径 /** * 当前所处环境(打包前根据需要设置) @@ -88,7 +88,7 @@ export class ObjectsService { // return this.http.post(ObjectsService.baseUrl + extensionPath, formData); let data = { keepOriginalName: 'true', filename: file.name } return new Promise((resolve, reject) => { - this.http.post(ObjectsService.apiRoot_Multipart + "NewMultipartUpload/" + this.getBucketName() + extensionPath, {}, { params: data }).subscribe(async (data: any) => { //初始化分段上传 + this.http.post(ObjectsService.c_apiRoot_Multipart + "NewMultipartUpload/" + this.getBucketName() + extensionPath, {}, { params: data }).subscribe(async (data: any) => { //初始化分段上传 let instance = this; let objectName = data.objectName let uploadId = data.uploadId @@ -107,7 +107,7 @@ export class ObjectsService { //同步写法实现异步调用 let result = await new Promise((resolve, reject) => { // await 需要后面返回一个 promise 对象 - this.http.post(ObjectsService.apiRoot_Multipart + `MultipartUpload/${instance.getBucketName()}${objectName}?uploadId=${uploadId}&partNumber=${i + 1}`, formData).subscribe((data: any) => { + this.http.post(ObjectsService.c_apiRoot_Multipart + `MultipartUpload/${instance.getBucketName()}${objectName}?uploadId=${uploadId}&partNumber=${i + 1}`, formData).subscribe((data: any) => { let msg = { "partNumber": data.partNumber || null, "eTag": data.eTag || null } resolve(msg) // 调用 promise 内置方法处理成功 }) @@ -117,7 +117,7 @@ export class ObjectsService { if (PartNumberETag.length === allSlice) { //分块上传完成 let data = PartNumberETag let paramsData = { uploadId: uploadId }; - let path = ObjectsService.apiRoot_Multipart + `CompleteMultipartUpload/${instance.getBucketName()}` + objectName; + let path = ObjectsService.c_apiRoot_Multipart + `CompleteMultipartUpload/${instance.getBucketName()}` + objectName; this.http.post(path, data, { params: paramsData }).subscribe(data => { let objData: any = new Object(); objData.fileName = file.name; From 0f9b6698159b081972d158ddf23874a0ab7c5490 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Fri, 5 Nov 2021 08:23:30 +0800 Subject: [PATCH 07/14] =?UTF-8?q?=E5=BB=BA=E7=AD=91=E5=86=85=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E8=8E=B7=E5=8F=96=E4=B8=8E=E6=B8=85=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/config-manager.ts | 23 +++++++ src/app/babylon/controller/scene-manager.ts | 18 +++++- src/app/babylon/controller/serve-manager.ts | 3 +- .../data/model-data/model-data-facility.ts | 18 ++++++ .../model/info/model/model-info-building.ts | 10 +-- .../model/info/model/model-info-facility.ts | 10 ++- .../babylon/model/info/model/model-info.ts | 27 +++++--- .../view/building-window/building-ui-item.ts | 6 +- .../view/facility-window/facility-window.ts | 58 ++++++++++++------ src/app/pages/plan/plan.component.ts | 6 +- .../in/{FHJL.png => XF_MHQ_GF_35.png} | Bin .../in/{WSXFB.png => XF_MHQ_GF_4.png} | Bin .../in/{FHFQ.png => XF_MHQ_PT_35.png} | Bin .../facility/in/{SX.png => XF_MHQ_PT_4.png} | Bin .../facility/in/{FHM.png => XF_MHT.png} | Bin .../facility/in/{XFDT.png => XF_TSLX.png} | Bin .../facility/in/{PTDT.png => XF_XFCM.png} | Bin .../facility/in/{SNXHS.png => XF_XFF.png} | Bin .../images/facility/in/{HT.png => XF_XFQ.png} | Bin .../facility/in/{SSLT.png => XF_XFS.png} | Bin .../facility/in/{LSXFB.png => XF_XFT.png} | Bin 21 files changed, 136 insertions(+), 43 deletions(-) rename src/assets/images/facility/in/{FHJL.png => XF_MHQ_GF_35.png} (100%) rename src/assets/images/facility/in/{WSXFB.png => XF_MHQ_GF_4.png} (100%) rename src/assets/images/facility/in/{FHFQ.png => XF_MHQ_PT_35.png} (100%) rename src/assets/images/facility/in/{SX.png => XF_MHQ_PT_4.png} (100%) rename src/assets/images/facility/in/{FHM.png => XF_MHT.png} (100%) rename src/assets/images/facility/in/{XFDT.png => XF_TSLX.png} (100%) rename src/assets/images/facility/in/{PTDT.png => XF_XFCM.png} (100%) rename src/assets/images/facility/in/{SNXHS.png => XF_XFF.png} (100%) rename src/assets/images/facility/in/{HT.png => XF_XFQ.png} (100%) rename src/assets/images/facility/in/{SSLT.png => XF_XFS.png} (100%) rename src/assets/images/facility/in/{LSXFB.png => XF_XFT.png} (100%) diff --git a/src/app/babylon/controller/config-manager.ts b/src/app/babylon/controller/config-manager.ts index 6a01cf6..b932819 100644 --- a/src/app/babylon/controller/config-manager.ts +++ b/src/app/babylon/controller/config-manager.ts @@ -1,5 +1,6 @@ import { MarkKindType, MarkType, MarkTagPos } from "../model/data/mark/mark-data"; import { FacilityPosType, FacilityType } from "../model/data/model-data/model-data-facility"; +import { TsTool } from "../tool/ts-tool"; //配置、常量管理器 export class ConfigManager { @@ -31,6 +32,28 @@ export class ConfigManager { return result; } + /** + * 查询设备是否需要展示图标 + * @param type + */ + static getFacilityNeedIcon(type: FacilityType) { + let result = false; + switch (type) { + case FacilityType.PL: + case FacilityType.QY: + case FacilityType.TPBZ: + case FacilityType.DWBZ: + result = true; + break; + + } + if (TsTool.stringContain(type, "XF_")) { + result = true; + } + + return result; + + } /** * 获取设备icon的url diff --git a/src/app/babylon/controller/scene-manager.ts b/src/app/babylon/controller/scene-manager.ts index 5332672..a5c8b67 100644 --- a/src/app/babylon/controller/scene-manager.ts +++ b/src/app/babylon/controller/scene-manager.ts @@ -57,6 +57,7 @@ import { ModelInfo_mark_multiLine } from '../model/info/mark/other/mark-plan-mul import { MarkData_multiArrow_CT, MarkData_multiArrow_JG } from '../model/data/mark/other/mark-data-multi-arrow'; import { ModelInfo_mark_multiArrow } from '../model/info/mark/other/mark-plan-multi-arrow'; import { ModelInfo_mark_particle } from '../model/info/mark/other/mark-plan-particle-info'; +import { FacilityPosType, ModelData_facility } from '../model/data/model-data/model-data-facility'; //场景管理器 export class SceneManager { @@ -784,8 +785,21 @@ export class SceneManager { if (modelInfo == null) { return; } else { - TsTool.arrayRemove(SceneManager.s_allModelInfo, modelInfo); - modelInfo.dispose(); + + console.log(modelInfo.modelData instanceof ModelData_facility, (modelInfo.modelData as ModelData_facility).posType); + + if (modelInfo.modelData instanceof ModelData_facility && modelInfo.modelData.posType == FacilityPosType.In) { + console.log("1111"); + //来自建筑模型中的设备 + modelInfo.dispose(false); + } + else { + console.log("222"); + TsTool.arrayRemove(SceneManager.s_allModelInfo, modelInfo); + modelInfo.dispose(); + } + + } } diff --git a/src/app/babylon/controller/serve-manager.ts b/src/app/babylon/controller/serve-manager.ts index 020deca..92e0415 100644 --- a/src/app/babylon/controller/serve-manager.ts +++ b/src/app/babylon/controller/serve-manager.ts @@ -1,5 +1,6 @@ import { HttpErrorResponse } from "@angular/common/http"; import { classToPlain } from "class-transformer"; +import { PlanComponent } from "src/app/pages/plan/plan.component"; import { BuildingBasicInfosService } from "src/app/service/babylon/building-basic-infos.service"; import { ObjectsService } from "src/app/service/objects.service"; import { InsitutionDataSimple } from "../model/data/institution/institution-data-simple"; @@ -59,7 +60,7 @@ export class ServeManager { onSuccess(key, data.result); } if (key != "InsList") { - //ThreeDimensionalHomeComponent.instance.openSnackBar("保存单位成功"); + PlanComponent.instance.openSnackBar("保存单位成功"); // alert("保存单位成功"); } diff --git a/src/app/babylon/model/data/model-data/model-data-facility.ts b/src/app/babylon/model/data/model-data/model-data-facility.ts index 9106c37..18f62b6 100644 --- a/src/app/babylon/model/data/model-data/model-data-facility.ts +++ b/src/app/babylon/model/data/model-data/model-data-facility.ts @@ -102,6 +102,8 @@ export class ModelData_facility extends ModelData { + + } @@ -203,6 +205,12 @@ export enum FacilityType { * 消防沙 */ XF_XFS = "XF_XFS", + + /** + * 消防的阻挡物 + */ + ZD_XF = "ZD_XF", + /** * 加油机 */ @@ -221,10 +229,20 @@ export enum FacilityType { * 输油管线 */ JY_SYGX = "JY_SYGX", + + /** + * 输油管线阻挡物 + */ + ZD_SYGX = "ZD_SYGX", /** * 油气回收管线 */ JY_YQHSGX = "JY_YQHSGX", + + /** + * 油气回收管线 阻挡物 + */ + ZD_YQHSGX = "ZD_YQHSGX", /** * 逃生路线 */ diff --git a/src/app/babylon/model/info/model/model-info-building.ts b/src/app/babylon/model/info/model/model-info-building.ts index c54124b..2d47b2a 100644 --- a/src/app/babylon/model/info/model/model-info-building.ts +++ b/src/app/babylon/model/info/model/model-info-building.ts @@ -150,9 +150,9 @@ export class ModelInfo_building extends ModelInfo { - dispose() { + dispose(disposeMesh?: boolean) { this.disposeAllFacility(); - super.dispose(); + super.dispose(disposeMesh); } /** @@ -218,9 +218,9 @@ export class ModelInfo_building extends ModelInfo { InfoManager.removeFacilityInfoToTypeList(modelInfo_facility, this.facilityInfos); } Event_ModelInfoChange.dispatch(modelInfo_facility, ModelChangeType.Remove); - if ((modelInfo_facility.modelData as ModelData_facility).posType == FacilityPosType.Out) { - SceneManager.destroyModel(modelInfo_facility); - } + + SceneManager.destroyModel(modelInfo_facility); + } diff --git a/src/app/babylon/model/info/model/model-info-facility.ts b/src/app/babylon/model/info/model/model-info-facility.ts index 490d950..2057ec4 100644 --- a/src/app/babylon/model/info/model/model-info-facility.ts +++ b/src/app/babylon/model/info/model/model-info-facility.ts @@ -38,9 +38,13 @@ export class ModelInfo_facility extends ModelInfo { } onCreateFollowUI() { + let modelData = this.modelData as ModelData_facility; + if (!ConfigManager.getFacilityNeedIcon(modelData.facilityType)) { + return; + } super.onCreateFollowUI(); let instance = this; - let modelData = this.modelData as ModelData_facility; + let posType = ConfigManager.getPosType(modelData.facilityType); let iconPath = ConfigManager.getFacilityIconUrl(modelData.facilityType, posType); BabylonUIStyleTool.setStyle_size(this.uiFollowRoot, ConfigManager.c_size_facilityIconSize + "px", ConfigManager.c_size_facilityIconSize + "px"); @@ -152,12 +156,12 @@ export class ModelInfo_facility extends ModelInfo { } } - dispose() { + dispose(disposeMesh?: boolean) { if (this.areaInfo != null) { this.areaInfo.dispose(); } - super.dispose(); + super.dispose(disposeMesh); } } diff --git a/src/app/babylon/model/info/model/model-info.ts b/src/app/babylon/model/info/model/model-info.ts index 5f3ee40..e9f0235 100644 --- a/src/app/babylon/model/info/model/model-info.ts +++ b/src/app/babylon/model/info/model/model-info.ts @@ -201,18 +201,31 @@ export class ModelInfo { } } - dispose() { + /** + * 释放 + * @param disposeMesh 同时释放模型 + */ + dispose(disposeMesh: boolean = true) { this.isDisposed = true; - this.uiFollowRoot.dispose(); - // console.log("释放model" + this.key); - if (this.modelBox != null) { - this.modelBox.dispose(); - } else { - this.models[0].dispose(); + if (this.uiFollowRoot != null) { + this.uiFollowRoot.dispose(); + } + + console.log("释放model" + this.key, disposeMesh); + if (disposeMesh) { + if (this.modelBox != null) { + this.modelBox.dispose(); + } else { + this.models[0].dispose(); + } + } + else { + console.log("不释放mesh", this.modelBox.name); } } + //设置模型盒子时 onSetModelBox() { diff --git a/src/app/babylon/view/building-window/building-ui-item.ts b/src/app/babylon/view/building-window/building-ui-item.ts index a3b5c47..f38a4f1 100644 --- a/src/app/babylon/view/building-window/building-ui-item.ts +++ b/src/app/babylon/view/building-window/building-ui-item.ts @@ -208,7 +208,7 @@ export class BuildingUIItem { * @param mesh */ createFacilityByMesh(mesh: AbstractMesh) { - FacilityWindow.instance.createFacilityByMesh(mesh, this.buildingInfo); + FacilityWindow.instance.createFacilityByMesh(mesh); } @@ -217,7 +217,7 @@ export class BuildingUIItem { * @param mesh */ createOilingByMesh(mesh: AbstractMesh) { - FacilityWindow.instance.createOilingByMesh(mesh, this.buildingInfo); + FacilityWindow.instance.createOilingByMesh(mesh); } /** @@ -225,7 +225,7 @@ export class BuildingUIItem { * @param mesh */ createStopByMesh(mesh: AbstractMesh) { - FacilityWindow.instance.createStopByMesh(mesh, this.buildingInfo); + FacilityWindow.instance.createStopByMesh(mesh); } /** diff --git a/src/app/babylon/view/facility-window/facility-window.ts b/src/app/babylon/view/facility-window/facility-window.ts index ae5a50d..43fa2e2 100644 --- a/src/app/babylon/view/facility-window/facility-window.ts +++ b/src/app/babylon/view/facility-window/facility-window.ts @@ -554,7 +554,7 @@ export class FacilityWindow extends UIBase { * 从模型中创建消防设备信息 * @param mesh */ - createFacilityByMesh(mesh: AbstractMesh, buildingInfo: BuildingInfo) { + createFacilityByMesh(mesh: AbstractMesh) { if (TsTool.stringContain(mesh.name, FacilityType.XF_MHQ_GF_4)) { this.createNewFacilityByMesh(mesh, FacilityType.XF_MHQ_GF_4); @@ -563,43 +563,40 @@ export class FacilityWindow extends UIBase { this.createNewFacilityByMesh(mesh, FacilityType.XF_MHQ_GF_8); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_MHQ_GF_35)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_MHQ_GF_35); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_MHQ_PT_4)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_MHQ_PT_4); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_MHQ_PT_8)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_MHQ_PT_8); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_MHQ_PT_35)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_MHQ_PT_35); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_MHT)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_MHT); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_SSD)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_SSD); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_TSLX)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_TSLX); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_XFCM)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_XFCM); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_XFF)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_XFF); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_XFQ)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_XFQ); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_XFS)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_XFS); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_XFT)) { - - } - else if (TsTool.stringContain(mesh.name, FacilityType.ZD_YG)) { - + this.createNewFacilityByMesh(mesh, FacilityType.XF_XFT); } } @@ -607,16 +604,39 @@ export class FacilityWindow extends UIBase { * 从模型中创建加油站相关信息 * @param mesh */ - createOilingByMesh(mesh: AbstractMesh, buildingInfo: BuildingInfo) { + createOilingByMesh(mesh: AbstractMesh) { + if (TsTool.stringContain(mesh.name, FacilityType.JY_JYJ)) { + this.createNewFacilityByMesh(mesh, FacilityType.JY_JYJ); + } + else if (TsTool.stringContain(mesh.name, FacilityType.JY_SYGX)) { + this.createNewFacilityByMesh(mesh, FacilityType.JY_SYGX); + } + else if (TsTool.stringContain(mesh.name, FacilityType.JY_YG)) { + this.createNewFacilityByMesh(mesh, FacilityType.JY_YG); + } + else if (TsTool.stringContain(mesh.name, FacilityType.JY_YQHSGX)) { + this.createNewFacilityByMesh(mesh, FacilityType.JY_YQHSGX); + } } /** * 从模型创建阻挡物信息 * @param mesh */ - createStopByMesh(mesh: AbstractMesh, buildingInfo: BuildingInfo) { - + createStopByMesh(mesh: AbstractMesh) { + if (TsTool.stringContain(mesh.name, FacilityType.ZD_YG)) { + this.createNewFacilityByMesh(mesh, FacilityType.ZD_YG); + } + else if (TsTool.stringContain(mesh.name, FacilityType.ZD_SYGX)) { + this.createNewFacilityByMesh(mesh, FacilityType.ZD_SYGX); + } + else if (TsTool.stringContain(mesh.name, FacilityType.ZD_YQHSGX)) { + this.createNewFacilityByMesh(mesh, FacilityType.ZD_SYGX); + } + else if (TsTool.stringContain(mesh.name, FacilityType.ZD_XF)) { + this.createNewFacilityByMesh(mesh, FacilityType.ZD_XF); + } } diff --git a/src/app/pages/plan/plan.component.ts b/src/app/pages/plan/plan.component.ts index 13e1931..ab0d223 100644 --- a/src/app/pages/plan/plan.component.ts +++ b/src/app/pages/plan/plan.component.ts @@ -90,7 +90,7 @@ export class PlanComponent implements OnInit { } //开发模式 选择单位 弹窗 - modelInit(InsList) { } + modelInit(InsList) { } buildingUIItems: BuildingUIItem[] = []; //左侧 建筑list beforeOneBuildingID: string = null; //选中 左侧建筑ID @@ -99,7 +99,7 @@ export class PlanComponent implements OnInit { editBuildingPop: BuildingUIItem = null; //显隐 编辑左侧建筑弹窗 isShowLeftBuilding: boolean = true; //显隐 建筑list toggleLeftBuilding(e) { this.isShowLeftBuilding = e }; //显隐 建筑list - + uploadList: File[] = []; //多选上传文件 //选择文件 selectFile(e) { @@ -217,7 +217,7 @@ export class PlanComponent implements OnInit { clearDevice() { let isClear = confirm('您确定要清空吗?') if (isClear) { - ToolbarWindow.instance.clearHomeLessFacilityData() + ToolbarWindow.instance.clearAllFacilityDataFromMesh() } } diff --git a/src/assets/images/facility/in/FHJL.png b/src/assets/images/facility/in/XF_MHQ_GF_35.png similarity index 100% rename from src/assets/images/facility/in/FHJL.png rename to src/assets/images/facility/in/XF_MHQ_GF_35.png diff --git a/src/assets/images/facility/in/WSXFB.png b/src/assets/images/facility/in/XF_MHQ_GF_4.png similarity index 100% rename from src/assets/images/facility/in/WSXFB.png rename to src/assets/images/facility/in/XF_MHQ_GF_4.png diff --git a/src/assets/images/facility/in/FHFQ.png b/src/assets/images/facility/in/XF_MHQ_PT_35.png similarity index 100% rename from src/assets/images/facility/in/FHFQ.png rename to src/assets/images/facility/in/XF_MHQ_PT_35.png diff --git a/src/assets/images/facility/in/SX.png b/src/assets/images/facility/in/XF_MHQ_PT_4.png similarity index 100% rename from src/assets/images/facility/in/SX.png rename to src/assets/images/facility/in/XF_MHQ_PT_4.png diff --git a/src/assets/images/facility/in/FHM.png b/src/assets/images/facility/in/XF_MHT.png similarity index 100% rename from src/assets/images/facility/in/FHM.png rename to src/assets/images/facility/in/XF_MHT.png diff --git a/src/assets/images/facility/in/XFDT.png b/src/assets/images/facility/in/XF_TSLX.png similarity index 100% rename from src/assets/images/facility/in/XFDT.png rename to src/assets/images/facility/in/XF_TSLX.png diff --git a/src/assets/images/facility/in/PTDT.png b/src/assets/images/facility/in/XF_XFCM.png similarity index 100% rename from src/assets/images/facility/in/PTDT.png rename to src/assets/images/facility/in/XF_XFCM.png diff --git a/src/assets/images/facility/in/SNXHS.png b/src/assets/images/facility/in/XF_XFF.png similarity index 100% rename from src/assets/images/facility/in/SNXHS.png rename to src/assets/images/facility/in/XF_XFF.png diff --git a/src/assets/images/facility/in/HT.png b/src/assets/images/facility/in/XF_XFQ.png similarity index 100% rename from src/assets/images/facility/in/HT.png rename to src/assets/images/facility/in/XF_XFQ.png diff --git a/src/assets/images/facility/in/SSLT.png b/src/assets/images/facility/in/XF_XFS.png similarity index 100% rename from src/assets/images/facility/in/SSLT.png rename to src/assets/images/facility/in/XF_XFS.png diff --git a/src/assets/images/facility/in/LSXFB.png b/src/assets/images/facility/in/XF_XFT.png similarity index 100% rename from src/assets/images/facility/in/LSXFB.png rename to src/assets/images/facility/in/XF_XFT.png From 1f1dbe148ac0ce375b0be6b9c38c6af01e6aca89 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Fri, 5 Nov 2021 14:30:02 +0800 Subject: [PATCH 08/14] =?UTF-8?q?=E5=B1=95=E7=A4=BA=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../babylon/model/info/model/model-info.ts | 19 +- .../view/building-window/building-window.ts | 165 +++++++++++++++++- 2 files changed, 179 insertions(+), 5 deletions(-) diff --git a/src/app/babylon/model/info/model/model-info.ts b/src/app/babylon/model/info/model/model-info.ts index e9f0235..a2b6690 100644 --- a/src/app/babylon/model/info/model/model-info.ts +++ b/src/app/babylon/model/info/model/model-info.ts @@ -1,16 +1,15 @@ import { AbstractMesh, AnimationGroup, + Color3, EventState, - GizmoManager, Mesh, PointerDragBehavior, - TransformNode, - Node, Vector3, } from '@babylonjs/core'; import { Button, Rectangle, Vector2WithInfo } from '@babylonjs/gui'; import { classToClass } from 'class-transformer'; +import { SceneManager } from 'src/app/babylon/controller/scene-manager'; import { UIManager } from 'src/app/babylon/controller/ui-manager'; import { BabylonTool } from 'src/app/babylon/tool/babylon-tool'; import { GizmoTool } from 'src/app/babylon/tool/gizmo-tool'; @@ -137,6 +136,20 @@ export class ModelInfo { } } + /** + * 播放展示动画(高亮) + * @param play false表示停止,并恢复正常 + */ + playShowAnim(play: boolean) { + if (this.modelBox != null) { + if (play) { + SceneManager.Instance.addToHighLight(this.modelBox as Mesh, Color3.Green()); + } + else { + SceneManager.Instance.removeFromHighLight(this.modelBox as Mesh); + } + } + } /** * 克隆 diff --git a/src/app/babylon/view/building-window/building-window.ts b/src/app/babylon/view/building-window/building-window.ts index 26062b7..59a1d5a 100644 --- a/src/app/babylon/view/building-window/building-window.ts +++ b/src/app/babylon/view/building-window/building-window.ts @@ -6,8 +6,8 @@ import { SceneManager } from "../../controller/scene-manager"; import { ServeManager } from "../../controller/serve-manager"; import { BuildingStatus } from "../../controller/status/building-status"; import { StatusManager } from "../../controller/status/status-manager"; -import { BuildingData_Normal, BuildingData_Environment, BuildingData_ChemicalPlant, BuildingType, BuildingData } from "../../model/data/institution/building/building-data"; -import { BuildingPosType, ModelType } from "../../model/data/model-data/model-data"; +import { BuildingData, BuildingData_ChemicalPlant, BuildingData_Environment, BuildingData_Normal, BuildingType } from "../../model/data/institution/building/building-data"; +import { ModelType } from "../../model/data/model-data/model-data"; import { FacilityType } from "../../model/data/model-data/model-data-facility"; import { ModelEditData } from "../../model/data/model-data/model-edit-data"; import { BuildingInfo } from "../../model/info/building/building-info"; @@ -15,6 +15,7 @@ import { BuildingInfo_ChemicalPlant } from "../../model/info/building/building-i import { BuildingInfo_Environment } from "../../model/info/building/building-info-environment"; import { BuildingInfo_Normal } from "../../model/info/building/building-info-normal"; import { ModelInfo_building } from "../../model/info/model/model-info-building"; +import { FacilityInfoByType } from "../../model/info/model/model-info-facility"; import { TsTool } from "../../tool/ts-tool"; import { UIBase } from "../window-base/ui-base"; import { BuildingUIItem } from "./building-ui-item"; @@ -201,6 +202,29 @@ export class BuildingWindow extends UIBase { } + /** + * 加油站信息各个模块的显示、隐藏 + * @param type + * @param show true表示显示 + */ + showJYZInfoModel(type: JYZInfoMoudleType, show: boolean) { + if (this.currentJYZInfoMoudleType == type) { + if (show) { + return; //与上次显示的模块相同 + } + else { + this.showJYZModules(type, show); + } + } + else { + this.showJYZModules(this.currentJYZInfoMoudleType, false); //先恢复之前隐藏的内容 + this.showJYZModules(type, show);//展示本次要展示的内容 + } + + } + + + //#endregion @@ -571,4 +595,141 @@ export class BuildingWindow extends UIBase { //#endregion + + //#region 加油站基本信息模块的显隐表现 + + /** + * 当前查看的加油站信息模块类型 + */ + currentJYZInfoMoudleType: JYZInfoMoudleType = null; + + /** + * 当前模块需要显示的各类设备 + */ + facilitysByMoudle: Map = new Map(); + + /** + * 当前模块需要隐藏的设备 + */ + zdByMoudle: Map = new Map(); + + /** + * 展示加油站信息模块 + * @param type + * @param show + */ + showJYZModules(type: JYZInfoMoudleType, show: boolean) { + + if (this.currentBuidngItem == null) { + return; + } + this.initFacilityTypeByMoudleType(type, this.currentBuidngItem.buildingInfo); + + //设备: 显示UI + let facilityByType: FacilityInfoByType[] = []; + if (this.facilitysByMoudle.has(type)) { + facilityByType = this.facilitysByMoudle.get(type); + } + for (let i = 0; i < facilityByType.length; i++) { + let infos = facilityByType[i].facilityInfo; + if (infos != null) { + for (let j = 0; j < infos.length; j++) { + infos[j].playShowAnim(show); + } + } + } + + //阻挡类物体 + let zdByType: FacilityInfoByType[] = []; + if (this.zdByMoudle.has(type)) { + zdByType = this.zdByMoudle.get(type); + } + for (let i = 0; i < zdByType.length; i++) { + let infos = zdByType[i].facilityInfo; + if (infos != null) { + for (let j = 0; j < infos.length; j++) { + infos[j].setEnable(!show); + } + } + } + + } + + /** + * 根据功能模块,获取所需的设备类型 + * @param moudleType + */ + initFacilityTypeByMoudleType(moudleType: JYZInfoMoudleType, buildingInfo: BuildingInfo) { + + let moudleTypeKey = moudleType + "_"; //当前模块物体的特殊字段 + let zdKey = "ZD_" + moudleType; //阻挡类物体特殊字段 + + if (this.facilitysByMoudle.has(moudleType)) { + //已经初始化过了 + return; + } + else { + this.facilitysByMoudle.set(moudleType, []); + } + + let allFacilityByType = buildingInfo.ModelInfo.facilityInfos; + if (allFacilityByType == null) { + return; //没有设备 + } + + + + for (let i = 0; i < allFacilityByType.length; i++) { + let l_facilityByType = allFacilityByType[i]; + if (TsTool.stringContain(l_facilityByType.type, zdKey)) { + this.zdByMoudle.get(moudleType).push(l_facilityByType); + } + else if (TsTool.stringContain(l_facilityByType.type, moudleTypeKey)) { + this.facilitysByMoudle.get(moudleType).push(l_facilityByType); + } + } + + // for (var l_facility in FacilityType) { + + + + + // } + } + + + + //#endregion + + +} + +/** + * 加油站信息模块类型 + */ +export enum JYZInfoMoudleType { + /** + * 消防 + */ + XF = "XF", + /** + * 加油机 + */ + JYJ = "JYJ", + /** + * 油罐 + */ + YG = "YG", + /** + * 输油管 + */ + SYG = "SYG", + /** + * 油气回收管线 + */ + YQHSGX = "YQHSGX", + /** + * 逃生路线 + */ + TSLX = "TSLX", } \ No newline at end of file From 07826ed09a56144866bdced07d66999f151fce7d Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Fri, 5 Nov 2021 15:17:28 +0800 Subject: [PATCH 09/14] =?UTF-8?q?header=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/pages/plan/plan.component.html | 158 ++++++++++++++----------- src/app/pages/plan/plan.component.scss | 45 ++++++- src/app/pages/plan/plan.component.ts | 32 +++++ src/assets/images/awningHide.png | Bin 0 -> 2469 bytes src/assets/images/awningShow.png | Bin 0 -> 2355 bytes src/assets/images/heightFinding.png | Bin 0 -> 2175 bytes src/assets/images/measuredArea.png | Bin 0 -> 2842 bytes src/assets/images/rangeFinding.png | Bin 0 -> 2522 bytes 8 files changed, 159 insertions(+), 76 deletions(-) create mode 100644 src/assets/images/awningHide.png create mode 100644 src/assets/images/awningShow.png create mode 100644 src/assets/images/heightFinding.png create mode 100644 src/assets/images/measuredArea.png create mode 100644 src/assets/images/rangeFinding.png diff --git a/src/app/pages/plan/plan.component.html b/src/app/pages/plan/plan.component.html index a79ab12..f526646 100644 --- a/src/app/pages/plan/plan.component.html +++ b/src/app/pages/plan/plan.component.html @@ -1,85 +1,99 @@
- - -
-
-
-
-

- -
-
-
- - -
+
+ +
+ + + + +
- - -
-
-
-
- -

{{item.getIconName()}}

+
+ + + +
+
+
+
+

+ +
+
+
+ + +
-
-
- - - -
-
- - + + + +
+
+
+
+ +

{{item.getIconName()}}

+
+
+
-
- - - - - + + + +
+
+ + +
+
+ + + + + +
+
-
+ + + + +
+ + 名称 + + + + + + 请选择模型类型 + + + + + + + + + 上传文件 + + 上传文件 +

选择文件:

+
+
+
+
+
- - - - -
- - 名称 - - - - - - 请选择模型类型 - - - - - - - - - 上传文件 - - 上传文件 -

选择文件:

-
-
-
-
-
\ No newline at end of file diff --git a/src/app/pages/plan/plan.component.scss b/src/app/pages/plan/plan.component.scss index b3eca9e..11fe2a3 100644 --- a/src/app/pages/plan/plan.component.scss +++ b/src/app/pages/plan/plan.component.scss @@ -2,7 +2,10 @@ width: 100%; height: 100%; overflow: hidden; - position: relative; + padding: 0px 10px 10px 10px; + display: flex; + flex-direction: column; + .center { flex: 1; overflow: hidden; position: relative; border: 1px solid #2399FF; box-shadow: 0px 0px 16px #2399FF; } canvas{ width: 100%; height: 100%; border: none; outline: none; } } .loading{ //loading @@ -25,6 +28,40 @@ white-space: nowrap; } +//头部 功能栏 +.header{ + width: 100%; + height: 50px; + text-align: center; + overflow: hidden; + position: relative; + button { + box-sizing: border-box; + width: 120px; + height: 36px; + line-height: 36px; + color: #fff; + border: 1px solid #23D9FF; + outline: none; + background: linear-gradient(180deg, #000D21 0%, #002751 42%, #57A9FF 100%); + border-radius: 0px; + cursor: pointer; + margin: 7px 10px 0px; + padding: 0; + } + .selectFence { background: linear-gradient(180deg, #000D21 0%, #00404D 49%, #23D9FF 100%); } //选种样式 + .rightFence{ + position: absolute; + top: 0px; + right: 0px; + width: 200px; + height: 50px; + line-height: 50px; + img { cursor: pointer; box-sizing: border-box; width: 36px; height: 36px; margin-left: 10px; } + } + .selectRightTopFast { border: 1px solid #fff; } //选种样式 +} + //左侧建筑 .showLeftBuilding{ width: 30px; @@ -32,7 +69,7 @@ line-height: 30px; text-align: center; position: absolute; - left: 1px; + left: 0px; top: 50%; margin-top: -15px; color: #48A5FF; @@ -43,7 +80,7 @@ width: 230px; height: 70%; position: absolute; - left: 1px; + left: 0px; top: 0; bottom: 0; margin: auto;/*这行代码是关键*/ @@ -94,7 +131,7 @@ position: absolute; left: 0; right: 0; - bottom: 1px; + bottom: 0px; margin: auto;/*这行代码是关键*/ color: #fff; background: rgba(0,17,33,0.7); diff --git a/src/app/pages/plan/plan.component.ts b/src/app/pages/plan/plan.component.ts index ab0d223..e36af80 100644 --- a/src/app/pages/plan/plan.component.ts +++ b/src/app/pages/plan/plan.component.ts @@ -92,6 +92,38 @@ export class PlanComponent implements OnInit { //开发模式 选择单位 弹窗 modelInit(InsList) { } + allFence: string[] = ["基本信息", "加油机", "油罐设备", "消防设施", "安全疏散", "输油管线", "油气回收", "应急处置"]; //头部 功能栏 + selectFence: number = 0; //选中 头部功能栏 + isOpenAwning: boolean = true; //是否 打开罩棚 + selectMeasure: number = 0; //当前选择 测量工具 + + //切换 头部功能栏 + toggleHeaderFence(type: number) { + this.selectFence = type + } + + //切换 头部罩棚 + toggleHeaderAwning(isOpen: boolean) { + this.isOpenAwning = isOpen + } + + //切换 测量工具 + toggleMeasure(type: number) { + if (this.selectMeasure != type) { //切换工具 + this.selectMeasure = type + if (type === 1) { + ToolbarWindow.instance.measureDistance() + } else if (type === 2) { + ToolbarWindow.instance.measureHeight() + } else { + ToolbarWindow.instance.measureArea() + } + } else { //关闭测量工具 + this.selectMeasure = 0 + ToolbarWindow.instance.endMeasure() + } + } + buildingUIItems: BuildingUIItem[] = []; //左侧 建筑list beforeOneBuildingID: string = null; //选中 左侧建筑ID modelBuilding: modelBuilding = new modelBuilding(); //创建/编辑 建筑ngModel数据 diff --git a/src/assets/images/awningHide.png b/src/assets/images/awningHide.png new file mode 100644 index 0000000000000000000000000000000000000000..65eea6a60988eb5a2c5cdc26a2729eb16ac68477 GIT binary patch literal 2469 zcmV;W30n4vP)Px;Ur9tkR9Hv7nR#$i*A>RU`<`}Lk}b}~DsX3P)*BqWd!0x1bwD9gaKbV3LY z1R4w^#cTx{!I&WfOs6oVHESpxl7=M=5GaHKHnxc^+ZgYbZSB&N-g_O%c#&;M zW=ZeN(;w0~-}$|B-o5wSCxWLOiF^4(n!;p{xoQ*lhodd}s1 zAPkSW#0hY^WF9Gdno#6Po%GrKGR|pE<5`c|mU~WUe{fmMJIr7$_3&8geR2YY7PLYO zB2hrzca%#uaGaaaw2_i1GY#`e=99$iHelkerWKS-vC(*T2jeQfE@f(qo+J)L(Y+zj zzv9rmyG+PBt*c9yhHvkVKuAFSK7Jr)Z9HWwIIn3qo1p~9c1Jg`4K0Lv{2$D+K5x`P zrI}QgO7epV1_g}Is7nR!*;=*#12yL`JsVgDZ%P)9*wjN!;Q3F>md6|jBpwj3*Vc-) zY@H#k?${djb0zB_7BypYBdw0xS-vuUQ&(}i1oXnWAKqQraBi36mxOE4R==~%C3#`^ zsQGVt21N2S^)>415`atUc z6|My~=EJX>pwzt9e&YB6CT2DnYL6__aZXFy4H61sg&MR__*|>ay4`S@o7c^jK}l7J znw4QFT^fD1pBO1K_Iww=dU~s$=wKg8LcK*3ghKUFgRRp&mnqhCK_Sd9^ zhB@}sjM$a+Q%=p7hT(K{pnQm?FSgr@JI}flOs~AM%L0P;KAc} zTTUSVVLi5{j>XiG{Q~+PznqUvM=nDM7U2?t+vPSmnmSjYy?|oabh9LJ=t`21X+CDX zeR`_9svzj|B~e5`7o)@wof_K~PDGeg1gnEVde#{jDjV=>N&*ZOM#!ZiB=yu__P8O4 zifAiJO@jqr9Q+QqN*YjHWddVu3K~xsn~bnQ@8%HQpB;D2H;xYU7$1h5051(l!ija$ zppv&G+hk+#-j;L7FR22>dwd!k5kRg`AZy-myfakSs%x^j@axZy;itUfkg)`s1Sp42 zzf1IcT$QHF2Yax##-L7Ks2?)tB0gH>XJ@v%KnTIq4d38q?$7wmn1PryasW0RzJl^v z6YlMw2ZhwPV)({ALk%XaJ_0XnutCcspd2x$is<)xT#esniNLypI;78h72d1;`0l^u z*l^@3&VDf!EXQNgnxn`qt;74{he00|hIN0vileJ0E7s0^Z4*gSbeApXTl}x%m9>6`bER4KM1ozN}1Ie;ma|7UKrR;N*|RSohlzNSm1A z=T}~5!JvhQLIb{;$`E~)yV86!rw3;b-jJqGAByGEhWKajZY5@AoWuHA!|=(3W(e;y zIb+uaIGs-9J#4^^xg+tx=-z&Q+mGGCww#+m0loXOV(8Q=qWj8u*M9%s13jkBD|&kc zrA&lNo2MX7>%UwM{`3UAzpa`+7~=-THbdIoSa$G7oVrnlxo;<9`|OumrONBA7`5so z%yuStg~MYY??2`a(e1Y9I7+Wi^E5mPIkQsYBXDZPub`B*bv9QDYO&>HF77R zqF)SFOdE`NjSQ2vevd~c4;GC{z>(p*_rKnOW&@YlkK^+T|)q&)mVK5loNQ$6*=EaR1^co@VS6IlVKq>TUA?{b%efxIn%~)(9ODu|d!9uH|(+%^=d#0E` z35FRKkk;AM>ENF56*HHx&K(|Oc|<@+?@?4Fgo|+p?1)=^yJ;)X#5WOvG_7Qj;4kgt zcKPZ7#D={^wLH2?vADbUmoeQTx-C3ma*o#z?pnj zGVk-MjB4U3@%padI!%&}@$`E=b3w3^HP?p+I@~-pBcVVmBTYQ`#U%^;%Nnx8?G1br z$HScg>(+8kOUNatJHV7A%tB~U4G1;9{e`{HB%A z07W}#k%Z!TtTZejonEy)6JU$8KATSi;nTn)8XQM+JS!%?-G>MNco*`XQQ*BmKq%Vc z{U9LKAlU8QzPgj;7MpHou%l?t{d_Mmi^)7Nn(%xdo*G@$MZ%4QcDOP@W2Iz j!|6vKlZqz+Yq9+wjWobb^8ou`00000NkvXXu0mjfdvml0 literal 0 HcmV?d00001 diff --git a/src/assets/images/awningShow.png b/src/assets/images/awningShow.png new file mode 100644 index 0000000000000000000000000000000000000000..40771ced0fb800575a6446f3d64ca7600a50cba6 GIT binary patch literal 2355 zcmV-33C#A1P)Px-?MXyIR9Hv7n0Zu_R~p8jo0T;{KmpP@j5LTBM@7j+!U#$x<+c~zV0M&bv8hfWWUcj(w$>}`82Tol>zjaR=|k7a zyGzGqfrQZM4KyuItY9sP9Z61&0c{R7Z>8zz?`gPxP~26Tqb+{TA4wjt#yUWY=hxDJ@^mH>g#xwhFoPK~dvCV?l=c8=pqE_Vq30nu2?tcJ>tEj=F_6QprP<1!4pC3)z z0H$FF1m%%NcD-LH0c~Q1TRR20(Za0nIenunW(DEuu4Ql@T|N{w084gV#>;!j{U8mz zKNYfVJ$6?_=pF3-LJ7!=lSymOtf7PIU+0_`e})Htn}u_EV#F6oM`Z@5j$>iBHv{fp z-$T*0)BQc^OqhLqLL&H_!BPTR$F^^4&r99W@${DVKmzAQpWwmH8Tc-z4L{{qj|w2q z#tQrWwBWuw8%5WD804wz?Axh7Jvdshh8$7MpzYC)ipHM~TS=P-1Mqyp5Fau7y)5yH zm~@n8T^R((;97#~yP>RXgD#JBcO^vJR#128D?OEklBETE-;cnvFhSCXCipJ59ccx% zZ#9#CE@oKcp^N1|)aPM9Bz z+~{dYFYUsAiaXv4aG{e9eC^oq`1>O~yLnNqhrauAp_YwXG_j5qCbvCK36#`4QyakZ zT!8(nXT#6tt=N=7Y30BdaT%z2d`qnnbDT5uTo)!0+kbTC3v&}(qz#qBW;S>A2FJhv zFEpX7x)CkNPDs0&ZXRbrCeb+9cWDR`Ke9x~*%!#j zypPn~A=r5S2}liI7bWMt(abypxZUU-UHt;2eF}!2-uy9xwG7q z+MCx>GzRQGm-XEOYl!W)qWq4cbQfvMD~*HaeXt0LtIQB`t`?cuzu@ZjMTks%j^_`v zdH~(La5%&POTM`d?-{>WYH$7by2d%^hGx*6I6sfr9_dKxEYAs&Honj}c%Gjh5vqRGbbNcw)!FRq5%BI_Z1%YQ)l9EFb_-jrNP_tcS`N8v^0%#FuCKw=6PHsc5&1f z;@A8GqVh*-3w2*-pZW8UuyPDS&(|R{w-8r0`yeu@9Hn_V3Ynd&Ck`*S!P5O1@b;Lj z)MngNU;FyzVDsEtSz~xxi0x_0nskW^+w!idJnB>pdG1^`~rd}d5SRJBv%|-W{JSVKf`O9qf(oBCtDLXbZ-zX zJ5NE`dX}96kav>WD6T2qD{ZJ4)NZMA^q%F8_)sH+B{U)HF(1hr+_C9OH3ZKJdjKa) zM$FQ22s-)zUQ_Lr+RS?oGy-H8TZ`D{PFqUXlB3Fo)hqJIK|y_FmH_AU;?hVHaDGl_$WI zNe`*}uHIXKk z+!t3rF;q8H=LwEDvqT50uXdp5S&7O@k;?xKnZ!gcY8|!& zX)+3$mR>8NvtEJF7WLf_s$z$|VeJjFjibJ#5$u(VMN*2AX^;4(mCykiT|{ST(I^Vh zf^}rjRogoO_6GCfs0a`$0u;tVE~m>W8Jj3h9}3iOrw}0o=zf8K(CDq*Zv>afq=Xw1SJ%ZA(kWM#pmRurrv#Z Z{{tz!kxc_j8fX9j002ovPDHLkV1h*rhHL-; literal 0 HcmV?d00001 diff --git a/src/assets/images/heightFinding.png b/src/assets/images/heightFinding.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c0a0332cd82f65ccebdd3c73e63fa0318827df GIT binary patch literal 2175 zcmV-_2!QvAP)Px-IY~r8R9Hv7nR!%H*B!^d_r2L**g*tEV1`XpG$vwz~bYLC_$wK#waATTft%gnr)dAH{cf(+{* znD+dt7$OHAl9O(WrB-t-Z!+E! zd-#3Bi;!RX0V#hTSERp6${d=;8}+HwYVm5mbw=EB@1m3%^sqM8!qQl4GbeKO0qg1m zB6Ed2Vw%Z0>St!cvRX#wmZe!jvijrGVZh*Rx{n!W*NxiZEu888cTQY&Nq_u6GBgY_ z<*Nqox6{N{W7E2_RUV%^VxUhzTywwrAJs}~ z8n}D^ygY^c(3`osEQ!}P$%aw(rKy>r73u0W4Do|gg_Sf3dmC}Q;i0+xo*&Q0psKj z-+7suvQ?fTZARMxgR}G>8#LF_^%wWM_2f|+^fEqKpN6qR0G$!|^w2+WCqH}800l$t z(-!Haiiw|=r@Cwr{%;3V=2$IN`xdjHJ)d)u5ijBR_EgLW1fDbl?`B@Y?cy&66%ec# zehbuQ%`%as9WW@XIivYT!TOdT&O7zyO%gB`2R5z1>@dL01Iv$;6kn&M6 z2G>b*(>0694%-SUcD9t)eYHK%qO0iD5pi}$^z09C@O=foE#vTBlmrV8KStgcJ3&p& zg9a(`3V>J4%F@!6awQR}62dk8r{?$u7e_pdnI4PXE2d-3$;VK*^H3*_z{0;(;P`&^ zph6Crv$2J9a*iM&yXnf7lB=ILT|Xst1aS1!S=hbo4WyrXgv*78G5@{!P|pp(!Xs5U zaqv%|T#F-S`jl~vPSDGOC!~|0EPYi@2iz-o2~FmmEls25E@ zMqw4M6dbbC5pIIH@w1?w_8+0jYB0F%ptPKjf-QGL2>ba_FFrhwIASA%#%_l0UlOW~1`$eyRfy3-B#=he%$SK*N(5gI%U#b+;f3n<7Ci8JEf z91nG@J3cDZ;c96!C`0hz?(Hr*LW0ObUe%PYkc8L(mAmOjT;<(O7HxU2<(3U5A{^O? z!8mZ;fO|EqtKjM+#&~}*E@%v3Kzm#njxtz1#TnCsSzEz-@e%Ohf$QL#T00VLkH|a7 zDD{t6dw&Vp*FV{=X^>^c^# z2-0DrOGtLH#YWq1UWhbM&{B;SjiI*=ADiS(Vc#u z9o9A_MGjrf5NzT(qlHqdQ@=Z{gasJZ$Vy}krAXH-C0$x=0|IPQR_4%D5Sj{#q2PIz zr&g(Oo&gl}=`BQr?vky;L_ip}QTRhZsz9(qxV{`+=|1;hZ-$2Np#f4WVkt0#P#R7N zhA@QKeum&F)e?|uLU4})UvoV2A1xz~`vcY{`+rV2G)?GGv+e)@002ovPDHLkV1mn@ BAhZAg literal 0 HcmV?d00001 diff --git a/src/assets/images/measuredArea.png b/src/assets/images/measuredArea.png new file mode 100644 index 0000000000000000000000000000000000000000..7c38e7bf1a998d4322520cbedd8331086ee9e123 GIT binary patch literal 2842 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/rangeFinding.png b/src/assets/images/rangeFinding.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c79f614c03a0c65d7f3a2d8c2c0977949e6612 GIT binary patch literal 2522 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 literal 0 HcmV?d00001 From 473179f34a9060eed960faae2ceaee7a4c2ee33d Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Fri, 5 Nov 2021 15:55:01 +0800 Subject: [PATCH 10/14] =?UTF-8?q?header=E5=8A=9F=E8=83=BD=E6=A0=8F?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/pages/plan/plan.component.ts | 37 +++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/app/pages/plan/plan.component.ts b/src/app/pages/plan/plan.component.ts index e36af80..ee714f7 100644 --- a/src/app/pages/plan/plan.component.ts +++ b/src/app/pages/plan/plan.component.ts @@ -11,7 +11,7 @@ import { ToolbarWindow } from 'src/app/babylon/view/toolbar-window/toobar-window import { BuildingStatus } from 'src/app/babylon/controller/status/building-status'; import { BuildingUIItem } from 'src/app/babylon/view/building-window/building-ui-item'; import { BuildingType } from 'src/app/babylon/model/data/institution/building/building-data'; -import { BuildingWindow } from 'src/app/babylon/view/building-window/building-window'; +import { BuildingWindow, JYZInfoMoudleType } from 'src/app/babylon/view/building-window/building-window'; import { FacilityUIItem } from 'src/app/babylon/view/facility-window/facility-ui-item'; import { FacilityWindow } from 'src/app/babylon/view/facility-window/facility-window'; import { FacilityInfoUIItem } from 'src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item'; @@ -93,13 +93,44 @@ export class PlanComponent implements OnInit { modelInit(InsList) { } allFence: string[] = ["基本信息", "加油机", "油罐设备", "消防设施", "安全疏散", "输油管线", "油气回收", "应急处置"]; //头部 功能栏 - selectFence: number = 0; //选中 头部功能栏 + selectFence: number = -1; //选中 头部功能栏 + isShowChildComponent: boolean = false; //是否 显示左侧子组件 isOpenAwning: boolean = true; //是否 打开罩棚 selectMeasure: number = 0; //当前选择 测量工具 //切换 头部功能栏 toggleHeaderFence(type: number) { - this.selectFence = type + this.beforeOneSatus = StatusManager.getStatus(BuildingStatus); + let buildingWindow: BuildingWindow = this.beforeOneSatus.buildingWindow; + let fenceType: JYZInfoMoudleType = this.getFenceType(type) + if (this.selectFence != type) { + this.selectFence = type + this.isShowChildComponent = true + type>0 && type<7? buildingWindow.showJYZInfoModel(fenceType, true) : null + } else { //取消选中 + this.selectFence = -1 + this.isShowChildComponent = false + type>0 && type<7? buildingWindow.showJYZInfoModel(fenceType, false) : null + } + } + + //获取 头部功能栏Type + getFenceType(type: number): JYZInfoMoudleType { + let fenceType + if (type === 1) { + fenceType = JYZInfoMoudleType.JYJ + } else if (type === 2) { + fenceType = JYZInfoMoudleType.YG + } else if (type === 3) { + fenceType = JYZInfoMoudleType.XF + } else if (type === 4) { + fenceType = JYZInfoMoudleType.TSLX + } else if (type === 5) { + fenceType = JYZInfoMoudleType.SYG + } else if (type === 6) { + fenceType = JYZInfoMoudleType.YQHSGX + } + return fenceType } //切换 头部罩棚 From ea50fa9068ef72cddc9e5a695c24c2820220a627 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Fri, 5 Nov 2021 16:26:41 +0800 Subject: [PATCH 11/14] =?UTF-8?q?=E5=88=86=E7=B1=BB=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E5=90=84=E4=B8=AA=E6=A8=A1=E5=9D=97=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/model-data/model-data-facility.ts | 7 ++- .../view/building-window/building-window.ts | 33 ++++++++++++- .../view/facility-window/facility-window.ts | 48 ++++++++++++++++++- .../view/toolbar-window/toobar-window.ts | 8 ++++ 4 files changed, 91 insertions(+), 5 deletions(-) diff --git a/src/app/babylon/model/data/model-data/model-data-facility.ts b/src/app/babylon/model/data/model-data/model-data-facility.ts index 18f62b6..d01fbfe 100644 --- a/src/app/babylon/model/data/model-data/model-data-facility.ts +++ b/src/app/babylon/model/data/model-data/model-data-facility.ts @@ -250,7 +250,12 @@ export enum FacilityType { /** * 疏散点 */ - XF_SSD = "XF_SSD" + XF_SSD = "XF_SSD", + + /** + * 罩棚 + */ + ZD_ZP = "ZD_ZP", } diff --git a/src/app/babylon/view/building-window/building-window.ts b/src/app/babylon/view/building-window/building-window.ts index 59a1d5a..91e0d2a 100644 --- a/src/app/babylon/view/building-window/building-window.ts +++ b/src/app/babylon/view/building-window/building-window.ts @@ -221,6 +221,8 @@ export class BuildingWindow extends UIBase { this.showJYZModules(type, show);//展示本次要展示的内容 } + + } @@ -566,7 +568,7 @@ export class BuildingWindow extends UIBase { */ public getModelAndCreateFacilityData() { - this.clearHomeLessFacilityData(); + //this.clearHomeLessFacilityData(); if (this.currentBuidngItem != null) { //获取所有transformNodes @@ -593,6 +595,8 @@ export class BuildingWindow extends UIBase { } + + //#endregion @@ -619,7 +623,7 @@ export class BuildingWindow extends UIBase { * @param show */ showJYZModules(type: JYZInfoMoudleType, show: boolean) { - + console.log("切换页签", type, show); if (this.currentBuidngItem == null) { return; } @@ -652,6 +656,9 @@ export class BuildingWindow extends UIBase { } } } + if (!show) { + this.currentJYZInfoMoudleType = null; + } } @@ -697,6 +704,23 @@ export class BuildingWindow extends UIBase { // } } + /** + * 显示罩棚 + * @param show false 表示隐藏罩棚 + */ + showZP(show: boolean) { + this.initFacilityTypeByMoudleType(JYZInfoMoudleType.ZP, this.currentBuidngItem.buildingInfo); + let zpInfoByTypes = this.facilitysByMoudle.get(JYZInfoMoudleType.ZP); + if (zpInfoByTypes != null) { + for (let i = 0; i < zpInfoByTypes.length; i++) { + let infos = zpInfoByTypes[i].facilityInfo; + for (let j = 0; j < infos.length; j++) { + infos[j].setEnable(show); + } + } + } + } + //#endregion @@ -732,4 +756,9 @@ export enum JYZInfoMoudleType { * 逃生路线 */ TSLX = "TSLX", + + /** + * 罩棚 + */ + ZP = "ZP", } \ No newline at end of file diff --git a/src/app/babylon/view/facility-window/facility-window.ts b/src/app/babylon/view/facility-window/facility-window.ts index 43fa2e2..feb8e24 100644 --- a/src/app/babylon/view/facility-window/facility-window.ts +++ b/src/app/babylon/view/facility-window/facility-window.ts @@ -316,8 +316,14 @@ export class FacilityWindow extends UIBase { createNewFacilityByMesh(mesh: AbstractMesh, type: FacilityType) { let facilityData = this.createFacilityDataFromMesh(mesh, type); //let facilityInfo = this.createFacilityInfoFromMesh(facilityData, mesh, buildingInfo); - console.log("获取到干粉灭火器", mesh); - this.createNewFacility(facilityData, mesh); + console.log("获取到设备" + type, mesh); + + if (!this.isRepeatFacilityFromMesh(type, mesh.id)) //不重复 + { + this.createNewFacility(facilityData, mesh); + } + + } @@ -637,6 +643,9 @@ export class FacilityWindow extends UIBase { else if (TsTool.stringContain(mesh.name, FacilityType.ZD_XF)) { this.createNewFacilityByMesh(mesh, FacilityType.ZD_XF); } + else if (TsTool.stringContain(mesh.name, FacilityType.ZD_ZP)) { + this.createNewFacilityByMesh(mesh, FacilityType.ZD_ZP); + } } @@ -664,6 +673,41 @@ export class FacilityWindow extends UIBase { return facilityInfo; } + /** + * 来自建筑中的设备 是否重复 + */ + isRepeatFacilityFromMesh(type: FacilityType, id: string) { + let currentBuidngItem = StatusManager.getStatus(BuildingStatus) + .buildingWindow.currentBuidngItem; + if (currentBuidngItem == null) { + alert("请先选中目标建筑"); + // ThreeDimensionalHomeComponent.instance.openSnackBar("请先选中目标建筑"); + return true; + } + let result = false; + + let facilityInfoByTypes = currentBuidngItem.buildingInfo.ModelInfo.facilityInfos; + if (facilityInfoByTypes != null) { + for (let i = 0; i < facilityInfoByTypes.length; i++) { + if (facilityInfoByTypes[i].type == type) { + let infos = facilityInfoByTypes[i].facilityInfo; + for (let j = 0; j < infos.length; j++) { + if (infos[j].modelData.resName == id) { + result = true; + console.log("重复的设备,不添加"); + break; + } + } + } + } + } + + + return result; + + + } + //#endregion } diff --git a/src/app/babylon/view/toolbar-window/toobar-window.ts b/src/app/babylon/view/toolbar-window/toobar-window.ts index 0f25a4b..19987bb 100644 --- a/src/app/babylon/view/toolbar-window/toobar-window.ts +++ b/src/app/babylon/view/toolbar-window/toobar-window.ts @@ -110,6 +110,14 @@ export class ToolbarWindow extends UIBase { BuildingWindow.instance.getModelAndCreateFacilityData(); } + /** + * 展示罩棚 + * @param show false表示隐藏罩棚 + */ + showZP(show: boolean) { + BuildingWindow.instance.showZP(show); + } + onInit() { super.onInit(); From d3dfe25e8f6fa19042fe95ed2ed636759d7f7934 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Mon, 8 Nov 2021 10:05:36 +0800 Subject: [PATCH 12/14] =?UTF-8?q?=E9=AB=98=E4=BA=AE=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/info-manager.ts | 6 ++++-- src/app/babylon/controller/scene-manager.ts | 20 +++++++++++++------ .../babylon/model/info/model/model-info.ts | 5 ++++- .../view/building-window/building-window.ts | 18 +++++++++++++---- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/app/babylon/controller/info-manager.ts b/src/app/babylon/controller/info-manager.ts index ed14f76..7a8fc35 100644 --- a/src/app/babylon/controller/info-manager.ts +++ b/src/app/babylon/controller/info-manager.ts @@ -2,7 +2,7 @@ import { AbstractMesh } from "@babylonjs/core"; import { MarkData } from "../model/data/mark/mark-data"; import { ModelData } from "../model/data/model-data/model-data"; -import { FacilityInBuildingType, FacilityPosType, FacilityType, ModelData_facility } from "../model/data/model-data/model-data-facility"; +import { FacilityPosType, FacilityType, ModelData_facility } from "../model/data/model-data/model-data-facility"; import { ModelEditData } from "../model/data/model-data/model-edit-data"; import { TransformData } from "../model/data/transform-data"; import { BuildingInfo } from "../model/info/building/building-info"; @@ -164,6 +164,7 @@ export class InfoManager { modelEditData: ModelEditData, buildingInfo: BuildingInfo = null ) { + console.trace("创建设备", buildingInfo); let facilities = modelEditData.facilities; @@ -171,10 +172,11 @@ export class InfoManager { for (let j = 0; j < facilities[i].facilities.length; j++) { - let mesh = null; + let mesh: AbstractMesh = null; let facilityData = facilities[i].facilities[j] if (facilityData.posType == FacilityPosType.In) { mesh = SceneManager.Instance.scene.getMeshByID(facilityData.resName); + console.log("找到内置设备", mesh.uniqueId); } diff --git a/src/app/babylon/controller/scene-manager.ts b/src/app/babylon/controller/scene-manager.ts index a5c8b67..5e14706 100644 --- a/src/app/babylon/controller/scene-manager.ts +++ b/src/app/babylon/controller/scene-manager.ts @@ -259,16 +259,22 @@ export class SceneManager { let allMesh = mesh.getChildMeshes(); this.highLightLayer.addMesh(mesh, color); + allMesh.push(mesh); for (let i = 0; i < allMesh.length; i++) { let childMesh = allMesh[i]; if (childMesh instanceof Mesh) { this.highLightLayer.addMesh(childMesh, color); + this.highLightNum++; } } + + } + highLightNum = 0; + /** * 移除出高亮层 * @param mesh @@ -278,21 +284,23 @@ export class SceneManager { return; } let allMesh = mesh.getChildMeshes(); + allMesh.push(mesh); for (let i = 0; i < allMesh.length; i++) { let childMesh = allMesh[i]; if (childMesh instanceof Mesh) { this.highLightLayer.removeMesh(childMesh); + this.highLightNum--; } } } - /** - * 清空高亮层 - */ - clearHighLight() { - this.highLightLayer.removeAllMeshes(); - } + // /** + // * 清空高亮层 + // */ + // clearHighLight() { + // this.highLightLayer.removeAllMeshes(); + // } //#endregion diff --git a/src/app/babylon/model/info/model/model-info.ts b/src/app/babylon/model/info/model/model-info.ts index a2b6690..066d77a 100644 --- a/src/app/babylon/model/info/model/model-info.ts +++ b/src/app/babylon/model/info/model/model-info.ts @@ -12,6 +12,7 @@ import { classToClass } from 'class-transformer'; import { SceneManager } from 'src/app/babylon/controller/scene-manager'; import { UIManager } from 'src/app/babylon/controller/ui-manager'; import { BabylonTool } from 'src/app/babylon/tool/babylon-tool'; +import { BabylonUIStyleTool } from 'src/app/babylon/tool/babylon-ui-style-tool'; import { GizmoTool } from 'src/app/babylon/tool/gizmo-tool'; @@ -143,10 +144,12 @@ export class ModelInfo { playShowAnim(play: boolean) { if (this.modelBox != null) { if (play) { - SceneManager.Instance.addToHighLight(this.modelBox as Mesh, Color3.Green()); + SceneManager.Instance.addToHighLight(this.modelBox as Mesh, Color3.Red()); + } else { SceneManager.Instance.removeFromHighLight(this.modelBox as Mesh); + } } } diff --git a/src/app/babylon/view/building-window/building-window.ts b/src/app/babylon/view/building-window/building-window.ts index 91e0d2a..298de6a 100644 --- a/src/app/babylon/view/building-window/building-window.ts +++ b/src/app/babylon/view/building-window/building-window.ts @@ -62,8 +62,8 @@ export class BuildingWindow extends UIBase { let uiItem = this.addBuildingItem(buildingInfo); if (buildingData.outdoorData != null && buildingData.outdoorData.modelData != null && buildingData.outdoorData.modelData.resName != null) { - this.updateBuildingModel(buildingInfo, false, () => { - buildingInfo.initFacility(); + this.updateBuildingModel(buildingInfo, true, () => { + // buildingInfo.initFacility(); BuildingStatus.enterSuccessObservable.notifyObservers(uiItem); if (onSuccess) { onSuccess(uiItem, index); @@ -208,6 +208,7 @@ export class BuildingWindow extends UIBase { * @param show true表示显示 */ showJYZInfoModel(type: JYZInfoMoudleType, show: boolean) { + console.log("showJYZInfoModel", type, show); if (this.currentJYZInfoMoudleType == type) { if (show) { return; //与上次显示的模块相同 @@ -217,7 +218,9 @@ export class BuildingWindow extends UIBase { } } else { - this.showJYZModules(this.currentJYZInfoMoudleType, false); //先恢复之前隐藏的内容 + if (this.currentJYZInfoMoudleType != null) { + this.showJYZModules(this.currentJYZInfoMoudleType, false); //先恢复之前隐藏的内容 + } this.showJYZModules(type, show);//展示本次要展示的内容 } @@ -365,6 +368,7 @@ export class BuildingWindow extends UIBase { buildingInfo.ModelInfo = modelInfo as ModelInfo_building; buildingInfo.ModelInfo.updateName(buildingInfo.buildingData.normalData.name); if (updateFacility) { + InfoManager.createFacilityInfos(buildingInfo.buildingData.outdoorData, buildingInfo); } if (buildingInfo instanceof BuildingInfo_Environment) { @@ -656,8 +660,14 @@ export class BuildingWindow extends UIBase { } } } - if (!show) { + if (show) { + this.currentJYZInfoMoudleType = type; + } + else { + console.log("隐藏", this.currentJYZInfoMoudleType); this.currentJYZInfoMoudleType = null; + // SceneManager.Instance.highLightLayer.removeAllMeshes(); + } } From 26efdd150211c431a09cb7dcac3e4fcf948ada0f Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Mon, 8 Nov 2021 11:03:04 +0800 Subject: [PATCH 13/14] =?UTF-8?q?=E5=B7=A6=E4=BE=A7=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../left-domain/left-domain.component.html | 1 + .../left-domain/left-domain.component.scss | 0 .../left-domain/left-domain.component.ts | 15 +++++ src/app/pages/pages.module.ts | 3 +- src/app/pages/plan/plan.component.html | 11 ++++ src/app/pages/plan/plan.component.scss | 56 ++++++++++++++++++- src/styles.scss | 4 +- 7 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 src/app/pages/left-domain/left-domain.component.html create mode 100644 src/app/pages/left-domain/left-domain.component.scss create mode 100644 src/app/pages/left-domain/left-domain.component.ts diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html new file mode 100644 index 0000000..3c1d0af --- /dev/null +++ b/src/app/pages/left-domain/left-domain.component.html @@ -0,0 +1 @@ +

left-domain works!

diff --git a/src/app/pages/left-domain/left-domain.component.scss b/src/app/pages/left-domain/left-domain.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts new file mode 100644 index 0000000..b814f02 --- /dev/null +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-left-domain', + templateUrl: './left-domain.component.html', + styleUrls: ['./left-domain.component.scss'] +}) +export class LeftDomainComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/pages/pages.module.ts b/src/app/pages/pages.module.ts index ddab50b..2401970 100644 --- a/src/app/pages/pages.module.ts +++ b/src/app/pages/pages.module.ts @@ -31,8 +31,9 @@ import { NzMessageModule } from 'ng-zorro-antd/message'; import { NzSpinModule } from 'ng-zorro-antd/spin'; import { TodayWarningAdminComponent } from './today-warning-admin/today-warning-admin.component'; import { CriminalRecordsAdminComponent } from './criminal-records-admin/criminal-records-admin.component'; +import { LeftDomainComponent } from './left-domain/left-domain.component'; @NgModule({ - declarations: [LoginComponent, RegisterComponent, HomeComponent, PlanComponent, TodayWarningComponent, CriminalRecordsComponent, TodayWarningAdminComponent, CriminalRecordsAdminComponent,], + declarations: [LoginComponent, RegisterComponent, HomeComponent, PlanComponent, TodayWarningComponent, CriminalRecordsComponent, TodayWarningAdminComponent, CriminalRecordsAdminComponent, LeftDomainComponent,], imports: [ PagesRoutingModule, CommonModule, diff --git a/src/app/pages/plan/plan.component.html b/src/app/pages/plan/plan.component.html index f526646..4fd0425 100644 --- a/src/app/pages/plan/plan.component.html +++ b/src/app/pages/plan/plan.component.html @@ -15,6 +15,17 @@
+ +
+
+
+

{{allFence[selectFence]}}

+
+
+
+
+ +
diff --git a/src/app/pages/plan/plan.component.scss b/src/app/pages/plan/plan.component.scss index 11fe2a3..0364b27 100644 --- a/src/app/pages/plan/plan.component.scss +++ b/src/app/pages/plan/plan.component.scss @@ -62,6 +62,60 @@ .selectRightTopFast { border: 1px solid #fff; } //选种样式 } +//左侧子组件 +.leftChildComponent{ + width: 300px; + height: 90%; + position: absolute; + left: 3%; + top: 0; + bottom: 0; + margin: auto;/*这行代码是关键*/ + z-index: 10; + box-sizing: border-box; + padding: 5px; + color: #fff; + background: linear-gradient(360deg, #000D21 0%, rgba(0, 59, 110, 0.8) 100%); + display: flex; + flex-direction: column; + .leftChildHeader{ + display: flex; + width: 95%; + height: 30px; + line-height: 30px; + margin: 10px auto; + background: linear-gradient(270deg, rgba(35, 153, 255, 0) 0%, rgba(35, 153, 255, 0.8) 50%, rgba(35, 153, 255, 0) 100%); + div:first-child{ + width: 30px; + height: 30px; + border: 1px solid #2399FF; + box-shadow: 0px 2px 8px #2399FF; + border-radius: 50%; + text-align: center; + } + div:nth-child(2){ + box-sizing: border-box; + margin: 0 10px; + font-weight: 900; + font-size: 16px; + letter-spacing: 3px; + font-style: italic; + flex: 1; + } + div:last-child{ + width: 30px; + height: 30px; + text-align: center; + cursor: pointer; + .anticon{ color: #91CCFF; } //字体图标 + } + } + .leftChildCenter{ + flex: 1; + overflow: hidden; + } +} + //左侧建筑 .showLeftBuilding{ width: 30px; @@ -90,7 +144,7 @@ transition: margin-left 0.5s; display: flex; flex-direction: column; - .hideLeft { text-align: right; color: #fff; padding: 3px 5px; z-index: 10; } + .hideLeft { text-align: right; color: #fff; padding: 3px 5px; z-index: 1; } .leftHeader { overflow: hidden; text-align: center; diff --git a/src/styles.scss b/src/styles.scss index 92c1a83..e52ce64 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -107,10 +107,10 @@ h1 { width: 10px; } ::-webkit-scrollbar-thumb { - background-image: linear-gradient(#2495f8, #1c73c2,#0a3d6a, #061d3c); + background-image: inear-gradient(180deg, #2399FF 0%, rgba(0, 13, 33, 0.4) 100%); } ::-webkit-scrollbar-track { - background-color: #061d3c; + background-color: rgba(0, 13, 33, 0.41); } From ef1c86f596bf70ff6a79143dac9ad2a85671bbf5 Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Mon, 8 Nov 2021 14:54:05 +0800 Subject: [PATCH 14/14] =?UTF-8?q?=E5=B7=A6=E4=BE=A7=E5=AD=90=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../left-domain/left-domain.component.html | 13 ++++++- .../left-domain/left-domain.component.scss | 34 +++++++++++++++++++ .../left-domain/left-domain.component.ts | 25 ++++++++++++++ src/app/pages/plan/plan.component.html | 4 +-- src/app/pages/plan/plan.component.scss | 5 ++- src/app/pages/plan/plan.component.ts | 6 +++- 6 files changed, 80 insertions(+), 7 deletions(-) diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html index 3c1d0af..037c440 100644 --- a/src/app/pages/left-domain/left-domain.component.html +++ b/src/app/pages/left-domain/left-domain.component.html @@ -1 +1,12 @@ -

left-domain works!

+
+ +
+ +
+ +
+ + +
+ +
diff --git a/src/app/pages/left-domain/left-domain.component.scss b/src/app/pages/left-domain/left-domain.component.scss index e69de29..6f18b6c 100644 --- a/src/app/pages/left-domain/left-domain.component.scss +++ b/src/app/pages/left-domain/left-domain.component.scss @@ -0,0 +1,34 @@ +.childContent{ + width: 100%; + height: 100%; + overflow: hidden; + display: flex; + flex-direction: column; + font-family: Source Han Sans CN; + color: #fff; + .childCenter{ + flex: 1; + overflow-x: hidden; + overflow-y: auto; + } + .childBottom{ + width: 100%; + height: 50px; + line-height: 50px; + text-align: center; + background: linear-gradient(360deg, #000D21 0%, #003B6E 100%); + box-shadow: 0px -2px 6px #36A2FF; + button{ + width: 35%; + height: 32px; + line-height: 32px; + padding: 0; + margin: 0 10px; + color: #91CCFF; + background: rgba(0, 129, 255, 0.61); + border: 1px solid #36A2FF; + cursor: pointer; + .anticon{ margin-right: 3px; } //字体图标 + } + } +} \ No newline at end of file diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts index b814f02..a2e06bc 100644 --- a/src/app/pages/left-domain/left-domain.component.ts +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { PlanComponent } from '../plan/plan.component'; @Component({ selector: 'app-left-domain', @@ -10,6 +11,30 @@ export class LeftDomainComponent implements OnInit { constructor() { } ngOnInit(): void { + this.initComponent() } + beforeFence: number; //当前选中功能栏 + + //初始化组件 + initComponent(type?: number) { + if (type != undefined && type != null) { + this.beforeFence = type + } else { + this.beforeFence = PlanComponent.instance.selectFence + } + } + + //编辑信息 + editInfo() { + + } + + //导出Excel + deriveExcel() { + + } + + + } diff --git a/src/app/pages/plan/plan.component.html b/src/app/pages/plan/plan.component.html index 4fd0425..d626cd2 100644 --- a/src/app/pages/plan/plan.component.html +++ b/src/app/pages/plan/plan.component.html @@ -16,13 +16,13 @@ -
+

{{allFence[selectFence]}}

-
+
diff --git a/src/app/pages/plan/plan.component.scss b/src/app/pages/plan/plan.component.scss index 0364b27..c98eb3c 100644 --- a/src/app/pages/plan/plan.component.scss +++ b/src/app/pages/plan/plan.component.scss @@ -72,9 +72,8 @@ bottom: 0; margin: auto;/*这行代码是关键*/ z-index: 10; - box-sizing: border-box; - padding: 5px; color: #fff; + transition: left 0.5s; background: linear-gradient(360deg, #000D21 0%, rgba(0, 59, 110, 0.8) 100%); display: flex; flex-direction: column; @@ -83,7 +82,7 @@ width: 95%; height: 30px; line-height: 30px; - margin: 10px auto; + margin: 15px auto; background: linear-gradient(270deg, rgba(35, 153, 255, 0) 0%, rgba(35, 153, 255, 0.8) 50%, rgba(35, 153, 255, 0) 100%); div:first-child{ width: 30px; diff --git a/src/app/pages/plan/plan.component.ts b/src/app/pages/plan/plan.component.ts index ee714f7..4c1043f 100644 --- a/src/app/pages/plan/plan.component.ts +++ b/src/app/pages/plan/plan.component.ts @@ -1,4 +1,4 @@ -import { Component, ElementRef, OnInit } from '@angular/core'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { Game } from 'src/app/babylon/game'; import { LoginSatus } from 'src/app/babylon/controller/status/login-status'; import { StatusManager } from 'src/app/babylon/controller/status/status-manager'; @@ -17,6 +17,7 @@ import { FacilityWindow } from 'src/app/babylon/view/facility-window/facility-wi import { FacilityInfoUIItem } from 'src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item'; import { EventManager } from '@angular/platform-browser'; import { NzMessageService } from 'ng-zorro-antd/message'; +import { LeftDomainComponent } from '../left-domain/left-domain.component'; @@ -95,6 +96,7 @@ export class PlanComponent implements OnInit { allFence: string[] = ["基本信息", "加油机", "油罐设备", "消防设施", "安全疏散", "输油管线", "油气回收", "应急处置"]; //头部 功能栏 selectFence: number = -1; //选中 头部功能栏 isShowChildComponent: boolean = false; //是否 显示左侧子组件 + @ViewChild('leftDomain')leftDomain: LeftDomainComponent; //子组件引用 isOpenAwning: boolean = true; //是否 打开罩棚 selectMeasure: number = 0; //当前选择 测量工具 @@ -104,6 +106,7 @@ export class PlanComponent implements OnInit { let buildingWindow: BuildingWindow = this.beforeOneSatus.buildingWindow; let fenceType: JYZInfoMoudleType = this.getFenceType(type) if (this.selectFence != type) { + this.isShowChildComponent && this.leftDomain? this.leftDomain.initComponent(type) : null; //手动初始化子组件 this.selectFence = type this.isShowChildComponent = true type>0 && type<7? buildingWindow.showJYZInfoModel(fenceType, true) : null @@ -136,6 +139,7 @@ export class PlanComponent implements OnInit { //切换 头部罩棚 toggleHeaderAwning(isOpen: boolean) { this.isOpenAwning = isOpen + ToolbarWindow.instance.showZP(isOpen) } //切换 测量工具