ArcGIS Pro 3.4 二次开发 - Arcade
环境:ArcGIS Pro SDK 3.4 + .NET 8
文章目录
- Arcade
- 1 基本查询
- 1.1 基本查询
- 1.2 使用要素进行基本查询
- 1.3 使用 FeatureSetByName 检索要素
- 1.4 使用过滤器检索要素
- 1.5 使用数学函数计算基本统计量
- 1.6 使用 FeatureSet 函数的 Filter 和 Intersects
- 2 评估表达式
- 2.1 评估 Arcade 标注表达式
- 2.2 在渲染器上评估Arcade视觉变量表达式
- 2.3 使用 Arcade 修改渲染器
- 2.4 使用 Arcade 修改标签表达式
- 2.5 评估属性规则表达式
Arcade
1 基本查询
1.1 基本查询
QueuedTask.Run(() =>
{
// 构建一个表达式
var query = @"Count($layer)"; // 计算 "layer" 中的要素数量
// 构建一个 CIMExpressionInfo
var arcade_expr = new CIMExpressionInfo()
{
Expression = query.ToString(),
// 返回类型可以是字符串、数字或默认值
// 当设置为默认值时,插件负责确定返回类型
ReturnType = ExpressionReturnType.Default
};
// 构建一个评估器
// 选择相关的配置文件 - 它必须支持 Pro 并且必须包含表达式中使用的任何配置文件变量
// 参考: https://developers.arcgis.com/arcade/profiles/
using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
arcade_expr, ArcadeProfile.Popups))
{
// 为任何引用的配置文件变量提供值...
// 在我们的例子中是 '$layer'
var variables = new List<KeyValuePair<string, object>>() {
new KeyValuePair<string, object>("$layer", featLayer)
};
// 评估表达式
try
{
var result = arcade.Evaluate(variables).GetResult();
System.Diagnostics.Debug.WriteLine($"Result: {result.ToString()}");
}
// 处理任何异常
catch (InvalidProfileVariableException ipe)
{
// 指定的配置文件变量有问题
// TODO...
}
catch (EvaluationException ee)
{
// 查询评估有问题
// TODO...
}
}
});
1.2 使用要素进行基本查询
QueuedTask.Run(() =>
{
// 构建一个表达式
var query = @"$feature.AreaInAcres * 43560.0"; // 将英亩转换为平方英尺
// 构建一个 CIMExpressionInfo
var arcade_expr = new CIMExpressionInfo()
{
Expression = query.ToString(),
// 返回类型可以是字符串、数字或默认值
// 当设置为默认值时,插件负责确定返回类型
ReturnType = ExpressionReturnType.Default
};
// 构建一个评估器
// 选择相关的配置文件 - 它必须支持 Pro 并且必须包含表达式中使用的任何配置文件变量
// 参考: https://developers.arcgis.com/arcade/profiles/
using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
arcade_expr, ArcadeProfile.Popups))
{
// 我们正在对所有要素评估表达式
using (var rc = featLayer.Search())
{
while (rc.MoveNext())
{
// 为引用的任何配置文件变量提供值...
// 在我们的例子中是 '$feature'
var variables = new List<KeyValuePair<string, object>>() {
new KeyValuePair<string, object>("$feature", rc.Current)
};
// 评估表达式(在这种情况下针对每个要素)
try
{
var result = arcade.Evaluate(variables).GetResult();
var val = ((double)result).ToString("0.0#");
System.Diagnostics.Debug.WriteLine(
$"{rc.Current.GetObjectID()} 面积: {val} 平方英尺");
}
// 处理任何异常
catch (InvalidProfileVariableException ipe)
{
// 指定的配置文件变量有问题
// TODO...
}
catch (EvaluationException ee)
{
// 查询评估有问题
// TODO...
}
}
}
}
});
1.3 使用 FeatureSetByName 检索要素
var map = MapView.Active.Map;
QueuedTask.Run(() =>
{
// 构建查询
var query = new StringBuilder();
var layer_name = "USA Current Wildfires - Current Incidents";
// 参考 https://developers.arcgis.com/arcade/function-reference/featureset_functions/
query.AppendLine(
$"var features = FeatureSetByName($map,'{layer_name}', ['*'], false);");
query.AppendLine("return Count(features);");
// 构建 CIMExpressionInfo
var arcade_expr = new CIMExpressionInfo()
{
Expression = query.ToString(),
// 返回类型可以是字符串、数字或默认值
// 当设置为默认值时,插件负责确定返回类型
ReturnType = ExpressionReturnType.Default
};
// 构建评估器
// 选择相关配置文件 - 它必须支持 Pro 并且必须包含表达式中使用的任何配置文件变量
// 参考:https://developers.arcgis.com/arcade/profiles/
using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
arcade_expr, ArcadeProfile.Popups))
{
// 为任何引用的配置文件变量提供值...
// 在我们的例子中是 '$map'
var variables = new List<KeyValuePair<string, object>>() {
new KeyValuePair<string, object>("$map", map)
};
// 评估表达式
try
{
var result = arcade.Evaluate(variables).GetResult();
System.Diagnostics.Debug.WriteLine($"Result: {result.ToString()}");
}
// 处理任何异常
catch (InvalidProfileVariableException ipe)
{
// 指定的配置文件变量有问题
// TODO...
}
catch (EvaluationException ee)
{
// 查询评估有问题
// TODO...
}
}
});
1.4 使用过滤器检索要素
QueuedTask.Run(() =>
{
// 构建查询
var query = new StringBuilder();
// 参考 https://developers.arcgis.com/arcade/function-reference/featureset_functions/
query.AppendLine(
"var features = Filter($layer, 'DailyAcres is not NULL');");
query.AppendLine("return Count(features);");
// 构建 CIMExpressionInfo
var arcade_expr = new CIMExpressionInfo()
{
Expression = query.ToString(),
// 返回类型可以是字符串、数字或默认值
// 当设置为默认值时,插件负责确定返回类型
ReturnType = ExpressionReturnType.Default
};
// 构建评估器
// 选择相关配置文件 - 它必须支持 Pro 并且必须包含表达式中使用的任何配置文件变量
// 参考:https://developers.arcgis.com/arcade/profiles/
using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
arcade_expr, ArcadeProfile.Popups))
{
// 为引用的任何配置文件变量提供值...
// 在我们的例子中是 '$layer'
var variables = new List<KeyValuePair<string, object>>() {
new KeyValuePair<string, object>("$layer", featLayer)
};
// 评估表达式
try
{
var result = arcade.Evaluate(variables).GetResult();
System.Diagnostics.Debug.WriteLine($"结果: {result.ToString()}");
}
// 处理任何异常
catch (InvalidProfileVariableException ipe)
{
// 指定的配置文件变量有问题
// TODO...
}
catch (EvaluationException ee)
{
// 查询评估有问题
// TODO...
}
}
});
1.5 使用数学函数计算基本统计量
QueuedTask.Run(() =>
{
// 构建查询
var query = new StringBuilder();
// 参考 https://developers.arcgis.com/arcade/function-reference/math_functions
query.AppendLine("var features = Filter($layer, 'DailyAcres is not NULL');"); // 过滤出 DailyAcres 不为空的要素
query.AppendLine("var count_feat = Count(features);"); // 计算要素数量
query.AppendLine("var sum_feat = Sum(features, 'DailyAcres');"); // 计算 DailyAcres 的总和
query.AppendLine("var max_feat = Max(features, 'DailyAcres');"); // 计算 DailyAcres 的最大值
query.AppendLine("var min_feat = Min(features, 'DailyAcres');"); // 计算 DailyAcres 的最小值
query.AppendLine("var avg_feat = Average(features, 'DailyAcres');"); // 计算 DailyAcres 的平均值
query.AppendLine("var answer = [count_feat, sum_feat, max_feat, min_feat, avg_feat]"); // 将结果存储在数组中
query.AppendLine("return Concatenate(answer,'|');"); // 将数组结果用 '|' 连接并返回
// 构建 CIMExpressionInfo
var arcade_expr = new CIMExpressionInfo()
{
Expression = query.ToString(),
// 返回类型可以是字符串、数字或默认值
// 当设置为默认值时,插件负责确定返回类型
ReturnType = ExpressionReturnType.Default
};
// 构建评估器
// 选择相关配置文件 - 它必须支持 Pro 并且必须包含表达式中使用的任何配置文件变量
// 参考: https://developers.arcgis.com/arcade/profiles/
using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
arcade_expr, ArcadeProfile.Popups))
{
// 为引用的任何配置文件变量提供值...
// 在我们的例子中是 '$layer'
var variables = new List<KeyValuePair<string, object>>() {
new KeyValuePair<string, object>("$layer", featLayer)
};
// 评估表达式
try
{
var result = arcade.Evaluate(variables).GetResult();
System.Diagnostics.Debug.WriteLine($"Result: {result.ToString()}");
}
// 处理任何异常
catch (InvalidProfileVariableException ipe)
{
// 指定的配置文件变量有问题
// TODO...
}
catch (EvaluationException ee)
{
// 查询评估有问题
// TODO...
}
}
});
1.6 使用 FeatureSet 函数的 Filter 和 Intersects
var map = MapView.Active.Map;
QueuedTask.Run(() =>
{
// 构建查询
var query = new StringBuilder();
// https://developers.arcgis.com/arcade/function-reference/featureset_functions/
// 假设我们有两个图层 - 俄勒冈县(多边形)和犯罪(点)。犯罪数据来自 Pro SDK 社区示例数据。
// 选择相关县边界内的所有犯罪点并统计数量
query.AppendLine("var results = [];");
query.AppendLine("var counties = FeatureSetByName($map, 'Oregon_Counties', ['*'], true);");
// 'Clackamas','Multnomah','Washington'
query.AppendLine("var sel_counties = Filter(counties, 'DHS_Districts IN (2, 15, 16)');");
query.AppendLine("for(var county in sel_counties) {");
query.AppendLine(" var name = county.County_Name;");
query.AppendLine(" var cnt_crime = Count(Intersects($layer, Geometry(county)));");
query.AppendLine(" Insert(results, 0, cnt_crime);");
query.AppendLine(" Insert(results, 0, name);");
query.AppendLine("}");
query.AppendLine("return Concatenate(results,'|');");
// 构建 CIMExpressionInfo
var arcade_expr = new CIMExpressionInfo()
{
Expression = query.ToString(),
// 返回类型可以是字符串、数字或默认值
// 当设置为默认值时,插件负责确定返回类型
ReturnType = ExpressionReturnType.Default
};
// 构建评估器
// 选择相关配置文件 - 它必须支持 Pro 并且必须包含表达式中使用的任何配置文件变量。
// 参考:https://developers.arcgis.com/arcade/profiles/
using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
arcade_expr, ArcadeProfile.Popups))
{
// 为引用的任何配置文件变量提供值...
// 在我们的例子中是 '$layer' 和 '$map'
var variables = new List<KeyValuePair<string, object>>() {
new KeyValuePair<string, object>("$layer", crimes_layer),
new KeyValuePair<string, object>("$map", map)
};
// 评估表达式
try
{
var result = arcade.Evaluate(variables).GetResult();
var results = result.ToString().Split('|', StringSplitOptions.None);
var entries = results.Length / 2;
int i = 0;
for (var e = 0; e < entries; e++)
{
var name = results[i++];
var count = results[i++];
System.Diagnostics.Debug.WriteLine($"'{name}' crime count: {count}");
}
}
// 处理任何异常
catch (InvalidProfileVariableException ipe)
{
// 指定的配置文件变量有问题
// TODO...
}
catch (EvaluationException ee)
{
// 查询评估有问题
// TODO...
}
}
});
2 评估表达式
2.1 评估 Arcade 标注表达式
var map = MapView.Active.Map;
QueuedTask.Run(() =>
{
// 假设我们有一个图层 - Oregon County (poly),它有一个 Arcade 标注表达式
// 我们想要交互式地评估这个表达式...
var def = oregon_cnts.GetDefinition() as CIMFeatureLayer;
// 获取标注类
var label_class = def.LabelClasses
.FirstOrDefault(lc => {
return lc.Name == "Arcade_Example_1" &&
lc.ExpressionEngine == LabelExpressionEngine.Arcade;
});
if (label_class == null)
return;
// 针对要素评估标注表达式
var expr_info = new CIMExpressionInfo()
{
Expression = label_class.Expression,
ReturnType = ExpressionReturnType.String
};
// https://developers.arcgis.com/arcade/profiles/labeling/
using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
expr_info, ArcadeProfile.Labeling))
{
// 遍历要素
using (var rc = oregon_cnts.Search())
{
while (rc.MoveNext())
{
var variables = new List<KeyValuePair<string, object>>() {
new KeyValuePair<string, object>("$feature", rc.Current)
};
var result = arcade.Evaluate(variables).GetResult();
// 输出结果
System.Diagnostics.Debug.WriteLine(
$"[{rc.Current.GetObjectID()}]: {result}");
}
}
}
});
2.2 在渲染器上评估Arcade视觉变量表达式
var mv = MapView.Active;
var map = mv.Map;
QueuedTask.Run(() =>
{
// 假设我们有一个图层 - 俄勒冈县(多边形),它使用了我们想要交互式评估的视觉变量表达式...
var def = oregon_cnts.GetDefinition() as CIMFeatureLayer;
// 大多数要素渲染器都有一个VisualVariable集合
var renderer = def.Renderer as CIMUniqueValueRenderer;
var vis_variables = renderer.VisualVariables?.ToList() ??
new List<CIMVisualVariable>();
if (vis_variables.Count == 0)
return;// 如果没有视觉变量,直接返回
var vis_var_with_expr = new Dictionary<string, string>();
// 检查是否有使用表达式的视觉变量
foreach (var vv in vis_variables)
{
if (vv is CIMColorVisualVariable cvv)
{
if (!string.IsNullOrEmpty(cvv.ValueExpressionInfo?.Expression))
vis_var_with_expr.Add("Color", cvv.ValueExpressionInfo?.Expression);
}
else if (vv is CIMTransparencyVisualVariable tvv)
{
if (!string.IsNullOrEmpty(tvv.ValueExpressionInfo?.Expression))
vis_var_with_expr.Add("Transparency", tvv.ValueExpressionInfo?.Expression);
}
else if (vv is CIMSizeVisualVariable svv)
{
if (!string.IsNullOrEmpty(svv.ValueExpressionInfo?.Expression))
vis_var_with_expr.Add("Outline", svv.ValueExpressionInfo?.Expression);
}
}
if (vis_var_with_expr.Count == 0)
return;// 如果没有使用表达式的视觉变量,直接返回
// 遍历要素(外层)
// 对每个要素评估每个视觉变量...(内层)
// ...
// 另一种方式是遍历表达式(外层)
// 然后对每个要素评估表达式(内层)
using (var rc = oregon_cnts.Search())
{
while (rc.MoveNext())
{
foreach (var kvp in vis_var_with_expr)
{
var expr_info = new CIMExpressionInfo()
{
Expression = kvp.Value,
ReturnType = ExpressionReturnType.Default
};
// 对每个要素评估每个表达式...
using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
expr_info, ArcadeProfile.Visualization))
{
var variables = new List<KeyValuePair<string, object>>() {
new KeyValuePair<string, object>("$feature", rc.Current)
};
// 注意2D地图也可以有视图比例...
// ...如果需要...
if (mv.ViewingMode == MapViewingMode.Map)
{
variables.Add(new KeyValuePair<string, object>(
"$view.scale", mv.Camera.Scale));
}
var result = arcade.Evaluate(variables).GetResult().ToString();
// 输出结果
System.Diagnostics.Debug.WriteLine(
$"[{rc.Current.GetObjectID()}] '{kvp.Key}': {result}");
}
}
}
}
foreach (var kvp in vis_var_with_expr)
{
var expr_info = new CIMExpressionInfo()
{
Expression = kvp.Value,
ReturnType = ExpressionReturnType.Default
};
using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
expr_info, ArcadeProfile.Visualization))
{
// 遍历要素
using (var rc = oregon_cnts.Search())
{
while (rc.MoveNext())
{
var variables = new List<KeyValuePair<string, object>>() {
new KeyValuePair<string, object>("$feature", rc.Current)
};
var result = arcade.Evaluate(variables).GetResult();
// 输出结果
//...
}
}
}
}
});
2.3 使用 Arcade 修改渲染器
var lyr = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(f => f.ShapeType == esriGeometryType.esriGeometryPolygon);
if (lyr == null) return;
QueuedTask.Run(() =>
{
// 从图层获取渲染器(假设它是唯一值渲染器)
var uvRenderer = lyr.GetRenderer() as CIMUniqueValueRenderer;
if (uvRenderer == null) return;
// 图层包含 STATE_NAME 字段
// 社区示例数据 Data\Admin\AdminSample.aprx
string expression = "if ($view.scale > 21000000) { return $feature.STATE_NAME } else { return 'All' }";
CIMExpressionInfo updatedExpressionInfo = new CIMExpressionInfo
{
Expression = expression,
Title = "Custom" // 可以是用于 UI 的任何字符串
};
// 设置渲染器的表达式
uvRenderer.ValueExpressionInfo = updatedExpressionInfo;
// 在图层上设置渲染器
lyr.SetRenderer(uvRenderer);
});
2.4 使用 Arcade 修改标签表达式
var lyr = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(f => f.ShapeType == esriGeometryType.esriGeometryPolygon);
if (lyr == null) return;
QueuedTask.Run(() =>
{
// 获取图层的定义
// 社区示例数据 Data\Admin\AdminSample.aprx
var lyrDefn = lyr.GetDefinition() as CIMFeatureLayer;
if (lyrDefn == null) return;
// 获取标签类 - 我们需要第一个
var listLabelClasses = lyrDefn.LabelClasses.ToList();
var theLabelClass = listLabelClasses.FirstOrDefault();
// 设置标签类的表达式以使用 Arcade 表达式
theLabelClass.Expression = "return $feature.STATE_NAME + TextFormatting.NewLine + $feature.POP2000;";
// 将标签定义设置回图层
lyr.SetDefinition(lyrDefn);
});
2.5 评估属性规则表达式
QueuedTask.Run(() =>
{
// 获取所需的要素类/表
var def = featLayer.GetFeatureClass().GetDefinition();
// 获取要评估表达式的属性规则
// AttributeRuleType.All, Calculation, Constraint, Validation
var validation_rule = def.GetAttributeRules(
AttributeRuleType.Validation).FirstOrDefault();
if (validation_rule == null)
return;
// 获取表达式
var expr = validation_rule.GetScriptExpression();
// 构造一个 CIMExpressionInfo
var arcade_expr = new CIMExpressionInfo()
{
Expression = expr,
// 返回类型可以是字符串、数字或默认值
ReturnType = ExpressionReturnType.Default
};
System.Diagnostics.Debug.WriteLine($"正在评估 {expr}:");
// 构造一个评估器
// 我们使用的是 ArcadeProfile.AttributeRules 配置文件...
// 参考: https://developers.arcgis.com/arcade/profiles/
using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
arcade_expr, ArcadeProfile.AttributeRuleValidation))
{
// 我们正在对所有要素评估表达式
using (var rc = featLayer.Search())
{
while (rc.MoveNext())
{
// 为引用的任何配置文件变量提供值...
// 在我们的例子中,我们假设是 '$feature'
// ...如果需要,使用 arcade.ProfileVariablesUsed()...
var variables = new List<KeyValuePair<string, object>>() {
new KeyValuePair<string, object>("$feature", rc.Current)
};
// 对每个要素评估表达式
try
{
var result = arcade.Evaluate(variables).GetResult();
// 'Validation' 属性规则返回 true 或 false...
var valid = System.Boolean.Parse(result.ToString());
System.Diagnostics.Debug.WriteLine(
$"{rc.Current.GetObjectID()} 有效: {valid}");
}
// 处理任何异常
catch (InvalidProfileVariableException ipe)
{
// 指定的配置文件变量有问题
// TODO...
}
catch (EvaluationException ee)
{
// 查询评估有问题
// TODO...
}
}
}
}
});
相关文章:
ArcGIS Pro 3.4 二次开发 - Arcade
环境:ArcGIS Pro SDK 3.4 .NET 8 文章目录 Arcade1 基本查询1.1 基本查询1.2 使用要素进行基本查询1.3 使用 FeatureSetByName 检索要素1.4 使用过滤器检索要素1.5 使用数学函数计算基本统计量1.6 使用 FeatureSet 函数的 Filter 和 Intersects 2 评估表达式2.1 评…...
PCB智能报价系统——————仙盟创梦IDE
软件署名 代码贡献: 紫金电子科技有限公司 文案正路:cybersnow 正文 对企业的竞争力有着深远影响。传统的 PCB 报价方式往往依赖人工核算,不仅耗时较长,还容易出现误差。随着科技的发展,PCB 自动报价系统应运而生&a…...
灾备认证助力构建数据资产安全防线
信息安全保障人员(CISAW)-灾难备份与恢复认证 1.权威认证体系:技术护城河 在数字化进程加速的背景下,数据资产已成为政府与企业的核心资源,容灾备份能力成为保障业务连续性的关键。特别是近年来,因灾备缺…...
[特殊字符] 遇见Flask
一、初识Flask:像风一样自由 想象一下,你手里有一盒乐高积木——没有说明书,但每一块都精致小巧,任你组合成城堡、飞船,甚至整个宇宙。Flask就是这样一个存在。它不像Django那样“手把手教你搭房子”,而是…...
Axure高级交互设计:中继器嵌套动态面板实现超强体验感台账
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:中继器嵌套动态面板 主要内容:中继器内部嵌套动态面板,实现可移动式台账,增强数据表现…...
告别手动绘图!2分钟用 AI 生成波士顿矩阵
波士顿矩阵作为经典工具,始终是企业定位产品组合、制定竞争策略的核心方法论。然而,传统手动绘制矩阵的方式,往往面临数据处理繁琐、图表调整耗时、团队协作低效等痛点。 随着AI技术的发展,这一现状正在被彻底改变。boardmix博思白…...
iframe加载或者切换时候,短暂的白屏频闪问题解决
问题描述 iframe加载或者是切换iframe链接的时候,会有短暂的白屏,这个时候是在加载,目前没有想到避免的问题,应该是浏览器层面的,所以解决方法之一就是,用页面的主题背景色来遮盖一下,当他加载…...
Python数据可视化高级实战之一——绘制GE矩阵图
目录 一、课程概述 二、GE矩阵? 三、GE 矩阵图的适用范围 五、GE 矩阵的评估方法 (一)市场吸引力的评估要素 二、企业竞争实力的评估要素 三、评估方法与实践应用 1. 定量与定性结合法 2. 数据来源 六、GE矩阵的图形化实现 七、总结:GE 矩阵与 BCG 矩阵的对比分析 (一)GE…...
量子计算与云计算的融合:技术前沿与应用前景
目录 引言 量子计算基础 量子计算的基本原理 量子计算的优势与挑战 量子计算的发展阶段 云计算基础 云计算的基本概念 云计算的应用领域 云计算面临的挑战 量子计算与云计算的结合 量子云计算的概念与架构 量子云计算的服务模式 量子云计算的优势 量子云计算的发展…...
QMK固件RGB矩阵照明功能详解 - 打造你的专属炫彩键盘
QMK固件RGB矩阵照明功能详解 - 打造你的专属炫彩键盘 🌈 大家好!今天我要详细讲解QMK固件中的RGB矩阵照明功能,让你轻松打造一个真正炫彩的机械键盘!本文从基础原理到实战配置,手把手教你如何配置各种绚丽的灯光效果,即使你是小白也能轻松上手!文中所有代码都配有详细的…...
Rust 学习笔记:关于泛型的练习题
Rust 学习笔记:关于泛型的练习题 Rust 学习笔记:关于泛型的练习题问题 1下面代码能否通过编译?若能,输出是?下面代码能否通过编译?若能,输出是? Rust 学习笔记:关于泛型的…...
Panasonic松下焊接机器人节气
Panasonic松下焊接机器人节气装置 一、工作原理 松下焊接机器人节气装置的工作原理主要是通过智能控制技术,实现对焊接过程中气体流量的精确调节。例如,在焊接的不同阶段,根据焊接电流的大小自动调整气体的供给量。当焊接电流较强时&#x…...
2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家
前言 题解 2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)。 vp了下,题目挺好的,难度也适中,但是彻底红温了。 第二题,题意不是那么清晰, M i n ( K 1 , K 2 ) Min(K_1, K_2) Min(K1,K2)容易求&#x…...
LeetCode 3355.零数组变换 I:差分数组
【LetMeFly】3355.零数组变换 I:差分数组 力扣题目链接:https://leetcode.cn/problems/zero-array-transformation-i/ 给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] [li, ri]。 对于每个查询 queries[i]&am…...
java21
1.数据结构之二叉树,二叉查找树,平衡二叉树 原理:和节点比较大小然后选左边还是右边 注意:中序遍历最常见,因为遍历的结果是从小到大 注意是任意节点,上面的二叉查找树的节点10的左子树高度是0,…...
ES的倒排索引和正排索引的区别及适用场景?为什么倒排索引适合全文搜索?
正排索引解析 1.存储机制 Elasticsearch 的文档存储机制比简单的固定字节分配更复杂,其核心原理如下: 1. 数值类型存储机制 对于 long/float/double 等数值类型: 文档ID2 → 偏移量 2 * sizeof(type) 例如:long 类型…...
ElasticSearch各种查询语法示例
1. 每种查询语法的区别与优缺点 Query DSL 区别: JSON 格式的结构化查询,功能强大,支持复杂查询逻辑,适用于 Elasticsearch 的核心查询场景。优点: 灵活,功能全面,支持全文搜索、精确匹配、聚合等;可组合…...
Ubuntu20.04部署KVM
文章目录 一. 环境准备关闭防火墙(UFW)禁用 SELinux更换镜像源检查 CPU 虚拟化支持 二. 安装KVM安装 KVM 及相关组件启动 libvirtd 服务验证安装创建虚拟机 一. 环境准备 4C8G,50G硬盘——VMware Workstation需要给虚拟机开启虚拟化引擎 roo…...
Android车载应用开发:Kotlin与Automotive OS深度实践
一、Android Automotive OS简介 Android Automotive OS(AAOS)是Google为车辆定制的操作系统,直接运行于车机硬件,提供完整的车载信息娱乐系统(IVI)。与Android Auto(手机投影方案)不…...
提示词工程(Prompt Engineering)是智能Agent交互中不可或缺的一环
Prompt Engineering 提示词,参考OpenAI提示词建议 2.5.1 概述 提示词工程(Prompt Engineering)是智能Agent交互中不可或缺的一环,它们指导智能体如何理解和回应用户的需求。这一节将探讨如何设计有效的提示词,以及如何通过精确的语言引导智能…...
九天画芯CEO张锦:AR 与 AI 融合重构智能终端生态,消费级市场迎来关键拐点
一、AR设备逆势突围:从技术验证到规模商用的跨越 根据洛图科技显示,2025 年 Q1 中国 XR(ARVR) 设备市场数据显示,AR 设备以 9.1 万台销量、116% 的同比增速远超 VR/MR 设备,这标志着消费级 AR 市场正式从 “…...
Python爬虫(32)Python爬虫高阶:动态页面处理与Scrapy+Selenium+BeautifulSoup分布式架构深度解析实战
目录 引言一、动态页面爬取的技术背景1.1 动态页面的核心特征1.2 传统爬虫的局限性 二、技术选型与架构设计2.1 核心组件分析2.2 架构设计思路1. 分层处理2. 数据流 三、代码实现与关键技术3.1 Selenium与Scrapy的中间件集成3.2 BeautifulSoup与Scrapy Item的整合3.3 分布式爬取…...
[案例七] NX二次开发标识特征的导入与布尔运算
本来做的是案例六NX二次开发减重块。但是当时在处理导入指定面时发现坐标转化存在很大问题,开了我很长时间,太难受了,决定放一放,昨天做了第六个案例采取了一种补救方法(实在不会的一种解决思路),个人认为NX这么优秀的软件应该有更好的方法,坐标转化真让人头大。刚开始…...
Canvas进阶篇:鼠标交互动画
Canvas进阶篇:鼠标交互动画 前言获取鼠标坐标鼠标事件点击事件监听代码示例效果预览 拖动事件监听代码示例效果预览 结语 前言 在上一篇文章Canvas进阶篇:基本动画详解 中,我们讲述了在Canvas中实现动画的基本步骤和动画的绘制方法。本文将进…...
Axure项目实战:智慧运输平台后台管理端-订单管理2(多级交互)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:订单管理2 主要内容:中继器筛选、表单跟随菜单拖动、审批数据互通等 应用场景:订单管理…...
AG-UI:重构AI代理与前端交互的下一代协议标准
目录 技术演进背景与核心价值协议架构与技术原理深度解析核心功能与标准化事件体系典型应用场景与实战案例开发者生态与集成指南行业影响与未来展望1. 技术演进背景与核心价值 1.1 AI交互的三大痛点 当前AI应用生态面临三大核心挑战: 交互碎片化:LangGraph、CrewAI等框架各…...
鸿蒙版Flutter库torch_light手电筒功能深度适配
鸿蒙版Flutter库torch_light手电筒功能深度适配:跨平台开发者的光明之路 本项目作者:kirk/坚果 适配仓库地址 作者仓库:https://github.com/svprdga/torch_light# 在数字化浪潮的推动下,跨平台开发框架如 Flutter 凭借其高效、…...
【JAVA】中文我该怎么排序?
📘 Java 中文排序教学文档(基于 Collator) 🧠 目录 概述Java 中字符串排序的默认行为为什么需要 Collator使用 Collator 进行中文排序升序 vs 降序排序自定义对象字段排序多字段排序示例总结对比表附录:完整代码示例 …...
WPF MVVM Community Toolkit. Mvvm 社区框架
Community Toolkit. Mvvm 社区框架 微软官方文档 主要内容:CommunityToolkit.Mvvm 框架 概念,安装,使用(重要API:ObservableObject,RelayCommand)源生成器([ObservableProperty]&…...
云原生安全之PaaS:从基础到实践的技术指南
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 云原生安全之PaaS:从基础到实践的技术指南 一、基础概念 PaaS(Platform as a Service)平台 PaaS是一种云计算服务模型,为开发者提供应用程序的开发、部署和运行环境,涵…...
软件设计师考试需背诵知识点
1. 网络技术标准与协议 2. OSI/RM七层模型 3. 对称加密算法 4. 常见的非对称加密算法 5. 排序算法比较 6. 海明码公式 设数据位是n位,校验位是k位,则n与k必须满足以下关系: 7. McCabe度量法 McCabe度量法的核心公式为: V(G)E−…...
智慧社区新防线:华奥系AI技术如何让夏季安防“零隐患”
夏季社区安防隐患频发 随着夏季高温、暴雨、台风等极端天气增多,社区安全风险显著上升。高空建筑外墙材料因暴晒脱落、地下管道锈蚀堵塞导致积水、电动车充电自燃等事件频发,传统“人防物防”模式响应滞后、管理粗放,难以满足精细化防控需求…...
pinia的简单使用
yarn add pinia // 用来存储token,用户信息,等需要多地方使用的信息 src目录下新建store文件夹->新建index.ts import { createPinia } from "pinia";const store createPinia()export default storemain.ts 引用store import { createApp } from v…...
【Linux笔记】——线程池项目与线程安全单例模式
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹: 【Linux笔记】——简单实习一个日志项目 🔖流水不争,争的是滔滔不息 一、线程池设计二…...
用户有一个Django模型没有设置主键,现在需要设置主键。
用户有一个Django模型没有设置主键,现在需要设置主键。 from django.db import modelsclass CategoryAssistentModel(models.Model):second_level_category models.CharField(max_length100, nullTrue, blankTrue)third_level_category models.CharField(max_len…...
SkyWalking 报错:sw_profile_task 索引缺失问题分析与解决
文章目录 SkyWalking 报错:sw_profile_task 索引缺失问题分析与解决问题背景SkyWalking 是否会自动创建 sw_profile_task 索引?答案:不会在初始化时创建相关索引包括: 问题原因分析解决方案✅ 解决思路:手动创建 sw_pr…...
多模态学习笔记
在模态对齐任务中,同一时刻不同类型的数据(模态)需要做好对齐,才能更好的感知内容,下面对其常见的多模态对齐任务进行如下总结: (1)文本图像 图像和文本特征提取后的对齐方法主要分为两类:基于对比学习的方法和基于跨模态注意力的方法。以下是它们的细化说明及具体实…...
【 Redis | 实战篇 扩展 】
目录 前言: 1.达人探店功能 1.1.点赞功能 1.2.排行榜 2.关注 2.1.共同关注 2.2.关注推送 3.附近商铺 3.1.GEO基本用法 3.2.获取附近商铺 4.签到 4.1.BitMap 4.2.实现签到 4.3.统计连续签到 5.UV统计 前言: 实现达人探店,好友…...
【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)
目录 1 -> 工作原理 2 -> 约束与限制 2.1 -> 支持的设备 2.2 -> 支持的国家/地区 2.3 -> 支持的签名方式 3 -> 总结 3.1 -> 关键功能与工具 3.2 -> 开发流程 3.3 -> 典型场景与优化 3.4 -> 常见问题与解决 3.5 -> 总结 1 -> 工…...
空调系统虚拟标定技术:新能源汽车能效优化的革命性突破
title: 空调系统虚拟标定技术:新能源汽车能效优化的革命性突破 date: 2025-05-15 categories: 新能源汽车技术 tags: [空调系统, 虚拟标定, PID控制, 数字孪生, 能效优化] description: 本文深度解析空调系统虚拟标定技术在新能源汽车中的应用,揭秘如何…...
MCP Server开发并使用自定义天气查询工具查询城市天气
1.本地安装node.js环境 2.本地创建mcp文件夹,搭建mcp环境 在文件夹下cmd执行npm init -y初始化npm项目 3.创建weather-server.js文件,代码如下 // weather-server.js import { McpServer } from "modelcontextprotocol/sdk/server/mcp.js"…...
virtualbox选项“启用套嵌vt-x/amd-v“不可用
“启用套嵌vt-x/amd-v”选项不可用。 解决方法: 切换到virtualbox安装目录,执行如下命令查看虚拟机名称: .\VBoxManage.exe list vms比如返回: winxp 执行如下命令开启64位,注意把"winxp"换成你的虚拟机名字&#x…...
windows powershell 判断 进程号是否存在
在 Windows PowerShell 中,你可以使用多种方法来检查一个特定的进程号(PID)是否存在。以下是几种常用的方法: 方法1:使用 Get-Process 命令 你可以尝试获取具有特定 PID 的进程。如果该进程存在,Get-Proce…...
JAVA SE 多线程(下)
文章目录 📕1. 常见的锁策略✏️1.1 乐观锁VS悲观锁✏️1.2 轻量级锁VS重量级锁✏️1.3 自旋锁✏️1.4 公平锁VS非公平锁✏️1.5 可重入锁和不可重入锁✏️1.6 读写锁 📕2. 死锁✏️2.1 哲学家就餐问题✏️2.2 形成死锁的必要条件✏️2.3 如何避免死锁 &…...
DeepSeek+Dify之九多模态大模型识别图片
Dify之八添加各种在线大模型 文章目录 背景整体流程测试数据用到的节点开始列表操作LLM结束实现步骤1、新建工作流2、开始节点3、列表操作4、LLM节点(多模态大模型检索)5、结束节点测试发布导出背景 有了上一篇文章的基础,现在可以了解下多模态大模型识别图片的工作流 整体…...
软件工程(七):MQTT协议
概念 特性描述协议类型应用层协议(基于 TCP/IP)通信模式发布/订阅(Publish/Subscribe)网络开销小报文头仅 2 字节起,非常轻量保持长连接使用 Keep Alive 机制,适合持续连接的设备面向物联网广泛用于智能家…...
网络 :网络基础【网络框架认识】
网络 :网络基础【对网络的认识】 (一)网络发展(二)协议1、协议是什么?2、协议分层3、OSI七层模型4、TCP/IP五层(或四层)模型5、系统与网络的关系6、总结 (三)网络传输流程1、网络传输…...
Kotlin 极简小抄 P8(不可空类型、可空类型、注意事项、非空断言 !!)
Kotlin 概述 Kotlin 由 JetBrains 开发,是一种在 JVM(Java 虚拟机)上运行的静态类型编程语言 Kotlin 旨在提高开发者的编码效率和安全性,同时保持与 Java 的高度互操作性 Kotlin 是 Android 应用开发的首选语言,也可…...
几种超声波芯片的特点和对比
一 CX20106A ZIP - 8 CX20106A ZIP - 8 的核心竞争力在于高性价比、易用性和抗光干扰能力,尤其适合消费电子、短距离工业检测和低成本物联网场景。尽管在距离和精度上不及高端芯片,但其成熟的电路方案和广泛的市场应用(如经典红外遥控升级为超…...
软考 系统架构设计师系列知识点之杂项集萃(66)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(65) 第106题 一般说来,SoC称为系统级芯片,也称片上系统,它是一个有专用目标的集成电路产品。以下关于SoC不正确的说法是()。…...