@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 5.35 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import e from"../../Color.js";import{isRGB as r}from"../../core/colorUtils.js";import{clone as i}from"../../core/lang.js";import{createRendererExpression as t}from"../../support/arcadeOnDemand.js";import{normalizeDashEffectTemplate as s,toLowerCaseProps as o,normalizePrimitiveOverrideProps as a,attributesToFields as c,analyzeTextParts as l,assignTextValuesFromFeature as n,uncapitalize as p}from"./utils.js";import f from"../../views/2d/arcade/callExpressionWithFeature.js";const m=e=>{if(!e)return[0,0,0,0];const{r,g:i,b:t,a:s}=e;return[r,i,t,255*s]};class y{static findApplicableOverrides(e,r,i){if(e&&r){if(e.primitiveName){let t=!1;for(const r of i)if(r.primitiveName===e.primitiveName){t=!0;break}if(!t)for(const s of r)s.primitiveName===e.primitiveName&&i.push(s)}switch(e.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":if(e.effects)for(const t of e.effects)y.findApplicableOverrides(t,r,i);if(e.symbolLayers)for(const t of e.symbolLayers)y.findApplicableOverrides(t,r,i);break;case"CIMTextSymbol":break;case"CIMSolidStroke":case"CIMPictureStroke":case"CIMGradientStroke":case"CIMSolidFill":case"CIMPictureFill":case"CIMHatchFill":case"CIMGradientFill":case"CIMVectorMarker":case"CIMCharacterMarker":case"CIMPictureMarker":if(e.effects)for(const t of e.effects)y.findApplicableOverrides(t,r,i);if(e.markerPlacement&&y.findApplicableOverrides(e.markerPlacement,r,i),"CIMVectorMarker"===e.type){if(e.markerGraphics)for(const t of e.markerGraphics)y.findApplicableOverrides(t,r,i),y.findApplicableOverrides(t.symbol,r,i)}else"CIMCharacterMarker"===e.type?y.findApplicableOverrides(e.symbol,r,i):"CIMHatchFill"===e.type?y.findApplicableOverrides(e.lineSymbol,r,i):"CIMPictureMarker"===e.type&&y.findApplicableOverrides(e.animatedSymbolProperties,r,i)}}}static findEffectOverrides(e,r){if(!e)return null;if("CIMGeometricEffectDashes"===e.type&&s(e),!r||!e.primitiveName)return{type:"cim-effect-param",effect:e,overrides:[]};const i=o(e),t=e.primitiveName,c=[];for(const s of r)s.primitiveName===t&&c.push(o(s));return{type:"cim-effect-param",effect:i,overrides:a(c)}}static async resolveSymbolOverrides(e,r,t,s,o,a,l){if(!e?.symbol)return null;let{symbol:n,primitiveOverrides:p}=e;const f=!!p;if(!f&&!s)return n;n=i(n),p=i(p);let m=!0;if(r||(r={attributes:{}},m=!1),f){if(m||(p=p.filter((e=>!e.valueExpressionInfo?.expression.includes("$feature")))),l||(p=p.filter((e=>!e.valueExpressionInfo?.expression.includes("$view")))),p.length>0){const e={spatialReference:t,fields:c(r.attributes),geometryType:o};await y.createRenderExpressions(p,e),y.evaluateOverrides(p,r,o??"esriGeometryPoint",a,l)}y.applyOverrides(n,p)}return s&&y.applyDictionaryTextOverrides(n,r,s,null),n}static async createRenderExpressions(e,r){const i=[];for(const s of e){const e=s.valueExpressionInfo;if(!e||y._expressionToRenderExpression.has(e.expression))continue;const o=t(e.expression,r.spatialReference,r.fields);i.push(o),o.then((r=>y._expressionToRenderExpression.set(e.expression,r)))}i.length>0&&await Promise.all(i)}static evaluateOverrides(e,i,t,s,o){const a={$view:{scale:o?.scale}};for(const c of e){c.value&&"object"==typeof c.value&&r(c.value)&&("Color"===c.propertyName||"StrokeColor"===c.propertyName)&&(c.value=m(c.value));const e=c.valueExpressionInfo;if(!e)continue;const o=y._expressionToRenderExpression.get(e.expression);o&&(c.value=f(o,i,a,t,s))}}static applyDictionaryTextOverrides(e,r,i,t,s="Normal"){if(e?.type)switch(e.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":case"CIMTextSymbol":{const o=e.symbolLayers;if(!o)return;for(const a of o)a&&"CIMVectorMarker"===a.type&&y.applyDictionaryTextOverrides(a,r,i,t,"CIMTextSymbol"===e.type?e.textCase:s)}break;case"CIMVectorMarker":{const s=e.markerGraphics;if(!s)return;for(const e of s)e&&y.applyDictionaryTextOverrides(e,r,i,t)}break;case"CIMMarkerGraphic":{const o=e.textString;if(o&&o.includes("[")){const a=l(o,i);e.textString=n(r,a,t,s)}}}}static applyOverrides(e,r,i,t){if(e.primitiveName)for(const s of r)if(s.primitiveName===e.primitiveName){const r=p(s.propertyName);if(t&&t.push({cim:e,nocapPropertyName:r,value:e[r]}),i){let r=!1;for(const t of i)t.primitiveName===e.primitiveName&&(r=!0);r||i.push(s)}null!=s.value&&(e[r]=s.value)}switch(e.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":if(e.effects)for(const s of e.effects)y.applyOverrides(s,r,i,t);if(e.symbolLayers)for(const s of e.symbolLayers)y.applyOverrides(s,r,i,t);break;case"CIMTextSymbol":break;case"CIMSolidStroke":case"CIMSolidFill":case"CIMVectorMarker":if(e.effects)for(const s of e.effects)y.applyOverrides(s,r,i,t);if("CIMVectorMarker"===e.type&&e.markerGraphics)for(const s of e.markerGraphics)y.applyOverrides(s,r,i,t),y.applyOverrides(s.symbol,r,i,t)}}static restoreOverrides(e){for(const r of e)r.cim[r.nocapPropertyName]=r.value}static buildOverrideKey(e){let r="";for(const i of e)void 0!==i.value&&(r+=`${i.primitiveName}${i.propertyName}${JSON.stringify(i.value)}`);return r}static toValue(r,i){if("DashTemplate"===r)return i.split(" ").map((e=>Number(e)));if("Color"===r){const r=new e(i).toRgba();return r[3]*=255,r}return i}}y._expressionToRenderExpression=new Map;export{y as OverrideHelper};