Here is the second version with the following improvements : - manage single color style and not only ramps
- manage correctly the 50%
- correct a bug in handling 1 to 9% values because of the string sorting of values in the json
- correct a bug which was corrupting colours under 50%
-- $manifold$ VALUE @firstAlpha INT32 = 60; VALUE @lastAlpha INT32 = 80; VALUE @drawingName NVARCHAR = 'Drawing 1'; -- Function to add alpha to any Manifold encoded color FUNCTION ColorValueM9A(@m9 INT32, @a INT32) INT32 AS (CASE WHEN @a>50 THEN Cast(128-(@a-50)*128/50 AS int32) WHEN @a<=50 THEN Cast(-1*@a*128/50 AS int32) END)*256^3 + CASE WHEN Abs(@m9)>256^3 THEN Abs((@m9/(256^3)-FLOOR(@m9/(256^3))))*256^3 ELSE @m9 END END; DROP TABLE alpha_test1_bnj4jk; -- retrieve color scheme from mfd_meta and split colors classes SELECT * INTO alpha_test1_bnj4jk FROM ( SELECT type, valuevalue,StringSubstringLen(Value,0,StringFind(Value,':')) as entityname, Cast(StringReplace(StringSubstringLen(Value,0,StringFind(Value,':')),'\"','') AS int32) as entityname_int, Cast(StringSubstring(Value,StringFind(Value,':')+1) as int32) as entityval, ColorValueM9A(Cast(StringSubstring(Value,StringFind(Value,':')+1) as int32),80) AS entitynewval, Value FROM ( SELECT CASE WHEN StringFind(Value,'"Values": {' )>0 THEN 'class' ELSE 'unique' END AS type, Cast(StringSubstringLen(Value, StringFind(Value,'"Value": ' )+9, StringFind(StringSubString(Value,StringFind(Value,'"Value": ' )+9),',') ) AS int32) as valuevalue, SPLIT CALL StringToTokens( StringSubstring(Value , StringFind(Value,'"Values": {' ) +11) , ',') FROM (select * from mfd_meta WHERE Name like @drawingName AND Property LIKE 'StyleAreaColorBack') ) as D ORDER BY entityname_int ) AS E; ALTER TABLE alpha_test1_bnj4jk (add mfd_id int32); -- interpolate alpha value according to the number of classes of the color scheme DROP TABLE alpha_test2_bnj4jk; SELECT mfd_id, type, valuevalue,entityname, entityval, (@lastAlpha-@firstAlpha)*(mfd_id-1)/(max_mf-1)+@firstAlpha AS alpha INTO alpha_test2_bnj4jk FROM alpha_test1_bnj4jk INNER JOIN (SELECT Max(mfd_id) as max_mf FROM alpha_test1_bnj4jk) ON 1=1; -- assign the new color including the alpha value DROP TABLE alpha_test3_bnj4jk; SELECT mfd_id, type, ColorValueM9A(valuevalue, @firstAlpha) AS newvaluevalue, entityname, entityval, ColorValueM9A(entityval, alpha) AS newentityval INTO alpha_test3_bnj4jk FROM alpha_test2_bnj4jk; -- generate the json code for StyleAreaColorBack DROP TABLE alpha_test4_bnj4jk; SELECT First(type) AS type, CASE WHEN First(type) LIKE 'class' THEN StringSubstringLen(Value, 0, StringFind(Value,'"Value": ')+9) & Cast(First(newvaluevalue) as NVARCHAR) & ', "Values": {' & StringJoinTokens(StringConcat(entityname, ' : ', CAST(newentityval AS NVARCHAR)),',') & '}}' WHEN First(type) LIKE 'unique' THEN '{ "Value": ' & Cast(First(newvaluevalue) AS NVARCHAR) & ' }' END as newjson INTO alpha_test4_bnj4jk FROM alpha_test3_bnj4jk INNER JOIN (select * from mfd_meta WHERE Name like @drawingName AND Property LIKE 'StyleAreaColorBack') as mm ON 1=1 GROUP BY Value; -- update the value in mfd_meta UPDATE (SELECT m.mfd_id, Name, Property, m.Value, a4.newjson FROM mfd_meta AS m INNER JOIN (SELECT dname, prop, FirstNonNull(newjson) AS newjson FROM (SELECT @drawingName AS dname, 'StyleAreaColorBack' AS prop, newjson FROM alpha_test4_bnj4jk) AS sub GROUP BY dname, prop) AS a4 ON Name=dname AND Property=prop) SET Value=newjson; DROP TABLE alpha_test1_bnj4jk; DROP TABLE alpha_test2_bnj4jk; DROP TABLE alpha_test3_bnj4jk; DROP TABLE alpha_test4_bnj4jk;
|