cimAnalyzer.js 20 KB

12345
  1. /*
  2. All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. See https://js.arcgis.com/4.25/esri/copyright.txt for details.
  4. */
  5. import e from"../../Color.js";import{getFontFamily as t}from"../../core/fontUtils.js";import{clone as i}from"../../core/lang.js";import o from"../../core/Logger.js";import{isNone as r,isSome as n}from"../../core/maybe.js";import{pt2px as l,px2pt as a}from"../../core/screenUtils.js";import{numericHash as s}from"../../core/string.js";import{createRendererExpression as f,ArcadeExpression as c}from"../../support/arcadeOnDemand.js";import{CIMSymbolHelper as m,OverrideHelper as p}from"./CIMSymbolHelper.js";import{Alignment as u,CapType as y,JoinType as h}from"./enums.js";import{quantizeIfNeeded as g}from"./quantizeTime.js";import{getExtent as d,getSDFMetrics as S}from"./SDFHelper.js";import{fromCIMColor as v,getValue as N,fromCIMFontDecoration as b,fromCIMFontStyle as O,getFillColor as k,getStrokeColor as C,getStrokeWidth as P,adjustTextCase as M,createLabelOverrideFunction as L,evaluateValueOrFunction as w,fromCIMHorizontalAlignment as I,fromCIMVerticalAlignment as X}from"./utils.js";import{CIMEffectHelper as z}from"./effects/CIMEffectHelper.js";import A from"../../views/2d/arcade/callExpressionWithFeature.js";import{RANDOM_INSIDE_POLYGON_TEXTURE_SIZE as R}from"../../views/2d/engine/webgl/definitions.js";import{getMaterialGroup as x}from"../../views/2d/engine/webgl/grouping.js";const J=o.getLogger("esri.symbols.cim.cimAnalyzer");function H(e){switch(e){case"Butt":return y.BUTT;case"Square":return y.SQUARE;default:return y.ROUND}}function Y(e){switch(e){case"Bevel":return h.BEVEL;case"Miter":return h.MITER;default:return h.ROUND}}function $(e,t,i,o){let r;e[t]?r=e[t]:(r={},e[t]=r),r[i]=o}function E(e){const t=e.markerPlacement;return t&&t.angleToLine?u.MAP:u.SCREEN}async function T(e,t,i,o,n){const l=o??[];if(!e)return l;let a,s;const c={};if("CIMSymbolReference"!==e.type)return J.error("Expect cim type to be 'CIMSymbolReference'"),l;if(a=e.symbol,s=e.primitiveOverrides,s){const e=[];for(const i of s){const o=i.valueExpressionInfo;if(o&&t){const n=o.expression,l=f(n,t.spatialReference,t.fields).then((e=>{r(e)||$(c,i.primitiveName,i.propertyName,e)}));e.push(l)}else null!=i.value&&$(c,i.primitiveName,i.propertyName,i.value)}e.length>0&&await Promise.all(e)}const p=[];switch(m.fetchResources(a,i,p),p.length>0&&await Promise.all(p),a.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":j(a,s,c,t,l,i,n)}return l}function j(e,t,i,o,r,n,l){if(!e)return;const a=e.symbolLayers;if(!a)return;const s=e.effects;let f;const c=m.getSize(e);"CIMPointSymbol"===e.type&&"Map"===e.angleAlignment&&(f=u.MAP);let y=a.length;for(;y--;){const m=a[y];if(!m||!1===m.enable)continue;let u;s&&s.length&&(u=[...s]);const h=m.effects;h&&h.length&&(s?u.push(...h):u=[...h]);const g=[];let d;p.findEffectOverrides(u,t,g),d=g.length>0?ae(u,g,i,o):u;const S=[];switch(p.findApplicableOverrides(m,t,S),m.type){case"CIMSolidFill":D(m,d,i,S,o,r);break;case"CIMPictureFill":F(m,d,i,S,o,n,r);break;case"CIMHatchFill":U(m,d,i,S,o,r);break;case"CIMGradientFill":W(m,d,i,S,o,r);break;case"CIMSolidStroke":G(m,d,i,S,o,r,"CIMPolygonSymbol"===e.type,c);break;case"CIMPictureStroke":B(m,d,i,S,o,r,"CIMPolygonSymbol"===e.type,c);break;case"CIMGradientStroke":q(m,d,i,S,o,r,"CIMPolygonSymbol"===e.type,c);break;case"CIMCharacterMarker":if(V(m,d,i,S,o,r))break;break;case"CIMPictureMarker":if(V(m,d,i,S,o,r))break;"CIMLineSymbol"===e.type&&(f=E(m)),K(m,d,i,S,o,n,r,f,c);break;case"CIMVectorMarker":if(V(m,d,i,S,o,r))break;"CIMLineSymbol"===e.type&&(f=E(m)),Q(m,d,i,S,o,r,n,f,c,l);break;default:J.error("Cannot analyze CIM layer",m.type)}}}function D(e,t,i,o,r,n){const l=e.primitiveName,a=v(e.color),[f,c]=pe(o,l,t,null,null),m=s(JSON.stringify(e)+c).toString();n.push({type:"fill",templateHash:m,materialHash:f?()=>m:m,cim:e,materialOverrides:null,colorLocked:e.colorLocked,color:ne(l,i,"Color",r,a,re),height:0,angle:0,offsetX:0,offsetY:0,scaleX:1,effects:t,applyRandomOffset:!1,sampleAlphaOnly:!0})}function F(e,t,i,o,r,l,a){const f=e.primitiveName,c=e.tintColor?v(e.tintColor):{r:255,g:255,b:255,a:1},[m,p]=pe(o,f,t,null,null),u=s(JSON.stringify(e)+p).toString(),y=s(`${e.url}${JSON.stringify(e.colorSubstitutions)}`).toString();let h=N(e.scaleX);if("width"in e){const t=e.width;let i=1;const o=l.getResource(e.url);n(o)&&(i=o.width/o.height),h/=i*(e.height/t)}a.push({type:"fill",templateHash:u,materialHash:m?()=>y:y,cim:e,materialOverrides:null,colorLocked:e.colorLocked,effects:t,color:ne(f,i,"TintColor",r,c,re),height:ne(f,i,"Height",r,e.height),scaleX:ne(f,i,"ScaleX",r,h),angle:ne(f,i,"Rotation",r,N(e.rotation)),offsetX:ne(f,i,"OffsetX",r,N(e.offsetX)),offsetY:ne(f,i,"OffsetY",r,N(e.offsetY)),url:e.url,applyRandomOffset:!1,sampleAlphaOnly:!1})}function U(e,t,i,o,r,n){const l=["Rotation","OffsetX","OffsetY"],a=o.filter((t=>t.primitiveName!==e.primitiveName||!l.includes(t.propertyName))),f=e.primitiveName,[c,m]=pe(o,f,t,null,null),p=s(JSON.stringify(e)+m).toString(),u=s(`${e.separation}${JSON.stringify(e.lineSymbol)}`).toString();let y={r:255,g:255,b:255,a:1};if(e.lineSymbol){const t=e.lineSymbol?.symbolLayers.find((e=>"CIMSolidStroke"===e.type));t&&(y=v(t.color))}n.push({type:"fill",templateHash:p,materialHash:c?ce(u,i,a,r):u,cim:e,materialOverrides:a,colorLocked:e.colorLocked,effects:t,color:y,height:ne(f,i,"Separation",r,e.separation),scaleX:1,angle:ne(f,i,"Rotation",r,N(e.rotation)),offsetX:ne(f,i,"OffsetX",r,N(e.offsetX)),offsetY:ne(f,i,"OffsetY",r,N(e.offsetY)),applyRandomOffset:!1,sampleAlphaOnly:!0})}function W(e,t,i,o,r,n){const l=e.primitiveName,[a,f]=pe(o,l,t,null,null),c=s(JSON.stringify(e)+f).toString();n.push({type:"fill",templateHash:c,materialHash:a?ce(c,i,o,r):c,cim:e,materialOverrides:null,colorLocked:e.colorLocked,effects:t,color:{r:128,g:128,b:128,a:1},height:0,angle:0,offsetX:0,offsetY:0,scaleX:1,applyRandomOffset:!1,sampleAlphaOnly:!1})}function G(e,t,i,o,r,n,l,a){const f=e.primitiveName,c=v(e.color),m=void 0!==e.width?e.width:4,p=H(e.capStyle),u=Y(e.joinStyle),y=e.miterLimit,[h,g]=pe(o,f,t,null,null),d=s(JSON.stringify(e)+g).toString();let S,N;if(t&&t instanceof Array&&t.length>0){const e=t[t.length-1];if("CIMGeometricEffectDashes"===e.type&&"NoConstraint"===e.lineDashEnding&&null===e.offsetAlongLine){const e=(t=[...t]).pop();S=e.dashTemplate,N=e.scaleDash}}n.push({type:"line",templateHash:d,materialHash:h?()=>d:d,cim:e,materialOverrides:null,isOutline:l,colorLocked:e.colorLocked,effects:t,color:ne(f,i,"Color",r,c,re),width:ne(f,i,"Width",r,m),cap:ne(f,i,"CapStyle",r,p),join:ne(f,i,"JoinStyle",r,u),miterLimit:ne(f,i,"MiterLimit",r,y),referenceWidth:a,zOrder:oe(e.name),dashTemplate:S,scaleDash:N,sampleAlphaOnly:!0})}function B(e,t,i,o,r,n,l,a){const f=s(`${e.url}${JSON.stringify(e.colorSubstitutions)}`).toString(),c=e.primitiveName,m=v(e.tintColor),p=void 0!==e.width?e.width:4,u=H(e.capStyle),y=Y(e.joinStyle),h=e.miterLimit,[g,d]=pe(o,c,t,null,null),S=s(JSON.stringify(e)+d).toString();n.push({type:"line",templateHash:S,materialHash:g?()=>f:f,cim:e,materialOverrides:null,isOutline:l,colorLocked:e.colorLocked,effects:t,color:ne(c,i,"TintColor",r,m,re),width:ne(c,i,"Width",r,p),cap:ne(c,i,"CapStyle",r,u),join:ne(c,i,"JoinStyle",r,y),miterLimit:ne(c,i,"MiterLimit",r,h),referenceWidth:a,zOrder:oe(e.name),dashTemplate:null,scaleDash:!1,url:e.url,sampleAlphaOnly:!1})}function q(e,t,i,o,r,n,l,a){const f=e.primitiveName,c=void 0!==e.width?e.width:4,m=H(e.capStyle),p=Y(e.joinStyle),u=e.miterLimit,[y,h]=pe(o,f,t,null,null),g=s(JSON.stringify(e)+h).toString();n.push({type:"line",templateHash:g,materialHash:y?ce(g,i,o,r):g,cim:e,materialOverrides:null,isOutline:l,colorLocked:e.colorLocked,effects:t,color:{r:128,g:128,b:128,a:1},width:ne(f,i,"Width",r,c),cap:ne(f,i,"CapStyle",r,m),join:ne(f,i,"JoinStyle",r,p),miterLimit:ne(f,i,"MiterLimit",r,u),referenceWidth:a,zOrder:oe(e.name),dashTemplate:null,scaleDash:!1,sampleAlphaOnly:!1})}function V(e,t,i,o,r,n){const l=e.markerPlacement;if(!l||"CIMMarkerPlacementInsidePolygon"!==l.type)return!1;const f=l,c=Math.abs(f.stepX),m=Math.abs(f.stepY);if(0===c||0===m)return!0;const p=["Rotation","OffsetX","OffsetY"],u=o.filter((t=>t.primitiveName!==e.primitiveName||!p.includes(t.propertyName))),y="url"in e?e.url:null,[h,g]=pe(o,f.primitiveName,t,null,null),d=s(JSON.stringify(e)+g).toString();let S,b,O=null;if("Random"===l.gridType){const e=a(R),t=Math.max(Math.floor(e/c),1),i=Math.max(Math.floor(e/m),1);S=m*i,O=e=>e?e*i:0;b=t*c/S}else l.shiftOddRows?(S=2*m,O=e=>e?2*e:0,b=c/m*.5):(S=m,O=null,b=c/m);let k={r:255,g:255,b:255,a:1};return"tintColor"in e&&(k=v(e.tintColor)),n.push({type:"fill",templateHash:d,materialHash:h?ce(d,i,u,r):d,cim:e,materialOverrides:u,colorLocked:e.colorLocked,effects:t,color:ne(f.primitiveName,i,"TintColor",r,k,re),height:ne(f.primitiveName,i,"StepY",r,S,O),scaleX:b,angle:ne(f.primitiveName,i,"GridAngle",r,f.gridAngle),offsetX:ne(f.primitiveName,i,"OffsetX",r,N(f.offsetX)),offsetY:ne(f.primitiveName,i,"OffsetY",r,N(f.offsetY)),url:y,applyRandomOffset:"Random"===l.gridType,sampleAlphaOnly:!y}),!0}function K(e,t,i,o,r,l,a,f,c){const m=e.primitiveName,p=N(e.size);let u=N(e.scaleX,1);const y=N(e.rotation),h=N(e.offsetX),g=N(e.offsetY),d=e.tintColor?v(e.tintColor):{r:255,g:255,b:255,a:1},S=s(`${e.url}${JSON.stringify(e.colorSubstitutions)}${JSON.stringify(e.animatedSymbolProperties)}`).toString(),b=se(e.markerPlacement,o,i,r),O=fe(e.animatedSymbolProperties,o,i,r),[k,C]=pe(o,m,t,b,O),P=s(JSON.stringify(e)+C).toString(),M=e.anchorPoint??{x:0,y:0};if("width"in e){const t=e.width;let i=1;const o=l.getResource(e.url);n(o)&&(i=o.width/o.height),u/=i*(p/t)}function L(e,t){return w(O,e,t)}const I=e.animatedSymbolProperties&&!0===e.animatedSymbolProperties.randomizeStartTime?(e,t,i,o)=>{const r=x(o),n=L(e,t);return S+`-MATERIALGROUP(${r})`+`-ASP(${JSON.stringify(n)})`}:k?(e,t)=>{const i=L(e,t);return S+`-ASP(${JSON.stringify(i)})`}:S;a.push({type:"marker",templateHash:P,materialHash:I,cim:e,materialOverrides:null,colorLocked:e.colorLocked,effects:t,scaleSymbolsProportionally:!1,alignment:f,size:ne(m,i,"Size",r,p),scaleX:ne(m,i,"ScaleX",r,u),rotation:ne(m,i,"Rotation",r,y),offsetX:ne(m,i,"OffsetX",r,h),offsetY:ne(m,i,"OffsetY",r,g),color:ne(m,i,"TintColor",r,d,re),anchorPoint:{x:M.x,y:-M.y},isAbsoluteAnchorPoint:"Relative"!==e.anchorPointUnits,outlineColor:{r:0,g:0,b:0,a:0},outlineWidth:0,frameHeight:0,rotateClockwise:e.rotateClockwise,referenceSize:c,sizeRatio:1,markerPlacement:b,url:e.url,animatedSymbolProperties:O})}function Q(e,t,i,o,r,n,l,a,s,f){const c=e.markerGraphics;if(!c)return;let m=0;if(e.scaleSymbolsProportionally){const t=e.frame;t&&(m=t.ymax-t.ymin)}const p=se(e.markerPlacement,o,i,r);for(const u of c)if(u){const c=u.symbol;if(!c)continue;switch(c.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":Z(e,t,p,null,u,o,i,r,n,l,a,s,m,f);break;case"CIMTextSymbol":_(e,t,p,u,i,o,r,n,a,s,m)}}}function _(e,i,o,r,n,l,a,f,c,m,u){const y=[];p.findApplicableOverrides(r,l,y);const h=r.geometry;if(!("x"in h)||!("y"in h))return;const g=r.symbol,d=b(g),S=O(g.fontStyleName),z=t(g.fontFamilyName);g.font={family:z,decoration:d,...S};const A=e.frame,R=h.x-.5*(A.xmin+A.xmax),x=h.y-.5*(A.ymin+A.ymax),J=e.size/u,H=e.primitiveName,Y=N(g.height)*J,$=N(g.angle),E=N(e.offsetX)+(N(g.offsetX)+R)*J,T=N(e.offsetY)+(N(g.offsetY)+x)*J,j=v(k(g));let D=v(C(g)),F=P(g);F||(D=v(k(g.haloSymbol)),F=g.haloSize*J);const[U,W]=pe(l,H,i,o,null),G=JSON.stringify(e.effects)+Number(e.colorLocked).toString()+JSON.stringify(e.anchorPoint)+e.anchorPointUnits+JSON.stringify(e.markerPlacement)+e.size.toString(),B=s(JSON.stringify(r)+G+W).toString();let q=ne(r.primitiveName,n,"TextString",a,r.textString,M,g.textCase);if(null==q)return;const{fontStyleName:V}=g,K=z+(V?"-"+V.toLowerCase():"-regular"),Q=K;"string"==typeof q&&q.includes("[")&&g.fieldMap&&(q=L(g.fieldMap,q,g.textCase)),f.push({type:"text",templateHash:B,materialHash:U||"function"==typeof q||q.match(/\[(.*?)\]/)?(e,t,i)=>Q+"-"+w(q,e,t,i):Q+"-"+s(q),cim:g,materialOverrides:null,colorLocked:e.colorLocked,effects:i,alignment:c,anchorPoint:{x:e.anchorPoint?e.anchorPoint.x:0,y:e.anchorPoint?e.anchorPoint.y:0},isAbsoluteAnchorPoint:"Relative"!==e.anchorPointUnits,fontName:K,decoration:d,weight:ne(H,n,"Weight",a,S.weight),style:ne(H,n,"Size",a,S.style),size:ne(H,n,"Size",a,Y),angle:ne(H,n,"Rotation",a,$),offsetX:ne(H,n,"OffsetX",a,E),offsetY:ne(H,n,"OffsetY",a,T),horizontalAlignment:I(g.horizontalAlignment),verticalAlignment:X(g.verticalAlignment),text:q,color:j,outlineColor:D,outlineSize:F,referenceSize:m,sizeRatio:1,markerPlacement:o})}function Z(e,t,i,o,r,l,a,f,c,m,p,u,y,h){const g=r.symbol,b=g.symbolLayers;if(!b)return;if(h)return void te(e,t,i,o,r,a,l,f,c,m,p,u,y);let O=b.length;if(ue(b))return void ee(e,t,i,o,r,b,l,a,f,c,p,u,y);const M=z.applyEffects(g.effects,r.geometry,m.geometryEngine);if(M)for(;O--;){const h=b[O];if(h&&!1!==h.enable)switch(h.type){case"CIMSolidFill":case"CIMSolidStroke":{const g=z.applyEffects(h.effects,M,m.geometryEngine),b=d(g);if(!b)continue;const O="Relative"!==e.anchorPointUnits,[L,w,I]=S(b,e.frame,e.size,e.anchorPoint,O),X="CIMSolidFill"===h.type,A={type:"sdf",geom:g,asFill:X},R=e.primitiveName,x=N(e.size)??10,J=N(e.rotation),H=N(e.offsetX),Y=N(e.offsetY),$=h.path,E=h.primitiveName,T=v(X?k(h):C(h)),j=X?{r:0,g:0,b:0,a:0}:v(C(h)),D=P(h);if(!X&&!D)break;let F=!1,U="";for(const e of l)e.primitiveName!==E&&e.primitiveName!==R||(void 0!==e.value?U+=`-${e.primitiveName}-${e.propertyName}-${JSON.stringify(e.value)}`:e.valueExpressionInfo&&(F=!0));n(t)&&"function"==typeof t&&(F=!0);const W=JSON.stringify({...e,markerGraphics:null}),G=s(JSON.stringify(A)+$).toString(),B={type:"marker",templateHash:s(JSON.stringify(r)+JSON.stringify(h)+W+U).toString(),materialHash:F?()=>G:G,cim:A,materialOverrides:null,colorLocked:e.colorLocked,effects:t,scaleSymbolsProportionally:e.scaleSymbolsProportionally,alignment:p,anchorPoint:{x:w,y:I},isAbsoluteAnchorPoint:O,size:ne(e.primitiveName,a,"Size",f,x),rotation:ne(e.primitiveName,a,"Rotation",f,J),offsetX:ne(e.primitiveName,a,"OffsetX",f,H),offsetY:ne(e.primitiveName,a,"OffsetY",f,Y),scaleX:1,frameHeight:y,rotateClockwise:e.rotateClockwise,referenceSize:u,sizeRatio:L,color:ne(E,a,"Color",f,T,re),outlineColor:ne(E,a,"Color",f,j,re),outlineWidth:ne(E,a,"Width",f,D),markerPlacement:i,animatedSymbolProperties:o,path:$};c.push(B);break}default:te(e,t,i,o,r,a,l,f,c,m,p,u,y)}}}function ee(e,t,i,o,r,n,l,a,f,c,m,p,u){const y=r.geometry,h=n[0],g=n[1],b=d(y);if(!b)return;const O="Relative"!==e.anchorPointUnits,[M,L,w]=S(b,e.frame,e.size,e.anchorPoint,O),I={type:"sdf",geom:y,asFill:!0},X=e.primitiveName,z=N(e.size),A=N(e.rotation),R=N(e.offsetX),x=N(e.offsetY),J=g.path,H=g.primitiveName,Y=h.primitiveName,$=v(k(g)),E=v(C(h)),T=P(h);let j=!1,D="";for(const s of l)s.primitiveName!==H&&s.primitiveName!==Y&&s.primitiveName!==X||(void 0!==s.value?D+=`-${s.primitiveName}-${s.propertyName}-${JSON.stringify(s.value)}`:s.valueExpressionInfo&&(j=!0));const F=JSON.stringify({...e,markerGraphics:null}),U=s(JSON.stringify(I)+J).toString(),W={type:"marker",templateHash:s(JSON.stringify(r)+JSON.stringify(g)+JSON.stringify(h)+F+D).toString(),materialHash:j?()=>U:U,cim:I,materialOverrides:null,colorLocked:e.colorLocked,effects:t,scaleSymbolsProportionally:e.scaleSymbolsProportionally,alignment:m,anchorPoint:{x:L,y:w},isAbsoluteAnchorPoint:O,size:ne(e.primitiveName,a,"Size",f,z),rotation:ne(e.primitiveName,a,"Rotation",f,A),offsetX:ne(e.primitiveName,a,"OffsetX",f,R),offsetY:ne(e.primitiveName,a,"OffsetY",f,x),scaleX:1,frameHeight:u,rotateClockwise:e.rotateClockwise,referenceSize:p,sizeRatio:M,color:ne(H,a,"Color",f,$,re),outlineColor:ne(Y,a,"Color",f,E,re),outlineWidth:ne(Y,a,"Width",f,T),markerPlacement:i,path:J,animatedSymbolProperties:o};c.push(W)}function te(e,t,i,o,r,a,f,c,p,u,y,h,g){const d=ie(e,r),S=["Rotation","OffsetX","OffsetY"],v=f.filter((t=>t.primitiveName!==e.primitiveName||!S.includes(t.propertyName)));let b="";for(const n of f)void 0!==n.value&&(b+=`-${n.primitiveName}-${n.propertyName}-${JSON.stringify(n.value)}`);const[O,k,C]=m.getTextureAnchor(d,u),P=e.primitiveName,M=N(e.rotation),L=N(e.offsetX),w=N(e.offsetY),I=s(JSON.stringify(d)+b).toString(),X={type:"marker",templateHash:I,materialHash:v.length>0||n(t)&&"function"==typeof t?ce(I,a,v,c):I,cim:d,materialOverrides:v,colorLocked:e.colorLocked,effects:t,scaleSymbolsProportionally:e.scaleSymbolsProportionally,alignment:y,anchorPoint:{x:O,y:k},isAbsoluteAnchorPoint:!1,size:e.size,rotation:ne(P,a,"Rotation",c,M),offsetX:ne(P,a,"OffsetX",c,L),offsetY:ne(P,a,"OffsetY",c,w),color:{r:255,g:255,b:255,a:1},outlineColor:{r:0,g:0,b:0,a:0},outlineWidth:0,scaleX:1,frameHeight:g,rotateClockwise:e.rotateClockwise,referenceSize:h,sizeRatio:C/l(e.size),markerPlacement:i,animatedSymbolProperties:o};p.push(X)}function ie(e,t){return{type:e.type,enable:!0,name:e.name,colorLocked:e.colorLocked,primitiveName:e.primitiveName,anchorPoint:e.anchorPoint,anchorPointUnits:e.anchorPointUnits,offsetX:0,offsetY:0,rotateClockwise:e.rotateClockwise,rotation:0,size:e.size,billboardMode3D:e.billboardMode3D,depth3D:e.depth3D,frame:e.frame,markerGraphics:[t],scaleSymbolsProportionally:e.scaleSymbolsProportionally,respectFrame:e.respectFrame,clippingPath:e.clippingPath}}function oe(e){if(e&&0===e.indexOf("Level_")){const t=parseInt(e.substr(6),10);if(!isNaN(t))return t}return 0}function re(t){if(!t||0===t.length)return null;const i=new e(t).toRgba();return{r:i[0],g:i[1],b:i[2],a:i[3]}}function ne(e,t,i,o,r,n,l){const a=t[e];if(a){const e=a[i];if("string"==typeof e||"number"==typeof e||e instanceof Array)return n?n.call(null,e,l):e;if(null!=e&&e instanceof c)return(t,i,a)=>{let s=A(e,t,{$view:a},o.geometryType,i);return null!==s&&n&&(s=n.call(null,s,l)),null!==s?s:r}}return r}function le(e){return e?e.charAt(0).toLowerCase()+e.substr(1):e}function ae(e,t,o,r){for(const i of t){if(i.valueExpressionInfo){const e=o[i.primitiveName]&&o[i.primitiveName][i.propertyName];e instanceof c&&(i.fn=(t,i,o)=>A(e,t,{$view:o},r.geometryType,i))}}return(o,r,n)=>{for(const e of t)e.fn&&(e.value=e.fn(o,r,n));const l=[];for(let a of e){const e=a?.primitiveName;if(e){let o=!1;for(const r of t)if(r.primitiveName===e){const e=le(r.propertyName);null!=r.value&&r.value!==a[e]&&(o||(a=i(a),o=!0),a[e]=r.value)}}l.push(a)}return l}}function se(e,t,o,r){const n=[];if(p.findApplicableOverrides(e,t,n),0===n.length)return e;for(const i of n){if(i.valueExpressionInfo){const e=o[i.primitiveName]&&o[i.primitiveName][i.propertyName];e instanceof c&&(i.fn=(t,i,o)=>A(e,t,{$view:o},r.geometryType,i))}}return(t,o,r)=>{for(const e of n)e.fn&&(e.value=e.fn(t,o,r));const l=i(e),a=e.primitiveName;for(const e of n)if(e.primitiveName===a){const t=le(e.propertyName);null!=e.value&&e.value!==l[t]&&(l[t]=e.value)}return l}}function fe(e,t,o,r){const n=[];if(p.findApplicableOverrides(e,t,n),0===n.length)return e;for(const i of n){if(i.valueExpressionInfo){const e=o[i.primitiveName]&&o[i.primitiveName][i.propertyName];e instanceof c&&(i.fn=(t,i,o)=>A(e,t,{$view:o},r.geometryType,i))}}return(t,o,r)=>{for(const e of n)e.fn&&(e.value=e.fn(t,o,r));const l=i(e),a=e.primitiveName;for(const e of n)if(e.primitiveName===a){const t=le(e.propertyName);if(null!=e.value){const i=g(e.value,e.propertyName);i!==l[t]&&(l[t]=i)}}return l}}function ce(e,t,i,o){for(const r of i){if(r.valueExpressionInfo){const e=t[r.primitiveName]&&t[r.primitiveName][r.propertyName];e instanceof c&&(r.fn=(t,i,r)=>A(e,t,{$view:r},o.geometryType,i))}}return(t,o,r)=>{for(const e of i)e.fn&&(e.value=e.fn(t,o,r));return s(e+p.buildOverrideKey(i)).toString()}}function me(e,t){if(!t||0===t.length)return e;const o=i(e);return p.applyOverrides(o,t),o}function pe(e,t,i,o,r){let l=!1,a="";for(const n of e)n.primitiveName===t&&(void 0!==n.value?a+=`-${n.primitiveName}-${n.propertyName}-${JSON.stringify(n.value)}`:n.valueExpressionInfo&&(l=!0));return n(i)&&"function"==typeof i&&(l=!0),n(o)&&"function"==typeof o&&(l=!0),n(r)&&"function"==typeof r&&(l=!0),[l,a]}const ue=e=>e&&2===e.length&&e[0].enable&&e[1].enable&&"CIMSolidStroke"===e[0].type&&"CIMSolidFill"===e[1].type&&!e[0].effects&&!e[1].effects;export{me as analyzeCIMResource,T as analyzeCIMSymbol};